From 7fc5ec305db730f3f0f2abe45501a0963cd7cf59 Mon Sep 17 00:00:00 2001 From: kijai <40791699+kijai@users.noreply.github.com> Date: Sat, 16 Aug 2025 16:03:15 +0300 Subject: [PATCH 01/23] Refactor model loading --- custom_linear.py | 2 +- gguf/gguf.py | 16 +- nodes.py | 85 +++++--- nodes_model_loading.py | 406 ++++++++++++++++++++++---------------- utils.py | 4 +- wanvideo/modules/model.py | 55 ++++-- wanvideo/wan_video_vae.py | 2 +- 7 files changed, 343 insertions(+), 227 deletions(-) diff --git a/custom_linear.py b/custom_linear.py index ae5e81d..391502b 100644 --- a/custom_linear.py +++ b/custom_linear.py @@ -12,7 +12,7 @@ def _replace_linear(model, compute_dtype, state_dict, prefix="", patches=None, s module_prefix = prefix + name + "." _replace_linear(module, compute_dtype, state_dict, module_prefix, patches, scale_weights) - if isinstance(module, nn.Linear): + if isinstance(module, nn.Linear) and "loras" not in module_prefix: in_features = state_dict[module_prefix + "weight"].shape[1] out_features = state_dict[module_prefix + "weight"].shape[0] if scale_weights is not None: diff --git a/gguf/gguf.py b/gguf/gguf.py index 44948ad..d21b817 100644 --- a/gguf/gguf.py +++ b/gguf/gguf.py @@ -1,13 +1,25 @@ import torch import torch.nn as nn +import numpy as np from diffusers.quantizers.gguf.utils import GGUFParameter, dequantize_gguf_tensor +import gguf from diffusers.utils import is_accelerate_available from contextlib import nullcontext - +from ..utils import log if is_accelerate_available(): - import accelerate from accelerate import init_empty_weights +def load_gguf(model_path): + from gguf import GGUFReader + reader = GGUFReader(model_path) + parsed_parameters = {} + for tensor in reader.tensors: + # if the tensor is a torch supported dtype do not use GGUFParameter + is_gguf_quant = tensor.tensor_type not in [gguf.GGMLQuantizationType.F32, gguf.GGMLQuantizationType.F16] + meta_tensor = torch.empty(tensor.data.shape, dtype=torch.from_numpy(np.empty(0, dtype=tensor.data.dtype)).dtype, device='meta') + parsed_parameters[tensor.name] = GGUFParameter(meta_tensor, quant_type=tensor.tensor_type) if is_gguf_quant else meta_tensor + return parsed_parameters, reader + #based on https://github.com/huggingface/diffusers/blob/main/src/diffusers/quantizers/gguf/utils.py def _replace_with_gguf_linear(model, compute_dtype, state_dict, prefix="", modules_to_not_convert=[], patches=None): def _should_convert_to_gguf(state_dict, prefix): diff --git a/nodes.py b/nodes.py index 9d2e709..b2a63bb 100644 --- a/nodes.py +++ b/nodes.py @@ -42,6 +42,17 @@ def offload_transformer(transformer): transformer.magcache_state.clear_all() transformer.easycache_state.clear_all() transformer.to(offload_device) + # for name, param in transformer.named_parameters(): + # module = transformer + # subnames = name.split('.') + # for subname in subnames[:-1]: + # module = getattr(module, subname) + # attr_name = subnames[-1] + # if param.data.is_floating_point(): + # meta_param = torch.nn.Parameter(torch.empty_like(param.data, device='meta'), requires_grad=False) + # setattr(module, attr_name, meta_param) + # else: + # pass mm.soft_empty_cache() gc.collect() @@ -348,8 +359,11 @@ class WanVideoTextEncode: raise ValueError("No cached text embeds found for prompts, please provide a T5 encoder.") if model_to_offload is not None and device == "gpu": - log.info(f"Moving video model to {offload_device}") - model_to_offload.model.to(offload_device) + try: + log.info(f"Moving video model to {offload_device}") + model_to_offload.model.to(offload_device) + except: + pass encoder = t5["model"] dtype = t5["dtype"] @@ -1080,7 +1094,7 @@ class WanVideoPhantomEmbeds: log.info(f"Phantom latents shape: {samples.shape}") - target_shape = (16, (num_frames - 1) // VAE_STRIDE[0] + 1 + T, + target_shape = (16, (num_frames - 1) // VAE_STRIDE[0] + 1, H * 8 // VAE_STRIDE[1], W * 8 // VAE_STRIDE[2]) @@ -1583,20 +1597,37 @@ class WanVideoSampler: model = model.model transformer = model.diffusion_model - dtype = model["dtype"] + dtype = model["base_dtype"] + weight_dtype = model["weight_dtype"] fp8_matmul = model["fp8_matmul"] - gguf = model["gguf"] + gguf_reader = model["gguf_reader"] control_lora = model["control_lora"] transformer_options = patcher.model_options.get("transformer_options", None) merge_loras = transformer_options["merge_loras"] + block_swap_args = transformer_options.get("block_swap_args", None) + if block_swap_args is not None: + transformer.use_non_blocking = block_swap_args.get("use_non_blocking", False) + transformer.blocks_to_swap = block_swap_args.get("blocks_to_swap", 0) + transformer.vace_blocks_to_swap = block_swap_args.get("vace_blocks_to_swap", 0) + transformer.prefetch_blocks = block_swap_args.get("prefetch_blocks", 0) + transformer.block_swap_debug = block_swap_args.get("block_swap_debug", False) + transformer.offload_img_emb = block_swap_args.get("offload_img_emb", False) + transformer.offload_txt_emb = block_swap_args.get("offload_txt_emb", False) + is_5b = transformer.out_dim == 48 vae_upscale_factor = 16 if is_5b else 8 patch_linear = transformer_options.get("patch_linear", False) + from .nodes_model_loading import load_weights, load_weights_gguf + weights_assigned = False + if not merge_loras and gguf_reader is None: + load_weights(patcher.model.diffusion_model, patcher.model["sd"], weight_dtype, dtype, device, block_swap_args=block_swap_args) + weights_assigned = True - if gguf: + if gguf_reader is not None: + load_weights_gguf(transformer, gguf_reader, patcher.model["sd"], dtype, device, patcher) set_lora_params_gguf(transformer, patcher.patches) elif len(patcher.patches) != 0 and patch_linear: log.info(f"Using {len(patcher.patches)} LoRA weight patches for WanVideo model") @@ -1867,8 +1898,6 @@ class WanVideoSampler: phantom_cfg_scale = [phantom_cfg_scale] * (steps +1) phantom_start_percent = image_embeds.get("phantom_start_percent", 0.0) phantom_end_percent = image_embeds.get("phantom_end_percent", 1.0) - if phantom_latents is not None: - phantom_latents = phantom_latents.to(device) latent_video_length = noise.shape[1] @@ -2153,11 +2182,8 @@ class WanVideoSampler: mm.unload_all_models() mm.soft_empty_cache() gc.collect() - - if transformer_options is not None: - block_swap_args = transformer_options.get("block_swap_args", None) - if block_swap_args is not None: + if block_swap_args is not None and not weights_assigned: transformer.use_non_blocking = block_swap_args.get("use_non_blocking", False) for name, param in transformer.named_parameters(): if "block" not in name: @@ -2187,8 +2213,8 @@ class WanVideoSampler: block.modulation = torch.nn.Parameter(block.modulation.to(device)) transformer.head.modulation = torch.nn.Parameter(transformer.head.modulation.to(device)) - elif model["manual_offloading"]: - transformer.to(device) + #elif model["manual_offloading"]: + # transformer.to(device) # Initialize Cache if enabled transformer.enable_teacache = transformer.enable_magcache = transformer.enable_easycache = False @@ -2338,18 +2364,14 @@ class WanVideoSampler: z = torch.cat([z, recam_latents.to(z)], dim=1) use_phantom = False + phantom_ref = None if phantom_latents is not None: if (phantom_start_percent <= current_step_percentage <= phantom_end_percent) or \ (phantom_end_percent > 0 and idx == 0 and current_step_percentage >= phantom_start_percent): - - z_pos = torch.cat([z[:,:-phantom_latents.shape[1]], phantom_latents.to(z)], dim=1) - z_phantom_img = torch.cat([z[:,:-phantom_latents.shape[1]], phantom_latents.to(z)], dim=1) - z_neg = torch.cat([z[:,:-phantom_latents.shape[1]], torch.zeros_like(phantom_latents).to(z)], dim=1) + phantom_ref = phantom_latents.to(z) use_phantom = True if cache_state is not None and len(cache_state) != 3: cache_state.append(None) - if not use_phantom: - z_pos = z_neg = z if controlnet_latents is not None: if (controlnet_start <= current_step_percentage < controlnet_end): @@ -2375,9 +2397,9 @@ class WanVideoSampler: if minimax_latents is not None: if context_window is not None: - z_pos = z_neg = torch.cat([z, minimax_latents[:, context_window], minimax_mask_latents[:, context_window]], dim=0) + z = torch.cat([z, minimax_latents[:, context_window], minimax_mask_latents[:, context_window]], dim=0) else: - z_pos = z_neg = torch.cat([z, minimax_latents, minimax_mask_latents], dim=0) + z = torch.cat([z, minimax_latents, minimax_mask_latents], dim=0) if not multitalk_sampling and multitalk_audio_embedding is not None: audio_embedding = multitalk_audio_embedding @@ -2442,6 +2464,7 @@ class WanVideoSampler: "inner_t": [shot_len] if shot_len else None, "standin_input": standin_input, "fantasy_portrait_input": fantasy_portrait_input, + "phantom_ref": phantom_ref } batch_size = 1 @@ -2456,7 +2479,7 @@ class WanVideoSampler: if not batched_cfg: #cond noise_pred_cond, cache_state_cond = transformer( - [z_pos], context=positive_embeds, y=[image_cond_input] if image_cond_input is not None else None, + [z], context=positive_embeds, y=[image_cond_input] if image_cond_input is not None else None, clip_fea=clip_fea, is_uncond=False, current_step_percentage=current_step_percentage, pred_id=cache_state[0] if cache_state else None, vace_data=vace_data, attn_cond=attn_cond, @@ -2477,7 +2500,7 @@ class WanVideoSampler: if not math.isclose(audio_cfg_scale[idx], 1.0): base_params['audio_proj'] = None noise_pred_uncond, cache_state_uncond = transformer( - [z_neg], context=negative_embeds, clip_fea=clip_fea_neg if clip_fea_neg is not None else clip_fea, + [z], context=negative_embeds, clip_fea=clip_fea_neg if clip_fea_neg is not None else clip_fea, y=[image_cond_input] if image_cond_input is not None else None, is_uncond=True, current_step_percentage=current_step_percentage, pred_id=cache_state[1] if cache_state else None, @@ -2488,7 +2511,7 @@ class WanVideoSampler: #phantom if use_phantom and not math.isclose(phantom_cfg_scale[idx], 1.0): noise_pred_phantom, cache_state_phantom = transformer( - [z_phantom_img], context=negative_embeds, clip_fea=clip_fea_neg if clip_fea_neg is not None else clip_fea, + [z], context=negative_embeds, clip_fea=clip_fea_neg if clip_fea_neg is not None else clip_fea, y=[image_cond_input] if image_cond_input is not None else None, is_uncond=True, current_step_percentage=current_step_percentage, pred_id=cache_state[2] if cache_state else None, @@ -2506,7 +2529,7 @@ class WanVideoSampler: cache_state.append(None) base_params['audio_proj'] = None noise_pred_no_audio, cache_state_audio = transformer( - [z_pos], context=positive_embeds, y=[image_cond_input] if image_cond_input is not None else None, + [z], context=positive_embeds, y=[image_cond_input] if image_cond_input is not None else None, clip_fea=clip_fea, is_uncond=False, current_step_percentage=current_step_percentage, pred_id=cache_state[2] if cache_state else None, vace_data=vace_data, @@ -2525,7 +2548,7 @@ class WanVideoSampler: cache_state.append(None) base_params['multitalk_audio'] = torch.zeros_like(multitalk_audio_input)[-1:] noise_pred_no_audio, cache_state_audio = transformer( - [z_pos], context=negative_embeds, y=[image_cond_input] if image_cond_input is not None else None, + [z], context=negative_embeds, y=[image_cond_input] if image_cond_input is not None else None, clip_fea=clip_fea, is_uncond=False, current_step_percentage=current_step_percentage, pred_id=cache_state[2] if cache_state else None, vace_data=vace_data, @@ -3283,8 +3306,8 @@ class WanVideoSampler: if callback is not None: if recammaster is not None: callback_latent = (latent_model_input[:, :orig_noise_len].to(device) - noise_pred[:, :orig_noise_len].to(device) * t.to(device) / 1000).detach() - elif phantom_latents is not None: - callback_latent = (latent_model_input[:,:-phantom_latents.shape[1]].to(device) - noise_pred[:,:-phantom_latents.shape[1]].to(device) * t.to(device) / 1000).detach() + #elif phantom_latents is not None: + # callback_latent = (latent_model_input[:,:-phantom_latents.shape[1]].to(device) - noise_pred[:,:-phantom_latents.shape[1]].to(device) * t.to(device) / 1000).detach() else: callback_latent = (latent_model_input.to(device) - noise_pred.to(device) * t.to(device) / 1000).detach() callback(idx, callback_latent.permute(1,0,2,3), None, len(timesteps)) @@ -3303,8 +3326,8 @@ class WanVideoSampler: offload_transformer(transformer) raise e - if phantom_latents is not None: - latent = latent[:,:-phantom_latents.shape[1]] + #if phantom_latents is not None: + # latent = latent[:,:-phantom_latents.shape[1]] if cache_args is not None: cache_report(transformer, cache_args) diff --git a/nodes_model_loading.py b/nodes_model_loading.py index 9cc68f3..a0c5b59 100644 --- a/nodes_model_loading.py +++ b/nodes_model_loading.py @@ -708,6 +708,178 @@ class WanVideoSetLoRAs: return (patcher,) +def load_weights(transformer, sd, weight_dtype, base_dtype, transformer_load_device, block_swap_args=None): + print("block_swap_args", block_swap_args) + params_to_keep = {"norm", "bias", "time_in", "patch_embedding", "time_", "img_emb", "modulation", "text_embedding", "adapter", "add", "ref_conv"} + + log.info("Using accelerate to load and assign model weights to device...") + param_count = sum(1 for _ in transformer.named_parameters()) + pbar = ProgressBar(param_count) + cnt = 0 + for name, param in tqdm(transformer.named_parameters(), + desc=f"Loading transformer parameters to {transformer_load_device}", + total=param_count, + leave=True): + block_idx = vace_block_idx = None + if "vace_blocks." in name: + try: + vace_block_idx = int(name.split("vace_blocks.")[1].split(".")[0]) + except Exception: + vace_block_idx = None + elif "blocks." in name: + try: + block_idx = int(name.split("blocks.")[1].split(".")[0]) + except Exception: + block_idx = None + print("block_idx:", block_idx) + print("vace_block_idx:", vace_block_idx) + if "loras" in name: + continue + dtype_to_use = base_dtype if any(keyword in name for keyword in params_to_keep) else weight_dtype + dtype_to_use = weight_dtype if sd[name].dtype == weight_dtype else dtype_to_use + if "modulation" in name or "norm" in name or "bias" in name: + dtype_to_use = base_dtype + if "patch_embedding" in name: + dtype_to_use = torch.float32 + + load_device = device + if block_swap_args is not None: + if block_idx is not None: + if block_idx >= len(transformer.blocks) - block_swap_args["blocks_to_swap"]: + load_device = offload_device + elif vace_block_idx is not None: + if vace_block_idx >= len(transformer.vace_blocks) - block_swap_args["vace_blocks_to_swap"]: + load_device = offload_device + + print("load_device:", load_device) + + set_module_tensor_to_device(transformer, name, device=load_device, dtype=dtype_to_use, value=sd[name]) + cnt += 1 + if cnt % 100 == 0: + pbar.update(100) + for name, param in transformer.named_parameters(): + print(name, param.dtype, param.device, param.shape) + pbar.update_absolute(param_count) + pbar.update_absolute(0) + +def load_weights_gguf(transformer, reader, sd, base_dtype, transformer_load_device, patcher): + from .gguf.gguf import _replace_with_gguf_linear, GGUFParameter + import gguf + log.info("Using GGUF to load and assign model weights to device...") + param_count = sum(1 for _ in transformer.named_parameters()) + + sd = {} + for tensor in reader.tensors: + # if the tensor is a torch supported dtype do not use GGUFParameter + is_gguf_quant = tensor.tensor_type not in [gguf.GGMLQuantizationType.F32, gguf.GGMLQuantizationType.F16] + weights = torch.from_numpy(tensor.data.copy()).to(transformer_load_device) + sd[tensor.name] = GGUFParameter(weights, quant_type=tensor.tensor_type) if is_gguf_quant else weights + + patcher.model.diffusion_model = _replace_with_gguf_linear(patcher.model.diffusion_model, base_dtype, sd, patches=patcher.patches) + pbar = ProgressBar(param_count) + cnt = 0 + for name, param in tqdm(patcher.model.diffusion_model.named_parameters(), + desc=f"Loading transformer parameters to {transformer_load_device}", + total=param_count, + leave=True): + if "loras" in name: + continue + #print(name, param.dtype, param.device, param.shape) + if isinstance(param, GGUFParameter): + dtype_to_use = torch.uint8 + elif "patch_embedding" in name: + dtype_to_use = torch.float32 + else: + dtype_to_use = base_dtype + set_module_tensor_to_device(patcher.model.diffusion_model, name, device=transformer_load_device, dtype=dtype_to_use, value=sd[name]) + cnt += 1 + if cnt % 100 == 0: + pbar.update(100) + + #for name, param in transformer.named_parameters(): + # print(name, param.dtype, param.device, param.shape) + #patcher.load(device, full_load=True) + pbar.update_absolute(param_count) + pbar.update_absolute(0) + +def patch_control_lora(transformer, device): + log.info("Control-LoRA detected, patching model...") + + in_cls = transformer.patch_embedding.__class__ # nn.Conv3d + old_in_dim = transformer.in_dim # 16 + new_in_dim = 32 + + new_in = in_cls( + new_in_dim, + transformer.patch_embedding.out_channels, + transformer.patch_embedding.kernel_size, + transformer.patch_embedding.stride, + transformer.patch_embedding.padding, + ).to(device=device, dtype=torch.float32) + + new_in.weight.zero_() + new_in.bias.zero_() + + new_in.weight[:, :old_in_dim].copy_(transformer.patch_embedding.weight) + new_in.bias.copy_(transformer.patch_embedding.bias) + + transformer.patch_embedding = new_in + transformer.expanded_patch_embedding = new_in + +def patch_stand_in_lora(transformer, lora_sd, transformer_load_device, base_dtype, lora_strength): + if "diffusion_model.blocks.0.self_attn.q_loras.down.weight" in lora_sd: + log.info("Stand-In LoRA detected") + for block in transformer.blocks: + block.self_attn.q_loras = LoRALinearLayer(transformer.dim, transformer.dim, rank=128, device=transformer_load_device, dtype=base_dtype, strength=lora_strength) + block.self_attn.k_loras = LoRALinearLayer(transformer.dim, transformer.dim, rank=128, device=transformer_load_device, dtype=base_dtype, strength=lora_strength) + block.self_attn.v_loras = LoRALinearLayer(transformer.dim, transformer.dim, rank=128, device=transformer_load_device, dtype=base_dtype, strength=lora_strength) + for lora in [block.self_attn.q_loras, block.self_attn.k_loras, block.self_attn.v_loras]: + for param in lora.parameters(): + param.requires_grad = False + for name, param in transformer.named_parameters(): + if "lora" in name: + param.data.copy_(lora_sd["diffusion_model." + name].to(param.device, dtype=param.dtype)) + +def add_lora_weights(patcher, lora, base_dtype, merge_loras=False): + #spacepxl's control LoRA patch + for l in lora: + log.info(f"Loading LoRA: {l['name']} with strength: {l['strength']}") + lora_path = l["path"] + lora_strength = l["strength"] + if isinstance(lora_strength, list): + if merge_loras: + raise ValueError("LoRA strength should be a single value when merge_loras=True") + transformer.lora_scheduling_enabled = True + if lora_strength == 0: + log.warning(f"LoRA {lora_path} has strength 0, skipping...") + continue + lora_sd = load_torch_file(lora_path, safe_load=True) + if "dwpose_embedding.0.weight" in lora_sd: #unianimate + from .unianimate.nodes import update_transformer + log.info("Unianimate LoRA detected, patching model...") + transformer = update_transformer(transformer, lora_sd) + + lora_sd = standardize_lora_key_format(lora_sd) + + if l["blocks"]: + lora_sd = filter_state_dict_by_blocks(lora_sd, l["blocks"], l.get("layer_filter", [])) + + # Filter out any LoRA keys containing 'img' if the base model state_dict has no 'img' keys + #if not any('img' in k for k in sd.keys()): + # lora_sd = {k: v for k, v in lora_sd.items() if 'img' not in k} + control_lora=False + if "diffusion_model.patch_embedding.lora_A.weight" in lora_sd: + control_lora = True + #stand-in LoRA patch + if "diffusion_model.blocks.0.self_attn.q_loras.down.weight" in lora_sd: + patch_stand_in_lora(patcher.model.diffusion_model, lora_sd, device, base_dtype, lora_strength) + # normal LoRA patch + else: + patcher, _ = load_lora_for_models(patcher, None, lora_sd, lora_strength, 0) + + del lora_sd + return patcher, control_lora + #region Model loading class WanVideoModelLoader: @classmethod @@ -797,13 +969,16 @@ class WanVideoModelLoader: model_path = folder_paths.get_full_path_or_raise("diffusion_models", model) - + + gguf_reader = None if not gguf: sd = load_torch_file(model_path, device=transformer_load_device, safe_load=True) else: - from diffusers.models.model_loading_utils import load_gguf_checkpoint - sd = load_gguf_checkpoint(model_path) - + #from diffusers.models.model_loading_utils import load_gguf_checkpoint + #sd = load_gguf_checkpoint(model_path) + from .gguf.gguf import load_gguf + sd, gguf_reader = load_gguf(model_path) + if quantization == "disabled": for k, v in sd.items(): if isinstance(v, torch.Tensor): @@ -1055,178 +1230,56 @@ class WanVideoModelLoader: model_type=comfy.model_base.ModelType.FLOW, device=device, ) - scale_weights = {} - if not gguf: - if "fp8" in quantization: - for k, v in sd.items(): - if k.endswith(".scale_weight"): - scale_weights[k] = v - if not merge_loras: - from .custom_linear import _replace_linear - transformer = _replace_linear(transformer, base_dtype, sd, scale_weights=scale_weights) - - if "fp8_e4m3fn" in quantization: - dtype = torch.float8_e4m3fn - elif "fp8_e5m2" in quantization: - dtype = torch.float8_e5m2 - else: - dtype = base_dtype - params_to_keep = {"norm", "bias", "time_in", "patch_embedding", "time_", "img_emb", "modulation", "text_embedding", "adapter", "add", "ref_conv"} - if not lora_low_mem_load: - log.info("Using accelerate to load and assign model weights to device...") - param_count = sum(1 for _ in transformer.named_parameters()) - pbar = ProgressBar(param_count) - cnt = 0 - for name, param in tqdm(transformer.named_parameters(), - desc=f"Loading transformer parameters to {transformer_load_device}", - total=param_count, - leave=True): - dtype_to_use = base_dtype if any(keyword in name for keyword in params_to_keep) else dtype - dtype_to_use = dtype if sd[name].dtype == dtype else dtype_to_use - if "modulation" in name or "norm" in name or "bias" in name: - dtype_to_use = base_dtype - if "patch_embedding" in name: - dtype_to_use = torch.float32 - set_module_tensor_to_device(transformer, name, device=transformer_load_device, dtype=dtype_to_use, value=sd[name]) - cnt += 1 - if cnt % 100 == 0: - pbar.update(100) - - #for name, param in transformer.named_parameters(): - # print(name, param.dtype, param.device, param.shape) - pbar.update_absolute(param_count) comfy_model.diffusion_model = transformer comfy_model.load_device = transformer_load_device - patcher = comfy.model_patcher.ModelPatcher(comfy_model, device, offload_device) patcher.model.is_patched = False - - control_lora = False - if lora is not None: - for l in lora: - log.info(f"Loading LoRA: {l['name']} with strength: {l['strength']}") - lora_path = l["path"] - lora_strength = l["strength"] - if isinstance(lora_strength, list): - if merge_loras: - raise ValueError("LoRA strength should be a single value when merge_loras=True") - transformer.lora_scheduling_enabled = True - if lora_strength == 0: - log.warning(f"LoRA {lora_path} has strength 0, skipping...") - continue - lora_sd = load_torch_file(lora_path, safe_load=True) - if "dwpose_embedding.0.weight" in lora_sd: #unianimate - from .unianimate.nodes import update_transformer - log.info("Unianimate LoRA detected, patching model...") - transformer = update_transformer(transformer, lora_sd) - - lora_sd = standardize_lora_key_format(lora_sd) - - if l["blocks"]: - lora_sd = filter_state_dict_by_blocks(lora_sd, l["blocks"], l.get("layer_filter", [])) - - # Filter out any LoRA keys containing 'img' if the base model state_dict has no 'img' keys - if not any('img' in k for k in sd.keys()): - lora_sd = {k: v for k, v in lora_sd.items() if 'img' not in k} - - #spacepxl's control LoRA patch - # for key in lora_sd.keys(): - # print(key) - - if "diffusion_model.patch_embedding.lora_A.weight" in lora_sd: - log.info("Control-LoRA detected, patching model...") - if not merge_loras: - log.warning("Control-LoRA patching is only supported with merge_loras=True, setting it to True") - merge_loras = True - control_lora = True - - in_cls = transformer.patch_embedding.__class__ # nn.Conv3d - old_in_dim = transformer.in_dim # 16 - new_in_dim = lora_sd["diffusion_model.patch_embedding.lora_A.weight"].shape[1] - assert new_in_dim == 32 - - new_in = in_cls( - new_in_dim, - transformer.patch_embedding.out_channels, - transformer.patch_embedding.kernel_size, - transformer.patch_embedding.stride, - transformer.patch_embedding.padding, - ).to(device=device, dtype=torch.float32) - - new_in.weight.zero_() - new_in.bias.zero_() - - new_in.weight[:, :old_in_dim].copy_(transformer.patch_embedding.weight) - new_in.bias.copy_(transformer.patch_embedding.bias) - - transformer.patch_embedding = new_in - transformer.expanded_patch_embedding = new_in - - if "diffusion_model.blocks.0.self_attn.q_loras.down.weight" in lora_sd: - log.info("Stand-In LoRA detected") - for block in transformer.blocks: - block.self_attn.q_loras = LoRALinearLayer(dim, dim, rank=128, device=transformer_load_device, dtype=base_dtype, strength=lora_strength) - block.self_attn.k_loras = LoRALinearLayer(dim, dim, rank=128, device=transformer_load_device, dtype=base_dtype, strength=lora_strength) - block.self_attn.v_loras = LoRALinearLayer(dim, dim, rank=128, device=transformer_load_device, dtype=base_dtype, strength=lora_strength) - for lora in [block.self_attn.q_loras, block.self_attn.k_loras, block.self_attn.v_loras]: - for param in lora.parameters(): - param.requires_grad = False - for name, param in transformer.named_parameters(): - if "lora" in name: - param.data.copy_(lora_sd["diffusion_model." + name].to(param.device, dtype=param.dtype)) - else: - patcher, _ = load_lora_for_models(patcher, None, lora_sd, lora_strength, 0) - - del lora_sd - - if not gguf and merge_loras: - log.info("Patching LoRA to the model...") - patcher = apply_lora( - patcher, device, transformer_load_device, - params_to_keep=params_to_keep, dtype=dtype, base_dtype=base_dtype, state_dict=sd, - low_mem_load=lora_low_mem_load, control_lora=control_lora, scale_weights=scale_weights) - scale_weights.clear() - patcher.patches.clear() - if gguf: - #from diffusers.quantizers.gguf.utils import _replace_with_gguf_linear, GGUFParameter - from .gguf.gguf import _replace_with_gguf_linear, GGUFParameter - log.info("Using GGUF to load and assign model weights to device...") - param_count = sum(1 for _ in transformer.named_parameters()) - - out_features = sd["blocks.0.self_attn.k.weight"].shape[1] + scale_weights = {} + if "fp8" in quantization: + for k, v in sd.items(): + if k.endswith(".scale_weight"): + scale_weights[k] = v - patcher.model.diffusion_model = _replace_with_gguf_linear(patcher.model.diffusion_model, base_dtype, sd, patches=patcher.patches) - pbar = ProgressBar(param_count) - cnt = 0 - for name, param in tqdm(patcher.model.diffusion_model.named_parameters(), - desc=f"Loading transformer parameters to {transformer_load_device}", - total=param_count, - leave=True): - if "loras" in name: - continue - #print(name, param.dtype, param.device, param.shape) - if isinstance(param, GGUFParameter): - dtype_to_use = torch.uint8 - elif "patch_embedding" in name: - dtype_to_use = torch.float32 - else: - dtype_to_use = base_dtype - set_module_tensor_to_device(patcher.model.diffusion_model, name, device=transformer_load_device, dtype=dtype_to_use, value=sd[name]) - cnt += 1 - if cnt % 100 == 0: - pbar.update(100) - - #for name, param in transformer.named_parameters(): - # print(name, param.dtype, param.device, param.shape) - #patcher.load(device, full_load=True) - pbar.update_absolute(param_count) - - patcher.model.is_patched = True + if "fp8_e4m3fn" in quantization: + weight_dtype = torch.float8_e4m3fn + elif "fp8_e5m2" in quantization: + weight_dtype = torch.float8_e5m2 + else: + weight_dtype = base_dtype + + params_to_keep = {"norm", "bias", "time_in", "patch_embedding", "time_", "img_emb", "modulation", "text_embedding", "adapter", "add", "ref_conv"} + control_lora = False patch_linear = (True if "scaled" in quantization or (lora is not None and not merge_loras) else False) - + + if not merge_loras and control_lora: + log.warning("Control-LoRA patching is only supported with merge_loras=True") + + if lora is not None: + patcher, control_lora = add_lora_weights(patcher, lora, base_dtype, merge_loras=merge_loras) + + if not gguf: + if merge_loras and not patch_linear: + if not lora_low_mem_load: + load_weights(transformer, sd, weight_dtype, base_dtype, transformer_load_device) + + if control_lora: + patch_control_lora(patcher.model.diffusion_model, device) + patcher.model.is_patched = True + + log.info("Merging LoRA to the model...") + patcher = apply_lora( + patcher, device, transformer_load_device, params_to_keep=params_to_keep, dtype=weight_dtype, base_dtype=base_dtype, state_dict=sd, + low_mem_load=lora_low_mem_load, control_lora=control_lora, scale_weights=scale_weights,) + if not control_lora: + scale_weights.clear() + patcher.patches.clear() + else: + from .custom_linear import _replace_linear + transformer = _replace_linear(transformer, base_dtype, sd, scale_weights=scale_weights) + if "fast" in quantization: if lora is not None and not merge_loras: raise NotImplementedError("fp8_fast is not supported with unmerged LoRAs") @@ -1234,7 +1287,7 @@ class WanVideoModelLoader: convert_fp8_linear(transformer, base_dtype, params_to_keep, scale_weight_keys=scale_weights) patch_linear = False - del sd + #del sd if multitalk_model is not None: transformer.audio_proj = multitalk_model["proj_model"] @@ -1263,18 +1316,18 @@ class WanVideoModelLoader: WanRMSNorm: AutoWrappedModule, }, module_config = dict( - offload_dtype=dtype, + offload_dtype=weight_dtype, offload_device=offload_device, - onload_dtype=dtype, + onload_dtype=weight_dtype, onload_device=device, computation_dtype=base_dtype, computation_device=device, ), max_num_param=params_to_keep, overflow_module_config = dict( - offload_dtype=dtype, + offload_dtype=weight_dtype, offload_device=offload_device, - onload_dtype=dtype, + onload_dtype=weight_dtype, onload_device=offload_device, computation_dtype=base_dtype, computation_device=device, @@ -1282,13 +1335,14 @@ class WanVideoModelLoader: compile_args = compile_args, ) - if load_device == "offload_device" and patcher.model.diffusion_model.device != offload_device: + if merge_loras: log.info(f"Moving diffusion model from {patcher.model.diffusion_model.device} to {offload_device}") patcher.model.diffusion_model.to(offload_device) gc.collect() mm.soft_empty_cache() - patcher.model["dtype"] = base_dtype + patcher.model["base_dtype"] = base_dtype + patcher.model["weight_dtype"] = weight_dtype patcher.model["base_path"] = model_path patcher.model["model_name"] = model patcher.model["manual_offloading"] = manual_offloading @@ -1296,9 +1350,11 @@ class WanVideoModelLoader: patcher.model["auto_cpu_offload"] = True if vram_management_args is not None else False patcher.model["control_lora"] = control_lora patcher.model["compile_args"] = compile_args - patcher.model["gguf"] = gguf + patcher.model["gguf_reader"] = gguf_reader patcher.model["fp8_matmul"] = "fast" in quantization patcher.model["scale_weights"] = scale_weights + patcher.model["sd"] = sd + patcher.model["lora"] = lora if 'transformer_options' not in patcher.model_options: patcher.model_options['transformer_options'] = {} diff --git a/utils.py b/utils.py index 95430f7..71782f7 100644 --- a/utils.py +++ b/utils.py @@ -173,7 +173,7 @@ def apply_lora(model, device_to, transformer_load_device, params_to_keep=None, d to_load.append((n, m, params)) to_load.sort(reverse=True) - pbar = ProgressBar(len(to_load)) + #pbar = ProgressBar(len(to_load)) for x in tqdm(to_load, desc="Loading model and applying LoRA weights:", leave=True): name = x[0] m = x[1] @@ -207,7 +207,7 @@ def apply_lora(model, device_to, transformer_load_device, params_to_keep=None, d except: continue m.comfy_patched_weights = True - pbar.update(1) + #pbar.update(1) model.current_weight_patches_uuid = model.patches_uuid if low_mem_load: diff --git a/wanvideo/modules/model.py b/wanvideo/modules/model.py index 7c06523..3c5a6bf 100644 --- a/wanvideo/modules/model.py +++ b/wanvideo/modules/model.py @@ -1377,7 +1377,10 @@ class WanModel(torch.nn.Module): return block_mask def block_swap(self, blocks_to_swap, offload_txt_emb=False, offload_img_emb=False, vace_blocks_to_swap=None, prefetch_blocks=0, block_swap_debug=False): - log.info(f"Swapping {blocks_to_swap + 1} transformer blocks") + # Clamp blocks_to_swap to valid range + blocks_to_swap = max(0, min(blocks_to_swap, len(self.blocks))) + + log.info(f"Swapping {blocks_to_swap} transformer blocks") self.blocks_to_swap = blocks_to_swap self.prefetch_blocks = prefetch_blocks self.block_swap_debug = block_swap_debug @@ -1387,11 +1390,14 @@ class WanModel(torch.nn.Module): total_offload_memory = 0 total_main_memory = 0 + + # Calculate the index where swapping starts + swap_start_idx = len(self.blocks) - blocks_to_swap for b, block in tqdm(enumerate(self.blocks), total=len(self.blocks), desc="Initializing block swap"): block_memory = get_module_memory_mb(block) - if b > self.blocks_to_swap: + if b < swap_start_idx: block.to(self.main_device) total_main_memory += block_memory else: @@ -1402,12 +1408,17 @@ class WanModel(torch.nn.Module): vace_blocks_to_swap = 1 if vace_blocks_to_swap > 0 and self.vace_layers is not None: + # Clamp vace_blocks_to_swap to valid range + vace_blocks_to_swap = max(0, min(vace_blocks_to_swap, len(self.vace_blocks))) self.vace_blocks_to_swap = vace_blocks_to_swap + + # Calculate the index where VACE swapping starts + vace_swap_start_idx = len(self.vace_blocks) - vace_blocks_to_swap for b, block in tqdm(enumerate(self.vace_blocks), total=len(self.vace_blocks), desc="Initializing vace block swap"): block_memory = get_module_memory_mb(block) - if b > self.vace_blocks_to_swap: + if b < vace_swap_start_idx: block.to(self.main_device) total_main_memory += block_memory else: @@ -1447,9 +1458,10 @@ class WanModel(torch.nn.Module): hints = [] current_c = c + vace_swap_start_idx = len(self.vace_blocks) - self.vace_blocks_to_swap if self.vace_blocks_to_swap > 0 else len(self.vace_blocks) for b, block in enumerate(self.vace_blocks): - if b <= self.vace_blocks_to_swap and self.vace_blocks_to_swap >= 0: + if b >= vace_swap_start_idx and self.vace_blocks_to_swap > 0: block.to(self.main_device) if b == 0: @@ -1462,13 +1474,13 @@ class WanModel(torch.nn.Module): # Store skip connection c_skip = block.after_proj(c_processed) hints.append(c_skip.to( - self.offload_device if self.vace_blocks_to_swap != -1 else self.main_device, + self.offload_device if self.vace_blocks_to_swap > 0 else self.main_device, non_blocking=self.use_non_blocking )) current_c = c_processed - if b <= self.vace_blocks_to_swap and self.vace_blocks_to_swap >= 0: + if b >= vace_swap_start_idx and self.vace_blocks_to_swap > 0: block.to(self.offload_device, non_blocking=self.use_non_blocking) return hints @@ -1509,7 +1521,8 @@ class WanModel(torch.nn.Module): ref_target_masks=None, inner_t=None, standin_input=None, - fantasy_portrait_input=None + fantasy_portrait_input=None, + phantom_ref=None ): r""" Forward pass through the diffusion model @@ -1622,6 +1635,15 @@ class WanModel(torch.nn.Module): F += 1 x = [torch.concat([_fun_ref.unsqueeze(0), u], dim=1) for _fun_ref, u in zip(fun_ref, x)] + if phantom_ref is not None: + phantom_ref_frames = phantom_ref.size(1) + phantom_ref = self.original_patch_embedding(phantom_ref.unsqueeze(0).to(torch.float32)).flatten(2).transpose(1, 2).to(x[0].dtype) + grid_sizes = torch.stack([torch.tensor([u[0] + phantom_ref_frames, u[1], u[2]]) for u in grid_sizes]).to(grid_sizes.device) + phantom_ref_seq_len = phantom_ref.size(1) + seq_len += phantom_ref_seq_len + F += phantom_ref_frames + x = [torch.concat([u, phantom_ref.unsqueeze(0)], dim=1) for phantom_ref, u in zip(phantom_ref, x)] + seq_lens = torch.tensor([u.size(1) for u in x], dtype=torch.long) assert seq_lens.max() <= seq_len x = torch.cat([ @@ -2005,20 +2027,21 @@ class WanModel(torch.nn.Module): # Asynchronous block offloading with CUDA streams and events cuda_stream = mm.get_offload_stream(device) events = [torch.cuda.Event() for _ in self.blocks] + swap_start_idx = len(self.blocks) - self.blocks_to_swap if self.blocks_to_swap > 0 else len(self.blocks) for b, block in enumerate(self.blocks): # Prefetch blocks if enabled if self.prefetch_blocks > 0: for prefetch_offset in range(1, self.prefetch_blocks + 1): prefetch_idx = b + prefetch_offset - if prefetch_idx < len(self.blocks) and self.blocks_to_swap >= 0 and prefetch_idx <= self.blocks_to_swap: + if prefetch_idx < len(self.blocks) and self.blocks_to_swap > 0 and prefetch_idx >= swap_start_idx: with torch.cuda.stream(cuda_stream): self.blocks[prefetch_idx].to(self.main_device, non_blocking=self.use_non_blocking) events[prefetch_idx].record(cuda_stream) if self.block_swap_debug: transfer_start = time.perf_counter() # Wait for block to be ready - if b <= self.blocks_to_swap and self.blocks_to_swap >= 0: + if b >= swap_start_idx and self.blocks_to_swap > 0: if self.prefetch_blocks > 0: if not events[b].query(): events[b].synchronize() @@ -2037,7 +2060,7 @@ class WanModel(torch.nn.Module): compute_end = time.perf_counter() compute_time = compute_end - compute_start to_cpu_transfer_start = time.perf_counter() - if b <= self.blocks_to_swap and self.blocks_to_swap >= 0: + if b >= swap_start_idx and self.blocks_to_swap > 0: block.to(self.offload_device, non_blocking=self.use_non_blocking) if self.block_swap_debug: to_cpu_transfer_end = time.perf_counter() @@ -2051,9 +2074,6 @@ class WanModel(torch.nn.Module): if (controlnet is not None) and (b % controlnet["controlnet_stride"] == 0) and (b // controlnet["controlnet_stride"] < len(controlnet["controlnet_states"])): x[:, :x_len] += controlnet["controlnet_states"][b // controlnet["controlnet_stride"]].to(x) * controlnet["controlnet_weight"] - if b <= self.blocks_to_swap and self.blocks_to_swap >= 0: - block.to(self.offload_device, non_blocking=self.use_non_blocking) - if self.enable_teacache and (self.teacache_start_step <= current_step <= self.teacache_end_step) and pred_id is not None: self.teacache_state.update( pred_id, @@ -2076,9 +2096,14 @@ class WanModel(torch.nn.Module): ) if self.ref_conv is not None and fun_ref is not None: - full_ref_length = fun_ref.size(1) - x = x[:, full_ref_length:] + fun_ref_length = fun_ref.size(1) + x = x[:, fun_ref_length:] grid_sizes = torch.stack([torch.tensor([u[0] - 1, u[1], u[2]]) for u in grid_sizes]).to(grid_sizes.device) + + if phantom_ref is not None: + phantom_ref_length = phantom_ref.size(1) + x = x[:, :-phantom_ref_length] + grid_sizes = torch.stack([torch.tensor([u[0] - phantom_ref_frames, u[1], u[2]]) for u in grid_sizes]).to(grid_sizes.device) if attn_cond is not None: x = x[:, :x_len] diff --git a/wanvideo/wan_video_vae.py b/wanvideo/wan_video_vae.py index 320a262..7ac9a05 100644 --- a/wanvideo/wan_video_vae.py +++ b/wanvideo/wan_video_vae.py @@ -1037,7 +1037,7 @@ class VideoVAE_(nn.Module): feat_cache=self._enc_feat_map, feat_idx=self._enc_conv_idx) out = torch.cat([out, out_], 2) - pbar.update(1) + pbar.update(iter_) mu = self.conv1(out).chunk(2, dim=1)[0] mu = (mu - self.mean.to(mu)) * self.inv_std.to(mu) From 6f83ca96bc19e34a5fefddde1babbf3b1c1eaf64 Mon Sep 17 00:00:00 2001 From: kijai <40791699+kijai@users.noreply.github.com> Date: Sun, 17 Aug 2025 13:57:01 +0300 Subject: [PATCH 02/23] Update nodes.py --- nodes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes.py b/nodes.py index 9ffa2e0..7260f83 100644 --- a/nodes.py +++ b/nodes.py @@ -2479,7 +2479,7 @@ class WanVideoSampler: "inner_t": [shot_len] if shot_len else None, "standin_input": standin_input, "fantasy_portrait_input": fantasy_portrait_input, - "phantom_ref": phantom_ref + "phantom_ref": phantom_ref, "reverse_time": reverse_time } From 6181f30b37425e8eb015f4054d03d40c79b8fffd Mon Sep 17 00:00:00 2001 From: kijai <40791699+kijai@users.noreply.github.com> Date: Sun, 17 Aug 2025 14:11:15 +0300 Subject: [PATCH 03/23] Update nodes_model_loading.py --- nodes_model_loading.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nodes_model_loading.py b/nodes_model_loading.py index a0c5b59..e6f9680 100644 --- a/nodes_model_loading.py +++ b/nodes_model_loading.py @@ -736,7 +736,7 @@ def load_weights(transformer, sd, weight_dtype, base_dtype, transformer_load_dev if "loras" in name: continue dtype_to_use = base_dtype if any(keyword in name for keyword in params_to_keep) else weight_dtype - dtype_to_use = weight_dtype if sd[name].dtype == weight_dtype else dtype_to_use + dtype_to_use = weight_dtype if sd[name.replace("_orig_mod.", "")].dtype == weight_dtype else dtype_to_use if "modulation" in name or "norm" in name or "bias" in name: dtype_to_use = base_dtype if "patch_embedding" in name: @@ -753,7 +753,7 @@ def load_weights(transformer, sd, weight_dtype, base_dtype, transformer_load_dev print("load_device:", load_device) - set_module_tensor_to_device(transformer, name, device=load_device, dtype=dtype_to_use, value=sd[name]) + set_module_tensor_to_device(transformer, name, device=load_device, dtype=dtype_to_use, value=sd[name.replace("_orig_mod.", "")]) cnt += 1 if cnt % 100 == 0: pbar.update(100) From be285f52584c3ae452b10e41ae506fc507022c77 Mon Sep 17 00:00:00 2001 From: kijai <40791699+kijai@users.noreply.github.com> Date: Sun, 17 Aug 2025 15:14:27 +0300 Subject: [PATCH 04/23] multitalk fix --- multitalk/nodes.py | 14 ++++++------ nodes.py | 48 ++++++++++++++++++++---------------------- nodes_model_loading.py | 23 +++++++------------- 3 files changed, 38 insertions(+), 47 deletions(-) diff --git a/multitalk/nodes.py b/multitalk/nodes.py index 79fef21..0093e0b 100644 --- a/multitalk/nodes.py +++ b/multitalk/nodes.py @@ -14,7 +14,7 @@ class MultiTalkModelLoader: "required": { "model": (folder_paths.get_filename_list("diffusion_models"), {"tooltip": "These models are loaded from the 'ComfyUI/models/diffusion_models' -folder",}), - "base_precision": (["fp32", "bf16", "fp16"], {"default": "fp16"}), + #"base_precision": (["fp32", "bf16", "fp16"], {"default": "fp16"}), }, } @@ -23,18 +23,18 @@ class MultiTalkModelLoader: FUNCTION = "loadmodel" CATEGORY = "WanVideoWrapper" - def loadmodel(self, model, base_precision): + def loadmodel(self, model, base_precision=None): from .multitalk import AudioProjModel device = mm.get_torch_device() offload_device = mm.unet_offload_device() - base_dtype = {"fp8_e4m3fn": torch.float8_e4m3fn, "fp8_e4m3fn_fast": torch.float8_e4m3fn, "bf16": torch.bfloat16, "fp16": torch.float16, "fp16_fast": torch.float16, "fp32": torch.float32}[base_precision] + #base_dtype = {"fp8_e4m3fn": torch.float8_e4m3fn, "fp8_e4m3fn_fast": torch.float8_e4m3fn, "bf16": torch.bfloat16, "fp16": torch.float16, "fp16_fast": torch.float16, "fp32": torch.float32}[base_precision] model_path = folder_paths.get_full_path_or_raise("diffusion_models", model) sd = load_torch_file(model_path, device=offload_device, safe_load=True) - audio_proj_keys = [k for k in sd.keys() if "audio_proj" in k] - audio_proj_sd = {k.replace("audio_proj.", ""): sd.pop(k) for k in audio_proj_keys} + #audio_proj_keys = [k for k in sd.keys() if "audio_proj" in k] + #audio_proj_sd = {k.replace("audio_proj.", ""): sd.pop(k) for k in audio_proj_keys} audio_window=5 intermediate_dim=512 @@ -54,8 +54,8 @@ class MultiTalkModelLoader: ) #fantasytalking_proj_model.load_state_dict(sd, strict=False) - for name, param in multitalk_proj_model.named_parameters(): - set_module_tensor_to_device(multitalk_proj_model, name, device=offload_device, dtype=base_dtype, value=audio_proj_sd[name]) + #for name, param in multitalk_proj_model.named_parameters(): + # set_module_tensor_to_device(multitalk_proj_model, name, device=offload_device, dtype=base_dtype, value=audio_proj_sd[name]) multitalk = { "proj_model": multitalk_proj_model, diff --git a/nodes.py b/nodes.py index 7260f83..d67f7a6 100644 --- a/nodes.py +++ b/nodes.py @@ -2158,28 +2158,6 @@ class WanVideoSampler: log.info(f"Number of shots in prompt: {shot_num}, Shot token lengths: {shot_len}") #region transformer settings - #rope - freqs = None - transformer.rope_embedder.k = None - transformer.rope_embedder.num_frames = None - if "default" in rope_function or bidirectional_sampling: - d = transformer.dim // transformer.num_heads - freqs = torch.cat([ - rope_params(1024, d - 4 * (d // 6), L_test=latent_video_length, k=riflex_freq_index), - rope_params(1024, 2 * (d // 6)), - rope_params(1024, 2 * (d // 6)) - ], - dim=1) - elif "comfy" in rope_function: - transformer.rope_embedder.k = riflex_freq_index - transformer.rope_embedder.num_frames = latent_video_length - - transformer.rope_func = rope_function - for block in transformer.blocks: - block.rope_func = rope_function - if transformer.vace_layers is not None: - for block in transformer.vace_blocks: - block.rope_func = rope_function #blockswap init @@ -2311,6 +2289,29 @@ class WanVideoSampler: if bidirectional_sampling: import copy sample_scheduler_flipped = copy.deepcopy(sample_scheduler) + + #rope + freqs = None + transformer.rope_embedder.k = None + transformer.rope_embedder.num_frames = None + if "default" in rope_function or bidirectional_sampling: + d = transformer.dim // transformer.num_heads + freqs = torch.cat([ + rope_params(1024, d - 4 * (d // 6), L_test=latent_video_length, k=riflex_freq_index), + rope_params(1024, 2 * (d // 6)), + rope_params(1024, 2 * (d // 6)) + ], + dim=1) + elif "comfy" in rope_function: + transformer.rope_embedder.k = riflex_freq_index + transformer.rope_embedder.num_frames = latent_video_length + + transformer.rope_func = rope_function + for block in transformer.blocks: + block.rope_func = rope_function + if transformer.vace_layers is not None: + for block in transformer.vace_blocks: + block.rope_func = rope_function #region model pred def predict_with_cfg(z, cfg_scale, positive_embeds, negative_embeds, timestep, idx, image_cond=None, clip_fea=None, @@ -3361,9 +3362,6 @@ class WanVideoSampler: if model["manual_offloading"]: offload_transformer(transformer) raise e - - #if phantom_latents is not None: - # latent = latent[:,:-phantom_latents.shape[1]] if cache_args is not None: cache_report(transformer, cache_args) diff --git a/nodes_model_loading.py b/nodes_model_loading.py index e6f9680..5c0f719 100644 --- a/nodes_model_loading.py +++ b/nodes_model_loading.py @@ -392,7 +392,7 @@ class WanVideoLoraSelect: with safe_open(lora_path, framework="pt", device="cpu") as f: metadata = f.metadata() except Exception as e: - print(f"Could not load metadata from {lora}: {e}") + log.info(f"Could not load metadata from {lora}: {e}") if unique_id and PromptServer is not None: try: @@ -419,7 +419,7 @@ class WanVideoLoraSelect: unique_id ) except Exception as e: - print(f"Error displaying metadata: {e}") + log.warning(f"Error displaying metadata: {e}") pass lora = { @@ -709,8 +709,7 @@ class WanVideoSetLoRAs: return (patcher,) def load_weights(transformer, sd, weight_dtype, base_dtype, transformer_load_device, block_swap_args=None): - print("block_swap_args", block_swap_args) - params_to_keep = {"norm", "bias", "time_in", "patch_embedding", "time_", "img_emb", "modulation", "text_embedding", "adapter", "add", "ref_conv"} + params_to_keep = {"norm", "bias", "time_in", "patch_embedding", "time_", "img_emb", "modulation", "text_embedding", "adapter", "add", "ref_conv", "audio_proj"} log.info("Using accelerate to load and assign model weights to device...") param_count = sum(1 for _ in transformer.named_parameters()) @@ -731,8 +730,8 @@ def load_weights(transformer, sd, weight_dtype, base_dtype, transformer_load_dev block_idx = int(name.split("blocks.")[1].split(".")[0]) except Exception: block_idx = None - print("block_idx:", block_idx) - print("vace_block_idx:", vace_block_idx) + #print("block_idx:", block_idx) + #print("vace_block_idx:", vace_block_idx) if "loras" in name: continue dtype_to_use = base_dtype if any(keyword in name for keyword in params_to_keep) else weight_dtype @@ -750,15 +749,12 @@ def load_weights(transformer, sd, weight_dtype, base_dtype, transformer_load_dev elif vace_block_idx is not None: if vace_block_idx >= len(transformer.vace_blocks) - block_swap_args["vace_blocks_to_swap"]: load_device = offload_device - - print("load_device:", load_device) - set_module_tensor_to_device(transformer, name, device=load_device, dtype=dtype_to_use, value=sd[name.replace("_orig_mod.", "")]) cnt += 1 if cnt % 100 == 0: pbar.update(100) - for name, param in transformer.named_parameters(): - print(name, param.dtype, param.device, param.shape) + #for name, param in transformer.named_parameters(): + # print(name, param.dtype, param.device, param.shape) pbar.update_absolute(param_count) pbar.update_absolute(0) @@ -1207,7 +1203,7 @@ class WanVideoModelLoader: ) block.norm_x = WanLayerNorm(dim, transformer.eps, elementwise_affine=True) if norm_input_visual else nn.Identity() log.info("MultiTalk model detected, patching model...") - + transformer.audio_proj = multitalk_model["proj_model"] sd.update(multitalk_model["sd"]) @@ -1289,9 +1285,6 @@ class WanVideoModelLoader: #del sd - if multitalk_model is not None: - transformer.audio_proj = multitalk_model["proj_model"] - if vram_management_args is not None: if gguf: raise ValueError("GGUF models don't support vram management") From 9a7dba06c13c79cf35d76a1837fd115fc247df43 Mon Sep 17 00:00:00 2001 From: kijai <40791699+kijai@users.noreply.github.com> Date: Sun, 17 Aug 2025 16:43:46 +0300 Subject: [PATCH 05/23] Update multitalk.py --- multitalk/multitalk.py | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/multitalk/multitalk.py b/multitalk/multitalk.py index 610b829..581b43f 100644 --- a/multitalk/multitalk.py +++ b/multitalk/multitalk.py @@ -253,8 +253,14 @@ class SingleStreamAttention(nn.Module): self.attention_mode = attention_mode def forward(self, x: torch.Tensor, encoder_hidden_states: torch.Tensor, shape=None, enable_sp=False, kv_seq=None) -> torch.Tensor: - N_t, N_h, N_w = shape + + x_extra = None + if x.shape[0] != encoder_hidden_states.shape[0]: + x_extra = x[:, -N_h * N_w:, :] + x = x[:, :-N_h * N_w, :] + N_t = N_t - 1 + x = rearrange(x, "B (N_t S) C -> (B N_t) S C", N_t=N_t) # get q for hidden_state @@ -282,17 +288,18 @@ class SingleStreamAttention(nn.Module): encoder_v.transpose(1, 2), attention_mode=self.attention_mode ) - #x = torch.nn.functional.scaled_dot_product_attention( - # q, encoder_k, encoder_v, attn_mask=None, is_causal=False, dropout_p=0.0) # linear transform x_output_shape = (B, N, C) #x = x.transpose(1, 2) x = x.reshape(x_output_shape) x = self.proj(x) - x = self.proj_drop(x) + x = self.proj_drop(x) x = rearrange(x, "(B N_t) S C -> B (N_t S) C", N_t=N_t) + + if x_extra is not None: + x = torch.cat([x, torch.zeros_like(x_extra)], dim=1) return x @@ -363,6 +370,12 @@ class SingleStreamMultiAttention(SingleStreamAttention): N_t, _, _ = shape x = rearrange(x, "B (N_t S) C -> (B N_t) S C", N_t=N_t) + x_extra = None + if x.shape[0] != encoder_hidden_states.shape[0]: + x_extra = x[:, -N_h * N_w:, :] + x = x[:, :-N_h * N_w, :] + N_t = N_t - 1 + # Query projection B, N, C = x.shape q = self.q_linear(x) @@ -473,5 +486,7 @@ class SingleStreamMultiAttention(SingleStreamAttention): # Restore original layout x = rearrange(x, "(B N_t) S C -> B (N_t S) C", N_t=N_t) + if x_extra is not None: + x = torch.cat([x, torch.zeros_like(x_extra)], dim=1) return x \ No newline at end of file From aa62d59d9e7e9e75eeb8d680676ac36eb57171ca Mon Sep 17 00:00:00 2001 From: kijai <40791699+kijai@users.noreply.github.com> Date: Sun, 17 Aug 2025 19:23:51 +0300 Subject: [PATCH 06/23] Update nodes.py --- nodes.py | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/nodes.py b/nodes.py index 7b967b7..d0059cd 100644 --- a/nodes.py +++ b/nodes.py @@ -2291,29 +2291,6 @@ class WanVideoSampler: if bidirectional_sampling: import copy sample_scheduler_flipped = copy.deepcopy(sample_scheduler) - - #rope - freqs = None - transformer.rope_embedder.k = None - transformer.rope_embedder.num_frames = None - if "default" in rope_function or bidirectional_sampling: - d = transformer.dim // transformer.num_heads - freqs = torch.cat([ - rope_params(1024, d - 4 * (d // 6), L_test=latent_video_length, k=riflex_freq_index), - rope_params(1024, 2 * (d // 6)), - rope_params(1024, 2 * (d // 6)) - ], - dim=1) - elif "comfy" in rope_function: - transformer.rope_embedder.k = riflex_freq_index - transformer.rope_embedder.num_frames = latent_video_length - - transformer.rope_func = rope_function - for block in transformer.blocks: - block.rope_func = rope_function - if transformer.vace_layers is not None: - for block in transformer.vace_blocks: - block.rope_func = rope_function #rope freqs = None From e4f422cf9952b13e8e2147c403ef7b5fed95920a Mon Sep 17 00:00:00 2001 From: kijai <40791699+kijai@users.noreply.github.com> Date: Sun, 17 Aug 2025 19:33:20 +0300 Subject: [PATCH 07/23] Update multitalk.py --- multitalk/multitalk.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/multitalk/multitalk.py b/multitalk/multitalk.py index 5922ac5..c87f906 100644 --- a/multitalk/multitalk.py +++ b/multitalk/multitalk.py @@ -256,13 +256,11 @@ class SingleStreamAttention(nn.Module): N_t, N_h, N_w = shape x_extra = None - try: - x = rearrange(x, "B (N_t S) C -> (B N_t) S C", N_t=N_t) - except: + if x.shape[0] * N_t != encoder_hidden_states.shape[0]: x_extra = x[:, -N_h * N_w:, :] x = x[:, :-N_h * N_w, :] N_t = N_t - 1 - x = rearrange(x, "B (N_t S) C -> (B N_t) S C", N_t=N_t) + x = rearrange(x, "B (N_t S) C -> (B N_t) S C", N_t=N_t) # get q for hidden_state B, N, C = x.shape @@ -369,13 +367,13 @@ class SingleStreamMultiAttention(SingleStreamAttention): return super().forward(x, encoder_hidden_states, shape) N_t, N_h, N_w = shape - x = rearrange(x, "B (N_t S) C -> (B N_t) S C", N_t=N_t) - + x_extra = None - if x.shape[0] != encoder_hidden_states.shape[0]: + if x.shape[0] * N_t != encoder_hidden_states.shape[0]: x_extra = x[:, -N_h * N_w:, :] x = x[:, :-N_h * N_w, :] N_t = N_t - 1 + x = rearrange(x, "B (N_t S) C -> (B N_t) S C", N_t=N_t) # Query projection B, N, C = x.shape From 282947d93a64f0530c1b754f8d437c252572571d Mon Sep 17 00:00:00 2001 From: kijai <40791699+kijai@users.noreply.github.com> Date: Mon, 18 Aug 2025 16:57:07 +0300 Subject: [PATCH 08/23] GGUF fix --- gguf/gguf.py | 2 +- nodes_model_loading.py | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/gguf/gguf.py b/gguf/gguf.py index d21b817..41f37bd 100644 --- a/gguf/gguf.py +++ b/gguf/gguf.py @@ -36,6 +36,7 @@ def _replace_with_gguf_linear(model, compute_dtype, state_dict, prefix="", modul if ( isinstance(module, nn.Linear) + and not isinstance(module, GGUFLinear) and _should_convert_to_gguf(state_dict, module_prefix) and name not in modules_to_not_convert ): @@ -54,7 +55,6 @@ def _replace_with_gguf_linear(model, compute_dtype, state_dict, prefix="", modul model._modules[name].source_cls = type(module) # Force requires_grad to False to avoid unexpected errors model._modules[name].requires_grad_(False) - return model def set_lora_params_gguf(module, patches, module_prefix=""): diff --git a/nodes_model_loading.py b/nodes_model_loading.py index 5c0f719..3d5ed1d 100644 --- a/nodes_model_loading.py +++ b/nodes_model_loading.py @@ -755,6 +755,8 @@ def load_weights(transformer, sd, weight_dtype, base_dtype, transformer_load_dev pbar.update(100) #for name, param in transformer.named_parameters(): # print(name, param.dtype, param.device, param.shape) + #for name, param in transformer.blocks[0].motion_attn.named_parameters(): + # print(name, param.data) pbar.update_absolute(param_count) pbar.update_absolute(0) @@ -782,12 +784,12 @@ def load_weights_gguf(transformer, reader, sd, base_dtype, transformer_load_devi continue #print(name, param.dtype, param.device, param.shape) if isinstance(param, GGUFParameter): - dtype_to_use = torch.uint8 + continue elif "patch_embedding" in name: dtype_to_use = torch.float32 else: dtype_to_use = base_dtype - set_module_tensor_to_device(patcher.model.diffusion_model, name, device=transformer_load_device, dtype=dtype_to_use, value=sd[name]) + set_module_tensor_to_device(patcher.model.diffusion_model, name, device=transformer_load_device, dtype=dtype_to_use, value=sd[name.replace("_orig_mod.", "")]) cnt += 1 if cnt % 100 == 0: pbar.update(100) @@ -1142,6 +1144,7 @@ class WanVideoModelLoader: "add_ref_conv": True if "ref_conv.weight" in sd else False, "in_dim_ref_conv": sd["ref_conv.weight"].shape[1] if "ref_conv.weight" in sd else None, "add_control_adapter": True if "control_adapter.conv.weight" in sd else False, + "use_motion_attn": True if "blocks.0.motion_attn.k.weight" in sd else False } with init_empty_weights(): From c16a7b5a7da401f1d701a06c56ff28a2334c81a1 Mon Sep 17 00:00:00 2001 From: kijai <40791699+kijai@users.noreply.github.com> Date: Mon, 18 Aug 2025 17:06:25 +0300 Subject: [PATCH 09/23] Update nodes_model_loading.py --- nodes_model_loading.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/nodes_model_loading.py b/nodes_model_loading.py index 3d5ed1d..c1aa61f 100644 --- a/nodes_model_loading.py +++ b/nodes_model_loading.py @@ -1143,8 +1143,7 @@ class WanVideoModelLoader: "inject_sample_info": True if "fps_embedding.weight" in sd else False, "add_ref_conv": True if "ref_conv.weight" in sd else False, "in_dim_ref_conv": sd["ref_conv.weight"].shape[1] if "ref_conv.weight" in sd else None, - "add_control_adapter": True if "control_adapter.conv.weight" in sd else False, - "use_motion_attn": True if "blocks.0.motion_attn.k.weight" in sd else False + "add_control_adapter": True if "control_adapter.conv.weight" in sd else False } with init_empty_weights(): From 09710f9ca05f10786c23f3ebb3af9690d4fe158a Mon Sep 17 00:00:00 2001 From: kijai <40791699+kijai@users.noreply.github.com> Date: Mon, 18 Aug 2025 22:42:11 +0300 Subject: [PATCH 10/23] Basic MTV Crafter support https://github.com/DINGYANB/MTVCrafter --- MTV/data/mean.npy | Bin 0 -> 416 bytes MTV/data/std.npy | Bin 0 -> 416 bytes MTV/draw_pose.py | 142 +++++++++++++++ MTV/motion4d/__init__.py | 1 + MTV/motion4d/vqvae.py | 329 ++++++++++++++++++++++++++++++++++ MTV/mtv.py | 193 ++++++++++++++++++++ MTV/nlf.py | 0 MTV/nodes.py | 242 +++++++++++++++++++++++++ __init__.py | 12 +- custom_linear.py | 9 +- fp8_optimization.py | 73 -------- nodes.py | 121 ++++++++++--- nodes_model_loading.py | 22 +-- wanvideo/modules/attention.py | 2 + wanvideo/modules/model.py | 96 ++++++++-- 15 files changed, 1111 insertions(+), 131 deletions(-) create mode 100644 MTV/data/mean.npy create mode 100644 MTV/data/std.npy create mode 100644 MTV/draw_pose.py create mode 100644 MTV/motion4d/__init__.py create mode 100644 MTV/motion4d/vqvae.py create mode 100644 MTV/mtv.py create mode 100644 MTV/nlf.py create mode 100644 MTV/nodes.py diff --git a/MTV/data/mean.npy b/MTV/data/mean.npy new file mode 100644 index 0000000000000000000000000000000000000000..001d7e7a450836a286a261bec91b2e72f8f926d2 GIT binary patch literal 416 zcmbR27wQ`j$;eQ~P_3SlTAW;@Zl$1ZlV+l>qoAIaUsO_*m=~X4l#&V(cT3DEP6dh= zXCxM+0{I$7COQhnnmP)#3giN=a1|GOB^58{4;vr5WNnpn+U?Npd@tv*OFXmqA@00R zXZ72UT`V@MJM3co=(H^PnT!6sHBKsfe>mrEz3wt++LlB8Gk-d-UVY2u?T;-EdAB+p z`=&j1`DuB?$zs2oOM2l0mrjB8hYtO8b;&;U$c0mAhQm3}RR@`0KXmzd<(-rFkzf~t z`8QntF28wb!-im&b!oR;`US4-mrb@iTnKbS^SNNBPm7)&x~B5TMJCz$(Bbco4jo{A z;=)iM=OEQyd^j=tu8Y*tmrkuW{vBev^}t1X|J6fX9~lmBy7AcMrJknqtdb7LLzC{f za7$?(?mfljxaG)0mo;MC&av{UPX0<)T>2-A9X4k<>*zb-x(jFbKPR^x_D&~uTy$xy Q6g<5B=4;0@)2_Gx0E$4Y1poj5 literal 0 HcmV?d00001 diff --git a/MTV/data/std.npy b/MTV/data/std.npy new file mode 100644 index 0000000000000000000000000000000000000000..5d1db82923759854dcd53a28beb59abeab80e711 GIT binary patch literal 416 zcmbR27wQ`j$;eQ~P_3SlTAW;@Zl$1ZlV+l>qoAIaUsO_*m=~X4l#&V(cT3DEP6dh= zXCxM+0{I$7COQhnnmP)#3giN=2j@kcSMjwvN0$n^tjm#hzUyA&+;1rCBJL#XY!_7J zoWDxgWumjJ^U;*a&ircpF8tNO&cTZVokPyayZm|<={(0b(D|Q(yi3>tedj)w`OY7F z1zrA|&UXGVtIK)yEhQK6lXILu^L0D3K2~)3^~u87{@EhuYt=$7=VjJ7Kk%F6YJp?B<-9|7qqCx?h|3h!SZBWH8=bk|3cIvU zsB>N%cF@^kjkwF(h+Jp>e_Ne%)WlpQb{9HtkKOM4>6oa?WuaQ)f%BA$YA!8Vvz#p_ LzH`nKR&xOWCFqdU literal 0 HcmV?d00001 diff --git a/MTV/draw_pose.py b/MTV/draw_pose.py new file mode 100644 index 0000000..eb5c606 --- /dev/null +++ b/MTV/draw_pose.py @@ -0,0 +1,142 @@ +import cv2 +import math +import torch +import numpy as np +from PIL import Image +from torchvision import transforms + + +def intrinsic_matrix_from_field_of_view(imshape, fov_degrees:float =55 ): # nlf default fov_degrees 55 + imshape = np.array(imshape) + fov_radians = fov_degrees * np.array(np.pi / 180) + larger_side = np.max(imshape) + focal_length = larger_side / (np.tan(fov_radians / 2) * 2) + # intrinsic_matrix 3*3 + return np.array([ + [focal_length, 0, imshape[1] / 2], + [0, focal_length, imshape[0] / 2], + [0, 0, 1], + ]) + + +def p3d_to_p2d(point_3d, height, width): # point3d n*1024*3 + camera_matrix = intrinsic_matrix_from_field_of_view((height,width)) + camera_matrix = np.expand_dims(camera_matrix, axis=0) + camera_matrix = np.expand_dims(camera_matrix, axis=0) # 1*1*3*3 + point_3d = np.expand_dims(point_3d,axis=-1) # n*1024*3*1 + point_2d = (camera_matrix@point_3d).squeeze(-1) + point_2d[:,:,:2] = point_2d[:,:,:2]/point_2d[:,:,2:3] + return point_2d[:,:,:] # n*1024*2 + + +def get_pose_images(smpl_data, offset): + pose_images = [] + for data in smpl_data: + if isinstance(data, np.ndarray): + joints3d = data + else: + joints3d = data.numpy() + canvas = np.zeros(shape=(offset[0], offset[1], 3), dtype=np.uint8) + joints3d = p3d_to_p2d(joints3d, offset[0], offset[1]) + canvas = draw_3d_points(canvas, joints3d[0], stickwidth=int(offset[1]/350)) + pose_images.append(Image.fromarray(canvas)) + return pose_images + + +def get_control_conditions(poses, h, w): + video_transforms = transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5], inplace=True) + control_images = [] + for idx, pose in enumerate(poses): + canvas = np.zeros(shape=(h, w, 3), dtype=np.uint8) + try: + joints3d = p3d_to_p2d(pose, h, w) + canvas = draw_3d_points( + canvas, + joints3d[0], + stickwidth=int(h / 350), + ) + resized_canvas = cv2.resize(canvas, (w, h)) + # Image.fromarray(resized_canvas).save(f'tmp/{idx}_pose.jpg') + control_images.append(resized_canvas) + except Exception as e: + print("wrong:", e) + control_images.append(Image.fromarray(canvas)) + control_pixel_values = np.array(control_images) + control_pixel_values = torch.from_numpy(control_pixel_values).contiguous() / 255. + print("control_pixel_values.shape", control_pixel_values.shape) + #control_pixel_values = video_transforms(control_pixel_values) + return control_pixel_values + + +def draw_3d_points(canvas, points, stickwidth=2, r=2, draw_line=True): + colors = [ + [255, 0, 0], # 0 + [0, 255, 0], # 1 + [0, 0, 255], # 2 + [255, 0, 255], # 3 + [255, 255, 0], # 4 + [85, 255, 0], # 5 + [0, 75, 255], # 6 + [0, 255, 85], # 7 + [0, 255, 170], # 8 + [170, 0, 255], # 9 + [85, 0, 255], # 10 + [0, 85, 255], # 11 + [0, 255, 255], # 12 + [85, 0, 255], # 13 + [170, 0, 255], # 14 + [255, 0, 255], # 15 + [255, 0, 170], # 16 + [255, 0, 85], # 17 + ] + connetions = [ + [15,12],[12, 16],[16, 18],[18, 20],[20, 22], + [12,17],[17,19],[19,21], + [21,23],[12,9],[9,6], + [6,3],[3,0],[0,1], + [1,4],[4,7],[7,10],[0,2],[2,5],[5,8],[8,11] + ] + connection_colors = [ + [255, 0, 0], # 0 + [0, 255, 0], # 1 + [0, 0, 255], # 2 + [255, 255, 0], # 3 + [255, 0, 255], # 4 + [0, 255, 0], # 5 + [0, 85, 255], # 6 + [255, 175, 0], # 7 + [0, 0, 255], # 8 + [255, 85, 0], # 9 + [0, 255, 85], # 10 + [255, 0, 255], # 11 + [255, 0, 0], # 12 + [0, 175, 255], # 13 + [255, 255, 0], # 14 + [0, 0, 255], # 15 + [0, 255, 0], # 16 + ] + + # draw point + for i in range(len(points)): + x,y = points[i][0:2] + x,y = int(x),int(y) + if i==13 or i == 14: + continue + cv2.circle(canvas, (x, y), r, colors[i%17], thickness=-1) + + # draw line + if draw_line: + for i in range(len(connetions)): + point1_idx,point2_idx = connetions[i][0:2] + point1 = points[point1_idx] + point2 = points[point2_idx] + Y = [point2[0],point1[0]] + X = [point2[1],point1[1]] + mX = int(np.mean(X)) + mY = int(np.mean(Y)) + length = ((X[0] - X[1]) ** 2 + (Y[0] - Y[1]) ** 2) ** 0.5 + angle = math.degrees(math.atan2(X[0] - X[1], Y[0] - Y[1])) + polygon = cv2.ellipse2Poly((mY, mX), (int(length / 2), stickwidth), int(angle), 0, 360, 1) + cv2.fillConvexPoly(canvas, polygon, connection_colors[i%17]) + + return canvas diff --git a/MTV/motion4d/__init__.py b/MTV/motion4d/__init__.py new file mode 100644 index 0000000..87ac3b3 --- /dev/null +++ b/MTV/motion4d/__init__.py @@ -0,0 +1 @@ +from .vqvae import SMPL_VQVAE, VectorQuantizer, Encoder, Decoder \ No newline at end of file diff --git a/MTV/motion4d/vqvae.py b/MTV/motion4d/vqvae.py new file mode 100644 index 0000000..30535e0 --- /dev/null +++ b/MTV/motion4d/vqvae.py @@ -0,0 +1,329 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +import numpy as np + + +class Encoder(nn.Module): + def __init__( + self, + in_channels=3, + mid_channels=[128, 512], + out_channels=3072, + downsample_time=[1, 1], + downsample_joint=[1, 1], + num_attention_heads=8, + attention_head_dim=64, + dim=3072, + ): + super(Encoder, self).__init__() + + self.conv_in = nn.Conv2d(in_channels, mid_channels[0], kernel_size=3, stride=1, padding=1) + self.resnet1 = nn.ModuleList([ResBlock(mid_channels[0], mid_channels[0]) for _ in range(3)]) + self.downsample1 = Downsample(mid_channels[0], mid_channels[0], downsample_time[0], downsample_joint[0]) + self.resnet2 = ResBlock(mid_channels[0], mid_channels[1]) + self.resnet3 = nn.ModuleList([ResBlock(mid_channels[1], mid_channels[1]) for _ in range(3)]) + self.downsample2 = Downsample(mid_channels[1], mid_channels[1], downsample_time[1], downsample_joint[1]) + self.conv_out = nn.Conv2d(mid_channels[-1], out_channels, kernel_size=3, stride=1, padding=1) + + def forward(self, x): + x = self.conv_in(x) + for resnet in self.resnet1: + x = resnet(x) + x = self.downsample1(x) + + x = self.resnet2(x) + for resnet in self.resnet3: + x = resnet(x) + x = self.downsample2(x) + + x = self.conv_out(x) + + return x + + + +class VectorQuantizer(nn.Module): + def __init__(self, nb_code, code_dim): + super().__init__() + self.nb_code = nb_code + self.code_dim = code_dim + self.mu = 0.99 + self.reset_codebook() + self.reset_count = 0 + self.usage = torch.zeros((self.nb_code, 1)) + + def reset_codebook(self): + self.init = False + self.code_sum = None + self.code_count = None + self.register_buffer('codebook', torch.zeros(self.nb_code, self.code_dim).cuda()) + + def _tile(self, x): + nb_code_x, code_dim = x.shape + if nb_code_x < self.nb_code: + n_repeats = (self.nb_code + nb_code_x - 1) // nb_code_x + std = 0.01 / np.sqrt(code_dim) + out = x.repeat(n_repeats, 1) + out = out + torch.randn_like(out) * std + else: + out = x + return out + + def preprocess(self, x): + # [bs, c, f, j] -> [bs * f * j, c] + x = x.permute(0, 2, 3, 1).contiguous() + x = x.view(-1, x.shape[-1]) + return x + + def quantize(self, x): + # [bs * f * j, dim=3072] + # Calculate latent code x_l + k_w = self.codebook.t() + distance = torch.sum(x ** 2, dim=-1, keepdim=True) - 2 * torch.matmul(x, k_w) + torch.sum(k_w ** 2, dim=0, keepdim=True) + _, code_idx = torch.min(distance, dim=-1) + return code_idx + + def dequantize(self, code_idx): + x = F.embedding(code_idx, self.codebook) # indexing: [bs * f * j, 32] + return x + + def forward(self, x, return_vq=False): + bs, c, f, j = x.shape # SMPL data frames: [bs, 3072, f, j] + + # Preprocess + x = self.preprocess(x) + # return x.view(bs, f*j, c).contiguous(), None + assert x.shape[-1] == self.code_dim + + # quantize and dequantize through bottleneck + code_idx = self.quantize(x) + x_d = self.dequantize(code_idx) + + # Loss + commit_loss = F.mse_loss(x, x_d.detach()) + + # Passthrough + x_d = x + (x_d - x).detach() + + if return_vq: + return x_d.view(bs, f*j, c).contiguous(), commit_loss + # return (x_d, x_d.view(bs, f, j, c).permute(0, 3, 1, 2).contiguous()), commit_loss, perplexity + + # Postprocess + x_d = x_d.view(bs, f, j, c).permute(0, 3, 1, 2).contiguous() + + return x_d, commit_loss + + + + +class Decoder(nn.Module): + def __init__( + self, + in_channels=3072, + mid_channels=[512, 128], + out_channels=3, + upsample_rate=None, + frame_upsample_rate=[1.0, 1.0], + joint_upsample_rate=[1.0, 1.0], + dim=128, + attention_head_dim=64, + num_attention_heads=8, + ): + super(Decoder, self).__init__() + + self.conv_in = nn.Conv2d(in_channels, mid_channels[0], kernel_size=3, stride=1, padding=1) + self.resnet1 = nn.ModuleList([ResBlock(mid_channels[0], mid_channels[0]) for _ in range(3)]) + self.upsample1 = Upsample(mid_channels[0], mid_channels[0], frame_upsample_rate=frame_upsample_rate[0], joint_upsample_rate=joint_upsample_rate[0]) + self.resnet2 = ResBlock(mid_channels[0], mid_channels[1]) + self.resnet3 = nn.ModuleList([ResBlock(mid_channels[1], mid_channels[1]) for _ in range(3)]) + self.upsample2 = Upsample(mid_channels[1], mid_channels[1], frame_upsample_rate=frame_upsample_rate[1], joint_upsample_rate=joint_upsample_rate[1]) + self.conv_out = nn.Conv2d(mid_channels[-1], out_channels, kernel_size=3, stride=1, padding=1) + + def forward(self, x): + x = self.conv_in(x) + for resnet in self.resnet1: + x = resnet(x) + x = self.upsample1(x) + + x = self.resnet2(x) + for resnet in self.resnet3: + x = resnet(x) + x = self.upsample2(x) + + x = self.conv_out(x) + + return x + + +class Upsample(nn.Module): + def __init__( + self, + in_channels, + out_channels, + upsample_rate=None, + frame_upsample_rate=None, + joint_upsample_rate=None, + ): + super(Upsample, self).__init__() + + self.upsampler = nn.Conv1d(in_channels, out_channels, kernel_size=3, stride=1, padding=1) + self.upsample_rate = upsample_rate + self.frame_upsample_rate = frame_upsample_rate + self.joint_upsample_rate = joint_upsample_rate + self.upsample_rate = upsample_rate + + def forward(self, inputs): + if inputs.shape[2] > 1 and inputs.shape[2] % 2 == 1: + # split first frame + x_first, x_rest = inputs[:, :, 0], inputs[:, :, 1:] + + if self.upsample_rate is not None: + # import pdb; pdb.set_trace() + x_first = F.interpolate(x_first, scale_factor=self.upsample_rate) + x_rest = F.interpolate(x_rest, scale_factor=self.upsample_rate) + else: + # import pdb; pdb.set_trace() + # x_first = F.interpolate(x_first, scale_factor=(self.frame_upsample_rate, self.joint_upsample_rate), mode="bilinear", align_corners=True) + x_rest = F.interpolate(x_rest, scale_factor=(self.frame_upsample_rate, self.joint_upsample_rate), mode="bilinear", align_corners=True) + x_first = x_first[:, :, None, :] + inputs = torch.cat([x_first, x_rest], dim=2) + elif inputs.shape[2] > 1: + if self.upsample_rate is not None: + inputs = F.interpolate(inputs, scale_factor=self.upsample_rate) + else: + inputs = F.interpolate(inputs, scale_factor=(self.frame_upsample_rate, self.joint_upsample_rate), mode="bilinear", align_corners=True) + else: + inputs = inputs.squeeze(2) + if self.upsample_rate is not None: + inputs = F.interpolate(inputs, scale_factor=self.upsample_rate) + else: + inputs = F.interpolate(inputs, scale_factor=(self.frame_upsample_rate, self.joint_upsample_rate), mode="linear", align_corners=True) + inputs = inputs[:, :, None, :, :] + + b, c, t, j = inputs.shape + inputs = inputs.permute(0, 2, 1, 3).reshape(b * t, c, j) + inputs = self.upsampler(inputs) + inputs = inputs.reshape(b, t, *inputs.shape[1:]).permute(0, 2, 1, 3) + + return inputs + + +class Downsample(nn.Module): + def __init__( + self, + in_channels, + out_channels, + frame_downsample_rate, + joint_downsample_rate + ): + super(Downsample, self).__init__() + + self.frame_downsample_rate = frame_downsample_rate + self.joint_downsample_rate = joint_downsample_rate + self.joint_downsample = nn.Conv1d(in_channels, out_channels, kernel_size=3, stride=self.joint_downsample_rate, padding=1) + + def forward(self, x): + # (batch_size, channels, frames, joints) -> (batch_size * joints, channels, frames) + if self.frame_downsample_rate > 1: + batch_size, channels, frames, joints = x.shape + x = x.permute(0, 3, 1, 2).reshape(batch_size * joints, channels, frames) + if x.shape[-1] % 2 == 1: + x_first, x_rest = x[..., 0], x[..., 1:] + if x_rest.shape[-1] > 0: + # (batch_size * height * width, channels, frames - 1) -> (batch_size * height * width, channels, (frames - 1) // 2) + x_rest = F.avg_pool1d(x_rest, kernel_size=self.frame_downsample_rate, stride=self.frame_downsample_rate) + + x = torch.cat([x_first[..., None], x_rest], dim=-1) + # (batch_size * joints, channels, (frames // 2) + 1) -> (batch_size, channels, (frames // 2) + 1, joints) + x = x.reshape(batch_size, joints, channels, x.shape[-1]).permute(0, 2, 3, 1) + else: + # (batch_size * joints, channels, frames) -> (batch_size * joints, channels, frames // 2) + x = F.avg_pool1d(x, kernel_size=2, stride=2) + # (batch_size * joints, channels, frames // 2) -> (batch_size, height, width, channels, frames // 2) -> (batch_size, channels, frames // 2, height, width) + x = x.reshape(batch_size, joints, channels, x.shape[-1]).permute(0, 2, 3, 1) + + # Pad the tensor + # pad = (0, 1) + # x = F.pad(x, pad, mode="constant", value=0) + batch_size, channels, frames, joints = x.shape + # (batch_size, channels, frames, joints) -> (batch_size * frames, channels, joints) + x = x.permute(0, 2, 1, 3).reshape(batch_size * frames, channels, joints) + x = self.joint_downsample(x) + # (batch_size * frames, channels, joints) -> (batch_size, channels, frames, joints) + x = x.reshape(batch_size, frames, x.shape[1], x.shape[2]).permute(0, 2, 1, 3) + return x + + + +class ResBlock(nn.Module): + def __init__(self, + in_channels, + out_channels, + group_num=32, + max_channels=512): + super(ResBlock, self).__init__() + skip = max(1, max_channels // out_channels - 1) + self.block = nn.Sequential( + nn.GroupNorm(group_num, in_channels, eps=1e-06, affine=True), + nn.SiLU(), + nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=1, padding=skip, dilation=skip), + nn.GroupNorm(group_num, out_channels, eps=1e-06, affine=True), + nn.SiLU(), + nn.Conv2d(out_channels, out_channels, kernel_size=1, stride=1, padding=0), + ) + self.conv_short = nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=1, padding=0) if in_channels != out_channels else nn.Identity() + + def forward(self, x): + hidden_states = self.block(x) + if hidden_states.shape != x.shape: + x = self.conv_short(x) + x = x + hidden_states + return x + + + +class SMPL_VQVAE(nn.Module): + def __init__(self, encoder, decoder, vq): + super(SMPL_VQVAE, self).__init__() + + self.encoder = encoder + self.decoder = decoder + self.vq = vq + + def to(self, device): + self.encoder = self.encoder.to(device) + self.decoder = self.decoder.to(device) + self.vq = self.vq.to(device) + self.device = device + return self + + def encdec_slice_frames(self, x, frame_batch_size, encdec, return_vq): + num_frames = x.shape[2] + remaining_frames = num_frames % frame_batch_size + x_output = [] + + for i in range(num_frames // frame_batch_size): + remaining_frames = num_frames % frame_batch_size + start_frame = frame_batch_size * i + (0 if i == 0 else remaining_frames) + end_frame = frame_batch_size * (i + 1) + remaining_frames + x_intermediate = x[:, :, start_frame:end_frame] + x_intermediate = encdec(x_intermediate) + x_output.append(x_intermediate) + if encdec == self.encoder and self.vq is not None: + x_output, loss = self.vq(torch.cat(x_output, dim=2), return_vq=return_vq) + return x_output, loss + else: + return torch.cat(x_output, dim=2), None, None + + def forward(self, x, return_vq=False): + x = x.permute(0, 3, 1, 2) + x, loss = self.encdec_slice_frames(x, frame_batch_size=8, encdec=self.encoder, return_vq=return_vq) + + if return_vq: + return x, loss + x, _, _ = self.encdec_slice_frames(x, frame_batch_size=2, encdec=self.decoder, return_vq=return_vq) + x = x.permute(0, 2, 3, 1) + + return x, loss diff --git a/MTV/mtv.py b/MTV/mtv.py new file mode 100644 index 0000000..915773d --- /dev/null +++ b/MTV/mtv.py @@ -0,0 +1,193 @@ +import torch +import numpy as np +from typing import Union, Tuple + + +def get_1d_rotary_pos_embed( + dim: int, + pos: Union[np.ndarray, int], + theta: float = 10000.0, + use_real=False, + linear_factor=1.0, + ntk_factor=1.0, + repeat_interleave_real=True, + freqs_dtype=torch.float32, # torch.float32, torch.float64 (flux) +): + """ + Precompute the frequency tensor for complex exponentials (cis) with given dimensions. + + This function calculates a frequency tensor with complex exponentials using the given dimension 'dim' and the end + index 'end'. The 'theta' parameter scales the frequencies. The returned tensor contains complex values in complex64 + data type. + + Args: + dim (`int`): Dimension of the frequency tensor. + pos (`np.ndarray` or `int`): Position indices for the frequency tensor. [S] or scalar + theta (`float`, *optional*, defaults to 10000.0): + Scaling factor for frequency computation. Defaults to 10000.0. + use_real (`bool`, *optional*): + If True, return real part and imaginary part separately. Otherwise, return complex numbers. + linear_factor (`float`, *optional*, defaults to 1.0): + Scaling factor for the context extrapolation. Defaults to 1.0. + ntk_factor (`float`, *optional*, defaults to 1.0): + Scaling factor for the NTK-Aware RoPE. Defaults to 1.0. + repeat_interleave_real (`bool`, *optional*, defaults to `True`): + If `True` and `use_real`, real part and imaginary part are each interleaved with themselves to reach `dim`. + Otherwise, they are concateanted with themselves. + freqs_dtype (`torch.float32` or `torch.float64`, *optional*, defaults to `torch.float32`): + the dtype of the frequency tensor. + Returns: + `torch.Tensor`: Precomputed frequency tensor with complex exponentials. [S, D/2] + """ + assert dim % 2 == 0 + + if isinstance(pos, int): + pos = torch.arange(pos) + if isinstance(pos, np.ndarray): + pos = torch.from_numpy(pos) # type: ignore # [S] + + theta = theta * ntk_factor + freqs = ( + 1.0 + / (theta ** (torch.arange(0, dim, 2, dtype=freqs_dtype, device=pos.device)[: (dim // 2)] / dim)) + / linear_factor + ) # [D/2] + freqs = torch.outer(pos, freqs) # type: ignore # [S, D/2] + if use_real and repeat_interleave_real: + freqs_cos = freqs.cos().repeat_interleave(2, dim=1).float() # [S, D] + freqs_sin = freqs.sin().repeat_interleave(2, dim=1).float() # [S, D] + return freqs_cos, freqs_sin + elif use_real: + freqs_cos = torch.cat([freqs.cos(), freqs.cos()], dim=-1).float() # [S, D] + freqs_sin = torch.cat([freqs.sin(), freqs.sin()], dim=-1).float() # [S, D] + return freqs_cos, freqs_sin + else: + freqs_cis = torch.polar(torch.ones_like(freqs), freqs) # complex64 # [S, D/2] + return freqs_cis + + +def get_3d_rotary_pos_embed( + embed_dim, crops_coords, grid_size, temporal_size, theta: int = 10000, use_real: bool = True +) -> Union[torch.Tensor, Tuple[torch.Tensor, torch.Tensor]]: + """ + RoPE for video tokens with 3D structure. + + Args: + embed_dim: (`int`): + The embedding dimension size, corresponding to hidden_size_head. + crops_coords (`Tuple[int]`): + The top-left and bottom-right coordinates of the crop. + grid_size (`Tuple[int]`): + The grid size of the spatial positional embedding (height, width). + temporal_size (`int`): + The size of the temporal dimension. + theta (`float`): + Scaling factor for frequency computation. + + Returns: + `torch.Tensor`: positional embedding with shape `(temporal_size * grid_size[0] * grid_size[1], embed_dim/2)`. + """ + if use_real is not True: + raise ValueError(" `use_real = False` is not currently supported for get_3d_rotary_pos_embed") + start, stop = crops_coords + grid_size_h, grid_size_w = grid_size + grid_h = np.linspace(start[0], stop[0], grid_size_h, endpoint=False, dtype=np.float32) + grid_w = np.linspace(start[1], stop[1], grid_size_w, endpoint=False, dtype=np.float32) + grid_t = np.linspace(0, temporal_size, temporal_size, endpoint=False, dtype=np.float32) + + # Compute dimensions for each axis + dim_t = embed_dim // 4 + dim_h = embed_dim // 8 * 3 + dim_w = embed_dim // 8 * 3 + + # Temporal frequencies + freqs_t = get_1d_rotary_pos_embed(dim_t, grid_t, use_real=True) + # Spatial frequencies for height and width + freqs_h = get_1d_rotary_pos_embed(dim_h, grid_h, use_real=True) + freqs_w = get_1d_rotary_pos_embed(dim_w, grid_w, use_real=True) + + # BroadCast and concatenate temporal and spaial frequencie (height and width) into a 3d tensor + def combine_time_height_width(freqs_t, freqs_h, freqs_w): + freqs_t = freqs_t[:, None, None, :].expand( + -1, grid_size_h, grid_size_w, -1 + ) # temporal_size, grid_size_h, grid_size_w, dim_t + freqs_h = freqs_h[None, :, None, :].expand( + temporal_size, -1, grid_size_w, -1 + ) # temporal_size, grid_size_h, grid_size_2, dim_h + freqs_w = freqs_w[None, None, :, :].expand( + temporal_size, grid_size_h, -1, -1 + ) # temporal_size, grid_size_h, grid_size_2, dim_w + + freqs = torch.cat( + [freqs_t, freqs_h, freqs_w], dim=-1 + ) # temporal_size, grid_size_h, grid_size_w, (dim_t + dim_h + dim_w) + freqs = freqs.view( + temporal_size * grid_size_h * grid_size_w, -1 + ) # (temporal_size * grid_size_h * grid_size_w), (dim_t + dim_h + dim_w) + return freqs + + t_cos, t_sin = freqs_t # both t_cos and t_sin has shape: temporal_size, dim_t + h_cos, h_sin = freqs_h # both h_cos and h_sin has shape: grid_size_h, dim_h + w_cos, w_sin = freqs_w # both w_cos and w_sin has shape: grid_size_w, dim_w + cos = combine_time_height_width(t_cos, h_cos, w_cos) + sin = combine_time_height_width(t_sin, h_sin, w_sin) + return cos, sin + + +def get_3d_motion_spatial_embed( + embed_dim: int, num_joints: int, joints_mean: np.ndarray, joints_std: np.ndarray, theta: float = 10000.0 +) -> Union[torch.Tensor, Tuple[torch.Tensor, torch.Tensor]]: + assert embed_dim % 2 == 0 and embed_dim % 3 == 0 + + def create_rope_pe(dim, pos, freqs_dtype=torch.float32): + if isinstance(pos, np.ndarray): + pos = torch.from_numpy(pos) + freqs = ( + 1.0 + / (theta ** (torch.arange(0, dim, 2, dtype=freqs_dtype, device=pos.device)[: (dim // 2)] / dim)) + ) # [D/2] + freqs = torch.outer(pos, freqs) # type: ignore # [S, D/2] + freqs_cos = freqs.cos().repeat_interleave(2, dim=1).float() # [S, D] + freqs_sin = freqs.sin().repeat_interleave(2, dim=1).float() # [S, D] + return freqs_cos, freqs_sin + + pos_x = joints_mean[:, 0] + pos_y = joints_mean[:, 1] + pos_z = joints_mean[:, 2] + + normalized_pos_x = (pos_x - pos_x.mean()) + normalized_pos_y = (pos_y - pos_y.mean()) + normalized_pos_z = (pos_z - pos_z.mean()) + + freqs_cos_x, freqs_sin_x = create_rope_pe(embed_dim // 3, normalized_pos_x) + freqs_cos_y, freqs_sin_y = create_rope_pe(embed_dim // 3, normalized_pos_y) + freqs_cos_z, freqs_sin_z = create_rope_pe(embed_dim // 3, normalized_pos_z) + + freqs_cos = torch.cat([freqs_cos_x, freqs_cos_y, freqs_cos_z], dim=-1) + freqs_sin = torch.cat([freqs_sin_x, freqs_sin_y, freqs_sin_z], dim=-1) + + return freqs_cos, freqs_sin + +def prepare_motion_embeddings(num_frames, num_joints, joints_mean, joints_std, theta=10000, device='cuda'): + time_embed = get_1d_rotary_pos_embed(44, num_frames, theta, use_real=True) + time_embed_cos = time_embed[0][:, None, :].expand(-1, num_joints, -1).reshape(num_frames*num_joints, -1) + time_embed_sin = time_embed[1][:, None, :].expand(-1, num_joints, -1).reshape(num_frames*num_joints, -1) + spatial_motion_embed = get_3d_motion_spatial_embed(84, num_joints, joints_mean, joints_std, theta) + spatial_embed_cos = spatial_motion_embed[0][None, :, :].expand(num_frames, -1, -1).reshape(num_frames*num_joints, -1) + spatial_embed_sin = spatial_motion_embed[1][None, :, :].expand(num_frames, -1, -1).reshape(num_frames*num_joints, -1) + motion_embed_cos = torch.cat([time_embed_cos, spatial_embed_cos], dim=-1).to(device=device) + motion_embed_sin = torch.cat([time_embed_sin, spatial_embed_sin], dim=-1).to(device=device) + return motion_embed_cos, motion_embed_sin + +def apply_rotary_emb(x, freqs_cis): + cos, sin = freqs_cis # [S, D] + cos = cos[None, None] + sin = sin[None, None] + cos, sin = cos.to(x.device), sin.to(x.device) + + x_real, x_imag = x.reshape(*x.shape[:-1], -1, 2).unbind(-1) # [B, S, H, D//2] + x_rotated = torch.stack([-x_imag, x_real], dim=-1).flatten(3) + + out = (x.float() * cos + x_rotated.float() * sin).to(x.dtype) + + return out \ No newline at end of file diff --git a/MTV/nlf.py b/MTV/nlf.py new file mode 100644 index 0000000..e69de29 diff --git a/MTV/nodes.py b/MTV/nodes.py new file mode 100644 index 0000000..bb6ae4c --- /dev/null +++ b/MTV/nodes.py @@ -0,0 +1,242 @@ +import os +import torch +import gc +from ..utils import log, dict_to_device +import numpy as np +from accelerate import init_empty_weights +from accelerate.utils import set_module_tensor_to_device + +import comfy.model_management as mm +from comfy.utils import load_torch_file +import folder_paths + +script_directory = os.path.dirname(os.path.abspath(__file__)) +device = mm.get_torch_device() +offload_device = mm.unet_offload_device() + +local_model_path = os.path.join(folder_paths.models_dir, "nlf", "nlf_l_multi_0.3.2.torchscript") + +from .motion4d import SMPL_VQVAE, VectorQuantizer, Encoder, Decoder +from .mtv import prepare_motion_embeddings + +class DownloadAndLoadNLFModel: + @classmethod + def INPUT_TYPES(s): + return { + "required": { + "url": ( + [ + "https://github.com/isarandi/nlf/releases/download/v0.3.2/nlf_l_multi_0.3.2.torchscript" + ], + ) + }, + } + + RETURN_TYPES = ("NLFMODEL",) + RETURN_NAMES = ("nlf_model", ) + FUNCTION = "loadmodel" + CATEGORY = "WanVideoWrapper" + + def loadmodel(self, url): + + if not os.path.exists(local_model_path): + log.info(f"Downloading NLF model to: {local_model_path}") + import requests + os.makedirs(os.path.dirname(local_model_path), exist_ok=True) + response = requests.get(url) + if response.status_code == 200: + with open(local_model_path, "wb") as f: + f.write(response.content) + else: + print("Failed to download file:", response.status_code) + + model = torch.jit.load(local_model_path).eval() + + return (model,) + +class LoadNLFModel: + @classmethod + def INPUT_TYPES(s): + return { + "required": { + "path": ("STRING", {"default": local_model_path}), + }, + } + + RETURN_TYPES = ("NLFMODEL",) + RETURN_NAMES = ("nlf_model", ) + FUNCTION = "loadmodel" + CATEGORY = "WanVideoWrapper" + + def loadmodel(self, path): + model = torch.jit.load(path).eval() + + return model, + +class LoadVQVAE: + @classmethod + def INPUT_TYPES(s): + return { + "required": { + "model_name": (folder_paths.get_filename_list("vae"), {"tooltip": "These models are loaded from 'ComfyUI/models/vae'"}), + }, + } + + RETURN_TYPES = ("VQVAE",) + RETURN_NAMES = ("vqvae", ) + FUNCTION = "loadmodel" + CATEGORY = "WanVideoWrapper" + + def loadmodel(self, model_name): + model_path = folder_paths.get_full_path("vae", model_name) + vae_sd = load_torch_file(model_path, safe_load=True) + + # Get motion tokenizer + motion_encoder = Encoder( + in_channels=3, + mid_channels=[128, 512], + out_channels=3072, + downsample_time=[2, 2], + downsample_joint=[1, 1] + ) + motion_quant = VectorQuantizer(nb_code=8192, code_dim=3072) + motion_decoder = Decoder( + in_channels=3072, + mid_channels=[512, 128], + out_channels=3, + upsample_rate=2.0, + frame_upsample_rate=[2.0, 2.0], + joint_upsample_rate=[1.0, 1.0] + ) + + vqvae = SMPL_VQVAE(motion_encoder, motion_decoder, motion_quant).to(device) + vqvae.load_state_dict(vae_sd, strict=True) + + return vqvae, + +class MTVCrafterEncodePoses: + @classmethod + def INPUT_TYPES(s): + return { + "required": { + "vqvae": ("VQVAE", {"tooltip": "VQVAE model"}), + "poses": ("NLFPRED", {"tooltip": "Input poses for the model"}), + }, + } + + RETURN_TYPES = ("MTVCRAFTERMOTION", "NLFPRED") + RETURN_NAMES = ("mtvcrafter_motion", "pose_results") + FUNCTION = "encode" + CATEGORY = "WanVideoWrapper" + + def encode(self, vqvae, poses): + + # import pickle + # with open(os.path.join(script_directory, "data", "sampled_data.pkl"), 'rb') as f: + # data_list = pickle.load(f) + # if not isinstance(data_list, list): + # data_list = [data_list] + # print(data_list) + + # smpl_poses = data_list[1]['pose'] + + global_mean = np.load(os.path.join(script_directory, "data", "mean.npy")) #global_mean.shape: (24, 3) + global_std = np.load(os.path.join(script_directory, "data", "std.npy")) + + smpl_poses = [] + for pose in poses['joints3d_nonparam'][0]: + smpl_poses.append(pose[0].cpu().numpy()) + smpl_poses = np.array(smpl_poses) + + norm_poses = torch.tensor((smpl_poses - global_mean) / global_std).unsqueeze(0) + print(f"norm_poses shape: {norm_poses.shape}, dtype: {norm_poses.dtype}") + + vqvae.to(device) + motion_tokens, vq_loss = vqvae(norm_poses.to(device), return_vq=True) + + recon_motion = vqvae(norm_poses.to(device))[0][0].to(dtype=torch.float32).cpu().detach() * global_std + global_mean + vqvae.to(offload_device) + + poses_dict = { + 'mtv_motion_tokens': motion_tokens, + 'global_mean': global_mean, + 'global_std': global_std + } + + return poses_dict, recon_motion + + +class NLFPredict: + @classmethod + def INPUT_TYPES(s): + return {"required": { + "model": ("NLFMODEL",), + "images": ("IMAGE", {"tooltip": "Input images for the model"}), + }, + } + + RETURN_TYPES = ("NLFPRED", ) + RETURN_NAMES = ("pose_results",) + FUNCTION = "predict" + CATEGORY = "WanVideoWrapper" + + def predict(self, model, images): + + model.to(device) + pred = model.detect_smpl_batched(images.permute(0, 3, 1, 2).to(device)) + model.to(offload_device) + + pred = dict_to_device(pred, offload_device) + + pose_results = { + 'joints3d_nonparam': [], + } + # Collect pose data + for key in pose_results.keys(): + if key in pred: + pose_results[key].append(pred[key]) + else: + pose_results[key].append(None) + + return (pose_results,) + +class DrawNLFPoses: + @classmethod + def INPUT_TYPES(s): + return {"required": { + "poses": ("NLFPRED", {"tooltip": "Input poses for the model"}), + "width": ("INT", {"default": 512}), + "height": ("INT", {"default": 512}), + }, + } + + RETURN_TYPES = ("IMAGE", ) + RETURN_NAMES = ("image",) + FUNCTION = "predict" + CATEGORY = "WanVideoWrapper" + + def predict(self, poses, width, height): + from .draw_pose import get_control_conditions + print(type(poses)) + if isinstance(poses, dict): + pose_input = poses['joints3d_nonparam'][0] if 'joints3d_nonparam' in poses else poses + else: + pose_input = poses + control_conditions = get_control_conditions(pose_input, height, width) + + return (control_conditions,) + +NODE_CLASS_MAPPINGS = { + "DownloadAndLoadNLFModel": DownloadAndLoadNLFModel, + "NLFPredict": NLFPredict, + "DrawNLFPoses": DrawNLFPoses, + "LoadVQVAE": LoadVQVAE, + "MTVCrafterEncodePoses": MTVCrafterEncodePoses + } +NODE_DISPLAY_NAME_MAPPINGS = { + "DownloadAndLoadNLFModel": "(Download)Load NLF Model", + "NLFPredict": "NLF Predict", + "DrawNLFPoses": "Draw NLF Poses", + "LoadVQVAE": "Load VQVAE", + "MTVCrafterEncodePoses": "MTV Crafter Encode Poses" +} diff --git a/__init__.py b/__init__.py index 112b36e..1f81508 100644 --- a/__init__.py +++ b/__init__.py @@ -35,6 +35,13 @@ except Exception as e: UNIANIMATE_NODE_CLASS_MAPPINGS = {} UNIANIMATE_NODE_DISPLAY_NAME_MAPPINGS = {} +try: + from .MTV.nodes import NODE_CLASS_MAPPINGS as MTV_NODE_CLASS_MAPPINGS, NODE_DISPLAY_NAME_MAPPINGS as MTV_NODE_DISPLAY_NAME_MAPPINGS +except Exception as e: + print(f"MTV nodes not available due to error in importing them: {e}") + MTV_NODE_CLASS_MAPPINGS = {} + MTV_NODE_DISPLAY_NAME_MAPPINGS = {} + NODE_CLASS_MAPPINGS.update(RECAM_MASTER_NODE_CLASS_MAPPINGS) NODE_CLASS_MAPPINGS.update(UNIANIMATE_NODE_CLASS_MAPPINGS) NODE_CLASS_MAPPINGS.update(SKYREELS_NODE_CLASS_MAPPINGS) @@ -50,6 +57,7 @@ NODE_CLASS_MAPPINGS.update(UTILITY_NODE_CLASS_MAPPINGS) NODE_CLASS_MAPPINGS.update(NODE_CACHE_CLASS_MAPPINGS) NODE_CLASS_MAPPINGS.update(DEPRECATED_NODE_CLASS_MAPPINGS) NODE_CLASS_MAPPINGS.update(QWEN_NODE_CLASS_MAPPINGS) +NODE_CLASS_MAPPINGS.update(MTV_NODE_CLASS_MAPPINGS) NODE_DISPLAY_NAME_MAPPINGS.update(RECAM_MASTER_NODE_DISPLAY_NAME_MAPPINGS) NODE_DISPLAY_NAME_MAPPINGS.update(UNIANIMATE_NODE_DISPLAY_NAME_MAPPINGS) @@ -65,7 +73,7 @@ NODE_DISPLAY_NAME_MAPPINGS.update(MODEL_LOADING_NODE_DISPLAY_NAME_MAPPINGS) NODE_DISPLAY_NAME_MAPPINGS.update(UTILITY_NODE_DISPLAY_NAME_MAPPINGS) NODE_DISPLAY_NAME_MAPPINGS.update(NODE_CACHE_DISPLAY_NAME_MAPPINGS) NODE_DISPLAY_NAME_MAPPINGS.update(DEPRECATED_NODE_DISPLAY_NAME_MAPPINGS) -NODE_DISPLAY_NAME_MAPPINGS.update(QWEN_NODE_DISPLAY_NAME_MAPPINGS) - +NODE_DISPLAY_NAME_MAPPINGS.update(QWEN_NODE_DISPLAY_NAME_MAPPINGS) +NODE_DISPLAY_NAME_MAPPINGS.update(MTV_NODE_DISPLAY_NAME_MAPPINGS) __all__ = ["NODE_CLASS_MAPPINGS", "NODE_DISPLAY_NAME_MAPPINGS"] \ No newline at end of file diff --git a/custom_linear.py b/custom_linear.py index 391502b..5236458 100644 --- a/custom_linear.py +++ b/custom_linear.py @@ -1,6 +1,7 @@ import torch import torch.nn as nn from accelerate import init_empty_weights +from comfy.ops import cast_bias_weight #based on https://github.com/huggingface/diffusers/blob/main/src/diffusers/quantizers/gguf/utils.py def _replace_linear(model, compute_dtype, state_dict, prefix="", patches=None, scale_weights=None): @@ -74,10 +75,12 @@ class CustomLinear(nn.Linear): self.lora = None self.step = 0 self.scale_weight = scale_weight + self.bias_function = [] + self.weight_function = [] def forward(self, input): - weight = self.weight.to(input.dtype) - bias = self.bias.to(input.dtype) if self.bias is not None else None + weight, bias = cast_bias_weight(self, input) + if self.scale_weight is not None: scale_weight = self.scale_weight.to(input.device) if weight.numel() < input.numel(): @@ -86,7 +89,7 @@ class CustomLinear(nn.Linear): input = input * scale_weight if self.lora is not None: - weight = self.apply_lora(weight).to(input.dtype) + weight = self.apply_lora(weight).to(self.compute_dtype) return torch.nn.functional.linear(input, weight, bias) diff --git a/fp8_optimization.py b/fp8_optimization.py index dac0d3d..33d6f60 100644 --- a/fp8_optimization.py +++ b/fp8_optimization.py @@ -48,26 +48,6 @@ def apply_lora(weight, lora, step=None): weight = weight.add(patch_diff, alpha=scale) return weight - -def linear_with_lora_and_scale_forward(cls, input): - # Handles both scaled and unscaled, with or without LoRA - has_scale = hasattr(cls, "scale_weight") - weight = cls.weight.to(input.dtype) - bias = cls.bias.to(input.dtype) if cls.bias is not None else None - - if has_scale: - scale_weight = cls.scale_weight.to(input.device) - if weight.numel() < input.numel(): - weight = weight * scale_weight - else: - input = input * scale_weight - - lora = getattr(cls, "lora", None) - if lora is not None: - weight = apply_lora(weight, lora, cls.step).to(input.dtype) - - return torch.nn.functional.linear(input, weight, bias) - def convert_fp8_linear(module, base_dtype, params_to_keep={}, scale_weight_keys=None): log.info("FP8 matmul enabled") for name, submodule in module.named_modules(): @@ -81,57 +61,4 @@ def convert_fp8_linear(module, base_dtype, params_to_keep={}, scale_weight_keys= original_forward = submodule.forward setattr(submodule, "original_forward", original_forward) setattr(submodule, "forward", lambda input, m=submodule: fp8_linear_forward(m, base_dtype, input)) - -def convert_linear_with_lora_and_scale(module, scale_weight_keys=None, patches=None, params_to_keep={}): - log.info("Patching Linear layers...") - for name, submodule in module.named_modules(): - if not any(keyword in name for keyword in params_to_keep): - # Set scale_weight if present - if scale_weight_keys is not None: - scale_key = f"{name}.scale_weight" - if scale_key in scale_weight_keys: - setattr(submodule, "scale_weight", scale_weight_keys[scale_key]) - # Set LoRA if present - if hasattr(submodule, "lora"): - #print(f"removing old LoRA in {name}" ) - delattr(submodule, "lora") - if patches is not None: - patch_key1 = f"diffusion_model.{name}.weight" - patch_key_compiled = f"diffusion_model.{name.replace('_orig_mod.', '')}.weight" - patch = patches.get(patch_key1, []) or patches.get(patch_key_compiled, []) - if len(patch) != 0: - lora_diffs = [] - for p in patch: - lora_obj = p[1] - if "head" in name: - continue # For now skip LoRA for head layers - elif hasattr(lora_obj, "weights"): - lora_diffs.append(lora_obj.weights) - elif isinstance(lora_obj, tuple) and lora_obj[0] == "diff": - lora_diffs.append(lora_obj[1]) - else: - continue - lora_strengths = [p[0] for p in patch] - lora = (lora_diffs, lora_strengths) - setattr(submodule, "lora", lora) - #print(f"Added LoRA to {name} with {len(lora_diffs)} diffs and strengths {lora_strengths}") - - # Set forward if Linear and has either scale or lora - if isinstance(submodule, nn.Linear): - has_scale = hasattr(submodule, "scale_weight") - has_lora = hasattr(submodule, "lora") - if not hasattr(submodule, "original_forward"): - setattr(submodule, "original_forward", submodule.forward) - if has_scale or has_lora: - setattr(submodule, "forward", lambda input, m=submodule: linear_with_lora_and_scale_forward(m, input)) - setattr(submodule, "step", 0) # Initialize step for LoRA scheduling - -def remove_lora_from_module(module): - unloaded = False - for name, submodule in module.named_modules(): - if hasattr(submodule, "lora"): - if not unloaded: - log.info("Unloading all LoRAs") - unloaded = True - delattr(submodule, "lora") diff --git a/nodes.py b/nodes.py index d0059cd..bdac6e4 100644 --- a/nodes.py +++ b/nodes.py @@ -16,9 +16,10 @@ from .utils import(log, print_memory, apply_lora, clip_encode_image_tiled, fouri add_noise_to_reference_video, optimized_scale, setup_radial_attention, compile_model, dict_to_device, tangential_projection, set_module_tensor_to_device, get_raag_guidance) from .cache_methods.cache_methods import cache_report +from .nodes_model_loading import load_weights, load_weights_gguf from .enhance_a_video.globals import set_enhance_weight, set_num_frames from .taehv import TAEHV - +from contextlib import nullcontext from einops import rearrange from comfy import model_management as mm @@ -796,6 +797,39 @@ class WanVideoAddStandInLatent: updated["standin_input"] = new_entry return (updated,) +class WanVideoAddMTVMotion: + @classmethod + def INPUT_TYPES(s): + return {"required": { + "embeds": ("WANVIDIMAGE_EMBEDS",), + "mtv_crafter_motion": ("MTVCRAFTERMOTION",), + "strength": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 100.0, "step": 0.01, "tooltip": "Strength of the MTV motion"}), + "start_percent": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.01, "tooltip": "Start percent to apply the ref "}), + "end_percent": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.01, "tooltip": "End percent to apply the ref "}), + } + } + + RETURN_TYPES = ("WANVIDIMAGE_EMBEDS",) + RETURN_NAMES = ("image_embeds",) + FUNCTION = "add" + CATEGORY = "WanVideoWrapper" + + def add(self, embeds, mtv_crafter_motion, strength, start_percent, end_percent): + # Prepare the new extra latent entry + new_entry = { + "mtv_motion_tokens": mtv_crafter_motion["mtv_motion_tokens"], + "strength": strength, + "start_percent": start_percent, + "end_percent": end_percent, + "global_mean": mtv_crafter_motion["global_mean"], + "global_std": mtv_crafter_motion["global_std"] + } + + # Return a new dict with updated extra_latents + updated = dict(embeds) + updated["mtv_crafter_motion"] = new_entry + return (updated,) + class WanVideoImageToVideoEncode: @classmethod def INPUT_TYPES(s): @@ -1620,17 +1654,13 @@ class WanVideoSampler: is_5b = transformer.out_dim == 48 vae_upscale_factor = 16 if is_5b else 8 - patch_linear = transformer_options.get("patch_linear", False) - from .nodes_model_loading import load_weights, load_weights_gguf - weights_assigned = False - if not merge_loras and gguf_reader is None: + if transformer.patched_linear and gguf_reader is None: load_weights(patcher.model.diffusion_model, patcher.model["sd"], weight_dtype, dtype, device, block_swap_args=block_swap_args) - weights_assigned = True if gguf_reader is not None: load_weights_gguf(transformer, gguf_reader, patcher.model["sd"], dtype, device, patcher) set_lora_params_gguf(transformer, patcher.patches) - elif len(patcher.patches) != 0 and patch_linear: + elif len(patcher.patches) != 0 and transformer.patched_linear: log.info(f"Using {len(patcher.patches)} LoRA weight patches for WanVideo model") if not merge_loras and fp8_matmul: raise NotImplementedError("FP8 matmul with unmerged LoRAs is not supported") @@ -1998,7 +2028,7 @@ class WanVideoSampler: "start_percent": fantasy_portrait_embeds.get("start_percent", 0.0), "end_percent": fantasy_portrait_embeds.get("end_percent", 1.0), } - + # MiniMax Remover minimax_latents = minimax_mask_latents = None minimax_latents = image_embeds.get("minimax_latents", None) @@ -2057,6 +2087,30 @@ class WanVideoSampler: self.window_tracker = WindowTracker(verbose=context_options["verbose"]) context = get_context_scheduler(context_schedule) + #MTV Crafter + mtv_input = image_embeds.get("mtv_crafter_motion", None) + if mtv_input is not None: + from .MTV.mtv import prepare_motion_embeddings + log.info("Using MTV Crafter embeddings") + mtv_start_percent = mtv_input.get("start_percent", 0.0) + mtv_end_percent = mtv_input.get("end_percent", 1.0) + mtv_strength = mtv_input.get("strength", 1.0) + mtv_motion_tokens = mtv_input.get("mtv_motion_tokens", None) + if not isinstance(mtv_strength, list): + mtv_strength = [mtv_strength] * (steps + 1) + d = transformer.dim // transformer.num_heads + mtv_freqs = torch.cat([ + rope_params(1024, d - 4 * (d // 6)), + rope_params(1024, 2 * (d // 6)), + rope_params(1024, 2 * (d // 6)) + ], + dim=1) + motion_rotary_emb = prepare_motion_embeddings( + latent_video_length if context_options is None else context_frames, + 24, mtv_input["global_mean"], [mtv_input["global_std"]], device=device) + log.info(f"mtv_motion_rotary_emb: {motion_rotary_emb[0].shape}") + mtv_freqs = mtv_freqs.to(device, dtype) + # vid2vid if samples is not None: saved_generator_state = samples.get("generator_state", None) @@ -2162,12 +2216,8 @@ class WanVideoSampler: mm.soft_empty_cache() gc.collect() - #region transformer settings - if transformer_options is not None: - block_swap_args = transformer_options.get("block_swap_args", None) - #blockswap init - if block_swap_args is not None: + if block_swap_args is not None and not transformer.patched_linear: transformer.use_non_blocking = block_swap_args.get("use_non_blocking", False) for name, param in transformer.named_parameters(): if "block" not in name: @@ -2318,10 +2368,12 @@ class WanVideoSampler: #region model pred def predict_with_cfg(z, cfg_scale, positive_embeds, negative_embeds, timestep, idx, image_cond=None, clip_fea=None, control_latents=None, vace_data=None, unianim_data=None, audio_proj=None, control_camera_latents=None, - add_cond=None, cache_state=None, context_window=None, multitalk_audio_embeds=None, fantasy_portrait_input=None, reverse_time=False): + add_cond=None, cache_state=None, context_window=None, multitalk_audio_embeds=None, fantasy_portrait_input=None, reverse_time=False, + mtv_motion_tokens=None): nonlocal transformer z = z.to(dtype) - with torch.autocast(device_type=mm.get_autocast_device(device), dtype=dtype, enabled=("fp8" in model["quantization"])): + autocast_enabled = ("fp8" in model["quantization"] and not transformer.patched_linear) + with torch.autocast(device_type=mm.get_autocast_device(device), dtype=dtype) if autocast_enabled else nullcontext(): if use_cfg_zero_star and (idx <= zero_star_steps) and use_zero_init: return z*0, None @@ -2380,7 +2432,13 @@ class WanVideoSampler: if recammaster is not None: z = torch.cat([z, recam_latents.to(z)], dim=1) - + + if mtv_input is not None: + if ((mtv_start_percent <= current_step_percentage <= mtv_end_percent) or \ + (mtv_end_percent > 0 and idx == 0 and current_step_percentage >= mtv_start_percent)): + mtv_motion_tokens = mtv_motion_tokens.to(z) + mtv_motion_rotary_emb = motion_rotary_emb + use_phantom = False phantom_ref = None if phantom_latents is not None: @@ -2483,7 +2541,11 @@ class WanVideoSampler: "standin_input": standin_input, "fantasy_portrait_input": fantasy_portrait_input, "phantom_ref": phantom_ref, - "reverse_time": reverse_time + "reverse_time": reverse_time, + "mtv_motion_tokens": mtv_motion_tokens if mtv_input is not None else None, + "mtv_motion_rotary_emb": mtv_motion_rotary_emb if mtv_input is not None else None, + "mtv_strength": mtv_strength[idx] if mtv_input is not None else 1.0, + "mtv_freqs": mtv_freqs if mtv_input is not None else None, } batch_size = 1 @@ -2994,7 +3056,17 @@ class WanVideoSampler: "start_percent": unianimate_poses["start_percent"], "end_percent": unianimate_poses["end_percent"] } - + + partial_mtv_motion_tokens = None + if mtv_input is not None: + start_token_index = c[0] * 24 + end_token_index = (c[-1] + 1) * 24 + partial_mtv_motion_tokens = mtv_motion_tokens[:, start_token_index:end_token_index, :] + print("mtv_motion_tokens", mtv_motion_tokens.shape) + if context_options["verbose"]: + log.info(f"context window: {c}") + log.info(f"motion_token_indices: {start_token_index}-{end_token_index}") + partial_add_cond = None if add_cond is not None: partial_add_cond = add_cond[:, :, c].to(device, dtype) @@ -3011,7 +3083,8 @@ class WanVideoSampler: cfg[idx], positive, text_embeds["negative_prompt_embeds"], partial_timestep, idx, partial_img_emb, clip_fea, partial_control_latents, partial_vace_context, partial_unianim_data,partial_audio_proj, - partial_control_camera_latents, partial_add_cond, current_teacache, context_window=c, fantasy_portrait_input=partial_fantasy_portrait_input) + partial_control_camera_latents, partial_add_cond, current_teacache, context_window=c, fantasy_portrait_input=partial_fantasy_portrait_input, + mtv_motion_tokens=partial_mtv_motion_tokens) if cache_args is not None: self.window_tracker.cache_states[window_id] = new_teacache @@ -3282,7 +3355,7 @@ class WanVideoSampler: text_embeds["prompt_embeds"], text_embeds["negative_prompt_embeds"], timestep, idx, image_cond, clip_fea, control_latents, vace_data, unianim_data, audio_proj, control_camera_latents, add_cond, - cache_state=self.cache_state, fantasy_portrait_input=fantasy_portrait_input) + cache_state=self.cache_state, fantasy_portrait_input=fantasy_portrait_input, mtv_motion_tokens=mtv_motion_tokens) if bidirectional_sampling: noise_pred_flipped, self.cache_state = predict_with_cfg( latent_model_input_flipped, @@ -3290,7 +3363,7 @@ class WanVideoSampler: text_embeds["prompt_embeds"], text_embeds["negative_prompt_embeds"], timestep, idx, image_cond, clip_fea, control_latents, vace_data, unianim_data, audio_proj, control_camera_latents, add_cond, - cache_state=self.cache_state, fantasy_portrait_input=fantasy_portrait_input, reverse_time=True) + cache_state=self.cache_state, fantasy_portrait_input=fantasy_portrait_input, mtv_motion_tokens=mtv_motion_tokens,reverse_time=True) if latent_shift_loop: #reverse latent shift @@ -3616,7 +3689,8 @@ NODE_CLASS_MAPPINGS = { "WanVideoLatentReScale": WanVideoLatentReScale, "WanVideoScheduler": WanVideoScheduler, "WanVideoAddStandInLatent": WanVideoAddStandInLatent, - "WanVideoAddControlEmbeds": WanVideoAddControlEmbeds + "WanVideoAddControlEmbeds": WanVideoAddControlEmbeds, + "WanVideoAddMTVMotion": WanVideoAddMTVMotion, } NODE_DISPLAY_NAME_MAPPINGS = { "WanVideoSampler": "WanVideo Sampler", @@ -3649,5 +3723,6 @@ NODE_DISPLAY_NAME_MAPPINGS = { "WanVideoAddExtraLatent": "WanVideo Add Extra Latent", "WanVideoLatentReScale": "WanVideo Latent ReScale", "WanVideoAddStandInLatent": "WanVideo Add StandIn Latent", - "WanVideoAddControlEmbeds": "WanVideo Add Control Embeds" + "WanVideoAddControlEmbeds": "WanVideo Add Control Embeds", + "WanVideoAddMTVMotion": "WanVideo MTV Crafter Motion" } diff --git a/nodes_model_loading.py b/nodes_model_loading.py index c1aa61f..d206413 100644 --- a/nodes_model_loading.py +++ b/nodes_model_loading.py @@ -701,15 +701,10 @@ class WanVideoSetLoRAs: del lora_sd - if 'transformer_options' not in patcher.model_options: - patcher.model_options['transformer_options'] = {} - - patcher.model_options['transformer_options']["patch_linear"] = True - return (patcher,) def load_weights(transformer, sd, weight_dtype, base_dtype, transformer_load_device, block_swap_args=None): - params_to_keep = {"norm", "bias", "time_in", "patch_embedding", "time_", "img_emb", "modulation", "text_embedding", "adapter", "add", "ref_conv", "audio_proj"} + params_to_keep = {"time_in", "patch_embedding", "time_", "modulation", "text_embedding", "adapter", "add", "ref_conv", "audio_proj"} log.info("Using accelerate to load and assign model weights to device...") param_count = sum(1 for _ in transformer.named_parameters()) @@ -736,7 +731,7 @@ def load_weights(transformer, sd, weight_dtype, base_dtype, transformer_load_dev continue dtype_to_use = base_dtype if any(keyword in name for keyword in params_to_keep) else weight_dtype dtype_to_use = weight_dtype if sd[name.replace("_orig_mod.", "")].dtype == weight_dtype else dtype_to_use - if "modulation" in name or "norm" in name or "bias" in name: + if "modulation" in name or "norm" in name or "bias" in name or "img_emb" in name: dtype_to_use = base_dtype if "patch_embedding" in name: dtype_to_use = torch.float32 @@ -1143,7 +1138,8 @@ class WanVideoModelLoader: "inject_sample_info": True if "fps_embedding.weight" in sd else False, "add_ref_conv": True if "ref_conv.weight" in sd else False, "in_dim_ref_conv": sd["ref_conv.weight"].shape[1] if "ref_conv.weight" in sd else None, - "add_control_adapter": True if "control_adapter.conv.weight" in sd else False + "add_control_adapter": True if "control_adapter.conv.weight" in sd else False, + "use_motion_attn": True if "blocks.0.motion_attn.k.weight" in sd else False } with init_empty_weights(): @@ -1238,7 +1234,7 @@ class WanVideoModelLoader: if "fp8" in quantization: for k, v in sd.items(): if k.endswith(".scale_weight"): - scale_weights[k] = v + scale_weights[k] = v.to(base_dtype) if "fp8_e4m3fn" in quantization: weight_dtype = torch.float8_e4m3fn @@ -1250,7 +1246,6 @@ class WanVideoModelLoader: params_to_keep = {"norm", "bias", "time_in", "patch_embedding", "time_", "img_emb", "modulation", "text_embedding", "adapter", "add", "ref_conv"} control_lora = False - patch_linear = (True if "scaled" in quantization or (lora is not None and not merge_loras) else False) if not merge_loras and control_lora: log.warning("Control-LoRA patching is only supported with merge_loras=True") @@ -1259,7 +1254,7 @@ class WanVideoModelLoader: patcher, control_lora = add_lora_weights(patcher, lora, base_dtype, merge_loras=merge_loras) if not gguf: - if merge_loras and not patch_linear: + if merge_loras and lora is not None: if not lora_low_mem_load: load_weights(transformer, sd, weight_dtype, base_dtype, transformer_load_device) @@ -1274,9 +1269,11 @@ class WanVideoModelLoader: if not control_lora: scale_weights.clear() patcher.patches.clear() + transformer.patched_linear = False else: from .custom_linear import _replace_linear transformer = _replace_linear(transformer, base_dtype, sd, scale_weights=scale_weights) + transformer.patched_linear = True if "fast" in quantization: if lora is not None and not merge_loras: @@ -1330,7 +1327,7 @@ class WanVideoModelLoader: compile_args = compile_args, ) - if merge_loras: + if merge_loras and lora is not None: log.info(f"Moving diffusion model from {patcher.model.diffusion_model.device} to {offload_device}") patcher.model.diffusion_model.to(offload_device) gc.collect() @@ -1354,7 +1351,6 @@ class WanVideoModelLoader: if 'transformer_options' not in patcher.model_options: patcher.model_options['transformer_options'] = {} patcher.model_options["transformer_options"]["block_swap_args"] = block_swap_args - patcher.model_options["transformer_options"]["patch_linear"] = patch_linear patcher.model_options["transformer_options"]["merge_loras"] = merge_loras for model in mm.current_loaded_models: diff --git a/wanvideo/modules/attention.py b/wanvideo/modules/attention.py index 1030a30..b923419 100644 --- a/wanvideo/modules/attention.py +++ b/wanvideo/modules/attention.py @@ -189,6 +189,8 @@ def attention( version=fa_version, ) elif attention_mode == 'sdpa': + if not (q.dtype == k.dtype == v.dtype): + return torch.nn.functional.scaled_dot_product_attention(q.transpose(1, 2), k.transpose(1, 2).to(q.dtype), v.transpose(1, 2).to(q.dtype)).transpose(1, 2).contiguous() return torch.nn.functional.scaled_dot_product_attention(q.transpose(1, 2), k.transpose(1, 2), v.transpose(1, 2)).transpose(1, 2).contiguous() elif attention_mode == 'sageattn_3': return sageattn_blackwell( diff --git a/wanvideo/modules/model.py b/wanvideo/modules/model.py index 1ceb681..07ea579 100644 --- a/wanvideo/modules/model.py +++ b/wanvideo/modules/model.py @@ -28,6 +28,9 @@ from ...cache_methods.cache_methods import TeaCacheState, MagCacheState, EasyCac from ...multitalk.multitalk import get_attn_map_with_target from ...echoshot.echoshot import rope_apply_z, rope_apply_c, rope_apply_echoshot +from ...MTV.mtv import apply_rotary_emb + + __all__ = ['WanModel'] from comfy import model_management as mm @@ -657,6 +660,31 @@ class WanI2VCrossAttention(WanSelfAttention): return self.o(x) +class MTVCrafterMotionAttention(WanSelfAttention): + + def forward(self, x, mo, pe, grid_sizes, freqs): + r""" + Args: + x(Tensor): Shape [B, L1, C] + mo: Motion tokens + pe: 4D RoPE + """ + b, n, d = x.size(0), self.num_heads, self.head_dim + + # compute query, key, value + q = self.norm_q(self.q(x)).view(b, -1, n, d) + k = self.norm_k(self.k(mo)).view(b, n, -1, d) + v = self.v(mo).view(b, -1, n, d) + + # compute attention + x = attention( + q=rope_apply(q, grid_sizes, freqs), + k=apply_rotary_emb(k, pe).transpose(1, 2), + v=v + ) + + return self.o(x.flatten(2)) + WAN_CROSSATTENTION_CLASSES = { 't2v_cross_attn': WanT2VCrossAttention, @@ -678,6 +706,7 @@ class WanAttentionBlock(nn.Module): eps=1e-6, attention_mode='sdpa', rope_func="comfy", + use_motion_attn=False ): super().__init__() self.dim = out_features @@ -694,15 +723,19 @@ class WanAttentionBlock(nn.Module): self.dense_attention_mode = "sageattn" self.kv_cache = None + self.use_motion_attn = use_motion_attn # layers self.norm1 = WanLayerNorm(out_features, eps) - self.self_attn = WanSelfAttention(in_features, out_features, num_heads, qk_norm, - eps, self.attention_mode) + self.self_attn = WanSelfAttention(in_features, out_features, num_heads, qk_norm, eps, self.attention_mode) + + # MTV Crafter motion attn + if self.use_motion_attn: + self.norm4 = WanLayerNorm(out_features, eps, elementwise_affine=True) if cross_attn_norm else nn.Identity() + self.motion_attn = MTVCrafterMotionAttention(in_features, out_features, num_heads, qk_norm, eps, self.attention_mode) + if cross_attn_type != "no_cross_attn": - self.norm3 = WanLayerNorm( - out_features, eps, - elementwise_affine=True) if cross_attn_norm else nn.Identity() + self.norm3 = WanLayerNorm(out_features, eps, elementwise_affine=True) if cross_attn_norm else nn.Identity() self.cross_attn = WAN_CROSSATTENTION_CLASSES[cross_attn_type](in_features, out_features, num_heads, @@ -779,7 +812,11 @@ class WanAttentionBlock(nn.Module): freqs_ip=None, adapter_proj=None, ip_scale=1.0, - reverse_time=False + reverse_time=False, + mtv_motion_tokens=None, + mtv_motion_rotary_emb=None, + mtv_strength=1.0, + mtv_freqs=None ): r""" Args: @@ -921,7 +958,8 @@ class WanAttentionBlock(nn.Module): x = self.cross_attn_ffn(x, context, grid_sizes, shift_mlp, scale_mlp, gate_mlp, clip_embed, audio_proj, audio_scale, num_latent_frames, nag_params, nag_context, is_uncond, multitalk_audio_embedding, x_ref_attn_map, human_num, inner_t, inner_c, cross_freqs, - adapter_proj=adapter_proj, ip_scale=ip_scale) + adapter_proj=adapter_proj, ip_scale=ip_scale, + mtv_freqs=mtv_freqs, mtv_motion_tokens=mtv_motion_tokens, mtv_motion_rotary_emb=mtv_motion_rotary_emb, mtv_strength=mtv_strength) else: if self.rope_func == "comfy_chunked": y = self.ffn_chunked(x, shift_mlp, scale_mlp) @@ -940,19 +978,24 @@ class WanAttentionBlock(nn.Module): def cross_attn_ffn(self, x, context, grid_sizes, shift_mlp, scale_mlp, gate_mlp, clip_embed, audio_proj, audio_scale, num_latent_frames, nag_params, nag_context, is_uncond, multitalk_audio_embedding, x_ref_attn_map, human_num, - inner_t, inner_c, cross_freqs, adapter_proj, ip_scale): - - x = x + self.cross_attn(self.norm3(x), context, grid_sizes, clip_embed=clip_embed, - audio_proj=audio_proj, audio_scale=audio_scale, - num_latent_frames=num_latent_frames, nag_params=nag_params, nag_context=nag_context, is_uncond=is_uncond, + inner_t, inner_c, cross_freqs, adapter_proj, ip_scale, mtv_freqs, mtv_motion_tokens, mtv_motion_rotary_emb, mtv_strength): + + x = x + self.cross_attn(self.norm3(x), context, grid_sizes, clip_embed=clip_embed, + audio_proj=audio_proj, audio_scale=audio_scale, + num_latent_frames=num_latent_frames, nag_params=nag_params, nag_context=nag_context, is_uncond=is_uncond, rope_func=self.rope_func, inner_t=inner_t, inner_c=inner_c, cross_freqs=cross_freqs, adapter_proj=adapter_proj, ip_scale=ip_scale) - #multitalk + # MultiTalk if multitalk_audio_embedding is not None and not isinstance(self, VaceWanAttentionBlock): x_audio = self.audio_cross_attn(self.norm_x(x), encoder_hidden_states=multitalk_audio_embedding, shape=grid_sizes[0], x_ref_attn_map=x_ref_attn_map, human_num=human_num) x = x + x_audio * audio_scale + # MTV-Crafter Motion Attention + if self.use_motion_attn and mtv_motion_tokens is not None and mtv_motion_rotary_emb is not None: + x_motion = self.motion_attn(self.norm4(x), mtv_motion_tokens, mtv_motion_rotary_emb, grid_sizes, mtv_freqs) + x = x + x_motion * mtv_strength + if self.rope_func == "comfy_chunked": y = self.ffn_chunked(x, shift_mlp, scale_mlp) else: @@ -1154,6 +1197,7 @@ class WanModel(torch.nn.Module): in_dim_ref_conv=16, add_control_adapter=False, in_dim_control_adapter=24, + use_motion_attn=False ): r""" Initialize the diffusion model backbone. @@ -1215,6 +1259,7 @@ class WanModel(torch.nn.Module): self.offload_device = offload_device self.vace_layers = vace_layers self.device = main_device + self.patched_linear = False self.blocks_to_swap = -1 self.offload_txt_emb = False @@ -1312,9 +1357,12 @@ class WanModel(torch.nn.Module): self.blocks = nn.ModuleList([ WanAttentionBlock(cross_attn_type, self.in_features, self.out_features, ffn_dim, ffn2_dim, num_heads, qk_norm, cross_attn_norm, eps, - attention_mode=self.attention_mode, rope_func=self.rope_func) - for _ in range(num_layers) + attention_mode=self.attention_mode, rope_func=self.rope_func, use_motion_attn=(i % 4 == 0 and use_motion_attn)) + for i in range(num_layers) ]) + #MTV Crafter + if use_motion_attn: + self.pad_motion_tokens = torch.zeros(1, 1, 2048) # head self.head = Head(dim, out_dim, patch_size, eps) @@ -1543,7 +1591,12 @@ class WanModel(torch.nn.Module): standin_input=None, fantasy_portrait_input=None, phantom_ref=None, - reverse_time=False + reverse_time=False, + mtv_motion_tokens=None, + mtv_motion_rotary_emb=None, + mtv_freqs=None, + mtv_strength=1.0, + ): r""" Forward pass through the diffusion model @@ -1569,6 +1622,11 @@ class WanModel(torch.nn.Module): # Stand-In only used on first positive pass, then cached in kv_cache if is_uncond or current_step > 0: standin_input = None + + # MTV Crafter motion projection + if mtv_motion_tokens is not None: + bs, motion_seq_len = mtv_motion_tokens.shape[0], mtv_motion_tokens.shape[1] + mtv_motion_tokens = torch.cat([mtv_motion_tokens, self.pad_motion_tokens.to(mtv_motion_tokens).expand(bs, motion_seq_len, -1)], dim=-1) # Fantasy Portrait adapter_proj = ip_scale = None @@ -2010,7 +2068,11 @@ class WanModel(torch.nn.Module): e_ip=e0_ip if x_ip is not None else None, adapter_proj=adapter_proj, ip_scale=ip_scale, - reverse_time=reverse_time + reverse_time=reverse_time, + mtv_motion_tokens=mtv_motion_tokens, + mtv_motion_rotary_emb=mtv_motion_rotary_emb, + mtv_strength=mtv_strength, + mtv_freqs=mtv_freqs ) if vace_data is not None: From 0b1fa14adec48f84adf565dc5616c3a9c7ef95c2 Mon Sep 17 00:00:00 2001 From: kijai <40791699+kijai@users.noreply.github.com> Date: Mon, 18 Aug 2025 23:11:17 +0300 Subject: [PATCH 11/23] Update nodes.py --- nodes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes.py b/nodes.py index bdac6e4..8699795 100644 --- a/nodes.py +++ b/nodes.py @@ -2089,6 +2089,7 @@ class WanVideoSampler: #MTV Crafter mtv_input = image_embeds.get("mtv_crafter_motion", None) + mtv_motion_tokens = None if mtv_input is not None: from .MTV.mtv import prepare_motion_embeddings log.info("Using MTV Crafter embeddings") @@ -3062,7 +3063,6 @@ class WanVideoSampler: start_token_index = c[0] * 24 end_token_index = (c[-1] + 1) * 24 partial_mtv_motion_tokens = mtv_motion_tokens[:, start_token_index:end_token_index, :] - print("mtv_motion_tokens", mtv_motion_tokens.shape) if context_options["verbose"]: log.info(f"context window: {c}") log.info(f"motion_token_indices: {start_token_index}-{end_token_index}") From f182b976f803f82d323276d2a1ab4337eedf9298 Mon Sep 17 00:00:00 2001 From: kijai <40791699+kijai@users.noreply.github.com> Date: Tue, 19 Aug 2025 00:36:13 +0300 Subject: [PATCH 12/23] update --- .../MTV_crafter_example_pose.mp4 | Bin 0 -> 318276 bytes nodes_model_loading.py | 52 ++++++++++++++---- 2 files changed, 41 insertions(+), 11 deletions(-) create mode 100644 example_workflows/example_inputs/MTV_crafter_example_pose.mp4 diff --git a/example_workflows/example_inputs/MTV_crafter_example_pose.mp4 b/example_workflows/example_inputs/MTV_crafter_example_pose.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..9776fc1a9a0d7bd4ec762e6357433b9f9750a1ee GIT binary patch literal 318276 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

^<8H|&aG}a1i!mB? zc>7r{8Zo_hB{rst_vnJD3FSYyItO?J-V9J3rJ-!0P>`v=CD_D%P*0rJ1QwKoOV))4 zoKJB)wp=*X^4<{idGHZV{)d`KmidVqH1BelaM4p0cj0ixM2I%2HQW)BX=zNwde75) zkEWpe6?*#r z<*`xhzKo}RT|H^9w#plvzOuwjw%~{)iv-)gTKdVV!xUsg&CUNB;7&?aOV-Z934b7G zk>nAr76H@L^F2^-E|)NBs_{gcmV-H`%v4wYCf;Tp-M=lh@P!GkC(K(__VkJ0|8#Zk zSuIq8TWAd_lT>l0ss-24m{kwhr54aqFgEj!-v2D|;MF_R<6eFV_P4E9ydwyTGlU!) z=uoT{xZOC3%sIjeLxB4NfZhj|BJ9mWrH^Y}cfGo>od^{=+n3{aEK zX^mUM#~Q~Z$)cF2i74kvC3aDvw%bZE8aCUdC?^k~9N$pfa^4Ph>>Ng{thl}D+rpa{ z)PvUchyGOim+bO{UC9p8`U;ltGFkU;YBz<;K_GoMS9`XlAc(Ety>^wa1;IfJ}T6?lPjltPuJG$&5ay?8>F) zUyC(xNumeeMvyUdze+pB3F|gBDZ784@lg;TIuIqLe~5r5vB;c+aXubn)~*f~)0 zesI-eJmIsQ(u{A{BMDRkg0G!%0IothK~F_FT!^M3N-dk9{C(U;dLHfX0;U^E-n^F`ZQi@O`9@udbvSt~*(#I5Q9Hh))o{r6O zIYH@Gb*cD~HKa_W4{%~+F6)djqgO5r1U+Z0`?T`7V42|_ zmBX9`VqyO1#S)qShcX+cJCSTrc#AmprZeZ zM=Z)P(SR^t2)=$|V40RtXhU@Uq~$R~9;YeYt{U!}?zXiTaM`48DM zYI52#kcc2;l9+@g>OqEh=1}@X8%`n_?LW&?UhXIWIWQt(laX@^uR2+D*Rrk?)0a>I zw_c_6&z6=OTCv;W^6rH&aFnE?AHjNX|%n(#Assv9;W~6D^xG z1oW{B2l%VbpJ)fkR;$*m0j)QFm&9FRSIJRMdA-LM0K3gtq!xQpw*bp>b!?#lZ<2gX z&m@E_RZvumaPlC7V86}27>t){L!d2!&`O3By5@pBsR2HRq-O%dVg9JQA(^i2uQYL!(^hr1j=zFz)1j>J zr3*en_C=jrPXQKOTugB|s2;oG@Oh6h8JT&~r9u*M+UIQRt4r{0mmHf9F~YHzm*gpL z+wu?((CT!yGUX)G2*P$H2M3V8{&<1qxC+3Xe(R<@0Y2Cvul0_ZYiXbsa{4FpZqyl3 zcOBtRR0ukC`@z=FFCN-BXMxX_hC?@SN?8WnxcKwJUuX^INE#N~IHT$IW-fxJY^T_5 zV~>zk1rkt4wtlV6j}Y+L6D#T=zXa`R_9B}q=$}YVV7F59oJ%M;*zh%TzSMXt7Z6_3 zW->RCKg;x?P~@gQYE5i-xR1B2>Q6J9Qix22`4UoD_*6p z->ZFTS2ic)F&2Aq&{=HTaj}7OGt?2Nh@C^ET}^UGoNouwxxa5qa+}o*p$mzM)cAah!Hu=i-HpN-SpD}mb zfyuHo1CObxjoRUVg_&L_a7PF@fSwTUKOv`t9_I!3nIC=$})_~Q75$UeU|O00vi?m=T-u}pl>MFdCU^3v&M zKElHGJprxyrvI4Tb-9sXcya=DOW>+NJ1idvx_9@AYA80!Zz)zd=N$;sHLJevM-!Rl z5V}wP@0Fw+rx0#%^haO(ZOmQY*6xj-Cc9ewFBAg1EY5GwpP!h$#*xuhEVGnLq!$Dd z8WA1`>cLAriJF#sZ;m2+g)|G?<#}WpMJ;9lSP>Nie`&}*vtf-GQRWE4wzinq73^`7 z@DeyvMJHxvqtDdIw^Wy6mWpXS5j?H#w+U`Bde-58+Z^>>_bTg0 zY3d+u+(wy~WOq%Rd4vZ!>_ZG=3Mr8j`r1xNBeTB$>>WHM*JMCj6W|6v^U zv^>~P#}rlub4#Y>l{5K|t^yGfGKYGsnPGfE9YCsHajYuuyD1K z^(}$fi1_S?E0xD;Sl;5J8wn9#sRGGF8+F4X@H$B{OB~?v3!Sc5&ZaeVL*+LS8B>S| zoIL)%gvDlShNg>$e=Bh4VcVywzAOoq{%=h9CH_}S4?!pTt#(U~9NRgiOJ+-ySI&*{ zSIO+n^OdRpBci^#OZy70nSxyu@s|q<_II@DXb<<>dCihAuq@H2Pxdm`JJ`-?@ihKZ zPb@#;GwW@t-)2q()YSN62r6%6;pb!vb>0Kwx#T3&oQ>Xll|JvQk>N(E@XS(oak*3A z%yqpy5BrTMZ8;?;r)IFe$1RCC+vQfxi#^M^>mm`A4w({NeJDu@tC%ir$dhs#tQdYO zQ>eIXAbHZ>w;=T7Yf48f7a_R{=-A05Ck}IVHEl@tZ?0#K?t377A)x+r*#+ycVfCbf z@_}*!!dO2yUfgTTB(8Vh0ckVi8=X)}f1b_2=EwJsrplIAg?S8WNY0Sxr1EPuv$g&o z#gMLLv2;MreO)|HtgIpr-Qb|^d?q42w431$teVO(&YoUWPZK)$&M(bSj!CbvMlY(< zMa)QDHa&c>7vfF>%*Hg~1s;T726HId8wp%Rj&C~IOM+q49QXd=l^aAx(sc5MvZ4$| zYj=zlcOCYew_6x@FG{08mkPE0P6=`&?A?Xmk%1@BUC>@WyG8g2#`t^EfvOIT3||TL zMRtOql6M-3CMr^YD@>TK=Da%GPp~yRgRBj%TTSO(b-Fm5UAYg^E&OLNT5W?~#C@Ci z1`jT?1GXg{-xDb4Ar)tb%2!>w69;s%?<(fHPZuWoMJI|kXbFNU987%Y7NnjW@|@}Y z?WVv*H1}c6jGf7zmhDH80)!(K)|&TeOGs@P|(R?sCKh>O^_(Pe?re z(Z>@h5*F&h#BF7T0rr$j6f*`@M>r1}=bK%W0mo$2(NA}TLHnw%>0ZN=yJ2P=QP_AF zy$Cf$d4Bjyp)A6i)a#pHM4)MYPN2MM2+8gMhs#VBxO#7&?I+F(dhuoQOWx3JF){Of z{c{QhWm0H4V617Xv-1L6y3yszRr(YO%XEa4@f3xC&p=^<$3fEi@arZgQ)d^K=}u(m zO5qu&znW~$wV0~JSIgR=cX?jVVfsMX_2$cKuN$YB>ktWQ^roBU$_%e9eR{Wq)g@kN znn%HD^n-deI19AL+$oI+&g{6XWOpSu#Pot#ZSvQ%LMFPm#K)RV6H-N5YmGBh46D|S z%om8Y+Y4RX_P#rxTpR@i$ZYlwkNkuJgVkZ?yu(h)E%w*i#*E0|0|cqPfiHljvpUp64DiH$sfLc=rqv zVU<@3ngN|zfQhVPVCBxz&+=69Dq3ZbQ z4dlNon?1|dhi9LQ*Jf|Tooq-M@pq7_+Q7pvj|JLohD|KqP5yf>;owC#-l< zN$}KT@HW0KMHcI@%yk+cUN5=hH4#u4e^pPfF^DR0+qwcVElMbQ`ARccPdmE(Cc&XA z44MquVW^hPPH|J}fbC;i1 z2!)8ob#R1T(_1$ZG|3DjJu?CuKv|In#^n zs~pJrW1|DJ>6h8N0rS|WDw1Ezj4etmGLhak`YGDEvXATOdv{tl0%!Tnl}<$#%LXxX zv?G)`k%Dsd^boSVDdiY5<$KlEj0Ns2;0w3hF_T%3o=lP3`)ak~9et1!2UTAlJ*&=0 z=uzqtF!5nZD)z-0AWc|}=Z&8P{GZ!kYy!wCAoC&Z6oij9)B3_OV*2e-ZpMgE@%T(DyE z7}oZaH!~JV_#~kI5d7mV^@WQ__UPtYbpI9dM?kO;Ta!Rw^^NHh#1Mr!AgH>`^oBr? zTcfVwJUd5kBF(P2U{l}@Q8&-P++-?us=Fc9y!tmEcFB1}ktpfAR4VNzA=4O`%-sdj|JRxd!`3Z>{ z;Mx5M4{;NN2~}x;XDTuYY8pd(Br@%VpWwn6?|Z8~_R(?i;jT(Vss1=y}@s0qCgdazb z|C4Xg&}%jYb7?J^2nN0Fi!x!H<1F^<<<%*-)0B2{%K0=#HJ9GfhzN?12)@Iv{E#f> zFp9xR4?fc5%3TY{-nH9y)8QiQP$BH0>-qRoAV174CM#ns+773=gdg<#W}(ZrO(G9( z#j8Q=)RY+CMDP14Kq9#g&B8;x#R(A=fNFwIuHAsWYr^suAzwP{WXFgpEyNIWdm!>l z(Vv9pe=jGzE?lD~7!jh{b-`S_^h-jT&RT1W00mBWghM`f3NWJOL&-)PDhpFv5mZiM&2 zC)W41E7#|V*IpS$6J6{WotJB$tQatd@D9VOlDe9%ZGrD4SOpd%9aw->2HlXb9gG9L zJbekh*jUG&2cZbK*3dM|!EK7Td5|nXH$$@2=$nTR;>kRRWBDqPLbVPiqD^0=e|JjW z2xB~#b7}%q*YlU9Zz%?VvUiGbm0{|mnrAQfE&k#wB+v)lwYOO^gYz|f8;v`Y!9|>Z zkSYB-g)eZg$0ZXy9C_~OU;TEwTFCbpmARqij z0;uK)ZXx4iB|f-Vc3#EVGTwPjTB;-s(SYyoQy_^9`E4O^{#5T>#QgWRyL9Yx#cta) zo>hh)8AiL@ja+uT@8xqGHuy(h0D7T$hE`@2QsI&H0^7{bPkEN%UJ}|%?jjQdxaLfr zFV~)OA09et%a@joy~k4C%SlyBhD=XvNuKC8Ig>Q%D2&R{D@M+iISbnzjo<8ZCPNN= z-A%)9+q(gr;h6GI$mL=GVokwK{PX=wx{M^jGmfL zz8`p`)$KHzGl@w`@bFRD(7okZ6$+QnX2Zk6jm(v{f zp~JOzuK?r9xnimb&@3Z~cR59dk{cv$UX^Fesz)OoKXH@RTY#;&U{_*%h@ZTqJ9IA+ zQU2k>C{7_zn2X>95bbD})dpD&99QvQ3wUY&w%y-PE>w^+&?0(i)MNx$e^2yu1E&Lq zfi<934n(5Hc_%d#(!Mmz;FJJyDz2({oK{m)Eq$6t+quQkp4-X_O3*16o#SoD$`R2< zu9xbKK_3X&vQLZ0Pm4U^wOz~}rB^LqN$V>5D@il@1x7LU6P$TA6qIm4fzKvn|KYXF z?wQi_Nwc)zJH7;JQ6lGs97 zA)DkC?Tn-&_6jpkh4nUIhym7JC$?ydT}Z~%C`rFcGg@#(_qy&RPx@S{N(e&}_rp_b zPeX-lNYpo1a8jp3qNy@t10vyh*T=WQb5tjxpZCQY@pU~g>Y*6GCse$Cn<-;BSP6b9 z_-NO|7YdLuXWB>nx;wPk0G5LYn2a|WR5N(HQV^T^o$O-!JT;VLeh9 zD?i?GX9q(YIu5Z=GHz&YA5L;EM(9c)lz!Cg0hIs>kN+b+EZt?j#d-Mv03wJ%n=whK zL2Q{!2v7ftjR~Bq47!Zh90SeVXgm`)f7n?P?1eB+IVlwDL0wmWa?gUzf1hI_vD9Ae z2#8(1(BTJLi3#;p&WGTmIY4JN$W7hEkfse1g72v2jaRV4x17ZQ66?X~Kb^(W}hrgR7te)R} zH@gT__?b%o1RXnkfirgHmPmz)oER^A>gH6z;EJC=VNIx@Si3S;+PN+^;(*2;AGIW zeWC|BqW?h)h3|Ei)4Gn0h=RM18R(T!f-66GVq3K;TieMCYXP3gCikP!Fgf3)rNpEa za6YNCj1@W4?y@uVWCbsl9cC1N58=D(9as-h_LC?M+A^iwNR4{q`e5#7H^|OKI2g@1 zq3z-eLV;Lo9w0M)G$%MAP|kZ+YVWpaQfd8d;iX6(^7gO26_#HSvl(Om7CaY&rxdm| zPk>Tofl{cVB!v~xl>N{O&*|{3<}F>z8}SnxLB5D|rP1P>-~sJ(*;zh^7-|o~BaVtz zQOAM)XYcl!DJ%5H%KmIURQG z2D|?d*$^&>gur^gn6F;n z%XO6QC%0HEm+-@Q(mGrtjCY&RsnBB@(_jW>?&~AaZK#3TNHN3uo32{Urm}ee+EHWrM*;l93_w`E^2!MYyRtsjj$Ur%t4D}!&IE$e@du) zZyG=ax{6mY!VpA$R(H{3n9b@|4&ItN;sCiJ_@sUi<4@iHr0}1Nb;up)fiDo^wUt8) zpMfp#E;&N&sM6+AQMGNH3bW7A9hCrgA$_v_mNsN-ca(k^Lt$7gQiG&%L0{bd3Gy-|5lr)tqnIRIir`q8>IrK)!Ky(`i%kqH(HHAD*evqxxk?WzsVJ_z5Wur}uoKtc`BbsA=9I9h4b|?TbqRbnni+!Ogiq>)e=NFdc3B)t&q&_vh$B zS`gU!DWYhaQUAj4%z=R3d;qu>k%`CS2w-SC`{Zb1(s*;w=mVCA(hUdew$$Uovkz^= zpYBr-a}OOZ_0o=%*hCnncc2+fl_f2wQ1SFe#nb6mK zbTyD2LiJh>^SaoNp%c)R&x43T<7$^GzbUkaKZ@0JMlXrQ=@AIjQJWfEp+F74)`Q1l zp6%WDp7yrG(dpf>*I(Aqye^+lWiR;P}iA;wp~TY_?r{Z63s<#c7#@YX7J9b4&OeYk84d=`nP93fvOBN_Yw zM~5|40>xGiM^!vA#p=@tBXT+qEp4fNdkx+e7yzomVmSQ-F?J1CLsihrf|NR_!TH(5 z9~$3aphMND_4@1Nn|KfWwk!tnztc%+-2s_*8)vV4gL<|0J{0FxCjsx5(L%~(@80$o zT8I&b7B6HSSDT7_R3A_1T#<r*3levd%?Rj!~3@ z=0e2F(^pB}HZ8VeUhyuaWH9i_4!AK&U@EU3W{g(7&5eot1QDD|)IVlg`p;mGcRri$ z(P`GzFz(RGlSw*%VHQk2kM@M$tU`gJ4ldre2hv@~yEzKcj~C4VXT_r-*g_b?0emvo z;vl(uv=xDl4nXC7X%9Qz(=F|<2oP^<7YM^B^wr4?Br^dse|A}YV)8`qBcb}bvO*gN zOV5&9zMcKc{Y(3-A5viN_)S9qmDAI<2THIH{wVB))AJU6a&8;@k)UM~35$EM{@S#J zTs>KLtB1}El#Tj3k<2O3!uWy=BaP+JzGkhCe6v`mV( zNe(6_uvVL|QH}kgcSedgJV64yiEi{}wIk=NT_%N*uq|!2_bmSw4*K|dnY$@Dts#S_ z+^3Hq>fGZMO%cD~s!wn8Y+|eM!-Nw`DPDs7@8gc!>X06!^O49z6baFGLnZw{baS5> zJfoTcL1s0FU$bOeG=#Di&g2llXx;x9dv}+Ua1U#Y;q>7xYO`{dC$n~R?N}6~QHEU& zS~XiN5x+j7KDbxNY)PeclFm8y**xc(VBJ!T#Sp+Q%B zM7jGdDHU5MSpuyMfJWR%g6LWdRuD|*`l1|2SPsrVs=kfX&Ci2Krx;V_(bs zsRC6xnv+l+{hla=n>*DlC-BLc#jD)Q%~V-tPpngzQuoRup4=FJ!hfRrfiQ;^3CykQ}=~U_PRth`KWjKlZJ0Ab@fJ# zNAi}QN7L7Spo7#Rwh%6a*ig7kw<*0v% zT4&mMc}P#ctu4=Ikf)8aEg65p-Q)g|sbTQuT=j@v;ynjPjhQX8JQXPINM+v&?|Bsi z^oJOjPmyraHqqO^1&kAk|3`K^jJTOZt%=z!-X{-xlhuyBmpc^|54b~ND}YjaZzjU+ z8VxszcLqaKtlCQI*R8CpX(r~{R3+X@6=9#{yniNsCD&>a7&~}h<3zUi!8z7rOP={$ zx4i<{mTbT>w|l1-QONNJFjg(wM(-P~A0?v(kLD*;$Z~^?`}5hMD;@tAkqAS>T1(oL zGlQL#OgI{t3TI6E?0%oYU=#AeZcYkD+hO&)_hPo!CCp;n(^J4{_(k?H#*CLD`4f;z z_4kcbi=j96;J;8;P4r5ufs#{UD#G%S52)!k)IcEN)Z5HITWcdZNlaTE*+yo$nMm3LSE8-I1d+s$mvyt;Viv9Hyka=D{LaNn>6&`f}Xo+2c${y9=T&h#bbA>cofs=S?mJp6&jG}5nz2Z%Q( zG4pN{#Ru`DzckN<)^PHLGxT$rz%6wxPtmBkT~jNUJ>p9RJs*;1Vm=n+*@sRb*oS~g zh)q1~?&wUd<|HvLlx zP0vGbSZbiP={zT+t1GltP&T}j+MXUJD!oj;+aH!r`K-%sL@;MuOEy-IQ~MB}hPtZ> z=1@1zCMI%{WB|xZg^|t15PqZCDV}xA&Pmr4%CsUDC$wU=%p~t~ysWUl+J-EfDJjAr zyvJxbQ9yEp*s4VGm4~I()!Cl4-9m-83$jT33Z9;1NLBP4Etqj*NT2J+5&=%@_V#&F z+%Vy9&G25hi59Kwpty#odJOnuN=$>P*zB1Rqfl=;0usW}Qgq>utb*C9NSjCz;h1ff zO2pydhiUP~*G4oxZI~x!89*%&XZL^BfuiGy{JSO0kzv0B{fmGb$&Ykt5O-iV>2daN z|L+S2j#n}fYKuh^B^Jsuvv!7c%;(;fG0Aj@DgFs+8{F}(UG5Br4a=vTH7x2DxxW*bdXixmdMOJ;sK$E_^0>a2awjk42QwUVFLw&t zgs_XQjF!T(ym^kA(Kl1v#bEWCjk6TjN`Ttv>YQ+2C?kPZ5EO@zcsFIImE=eKCf1IOnQ88y2`FsgqV?}A=a>mYSA6}8M+xX_bOJvtAkHkWJx3M#O652nMy zgxZ|N7;5g{!^V4Dh4PhIWC46nChlc374%7-PtgcGhjcLjaQmR7bsZr`O9n=MI9Fs? z2E)}}yDHJvA$)tbHpFXjTXZN#S4gv@|Gr&p`g`lPitix!W1ROUzur^?Tec%tF^ND+ zVI>(Ym)KM-{5siLvEH7wQDT_)7po$4GRPQ@GfY&|SwW{$Ww5uCcKH%#8b&n%tn(f1 zJ;iG*_uKq2P>%0Tq3;KzrC0^0NN?8Av2oIVa^_t0Fq_;7DS z`MplA%6h191$!~}U2D*U!ou+%SI8xEB=>7iE99R5QY(MDmyR7l=Y8_J`2it;GILTn zV9gNi4}COWn-xy{2oJEjXniKT)TOrw07|i$)cd-)fvdJ8Mq$) zxk|nAE&;7G=PBh@xo_Mg?93}XRh~1NhrDZ36RwHz>J?fJFhlq`x=F5?Bu#fzG>Sk( z2j;f%_e^rM;Y$ThQ)k(H6~&P(G0tUjXJFMm4QiT5)W9?ZnnNU+>&=bG#so@2srA%d zAxSHEzy3%`HbMd&O{hUgeUV>@v{Td#gSqw#;BuUnT0 zCz4ED+e6McyL@&$n&#-^I~`(iHE|gB069R$zxe>=Avx`}4!AI2m-rdf%(8!WxbYqp ztl9iP%H%cDWUuUidND;{1UZ23YL+~wiiNBeD7*I#SLg#AKF~-?JbaNjgtn>n)PE09 zqKUEhew}1OD8M=cFKUqr+yP&zWNvUq{wlfoAM!ID1k(I{nC!s9ha(}2|5*u0M^-=& zZCvj2>=eJLHUiFW+yak@+Qy?q{kdY0`kS+4T@UkxqCJ5jMjI8GG0EyE`Rj;suF!fB zzT0YwqM(BSm4K^G^9>zTzc<6T+q1afFKD(iaY+8Y=^eIRq_>UXJICcA@1*G2smajR za_Q+pl&6UT*Av$1t`hGeNLw}D@d=#eg9HjJm0=RA~py9`atq<+QM9q2$6CBB5(fCQgo?`Gze4%LcTY=8yyNV zki29%{O#CEXK4!nBsK`_p!mkEU@-_cmIz>x|Gc7jlNfx5J^J^a31G?C$kPL#$fRji zzd~i028TLJCy=t?xAmb(iT}LXF-r#%vuX@hBoQ|8tJAo%I@TyGsvE4I;V>c=Aa1zd zG@y5UBB$f{u_|-3YQG@{)9(V})6%r@ea#+|SGZ!*Nr!sQJaZrM-6c#al2)qix{%*a zqN#@c6$Y4<$`0?s_Z+@wJJH~u1&`TaUL!v^XwQtv_{?D0;(eY#&{G3ZAX41A$~doZ zRT;z+?{Ml(qmUe|oJX>OO*H)bBMn$@cLQ@dLX9v)cJRaxOM^fI!ed_{*peI!`s~1a zxm+2)+|QmyITVDL<8@ZJ?A&vzJghAFsn(j-nOEHo=iXXxbSUT)m9OniPds29-Lhc- zDMDZUC+4?*C$LLXfk5eA8ARwagGw-$(B^Ht`D2z?+il38$Mb`n%-p#lF5vuJsgtt` zBIMxo3A+%TVr8Pf>l5pzlw5^O}b`m_^Y6jC4(`o7XGZUs1^$|viiyJIQLm+ev5DmN)=?MO z`_&?@0;-2Hc-6!7{l^3H^oO-k zImkJo_6T$Ku_d~B4+f{C<{HE}ZYrp0xt~p>YVgqg(2vBUp||PXxtju+D>@9e#oVpm zHm%IshK&VS0u%_g3L~cA)iszDmuFuXTOC!S$XVhkATD)c{@mj)HN|(D`G7ByNNrp9 zztOq;?X)PU&*zElu<+*s@95+6}9i-O=8(fvTuAs7$n!f*H zy?H*(CHWVUmOSD1X+_cRH}mElQ~fs|Y;AsSRLt0eJwu1;2I^ zq)3?ErJ3Dg%T)t{!<&4ve5eXK02cOr=v$XrL)pUtq)`*Hxr8p?g@HlK9MsV!Lb4G} zy@YuGs-X?zG~W&i`o@2WbDy)))ux&9?IczKbQMo??OKs>+&V)gs+NI+Y|YSpIJVIZ z>v@(4eR;!13_UT*ZCw$!hp?51Ga`NPM|`2y4Tr@G2-o*&4v<0F0lrJVWE2_}I+KQr z5IKa|?6scTn|OFLPm3Hpu-nj;Qy&*Y41%)cp-ZjLZlE+9bY?bWRm8}To+0RGY3aGN zbh`vDOM%QkjP+Bhydg?njdxk-8+Q4U6h9;m72c)uvg{qu&K`@u*yPAwsU!m1#n7G3 zv+ggER37xipa9h|_cm93>{;+eA(!=!a?_77fq^woD(~~gq!BtqJ4$8`->y~ARe|l4 zQdeO=s#AeNV+G{-jVu!)D_;Go2C4;pzl}`1CIX5fC#jS1PLw?Ltr8^{*k&OT;O`Ac zq)R4=i>(Pj5o~CL(rjPxfc#+uD^$B4+_r9+m|FP{96^g*b6GAs4mGAdKO> z0lbU%N*^ET44$*J`RZh20lT8*38 zR^X5*TPSOlX_v2~4f}?)Ig+@HzQ#S`FR#FkxR3J+(uWF#-VJR?88HPM47)z$7}Lag zYfJj>&9w5Fy;b@Rz0c48kxhu9BoY2w5pMtlff*&P-jp>@fz~i^9ATZ~V9eJR(9rZK zT(AKhV6G)BMd{}xf?@lw1NGqXFxzJ zAEG97x}OGBHc0}c(4b>$NSz7prO|F!k=2H!jQ~&L_a30z{%UXk^62~ z=*5r+N<;8Huu*e~3#sQt;pIbOL#a8Mg31T*03&4$qN8X#Bf?3m?NO6*9|!8ppu!N&RoGaA+&0uS zmgkC#1^M}XAY~hZ+UuDmy8`YAnx2m6Rfn!O=;3CeQfZp6Ellv?)QSSi(A{!1X8>6q z-9Ca0frEVEmy6uO2#(wR+U%VhJEm_D{3it@1Wf1fZtotNmhFwG!Hr`NB_`MyaWy2< z!6uL}YkGv&Gw-gHMOy`nCxR-uSW-nf{__JH+e&C4!dzOHw?Z^b@BXPQ4}=Sr(I?P= zraGXQM!jMX)C@Jvc&DjSkf|+$PYc!5vyAyJxY<&109z%yCb(EQf~sZ(RX#{Pxt~JP z(EO+FiX|?Z-;}r_H)L84@FPp;dbSDtyyU_H%ear>39h2(QGrh)XVp_v(k2eW6uyqi z)|Gf=0S?m6Z+i6!2fJKEp02BOrs$jiLxhobKH!c@l;oG@z;mL9N`xkxn#>)DpO}7` zFAwYwz7WACOj)N2t&BQ|^R;TCI;*{m6qA#TS*YsAsJ}~Hq1TvgtW&uwkBwCwzg~_?*Of1BX)=i^%(arE~(A4oY%MZz07zb+!1C;>ALoPqzSmO z8sf%dhkm7)miFlm5aSMg6aZd^9B~!kti(!**8ORW`!Hq@^t}EtgKenz*g;?l4K%Vmx91L z9|<)LBUS~nP;Xs2qIW?Bb401Vhpk-ZON=tZqa--lsBF*mlon!kHspWs#8MWkk}}?? zQ{Ag|WY+|BS?l_va2^@DbDss7A4I5_n_#%ctWFgUK@PNrNEcwlv($>%o+lH1Dr?p7 zxGTg5E+0JpVGL5i-a-iK^FEnyvXMh2AfC``N~zvPDwFR&0olS3;>V@#<90LaDOU`D z_l05i;(u=S&TgfY07JhgR$KY@x9Tk_+B5$T# z*V5DY>C$~o>BLu)4^a3B4DxUH0FhST(d*49tgLQG-~Pu%%K*U!dm<}J`_gP`?8~-( zU$}LsrA!sK!%`5E>t{evNB2$fad;;t(u8SOIY^1~`X$Y`x|mi}b=LP0r1Hb0K#-Oi zza_#<2JiO!Q70)YB>M83i03r~P;woJ4cVdDk?`gWZvkH6$|6_JSKCaOvP8)@tLG6u z>4lH;?$(PxABN#icbT}#)P9%?hTK+ za=N#%cGkJghum4!fFGu~=X0zAH}y6!K&o!4&#UczBGFxTvVd5HH0}Wfw4shk;HU#~ z13=6wx7X;muwNW9?Qn+oSs(i9@{cM_qs4kCWR#!){R2!*E=0f){YQf6aW<<+Pc>L1 zd!RHWcWWYPju2LFz?pE+NI(byLqGE5czN$}}7<7K!=9{tW{t8YM>9 zT2eRUJ41#gu68$J_$IJ7NG-vy=22*rTfgpTOwWdpR%@&uVHEAUQ8; zjk1K?t9I=|+0Nf(x*7XiQ~$uW_bUCw!@oSk5h6S+-V8{bsqZxH&kHOt9N9^k2T>qH z>JUB*gnVaY^`NYQLpLVT_tqCr%0Gu5J3MvT7O|3;;mDzF(N7c)q!n2A%%6dP@*^1J zYKiJKQsLYjHlD%wDql#mNjsw0t&^Fr)H-I&DJk)tJdnvEIz8tGjJQG(y6j~IE|K8; zJ~K7TTM&fC*_^SXyBLKXTSiV8yLEYbYmviMmeCqPmYk)janbswyNAlOjnx~uY!?~M zINX=frC}Qv(*7YfJDO_`(%slBnK_p%O$B!(!c!2K*hI^Y^~F>S|CO~_;@xysD+9Ge z1k$lfU7vGi>8y@a?|xQv)jo7i3mYC)Q2WG89+JWwEZr?W@b7++}gAs!F zyvZ$nB@bsKHU(8aGC`~35<=kip};Cc9|5^bFFuis*jR17JDq}-O2?s)cZFRwQ>8As zWgmq4v9P^Ic9D5=c+26?L`}NjE+9>|)XW-6;dep*yw_jqp?_*YnQmq*&$2Dka?M;NSPKMnRR;ylTOl`0q{G+)%d9(R0PsaH)BW5ge zgAUIxpIriGaZAk|kEc%m6SYyq()G%$KPTCCDn~)TO3NlmGxyJhU|dab)u_&Q6-4zD zt(7!`MF)CdVTzBsgY_TjnIH8{-WT0tQ|ubmva z0Gr|9)ql?+mKkk1&?TS=uEFuLs@$PLQ3PF%O}O92<9S6!d6BIZJCb;pv}{Q6_;LR) zkPaDe1#86nIT}e9UaqO>eKK|rm*UfQj7d8TTmuwS`d;0x#ty3NNF5ia=J7VT#(wck3VAe_C)@EOxGnbowp5ZNVc;s3!r zFFem^^chdd4X%Ux@Pa3J$~{71OwH`jNOR0Lm!Qgpu~ z#S8Kg#6c#3mdu5XAx2=dQr6yonu}Wl;E$1xczX8ydCXAr3qjKv-I__a+U9WXd?6V~ z?9$Z6OK8=gLlpqUfl?xPDgPs8z+PdUiBVHSrMH^_5QjM#XOZbQ)qmxntk?)yfCB;v z=jqo$a={-m(tW051x}QkwVIK0Nv;8<(V059l3f&I0*kQAjbOzN!=X9UwAw{&g6m|W zX6~nH*yVv|1lomvVZc^DAX~yUi2ijU)G;7qVe7(iNitw20A`&XO8OtT?{s+a*L{AQ zroxZ`=F{Y@)r5d@bW5WEpYaNtqW2vxn#)PBGg9yGwqR7iS01joz4b{!N0-xvR%vTP z&4kOBms0E8e2i@9Q?}8L(W9P-f22d$mT*wvttYg%?0Q@ody)cK%34Gds&nK_L0vv3#rGhqzZ4 z>x7*_&6x~Iv%87iS{>#_T2*96>QW4GUY89;lsoWpM%GtU1@3BLbhlwTdovAkw8hNKMa|uRHfMf3*$^w1LC(LyXmHdJtbrW(m(sL|pUMUIRi5EH@ zof3$`^f`ZCZsQtU`v9@YNK!~gxxYc?t6qv>iQKt17f+X(LU8#Kc8Zr6;uSuEYuS&V z-)bcEHrk}SkjHC!;SEIrqVdjvn5R(zK+S1sSez=@UlWEyM{z+Ws}~ZNsF;d`oET6K zdkJlkUAKbip34jpMH!w9OOM9|M(#G~AB%0ApoAD(RAVSm!S+HGf&$Y#>ZzOgNB8Jr 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%0DK&Soa3E# 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 kHj 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 z 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 z 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

V|=xa!3w^~N7Vl0MwJL(3hmPYpdb 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

dz@2Ci zqK42=JlL03@EXEdcM5{^LhI)$RcPrOK>)>4^z7SgefO>ExzHyn7m7#UVYZFKy3WJ) zdf6B++1aF+awW->P6VQvH*2MMIQXy-EXQVNO)m+W((Ct&CDE2D)9+%b(DmDY}$Sgs}6-%`F}4k8}8#R?Ov z_WX!sf`5%e^->p0t={$psd*2fxmvyE83}_&PH~uOlUP(s>TmjrY!Mx^Y&KEjtQmB~ zH&8wYZmcTn)b*W*xX=bu1-K_0F|XWq&>%&r3Lp`)!EkUtWC{P1qK9oCei^Ipop+f> zg)P_AnipxC#Xg17&!Jdfd?WBD3~*v%{KpzQ_jxEse6mx zQh@Ww*-}Yk8r$V3heU*<_vYv=+gTu|`n;!yV;HET#1HmzA7Ng4m)vueh%meNk!q^7 zJnt`6;ZzhJ1H%t>n>hgA2eGCJP$r^ViN*-}S8OnW_P9brh=xAFe`>#px$8ETKFW-e z-iyg4TONa)lQS1d8Bo(4)|E~pEGDLkzwjQd&Eh4jmy~&hRJI8Q`?V>~RdC{c7)x4EtRAN|>VxDesz~4w^vO zlCp-VhfqmZ!D14JjqE@=KyG6z>{qi?7B~7C+FpViLz-@yD7^qN|HFK?6>#yA$&jHe zHSfhRjq*!bfu`db1y3{{PB>?SrX&}WrAleR=AuriyCgG;w0gxn@o@6Q({4%S&%d65 z(9#*=7j`t^LtDl0|33(?N4*6eB2H+&F`44?K8_FV%|!bH*-1>(D1bdHR@QwBLJ1ro zpZMK~RhkxR_~5&9*-65xL=GzReuiX@uPVXeRCsKJjDSvJvWSMJ#yuJ@z;8n&Zmz*4 zq{-$5Bx!=K!_{U0WY1SPj&wvFgN@bRtTFANBxAvFzLKmk+lhmZ7=WPacr+xx+W+ad zq&r@o#f3$giEli=+oq0{Qe`aaStqm+j6KT9Xuxt6WCuIcemI(RrZpQ@SpE|ld1`<# zMdTD$(Pe27I__jT0=>x2N2(QZL=o89R5#j^4Htb@*}kD?xB);l{6h8#E}J23y9%sm z>sOdHLxLm~E3yvdavamO)r00#;%$Qlan{XYC% zlDF*{=m)-zD>wnWXM~)+B?w+Yr$6P2- zY9JxW2^6J08Wz14jGZPr<0*a41Z-8LYB_cL5tJghQ0q65{fW>hb+7cthfMdZ>9HHY z701E%CrWo){S_qbNHN*f_ONuq@R%#HWpZU>JVdSvT{P_kp^C+ngBTS*G#zdws9m+) zf8dp2{|%!}&!s7|FGkK7@mltDw&0Z#u6DJ?pef<(9xv>HIdoUp7f$1mnF;XAzw=0_ z=Mcl$iYN##d=<(F;eH-S4b~xCH&P@W6r}*h>P{%NH$N$zZHgJ>BiKQ&R?cVixQT6{vM z?7)u}<kXuow~^iyH=8SS18846vcBC067N ziS6K3y03}J{hoN&IS<;b>%*U8EcGsgz&sULk=}~PnL%fGasn?&vrMv_Ys|o)C5oyC zUIIMgOD!JvX|91vtAA*C9?ly4x_I)G*DyhzGOuD3bn}S#+Y0V~Rv_sYs`ww2uBET7 z30|DWV=J0(hv{VM&mS#UF{<%5ZcwkNemYL1o?$C&{aNG$kT+MJA(+jP;!>0wmEjc} zjh*J(n&<4ehAshZixi+5c9a`9QeypXHO6F@Y=v}=`{7Hy(s8evC*$mEBD3F%s~LXB z9^J=uFocM9SpF*dchh@{#3NLM$IQY)6g?xIse zCzkrwvcYZFhUik^dD78*-i6$=>ZO3Tf&iQ1ZH{I0;X8+ym-*2e@~!qPxEO<#Cde8j z5!zB!Fyx2M{A;iUH0>c7j)=l|VO22DRP7>)UyNz-`5xye8!6_ zbK9D9QkUip#YKs_LIBe~Z{%6Zsor_Hw3gdCDg&lN)^TX#g`KbX)L-^PD{2ag+QFDD zIR2nR!XI=>cR{~mx}!(2@axMO^Q%p7W@$jFA~teREZkc}+L~)r2W)?PQ2YJ$0bup$ z03FtdxCs;dar+h()X?fW{#*$_a6pGgNX34XLxp+8(#nZ8woZ1kF;s`9dU_3=GsPT< zI}!YjfqB(Ce!HTd^!0U@1l5x})u0b~E;qZ}clHTp!y<((u}4OCv})`mJ762ndvBX; zlK(@TNtmzp_2ib`3-j0?wzr_`(B^JWVtbPb9oxmZc`)=#-!=JFK9kb{)RQ)4Vg$m`7Nz!`j9gkz0O$^+uKiRugAl5D z9HbwfGUN26a2AL--jR^u(}xB?Rnbhz4~S_7yKO9^C7f@Gmh(OEYnrVGKcIw;!+WAI zP;1FxdN_~K%O(jL31HC|$M9j6q!HNz=)_pC9 zeFt)UZYmaycbBx@dL$i~BdZ709z%(hCX5HL1HfeN){1hLNGOgohNdsJn{+JnTFQy; z1P$O~2HEWxu5Qb5_1nNg1h&#uqGSVV$&2hCnZA`Bl-Q45%GqP^fB0yswit9nJ>Oi4 z=t%we2AA}k;u&Ufhy7&w@2uWmsf~nSHif5cj|pI8SE5>-W9J>#6`$#(Ifg<&X}0tZ z*SC*UHKDW%h5O6s_@0Om&<$?*^FGj2CI+J>_c&<^1Iv2YPb6Imk8;R}cA2zMJ_87bjKPS*(c|D3W)I7ikQF6Y%@L5DsofX~G3GoqPLQy!8! z;HI?zzf<0iaQ2?Xy8dSA0k*wo8!mqR9FNBBx}a&I`5F&_s6`0w%Z)6q1tdOUkgnTa zQf?%Pg>;Zb&VvC=S>bq#Q1yNUzRI|pLzo-H)4$90>)|j=9U?e#Nsyla=!@g&Q|s8v z@nVTeNHpy_dWPnJADhbJmWG?v}5oV-H?M|JRp|b{S%PSYZbACroutDa(`$VX$5ysStqAUJB%i@Wby){bXu}( z47IQFt|6Nq00vhr?UKeZ1pA?PoaPSeu@o(RJ>=Hxwx>U2NB~AaG)pz`@@Z9J>`nH5 z=hCo-yB%ZKw@H{ev0H1SrI19cb6d{Tw?vsn5|%JQw{8DvyM7HtP?#&v8Gv2%yNNuE zG*BRFIiJ~3e~qpK`Mw6QV+)XUOkGyy)ECb>w~_bsU8-;w1f`8soOI(vgrGx%#yEE$ zQ@mjvsj-ujLx*6JK=yx@#C%`yuB#487sLOih}PIB&jZ9v$@sZx&DYnWNe&+rD;?Mj9id;u1gs{LlL-GN;W_ZxRX3X5=B-Oe@GY zTA02xAn)ZG$Y}jLyce689;jwZrZ9OFi(1Tuwc8CeTlDA5ZVC$NvK#+tyaX1!ra)p^ zz@TKWZeqj-PGWt+wKnU_+!iEijATm?P}A=oCS+^j`DR)lYaPxV`egSw`w)>$c-sm9W3lJnYVs9{GldO|^H&r$vJ9j5 z>J@JL;eS0%l8`o5OwUfw3;Y$;Lkk)`fZ(5cf)WP9Dhlj8P3pu(>#R~~CAMt~w{LES zR!lrwJ40q!Q*Oyk4n6tzATgv?<4zXGA~Nu4DbU=|oM7Ac?r1pyj7@0BH0&g9-q9_V zp61UEDqfY~j8ojy7xjM=Ws_WsQyE#Pux=p;?P;96Rr%QPAUlD8>AoD}gvHnj(|Hdv zLSGcv-61blafiKxbi1Qb?U&}esHj$G$k`;hx(e60ClHxd+LtUk-l(t|x)5p;$I@{i zk`zQ}zvB$aC!fyBtO(kr1Jrk^J=5sV(64)_gk`)#&9p!sL7fEW=33%2fx`lWjmy}6 zyB+~ISp4Lo-82Zxww?_*yCV3xn1g{XN2Y?!f<__X3Bkgb22t0U zl8P&~7(nYG9i|Zap^mWi82-=@y{$|stj)FVdwUPe28Y(!vLkKrRu&nR#2y~*V9@M@ zjXNSqbmKGLK;dCcat&sz$4S&n37%QLac~`=E-9|Yk@l{I5{KN-(EowGcMPM`wcO@A zv;R_bVl}hOK*)s1*~vd<2aXM!RuE%1%Sfd~i|n8Gohbd@eJ8r$(SZ!cdHnad z8`;FTGs%$QVi<*}5h_0BQf7kCbY(#_RQH}mYYC@PO4bi2(>KyQxN4ahuC7ygVw^?n zKjn+Aym3U#QH1B6fB!pGfn zTDfSC{8D{U0lkJ}lw~qn_*d;hDH)UD6IR!D^(IaLfaT#$k%O|99+j%(ym{@f1|8^3 zYv$4Nu|ER{&CImUb%PIkDUKMF%0~9uP78>@Y~9L@8=y)$%^)1}B{7z5J@z6qvPo)} zo&=3b_kxX4LJNh%d#$l5uA>_3oshXgalUJ|Mm<-@{DHW%X-0{_5qjoa3c7+b@+wKC zY;>TnV0bl>Uo^5BaU~n?b&j5W)Sti43%pmM`F3V|RAD?(saJ^9MM%>@m+$YymRcFr zfNrEh?Fz}OpHv?mf7heWam~~)$0fTx-V4UTCA~OWC`5rV4Uecubi7((b5-!C#BzNU z;i5q5Go0KYqRQtcyxRaO<38JRqktlbzE?YsO|r%~lQT z%)Bofq~I8bfyur7iuiD1&vC&j?%87*M5QE;mRtkNmt&!;J#V<9nQ~tvcJaq(CQrkB zW1_+DLnw3Yt!KOO+th3R>XAtN93TR-F#ykMalu(TrlIJ*aO{kzWEZtWL)XsvF9mF! zB+$oaX^GR(mJ$bJxx{&QDa_#NA^0bC$mD2rU`67x+-q|DQf%(Ye_lCZf@MTa5^rd4b&&)nj%sqzCx{FP%B%oqO6UV$BT-i=Bg%Rp96sV zq4>(y-Sdo3?+k>@^hC{j#XMJJy4sQdf{*(I(}^=rVk40>3a%of$(YM@SGf%q(@0?; ziDWWe42-q_jLk^o%u$Hs%aoeRz~TXX6w)>Enogb$8Q~`(v7vJofR7w-Wv~L=wbmZ( z#)Fq>{S_>c~rh~L=apg zjIZflr)86<;)M1CHg^+@C%rWypG?meKlOd^%J_<;e*}eP@V?Y_X~o$0gb*Lm;-`|pGS$EwBT=okTKd*Hw2 z1#+&Tv^>M*9Jz4;2aAKIF+lSBUv1=IvU5zQj#oB;fYVDCHS}!~nf{5B~n-V%Dz60*v+zUeWq8wjb2^HJbhbL;*tCPV`U4vi#|S z&|2r2;YcmKX#_(JHuR?+SOSi1HmvcJ9)$3&*Nlv%-?y86>~)x{C)ZRGTJR^(Awb{s z%ddjc!+zOi*yFaemX8bNS|I?9z&Jg=l)1L6^&<;8vLwFnvj7p>gZO%8K2wU7?hpD_ z1-RGD_kR$0q>Cu`Tp4B}V9N+;;D19M81UI?aO;Mm40D6+uD7a1@kE2~ndH`=iQ-ql z!h(}+2pTr2TCW^-d6bSOEZWJ+j$P3YDVH4nJ*X%#=+ z@aMaQJLELxf^@oUmfg+A2lm7Kk%9Lp@~Tb|K&ggPi*HmQxiZ4m4^{Y{xBEeJlOMhl zOFlB4fkI9RhLdX!E_QFN294rmPe>=U<~e_}pyG63bfe&1qn_d`nyo4NJJaxr(#YZP zRzG)ITTPq7n6g0X6bf_a8)0dj(IxcGxHkfM@k-a<$k#m_@7ypxG=~Z}>LE$9#B|Bl zDBMZL44nV-d2739R9VB1*z7a2(C0hbJjP6C(2I|xD0FZDMMBSLlX-Ptc=B^JzxKbW zo$1AdEu%R1D??x@3II36hF)NsQxd#9s7#+^`dM~T(MO-cZ6wb1H zMCrFN7s7(6-9B>YVc6Cy)Xa3`Bo5vJOj*Tb3r&*)weR1rrmFq!aQHj5RWsShTO_e+Az0ab6PF`ewZy* zS-K{8ZIa{@Eg4u#CyFE9p`_NDMq1(b2|Ezm0;*?rv7NL+#-h^LZ&w~Iv{b>I^d8ZH z&e=uyWoOdz=*%wWPmE{0^Q^ zF@+Sc*h~2nKW0@Klg+z?t@=~@yPgf)1k15yI8Mf1O{z6te792_XHNcOIC<73Y1GB0 zIf82(vLpd#$U`m*CLc}6|IfQ)y6Q!7@Wr9MDXH;WP@XDXUBC|B%s%5f1|5(O{&MwT znB^0#x$})BljOsw{g!g((hX>_+T8Y%@`!xrWL&f@|vdtcjmpGL?YR4u+?vK(Tp$;MS)3lk3 z_T`h8R1{#G$D6r65d#k(doSf<6Z;pK+q8I$fn6<1g_r-u2)G<@u@=)TopI#-_L8<@ z2uAm%7nvD_NcS#j>POVt-Fu0efecUr3{{8YOzwwf=Xg~y@)bf#YGkCz(Ar)fV-*rb z4>P~fSx%sJf*wMH5!gD=`;eTr0)5=gJrw~-`W4&d&sw7alk3aDEy$hS0du*Hc2>oT z6`l!Wb{=z1L(Y36z@01eejY>4_adyf(^P^b;Liocv_KqnccW_G`RAmf(0`GKmIgxv z5X#J?*gih7U_Ssu(g-#RvncS;bORe_9eizU$!ozbM ze2=%EdRGDo-+Vxc;32w7(S178Xx>1lXG1JQ4X@jsd-?UIly(t64p%ivNO}wv80Xbx z>ZoWv$NPa-=mi4IWv?oqk*Mng)by!1TwRfWS#>ErPua3cmeta8}ta|I?$5nL(s6 zuM`L@4kV2W2>l=`k8n1-^v+HdXmgy78B?W&lAHX59T6J?;Aqx`<`V!f%h4B2JNxWb z?RzaRg%WbSIac)KhYyR!`{*wJqD5c&nqQxB@#MQX!$pl#QH8+Tfog#pfy!zcITlp^WXZ9<@Pe5~pqJK7x zHHI_!Y;hqArlEZJBp|65F}C&S+i$c#0pbZ9WQz9LjpR@&HL&r3?wr&F6g@w9jZHlz z<|Ol}Xf+<mYKNe)srvcN}zA_a6{;SLf`#p>lw^-oxW&OamY2$k%{m+^i& z!#~cLDK+ip7l=w4>CZcgOD}M^)6=4tU)spF4xu}*Qj<1CCi3gR`;rWZwEy3|PkwvO z3Dh{*w1R6p*rf6gweqnO-h*@swpz;*X~jLIf;J*Mblw!h^D8IdK!yCNcVsug*!PZ0WozR zw8Au5{-1E9of|<0amB>?YnlB80+J32%d}rrDb*rlGHXEKoEm7a0w^qJ*;pWp3VfKQ|J{;0+DHVxvmLd; z6?vCXceYduT^2nCp^(7x(v-;%3upJwd|ScW9{VKWRA5QP{hKOE)hmT`M}*dK90Ypt+S3AD1NR~d zh?zxPb&U3Q=yxlC69WU&dtUxOL-u5DB#f02s_t;Yi*~r1^V@j;yM0JjJ^|@{e2dq=E8Fjp8zNt`aMtlgYq)Rw%Ad zmc6zDC=PX(*z9(4I2G}e{)6fgb`Ioq@N0Vm&4vB&(5s{q9{P~kixC`pvpD5t^^_pQ zUr12LgJf@5<3G75U!c;8h~gSNn-0y;fNF5M4O;)KFY?h0tmuYNNx~@Dsiu~kSwh5Dl%g*%p9e)p_t?$lh@T9%onP>EVMsW=F|Yg7eI34w+&F% zf(eQzEJdvmmVOV{HK3y~qgrH}P@`I56u8#_04r z7!4^_z_JafyT+&8ivqt#6y+J?KuSIT3HEm`@mx@sOp~zQ&>RT^a)}2_`K@bPZb{J? zxk7|4`yCDtlz{p^@UPwlULmqrNhqgu`{Rb4?;j_HeLrL?mqSqb_l%T&5kTl4$zsP_ zvRS6K?K-q#gl@_j;;eToqhTTC=tgclpkpySKa_QW`5PER6zmn!LlCg&*;$+D7Scxo zf(6QR_7!q6$sTKyZv7+d?5hc(n4>D5u1L4ev*?NUn-cYyJ}NQDPo_!uv!MjRFJW4y z??;hEwns7u7mgNSlaier{wBa4?rDqvdxXPZ9YuibckLuFSPJtZJR`t;c!a2Er#%{nCQ#{QD+N`b$=?A%vb4z7hF>`lSV9 z?Ac#Bap(L@i7eZAs3DBiz7H~ck$MQm<ALA4-$ zOM|*i$mlOoPdeG&Je2kZ_Zr3tpy8bT>u(-Ox=;KHfqW+$5eIq4m`?$QqTGlF;{1oV zbsHP#;M75>82qoz&w=a~q(v@Gte-v}oO~9TVGt?&PH+m8Ds*K`q z14gP+AhAYWhKYz~)%*HqlP(4M%Wtqn?o>CcpBDDTF}7bcz;mBggM9= zmNp3s>L`YMI_cnNDaulHsEE&^qOz>EcwpN0Yo*{UQKE3nNRp~Cg$lrpZEvcF8o!Y3 zbDBTdkGRsTgIs;viqMrw+r8iqy3_>p+q|#9r(3+(yw)|_Ri(u}Vs>*%&C46pwr?^) zSPG%ua~CJidz<?({x1d59%(Iij64gRLE)~eCi6qFVF$3tRp({PXAa-x~!92IUc zDV2{GFD6ue7U~;Ufh|CGixa3agCn+_y&^)j#Lh2?Q@R<-G{d`P$Zae@CeV5!4oi={ zFa%(xIXBUyb7*>sf+>b@e&{+7f<)l3?pS>gCX()wbAS4vgaJF)%dt;TP|i(hR9-b? ze8M@f_*nN<>;xy?TKKS|w$3gu1@_|6E0AHpGt-mug6Q>SyB0v>&SuU#$%of~F>>0q zJMQIuiB5r|BaZ^|9^EXFNZ0a*B#px3Czj%|jPVd`dS}iHC4OwnXLpwJ+fo4_cn}zK zO3L0RHsABqwNrM)orzKFr_+=+YlnJ+7UY*nBaWhA169VK&(I%uA8dd!8V$wmL?(lB z4YbW-T01b?y#zTp!RcLhTvdVCBlC5eb7N_21o`hsG&^J#*c(--yg6|K_6!|*ru z;J<&QZy3!D-ILEQte_SM;u#4<)fdyjvH2k(zN3%SwfAsacyAJqk|@-LtjwuaTey8m z0+}KCm+PO^nUp%7t>*p)7`$0POJ9(zgIgKVsnds}7gcjr5V2bBiA>q}0hDNf4|LS= z3!WJzxc2eQvMLY8;mny@i=lh(b!3J_13z*}Z-TRi7IH7&ZkVsvL*?99uv^a|A(jn6sa6 zmTOdpmH+zYm);_Zc@ftpRd6dC4{K^e z!YhTQ%tp|PI_PlrB=)R~DwCg&#>+`|@@j_0z-e1jUG-Km2bUPbeB6+Gk4;qI=b)MQ z;|IQ)85Wx7!8{)h>$>6#%MA2&)d<%W`Vkz~hs?iszb@^i!dS_GHb=e*?Z)zZDJvp~ zMC3-5vpIx&ZRiEGWnBzxZ^AtFvb^I6HtoV%!F3@kpU)GWPFp2gAAs}wEwgmYR7JF; zV*(imRB9N2s%wB4U6ZP4geyhaz_(Q@PEB3!KhE_;SX!Z_HZqbX6DT`eUExEh?AsYs zzKuKhd8H%Qo*|djW1mbm*;tzujR480N02D&q>9p9?k4ZrbLsiUUz8Ar`A+0$0hk6Q zu|(O7^vI5HHqPeWn0{gK^n552VZ>-rR4AQz+-5ko+zalSb}{IXf}}IJW+El29d46x zZD@^rx@RXO&9^cx3`^ zAOh7%n79|a>13R z-f&zidiB#Taq!Ek@BluV5=VT#;Xq10R+2ZitIU@%oh$nvCP|!QPpe+H#9`>9XY*X0 ze_Y;+H>4Hf`aD5ng5W1U+Cw}`lbj;3rI+BVkb`b6e3Oj&fo zU>r*}H>R!C)OaZ(4qiqS@ZoG8qNP;j9?3pu3WJt%H;)>}GeBu~rw~5p7ICqsMVgNg zV;!Nw(|8vtn%8ALug5rLgZr2~cT=Y=RiibbKf7O*kkyV2%ZP7cRJ5KtHCbf)6}++; zcI^Ax4(Rx8H|8OzShYIr`e9MVIQ;8mf-?YKpE*pL8CMd|vD%u+5( zam#Nwn?MHleE9>(0ZAnBmyTzAjfUuF<(}nN9^@GMl7mPOLGD#t z|1VI?5)hX00724c0@nV2R%vV+hEcUeCZg}?s~wI49nNDmsB_~!W1x;cTG&&f)MXg> z3~tI625Wb_VgQ*b(AC&@0sgWeWrFXN>BTi*FbESpB2AhBTI@)`!mY?Nh;WsYdl<>e zyP(Vi4qK&8!WKp+^;Ta3!(>!WOCAqS{$pJfIpLc(g|=cI27p1mQ~!9DT%X<9#efP# z<5@SkiN9WXlsPj0nI!+_UzCj7Qm-bpD15c;)EwN~DC#AWc=iOr8fOz3*DPim_ANg` zgBMO-3y)GhsfXila*{5n5*Ws{hpNb9Z)=A1AQ|rw>v#7O6KHv91R69g7r?%ZX;lip zjm)gTPvQk!ge>?}TGzZ~XVvOm01ChbiLS{OV+b$fP$2AjOBhLKZcSy+(#EQ`F!?$7 zCB8WW6RM9i4gM?1nXdwInn>K-QLhMu{tL;%z3VP8EZTRqCVsm)*~14hg&pmO)7A0! zNj|*G()YmBQPVJS@Fll(n8AxSK=~2n2@b9`k2QeRdRm0cyYrj&gm&fJ=vGO`DQ+CG zmLR5MXt;K%n*U2NCr`Zsh8z~L7w-UZaCLB_IC2 z-X2*3L2&xUHc^#kT#8skFTX(prZgru`{ba$1V!OGQo5?cBd#2ry6tl0%<-;GF*%qA?;!@oY8?qL5%Mo|I$ z2|0`#>1GG|;;p?a1wRNNOtjN#z_q75FC2qr zxdt1zx3bpW=nHz3!}+?(snVWY)rx|yQ%>~l?FX;9%c>#Et-p$FgxW}Pw0NHqonNh z`*8@7DStcrk5z~OQf*tp>&$Rxp4i?N zHPYcG?_R8GE1U|&0ht1HN}*3XGW`&w4b#j8+Ur-iPH}q{ePa0Y5MW-yFr3LHgILPK zh=~uA4>(raf}6URLkgc0l8o($FUb&v13ZS1+JCQS! z+|>3)cV{W?EH^)QJ;|B3-CKGk6(FsGzQlskfR^{FlXNEyD+`d)4NCMy=OtDd4WnN2z`yh$#1Ba{YHguxzdbflKaBmxhLJSk+B%ca_8 z-<}uQ#=Q!m^3aUglIoYefOZxTn&C@Zfivv3G(IZ7#F?hfLwB zz@h86PAWKvicm7|aC_dS$?DCyFj|0Tb7a+33g&y=!ZxhhQdRUYcKg2e_&M#x88g#6 z5)+h7vKWq)$(VM-uhALf;aS@@%6O-0Srnnef%|c|y@u0l=!|9RwJ6tF<;bBIif=c< z>^bv){XY9mqpaw^@!+qxLYfGQ>L4cTk99pk<19SxV6Ad#bH=@uchkrMGT-7HJ$qAX z&nh=rvf)wy$amGcj`A#8lZR}9T3vXvfe7`Je{05gJbZn4+KY$006uCPj`5z&1SYE5 zMjaN~SIW+vKE38j-11k4&%M+7^Ny4;0gtZtcUDHfQ_0}wO~Li9G-lEHV-;#%4?H?J^)$T*QFf4{==0!G9E#>L~NB=D(L1UYQV#aW~?k{dig<2uaD9iqJt?KrDWR#g_G#fZt7y--}Lj*wNJj872TD9HeZ z>k6@|u|em*a_^nSzVX7aG6u ze^z7mi`PSsT$0jXcBYrb7`4nB)w^cORAD4^En~DJLIgd5!2x|4`J{<~r!R#8sb&cn zE)M@qzHc+M&9ofPkAu4~@+zJJ)smOWlsL~#pI>{VH>^7;0J?XD>IcRhN`PxYd;R`~HS8clNO z;+#gzi2~&qjd~k!k3@3*ziip0hdOeG^FeDLegmt*v|jxPZiBZ5cPL`(ENakOfnT+M zwrO7n31o62tBOkr>d2q0XhZ4UnNc|}sqW36^Z?5b){J;lHa2SC~Dm z+dt4Z=`Wu*uS3Un_3sJCaA!A`wW_+h^|sS&gKFyDN5VJj=gYlc)W#rizQ^^<{s8d` zB>!cPuyCrXDIf(|D zx)^8qFb&o+>d1HhcPGS^asCrDS6a3onRAzM?5wdd&upIR`llkrv+k(Rr*x^ir%CeQ zp!Oiqo%Sh|x)X;4I?OWY^tg_c_d~f!A^9_$PF7A?&LP{t8a87y!q`Hf=Ho9Tx)p6l zjjjw<-YXb&VK3`t<|_1mRF`?c61NqDATP}V8EQpQExg*MhXv9J()x7Tr_b-+0dIqH zr}T(KG&oJhk>Y5hFvj|>UV&V~xH0L77WHp$LV>k;KK*kMXO~EaiXHg#JsAlB?n_B zZR?5C*Fh9C9ual1Ye!+&}onp2Vwh(o$kpk$WUo}%20b%kD^_Cwq%R>SMwz*bbqE-+i%j>ZrM|LV+@%IGf8dx~(7&9PcY`Ax*lz z6)j%dem0VxY+R0B?B^tMzUOgdj7h{r`imaOb$q%Kf3RQ5bEELAADen$wkay~M;qs) zg?>mtDby^1Scl8J=zw_^29Nc9{_s8Glq>B* zRzXR@rG|N&HgbJTZ@Fn2jXe0~yfv)7Q%4y4b|T$$i*l->%$U0zRJUq4DnTxFsP-==IwAap&IABD zN8n1|!nu#gO@|wJO~B@7)6Hk~n3*g)M24jV@{4wRW-TY>nR8O_@u8vGoVK>`Lt(-X z8hVx4wKdxk9#|MX>d#b z^aNP>1Pmtw9g0N;GmDO)Qs!ZWvL~Zzu5BPSVasX*C;AS4I=x5ggA7Non8DFY6NEFhb2!@!#@+?JWZNq>&p=*4h` zVrGd@l5-deN*SmbGX>RjBhl_?|YtR$q4Q3!X<%DrX zhZLhcBs&jB!crzD$g9NhR+N6&!Rc&YV#vRZ_$?I|6&7%NCei-m2FI7;;QM@(m4OUO zu(=C5RxZuvzualC{A^7a_#t^WeNLK;JvTltUF4gPU+q=ryYp(fc|+;cI7`m{#`#c| z;mB37EA$ejwJ84;^Pn2rP+825O>tc+{Xc{gSeSk$`zIE1zwkRz!i#6T$4p$EkR&7s z^4m=oJdpn14RDDYjEY$Ck@p5lCt$=HKuTPyg2t2=F7a%#qnG!6>0OPn5n^pkG11+| z?$;41%%nqgSOTK$C6r-r2ojHs_6H=p^_Tlorwb|%v@P`1Uz5rzThn^{xP*cZSA=c! z<*2*@Cgpm~fyJdZLE!yorthqcWsX+2gh)?WKGyQB4=C21>tC0uu1mLlK7{l*kxGBn z$Q9amiktf*vv5uKr>~TZLSIdmU4e{2MT?Cli)y@7q+`d%Kc*MfqS?#qOh%xxiUl^ngg88h8dmvFOg%GM5`52@5V{vP?JK5jtt$ zLgP+|fy@+D(yff4?Z+C$K`3adLk{K&kOKH3eS1Q$qQ*rz3J3iql`OfamgO_q_qZtw z_1;$(3;gST4mb|WDH%t|bzd#1bnNg#WsO?f_^5U>`_WHHf3u=I>)lC`8E4cGDAk6$ z#Jxz85M#)K^SHl0Q^#h?GYD9rG4KUPaT^{c4C%D~bQlTQcG~&Oabm2fzBvsx1LhM% zhTO~<1380}4%)n2iGoS0SdWLO5|KYo-g3;o7J8X>6k5J-*Bf^gZb>e2Awz`7n}mVr z$kJ%^<~~KLs6kyL=q%>WFP10OG8XLBq(n zdh7qAL0pecZ3`Z(uZ%L^V}I-{&BUprsWw&H69|s!7Q>WAk!XBH{!6xXqVO zqXD1A^qRGkCGxva1B0_%U$;wt1xeEEF!snDxt&l;2{cMHi6B0WJq4!R%k#FCmGPBg z*&(}MCZc#M7(QY~)ytCsN%2y);!8`CGS+s&zkw=~Lv=MkQn=#<_gf*DHOu*X#u8nK}e_`@b~`qq`~=2Jn89k zSN37N>~}JjH4NLy0bAo#^HeVoE%}+-Y~)nA1D%=Y`vo%fB&;TnCaX#4!L{fARWHvn zaKRPv-1guYt_YQdO2|MyBze~@?O8q|Z;_=CE6L-Z3``1RiW*D6`u~ckTxOlC+fX!c z?a(?>*nKZ-@m;n(nCzsw@u@ybSgFjU)P8KAzea=Sr^tN@zfXxAGh8jpcI5JA!(>+q zN`|2e@?z)!r(F^t+*DlUiekcSHaMyrf^=<5<$>~37&hWNx}v{NqpDFSdu(3`1mULw zSZu*2pl1qhrV?HN1utD2*|TCuIglDzG0aFqAn`aN6}Bcd5Fg}rTjZm^fRJsp+L1s7a_nY?(|HOmFk#WW^>gX7l#$ zVG*~SM3oSlcUCSgW^^sj*c`^5V1dcLY5QlzRfMB z1sS*#{BR+FYYaQ5xr}U&eZ|ns@+$yE4uk+%19ncg^X%fx> zG!kW75|N@43_byeaVVL=QUpLmV>llcpulXEss&om_FDJy9WiDJ0wu?aIK+8p*gO;# zS&9}h2uZoH0}KO}AA?vZbR3aO^DngHhquidc^FE_lvrmgPsmDN5b|0;LtPl#|C@k; zzeaWsP1R4==}N(QE{*b81W2+;-(D5K9`UOI>DtGD!xuIa1hf&t2_NzC`s9w z68I?)$n+EHatook8>u+W5DLkj48PiM%xpO1SWq0`-*XPJA-%lkANi->nsBXaP{#U> zuAx+xa>BOeoTxNzptK<;Y5#)}+aB%#>`JkaRhon^(yhi>HT!jsYl zP(u$TO`83V~SZ zo;CGtQN;m-#SQMbauDXx%=ifsN)DxncdtIV2F`{(0y&uqzUtS*An?w&4x`%5&YC4{ za|rk=O0MVQ{uC&nXO?Uk^`Sjp`h(}|9H2#D&K`~#y?uQ3`-W78Qptu8g!)JyMgY^T z*AU7hq)KrdbLVc3(B}86Zi#L5e{tgFh!`Va+K%bw)T)#3mm7gO_L|mb%$d>jTcpCT zz3C-%mE#&QNVG6gXf{6fg$0o>6r6;$D5a?|jm#h0QRDc~8rUYULG2$0uWDM8Wzc_k zRZ7-LZ1N2*dfYxzY5zbivA)nMCFA{SCwjO()E^5az6`VXLHExlG19rIn$^001u(#{ z>+YWT(8umQ{BT~Maa_>RTVqnNf7U0p5gK@`P5kztXpbjk2kuamhEQ8*D`{&zpHhiz zQ4x74UwY*Qkc9p-V+2hA_F1)WAmsAcIQ1S0jZ)VxSwPdvCsUOpBy5g71m?(bdr1w` z$08ka4Ns=%Mon2>j@swva}g@bGH%=R{`CwsoO;#&l^%a(Csnu06YQ#py}q5K!k z&lBS3J)1pgx;1)YS-*{MQWQj7%frEqPw!#Vf>=`pQaxUiFgO9s8Naw)@eebC4rJgv zR(eo1|GH7m`*jsturDK@K)9$dH78WO5h`wOnw|Pqk+x@>CMT5Cl&W`N@CNqxq%FY< zQf^ibjeso|J&C6^Xwrlhc2x0HP}`V?&^th}^z#Tty2F8(I)q;>U!Mb$9uW>+n*&XJoX64@DRr@U1;5Fz>cX(D1yS?cKEu*yO zAj*s*CH#3a3@bm@jFgCCe-zfZS43skjZHDTZg;|+)EyJh%SQ{S+&31NS|UL0T5i%F zlHb)vhKh6(sONRz6AUEjdZbEax0d-t!^41k!jA1YFh^6^MNQo9$wUA?xtt)OvPlKm zV4y{KlCChZ30q#WbFZ0(=ReS_G=3<1dy!r$4kw?iKv5JO3{OJVW<6Fvxkh^xvq;47 zr3oi4-sYG+zvs#O?x>_0g+aB@57=q7>B4327GUD{TygLlcFoi%!o$z3e~Fc3WitT! zubDO^Q>YP>J@R1w9D{hT`MF99Sh@;m5@qS`nZ+Pfu_itK$JAob~epR>e4}Od)@yq-=ma z8e;|qfv+uaY6)L0z6*F!t!3nGvl4wP9j317JHg;yZyjxkZS2A>$g}@5X~yx|^q1}_ zt@@Zmia*?Uns13aR_TqntY=Hik zbLj%JC=w??g!n+Np1)4^=Uf+qf2XHl?ea`1xNKFEd8!Em(8U3lnbWTLEB2Mm;n{_m zWy>T)U7)oKzZ`!X^osrnTPVK;-|=OG;m)`L}ixVUnzH~-*DNlbVNvaoo)?9`eK z@I!)Ma0Q4hrqLRDx)AYHffi(JIrZA2HGD^aaQ<&PLYr2{3FJJl0nu7A;$_&0Vj4Uw z52XS7g0_lZ5d&2DJ-k43*21&ar7K01DFWS@9WEyKanWqJnvPjQ+HmYZU2i-#Wqgr8 z#J7g}0y?CRK7{_eA!M(RxE)V*Ah2+D)`0LT4w?JFdS!<5bVcz~i}DJYIpVYUa|%hs zh0m4jJOP-QsXKq%6&tU!Y^m=jMu}6bsfQKYZ}fAzKr(E^mMbnT?S|HeWT7_~7oxE$ z$Oy}`3*oS_ojt#DarT=I%nBAh1D>Re2_mGqT*Ld;YIIDur9|LoU&)aSUNY8D!(5GZ3^{(w{W}Z>Q4<`_O3#?<+?DE%AjCtG%J#TxmgY1! z?H~ltIzFA#T-A=Qh8t)NF`g$;vo|6o-7d%-68Hu-B6O8bn;{NTydLI;9xQ0p3S%RJ z6_aeX!39r%_cK z!O&X@2r7OVN5tDrrw zmUp7r2W&L*s0Y)b zSkwdnn{8JY(X`=~C-h45h75{T{m4!+jD7=+cT7u{LbM=t9FZ1r#cU8_zN(w>aC#l| ze@1Z2xoViy+^G=wI6qYcOaFgd_Q*Z(&pXR0@pWbb3j=Zv^X${!p(O z(JlExCbSA}int+%YyMTSye-|my_ZzBFf>sNiLT5%j z^4I=CEzTsHON6RaavKajrHdZs_}xrEp4&W^$sy_8zH-`Mz(Ig&^gG&_4A zWwi>yXJ|HcxBYW2}o&hFkW+}%!dKm~AfIt!&iq0cKS)l{hQSxEk zDnM)BSY|18e@rXvB;@57XIjI!mOJ`m@}!$ENdy$FIeD$mh*!;jB^yZJ*XJ;sI48{^ z>fU8nipNgs^lUFf{XSYK?$gz&B|`S%6zSdm*qJK}tl9@;3uMRB_@jqtKoLtmy;FikibhS38P;GCQ`#jAklSmcT2>6y16cA~JLCp6YR$eImp8K5u{e&uO zz(59Io4yE}|5#A0@4rFD<9d3vHKw~HwR*yPU@QhsjS$2r>f`4muywd2JJk3)_yJJw zmL_mz%l^BLau+2#zAX@}PJ`;bjwi!8u@WuLbMCPlAI#$AG6~Hd&P#5k%(qQEP%Ws* zNG6g=Oc!7$&ja`Tzz*_(&6$3L)dFRb#RezLgxO=rzW0_xTo014yn3KvsLn`uD_LFF z<+x(!$65s!_Vs?*9Aw4fZ~jq+1J}jf@s#@SXyMw$SHY~+@97x_1>#s3j{UBq>YrFEunsE_y=?D z?F9}#?MM-%Ju@Bzx_89F=B2x%#e7VHLXH*|itA;YF#VvVIN3gZF+96&4V18x6oH5@ zv-eMZ?U3Gq;)Tg?)m@s!(;ml?;-U20m3%B$UPrL!xSXE{KQ1h9rrzdG;r?{b_VoaI z#f!paTom_DmE|ACLSj8XL--^;5b5ADqq=)g?S*KU_N%gyD4=oU4z}LIEKo?&Aa~h< zy9S;>Dymg{#dYb&rWIVrhj069u8USNYritFO4GZh1Li0qT19;NUIlyNOT8+;=B7j{ zbVU)8ZWQE|tO9_}pd2Wt4p5ox$l+)da=f0b_jnK|Z!!?_Y2!SU*r%R$q=)REEC?Zl z3`g>LWrIj$;3(J`L=@eUR-EiV5KS)0)8XzcNp|yn)q<~&ouz9aj!lRWT|AQD^Zh7u zBM9xDm(;fqW^p=e@kJeBqR@H;Kre_;eu>_%HV(M3_P=V6=(^d3hKHuC(HT@M-y==T z>fb%J~8%XXV9QXj7GavS}DqFap5-UlqwzfC*a+Qqs9griR3ps=u z3d7+;sF6w1fC`{w6&9ejo*_M=?B97tO8P zC9R-L*dd{wUBjKpIN_7*sn}@)W_8`B3*s#HRtpPXVSP1@QrVDgJ266I)j87b*eP|` zb}gKE_d_7Oq57;D03gG45^wSJ^y_$SchjpeXFjk}Yk3=#-zA;|vg8GT-)9!hlw!(o z_bRnN)xW!Z2YpXub)JhTS1b*Fhh3U*P!zJ;>JFsiV^C94K-smzc94qS9&^w8^Pbk| z60kL(!XOr>hs5tL;F743ancQWe=h0=-pnsL(~%YgZklHDom7;fsZRY4O~nh>REwcQ zOwa%KZD%s$Goog7w)S2v73`~8>E4aLcDOu5s^`Hdb7jw6ET>r&a8Q>iK^p3kGn{yY z#5`Bl3t}1N=~|RaB`JJZ`Ql3uFDz|1mm62QwwSSUk9gQQ^kcbvy&hsae{Yd_wFYEx zQzaEGujXuHl2qnUBYhlZ)UCq2KD(H4)HQm|4AcIwa%N4657Tu^$=(#7X!o4jO zec{ClW;g_D`%cS;1QYnU)t})E-UV_xF`B2DfdszS>zcm1j#S;SCO=q`hDcjSRx3XPoMv zw}XPnqh|yT6Ag18vvts$aLeT0??7VhLTdW{%m8MIpM&9O!uXeMYmSr#^@y1ypgL0k z|5A(5kGfUia}HEb&q8q{ukeNz*XMSl_yw0;w=)`85o{mDM?!!g<-mxNlBj7?K=J2vjZ0{rgv>_T8CYCQtw4_Ic{I!^Az}*G z4?4Z?$(2_b-l@D`1V$8*z%IN`Rb)0jr*v03>Y@+bW6+*)Al%!%4*sU7nam_fBus3|?w6IekD z?+(3c+uAqk6;Rq0K83@s+_A}czT~+XU(x?SRiG2)mk}+Yvu{^8T{Z`HoIxN$*`BSG zfZn@d`zDFoa_CycP6cUr1fu%c8(cOHB(6DTlExiJR9z}6?Q<+3Dz&_zxSefww0_%) zY3AE@ub%}yMqRJGThdf~`_EqP-)~GPr=~;B8sHhI`V_~i*XP3;l|3Xc2EjNO{7}Pj zcw$xAcLw*5=GhlWg4%0?MwaRIj0e9&F++pjpyDRU&R2vl4$Xd0-3y2QyJLt%M3looAC;~+r&84 zZV7@e;wdX6)4H7-fs8+_+^THqqvt8otR3Cfg(jp*`jARG)z|!3Uqf8J&E!*Ba(Z<_ z0HzK)j@})hYGB$lvoD(bI04*>Kbj=4f?&H3B?tX}7WO3Q7>O#zL> zckcUtZu1>S>gKc;toH=x-r@CL>O8!Q6aBY9>5Q?|0T{$n8f5GIR*e@>eR`z~cC2d< z;IudO{aZT#_Y>tc6k5mRNLoog$AO~DB{(J(P9^j^B_J6eGuehOG^=vBD$;?ygr*hu z5xG45wa*UCICVR{FTsR)wlINc%la5$qINeElEr(jfo6rH-s1WhfLexE6{9MWTFO!p2vnaciwW!S0=a@!WESgkiEf+Eu(KruUjp%~eq$?; z;ID29MHEJl9r@aUDR(xK5?aE9@i51m@&E_oN{KGb(vWn!JP}SX|G;3u9$=EOmfg6O z1rFP%+x}HB8%s>PpO=E#!7CVu1B|^hFoEL~nsv{}JszpbXuRSv&nmh6fn4USQp4{7 z?EJ#&Ef(B<;b#0U{*sp&FH&jeM zj(Yw$x~{9f_>Qb2u;&0MXkjOJWX&5$N+&xw%gqpw&Vx@`JIZ4+f+of?@|T|GqBH5T z9cftO(>^Q|wniPkQdj%5P#dlpGan1RPd=?HMz7B&^7s63y*Ui=JoK}1JkoyP)J-`Y zK0sSAwqr+df~82mS=`R({ZVcOUORSSkwC z-YcWMjWNg2dzo!F@A3mL^CsR7Ivdx$>8^@(he>vSN{O&uvF^oHqjUS~@tf$c>ZuY{ z(E#@GN}o{wi|-gI$@k%cc}!1=*3stzLGpzHtIq&57a}W;qAV`09{?nu2w@B+Oh(-n zR$BcLAF$fFPpqs=nV@e){?=02N#NDW{LYVFx}CB#p9f`$ z-qDY{BJv18M5C^i27~vB>X}S_P>%03){x>@ZdZS4r3~-E6>$>)KQ@A0NHCif>zYAe zCK)3Rrhm+aDIprcVBOG-9o3X^F~-ha*`#KiD%f10?mQzt7Xb>CD@-G*8AP?xN_o^? zO(jctk9LmhSg92WbmF{ds9^9c&dy`NB7a&Mg)}a#az>psh!57_v0+LF^y3FdQ3H@s z?XTZ6diS@ih;s9*8OJz5ybg^hU89XHDu9AdD5Yo&!8JzpI0D_X#V*uHLhlxFb;xlm zy-^NP+oZBc(gq!1Zu*C>pe6Hps%A2zW(fVAYRibYnb(%)-1xMUJGFH>BY*4|%-vzJ zu>)E1#pf}`xd~S_q8v~%)Y=2txI>dm(7tEtPto4Ba=uWnX#Lam7d0tCRT#Qdt28mA z#!9qov+eE>8Z4$?Bn4_+aR8bUKVxzK8TyT9vJK9p`1Tn|1l2l_901#hK62&lS@_{!KJF3&{Z}y%rSgg)%v`l4a+1s?VB*FKnytvWVEC^PQ8yTMQ%Kt zK%I1g1j5||GOG8M=94Ekz|LQMZwXzpJblv&pN39ZXrDp{y8DIqozq;eP-DSCU_kvf z%*J3p6h~g>A?J^VhNV8tFl1RyvY`pWKU17@W5cc}={*$fCA3~J=pTllVby3TK?$A| z1|8t$Yx5ut?{27B{(;vhf(xYr)yDg<7 zUY)eA1xZ+dj~q+W&o#U~r9306^h|Z)5PN5wZmws{9xg8W?p3xt1*e~C#agtbP&9Ri zVaK&72j3#u4?p(kuJDdQ`viW(qxQu_qB(+a;aPewKgZ8|uVK@ok-1t+pcg@FuntJ6 z%&Q$2E^1WiRSWf5Dx???zDl>zD&3KSWxH_Am4cSAeu0V%;@tRcB)`J?&fr+Ocwc;y zkR>HKR7Mwa2eVaI{{i=|j<|xvqnT+(6MhATL1VAwMxw>U0!wER_wB>OL@PLpC46g8 z>;{MSjaYIg&{QZkoVHA!hIJ$;y0Y24+m-9#hH*ioP(V~u6 z?Pw0WbBe4KYN|8y@9M$DlbrYY1WKE|v7Vy}bL|xca>y)`JZfZ;`WC_%H{GvJoX3Oz zUtz2#LXQWu)mQ*KYtbriQ!?*>m>#OwIhVDc)PY%7(}2)7+N&wkJZXSr60)^JP8{L8 z(9}PC@kT$hSCCoS7Lruq$;IU3{l*_&h?Jd}$swfGqS3e@D+zDBic*$E!k> zekpA~r8_Nl2XwDUdFU~OQO)J=b9Mm4sl_>;8nD?pmCXrT9X-OwLVV(-RGW*@pHyQ@ ziS>t5AhqQTUi|WTVISrNQ{cTg?0+JAgJ%u7Y-$lH1*E`I|FpMr=gwYjK38MCL8TA{v+U>Jx33wW z#E}jM?@HQmLx{NCVclpV(2w#stx0>kIG-2G_z2oh6Pu4`CQ7X8U@WlYxv2oX3s zU7!Pv&eQ4?LBY7uCqFU871x-Hkta0foF+Ll{51wDM|@}djwr!rB46_~!$w<2(Q#mq z82W@i1Dh=#0Q6x61%7`cFf~_JBNiUzqf;$(TGmZrE;6Qtd~oR9f_O8c21|IcLoj~; zjj$NKP8eshnNyuq)WB zHa|udD)V2$_?ExH=nPE{#0haV=eRjuY2o2FGN@E$4==8W2FCJyhscJMd!LJny22zOsQ}q>MW+vJMf$Kq4dG>Sp)Gv|JB_o+@M6$00-KB%XRyF@f|| zDys`J01{Qjl!P1|k0=8ko_I@ifHEE^=qQ2zDm}whV^A*La&qXaSp|2Jy8@}0t!-Fg zt)R1&pQM6c+A{UCz3Mdw`)WPy{Or{JX1e;VO&)57{PSF2`mb%+RW&qhpJbIGB4r!) z6}0ka_l6f=ZLfyJ?L9e>TSb^*q+gp?xNdY;U%FZLTN`PAuIqZrfBdzj&&zM?HFh+^ zAv_!&X)`_*OC`713RS%{n!P{V%66lxBJ3+w0rga@R7g)v<#x{7|qgpp0WsmH|uwS$I4^bZuXCQ&-+UN@; zav3a#Yi!trQ;lcZ0O@O^0y@EsS_2)QWRCt6ucAMkXLwl_5%H~L$JlF_YzG_{6(a@# z;6x3y@t}=x^v_KUs5qMk{NHdyd)_%nbbu-V8IN>9aVth?)U}#$E@U+3 zKXvpQ>cOXD9qihuwh^x(fmOLG@b*NZRX4ciX3QDdy5NRhGv+7E2Pqz291o9zht;GI zVBY#*raXw&w`Kcx{NbnUmjYmuV48lmM9d@RXJ?+Z9sl*^^u6^SdtE7nuFO}>se_Jk zQAqXZodUfrqn49Q8GVWFRH_?vyyM@am=FuZR%*9E1vdwf?V%HEgJNy~!;dYo)w%4C z**FH`Go@8ZjD^9#HE$^Z@IS6`ll@^}YMf*Db=~$h|J9(tc8tXRaOE70=kC4JcG8S`N=rZVn5WHJ-;UNv6fcQQXG2E(5>|5!My zYCr4|Q;-ATtsUOEAG>~)-R2LmJx5)TXi-w$v+ZP8+qposeHe|_Bxd>m_~SiX)g0&1 z0wg+GiEQaQC?gbGvesznsDtuZT!q&U+8?aF9TpdZL1Gk^mrDv78?Y6TvJ5TrP!mxj zl8{z%_uy+AJ$RMUMP1<7vw9a-et3hQHu{~Xfr1Dj=V8qbMye@!)5rc*I)F*wa<#YQ<B30-W)fzD{=onM67K86 z5fkG)-J4Wk&9g|qBh?>GPgV~yRth9}41t)HxLbErfaTrY{Umk;!_c^F_1S4e-kPF< z>d>#Hs8#{Bh1k{0)2_c(BSt_?P4oX%)POY*Qg-g%pvf)mLiV9Y1?%@2GZ)vYQj=BP zlM0lAU6{=7UZl$NlPJm7|Fmhm6n*j;I_*$mgi+^c8m)%Trh5F=P{h{H5maK-oD3*p z3xDznwi5)SjmKDnLN@)r<%yLEi~$%UT&zP$P%$3Z1>g{RXB%P`I5TvROSq2|lVbH$ zb=S9-tM*KjcN$hJVJfynP3gQ44l9AJ-C~WrFWIS+&jM~rT@-Svaq@%VHgL`(zDcw8 zj5$PIr+KT1MHMJ zlaZnK$t8~(f16A&Qpmuo1)g1?vLmo~1Lt?NSE9FW3gm$1wMwofW_IY>Nez*<^dIF# z3YxF0^j+dqaR6uFHiYntEGa~#=hVzLIeU2MfKTcF<>HZ+x@QK@-IiaS!6eEH)i^cq zrYnRPGxL;+P51e%n_^rx6Tr*WCs3YjlJhTOOU-o#><7%PAsO8UIH3BrSVs+!W>jh) z^_~#vZQ54N_~Uz6mpQTM_Y?s+ejZM~yH#44fiIa~B{nbM?X;nHOHqMVAV_M9@kW3T)&E-#iLk6P zrFedDbni;vnvo=Z#olFed>R4ra%kIneVLn1)r~H(TdISf$ff`!kmRf(9T5(ZaDu99 zJSl8*>o{-h7)^pWi~6SC(#N<1vCK6TZ1IIzM5Zlew0WrcJLVpn=5s?;LB)MFF}i3# zXYJo`|Bk$5$RE1f|cb~)uQXKP9)oH? z+p<5I#YUCp5{h40S+k*<<;}S|yj7t>+spO4m&JKyaKAqH-z}92Gix(ZII^n_Tjl;_ zvsN`YdUX7v<;1qCHbboR1!fPUVjF>p)RF^pw~%Xq+bQc?@{Q2OsqfQaGN$|;#JA)S zcgNNT8=6;C0f&mA&mn7KJcH|=%cP<1aX*YlmZ0-#<*;Kdw3z!fr1m&gk*H&QcQR*! zYtFoPJ)KPW1M!|GpVg!IyJ>lkNX__ZR6*t@rYL#7@@lLXbMQ1EE$KS6X2@AjW{8Kh z=GfMVIB5_|f`{{@r8$&PWDvemUb_J~lLjX9i7Tf;Q|(IKig>4pxT+HO5EreUSWSW4 z3dwJnoE^1DPuc!ZCnf#-Q4*zlxy@{^1_}p5=0u^DL%1?XHa3J^(qFkn)R0bV4tY}JlfPq>U60-VqZcr>nKt%yd@E(hp`jSB`9ru9k^n%8v zcmw1vsrr_9zpR)aR0%R3Zm3;DWF31aTuZ}EpLYExFSrTyEFPt#K%-;sn!sx{f7X^cf=WLWx^Yw94SFaI9`p z#xr^)>V6LD^dzeUM)}Ap(j8l62tp}n;!(xFWEhRD?$DY3`Cpa46SD@x5~~%#PmMHM z9kB{DMU||}_1GhhnVO8^R2?c+ACFS!f{% zm#*Bge8@X|Y79}GpMj9cX~qqj@{C*fle&VApFO+cW1`{PTuf?TL4Luv^h}>O1oLS4 z9(cYz(beH_xCF2=RdFwTiehLtA^!o-x%zoqeOiXnkh;_|Z5fO7+teC$eUfuy< z1>RSASfr&vt@zRw^QiDS zMYYq+Q{(eQ#t9iVS+|yeNfs9g#lo46VicP7wYEbVikhJ7r0Y53E zDDxI$cUiq5ujdZoPQxq(G+tcZt4_9#J7fCau>o?vnL6Cm-xr_PgBHcz{FG7hLlLI9 z%Ow9EHri*dV1O|}x|q90zYEx2j{o1=5{{0~fViy0;ML_gDYcCjOM6YEnMesuQL7bw zEq(y8(P^yuG@WBld`bX7+Db>Nr33dV4@1}VEXPi6-j1)>Brfjh?V#9CvhPpSzNMlj zL}O+uFH$e8_=xL(Lauf%ISC5nse|_5q>E>CA#pASf*le-qdc*;GF6Y}$Bmq|`sM1x&2IZW9MLq@` z*p|>g$+1F{#cLiq=7V*r74~zLI!&rc(#V>Q9PlUWyx)ne$1GHXX>ZcQqrTM@T=s~m zRe%dt-b6;|dTd{N&yG#0WB|j~2#kHgL9@#;&_0F7x>cvCi7WtAH)O>Yv$zdFJ-!|4 z{Vp4K$~d+N^aJ(N+4>TPYHfGVq7=vI0qNZRubmRf$ycS5H`|3!{7Z@Qd|*cifr?y= zv~uTIoSeHM4=JdIek&bN_W-(mH*6z*UGv_G-v9wrY155%XIZu;WQwPFAgQ^qMQwS0ay*0*GT^X|LPh~G&3J7~mCFNpg=CMR zSh8{4pzfMdlVv1W@IK3cDkLWOyvT_0XCv~c`~`lLl>EB3YOZ1^U`(zO>)M)e;V;@M zlzqb@Vd<5%WsD=|HDu{|7$;&9tLYZUA_WD=rx56)7)EWf7FCrI>)Q!SZkK)qL-o-< zapVR?w(Sb?Tg1Z?12_)7j$&F$Om8cAhmZE_pJ2FL0}bh~UuR@+N$ zE+Spy?Qmz-UBV;YPJRZtsghS{>a;v3bok+aHrpam)1DX^Pr-4mb-b#QE*2TRm; zqHgUU{$kTAKi!TSR6yxew8&hhXZxz%Q5DZ0@d^c(Efiq#Ad@@rdku6Zh|u62exC~K zcd#%^BtZVH#zlwZoVqU|yYCn#SVEEa$&Q6KfTsF}5{QODz15Je1>qMV$Gpbo3Soz- zUQesZ#NGYv0096#r%(;gS!%-MM5h8Rb`ou(WD>hZKbo22DYx6qaQ5V~EKGBsvbkDa zoR+PQv6%L)dZmQaB3BC?+(dCa;z6U}!bZr4=*0%g#!ls=pxvd5Z!R8@AgBp-5t@pm^H*=ZkGu*yEQ_BL#(sd^DYr~QtnEW|88P?rgQGrcN0*|lbI72?%xizs++y$}AuWO&|tGYW4{V7G&} z)qRN<;bi%o7h-?ov+1zH=az_Iar=c=kbdu+ulKgYuucZ^Q@pCm+Ke6CX9PO)gl(It zoe&^i5gGONnjQ#B(ug`0WuY?aSQ##hRA& zo6k|^tq%I&LuID~u=jTSFqK$n3+Fl(i9sL;sczjNSX3L{EGBvn{kER1fCIk|^G?m{ zF>5%&RVIyDO|0q79ijio!F+U$6WpnY7c}ksZ{RLbl#voYN6Jk==mafvp;T{%U zfOi<3)0pN69<@J zWysix0r+sWb#ts;dj}bhT2H$)4%9NI@ktW9bN_C!J{C(~r71=s?mq(a$Q~*c0rdO6 zSk61uwftRvbKm*2ZR0f_kU@9m;)vyD-bRxFC>p&0-71j($v}j4Vl{Xi+Ap*!=7`Wl z@8!7dW^(u?P8iI!w5MuJvpCaQr(3#KBG9DkAQRfA59U>S_XRBEDF68ImdmW3!_`*> zmFJoD>$cgK?y+j~+=|vz#Z^wyf&}h?(P#@X!)+7F0(y)@A693)W@5saJYEXFYpn5!tnymJGl#M%Ox}c)E@{0@8{j!a&VW8nC zBqd2-cik%Hnw2&a44{S5k(`ZX^@8r{ z%y2*P*tZN#-Lw7Og>bSjh=5M_p+1wUj~T_s(NAgpzOI-WZ@ts zDY#6hKpPO+M1$$mjyjr27@WsF8hnG|cvUzjvYVp`=ffVQ#EJj*l*W(@cMqu58(J4! z62@9v*(ODf>OjT3q%}HV{Qw3Vi(g6`VjL(ScA|z8PIoSwT`&w;eB%~~&y(2uI&H8R z#pzkqz%1s8I>&j<_$v+*dF;t+frmyO^hRDcrE#hsNjDb-8$Ekwm$_#dBYC28uDFDr$_ez%w}AECK~J5jJyq5^nj^fmji(lx+i z*scj97Uwh))>eNNj#8ZjY6Q9F@hI$SAIH+lvrtWIQ(_)L=&YBc3hxzIMtE&0 z${Ol+A1;2Xw(AF{8}-Pyg9igw}smGvukt1zRR7AhpMn6_ot z0mVpQZQBsEhvUku^_;KN6^0$=MFrJ-Fur~gd7>_MIumJ8m!G$zCD8b27FP#RWHj;H zEhoDYc;GoXXVWd=@peBK(VD6(oZ?6xe*v{PpIH%%;T(R>*F92S$DOzP{KZR*{-p!2 zj79{hLAJ~TMVg@;zPT5AVO`9dqb38Hmv(GS8Vo-U~yxx zUQ}SEwtelvNKMDbT@%N7xyUvhVzm#Q*Up2MSjJcFJmm?EBRQ{KMpN9K zG4qlU-lDHGvEme4s`RYKVAfo?*7VGE9Mz}P5l79*?u@ZZPgJs5wE#4{gFbFe-e>%!8&@&C%qYkqR3ljg8Xv=l91eq z@l^ec_$qZyQxGt1msHA0Z6H>SZVKv`A0j#R6^gUeiT7^4@&=Q*SOw8-_A+GXyD( zyDb_ht#*uxLf3@Mz`(A@vnRW7zFDOmWHP1fygBaj4zM-{04YG$ zzpt(Tw0;y|g8d}lD~VDu?FHmwxd5AWdx&P2G?m~j8`t6I#YtH^M?Qo+E{?>Q`xcc z?2%T6Q9Eq_rzt^gcCFEy`T5Jn`@#)bNo9c^iGi1WWyHFSdB-Qo?tZ4Z0!G>r zN`@}@=(Jorn*;8$6pX?QN)&y;pgL71FmKX>>fU|a$`3f0>`p8+*+MPv}hg!7fe&> z-ZB>OUb$GQO*(@8>w7^T6yKutYXaq#xk4O=(k=S?7?;>GQc+H=wVFcZhkDNVWmEMb z4X$fi+NlA#TS9n;Iu55kGdAg>`{6$#!on~&ENwK(gkWV#L3XgcJl;F*IIvOg+_7IY8+ZSD`~&hu(MkTD{z1+BEaJ!ST>F)6xaP%<-nYIz{`{kzoK9{KGc(6az|YSt z{>tlH5|^NL=@N@)izNveuhtQtsytJ=ByiAp zlS1L~nA}rtp893X66JL^3*&O7PtRf^BZ+ff_d3{OLH!@-Q|LMi?GxyTFdNZu9OAj& zbUj_E;f(A+u7yS>jkKDH3%OQ4=Y0EaC|&XvraYQ{&IitVWv|e3z-~mK4g9ubNFI+# zD;2pn8J;J^7gv}&W9d+0`h_bI6ziskF^;}Y`kDWhHKW4-X}yf;^QI`q=_wDfxq^mR ze8=ahTD!Jg4+va=agoJXO7RrzhNH|IzO0CT#VcEk5zxh4Fh6qObENf;0_$AsF??YB zBA(XieXs^Ru9gHX2}U@(xevK;vHrt*(am?2)#+FsPfa^xep^sBl`u+qaE^D=7@erD zz@Cq~&M;nwrG?@dMD0c7T&05wPC$?k;8WaT+yeM#SVoMk4@Ok`ugRY(5W9qHGF+># zAdukNz2J#G)%%eG{Aw}HPA*E=k~oRcxfhMXV`F&=V@_6Rae|P2$+G`bRE1Z*7@73g z1w#0Dwgu)+v&OqPYu|YYr7B?8gHU}(ou|ShV(oYm=PE1O4O>4Zx3cM?)Gka~n!~rj z&Qw(Q$WU!(OLVl9xJ3tF93J|uuh&-fu(w(3V{;6Tm6&)d!jU%^u(Wev%Gh^*Qx(xX zoG0<|!JstQDnIuaW}ZC3-j-a=&9Px3<=^7({9IOqa%O9N(XX^noLd4oWMwqMrQuGpy`DNxG&>!7d1&jWtlR_e9U;t^+z4K0rEKmOpSedlIp5kB^2$N6q3t|Gt4 z>8KAxToK$_mn-jLHje^vG;|Q}fpJ`B?Rc=R6}+k1%&Ogs%XajYzlR`b(vfFIU{dWr z7S7I`hZSTeARaW+B<;z(`>x3@>VR9fVHw2Go5JF+Z9=saNTATnu*Je-kTIfF-cFaa z_uu?{kZNBUsvtF8wMKpLX3 zie5}=5EJ|GT7EXF6@cNwS&KWv9H0p~bAH8V2hA8ry9`(a1f}KfPf;4ym92y}*Q=dJ z|IYLJDBaz)9?d=oPVnm_QeO||#CRMzRzVUY+rjOgRP>e2ymI&Yfn!2kz^4ls#Kh)2 zAK~2_ZkRP5jRUA!*Z}r1r={M|&Los2YV^1WDq9aOa86S^KC%pHpD>uxr`8f~;l3u& z%F0zD1DnW%nv3XC+|o&cH{~z4bzCz@76yO1Fq(@6gIpNvQDTNow%<4?_!S%UfW3Tg zH2z}4(7Eqawmk3SpHA?tkc^zYB4GzlLm=;$XrB9_z^V1mP_NL?m4`Twwg!~x_f&UW zCsfnGi38hbOB=6lR;sB*a(^UU?uz?DQB|cjysFICZcX9c^|BZP$YBx)qXWM{C|Cy@ zZ-?%rYbff+=B(+rT1T)a@IMRkY3XH>=*h`l_9=-;VA-tTrKs@Sb&UMg)%+i!d|?+) zuzM$`0eC@kve;&3#43oydZ%;`tNawD%sueK*t~xG+$v0foA({4~PT!Jv@(D@>NwlnKJPiomH(c z0LpdeXTFsOFx>Gkl|c;NS0v#Kh}q&cNYNn}?MF&O!)E^vHciq1PT-k}jq-RPY%#h& zm&(3WC98*R)=sYOGFI@>9!cDHnmEIz;9S^b<9Jau}V7@}b_P zCUh{Y@PAj57=JM?Kt9ylr?BpX9=gIHXX z&6{(`jOE_8&RC@3MzN4*$Xi_s3MP~+PcsPlv{1Ymc#HooEqRR6YaU={9nq+%jem0L zgKK9{Aiph;&f&G&b<0`y^wS5q@AH_7i0{G#@-dVyl&iNO{HuSW9-vq1TVJm>4EAd- zs41xI=!(=)hk-Ud$g#|UN=i{Gm^$Xh6=QEh>Z=d#(XdI8q%Kl_7iOC#z@JxMZIMk_ zz_Xb{fR)I|a^*3{_He7(l~wsV=R*sTmzk!t8a$}<$ote*u+@Z04m zfIcYD)dT=G++^#NZ%b;N4@0TRWvFCx@YjsZh3>xqt9R$QbCqJ0R^)cCyO7GJ-(gYt z&*DU;N9b}oq-8;paQR(hR$8k91hX-&GMuQPLsI>F8%sx{n#jCa%n8*q@7H2*?=UY$ zi*!--9bUCSdF2K#rvhHr#a~}?aoTsIOuZb z7rI%q8&`)Hz^8Yi9|ou?)WGtZKK4=Z?&(v3*9dVw?7v`J z;$9YI<=$<^K^A61F@g?b)!!1uWHmd2rkYbUygHV{6XBT)>8&cnWKgIw)D=uJaHqN1 zi|2glGwMX=NW?1%o~-*#?b3(%+U=9lCOx|WxYQQ5t3&PrmV0Psly;;c8zbBc66`Xx zT>KbahA8fMwK>~rcJ4ae7H-Y0(9}Y%< zolUq~AlXQO8L`!Y{AWppA@den@f42vPBDgPh`K0_YEy`>QCu;0i|>0<9&YgPgfvF&>>i+j1tLj!4E_39nJz7q@{q zh)YmJ{?9m_YP~hgRY3hK@{;HfDv4k50BLD=|Lm|MjBV~nJYx(ONE;GyHKNA~__m$# zEL9C}Q9nWFS}l%h>7MSG=$Q!-=00(mVDWTH?jNJG7lDmeF}% znggSLh%RDrXZsBUI1MMHw`z+JBsD}aRe!*)%83|yA5QtbbEe##%@M5&tiVdapvHN% z9nvS~Hiv9V2i6w;hVVtEz<%TtRnCbZj=}n7(Ux8fnyJ@~ryR(3&9iJj+2@MXbto*@ zeDThql?6b6(Xto1>t;UMMGn4wT+D}MjV%&B{qZR|$MHtu0yi!aq;%(?;rM^pzdB%< znMmAyxiu$eW_Ws=kA@a@ifK!L>nAx=KOkVBz}HNQ$6k^=y@i;Xq*HB#Zr^E?aQG#NjZ&obb{(GDQ><#9qCdY!0ENKKevaRwpCbG1B%#}1^-@`h8 z=I45w9bbfbh#|1w2SsXV5%`LPCA>Bk-Elg`EuZRIyn4#hNK zq)ib!Vc`vhSv`eJr_&OK@63*(S8n&emXOH7!xvjXTh&@-mj-Dz)F35#*OdyaIQQw- zf&qLbf6^_Z7@#kVFgBn376+UF#YZC8M6}6*ibW!R%=n}^V99M3IvkshTx}HaX zy)Q8GFR2e9r|vjWHy4IeuLjZK486B4K|@Iw+a%1i_w-rNu{q9NI}Z1xE_;Y}!9X2Q z6V#xLa5wU8`yaNg!XpYB(N>cnZNkK2o4ZwXv8$><$L;siI&EBa zi&mP5to@>lRiHn~yD<_ZWEcR30Ix!ZuSGLzyPM~|liO0>i}-Di|a)lsv8ak zyZdizB))@602?onyXANA59xe*pF~TB%@;nep>Yp@PBj*gvCaH83R1lEwTJE#urS?N zqX8nds%G`N=|w^mA1X!=mXe!VZHmfW_-Aup%gbo9kjML%;i&k3o_v1+?K;q;uqt%5 zIa6zqpCt-+8mO&R2i z6;vlb#}FOUI-WNgY@WJdXe)7{jdK&IOtCS|CohGQ^`J5;@`nP1@D8^TN;rYn04QC2 z9)!|MZlWhgOE>KDI;==TvPZGhO~K!#kFfvZ#hd=?9Zd+0#X*tidGpaUxOw)H$9jHp zMhs=bVF!mwgjMOGE+FTAGsL&@9+M(21)&z_ldC+P`zy}#UdYw z=_iy^Z#19?T36BxXv`B?>yDtc=M;9qvyB;4Pzee6$iwk=f5z;l64D<&^kYbklRbum z4!0GR(kg46AT}Rq$o|#Dbq;VWb|Vk6wl@lsoR7y%TwDVJ4Q6AclB>V5*E;%r3c?c| z*f^x6cmq#_jXHK|ac(92W1N)H%@m=}z_du(t%EhYIPhlsP-Yi@u0gRB=L8vJ6~WVeKp{VhM4w_`X`iJ%y(v)f>a zm^bU#In%tU%vd#DUkVG;hukO3^~B{bRfuIUrnj~1uuubz8(0*1+v*4c{0R6K|(W$O@``8QKnKy8kk45kx z!v;pfntS?%87@dElb?W0o2{Fz_2Oe6*l^F+0+E~2X1x65_$}5ZcVi7|u4Kp|`DTpT zYe^P3PJB#;FtG2P)$0^geIzJUgY{!%Hhk>U>b*CzZ74GzIXQ zlS3HQ32L^mW=X$F6~ge6C2=qN1Oe{kB`z0dsw1NthJiAWp;3hol}hJ*vwU^oOw^mo z0Eo8m^kO0L&Thgc+Q1#wXPCKQ8iSA>FA1$&3RPjZ6V?xj;Hl3)VjHGn6Y%_=(wkzR z9DA4{k!2f(NsCk`z(7H&R-F9`*%bM8a4XA`;;dU;`iYt8(1>wya#8G&dV4Ct@Ud#4 zJQWL0Ma$ywwbm-h$^{y3mvk3u+Rw2JfMV5J{picpP-{wAZ>MEQn4Fu=ru z`%`O-e1;28&reu~(S!{fKmwEQ07E@y1P-3*a{I|Fe_$bh;3#r%cVK*~2cW*jgt)@QkF zspFBvU4q?3XCzDj#oE3GNn`55Mx+H*h<(|h1eN0%MFCG$Ro5HNdagZv@_{!r^@+vd z#$2}wB&1w5bSj~MnU1s0>OvWL3H2!P*DBcgmlO^z z1BUrR{a%vTB!|4X&vzb~je9M-ddd*+9G6DA=wVveq+%yiXm2~g97Ah^4gcuQudmlg zi^ICuICRg6h&dyUe2T`68~R4iIBxQkC#NT#{(bSj6or8 zj+5-u*ubRF-F{HM+0T(2QFa~%o>)@-S!9|qp9xA&aX&vRk9rtJ-u#mTOu;5202Y8y zWPSjEqMFv4{jb?(pEqo8z$_mN7;fMFea1O7IVt1l+_Xcn8Wnzyf4{J)1`OC z&pEntfs9EpcwYKNmH1WbWwX@(Tn8ceC5}q4Fs#H{eu}$SSZ$cXUrNfyE&JuboVoE> z<_5E43NxUWuid&=Rq%PahF85?CaYN7*Ex3p9ScBdIw`i*SR6fK4oukF4OCM|)@2y4 zJ%*jM_4|A-A#F8UxcowZf!j>6bXEX}pIuqgv>F zi^l`BC=!SCW(labpxyIr7*m%R;S<$XMWmqUmCRStoNsU|4HUZ77uWcCJ7DUFFB@1c zi!epUtra9CfUg*alaKq}0;^eN0c-g3#8kPwG|V>NK++h3&w!P)K5p=PUpEX=!ol2W zya@7paJfrw0(U!9pe*c*M|5^3eQrz>&K1d-$Y^JtHO6ypQ0ge^*mN;<>809O$%MO5 ziup@=WDYUJ7jUI-Tj&m$J)Msm^iTO97~DmGq==cSv{qUML)QCz#wLfHOqrWvXD8JQ zhD9M~6irP6PrX8Vv^CuTo;V&hH8Hb#H*>lp1}B7_=oJ6}9aKS@>`CDciIl*L|M}kM za6oS_ymTY8zwr=(j7!c`Ews~P=e|aV8npqnO+#r2PeEu7}KySUm-hz zmW&#?5jn_9-3yslt&6$PFRN=}l9#b{5C5zV&{pzsm%bk9By;s?M^+bhuYHSQeFIC5 z`?80yE>o=sP^tN|qLp60tUx9hsOi@FUC~@$Rpj0R1QBY~L4XHW0qy0U$A+s(K86BI zBnJf~I%F;0Y|w#}bZusy&6QO<119bSx0Sc>cBwG&&hE%bAigybPEVes4o{_P3FEAJ zQ;Lf~X7MtIhbI=AB3{3Nq%iGKIBCZOMxn>3fc04d7^pdDHP-w5XmPTx!G3}N>LB3c zFKF{lHh#Z_0LvGJG2OVb^Brf{4hNO#Oa6JKsk#?6Eo(4i>u*D9MHIVxowFxT0LV{O zUu~b|6|#|=@)#Pw=qhmIIA=_%fwej@u=$b^+PX}HNRZr(>zQ_MQy-B%4iGvn7J;RL<5JBD<7QU%{1R$9}rV`M6&kawa`#_4uNEJG`?AL9YC7sFW^) zlhdheyo=5-`&wVajiNj~c7a)v^(f7DJvH=m3?m>q_s-=r#*6o9cut1>OTZ7xj+=M8p8K@ z*<16^1Iy^6lzCY089jFFx%G`u7_5s1vvjAE}{vy#TeIvtZ+?V5BiAt4AA?J^b zkVc>vk8K=5M!n~tJ{R&b#>1P)q*GcR5Kyh`<{9S)TEzO~aK+2l*gncl9v-i;0OYyr zux0CoaA>*+cF_;?__yAFPg<~%SF*@kz~O7W8wl!A});3 zTpt;))vA7rVEu*@RxBzpgeXy7wvYJu*!*HuG_oq^l(Vz)S9&e9Dry6Y0G~*aQ(%od&nm?AWg|03w7CUVn$Uf(yWnf83*?(R&c z0R%0&Zeu_WzxbEEH;Rrv>{VC1+8ZlO`ddn5`@jOq!%pl!?Pip)el^z-i|lRg`;>aa!B>h66iC0u%MjzhI1 zSFLDs6>!dr{UJErG1}0wXq0xnY?-S%AxK@xEKy?cne6Y}1aEG*qt_6_K~k*Moev-m zD7Eh#4F}(pa*~x~~E`MONMeBLN{a)!(bcV{=89UVW!$(C2Z%(`!Pf4*O`)yJud12q?WR4iCT*g)}o z4SLjdCG>iAeg9ohz0-vJS8mh0;gnaS&kxWzJfLoEJmkcu_m;9_39}3>Flm?`N-QmF zb;q@Hy>A3;KRned5%EO%%}VDQwiygmWbx)#;tB({Q&mi|O$29*R;cTub0|?v&aBr2 z2C#75E!Y|LU=Cu{H1Oi>I=5||t%?TxC&3gRkDKrxI>ZNtbo70;dUaPg#8{ft`5w>; zGU8id&oEP$^u9#RSwsbEO-<++pACLIil&QV7g}jZZNIMi`wlS`64|71*D|%r+~d8e zSVmpgNy9!LY2)(_iODbFr90a74x{U@&l|-ZnnH8Kc0hpnKi1rdFYn|gu6K=5XLK8n z`v;w(^O7Q|bO~?@V3NdqE(3*C7?rauRs8R^xC6IQDWj6L&OEFB{ILIT+r>S9fq=#h z=hPFSxW!|5iUbNOnMt3PZT{0uoKE^%?D{iU|0pLC<;AfPW>iy9T}!i=5Kn*viPK-g zdY(Ep&M-RPf$7g69N4Y+2o2G3mt~A9UI}>nO+LqtpcGrxc_&XE5SSg$In)#Qi|`YX ztw}|b0rHTPk`CSkpP7oUaS&IlG4L(%LF8}A-?I`&MOSbNVL4!=&fiU1Pe9yV#OXyF zW!?6iDji%`Ch^8~D)$kiS5`ClQh(|s=pVmu3JK5Pl8tGmN9-R@YpJW>+)4I4H5r-e z7PYjDk+13M5ZuU}YVbwFWYhOT+V(<060e^qV#-R%o!JS|*f1rAGIlM&QR9J5rERy!ga1g{jW<%PT=lUnZXZI&|Vk%fcvzG~h3 zcXMscQZ#&lmf53x-n~$<3RM;cXI!a$v9V7kB*hS z_b&gUAQ2*8C+zF?IQ?Kp2>7@cgE6MWjoU*2Z%sg+hqiQFxY^v6ZXSZ0kJ;1rFwDy0 ze7u{7ZG!;JuESWpP=7yAjNxJStXNQ*tGLqquPE4om* z9??gg=A7`d9WjGl7+KLFxcyreqzCy$ba9;PW`W+(#i}VKjXoS(eCMIdE(Ihj7qofk zm`U8r&70R$%-oN6gH209QJv*-Btg(!imj zp@^Il56~Baw`gDsI6}@KW3)wTqEx0%I|Jb=yD2Ca+n)HB{W5sY6Z3~V&e6y6O2T}e zkLAyi(`FK?j4|}Z;Sl^W#S?pHtiu>{4wCYX(z1230xg@RJspK{9Fq$0xfT3c%}+dQ zt(68+qM+PQ7GdJ+9g1DC<_Zjn4fe*LVHUsuzw=VWI}Rih>v672iv~-snfQP_iP&;f z#G=B!-+=2GpXkKH(q{nW$z;>x>#yoG$S*Q1gY?$}l+y8=Evr6Snhy!^Ck)({>E99x>_A8wy^vIDKru{{;_5AKf0aR`p1vf#gO;xBBCHbCLf-`=68>{I zzq55V*yxvJGkSw_7*=%UqkL6?ziBpI`ZejO!lTtrtNij^n#hp4G(M4=sv;~*LO=%! z(t$(54L67{n1j_2FHtQs`>TJr{UD_MBSiD~C`vqyI2g;B{F~++deymI-m|b>$->y( z73tavCVLAit(To{Mps-zl7Nv%B`L*rwDy5I>Q+Y6k=08uRnpsF@kZ6Vf|C=yiKO|# z&Is*M%};s5;1lhI-eZ)QT=ee@vIWc0N+#DVkL`tm1ICUSZiC3iZh?#tL*d|T)6Hlz zb|o{(HcO2x`c&7;JcoOouw|pi9iRo2V5&H9`3JUjki=Ak>%=>VyU12!-Wl%$Z^`iW zAe8LLE1h`v@ra>4g4V6tpCp~jw>wd`Z4dw*+`@+OJAGHxIS?dt()f(Nt^;oZew2U% z+fM}?Y!7OJhtY#iRUvFXc!I2-7uL;++CwJBB+n!Z zP+1D$N95kBU-+tNK9qv83)zEd5E5&INlRfKYN1nLCgfvC69yE_Qm~cA4BLDM6FHKG zuOQVV#1O#4=eDpEM9XJ`wo6&;mMD|snc=a>bxpSpY3tj87>1;`W7I;0Cm3Ga@5Zj-gID9VYiS z6C&_TfNGBGUHNjAQ>KomP7FJos_3x0Q>qmn9E9cZwahVF19MKQLin9e$^(FL-aESe z=FwJ>+_vEQkX|_@CPO;qn9%~7BW6L6ExNMkqIeP1b;BZyEpg`OVN)-muMZYYqiwq- zJSEhaW2;+^(K!U|8Eho4zqApP&yTTmkt_>$1WFClf`(Bsi{>Xc>hY!UosbR9eH$JI zYF>-GHBbi!B^*tg_gcgo@nL+X;ZcLz@MIj}@1nIEo^_9Qbe@{HgYpg2MuWANl#A-A zh{d?huonfIYOh1W&8Z@lKr3{an6JClmpV3gR75BOeJNo59sDVneNdb!VX!4NeA;N% zvXq*gU+J>Q27{m>C8W@>f8v2FgV|#yjOe1wS`!Ji;~`{d&j?8DJjEb!K4mm(AB^Qa zKyy?L2v4xi%OqZN$}M06?t+A;9tqM|b*yHam#UPtG?B3be@+hyxl@t8OD(CcXbabM z|NV63eOm$1{kUw<%r2?&gD%X#M9Fb@sPP}jv0?utGw&Xf)h8Sc)w<%7(F%!vAK_d! z|8Pc*jUCQ06(~VPc5G zB8?pHvXKf@0dzA0o$`sSyK=94pmP`~&x5#*07G-Et(x7!V`lpK2aX0tgGCB0&*DJN zhyMJVjhu^XqT%cQkVS?Ehchs56s&}p8bUJj=3zB zKid)GyFMph{5*c`C0)SJp51VP&Gk(aS^JHgp4fVUu^A%QXY9+4_IvjA5N;l|47ih| z6yR`|T}bd~+<@E0Y;fA)_tt);rt;$e?b=O<)%G*zR&0GpzPGdEG7fxzX=U5LASg~K?`bg-OX6~{C^*R7lDg0kTamfCDc$)ZQn(JuXR zwD3-F*cZ%7mqIRWnu&YW4u?X7jp_guxf$0q`oX*KY$mRKRQ?_k;Y!(Z$AOehHu&O6 zQ03+%IaeD$XuwVE{i*i_VBJv?_ZN{OOfLy0B8VWg+C4iJ=$09jTz8)2%g*J^b{i#8 zeG42>_&!0UqEL!CfOGH}XU;FQ)_x`=#%r~OQA*tj-Pm6CJ!J|wj}N3S<;FJcv9{&r zqZRyCJi_bSkm@V;=ikHC;_vgN;K0{-&IoW(C5bC7btod@-Xs9=xL12AMUrx1e-ky> z;|a+0Ms%}2kSm5wvgMhH@Q@w`cW%fXWoP!-A*j@z)>b)kWPaO>!Y6lg5h5UCtWisD zn9Y1PEtD3f@Df+~Iu$>6*}w`mq-Z{^MxdqcKWC_%Yl)_RHEOFP`~hCY+r3;Sfu`0^ zlRQCSM%%IpTAy#btMJ+(-oSH_(@}#DM&(M`Pg4fIcuZvdJA#Yo5Ir;#P0E>lSqw49 z#z0YVsHBbx8SK_^NKNIe&upjewgkK@g8x3!HLr#h0B^HHh!cC^$KBQNJh_Hc)CNEv zW3dq(<6gkEywJb*GA0|Y0onb4c@sjLm05dNt!dFi(O9{_uw_7`0Zgk``~~bU(JUzQ*<6rMvL~F}WVwt91ob$XMbxf-5eZAA%VP1$p76fH zRz`7|o#Z+OvvXl<_Y7Ruh$55B^l}t5+kHwRW@;!7-&ZRj?Vg)xN-L#o0f6$unpXsR zg3n!Hs)#GcskHAT;ssub&R4zOM4t}0ZMqE3`)R!6%;QzjS(cH1H|Zd#YoAB*A{(v0 zD#TJmypdp6@ZjE!TWI-ho=~rgYNJ;#z>{TeTS=P07J>OPH)#vdg0!mC&Ux9t(U|n~ zbQ?WnJ9})A?}>Js!r!I@nOY-8mRy}APb@W9$`u9oRo?`zgNSn zU8N)#Xs6L<60pQY0G&nd*&bqJ4lGWpxX#YE7688W+0ro;l)}&1PXKG31w^iy-phyo z6fE4#TjK2`vGU~!(FXCJQ-bS6Xb=BM=LN7s3^J-wxM1gXFp?Mi#s@_K2P`ZI&XFD9 z&@2e1`p`f1rgiWomZtfuj@rni-5Q34yf_&sZI?4h_aqJ2e$r+*wU48JItW=KIp9&N zqZOKCI;~L)wnS+->NKP;kI_2EXLLWj)J(l|_#!Bi`KUvZ)Zo9K&{K63(6|tT`^zh>WPnoh zPt`zmUBH)z8pT?+pY{6^_6scRGP%*%Cp_^MH&}Rkf<(Ek2g67?V@(i(Ir$mbCkP6i(&MKsZ`H|a zJ6*oLIfZjPpfmjiY|+sl)hss?<0HD~Q!bhKVE>jy{SPS~H&hRHg75;I?%oL&lLJM$ zeLJhi&CK>3=EX-k9SU-==ciApdsQQcQlRRO&zs1SGV?*806jd8%LwHY*#W*?riBA? zG$i3IZZzW`cU*EMB`%}SV{9TGIHGJ5-epTE?y)N+8bGCMphRsfaqadwn*+6Y23T2>aqT;k+RW4;=IAG&F5ig zKzta>5f~>X)iIiM{Y`=nt~9JYo2^Gic3S zsY!qQtrTF{sPONqtL@G1Qg=#g&Hwq+-M?3nhS6u&Jz$5D2^~ll%x~XG6~m+T$xm4w$AK1-~|AbcK9TG^Bt4i7H4k|`*w(cmy1sv>VMnfB_N**OMWeonGV zys+`A#Z6)Jz@md>egu?zG%Z1V12he;S3COgftX1 zVL%wxoZI78OVEnwmH63p+*2GHJMXX_Tzm_^qnGBc*$r%17XXSG(Azrc(!hZ(SMuvC z1yMeP@;{=PDbvgSQHQKFyRN;LtLP@wG8nNRDgpa9-$qAZHt={>5Zqyan5pslsJ3P#GR~+qs&|1>PmoHGX#?_=Dp3sUvpC>QgP?XZ1RP zp8I)yk-1LOq#-J)R_@4Ut@Go{FM7@32~W{FCJp)L?P3vymV_;J+l)I`fX~>1e9}3Z z;peqe&W|wun{x`{T_cJ99CIl`Fu=z+NihgWbD)3G0qglXYEX=3WHD!feYxO6Jk$M1 zL)d5qtTPq+;-igU@YH+4oMqCf_o9Sm!qkDN$4R9L3{*n@P2vIE^BG}w1C%lY^`0T1 ze&?&T;z=TDBs!OyfOSdf*W}Cg@VhhC1Gu!XL@Y9OW_kczv!Rbd@c=P*_P3eNxrww6 zDU2xIMTw{xD(YW~t&(KX&pGv<4J$?#43@_4eDyY;0ct-iM^ax(Uc(2e0b*Q#aWOUh z7+z$BdH2k84=6W|v)`B#+4AG#;1r`^Ij?&%nPc8uS@w0Qb5?WVGUZsjhpME1lxaomSQBIt;W#zIMVSjg# z%-{&TCCVW$w8Qb7O!5G+BT3Plk-zdV^&WqA-5%{q8qtA3^`R-JAHj8WD&L6A)@Z}O+225-)k zMh>^%6OK)jn7&E|TZOxjKN$o4^-;kQ=o)OVx1wO13#88ee;?jK_TzW+B2KoDgUT4L zaJ4x>Q6-n=u?K4!8do((u$v6x`dwfIIWb5a@}#ZgClwE;2rttY9-b2rx@r zio7gL)%hj$cCs!bmwoWW5`SaomA;UwK581L8HC~?g2vkKt#Ox8!xKaAPNMq zWE~$x^Pd6Vd}T6uPhpBcq=gQP-dtr{1T^^VqyZHe;@i2YUyXpFhhQ8 z_i8>N%%?*)VZl}&b9^uWD`b_tqhUWz%da~WC4G%V4BOCS(&(h65w>VYtF?8`p<-Du zKwCK)?x2P$UTOQRA>m|bSw%OFHXpF&#~FMOvW#yGRe*Jx|J8Yn$8pJBbg6gvbY<1yWQN&(xXz|31fx z<>GRFL{oyf7nRD-%2eC}pAQR13B6g~ww&>_UDRgRfOHStUpsc4P?U3C&cNQ9@z+&H zfLmQM{}0t{*~uj11+b;a^pcb`Vc&{9J_bwzOv14P)#fx{-{qZL`mkj+zMmHM1Q;>; zV#)$hO%Gg%(`ff$kTx^H{&da<05%6X9>$nb8C!NChxR$D%@BrDU}r?)E;DC5QiADS zM7BtN9zmB?M@Q*a-I|ddhM9Uw@M53H!PZk>3n?AAsL-IW)t^uwp!1u|we{7?3a<{L zo26~FUD}cIsmj2qVF-sRhlJ6woP>;$|@ zr=*`oosQMEUrCK%Z&^Vxia9q97S7SCOPkaCxpvc0`kC4*S~#}^LeJz*NGq}}<=S`1 z!h5>+nLX_uZ<86`c!zGShtW&xsgFg!cy0stqailUdifc|NN6{?Rl!-rLnRQIhirqbm?Sxj+%t+7Zn39c$8hBz5dhPlHA;6}#-=s7 zf9~J@mDTmCf_XCfAuXpT@zTCU6Zf@Q4fC;kp28)G$L~f`#jHqSN#1rC^)^OcGJMU|WT7Z^T<0W{qU9pm@?}KWw4BWN;%N$1_KWySdfI zjZ24Z!Q3dQFCf~tIvIZn1vK$<)o~zlN(b{S3Dc{2n4y>Vae)*ub(|qXn`kH!q60r) zXE9!$DmEAXe;)MiXZscYk$4yltper zkr#>@<9Kti*24EierVAI*5tg6piptR1!s*2n*`B1OnZPN=I;T(M=P|5OqYzlgNZ9~ z9fipPIc1O{2=W?dgQsxU#`%_zCNwwi5qOS&!Lr{&Xr!~S$&9p2p;*0{tksHItRZ;c zLa#+Hl>_OBIq%LcaduAsS0m>qkr2q@vA+|x<#=-gcN+?T*L=d>pYjNL zo*Qv{oY>xn*kkQ`@XYUr$_J(=_|PzQ10Cz{Jfcr!-}%bCnyMXqwZujiko2K>L@33k zS_+%Z5~*((!~kQzshn?3n5!W&=Z+Fw@?v;{vDE8CTNZ5#8Vx#7IV5TN_??yJeA(ob z-GO!7J3uLdUkk59> z<*<9r`?2{V!-gTiev#0{b3KKR7J3|!nepGhecg8BJ^Pq^w;&1llNY1r{?hk!o6&-0 zPWu?=ha@vAiy<)o-%N^Y>A7ScK7!mCKqc1XIklYy5Sja1v+TIFv!-UBuih zKcV2?b1DxP@mgfsq->&V)PiAc^CF{$7|vQ7BzsxOx?XH#H@)^jS5Xv3b}HAf8>mQ2 zLgp7Y-F#>Z1o7>@`XR^QK^W_T^(DL3G9X_7x?e(>Nha=tqQUS1BGoR4wQpM)Thc#P zbG8S)xF)n7!h&_6xz>1&sb_k@^r#_kc!e5}i&<@uoCZMggO>AD*s)G-0o7tzpVp)J zF%uq3f0)xEQS0F#*hGMn5RLt2?XV%ZD*Aa9yDw(8`nN&4%jnAca}a5pmbpgniO&kU zLaYf@HJ{~Dq}qHfCOcgE_r4m=9}jfAVp9kuAK&POwOD)WNTC#eF5;yoQW^kFK(fDe z%F~|G`Nx&TSC(uRAH=BVIzD`SmL* zoVcD=L}EhbSB?)7`hnz~$58udiP44ggRCt(?QXYF$8$8Xi|U!nU%0uza3N*UGuScU z9N!+&8v%b_@bDV?)8}(~P34e94I(DAL2?q*aW4H`^|vy|>=mtFbagHw#(*>sp)fyw z_KPVisA!}QhN3Ywu{m=0Ot60{-T?Tr@};I-QOZb`4#}*JUrwV_%x3e@O?vO28=pYC zJ?870AlLhv$fWL6FPu*PJ?eq^-NFtLRV!*8s$_qW8AVGB43- zSxpb!d6Z8S%iKWyP_W$30!gb)6-I(Gw5uQ9|wod@zp=tN$o0g~))_FMUE_D#|AQUC7ey&D|5T>y3dTWwIj13K+mn!3bEXPlV+-(Wu@LU*eWt)Ri8 z04uz}h%@}}1X!+HUhWMsS+$dPLm%c2OUsc_h#ijBF5)n5>0WSJEq~*QB9JM8m6g$e z+QL>kJ;XVC8>X?_{!)}^0c>#7A>`q7ad~v4+s$<>cow^`4+5SF3rq)nq+EhyOVb#e zSO|10B3bl4o`7SK*3->6KHwW)LV#eJE?#Ne_d|V-~(Qv$dD_yGWiHa(o3 zeJU9b4Fjb)zz{)Y^Q_KZI_qA={xhrH1jNR>YIwEXqd8~tRXP^`8dazOmh;4IC7kJe@Uo>>>w9(3$W_kk*kMOGEttOz** z>+)qG>;rHPZT5(yaR4!0ZPj{JM=o!&)PPJU&+aXYj2ES=4uvfj$iAWBJLvTIJ@wiI zArOL5>sAX9$ime<&47#UIYzW=C%y5BX#I)yoUy#Dx}clV@k!ye(2FGCTe{)chz&dy zz@BTH!!-)W{+I3CxDu3vLEsY>=b>UPd4KdQH5+Zs4CeV(Gj+; z7^`g}-*_7n7cL^>J1%&pFp;;X|J7a~<+0F&rqdu@Py$)^J(hQ7UXNkge{|KR&}L4k z5IBc+? z27uivn?WNRF|5va21jiiLi{b|ZUbP{`H$x7lS_}&tT z!iZW6VVr;W3kno0$#pY`{7LSv8!hfd>4oU^zEHWQ+C{u9J118PgQZ22tU2u%U|R6< z_G7|TM#Wi}gy2Gr-H2mDEvvt+bp_Djnbb8-0~Fa%B9o={UEaJ5#WwM%WEx1LB^fx< zySX*zT$>(lKeFL1>Z{WSs6h=MBEtjUtYnvfmxtTGi0F?CoLwF+Fo+I(*Jgf`{?2=T zrL#bYw)1=P85_(zn$;Is*Ycsm3u>g{BH)nh1ht2ZAx}h)k}BNHrP+)NPDem**ZB0- z2@S~tTR38@1e!^rvR`Ox-Imy$2Qq9RTQS`D8(=dHkmJ{=F6;o9Bxx)0hQ;&3%ICl+ z9RQ_9(~;0>b7RPQ)D{8)>29MBUhI>VEUc^Zkztc)4Iu)T9PhVbrNBVQJs*5$ImQTj?(3hsWi`4C@9_ zmxyKC!&qf6QLn+VbfAMTeu~+PglC!iCI0pgmis;*)7$gb@)AG6^mkF35mMu^i?QyN zTph#~8KXBKOaDS3cEhpWU0m~8=7Z5;PHNyaPQvn00itGc)=sFs4RD2r)ZWrlKCoC| zok-&!W%D>ItbI8!i0e1pLG29CvjF|BuxOK{#_>t98qxikLjO9R3kK*JdLKI3 z0Sl019!9~l$q(Nc%XQq(?K^M}7@)IRB%PBSiHwL%B`JUa01I6K zpDSu#JvKWND)R>YVX3qN5D{Dbuv%=gR8&kQsg^1s^X4w{s1$?r`loB#3Z8QY8oM{lo?(?nj!wAVg@H)Ush`P}jtm%LQeDQOmRA8{lmTf0=w7h3KlUx4s zqzk5%4vPZFm_3aLnx!&4JvQiR$7R>-V4hjm(b8h(AGB4lRKpFIxQ4RB8N*E|_D0M*n}^-0yd}7Q~9C zMzRPT`hoNv*m#?BjqHD->%y5#Sb?=zUT{~8C!2H7ec9H&<#KVr5S*Ra{Hu@38RmN+ zEfRE2cX0jD(NtBQz&L5p}`F7=oNs_OWRYcF;AG{1{`0Y9~Y>p zxdSmxi*4m|Xs!6Gv5-*XU>Jo)@TA?IT=V^l8hR--c{Y+`q2fY@W2ITC< zFtO2+1gC$QtHs+S>z9i{Z7q7eQyl*~c3$33i?jFo_`zk=mbQw!_Hkv={N;ZgggI(Q zIrM1yQg9XQ@K#%0m^p2{_xgGI-#FWT=Ho7Gc!DxkepP}Zr5VJw2B@K#oGNnPRpmSs z)Au(_jz6DyaI?JZo*6RKzXF}ia=oj5V&0^aLHR` zmA_rbgqWpZBF{%Kg;F*KlZ{^JMCEtf9;B=O#JRYETbMXB^c;xEk|p}sj-On zT;P6l`;(zk@Wv(7)xmYsb;r7#HgRfvK=Ckvll$L*y94KgtT3M&Nv5>F?>+H<491T!IDVpK9;A_A*g-`t1Y4dO82+f;K79M|Bm>t zg&@MwAP}Amu{nzg3-dwnBgcUWG!XOE*APVPOUA%0cCcw%h&O~i_(K1?i>|LM*eMCC zsUpeHC^y0G2m!*y;hzswH`hp4Z>|fUw~B+TA)i)=iNoUm`)q&TN26=Lo0-z&?3}hY zriB7QuE2Sijo(0~GgCx$@e>$k(z6aV23oU)jd@}D%yB{o^04jC8G-V0t4h~jH#=DE z4K-5sQ=C2%<6ad-Sh@!awgX2$ufFa1Ll~4dZ`qYi2bmR-V!^v7(pK{=7<+#HS&WlG zBcGX?AIZAE5`VF=&Ysq7gH;|oBPVsVWeeTLwR0ng zn702_4VdALUq(u;6X(%+L%wr<+}CyQQciF_s~lGUk&zh3m(n;YCTFeXS&*Jd_HehWjIwP*b~g zh9>}N^nC+hJu&V(h^lIWZ9p$J?B|6}JT4qkt?q`yG&E$b^3o$7FhWv~=&b4^U{fYJ z_W}R|xwC>p*^W&#C}Tj*UrN#)q;_VncC*x+4_1>02C;KrG39TPIS3`nAhBQ{=u8s{ zW_}z()(YMi35vb!jwH-zL*grAQ@SBAgyAPY?GYG{6Pv9V^mt(*kz}EPOR(L6)yDCp zZKdP&Fi!qagaQa4%M%;n*I}gW&Hs1F)(DHk3Qbb&hTunx80viB|k8Fn!mpjz)?0eb3pn-LY zu*Y%VJC|`H-M?p%tOrZWnNdBE+o-faDngGu;3h!@Tq8Td7~%*%WXsG{uKO((QeV68 zP>WH5h$zYO)V4;9>H-QZtcs^kY&i5%g0XM9M8VK3GrF%w8s*7~9Lg5%<-K1mviB=8TITov6 z4dE3%J-XZ9JNAp-+i$~5jUYaQ8OMLE!1BtTacZE6&o>RJa3%P^VKA$vkFB4jv3gtO zpK;1*UeH^MB7%eNVi4q3nkr%ZF}In-SPNR*bPP6eJdR=_gxBxv(1S|9)r z@MZ2_G4OBVtry>#o!kbog@Xx|74_%-Mllb-zgz=AKZV>~TI(*%{vrvNT-Y$Cq1!8p zB7;t*Sz(h=>%#5g2x3Ctkg&0$x&t2(^KA!g3%x&~_$&#USI<4Ye$n^N4kdOhh!P-t zkfZ!9aJ6bbzs*iBaWWtoA}Sb#GM5 zfNqH*8}A`Ct8UZmCeaon$m(34oBzMMXVk+jF>^Og_tfl#-zjiSO|6T2;_x=tNH1EZ zm^zS;2ME~VH~8<(r;-0>8#bK!rOT+7E~3<(3zbnFFi%FqhFb)?_lFJZ(n2r8TUmME z2bdgwr{?_GPrxT-jUfFC2U7C{+=y#W+`Wq_1lkzoB(07=>(&X@Be+`K$6t}uNm;(u zU)uy563HR_1pZd!3Q_ETu61p(GVt_PG|RX&7JnIP@z%7^pwhkFu=IO8VavLmr`WM_j`w5pu#F-Z{BzFIFv>-X)Rio&uWNy+9aw`2 zqbKT?b${ZO2ekA6ob&^w!&S23EUN+gPt-ZFbHR!PZ@j}b0$)i{jgd08o4wYg9*B#2 z&W1{az(vu$Sg#tZEx#??M%Q5IHNbPj+|rIjQBC=XhNx+>%85LEF4e;%SzxTd6cDpKWnbEaiv-_4cNF$VFO( zHqyp2nc#9O&8uY31%&ZG^d8&}s6ui2Kp_KU`451Gm+%1A?e^0=)_+_3Q>UWc8A55o zYw1;=n~4i3f%BAEdR&Frj0iMOoR8FDE?P{u6~n#ent{s~Y}%^uuvY1&M`EpBSr-0W ziW9qTA1purV9FI#=yqzv!b)r)V#r7JSc=AK*={3?xq@0vFgln)1a`T2<&ObnVc@zz zBQySzBm?uGrWO${gTCb=CcmDLkC?Rz?U8Z;{>QcNYF*GwPt7sc;33csJblk=Sat9p zi4*gMxOArQoM9W!-lAX?;%e#Lewq*rlkgNA2=q)5hi#VQbU!X$xr05cyI*vlzA;}6 zK*HZeEwMK+D}4xX0p>xl-_+(tGhqBx^zDrP@*m7NeUOm9D*$)pI$g`e24NS91nEE3 zr&1rr`C~n<7YG_)J$bge0$;^Nb8V;eb@37s2Ig$jF1Y>;1@t%1*|2x@w?DyVhbnt+ zO}u)I57T@=n0`O%h5q}2k^f?U>d%rO~9Df0u77;5>JJGO94cXL-&?H<3`HN1bNKjqE`s$RH z7ZRj-gZ+NK8;LZn+3v}r(a>uAKq>RHa{Y7hNr6OOR8WGFlceQ4&gYqS zT1an~8hZ1kKG>3%8IQU;hZ4+LX2xH5w8Xr6;Eu?uFQvR&<-&1t0fy2_1u8RlzBaOb zwL*e1INGRb%iK3TtWDMYUxMwiNTc7j;yITCQ(mLWtta`n? z%o`D7OtT#o4GN=OdMA$9(P6~(iv@9fg9Mxk2wh~u?|%;sr5W&gsQ2noA) zJYNaCdej5^LpM^;NsHbB#ws)%?EXsFZC~zXJy~IzFLO2>)AKkJ= z{I^R1JtrO?V+x@KLG9y(_}%$v)Zm@WhIHaByiFnQVE(0#M4on#;P~Xy8)`=-nm^s5 zcLN#+dS|diVM^Bn5JNH@H z3|K4V=$o;~4Gx>pA;;B3+r_WFmw}v+lS4##>nIS|8_)#DD(Z!KewnbK2-LareW7@p zIOwlEBO!W{u^8z~Eelz>=!2ce-@-|#`zpitP>od~_hbXr{MfC5*7pO!S%r=oCEk5D zoEef!V}XMdTe;e?yPv@I2b9mFWjS?bvHWFLx6FB?r__5hhQ|1+@S<#dIlHJlBo>PF3CTLkW}B}mN^@vi6V)*pqadxaUXyzJ$L)(`dIC_Q0C!NV-N zZuyl@Xlz?s6)PJV?C`Z%qD(_UQY^2BM`i0B9Dd}(Z}x=5AN3ciKkTEiJ*En@`pwZv zUjrkA(U99s1l@S`1FEg$w!2R@!xC~cG{6&T-!aE0b4@S1UikiVU(mp~i}qj;X{(S5 z7||2hxa`#o2;s9Nwuu%7?1(RPO+)q7U}S3Rh|2sZu*a8I4jZ$bfd$H9K9mzG*b15B z-{`-yA>9i7f@>tfEAzfWdlpCmL01)nk(pJiMBKENobNJXKWy`Q{$QP65*wYN<~P=L z@x@t@ZQkwz@U*j1^~c`Ma-aT}W?jhSHkRgW4Z()T!`GeT)|n!K^_#e2!PQZ=sucCI+cWwwRi`b%xl|%Xf(uFBAuLE+mA!aw`XselNJr$fle) zl3-#WKF|^Nb9*bhocdHsc9_<)?=StQkwGZ^ z5UR<=tI=OWw#!NBkZk7rs4xT0tI(EW9`S5pC197mDz;nlXJO?Pk6TaKDENl|{8F!4 z0d2UYPD>a`midGBlI$wp(-{>sv;55{Hiy(g>5DD&6D5sD!}OTg z`w2NNo9tDuO{MXvsdW)r$BHV`c(ql}yQcMBWEk(EMc z!d*`d+w|tKz14z1gIFXz_{U4m0f-2gjhx-qh!&Zmq~Ma zcXt+X@H#|6E?tEaL3KkTk_Lwq8vgxxn+oZgf^?foF^?mq)lrEymRvTTEeR`pl(@2P zSqcj&Vt=dRg8}8eIWG?48Z^Z!zVy`T-R%B`i|06F`zSWMn)0)Of+eaCuQK-bFcxk+ zBic&y!;$yDm6OWAPg%a^Nk&tZj>L9uHast~&R&pv1{W=Kk{?gz7)Gy_$~)KL#O;89 z?R}13V7Qa@%<8TAudc3^a<-5mrN5`KDNv{>+<2FdV~tC|B{yI0A)ToDt%)CYT~_8Z zD{GW|7>gEv`V#c*{C~22TF=llCpR^DoTa-^pOTwLM7}>-;KlL4NH(LKheOergy)q0 z0QU=wTUNR`_FwDYko#ToqPLJyaCHQ&Rmx&RZ#GjFoLAW*VC3=IF6GmC>;nf8%}o-*gEli0r>L_1cpfeBXA-1g z)+y`4hQlup!?3=6cfNLD&RaL_((H-uI&V_h;+ttcRz?kK8L!4?#yv|F6RU@_In@dY z?Udemz2l!Oa`Q#)4@yqh2bUtRl=1^Nkevs%#>9k_|h zA;e`1ND8fNy6V^m_^jn7Vezr2dWlTbw*OKR!jHjs10OD_SIoQ1{ZNa6*vzW~I|6qg zhCRy0bx@AQqbjzh6B?5&Z=y0ML#Zu{WlbWGL}fuBC71!1!Q>j|+#YiX?zUc+5}wcW zr>sYoWunpsqa4k8zo)*75}ED-ka{arAZO`U``c>0}uBQr7> zW*6K1Y&C~XtV6`7hG>aT#L+J%M9kJ3^>|{KxXTc-GtjHQ3`K}mAI+-;|1EP(j86hp-RH8@OWc=4WG4bOSl3BF=F6+af z*ipDV0^>~BiU0KA5Rkb`lG4I1UB0Uc9|=lUI+Fsz*@ss$3Yh{q)D9z~r*iT!!$U)z zOyNq$o+aDgr?^!6M2WK(R&v8a3p}!BYUa1GiZeET>=LJvod+K=bR9)B&r&5!MLJ*a^-D10fSdn$WJRMlE8w1Lom>i{BrMYiawhpfBufM- zS{CK_!n1tkMwlU_>*{hZ_L5P}{%c=v<`y8RaO$2VTQ#>RFMQn{wLYY7^8UsB4-Cd6 zkN|HsiRLLY{eZwR3{c5Lz1Za6kSJ;+COz3`I8&7%O8~JQpo}YarW`MozfQsK>3#NU(oRHx5LRr*9MZ zgElh8z0g23awbo|!uX}lf9^UHEvL%SBUbf+`V>T ze)h!U^7ZH40=u0&ztHhNwB@%roHcd}Wyx;ZQRLYjc$&Ol?5$hXTn zEB8|fcT53(x_S@Fo*zZ3%vMbpz8}g@Jx2I??=p2wF#}H2RrZ=o!y`&scWf+SU@J>K zEWUFw)uI)ZE^lb-6u*Ian(r9Bp%e9c&w&O(?D0bfDi3(uJ(zf|1G*E%IL0?9#Am@J zY*YZz?^@sb^^k}pNLT?zeq45VB;E3H8@@7W#4}t;K!+?A=-4nDNykoJ-U%L>2p${3l)>PqLA#8u2~v$)99|KD@7&6;@idUhwEi zLjbz|32b~EVRo>gmN}p_!)LBIrowabS?#s;P%^It=jJdpyYe6dl}wxmyOEa)dCslt z&3$(P;LORLi(WUG!Rv@v_pv*pc*TnCG$)9s*(cF#11xytuR)j>@S^#uV3f1DV*%T! zrjTY2?W^O%rv)qF0u_Dzo*XLacEjQ$ygQTPFT_Fj6I2WVC|U`mTt<%6w6?$B3r{Qr zr7)`7s!20{SfE(askic;-4!va$pLmPCPmYRpP`QZ7YBT3=LzZ^t#bO4B!Q1T9YNOi zL_0`dnZ7bQ#Sl*k3Q{0_+x;=ZK-@zzu0NN>cl82(1D=QSNZrN}*u06_$VqYvTH51} zWoCnR5GOfW5Q1lnEHR=fCEpX^vl1uB{salJPdv8xkLyBsT=O(kB?u90zUdb)wbeB{ z8x4pY3_%6mSHf82&Dg=<;fC6*+^d=BST%|C!8vvTQJGsTs`{Gv#TI!~>R3+bl{-x| zY7RTroP;RWK^Co=%P(Zkg5n|&&BiMfIi_|3uq}ap85@`^rBDHf#;8Z+HWbYq!un}g zo00-kUNv=>1Q`9D7D?QxqnTgGc1#2mu+!(7 zd~jOL*G6)>TipClEXZZut<;lSo8@m1HWBGkM~_*hsoH=|e2_(-3|)ooQEt60mmDQC zhf#Ck?d#*~WUwC)GGCBt&~&PY*i|HIHg&N%)bu%2E)tn!7@W#xlJY*G=%D4dYNWj+ z@&X&Erx{?dBdkpn8mwO`({fygVRL%)1$jyV8`~mn zCtdp)rqX1D8_7;P<>xxR05<@y1FAEjt`zi0N*M}_C4sE4|_pszvS!?mYLYT}m z7NZ|6W&TqSB2|BD8MAHYU>U>>(Zv71zPztG$z!6{R;{wa41rzq7AOO(!de}>Yso`I zJB&OLF)Th&qQ)*3$dJ%5o955w+22TOc4ne$TkMa9_|lL&yoE?fvv0bX+|47oOW5dqDyd~b@0 z?IzH&{!`Pz;BQ^*9QNBZhCj{yMe;2yHSbld>T=KcMxKx5#e}}m8$0(|lnr8us=vAZ zNy9GND*3n!Vaj2h1FdB!8~j0=`a=+O+Skdl0$JNPIwpQxqEgH!wfSA;m67qQ7L~1I zo+XyNDoe`P%?3{0v;=hKV+ZPcau{O;qp69hKwTS&I2duSB5^nG(YR<=SMFJ zKN*S1#Yo3b_8ccBm3WB0-VWa$Wv5+Qw;F=L51t7+z{%q8=;~zX?y4WYV*EC?^Ll;6 z83!!X5&7{`@dVY@e;=7xvz~49Hjd4dL%sPYbjFfIg>4EDk?7dMWo~JLwM?GXI2ft9I3@u1>)(kFbb$PNCpM>r0C|9JY6i(zn%GqifRgGl64nk4M*Wew_wZsy zs9GzSF(bM-?)|iF8TRQ>c7sy+kKI#9U`f+PKRWo)(7shmRVPZ=EHwwkE0#|7sG4es zLbgWiqf(jg=|JhS2gR-!w2-MbpWr9HyYJZ;nIuQ31#zn0d^rnLMl|lXBiohUSoBboM?3?%v-p84Ng?SY?FbXic;|B;V{Qn0 z7o^74bc~0@pP<9T+kJ74?=19P)0S*?neRsNpZwx0kM0~%Nkk2+U<3!l;5b4!cfRcI z_rrxFoH0CG9^KimVLPI3ZJcM|0f9TV^U3lA7yI~uV|4v~>LmQ^F`OX(s-AtqT$DO$ zJ9qE)(MRb7OEoaDSTP3|hXeb<_otxZtHT7@a*}55+jVF`-=MDmX-nVsbhi-_mJ!x zQywpaE*1sDOrwMSEpsd=ze;;#G7nr)9L@giF8?3Q;}B4HiWw%WJW__?HGpVmWT;MTfDBbARuY)@ts^IC^B zVD=XH>^pj1hnT4x9W9``n&{1neV7f5sqF(6$Lz5hE2Cv`(6M5CY?Ls zvW8jbUCS$k9LcBhbgYT+xAJPL4DGjY1`#Wxd^=@L2c*ss9)6y{-KMTPkw5hFOIciN zz<}*0S8fP!86kRY(G3CUaCYEh8VIu~d2nSHUKV@8^lGUF#C)sb@>b57^`gYm zFC$n;jg}a*ocZg3y6U=C>`3b4{H)fYWjN+!%*q3(pz%cs;BoQUkp7XCQ`->{9ZQUgZsf<64svN(#DiXgEt&&kr}248L;EZZ>&_pq)%g97D!=yO$J9Oo zj*YaZb zv*st+ZWJuYv*}CzKF`U1YkP7}JK;uSyiY>t-w?qT0P}?zLl$h$}>ObC`bJl$4)u!&qEE}{J zi~ylxlymQT%eo6>px!89x9SC!jHIqv>PLD?mn9o?_#}2^S`Ib^(tC9;{Ra081f!P@ z3$dH~WuRdo067%+At8OqT$c{9ju-@0oj0s5&tT*F+zX-D6ZGap^}gkgA#stTvggt| zu2cCy)!hx#jqY+wGF7|s7r<f{pon1ESXs6nlxFI%4gUX`*Ok*4nu zuicGJVfzeUf5_IBfsW!qrfttPF2sh5#-P#GPfu5@iWJykO~NsG7@I9fZmQDYVwLj- z_TQ)7hrATidtor|4<&skL@h{O_8z44Ug~@z9RY*_)LS>S{d5h9L9#2-hQ{0EF?aeb zBNmPtq#L8}r}Xrd%IYV<`CzvTTO4IjtCqVuS`=5#_L9g5d6SjzC^?)JxEI3?f%+?b zaH5~RiIPGQr`49CEC8L-828`Vzz zV`sP+;iT^aGD8&Ggo(01;bvj2EG=GI{Qi|L5aMTO?Ss34-EnEDas3;g6cQ_NjY~-m zXdo6)jB{Rl%aE00XR?)EBDM)UdD_%bpNI;bx3V~h`Pvog2xxSMR==yA)!Ef|{-$Rk zC~wC7(;Zm9h$^+-Oe&lkM)5fPS#%Hu&&M8|H8oQb0UO`}rT{jTUl8ImB3=Sl#w@*be5z`pPH@&x z+jO|hVL<=@5fcHQO=@2~IzMWBI)dPt*jpK;34;&Y7~9D@_nvfd-B}`R(G0|GU21CL z83gtb>6)tUhb%$XML9I}qJ*xt9m%{j*Jc^h_0@wQvLIpqP|u~-uKLzLlF6T~E$-+} zkf||{w$~KNRHqs8#aq8x%=<8D)Wz>WGb`0UR8B+;7@x~T*I##0*NoBYRwv`Jc#-(5 zLZU1u0A#sgn`U~`gongfR)eeCA=AA}Z ziZds`$!@PQgAwDCaB&{RhmVt%;h|GL0+a1Ks0#Os!cic#%b!-XF!3|=(E-uiZKAr- zE9s@FgX-r3Jk)i37BKYX`N))2FFDmmt482Fm4-XC>r{-scyaNhfWAiFEd;x5K;M-T zzRuRYa63-NmO{&XlMPBh_ofdA+n!(IQNZLk?TvG2|1KV*7;8f{$eGbII}v+GRv~AM zbWNNbX{Bw2y89nn%H-pT_d{$~tp1AwdDOyk+C+} z1o(EZyKYs41=HVE)M^HK1k{Z<+9<*_K=P;R9D`#`;#%XVCd=)`@+T-m3Lou$>pJ}i ztXPMv30FPH?Jk#EKjvwf+15jg=A7U)t3YK#z`RZ;WrTWYVVEIT9E&qVPio4x@iaye zZ{!Y_;@FVY2krwnQ6-Ut)RYK-!UVdBaj+EX?@jXNCp;c|TLi$_X2JvW2$>KiwetN5 zdWOm8f^^^f^chtac`t{8Lb-7JIYXJ*JxT~p73MM8?}Ax^wm0sOjVcOVu-)6%7JpF@ z03s(+iB{(ZQ-!1kip_-kkHlMENFM_DeaOK}=hb(5FTm~{^sSqRLo=Q1 zeSnXN>UPCx7>+R%o7rT`heg`?MIh~w!14o|<>akK1z{ogd&pYzKK@1@fxG=tg3H0N zo;L!@27q$HQp7QW4eGTYAz@<1)c~hOA2BXKOARB7$K8{Yx!qbl!6aO23Kd?)jdR3D z2s(TFnvq6QhuKk&lO^~{W>Mul#fe^}8`86#%kN(#uxCZG9X7u`k*cFe1K&X7D6}#a zuR_&iHjKUvcIzn{)d$`o{&Sp<=pg}s%WJ0C>4=Vl+fqDO3Q~ZbT};ep_e&}UCZi%o z6jS&>At*PuzAO{(wwf(hc|a;=V=_n3rYmwOF$gFb2p9(KCiy4SZ!QJ2DZWQ)-%Hhlo97exg zGE9WC8))y;g>+a|w^r)QHH9^8L_1!GH3RFJu4JSq6}|2#0DmM8~&dj^J}< z&mOLrJ|+yc8NDrQv*_3bZTTlwwlI`p05IJWe$G!DJxWj2Z4i7lsY{%Uj1j?>#ykeJON@jVUxn8Bqsq$Id2;@#zxA9cEanXuIJAZ@jVhG+y7TBX{E?bIRp5CN4-Aql*{s^`gXkDb z?9BJHjk2aS8EK6{pT~Px*iC%PGqelVjn6^~&c`!jTw@9+@r5zD;o?;wb4xfelKMp+ zge+Ng9e2I)=s@_vtU|R3?w~aKKnW;j9={WnlaR#tGezttCmX}jy@j^4>Jurl9dpR* zbr8~Y-YKx$rx_6)dghSwFU6oxq-;4TT9w?~JOzrvH+lf{w}t%V&JBv<`KfQToE&w# zjE+E4Ip>r_i|&O5gt}#!aS@K-HAncFSE{IfCU09AIzNg#VVlHYI7UI0n6?p>eF`|c=(m;8_MCq588DZAT!Y0bT=D4p@u|rOMWSAogv^2tn7TW z$L5{ReG1@Z+Z^ z9LH0sQ$O>!H2&PjT7ULdd`hnI9Bk}@Rc0YPx2mh{|FBsZa-4Mrama5hZD^*%y`GyO=V>$Kd# zD4nfOF0?(rwJ)+Y33z5d37$`rHBm8r^<{*Kyh*m4%Q{{Rwq@mwZc`cA#y^cSzuH^e zJ5A0%7WbeEOdMRJGIE~+D}5bJS75n|3{f!oD1I(?U?`izaK!^N&ArLU$lOxE)IVMe z^Fw}I9*8{svSy!yoC^kx)(u*Q`}ZUO;srAJzbZkV)`U!27zUYz@xN`ry0Wuw zce`EITHXvP?TD!hzgfl;4jsH$g4+yQ2!45pUSv2cX2GaIU6t>&Xn%F!-fD)_)6`{y zO4_nQ3soVZIHilLU{5#~4IMIO@v0aZ{92g;gyww=Nk6Wui|M`*6}r1x><@BXO6~1P zLFofryq?cMzW}WbpY>k;-Eq~Qsn^2KWBX*|JBg(C7$wngTi8!r{(==_^5N8bHZ5$G%KmvttKQZOelQH_4NA1 zME==Cv_WKPgg=HT5q(N%P1(oI2u%)l9=iYnvYPjx&ZQ*o8l8>u(4q3u56=CpZRHNd zs;8^O=u%p5WrgqqxAfWqsea1H%YH}_)xS(K9CbS0CDpRL@W`a*yP{D!$3{9hqojs< zs-*h3OWkRN5W4o**U{jXK(|fVxH`T_3Nih4aIvv7@*8KjjJCh z1t}b{%j*K>2*ulFn4xjKk!nI2>iViHe5n#R1bETla_Y?brx?APQ@YeP+*D*@mUwW) zEvtBnKgtSZ%DZUYKQY*!ozZd)lIGIJjRYc4l=1jkuKS$808iuz8wIQs{2Rv-BtzGY zmB~Ki#NTU>l~n}_@}71w?Oz)gGwHr$-xEmmltv43Ts)Y-{(M7}FGjBp)bFoXo8Ih< z+fo?;Q03+`$MWKKNE8>l347Ueq6{BzI}#Wz*C^#h(fU8p8gJBkCA)Oah~ALv30JkkehrUq=I`?x2}kHe}+c}63(ecuY)VFkA5 zMkS1?aU69)TF|s$txfZ`IM8R})vF;ALd-xCgr-_ADoy)81i@HUw)88iAADoHPN}Vi#8oxZa$!IyX?Q4Xp zBx}uIk4m1&rZSSsWwm`Zqg#`T^nrc1PtP88qtzmFi{L7!OGV?!X1e^?G6+U=<2nP{ zhIMQKpjBpP5LIb|(Tj~0(zw$F?*BHFtP{{CHp_SVN7AgG%)3T(7OB%h;Pu|auHo%F zJ8i0-b8_e%0-XbqQDI@cx`M#LaF5G5bO@V7Mrs~Rm2EsK?(all2Prni=Kx3YdDY1D zZd^+Y;gJl@rJ~cp%NnZWJ+x3H=4CtndWum7`1a7oLF#A4KAhkhQF}lww)Ro%&B4yZsKvM zK;3_C@u*a<|IqR|gsrT<$zaL~OuU6jV1oYO^LgXXN&V+K%uY-1)m1rc$BY>hQ z$xHUAk!$U{^OpJ)cq4WRFBLc+KY!&l=FZqa$H#u0d|GM!$)tW4&>hT21p)-|=EhZUUd zxcyjf&R6YvmJ`Apav42osOVpbtVc8Vb2V^Z{d`{TbnsEO4JXcs)ki7D-#`YDXW>78RTyA!e)flzatO+%D-sK$(`A2#bwVK&pG;R9p8J%~E zzWlbzELhHd3@6o>EXnE}^I?qn6;H*bIa-%b9=l6Iv&4(FV;@EJOFpNxnr^0vNfAF~ zHA3$$;BXIDc5L)Zy?1+^Opt7kd(CU~>hZh@%Q}~pC7ga?!a(uL#&Fs(_ zXqa62m{(DH?;vIANHAiN&t#GQLt{w&OX=+5i=#+P6!iY9NlJ!&n<=J^T4AHC^nD%* z@m33C3m#Kfi8EG-YLU)yr(h2*74HkmOkFVVeicnma~MMVNXDh<+&uT5`{rR&1x~R{ zc^Fb^T$oXAQc7@UZgEY3bI(J2DjXDY>xPbA{TBc(3U<0e7a zFROE+66$=>8j5}mp0Tp03|2-KwIV&-mDOJbSg`eY3U}~qeQt3(8G909?y!HG*a)wwc z1GWNAdzgt4u`+jK_4(n=Gxz0Md$yE}2kO1G9%~hcDLZ)u1q9?i-@|(~QbhRz)d52b z#Cwd}el42Dxc1TD^etWQ&qiheRE|>_hwk29z0j_qsIDq8=BlQbZS|t6@S0m?dyjJV z*;^%JA|YuM*4ozx8t*9sZ}`zk-d#QLI{qzRLSmlSB&F;ifko0NB9B$tm@-7c3+dx}JxV?CiBC zPMlsDa$bo)@-=DVGVbLftpEISnE>@U9hy1S25bA}BqeLUUbg)Oi(Rf7fm9uD8Jp-l zXmK&!? zvNo>GLis)JWb~B)`!4sKq7Qf$!gTd@#SR5>1ce#9c^>qT$BI2{y-Q-eEy>WP;}&pvU+VlCd?xpac+ zVzQA}zaotcKTkGZ;Lpi&T^nIKqzPk}o|ryj{va3|q}{=YPisutx>ozOEQokTg6)=f zqAJ4)QpW0_UhB>m*RHUhIr_RKS#)1e=+M=h zMLl1f^A8C4;IA~LYoB~CB$lqe$=~Vh8yCtMS#muw^@JedlVw zM;8iNHcQ^^sV|Xb4)MQa?{{3U<%y2N75$WTy%#L)mu`pm2XQ3vJ}A58x4M3@_R&)1 zh=2C_>sJqI)ANKBrdQcwsuD)e+FxIbXMT|lj}9>WBC>qG=&SrYz1L3hQvCyKioBU$ z+h~%*F%LhX{#fh0ziusvEz4PA@7hp}f14!>X(ZE)T()c)E&ULg$za2`re;Jjc6;4(GY1>pz}?;A zTKr~QZ1Nba8T;BX@wA!Qt{iqRgKKB^aI?9oj?gjbz51X&n@CI0#%eD{admy%(SU!a z)%`>`O;#Iu>hN7=_ERaFal=fvudz}b3Y}F;$QtfWy+Oh*zhmV3Vx7KNd9hzC&yv3C ztp>E=fX@C{4`Ri5rTgRQ04y%Uq;8?ACVNa?U=O0%HXBF5b(1>#j|PG%CA!&y;Aq&OI?$}u@jx6PoHS8 zW}=>BgO~Z=l)S#lw^}G?W8p7hI5s(W`)Nah_G`MkUb(3b1GhVf2TwL0ku=(hb2hAP zRDER0-b;PXw1zmOnW5v<*Bi+cyHs`Tiw^4t87uwGP&kuYTNlla<= zMxB%C*Xe302b^7Z+@Jq^VAl;&SA6!!*~%9x`#!20Nv#&>UV@xA$eDed*if!9w9aM; z{Q8Ts8Aq%535nHq%*?QoGnpVjKEk#MrLh_o-EA0=~#C z%C&yxP~bC>$(YqcC8>*vPuVUuywCkfdVXIuHu)J8vUv%JRW8dBcHw0zu zoh}2vf_6Mb$mogyLnRFJ#=V&b&2&R1=%NI2NUK^HThY@=b25Kd7wNEP6U9cHOB=f| zqi%C8A+PsbtK0(RwHm{Hay?6l{?uQYh95P z&L| zN_37#)_I8zdc9ML`wa81nkB9aD>DSOSNkx&T6J%exT#d%l7)PBns=5#pPye0S2}CUY>Ic(!bFClwLKi8u;UT9eF4mDaXWHMp3Z-eIe)G7JkjH!SEqm9=@#+($|!;GkI17UW`0@ zzL$uPSu8uYyY_u(E}<;B`Oy34_xVgD&U-cU8?ZaI+DwW_8qSts9uM+XNf=4UP;)uh zmfW5&Vm`_|m^W~G!`U(^Lc@z*1Ez4F!fw!ih*0m( zXw=?1Ga28AkGh7zj_@}@#SbCStZXWZ)i zT9nCtosb;+t-B<@{A2nLHH?IPs~2tBsSb$=E#E$v>D;r>_$Ul3jr*KBUwnFqKCC?W zsiL^y>#0`{ba5ID&C;)T_@Wzl-*`Z3uM9HI9d3AdLUw}gYx_N2N4R;bjl&Z{Ml^ND zk?XT24Ia6{gnMy1fu`JcQqQ`W%3}q-Sk=wog0JqDQx<%07jtmXz*I?+x5hrJcIR<5 z?lHXrb^PRKgHHWHo7rjP8=Bt3xM7EU6DGz@KlSIbM^>te?_u?m4#!#C`x?`yU!~>h zm!>#EyOyJI|BWvTYL%Z&T~AQETxMJH+$$M;UVyE@Eb&a)&59EzDXE*5Yhol` z@*^)$OjE@OvgPgfKEi&*^L+a==485us$m9Somk5HlDe*39q(b{iU}+WFycd+&ZeSf zpW459@IiLS5Z%vy^kE1;w@*InL8g96>V3;b8C5g>hM5KSI}H*BP?&(?@lUL5GNd@OFiBPO3->FC);N`-f0)eYzR?uT7II5i-l1RaJ9bU z+C1Oy;eYI$#%I%fQ6*{Dme0(T>8i8ininU=-G@)a86^hr?q0mTqVH|n)G%_xxBm^T zbvK(n;5mGKOXD6+$1%ro*rbj z&RO50nFo8?%2P2ka5Luk01s4e_|2R|gjT%fn|T#(gPs$Mg-$XT9+>*JXv@&{iATY$ zrFADx$Iz9_`A{;vP^wj^ZS{1Ssj_K3^SJn!#;e%1C@F@!Eith@CeMTX&ztMkQ$0zhgW%Pb34Q~_4mC|dG(x0Aqg?= zyyTKl+4NQHw91ZHB(A&)o~k$$5{)Rh_0XHAlO1y6!vWv9#ohB?utRNK)hYH_cc~T# zBU84mX4;Q=JkQd4O*cvfG^8&FSvtryazGzh3>K51D9o6ie(u)eo`Xc%jgR_UuE)pN_o6nYB74%(5tys9Yf26bi$*`Gb z=XtiE3TwYi*4et;=pAb~iluivheoC8gF~9n&J?HAiMypy6zm?*KE)mS(cogz(Txjz z6|^r}xb~W28a!8M3uR)vV3c9GBsY<$b8`u5@j@ds~G#JDt;R_l^Y- zFs~gZ_ZJ_>8wqt@xRmN^p+@q!H~!V_p9a3jrs4|10_nf8;8=RW;R|D0&6nPOblBs*mhumK zo)}}*LOTsVx(Q@+HygDK#LpA#OzvnbT+rrTi`&TABj+Y1a!T>KhA;j3<8ricx|rh? z`|Cv_7vT?eHmZ&~x?`!^&R$wdRo={i=_@j>6_~okoaZ8!bJF+@UVWaCZ$5X}oTOQTeADE8uo+y2I>`*N{Z2I{Gd2yhdwVpU-)|&y6a^fAO{- z{#g1rx_?Dxc_-JUxwMSfe4+K!J`>INOfz)GUyH8j=&edWU(;Drc#oAlY3|9i^-8?O zUu3Otesty?m&QFYC8qHEq3Q1)vKDn9ZOeVj64|fg-x4wo8NH;B$Z2|$+%`VYygI1G zdaXH+pysNRf4sJpqI7h+Htf-pY^@uX`APe27qZrAl{(twZqlgj6q}~juPR`~J0GE- zkGvux&t49bH9S5-eMt>{R-pKLc9iS0bIy);5?+hO-!yeQsK8=>Qkb^yrf{d*!b4Jp5I!!+lkV zla0^IJSUTo>?2nnIqr&~GCMu4w0^9i^?i2w%P)$L(%)9z-Mw)$$!650)xld|wt9!= z%q^8((mjIC1MM8utdC|44phBkgVLob5Yg+nm3L+e8g`!g?y@Lh9@ct|w*({(YneYf zif&7SiANz$cRYB|g1xeGxjoWIlKYAVeW)*=G3C9>iHGiEHc!C#eTex7?D%iE{o z&Z~Lpvsajy@i7AeFQJ$BNecR|+D3`o>Z+Hlr^`N1wNyDrbN*9%c8}f2RqT}1(4*K- zi8-T=w!^CdNS#9^LK>$VAC|gSDJ0B>SGMe|x)gM6G#lM8jI*NYEMdLfc{uc--F*HX zruw{)?lcP@M952OT_ZOR_a^yV7s^nn(AcCD6CcaTs~Y3GRv35HKMpH1iRucyDw?Kc z9pg&tc6Z7=!O7H-HLbcr?L(%eRY#e+R=%liUnkZ5_D?(otJ5?`mI+W4Jj15A(g9fS zgwCCs3#99xe-T~5eAYjyL_A@VJMzU|+Q`+wsL<%u-Nf?!b4H`@6vg~BH7Ex7eakl1 z^CAlMv1cY+?iHuWG};RZrzckhSykjEuauqq zwA2_z&9f)_B(_nU?OuKacSO-wqP{qqzL{S|Q2lv}+f&QCb;?f@kC=!Y*vhtCqaPh# zNLMeJkmo8B$y4iPUfK3C)d=GDD#RV-TBXgG(m1U<{^g#V&f{BmH8bK; zO}Nf|m3sDEvni?42cZ8HyQH_etRJT>zv8vEKcku)-@(5PWW^4L(d%C_-Fa# z*>H`l5zbuof~C}5gtic<%;(cPx^epY7yDC~&ek1_#6v@7>JRJ;R-=~SLsbhcIKPU> z&dlGaZJa4x5?1klU`%@Th-Tq~$Pr@i(%>?_q~vDa zTjRl;n|^yq;%;M@mIiP2O11;$^qZA0ZB!WS_;IDv2#HUH4HndBnX&>o)R}uzQQ~(h zsGbexX^#P0n`JEf#h>#U^gPp-nJbeNSQILs5lNeQ5+N6-kWh~7xC>Y6Yg^<74N?-u?`t{kRs1Bpf^b!RdudEwkg37cNM@ZS zT8$~g4;!qy`+(N5XC{2RC(Ll&_pd&_`)9Z| z1#9&WW-izs)Jtey)!Ha5j95Kd)P87Fyc}}%^+m}0^}`;01v#Fa^L+wOBGVm5KAn1N zvHS6Gdc0djSe?v3TTW*HCGEP}QATcQPgGj({&1<5q}O_z9KmoWe)s02Sf`M6orQ>b z)itLHh%og5o(s|4l8p+LOrANLS2^1QQj2M^E@JPw>C}7nHgbhHOGYR4eNHXBZ6$TO zr}K0|A&2q+)7Ib>#&ZIN$5oBs6%p?{B!!b6I1GK9&nHwYakuVvSK^I32Uj?HjAG}C zT>#Tgr9%=_$7?(y3O1hrzj|)3<*bN5Lowd0($w*t6w36prNhcMB>Cj-Uo*r^Ne=sd2-jI2S>#`)c}!8d>EQdi>`Gtd(P6Ep zk5AlR5%Z@Kdr;)Z;(7MUs*%}~SWI`M0e8)r{4(Fqyi2~0?R*2_aVrl7Zv;UZ1j|Xa zXS{u;ZH%32-#`UJJl_F-xn!2&3dzYzKKI~-V@vaqQO0B4+)^WjXZ5IihefGexNOH? z&l+AEGvmd^PE=NAp1Q_l-JxR5`C@aYVn;Igw>yJZdIr@?QtpN%w3@KC=ip2y*j&e$ zU$z!K*=TfkjVt|vYCE~&cb**{W@g?N-#K%}R}>>OHhD(5uDg7FR+;ysb9&#xR0#_8 zArs@a{=gku+mA^=lqK%$W9PNxWqNPB{QNY{MDUJzgMssbB$ks7Zvx)bG|wx`Q*g_KB7tI4^9Vao1a8>5r(W5)x(H*^2Vw-O#Z&A9cT3~qNLBrR59hupISH}gA ztdV1%tFAMDdGUF6=dK;`oXY`x=yVtVMB6vXT@kik>iM_up=zeNVWo{tn_a}62iyex z^yJ&=k14|zo`fyrYd>kCyhiP^oAGJNLaE3Ma*Mw=;l>RX_cWjOW~YdQ((^RKoMR4N znh^J)uP@6@qpw!n(YRh|(W9)3x_q}OCz?M~^z>UcheW=hkbXv_wuJc$M8{i9YQ#(W zuqYbBBw-*@(e|WT;78`p+KTEg$v5(wsiSnSOmrS^!w7afJ*-E`nJa50dAL>CMd6KukU>kO|S5<7YGtK8X4-(7tE>?OgJZEcP(?7tM` zR(<^PNF`n2c3aN-t%-*UH^jeWrp^o5$y4^YW&yv2LArVLNNqd+?H#vo2oG;5jPfY# zo77XEhg>eZq112S`=PZhhJI80+$HxXZz|(!ww|!(IyFMiQ#xtAeT9>^(F?fCy7Y7? zYiif}lABL`R#27cp@i1KZr9x2Atl)K++^+EyVv>>T*8sMG;t9R&a^O&N>XBSij&<)B`=Ndb9$)eB6=9JdZX}g zeNJs32dt`W0{>wVmZv&zOxD3mK|H{dxbv~QXN`U3Pv5v#tM^i*zo#`>pT>lLn%S7+=tLW19aD!u zM8ih(4&Qsk{#@LtQ+2OTi1VL~rIc9i$tWn>aDhX{J*zX9oLny%8n`{tY+yHiUeI^d zr-b2fbCK*Q|+gT-li-iOp$er;B>bQr$H7QdsP;dMw{I9K|4zIQVmlO-Ilt)=bm+CO`W zIdg%-Fqql%+6?Rh(VFIlensOhof#fts{0*$tD<|=r(;w%N%nWcKAMiVp9=hhkAl&? zba|WX9osd0Hb-pkgIMJRIMgfc^a zBB63Y-9D}&I{Y?b?;!3;leALBQ(At8WAd7Vysrw`rbOQ0G%ky-RgW?oO@2LX|5*2I z>QMTpw4AK#$m(T@q*vxUS4?h*`+02?xHnmxLI`aPyG&}%w{qHN9B=LaC@IXUDx-BL zdEtHF0N?Jx5JYm`&}ta35Vn3W`^A%E9R5BGQVxUF=0@OmYg6nEv#W#+BFFBTOj?EeeU(IgjXN zb7DygD%lRt+DtSwWyhN>j^rPeco`hrJ3~!vb-JsqD>x}N;G*vJWiNO2%G+@!TC6a~ z+zEGvEh+YA=T}uDbB+#jU%wrJCqmS8O!LlQ2A6a;C0r{j?68-f`7W=F4M1PD4C}-Q zDJKi^>qCRt+4($Y>ZP9RNWU7pF*4fXVj+H(A^YuTM%4~<&>99~-o9$JY_MSYna}jf z%k|os*1aJUyU$6Lm+qkpA1oG=SOMk(%jvhFu~zAFu;@-9jkHuTgL&dqoZj?saYVD( z*1P0SDNiuPsV)`o4ZM}#6B)3<*`fyLc10eTRam87vYPKbXnSc4-Tmx3Ybj)>xpcw( zNM4qYbsxOfPoFryRkv)(7SG3_5Wf4-SD(KsbO}aoqcgJX@n^LUym_$7CVCt)Q@*Kv$Xxb@!K;n}tr=QOh(2FkmbFWmhD%0C*A_Fa z;+5c*yw)2PQ%3y#+Gm?KoQtWC3wR?K^2ax>Rt7*SB=Hfo{VT4kG;RC4Fnh|o-?<{R zyuy=N>qn2=yq(TA)%=QY_wD&%Wzj6 zc<^wIZxnk;)VZsNs&xW!>srY#Qr*LiRstMQL3f7U)v2v_zTjwit5g=OV~m11lzX4Q zAW1B_EVI%YRq}A>+Kmf)8IhcOPF`%9pq7*lS<>^c>Oj)%Yilo|b@{Tq1{ZrPVEtS+ zM@4<1P6Uzt)|5L}vr{FrWW5=Ch4npY*GJv>iRf^SZ0&|wjQdi=(FBV=3|kE)pM%e% z*wUlXL)o&}Cojhzh|$A5rqGIsclCQ&0tZK{TXZHkYLL?_hTQD-4k-SP=lS96{FP!< zm7bq&S;Lh#!lDfINAV|~dfT7!o8G#ci*kOj=c+o-uCK}GZcfV+FTd~X=Q^tWY$vC= z>`FFWJ3*OGPtuA?*-qwo02lOPN41)3_vA=mF#n@dI+Z$3O|54Hlk=n(NadKG-Po8t zZ6Vt1@94~&1I{RhWVkp-6LkVd6ZP&) zQC!NkIx)G^oZPiHTNMd$G&HU}98X8AZ;DyJn2^5oIkoO|@YOR=k>PpRNRCND&xJk4 zr#~Dma*pk}oYd30YglRMh$cc|QE@MUTU#EZ*=142_k#M%xP@gCf3Z>JGYu7cTBCW) zi#pAh?q%kWb#LFuzABj<&>vo;>c1!K^=S7|o$)B$Rtr0Z(3S=7@W?ZCglxou^SL!fr_@8?dHFR6Le zL@mbMSrct~hEl)X&9k$FBzkCfyZTs~|ztQvLzygG2u=wiG|d=H^Tp&otUkG{w}Jv|(4jk~nS?Bd{Q#{^?4DhhwCF$&oYLo1SxSJrt1+i(i_CTU6Z-zS3P)2;1Xzf~n~8Byy?d)<)80yvS{5?M z&1xl%+G$Q^m-^pU57@O*FnvlD?}q6G_$B=;PKPH9KX`b? zkn!%<#$)|Q=w!t>cB;W{JuI9&Q13e#iEyOT`z$ZA#J}svC27T|A(4TP7FC7?aV6sB zZy+)!E2U9V!y3(coCX*bRTjCKM)Aj6a+$-0-=C_KR=J(ZUFKh?v;OX{@E2J1VUZn?P&wZ zhgf<$liQ^F+2(g?K)ZiD{?N{M&hKo>zy-xCpx5991ag2#@b&`EJVX~SZ!(44Q&2AT zw?0#gx)L01fHHnp!XL*j29RwbrtRdK(hdX{&u=myzK#Uq_iONM2HcahZQKYhM39GS z(ACk+4!B_TbtMb^wc7^>+hsfiPa?74%SRgxr|0tCG%Unt+AT$oMuNS&XH`ms{`Yd>o zi>Djj#UJPl_zyT(ZM{9WRn2Hh0}_CP)61JY4d6A%1dIT%0Du=59XLJU0n&jFMH2oe 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 literal 0 HcmV?d00001 diff --git a/nodes_model_loading.py b/nodes_model_loading.py index d206413..ac1133a 100644 --- a/nodes_model_loading.py +++ b/nodes_model_loading.py @@ -508,7 +508,7 @@ class WanVideoVACEModelSelect: } RETURN_TYPES = ("VACEPATH",) - RETURN_NAMES = ("vace_model", ) + RETURN_NAMES = ("extra_model", ) FUNCTION = "getvacepath" CATEGORY = "WanVideoWrapper" DESCRIPTION = "VACE model to use when not using model that has it included, loaded from 'ComfyUI/models/diffusion_models'" @@ -518,6 +518,27 @@ class WanVideoVACEModelSelect: "path": folder_paths.get_full_path("diffusion_models", vace_model), } return (vace_model,) + +class WanVideoExtraModelSelect: + @classmethod + def INPUT_TYPES(s): + return { + "required": { + "extra_model": (folder_paths.get_filename_list("diffusion_models"), {"tooltip": "These models are loaded from the 'ComfyUI/models/diffusion_models' path to extra state dict to add to the main model"}), + }, + } + + RETURN_TYPES = ("VACEPATH",) + RETURN_NAMES = ("extra_model", ) + FUNCTION = "getvacepath" + CATEGORY = "WanVideoWrapper" + DESCRIPTION = "Extra model to load and add to the main model, ie. VACE or MTV Crafter 'ComfyUI/models/diffusion_models'" + + def getvacepath(self, extra_model): + extra_model = { + "path": folder_paths.get_full_path("diffusion_models", extra_model), + } + return (extra_model,) class WanVideoLoraBlockEdit: def __init__(self): @@ -883,7 +904,7 @@ class WanVideoModelLoader: "base_precision": (["fp32", "bf16", "fp16", "fp16_fast"], {"default": "bf16"}), "quantization": (["disabled", "fp8_e4m3fn", "fp8_e4m3fn_fast", "fp8_e4m3fn_scaled", "fp8_e4m3fn_scaled_fast", "fp8_e5m2", "fp8_e5m2_fast", "fp8_e5m2_scaled", "fp8_e5m2_scaled_fast"], {"default": "disabled", "tooltip": "optional quantization method"}), - "load_device": (["main_device", "offload_device"], {"default": "main_device", "tooltip": "Initial device to load the model to, NOT recommended with the larger models unless you have 48GB+ VRAM"}), + "load_device": (["main_device", "offload_device"], {"default": "offload_device", "tooltip": "Initial device to load the model to, NOT recommended with the larger models unless you have 48GB+ VRAM"}), }, "optional": { "attention_mode": ([ @@ -899,7 +920,7 @@ class WanVideoModelLoader: "block_swap_args": ("BLOCKSWAPARGS", ), "lora": ("WANVIDLORA", {"default": None}), "vram_management_args": ("VRAM_MANAGEMENTARGS", {"default": None, "tooltip": "Alternative offloading method from DiffSynth-Studio, more aggressive in reducing memory use than block swapping, but can be slower"}), - "vace_model": ("VACEPATH", {"default": None, "tooltip": "VACE model to use when not using model that has it included"}), + "extra_model": ("VACEPATH", {"default": None, "tooltip": "Extra model to add to the main model, ie. VACE or MTV Crafter"}), "fantasytalking_model": ("FANTASYTALKINGMODEL", {"default": None, "tooltip": "FantasyTalking model https://github.com/Fantasy-AMAP"}), "multitalk_model": ("MULTITALKMODEL", {"default": None, "tooltip": "Multitalk model"}), "fantasyportrait_model": ("FANTASYPORTRAITMODEL", {"default": None, "tooltip": "FantasyPortrait model"}), @@ -912,10 +933,11 @@ class WanVideoModelLoader: CATEGORY = "WanVideoWrapper" def loadmodel(self, model, base_precision, load_device, quantization, - compile_args=None, attention_mode="sdpa", block_swap_args=None, lora=None, vram_management_args=None, vace_model=None, + compile_args=None, attention_mode="sdpa", block_swap_args=None, lora=None, vram_management_args=None, extra_model=None, vace_model=None, fantasytalking_model=None, multitalk_model=None, fantasyportrait_model=None): assert not (vram_management_args is not None and block_swap_args is not None), "Can't use both block_swap_args and vram_management_args at the same time" - + if vace_model is not None: + extra_model = vace_model lora_low_mem_load = merge_loras = False if lora is not None: for l in lora: @@ -999,14 +1021,20 @@ class WanVideoModelLoader: if "vace_blocks.0.after_proj.weight" in sd and not "patch_embedding.weight" in sd: raise ValueError("You are attempting to load a VACE module as a WanVideo model, instead you should use the vace_model input and matching T2V base model") - if vace_model is not None: + if extra_model is not None: if gguf: - if not vace_model["path"].endswith(".gguf"): - raise ValueError("With GGUF main model the VACE module must also be a GGUF quantized, if the main model already has VACE included, you can disconnect the VACE module loader") - vace_sd = load_gguf_checkpoint(model_path) + if not extra_model["path"].endswith(".gguf"): + raise ValueError("With GGUF main model the extra model must also be a GGUF quantized, if the main model already has extra included, you can disconnect the extra model loader") + from diffusers.models.model_loading_utils import load_gguf_checkpoint + extra_sd = load_gguf_checkpoint(extra_model["path"]) + new_keys = {} + for k, v in extra_sd.items(): + if "vace" in k: + new_keys[k] = v + extra_sd = new_keys else: - vace_sd = load_torch_file(vace_model["path"], device=transformer_load_device, safe_load=True) - sd.update(vace_sd) + extra_sd = load_torch_file(extra_model["path"], device=transformer_load_device, safe_load=True) + sd.update(extra_sd) first_key = next(iter(sd)) if first_key.startswith("model.diffusion_model."): @@ -1630,6 +1658,7 @@ NODE_CLASS_MAPPINGS = { "WanVideoLoraBlockEdit": WanVideoLoraBlockEdit, "WanVideoTinyVAELoader": WanVideoTinyVAELoader, "WanVideoVACEModelSelect": WanVideoVACEModelSelect, + "WanVideoExtraModelSelect": WanVideoExtraModelSelect, "WanVideoLoraSelectMulti": WanVideoLoraSelectMulti, "WanVideoBlockSwap": WanVideoBlockSwap, "WanVideoVRAMManagement": WanVideoVRAMManagement, @@ -1646,6 +1675,7 @@ NODE_DISPLAY_NAME_MAPPINGS = { "WanVideoLoraBlockEdit": "WanVideo Lora Block Edit", "WanVideoTinyVAELoader": "WanVideo Tiny VAE Loader", "WanVideoVACEModelSelect": "WanVideo VACE Module Select", + "WanVideoExtraModelSelect": "WanVideo Extra Model Select", "WanVideoLoraSelectMulti": "WanVideo Lora Select Multi", "WanVideoBlockSwap": "WanVideo Block Swap", "WanVideoVRAMManagement": "WanVideo VRAM Management", From 61ec1ff641344bf943f75b01ce165c974daf406a Mon Sep 17 00:00:00 2001 From: kijai <40791699+kijai@users.noreply.github.com> Date: Tue, 19 Aug 2025 00:51:15 +0300 Subject: [PATCH 13/23] Create wanvideo_MTV_Crafter_example_WIP.json --- .../wanvideo_MTV_Crafter_example_WIP.json | 2275 +++++++++++++++++ 1 file changed, 2275 insertions(+) create mode 100644 example_workflows/wanvideo_MTV_Crafter_example_WIP.json diff --git a/example_workflows/wanvideo_MTV_Crafter_example_WIP.json b/example_workflows/wanvideo_MTV_Crafter_example_WIP.json new file mode 100644 index 0000000..98b8ff2 --- /dev/null +++ b/example_workflows/wanvideo_MTV_Crafter_example_WIP.json @@ -0,0 +1,2275 @@ +{ + "id": "7c6603fc-8871-4e88-a3dd-ac43e7650d8e", + "revision": 0, + "last_node_id": 198, + "last_link_id": 353, + "nodes": [ + { + "id": 158, + "type": "WanVideoVAELoader", + "pos": [ + -498.183349609375, + -1420.46484375 + ], + "size": [ + 270, + 82 + ], + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [ + { + "name": "compile_args", + "shape": 7, + "type": "WANCOMPILEARGS", + "link": null + } + ], + "outputs": [ + { + "name": "vae", + "type": "WANVAE", + "links": [ + 279, + 284 + ] + } + ], + "properties": { + "cnr_id": "ComfyUI-WanVideoWrapper", + "ver": "e4f422cf9952b13e8e2147c403ef7b5fed95920a", + "Node name for S&R": "WanVideoVAELoader" + }, + "widgets_values": [ + "wanvideo\\Wan2_1_VAE_bf16.safetensors", + "bf16" + ], + "color": "#322", + "bgcolor": "#533" + }, + { + "id": 172, + "type": "CLIPVisionLoader", + "pos": [ + -169.79689025878906, + -1124.9453125 + ], + "size": [ + 270, + 58 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "CLIP_VISION", + "type": "CLIP_VISION", + "links": [ + 301 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.3.50", + "Node name for S&R": "CLIPVisionLoader" + }, + "widgets_values": [ + "clip_vision_h.safetensors" + ], + "color": "#233", + "bgcolor": "#355" + }, + { + "id": 171, + "type": "WanVideoClipVisionEncode", + "pos": [ + -171.7789764404297, + -988.2925415039062 + ], + "size": [ + 280.9771423339844, + 262 + ], + "flags": {}, + "order": 25, + "mode": 0, + "inputs": [ + { + "name": "clip_vision", + "type": "CLIP_VISION", + "link": 301 + }, + { + "name": "image_1", + "type": "IMAGE", + "link": 344 + }, + { + "name": "image_2", + "shape": 7, + "type": "IMAGE", + "link": null + }, + { + "name": "negative_image", + "shape": 7, + "type": "IMAGE", + "link": null + } + ], + "outputs": [ + { + "name": "image_embeds", + "type": "WANVIDIMAGE_CLIPEMBEDS", + "links": [] + } + ], + "properties": { + "cnr_id": "ComfyUI-WanVideoWrapper", + "ver": "e4f422cf9952b13e8e2147c403ef7b5fed95920a", + "Node name for S&R": "WanVideoClipVisionEncode" + }, + "widgets_values": [ + 1, + 1, + "center", + "average", + true, + 0, + 0.5 + ], + "color": "#2a363b", + "bgcolor": "#3f5159" + }, + { + "id": 140, + "type": "NLFPredict", + "pos": [ + -722.2062377929688, + -439.0661926269531 + ], + "size": [ + 186.79513549804688, + 46 + ], + "flags": {}, + "order": 19, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "NLFMODEL", + "link": 245 + }, + { + "name": "images", + "type": "IMAGE", + "link": 294 + } + ], + "outputs": [ + { + "name": "pose_results", + "type": "NLFPRED", + "links": [ + 260 + ] + } + ], + "properties": { + "cnr_id": "ComfyUI-WanVideoWrapper", + "ver": "9a7dba06c13c79cf35d76a1837fd115fc247df43", + "Node name for S&R": "NLFPredict" + }, + "widgets_values": [] + }, + { + "id": 146, + "type": "LoadVQVAE", + "pos": [ + -494.146240234375, + -596.1441650390625 + ], + "size": [ + 324.502685546875, + 58 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "vqvae", + "type": "VQVAE", + "links": [ + 259 + ] + } + ], + "properties": { + "cnr_id": "ComfyUI-WanVideoWrapper", + "ver": "9a7dba06c13c79cf35d76a1837fd115fc247df43", + "Node name for S&R": "LoadVQVAE" + }, + "widgets_values": [ + "wanvideo\\MTV_Crafter_4DMoT_VQVAE_fp32.safetensors" + ], + "color": "#322", + "bgcolor": "#533" + }, + { + "id": 147, + "type": "MTVCrafterEncodePoses", + "pos": [ + -446.90484619140625, + -449.3239440917969 + ], + "size": [ + 245.973876953125, + 78 + ], + "flags": {}, + "order": 22, + "mode": 0, + "inputs": [ + { + "name": "vqvae", + "type": "VQVAE", + "link": 259 + }, + { + "name": "poses", + "type": "NLFPRED", + "link": 260 + } + ], + "outputs": [ + { + "name": "mtvcrafter_motion", + "type": "MTVCRAFTERMOTION", + "links": [ + 293 + ] + }, + { + "name": "pose_results", + "type": "NLFPRED", + "links": [ + 296 + ] + } + ], + "properties": { + "cnr_id": "ComfyUI-WanVideoWrapper", + "ver": "e4f422cf9952b13e8e2147c403ef7b5fed95920a", + "Node name for S&R": "MTVCrafterEncodePoses" + }, + "widgets_values": [], + "color": "#322", + "bgcolor": "#533" + }, + { + "id": 139, + "type": "DownloadAndLoadNLFModel", + "pos": [ + -1100.665771484375, + -593.3814086914062 + ], + "size": [ + 550.6461791992188, + 58 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "nlf_model", + "type": "NLFMODEL", + "links": [ + 245 + ] + } + ], + "properties": { + "cnr_id": "ComfyUI-WanVideoWrapper", + "ver": "9a7dba06c13c79cf35d76a1837fd115fc247df43", + "Node name for S&R": "DownloadAndLoadNLFModel" + }, + "widgets_values": [ + "https://github.com/isarandi/nlf/releases/download/v0.3.2/nlf_l_multi_0.3.2.torchscript" + ] + }, + { + "id": 175, + "type": "WanVideoContextOptions", + "pos": [ + 1080.3250732421875, + -1423.6617431640625 + ], + "size": [ + 275.783203125, + 202 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "reference_latent", + "shape": 7, + "type": "LATENT", + "link": null + } + ], + "outputs": [ + { + "name": "context_options", + "type": "WANVIDCONTEXT", + "links": [] + } + ], + "properties": { + "cnr_id": "ComfyUI-WanVideoWrapper", + "ver": "e4f422cf9952b13e8e2147c403ef7b5fed95920a", + "Node name for S&R": "WanVideoContextOptions" + }, + "widgets_values": [ + "uniform_standard", + 49, + 4, + 24, + true, + true, + "linear" + ] + }, + { + "id": 170, + "type": "VHS_VideoCombine", + "pos": [ + -98.18639373779297, + -390.89251708984375 + ], + "size": [ + 237.98948669433594, + 565.989501953125 + ], + "flags": {}, + "order": 27, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 297 + }, + { + "name": "audio", + "shape": 7, + "type": "AUDIO", + "link": null + }, + { + "name": "meta_batch", + "shape": 7, + "type": "VHS_BatchManager", + "link": null + }, + { + "name": "vae", + "shape": 7, + "type": "VAE", + "link": null + } + ], + "outputs": [ + { + "name": "Filenames", + "type": "VHS_FILENAMES", + "links": null + } + ], + "properties": { + "cnr_id": "comfyui-videohelpersuite", + "ver": "330bce6c3c0d47ebdedcc0348d9ab355707b7523", + "Node name for S&R": "VHS_VideoCombine" + }, + "widgets_values": { + "frame_rate": 16, + "loop_count": 0, + "filename_prefix": "NLFtest", + "format": "video/h264-mp4", + "pix_fmt": "yuv420p", + "crf": 19, + "save_metadata": true, + "trim_to_audio": false, + "pingpong": false, + "save_output": false, + "videopreview": { + "hidden": false, + "paused": false, + "params": { + "filename": "NLFtest_00010.mp4", + "subfolder": "", + "type": "temp", + "format": "video/h264-mp4", + "frame_rate": 16, + "workflow": "NLFtest_00010.png", + "fullpath": "N:\\AI\\ComfyUI\\temp\\NLFtest_00010.mp4" + } + } + } + }, + { + "id": 169, + "type": "DrawNLFPoses", + "pos": [ + -500.3387756347656, + -263.48956298828125 + ], + "size": [ + 270, + 82 + ], + "flags": {}, + "order": 24, + "mode": 0, + "inputs": [ + { + "name": "poses", + "type": "NLFPRED", + "link": 296 + }, + { + "name": "width", + "type": "INT", + "widget": { + "name": "width" + }, + "link": 322 + }, + { + "name": "height", + "type": "INT", + "widget": { + "name": "height" + }, + "link": 323 + } + ], + "outputs": [ + { + "name": "image", + "type": "IMAGE", + "links": [ + 297, + 336 + ] + } + ], + "properties": { + "cnr_id": "ComfyUI-WanVideoWrapper", + "ver": "e4f422cf9952b13e8e2147c403ef7b5fed95920a", + "Node name for S&R": "DrawNLFPoses" + }, + "widgets_values": [ + 1024, + 1024 + ] + }, + { + "id": 174, + "type": "ImageConcatMulti", + "pos": [ + 1450.1494140625, + -865.9163818359375 + ], + "size": [ + 270, + 150 + ], + "flags": {}, + "order": 28, + "mode": 0, + "inputs": [ + { + "name": "image_1", + "type": "IMAGE", + "link": 346 + }, + { + "name": "image_2", + "shape": 7, + "type": "IMAGE", + "link": 336 + } + ], + "outputs": [ + { + "name": "images", + "type": "IMAGE", + "links": [ + 339 + ] + } + ], + "properties": { + "cnr_id": "comfyui-kjnodes", + "ver": "2f7300dc546ec2d36fa8b0feebe493d41026524c" + }, + "widgets_values": [ + 2, + "down", + true, + null + ] + }, + { + "id": 186, + "type": "ImageConcatMulti", + "pos": [ + 1457.7677001953125, + -646.75439453125 + ], + "size": [ + 270, + 150 + ], + "flags": {}, + "order": 32, + "mode": 0, + "inputs": [ + { + "name": "image_1", + "type": "IMAGE", + "link": 338 + }, + { + "name": "image_2", + "shape": 7, + "type": "IMAGE", + "link": 339 + } + ], + "outputs": [ + { + "name": "images", + "type": "IMAGE", + "links": [ + 337 + ] + } + ], + "properties": { + "cnr_id": "comfyui-kjnodes", + "ver": "2f7300dc546ec2d36fa8b0feebe493d41026524c" + }, + "widgets_values": [ + 2, + "left", + true, + null + ] + }, + { + "id": 164, + "type": "WanVideoSetBlockSwap", + "pos": [ + -60.36056900024414, + -1537.5782470703125 + ], + "size": [ + 242.3073272705078, + 46 + ], + "flags": {}, + "order": 18, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "WANVIDEOMODEL", + "link": 351 + }, + { + "name": "block_swap_args", + "shape": 7, + "type": "BLOCKSWAPARGS", + "link": 290 + } + ], + "outputs": [ + { + "name": "model", + "type": "WANVIDEOMODEL", + "links": [ + 289 + ] + } + ], + "properties": { + "cnr_id": "ComfyUI-WanVideoWrapper", + "ver": "e4f422cf9952b13e8e2147c403ef7b5fed95920a", + "Node name for S&R": "WanVideoSetBlockSwap" + }, + "widgets_values": [], + "color": "#223", + "bgcolor": "#335" + }, + { + "id": 165, + "type": "WanVideoBlockSwap", + "pos": [ + -77.65693664550781, + -1804.4154052734375 + ], + "size": [ + 281.404296875, + 202 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "block_swap_args", + "type": "BLOCKSWAPARGS", + "links": [ + 290 + ] + } + ], + "properties": { + "cnr_id": "ComfyUI-WanVideoWrapper", + "ver": "e4f422cf9952b13e8e2147c403ef7b5fed95920a", + "Node name for S&R": "WanVideoBlockSwap" + }, + "widgets_values": [ + 10, + false, + false, + false, + 0, + 1, + false + ], + "color": "#223", + "bgcolor": "#335" + }, + { + "id": 190, + "type": "GetLatentRangeFromBatch", + "pos": [ + 625.1795043945312, + -400.8965148925781 + ], + "size": [ + 286.6646423339844, + 82 + ], + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "latents", + "type": "LATENT", + "link": null + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": null + } + ], + "properties": { + "cnr_id": "comfyui-kjnodes", + "ver": "876a6dd2929d88ec35c09c7cddc6c360f4b27013", + "Node name for S&R": "GetLatentRangeFromBatch" + }, + "widgets_values": [ + -1, + 1 + ] + }, + { + "id": 191, + "type": "GetImageRangeFromBatch", + "pos": [ + 487.84234619140625, + -205.70770263671875 + ], + "size": [ + 340.3267517089844, + 102 + ], + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "images", + "shape": 7, + "type": "IMAGE", + "link": null + }, + { + "name": "masks", + "shape": 7, + "type": "MASK", + "link": null + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": null + }, + { + "name": "MASK", + "type": "MASK", + "links": null + } + ], + "properties": { + "cnr_id": "comfyui-kjnodes", + "ver": "876a6dd2929d88ec35c09c7cddc6c360f4b27013", + "Node name for S&R": "GetImageRangeFromBatch" + }, + "widgets_values": [ + -1, + 1 + ] + }, + { + "id": 161, + "type": "WanVideoDecode", + "pos": [ + 1438.688232421875, + -1154.7078857421875 + ], + "size": [ + 270, + 198 + ], + "flags": {}, + "order": 31, + "mode": 0, + "inputs": [ + { + "name": "vae", + "type": "WANVAE", + "link": 284 + }, + { + "name": "samples", + "type": "LATENT", + "link": 285 + } + ], + "outputs": [ + { + "name": "images", + "type": "IMAGE", + "links": [ + 338 + ] + } + ], + "properties": { + "cnr_id": "ComfyUI-WanVideoWrapper", + "ver": "e4f422cf9952b13e8e2147c403ef7b5fed95920a", + "Node name for S&R": "WanVideoDecode" + }, + "widgets_values": [ + false, + 272, + 272, + 144, + 128, + "default" + ] + }, + { + "id": 193, + "type": "VHS_SplitImages", + "pos": [ + 524.53759765625, + -21.65776252746582 + ], + "size": [ + 210, + 118 + ], + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": null + } + ], + "outputs": [ + { + "name": "IMAGE_A", + "type": "IMAGE", + "links": [] + }, + { + "name": "A_count", + "type": "INT", + "links": null + }, + { + "name": "IMAGE_B", + "type": "IMAGE", + "links": null + }, + { + "name": "B_count", + "type": "INT", + "links": null + } + ], + "properties": { + "cnr_id": "comfyui-videohelpersuite", + "ver": "8e4d79471bf1952154768e8435a9300077b534fa", + "Node name for S&R": "VHS_SplitImages" + }, + "widgets_values": { + "split_index": -1 + } + }, + { + "id": 157, + "type": "WanVideoImageToVideoEncode", + "pos": [ + 218.52210998535156, + -1111.871826171875 + ], + "size": [ + 308.2320251464844, + 390 + ], + "flags": {}, + "order": 26, + "mode": 0, + "inputs": [ + { + "name": "vae", + "shape": 7, + "type": "WANVAE", + "link": 279 + }, + { + "name": "clip_embeds", + "shape": 7, + "type": "WANVIDIMAGE_CLIPEMBEDS", + "link": null + }, + { + "name": "start_image", + "shape": 7, + "type": "IMAGE", + "link": 349 + }, + { + "name": "end_image", + "shape": 7, + "type": "IMAGE", + "link": null + }, + { + "name": "control_embeds", + "shape": 7, + "type": "WANVIDIMAGE_EMBEDS", + "link": null + }, + { + "name": "temporal_mask", + "shape": 7, + "type": "MASK", + "link": null + }, + { + "name": "extra_latents", + "shape": 7, + "type": "LATENT", + "link": null + }, + { + "name": "add_cond_latents", + "shape": 7, + "type": "ADD_COND_LATENTS", + "link": null + }, + { + "name": "width", + "type": "INT", + "widget": { + "name": "width" + }, + "link": 307 + }, + { + "name": "height", + "type": "INT", + "widget": { + "name": "height" + }, + "link": 308 + }, + { + "name": "num_frames", + "type": "INT", + "widget": { + "name": "num_frames" + }, + "link": 321 + } + ], + "outputs": [ + { + "name": "image_embeds", + "type": "WANVIDIMAGE_EMBEDS", + "links": [ + 291 + ] + } + ], + "properties": { + "cnr_id": "ComfyUI-WanVideoWrapper", + "ver": "e4f422cf9952b13e8e2147c403ef7b5fed95920a", + "Node name for S&R": "WanVideoImageToVideoEncode" + }, + "widgets_values": [ + 608, + 1088, + 121, + 0.03, + 1, + 1, + true, + true, + false + ], + "color": "#322", + "bgcolor": "#533" + }, + { + "id": 188, + "type": "Reroute", + "pos": [ + -264.114013671875, + -1282.322509765625 + ], + "size": [ + 75, + 26 + ], + "flags": {}, + "order": 23, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 343 + } + ], + "outputs": [ + { + "name": "", + "type": "IMAGE", + "links": [ + 344, + 346, + 349 + ] + } + ], + "properties": { + "showOutputText": false, + "horizontal": false + } + }, + { + "id": 160, + "type": "ImageResizeKJv2", + "pos": [ + -1132.5859375, + -1305.7125244140625 + ], + "size": [ + 270, + 336 + ], + "flags": {}, + "order": 20, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 280 + }, + { + "name": "mask", + "shape": 7, + "type": "MASK", + "link": null + }, + { + "name": "width", + "type": "INT", + "widget": { + "name": "width" + }, + "link": 316 + }, + { + "name": "height", + "type": "INT", + "widget": { + "name": "height" + }, + "link": 317 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 343 + ] + }, + { + "name": "width", + "type": "INT", + "links": [ + 307 + ] + }, + { + "name": "height", + "type": "INT", + "links": [ + 308 + ] + }, + { + "name": "mask", + "type": "MASK", + "links": null + } + ], + "properties": { + "cnr_id": "comfyui-kjnodes", + "ver": "2f7300dc546ec2d36fa8b0feebe493d41026524c", + "Node name for S&R": "ImageResizeKJv2" + }, + "widgets_values": [ + 640, + 640, + "lanczos", + "pad", + "255,255,255", + "center", + 2, + "cpu", + "Output: 1 x 640 x 640 | 4.69MB" + ] + }, + { + "id": 155, + "type": "WanVideoSetLoRAs", + "pos": [ + 359.7154541015625, + -1536.7674560546875 + ], + "size": [ + 174.53378295898438, + 46 + ], + "flags": {}, + "order": 21, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "WANVIDEOMODEL", + "link": 289 + }, + { + "name": "lora", + "shape": 7, + "type": "WANVIDLORA", + "link": 277 + } + ], + "outputs": [ + { + "name": "model", + "type": "WANVIDEOMODEL", + "links": [ + 276 + ] + } + ], + "properties": { + "cnr_id": "ComfyUI-WanVideoWrapper", + "ver": "e4f422cf9952b13e8e2147c403ef7b5fed95920a", + "Node name for S&R": "WanVideoSetLoRAs" + }, + "widgets_values": [], + "color": "#223", + "bgcolor": "#335" + }, + { + "id": 156, + "type": "WanVideoLoraSelect", + "pos": [ + 258.90850830078125, + -1785.316650390625 + ], + "size": [ + 648.00537109375, + 150 + ], + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "prev_lora", + "shape": 7, + "type": "WANVIDLORA", + "link": null + }, + { + "name": "blocks", + "shape": 7, + "type": "SELECTEDBLOCKS", + "link": null + } + ], + "outputs": [ + { + "name": "lora", + "type": "WANVIDLORA", + "links": [ + 277 + ] + } + ], + "properties": { + "cnr_id": "ComfyUI-WanVideoWrapper", + "ver": "e4f422cf9952b13e8e2147c403ef7b5fed95920a", + "Node name for S&R": "WanVideoLoraSelect" + }, + "widgets_values": [ + "lightx2v_I2V_not_clamped_rank_64_fp16_00001_.safetensors", + 1, + false, + false + ], + "color": "#223", + "bgcolor": "#335" + }, + { + "id": 138, + "type": "VHS_LoadVideo", + "pos": [ + -1801.016845703125, + -651.8135375976562 + ], + "size": [ + 408.2240295410156, + 996.921630859375 + ], + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "meta_batch", + "shape": 7, + "type": "VHS_BatchManager", + "link": null + }, + { + "name": "vae", + "shape": 7, + "type": "VAE", + "link": null + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 341 + ] + }, + { + "name": "frame_count", + "type": "INT", + "links": [ + 321 + ] + }, + { + "name": "audio", + "type": "AUDIO", + "links": null + }, + { + "name": "video_info", + "type": "VHS_VIDEOINFO", + "links": null + } + ], + "properties": { + "cnr_id": "comfyui-videohelpersuite", + "ver": "330bce6c3c0d47ebdedcc0348d9ab355707b7523", + "Node name for S&R": "VHS_LoadVideo" + }, + "widgets_values": { + "video": "MTV_crafter_example_pose_00001.mp4", + "force_rate": 0, + "custom_width": 0, + "custom_height": 0, + "frame_load_cap": 49, + "skip_first_frames": 0, + "select_every_nth": 1, + "format": "AnimateDiff", + "choose video to upload": "image", + "videopreview": { + "hidden": false, + "paused": false, + "params": { + "filename": "MTV_crafter_example_pose_00001.mp4", + "type": "input", + "format": "video/mp4", + "force_rate": 0, + "custom_width": 0, + "custom_height": 0, + "frame_load_cap": 49, + "skip_first_frames": 0, + "select_every_nth": 1 + } + } + } + }, + { + "id": 144, + "type": "ImageResizeKJv2", + "pos": [ + -1095.5374755859375, + -422.9293212890625 + ], + "size": [ + 270, + 336 + ], + "flags": {}, + "order": 17, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 341 + }, + { + "name": "mask", + "shape": 7, + "type": "MASK", + "link": null + }, + { + "name": "width", + "type": "INT", + "widget": { + "name": "width" + }, + "link": 318 + }, + { + "name": "height", + "type": "INT", + "widget": { + "name": "height" + }, + "link": 319 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 294 + ] + }, + { + "name": "width", + "type": "INT", + "links": [ + 316, + 322 + ] + }, + { + "name": "height", + "type": "INT", + "links": [ + 317, + 323 + ] + }, + { + "name": "mask", + "type": "MASK", + "links": null + } + ], + "properties": { + "cnr_id": "comfyui-kjnodes", + "ver": "2f7300dc546ec2d36fa8b0feebe493d41026524c", + "Node name for S&R": "ImageResizeKJv2" + }, + "widgets_values": [ + 832, + 480, + "lanczos", + "pad", + "0, 0, 0", + "center", + 2, + "cpu", + "Output: 49 x 640 x 640 | 229.69MB" + ] + }, + { + "id": 162, + "type": "VHS_VideoCombine", + "pos": [ + 1848.469970703125, + -1164.3343505859375 + ], + "size": [ + 1004.5999755859375, + 1004.3999633789062 + ], + "flags": {}, + "order": 33, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 337 + }, + { + "name": "audio", + "shape": 7, + "type": "AUDIO", + "link": null + }, + { + "name": "meta_batch", + "shape": 7, + "type": "VHS_BatchManager", + "link": null + }, + { + "name": "vae", + "shape": 7, + "type": "VAE", + "link": null + } + ], + "outputs": [ + { + "name": "Filenames", + "type": "VHS_FILENAMES", + "links": null + } + ], + "properties": { + "cnr_id": "comfyui-videohelpersuite", + "ver": "330bce6c3c0d47ebdedcc0348d9ab355707b7523", + "Node name for S&R": "VHS_VideoCombine" + }, + "widgets_values": { + "frame_rate": 16, + "loop_count": 0, + "filename_prefix": "WanVideo_MTV_Crafter", + "format": "video/h264-mp4", + "pix_fmt": "yuv420p", + "crf": 19, + "save_metadata": true, + "trim_to_audio": false, + "pingpong": false, + "save_output": false, + "videopreview": { + "hidden": false, + "paused": false, + "params": { + "filename": "WanVideo_MTV_Crafter_00012.mp4", + "subfolder": "", + "type": "temp", + "format": "video/h264-mp4", + "frame_rate": 16, + "workflow": "WanVideo_MTV_Crafter_00012.png", + "fullpath": "N:\\AI\\ComfyUI\\temp\\WanVideo_MTV_Crafter_00012.mp4" + } + } + } + }, + { + "id": 154, + "type": "WanVideoSampler", + "pos": [ + 1072.934814453125, + -1081.7371826171875 + ], + "size": [ + 327.80859375, + 1011.80859375 + ], + "flags": {}, + "order": 30, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "WANVIDEOMODEL", + "link": 276 + }, + { + "name": "image_embeds", + "type": "WANVIDIMAGE_EMBEDS", + "link": 292 + }, + { + "name": "text_embeds", + "shape": 7, + "type": "WANVIDEOTEXTEMBEDS", + "link": 287 + }, + { + "name": "samples", + "shape": 7, + "type": "LATENT", + "link": null + }, + { + "name": "feta_args", + "shape": 7, + "type": "FETAARGS", + "link": null + }, + { + "name": "context_options", + "shape": 7, + "type": "WANVIDCONTEXT", + "link": null + }, + { + "name": "cache_args", + "shape": 7, + "type": "CACHEARGS", + "link": null + }, + { + "name": "flowedit_args", + "shape": 7, + "type": "FLOWEDITARGS", + "link": null + }, + { + "name": "slg_args", + "shape": 7, + "type": "SLGARGS", + "link": null + }, + { + "name": "loop_args", + "shape": 7, + "type": "LOOPARGS", + "link": null + }, + { + "name": "experimental_args", + "shape": 7, + "type": "EXPERIMENTALARGS", + "link": null + }, + { + "name": "sigmas", + "shape": 7, + "type": "SIGMAS", + "link": null + }, + { + "name": "unianimate_poses", + "shape": 7, + "type": "UNIANIMATE_POSE", + "link": null + }, + { + "name": "fantasytalking_embeds", + "shape": 7, + "type": "FANTASYTALKING_EMBEDS", + "link": null + }, + { + "name": "uni3c_embeds", + "shape": 7, + "type": "UNI3C_EMBEDS", + "link": null + }, + { + "name": "multitalk_embeds", + "shape": 7, + "type": "MULTITALK_EMBEDS", + "link": null + }, + { + "name": "freeinit_args", + "shape": 7, + "type": "FREEINITARGS", + "link": null + } + ], + "outputs": [ + { + "name": "samples", + "type": "LATENT", + "links": [ + 285 + ] + }, + { + "name": "denoised_samples", + "type": "LATENT", + "links": null + } + ], + "properties": { + "cnr_id": "ComfyUI-WanVideoWrapper", + "ver": "e4f422cf9952b13e8e2147c403ef7b5fed95920a", + "Node name for S&R": "WanVideoSampler" + }, + "widgets_values": [ + 6, + 1, + 5, + 0, + "fixed", + true, + "dpm++_sde", + 0, + 1, + false, + "comfy", + 0, + -1, + false + ] + }, + { + "id": 197, + "type": "WanVideoModelLoader", + "pos": [ + -818.532958984375, + -1800.3616943359375 + ], + "size": [ + 602.063720703125, + 294 + ], + "flags": {}, + "order": 16, + "mode": 0, + "inputs": [ + { + "name": "compile_args", + "shape": 7, + "type": "WANCOMPILEARGS", + "link": null + }, + { + "name": "block_swap_args", + "shape": 7, + "type": "BLOCKSWAPARGS", + "link": null + }, + { + "name": "lora", + "shape": 7, + "type": "WANVIDLORA", + "link": null + }, + { + "name": "vram_management_args", + "shape": 7, + "type": "VRAM_MANAGEMENTARGS", + "link": null + }, + { + "name": "extra_model", + "shape": 7, + "type": "VACEPATH", + "link": 353 + }, + { + "name": "fantasytalking_model", + "shape": 7, + "type": "FANTASYTALKINGMODEL", + "link": null + }, + { + "name": "multitalk_model", + "shape": 7, + "type": "MULTITALKMODEL", + "link": null + }, + { + "name": "fantasyportrait_model", + "shape": 7, + "type": "FANTASYPORTRAITMODEL", + "link": null + } + ], + "outputs": [ + { + "name": "model", + "type": "WANVIDEOMODEL", + "links": [ + 351 + ] + } + ], + "properties": { + "cnr_id": "ComfyUI-WanVideoWrapper", + "ver": "0b1fa14adec48f84adf565dc5616c3a9c7ef95c2", + "Node name for S&R": "WanVideoModelLoader" + }, + "widgets_values": [ + "WanVideo\\fp8_scaled_kj\\I2V\\Wan2_1-I2V-14B-MAGREF_fp8_e4m3fn_scaled_KJ.safetensors", + "fp16_fast", + "disabled", + "offload_device", + "sageattn" + ], + "color": "#223", + "bgcolor": "#335" + }, + { + "id": 198, + "type": "WanVideoExtraModelSelect", + "pos": [ + -1360.404541015625, + -1698.273193359375 + ], + "size": [ + 490.187744140625, + 58 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "extra_model", + "type": "VACEPATH", + "links": [ + 353 + ] + } + ], + "properties": { + "cnr_id": "ComfyUI-WanVideoWrapper", + "ver": "0b1fa14adec48f84adf565dc5616c3a9c7ef95c2", + "Node name for S&R": "WanVideoExtraModelSelect" + }, + "widgets_values": [ + "WanVideo\\MTVCrafter\\Wan2_1_MTV-Crafter_motion_adapter_bf16.safetensors" + ] + }, + { + "id": 159, + "type": "LoadImage", + "pos": [ + -1522.158203125, + -1306.342529296875 + ], + "size": [ + 346.12261962890625, + 537.36181640625 + ], + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 280 + ] + }, + { + "name": "MASK", + "type": "MASK", + "links": null + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.3.50", + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "example.png", + "image" + ] + }, + { + "id": 163, + "type": "WanVideoTextEncodeCached", + "pos": [ + 586.0681762695312, + -1102.898193359375 + ], + "size": [ + 400, + 302 + ], + "flags": {}, + "order": 13, + "mode": 0, + "inputs": [ + { + "name": "extender_args", + "shape": 7, + "type": "WANVIDEOPROMPTEXTENDER_ARGS", + "link": null + } + ], + "outputs": [ + { + "name": "text_embeds", + "type": "WANVIDEOTEXTEMBEDS", + "links": [ + 287 + ] + }, + { + "name": "negative_text_embeds", + "type": "WANVIDEOTEXTEMBEDS", + "links": null + }, + { + "name": "positive_prompt", + "type": "STRING", + "links": null + } + ], + "properties": { + "cnr_id": "ComfyUI-WanVideoWrapper", + "ver": "e4f422cf9952b13e8e2147c403ef7b5fed95920a", + "Node name for S&R": "WanVideoTextEncodeCached" + }, + "widgets_values": [ + "umt5_xxl_fp16.safetensors", + "bf16", + "animated character", + "bad quality video", + "disabled", + true, + "gpu" + ], + "color": "#432", + "bgcolor": "#653" + }, + { + "id": 176, + "type": "INTConstant", + "pos": [ + -1923.911376953125, + -980.3076171875 + ], + "size": [ + 210, + 58 + ], + "flags": {}, + "order": 14, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "value", + "type": "INT", + "links": [ + 318 + ] + } + ], + "title": "Width", + "properties": { + "cnr_id": "comfyui-kjnodes", + "ver": "876a6dd2929d88ec35c09c7cddc6c360f4b27013", + "Node name for S&R": "INTConstant" + }, + "widgets_values": [ + 640 + ], + "color": "#1b4669", + "bgcolor": "#29699c" + }, + { + "id": 177, + "type": "INTConstant", + "pos": [ + -1924.9029541015625, + -848.5099487304688 + ], + "size": [ + 210, + 58 + ], + "flags": {}, + "order": 15, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "value", + "type": "INT", + "links": [ + 319 + ] + } + ], + "title": "Height", + "properties": { + "cnr_id": "comfyui-kjnodes", + "ver": "876a6dd2929d88ec35c09c7cddc6c360f4b27013", + "Node name for S&R": "INTConstant" + }, + "widgets_values": [ + 640 + ], + "color": "#1b4669", + "bgcolor": "#29699c" + }, + { + "id": 167, + "type": "WanVideoAddMTVMotion", + "pos": [ + 227.9759979248047, + -651.407958984375 + ], + "size": [ + 289.751953125, + 126 + ], + "flags": {}, + "order": 29, + "mode": 0, + "inputs": [ + { + "name": "embeds", + "type": "WANVIDIMAGE_EMBEDS", + "link": 291 + }, + { + "name": "mtv_crafter_motion", + "type": "MTVCRAFTERMOTION", + "link": 293 + } + ], + "outputs": [ + { + "name": "image_embeds", + "type": "WANVIDIMAGE_EMBEDS", + "links": [ + 292 + ] + } + ], + "properties": { + "cnr_id": "ComfyUI-WanVideoWrapper", + "ver": "e4f422cf9952b13e8e2147c403ef7b5fed95920a", + "Node name for S&R": "WanVideoAddMTVMotion" + }, + "widgets_values": [ + 1.2, + 0, + 1 + ], + "color": "#323", + "bgcolor": "#535" + } + ], + "links": [ + [ + 245, + 139, + 0, + 140, + 0, + "NLFMODEL" + ], + [ + 259, + 146, + 0, + 147, + 0, + "VQVAE" + ], + [ + 260, + 140, + 0, + 147, + 1, + "NLFPRED" + ], + [ + 276, + 155, + 0, + 154, + 0, + "WANVIDEOMODEL" + ], + [ + 277, + 156, + 0, + 155, + 1, + "WANVIDLORA" + ], + [ + 279, + 158, + 0, + 157, + 0, + "WANVAE" + ], + [ + 280, + 159, + 0, + 160, + 0, + "IMAGE" + ], + [ + 284, + 158, + 0, + 161, + 0, + "WANVAE" + ], + [ + 285, + 154, + 0, + 161, + 1, + "LATENT" + ], + [ + 287, + 163, + 0, + 154, + 2, + "WANVIDEOTEXTEMBEDS" + ], + [ + 289, + 164, + 0, + 155, + 0, + "WANVIDEOMODEL" + ], + [ + 290, + 165, + 0, + 164, + 1, + "BLOCKSWAPARGS" + ], + [ + 291, + 157, + 0, + 167, + 0, + "WANVIDIMAGE_EMBEDS" + ], + [ + 292, + 167, + 0, + 154, + 1, + "WANVIDIMAGE_EMBEDS" + ], + [ + 293, + 147, + 0, + 167, + 1, + "MTVCRAFTERMOTION" + ], + [ + 294, + 144, + 0, + 140, + 1, + "IMAGE" + ], + [ + 296, + 147, + 1, + 169, + 0, + "NLFPRED" + ], + [ + 297, + 169, + 0, + 170, + 0, + "IMAGE" + ], + [ + 301, + 172, + 0, + 171, + 0, + "CLIP_VISION" + ], + [ + 307, + 160, + 1, + 157, + 8, + "INT" + ], + [ + 308, + 160, + 2, + 157, + 9, + "INT" + ], + [ + 316, + 144, + 1, + 160, + 2, + "INT" + ], + [ + 317, + 144, + 2, + 160, + 3, + "INT" + ], + [ + 318, + 176, + 0, + 144, + 2, + "INT" + ], + [ + 319, + 177, + 0, + 144, + 3, + "INT" + ], + [ + 321, + 138, + 1, + 157, + 10, + "INT" + ], + [ + 322, + 144, + 1, + 169, + 1, + "INT" + ], + [ + 323, + 144, + 2, + 169, + 2, + "INT" + ], + [ + 336, + 169, + 0, + 174, + 1, + "IMAGE" + ], + [ + 337, + 186, + 0, + 162, + 0, + "IMAGE" + ], + [ + 338, + 161, + 0, + 186, + 0, + "IMAGE" + ], + [ + 339, + 174, + 0, + 186, + 1, + "IMAGE" + ], + [ + 341, + 138, + 0, + 144, + 0, + "IMAGE" + ], + [ + 343, + 160, + 0, + 188, + 0, + "*" + ], + [ + 344, + 188, + 0, + 171, + 1, + "IMAGE" + ], + [ + 346, + 188, + 0, + 174, + 0, + "IMAGE" + ], + [ + 349, + 188, + 0, + 157, + 2, + "IMAGE" + ], + [ + 351, + 197, + 0, + 164, + 0, + "WANVIDEOMODEL" + ], + [ + 353, + 198, + 0, + 197, + 4, + "VACEPATH" + ] + ], + "groups": [], + "config": {}, + "extra": { + "ds": { + "scale": 0.6115909044841946, + "offset": [ + 830.4699444221586, + 1344.358206307376 + ] + }, + "frontendVersion": "1.26.3", + "node_versions": { + "ComfyUI-WanVideoWrapper": "f8f423eceeadf2edcb58fab73701333e83ca733e", + "comfy-core": "0.3.26", + "ComfyUI_essentials": "76e9d1e4399bd025ce8b12c290753d58f9f53e93", + "ComfyUI-KJNodes": "a5bd3c86c8ed6b83c55c2d0e7a59515b15a0137f", + "ComfyUI-VideoHelperSuite": "0a75c7958fe320efcb052f1d9f8451fd20c730a8" + }, + "VHS_latentpreview": true, + "VHS_latentpreviewrate": 0, + "VHS_MetadataImage": true, + "VHS_KeepIntermediate": true + }, + "version": 0.4 +} \ No newline at end of file From daa638befb6c6cb49b5547994c977494174db474 Mon Sep 17 00:00:00 2001 From: kijai <40791699+kijai@users.noreply.github.com> Date: Tue, 19 Aug 2025 01:04:26 +0300 Subject: [PATCH 14/23] fix UniAnimate --- nodes.py | 4 ++-- nodes_model_loading.py | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/nodes.py b/nodes.py index 8699795..5ccb396 100644 --- a/nodes.py +++ b/nodes.py @@ -1954,8 +1954,8 @@ class WanVideoSampler: # UniAnimate if unianimate_poses is not None: - transformer.dwpose_embedding.to(device, model["dtype"]) - dwpose_data = unianimate_poses["pose"].to(device, model["dtype"]) + transformer.dwpose_embedding.to(device, dtype) + dwpose_data = unianimate_poses["pose"].to(device, dtype) dwpose_data = torch.cat([dwpose_data[:,:,:1].repeat(1,1,3,1,1), dwpose_data], dim=2) dwpose_data = transformer.dwpose_embedding(dwpose_data) log.info(f"UniAnimate pose embed shape: {dwpose_data.shape}") diff --git a/nodes_model_loading.py b/nodes_model_loading.py index ac1133a..1b39dd0 100644 --- a/nodes_model_loading.py +++ b/nodes_model_loading.py @@ -748,7 +748,7 @@ def load_weights(transformer, sd, weight_dtype, base_dtype, transformer_load_dev block_idx = None #print("block_idx:", block_idx) #print("vace_block_idx:", vace_block_idx) - if "loras" in name: + if "loras" in name or "dwpose" in name or "randomref" in name: continue dtype_to_use = base_dtype if any(keyword in name for keyword in params_to_keep) else weight_dtype dtype_to_use = weight_dtype if sd[name.replace("_orig_mod.", "")].dtype == weight_dtype else dtype_to_use @@ -863,7 +863,7 @@ def add_lora_weights(patcher, lora, base_dtype, merge_loras=False): if isinstance(lora_strength, list): if merge_loras: raise ValueError("LoRA strength should be a single value when merge_loras=True") - transformer.lora_scheduling_enabled = True + patcher.model.diffusion_model.lora_scheduling_enabled = True if lora_strength == 0: log.warning(f"LoRA {lora_path} has strength 0, skipping...") continue @@ -871,7 +871,7 @@ def add_lora_weights(patcher, lora, base_dtype, merge_loras=False): if "dwpose_embedding.0.weight" in lora_sd: #unianimate from .unianimate.nodes import update_transformer log.info("Unianimate LoRA detected, patching model...") - transformer = update_transformer(transformer, lora_sd) + patcher.model.diffusion_model = update_transformer(patcher.model.diffusion_model, lora_sd) lora_sd = standardize_lora_key_format(lora_sd) From c3d75d5e602c33441d9e758767e222ffc09527f7 Mon Sep 17 00:00:00 2001 From: kijai <40791699+kijai@users.noreply.github.com> Date: Tue, 19 Aug 2025 14:49:51 +0300 Subject: [PATCH 15/23] Fix multitalk progressbar --- nodes.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/nodes.py b/nodes.py index 920cf23..641fcde 100644 --- a/nodes.py +++ b/nodes.py @@ -3140,7 +3140,7 @@ class WanVideoSampler: current_condframe_index = 0 if multitalk_embeds is not None: - total_frames = len(multitalk_audio_embedding) + total_frames = len(multitalk_audio_embedding[0]) pcd_data = pcd_data_input = None if uni3c_embeds is not None: @@ -3155,6 +3155,8 @@ class WanVideoSampler: } estimated_iterations = total_frames // (frame_num - motion_frame) + 1 + log.info(f"Total frames: {total_frames}, frame_num: {frame_num}, motion_frame: {motion_frame}") + log.info(f"Estimated iterations: {estimated_iterations}") loop_pbar = tqdm(total=estimated_iterations, desc="Generating video clips") callback = prepare_callback(patcher, estimated_iterations) From 39908c9aea10c3bb1f041051dc5aef2a5ff311fe Mon Sep 17 00:00:00 2001 From: kijai <40791699+kijai@users.noreply.github.com> Date: Tue, 19 Aug 2025 18:21:21 +0300 Subject: [PATCH 16/23] Fix fp8_fast with multitalk --- nodes_model_loading.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/nodes_model_loading.py b/nodes_model_loading.py index be893ab..60deda7 100644 --- a/nodes_model_loading.py +++ b/nodes_model_loading.py @@ -1272,7 +1272,7 @@ class WanVideoModelLoader: else: weight_dtype = base_dtype - params_to_keep = {"norm", "bias", "time_in", "patch_embedding", "time_", "img_emb", "modulation", "text_embedding", "adapter", "add", "ref_conv"} + params_to_keep = {"norm", "bias", "time_in", "patch_embedding", "time_", "img_emb", "modulation", "text_embedding", "adapter", "add", "ref_conv", "audio_proj"} control_lora = False @@ -1309,9 +1309,6 @@ class WanVideoModelLoader: raise NotImplementedError("fp8_fast is not supported with unmerged LoRAs") from .fp8_optimization import convert_fp8_linear convert_fp8_linear(transformer, base_dtype, params_to_keep, scale_weight_keys=scale_weights) - patch_linear = False - - #del sd if multitalk_model is not None: transformer.audio_proj = multitalk_model["proj_model"] From 4aac86a828204c2bd1effb01ea137a798d4d9a46 Mon Sep 17 00:00:00 2001 From: kijai <40791699+kijai@users.noreply.github.com> Date: Tue, 19 Aug 2025 19:11:33 +0300 Subject: [PATCH 17/23] offloading fixes --- nodes.py | 130 ++++++++++++++++++++--------------------- nodes_model_loading.py | 5 +- 2 files changed, 66 insertions(+), 69 deletions(-) diff --git a/nodes.py b/nodes.py index 641fcde..55bdcb0 100644 --- a/nodes.py +++ b/nodes.py @@ -2218,38 +2218,38 @@ class WanVideoSampler: gc.collect() #blockswap init - if block_swap_args is not None and not transformer.patched_linear: - transformer.use_non_blocking = block_swap_args.get("use_non_blocking", False) - for name, param in transformer.named_parameters(): - if "block" not in name: - param.data = param.data.to(device) - if "control_adapter" in name: - param.data = param.data.to(device) - elif block_swap_args["offload_txt_emb"] and "txt_emb" in name: - param.data = param.data.to(offload_device) - elif block_swap_args["offload_img_emb"] and "img_emb" in name: - param.data = param.data.to(offload_device) + if not transformer.patched_linear: + if block_swap_args is not None: + transformer.use_non_blocking = block_swap_args.get("use_non_blocking", False) + for name, param in transformer.named_parameters(): + if "block" not in name: + param.data = param.data.to(device) + if "control_adapter" in name: + param.data = param.data.to(device) + elif block_swap_args["offload_txt_emb"] and "txt_emb" in name: + param.data = param.data.to(offload_device) + elif block_swap_args["offload_img_emb"] and "img_emb" in name: + param.data = param.data.to(offload_device) - transformer.block_swap( - block_swap_args["blocks_to_swap"] - 1 , - block_swap_args["offload_txt_emb"], - block_swap_args["offload_img_emb"], - vace_blocks_to_swap = block_swap_args.get("vace_blocks_to_swap", None), - prefetch_blocks = block_swap_args.get("prefetch_blocks", 0), - block_swap_debug = block_swap_args.get("block_swap_debug", False), - ) - elif model["auto_cpu_offload"]: - for module in transformer.modules(): - if hasattr(module, "offload"): - module.offload() - if hasattr(module, "onload"): - module.onload() - for block in transformer.blocks: - block.modulation = torch.nn.Parameter(block.modulation.to(device)) - transformer.head.modulation = torch.nn.Parameter(transformer.head.modulation.to(device)) - - #elif model["manual_offloading"]: - # transformer.to(device) + transformer.block_swap( + block_swap_args["blocks_to_swap"] - 1 , + block_swap_args["offload_txt_emb"], + block_swap_args["offload_img_emb"], + vace_blocks_to_swap = block_swap_args.get("vace_blocks_to_swap", None), + prefetch_blocks = block_swap_args.get("prefetch_blocks", 0), + block_swap_debug = block_swap_args.get("block_swap_debug", False), + ) + elif model["auto_cpu_offload"]: + for module in transformer.modules(): + if hasattr(module, "offload"): + module.offload() + if hasattr(module, "onload"): + module.onload() + for block in transformer.blocks: + block.modulation = torch.nn.Parameter(block.modulation.to(device)) + transformer.head.modulation = torch.nn.Parameter(transformer.head.modulation.to(device)) + else: + transformer.to(device) # Initialize Cache if enabled transformer.enable_teacache = transformer.enable_magcache = transformer.enable_easycache = False @@ -2657,7 +2657,7 @@ class WanVideoSampler: except Exception as e: log.error(f"Error during model prediction: {e}") if force_offload: - if model["manual_offloading"]: + if not model["auto_cpu_offload"]: offload_transformer(transformer) raise e @@ -3256,36 +3256,36 @@ class WanVideoSampler: if offload: #blockswap init - if transformer_options is not None: - block_swap_args = transformer_options.get("block_swap_args", None) + if not transformer.patched_linear: + if block_swap_args is not None: + transformer.use_non_blocking = block_swap_args.get("use_non_blocking", False) + for name, param in transformer.named_parameters(): + if "block" not in name: + param.data = param.data.to(device) + if "control_adapter" in name: + param.data = param.data.to(device) + elif block_swap_args["offload_txt_emb"] and "txt_emb" in name: + param.data = param.data.to(offload_device) + elif block_swap_args["offload_img_emb"] and "img_emb" in name: + param.data = param.data.to(offload_device) - if block_swap_args is not None: - transformer.use_non_blocking = block_swap_args.get("use_non_blocking", False) - for name, param in transformer.named_parameters(): - if "block" not in name: - param.data = param.data.to(device) - if "control_adapter" in name: - param.data = param.data.to(device) - elif block_swap_args["offload_txt_emb"] and "txt_emb" in name: - param.data = param.data.to(offload_device) - elif block_swap_args["offload_img_emb"] and "img_emb" in name: - param.data = param.data.to(offload_device) - - transformer.block_swap( - block_swap_args["blocks_to_swap"] - 1 , - block_swap_args["offload_txt_emb"], - block_swap_args["offload_img_emb"], - vace_blocks_to_swap = block_swap_args.get("vace_blocks_to_swap", None), - ) - - elif model["auto_cpu_offload"]: - for module in transformer.modules(): - if hasattr(module, "offload"): - module.offload() - if hasattr(module, "onload"): - module.onload() - elif model["manual_offloading"]: - transformer.to(device) + transformer.block_swap( + block_swap_args["blocks_to_swap"] - 1 , + block_swap_args["offload_txt_emb"], + block_swap_args["offload_img_emb"], + vace_blocks_to_swap = block_swap_args.get("vace_blocks_to_swap", None), + ) + elif model["auto_cpu_offload"]: + for module in transformer.modules(): + if hasattr(module, "offload"): + module.offload() + if hasattr(module, "onload"): + module.onload() + for block in transformer.blocks: + block.modulation = torch.nn.Parameter(block.modulation.to(device)) + transformer.head.modulation = torch.nn.Parameter(transformer.head.modulation.to(device)) + else: + transformer.to(device) comfy_pbar = ProgressBar(len(timesteps)-1) for i in tqdm(range(len(timesteps)-1)): @@ -3337,7 +3337,7 @@ class WanVideoSampler: comfy_pbar.update(1) if offload: - transformer.to(offload_device) + offload_transformer(transformer) vae.to(device) videos = vae.decode(x0.unsqueeze(0).to(vae.dtype), device=device, tiled=tiled_vae) vae.to(offload_device) @@ -3410,7 +3410,7 @@ class WanVideoSampler: del noise, latent if force_offload: - if model["manual_offloading"]: + if not model["auto_cpu_offload"]: transformer.to(offload_device) mm.soft_empty_cache() gc.collect() @@ -3508,7 +3508,7 @@ class WanVideoSampler: except Exception as e: log.error(f"Error during sampling: {e}") if force_offload: - if model["manual_offloading"]: + if not model["auto_cpu_offload"]: offload_transformer(transformer) raise e @@ -3516,7 +3516,7 @@ class WanVideoSampler: cache_report(transformer, cache_args) if force_offload: - if model["manual_offloading"]: + if not model["auto_cpu_offload"]: offload_transformer(transformer) try: diff --git a/nodes_model_loading.py b/nodes_model_loading.py index 60deda7..aaa5209 100644 --- a/nodes_model_loading.py +++ b/nodes_model_loading.py @@ -948,7 +948,7 @@ class WanVideoModelLoader: mm.unload_all_models() mm.cleanup_models() mm.soft_empty_cache() - manual_offloading = True + if "sage" in attention_mode: try: from sageattention import sageattn @@ -964,8 +964,6 @@ class WanVideoModelLoader: if merge_loras is True: raise ValueError("GGUF models do not support LoRA merging, please disable merge_loras in the LoRA select node.") - - manual_offloading = True transformer_load_device = device if load_device == "main_device" else offload_device base_dtype = {"fp8_e4m3fn": torch.float8_e4m3fn, "fp8_e4m3fn_fast": torch.float8_e4m3fn, "bf16": torch.bfloat16, "fp16": torch.float16, "fp16_fast": torch.float16, "fp32": torch.float32}[base_precision] @@ -1366,7 +1364,6 @@ class WanVideoModelLoader: patcher.model["weight_dtype"] = weight_dtype patcher.model["base_path"] = model_path patcher.model["model_name"] = model - patcher.model["manual_offloading"] = manual_offloading patcher.model["quantization"] = quantization patcher.model["auto_cpu_offload"] = True if vram_management_args is not None else False patcher.model["control_lora"] = control_lora From 2dfaeb0093e09453a25d27d96bf3cca0e24972c6 Mon Sep 17 00:00:00 2001 From: kijai <40791699+kijai@users.noreply.github.com> Date: Thu, 21 Aug 2025 19:07:11 +0300 Subject: [PATCH 18/23] Update nodes_model_loading.py --- nodes_model_loading.py | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/nodes_model_loading.py b/nodes_model_loading.py index 3432b54..c926d55 100644 --- a/nodes_model_loading.py +++ b/nodes_model_loading.py @@ -780,10 +780,17 @@ def load_weights_gguf(transformer, reader, sd, base_dtype, transformer_load_devi from .gguf.gguf import _replace_with_gguf_linear, GGUFParameter import gguf log.info("Using GGUF to load and assign model weights to device...") + param_count = sum(1 for _ in transformer.named_parameters()) sd = {} - for tensor in reader.tensors: + + # Combine tensors from all readers + all_tensors = [] + for r in reader: + all_tensors.extend(r.tensors) + + for tensor in all_tensors: # if the tensor is a torch supported dtype do not use GGUFParameter is_gguf_quant = tensor.tensor_type not in [gguf.GGMLQuantizationType.F32, gguf.GGMLQuantizationType.F16] weights = torch.from_numpy(tensor.data.copy()).to(transformer_load_device) @@ -987,10 +994,10 @@ class WanVideoModelLoader: if not gguf: sd = load_torch_file(model_path, device=transformer_load_device, safe_load=True) else: - #from diffusers.models.model_loading_utils import load_gguf_checkpoint - #sd = load_gguf_checkpoint(model_path) + gguf_reader=[] from .gguf.gguf import load_gguf - sd, gguf_reader = load_gguf(model_path) + sd, reader = load_gguf(model_path) + gguf_reader.append(reader) if quantization == "disabled": for k, v in sd.items(): @@ -1021,9 +1028,10 @@ class WanVideoModelLoader: if extra_model is not None: if gguf: - if not vace_model["path"].endswith(".gguf"): - raise ValueError("With GGUF main model the VACE module must also be a GGUF quantized, if the main model already has VACE included, you can disconnect the VACE module loader") - vace_sd = load_gguf_checkpoint(vace_model["path"]) + if not extra_model["path"].endswith(".gguf"): + raise ValueError("With GGUF main model the extra model must also be a GGUF quantized, if the main model already has extra included, you can disconnect the extra module loader") + extra_sd, extra_reader = load_gguf(extra_model["path"]) + gguf_reader.append(extra_reader) else: extra_sd = load_torch_file(extra_model["path"], device=transformer_load_device, safe_load=True) sd.update(extra_sd) From 65973b02514c6736f59923352102462e2129f80a Mon Sep 17 00:00:00 2001 From: kijai <40791699+kijai@users.noreply.github.com> Date: Thu, 21 Aug 2025 22:13:07 +0300 Subject: [PATCH 19/23] gguf loading fixes --- nodes.py | 31 ++++----- nodes_model_loading.py | 139 ++++++++++++++++++++++------------------- 2 files changed, 89 insertions(+), 81 deletions(-) diff --git a/nodes.py b/nodes.py index 8b236d7..6e2e3cb 100644 --- a/nodes.py +++ b/nodes.py @@ -16,7 +16,7 @@ from .utils import(log, print_memory, apply_lora, clip_encode_image_tiled, fouri add_noise_to_reference_video, optimized_scale, setup_radial_attention, compile_model, dict_to_device, tangential_projection, set_module_tensor_to_device, get_raag_guidance) from .cache_methods.cache_methods import cache_report -from .nodes_model_loading import load_weights, load_weights_gguf +from .nodes_model_loading import load_weights from .enhance_a_video.globals import set_enhance_weight, set_num_frames from .taehv import TAEHV from contextlib import nullcontext @@ -42,18 +42,18 @@ def offload_transformer(transformer): transformer.teacache_state.clear_all() transformer.magcache_state.clear_all() transformer.easycache_state.clear_all() - transformer.to(offload_device) - # for name, param in transformer.named_parameters(): - # module = transformer - # subnames = name.split('.') - # for subname in subnames[:-1]: - # module = getattr(module, subname) - # attr_name = subnames[-1] - # if param.data.is_floating_point(): - # meta_param = torch.nn.Parameter(torch.empty_like(param.data, device='meta'), requires_grad=False) - # setattr(module, attr_name, meta_param) - # else: - # pass + #transformer.to(offload_device) + for name, param in transformer.named_parameters(): + module = transformer + subnames = name.split('.') + for subname in subnames[:-1]: + module = getattr(module, subname) + attr_name = subnames[-1] + if param.data.is_floating_point(): + meta_param = torch.nn.Parameter(torch.empty_like(param.data, device='meta'), requires_grad=False) + setattr(module, attr_name, meta_param) + else: + pass mm.soft_empty_cache() gc.collect() @@ -1655,11 +1655,12 @@ class WanVideoSampler: vae_upscale_factor = 16 if is_5b else 8 if transformer.patched_linear and gguf_reader is None: - load_weights(patcher.model.diffusion_model, patcher.model["sd"], weight_dtype, dtype, device, block_swap_args=block_swap_args) + load_weights(patcher.model.diffusion_model, patcher.model["sd"], weight_dtype, base_dtype=dtype, transformer_load_device=device, block_swap_args=block_swap_args) if gguf_reader is not None: - load_weights_gguf(transformer, gguf_reader, patcher.model["sd"], dtype, device, patcher) + load_weights(transformer, patcher.model["sd"], base_dtype=dtype, transformer_load_device=device, patcher=patcher, gguf=True, reader=gguf_reader, block_swap_args=block_swap_args) set_lora_params_gguf(transformer, patcher.patches) + transformer.patched_linear = True elif len(patcher.patches) != 0 and transformer.patched_linear: log.info(f"Using {len(patcher.patches)} LoRA weight patches for WanVideo model") if not merge_loras and fp8_matmul: diff --git a/nodes_model_loading.py b/nodes_model_loading.py index c926d55..09688bc 100644 --- a/nodes_model_loading.py +++ b/nodes_model_loading.py @@ -18,6 +18,11 @@ import comfy.model_management as mm from comfy.utils import load_torch_file, ProgressBar import comfy.model_base from comfy.sd import load_lora_for_models +try: + from .gguf.gguf import _replace_with_gguf_linear, GGUFParameter + from gguf import GGMLQuantizationType +except: + pass script_directory = os.path.dirname(os.path.abspath(__file__)) @@ -724,15 +729,58 @@ class WanVideoSetLoRAs: return (patcher,) -def load_weights(transformer, sd, weight_dtype, base_dtype, transformer_load_device, block_swap_args=None): - params_to_keep = {"time_in", "patch_embedding", "time_", "modulation", "text_embedding", "adapter", "add", "ref_conv", "audio_proj"} - - log.info("Using accelerate to load and assign model weights to device...") +def load_weights(transformer, sd=None, weight_dtype=None, base_dtype=None, + transformer_load_device=None, block_swap_args=None, gguf=False, reader=None, patcher=None): + params_to_keep = {"time_in", "patch_embedding", "time_", "modulation", "text_embedding", "adapter", "add", "ref_conv", "audio_proj"} param_count = sum(1 for _ in transformer.named_parameters()) pbar = ProgressBar(param_count) cnt = 0 - for name, param in tqdm(transformer.named_parameters(), - desc=f"Loading transformer parameters to {transformer_load_device}", + block_idx = vace_block_idx = None + + if gguf: + log.info("Using GGUF to load and assign model weights to device...") + + # Prepare sd from GGUF readers + sd = {} + all_tensors = [] + for r in reader: + all_tensors.extend(r.tensors) + for tensor in all_tensors: + load_device = device + if "vace_blocks." in tensor.name: + try: + vace_block_idx = int(tensor.name.split("vace_blocks.")[1].split(".")[0]) + except Exception: + vace_block_idx = None + elif "blocks." in tensor.name: + try: + block_idx = int(tensor.name.split("blocks.")[1].split(".")[0]) + except Exception: + block_idx = None + + if block_swap_args is not None: + if block_idx is not None: + if block_idx >= len(transformer.blocks) - block_swap_args.get("blocks_to_swap", 0): + load_device = offload_device + elif vace_block_idx is not None: + if vace_block_idx >= len(transformer.vace_blocks) - block_swap_args.get("vace_blocks_to_swap", 0): + load_device = offload_device + + is_gguf_quant = tensor.tensor_type not in [GGMLQuantizationType.F32, GGMLQuantizationType.F16] + weights = torch.from_numpy(tensor.data.copy()).to(load_device) + sd[tensor.name] = GGUFParameter(weights, quant_type=tensor.tensor_type) if is_gguf_quant else weights + + if not getattr(transformer, "gguf_patched", False): + transformer = _replace_with_gguf_linear( + transformer, base_dtype, sd, patches=patcher.patches + ) + transformer.gguf_patched = True + else: + log.info("Using accelerate to load and assign model weights to device...") + named_params = transformer.named_parameters() + + for name, param in tqdm(named_params, + desc=f"Loading transformer parameters to {transformer_load_device}", total=param_count, leave=True): block_idx = vace_block_idx = None @@ -746,80 +794,39 @@ def load_weights(transformer, sd, weight_dtype, base_dtype, transformer_load_dev block_idx = int(name.split("blocks.")[1].split(".")[0]) except Exception: block_idx = None - #print("block_idx:", block_idx) - #print("vace_block_idx:", vace_block_idx) + if "loras" in name or "dwpose" in name or "randomref" in name: continue - dtype_to_use = base_dtype if any(keyword in name for keyword in params_to_keep) else weight_dtype - dtype_to_use = weight_dtype if sd[name.replace("_orig_mod.", "")].dtype == weight_dtype else dtype_to_use - if "modulation" in name or "norm" in name or "bias" in name or "img_emb" in name: - dtype_to_use = base_dtype - if "patch_embedding" in name: - dtype_to_use = torch.float32 + + # GGUF: skip GGUFParameter params + if gguf and isinstance(param, GGUFParameter): + continue + + if gguf: + dtype_to_use = torch.float32 if "patch_embedding" in name else base_dtype + else: + dtype_to_use = base_dtype if any(keyword in name for keyword in params_to_keep) else weight_dtype + dtype_to_use = weight_dtype if sd[name.replace("_orig_mod.", "")].dtype == weight_dtype else dtype_to_use + if "modulation" in name or "norm" in name or "bias" in name or "img_emb" in name: + dtype_to_use = base_dtype + if "patch_embedding" in name: + dtype_to_use = torch.float32 load_device = device if block_swap_args is not None: if block_idx is not None: - if block_idx >= len(transformer.blocks) - block_swap_args["blocks_to_swap"]: + if block_idx >= len(transformer.blocks) - block_swap_args.get("blocks_to_swap", 0): load_device = offload_device elif vace_block_idx is not None: - if vace_block_idx >= len(transformer.vace_blocks) - block_swap_args["vace_blocks_to_swap"]: + if vace_block_idx >= len(transformer.vace_blocks) - block_swap_args.get("vace_blocks_to_swap", 0): load_device = offload_device + + # Set tensor to device set_module_tensor_to_device(transformer, name, device=load_device, dtype=dtype_to_use, value=sd[name.replace("_orig_mod.", "")]) cnt += 1 if cnt % 100 == 0: pbar.update(100) - #for name, param in transformer.named_parameters(): - # print(name, param.dtype, param.device, param.shape) - #for name, param in transformer.blocks[0].motion_attn.named_parameters(): - # print(name, param.data) - pbar.update_absolute(param_count) - pbar.update_absolute(0) -def load_weights_gguf(transformer, reader, sd, base_dtype, transformer_load_device, patcher): - from .gguf.gguf import _replace_with_gguf_linear, GGUFParameter - import gguf - log.info("Using GGUF to load and assign model weights to device...") - - param_count = sum(1 for _ in transformer.named_parameters()) - - sd = {} - - # Combine tensors from all readers - all_tensors = [] - for r in reader: - all_tensors.extend(r.tensors) - - for tensor in all_tensors: - # if the tensor is a torch supported dtype do not use GGUFParameter - is_gguf_quant = tensor.tensor_type not in [gguf.GGMLQuantizationType.F32, gguf.GGMLQuantizationType.F16] - weights = torch.from_numpy(tensor.data.copy()).to(transformer_load_device) - sd[tensor.name] = GGUFParameter(weights, quant_type=tensor.tensor_type) if is_gguf_quant else weights - - patcher.model.diffusion_model = _replace_with_gguf_linear(patcher.model.diffusion_model, base_dtype, sd, patches=patcher.patches) - pbar = ProgressBar(param_count) - cnt = 0 - for name, param in tqdm(patcher.model.diffusion_model.named_parameters(), - desc=f"Loading transformer parameters to {transformer_load_device}", - total=param_count, - leave=True): - if "loras" in name: - continue - #print(name, param.dtype, param.device, param.shape) - if isinstance(param, GGUFParameter): - continue - elif "patch_embedding" in name: - dtype_to_use = torch.float32 - else: - dtype_to_use = base_dtype - set_module_tensor_to_device(patcher.model.diffusion_model, name, device=transformer_load_device, dtype=dtype_to_use, value=sd[name.replace("_orig_mod.", "")]) - cnt += 1 - if cnt % 100 == 0: - pbar.update(100) - - #for name, param in transformer.named_parameters(): - # print(name, param.dtype, param.device, param.shape) - #patcher.load(device, full_load=True) pbar.update_absolute(param_count) pbar.update_absolute(0) From 9b98413e1e0c68a1155907b8b2dc8fa526eb528e Mon Sep 17 00:00:00 2001 From: kijai <40791699+kijai@users.noreply.github.com> Date: Sat, 23 Aug 2025 21:00:48 +0300 Subject: [PATCH 20/23] Update nodes.py --- nodes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes.py b/nodes.py index b70d207..5076b48 100644 --- a/nodes.py +++ b/nodes.py @@ -3877,7 +3877,7 @@ NODE_CLASS_MAPPINGS = { "WanVideoScheduler": WanVideoScheduler, "WanVideoAddStandInLatent": WanVideoAddStandInLatent, "WanVideoAddControlEmbeds": WanVideoAddControlEmbeds, - "WanVideoAddMTVMotion": WanVideoAddMTVMotion,, + "WanVideoAddMTVMotion": WanVideoAddMTVMotion, "WanVideoRoPEFunction": WanVideoRoPEFunction } NODE_DISPLAY_NAME_MAPPINGS = { From d9def84332e50af26ec5cde080d4c3703b837520 Mon Sep 17 00:00:00 2001 From: kijai <40791699+kijai@users.noreply.github.com> Date: Mon, 25 Aug 2025 14:09:08 +0300 Subject: [PATCH 21/23] Fix UniAnimate and MultiTalk loading --- multitalk/nodes.py | 9 +- nodes.py | 79 ++++++------ nodes_model_loading.py | 279 +++++++++++++---------------------------- 3 files changed, 132 insertions(+), 235 deletions(-) diff --git a/multitalk/nodes.py b/multitalk/nodes.py index 0ecea7d..21caa32 100644 --- a/multitalk/nodes.py +++ b/multitalk/nodes.py @@ -22,14 +22,8 @@ class MultiTalkModelLoader: def loadmodel(self, model, base_precision=None): from .multitalk import AudioProjModel - offload_device = mm.unet_offload_device() model_path = folder_paths.get_full_path_or_raise("diffusion_models", model) - if model_path.endswith(".gguf"): - from diffusers.models.model_loading_utils import load_gguf_checkpoint - sd = load_gguf_checkpoint(model_path) - else: - sd = load_torch_file(model_path, device=offload_device, safe_load=True) audio_window=5 intermediate_dim=512 @@ -50,8 +44,7 @@ class MultiTalkModelLoader: multitalk = { "proj_model": multitalk_proj_model, - "sd": sd, - "is_gguf": model_path.endswith(".gguf"), + "model_path": model_path, "model_type": "InfiniteTalk" if "infinite" in model.lower() else "MultiTalk", } diff --git a/nodes.py b/nodes.py index e361521..1c44246 100644 --- a/nodes.py +++ b/nodes.py @@ -1701,20 +1701,21 @@ class WanVideoSampler: is_5b = transformer.out_dim == 48 vae_upscale_factor = 16 if is_5b else 8 + # Load weights if transformer.patched_linear and gguf_reader is None: load_weights(patcher.model.diffusion_model, patcher.model["sd"], weight_dtype, base_dtype=dtype, transformer_load_device=device, block_swap_args=block_swap_args) - if gguf_reader is not None: + if gguf_reader is not None: #handle GGUF load_weights(transformer, patcher.model["sd"], base_dtype=dtype, transformer_load_device=device, patcher=patcher, gguf=True, reader=gguf_reader, block_swap_args=block_swap_args) set_lora_params_gguf(transformer, patcher.patches) transformer.patched_linear = True - elif len(patcher.patches) != 0 and transformer.patched_linear: + elif len(patcher.patches) != 0 and transformer.patched_linear: #handle patched linear layers (unmerged loras, fp8 scaled) log.info(f"Using {len(patcher.patches)} LoRA weight patches for WanVideo model") if not merge_loras and fp8_matmul: raise NotImplementedError("FP8 matmul with unmerged LoRAs is not supported") set_lora_params(transformer, patcher.patches) else: - remove_lora_from_module(transformer) + remove_lora_from_module(transformer) #clear possible unmerged lora weights transformer.lora_scheduling_enabled = transformer_options.get("lora_scheduling_enabled", False) @@ -2386,16 +2387,18 @@ class WanVideoSampler: import copy sample_scheduler_flipped = copy.deepcopy(sample_scheduler) - #rope + # Rotary positional embeddings (RoPE) + + # RoPE base freq scaling as used with CineScale ntk_alphas = [1.0, 1.0, 1.0] if isinstance(rope_function, dict): ntk_alphas = rope_function["ntk_scale_f"], rope_function["ntk_scale_h"], rope_function["ntk_scale_w"] rope_function = rope_function["rope_function"] - + freqs = None transformer.rope_embedder.k = None transformer.rope_embedder.num_frames = None - if "default" in rope_function or bidirectional_sampling: + if "default" in rope_function or bidirectional_sampling: # original RoPE d = transformer.dim // transformer.num_heads freqs = torch.cat([ rope_params(1024, d - 4 * (d // 6), L_test=latent_video_length, k=riflex_freq_index), @@ -2403,7 +2406,7 @@ class WanVideoSampler: rope_params(1024, 2 * (d // 6)) ], dim=1) - elif "comfy" in rope_function: + elif "comfy" in rope_function: # comfy's rope transformer.rope_embedder.k = riflex_freq_index transformer.rope_embedder.num_frames = latent_video_length @@ -2565,37 +2568,37 @@ class WanVideoSampler: base_params = { - 'seq_len': seq_len, - 'device': device, - 'freqs': freqs, - 't': timestep, - 'current_step': idx, - 'last_step': len(timesteps) - 1 == idx, - 'control_lora_enabled': control_lora_enabled, - 'enhance_enabled': enhance_enabled, - 'camera_embed': camera_embed, - 'unianim_data': unianim_data, - 'fun_ref': fun_ref_input if fun_ref_image is not None else None, - 'fun_camera': control_camera_input if control_camera_latents is not None else None, - 'audio_proj': audio_proj if fantasytalking_embeds is not None else None, - 'audio_scale': audio_scale, - "pcd_data": pcd_data_input, - "controlnet": controlnet, - "add_cond": add_cond_input, - "nag_params": text_embeds.get("nag_params", {}), - "nag_context": text_embeds.get("nag_prompt_embeds", None), - "multitalk_audio": multitalk_audio_input if multitalk_audio_embedding is not None else None, - "ref_target_masks": ref_target_masks if multitalk_audio_embedding is not None else None, - "inner_t": [shot_len] if shot_len else None, - "standin_input": standin_input, - "fantasy_portrait_input": fantasy_portrait_input, - "phantom_ref": phantom_ref, - "reverse_time": reverse_time, - "ntk_alphas": ntk_alphas, - "mtv_motion_tokens": mtv_motion_tokens if mtv_input is not None else None, - "mtv_motion_rotary_emb": mtv_motion_rotary_emb if mtv_input is not None else None, - "mtv_strength": mtv_strength[idx] if mtv_input is not None else 1.0, - "mtv_freqs": mtv_freqs if mtv_input is not None else None, + 'seq_len': seq_len, # sequence length + 'device': device, # main device + 'freqs': freqs, # rope freqs + 't': timestep, # current timestep + 'current_step': idx, # current step + 'last_step': len(timesteps) - 1 == idx, # is last step + 'control_lora_enabled': control_lora_enabled, # control lora toggle for patch embed selection + 'enhance_enabled': enhance_enabled, # enhance-a-video toggle + 'camera_embed': camera_embed, # recammaster embedding + 'unianim_data': unianim_data, # unianimate input + 'fun_ref': fun_ref_input if fun_ref_image is not None else None, # Fun model reference latent + 'fun_camera': control_camera_input if control_camera_latents is not None else None, # Fun model camera embed + 'audio_proj': audio_proj if fantasytalking_embeds is not None else None, # FantasyTalking audio projection + 'audio_scale': audio_scale, # FantasyTalking audio scale + "pcd_data": pcd_data_input, # Uni3C input + "controlnet": controlnet, # TheDenk's controlnet input + "add_cond": add_cond_input, # additional conditioning input + "nag_params": text_embeds.get("nag_params", {}), # normalized attention guidance + "nag_context": text_embeds.get("nag_prompt_embeds", None), # normalized attention guidance context + "multitalk_audio": multitalk_audio_input if multitalk_audio_embedding is not None else None, # Multi/InfiniteTalk audio input + "ref_target_masks": ref_target_masks if multitalk_audio_embedding is not None else None, # Multi/InfiniteTalk reference target masks + "inner_t": [shot_len] if shot_len else None, # inner timestep for EchoShot + "standin_input": standin_input, # Stand-in reference input + "fantasy_portrait_input": fantasy_portrait_input, # Fantasy portrait input + "phantom_ref": phantom_ref, # Phantom reference input + "reverse_time": reverse_time, # Reverse RoPE toggle + "ntk_alphas": ntk_alphas, # RoPE freq scaling values + "mtv_motion_tokens": mtv_motion_tokens if mtv_input is not None else None, # MTV-Crafter motion tokens + "mtv_motion_rotary_emb": mtv_motion_rotary_emb if mtv_input is not None else None, # MTV-Crafter RoPE + "mtv_strength": mtv_strength[idx] if mtv_input is not None else 1.0, # MTV-Crafter scaling + "mtv_freqs": mtv_freqs if mtv_input is not None else None, # MTV-Crafter extra RoPE freqs } batch_size = 1 diff --git a/nodes_model_loading.py b/nodes_model_loading.py index 6c90875..a5f6567 100644 --- a/nodes_model_loading.py +++ b/nodes_model_loading.py @@ -741,6 +741,13 @@ def load_weights(transformer, sd=None, weight_dtype=None, base_dtype=None, log.info("Using GGUF to load and assign model weights to device...") # Prepare sd from GGUF readers + + # UniAnimate embedding weight workaround + unianimate_sd = {} + for key in sd.keys(): + if "dwpose_embedding" in key or "randomref_embedding_pose" in key: + unianimate_sd[key] = sd[key] + sd = {} all_tensors = [] for r in reader: @@ -769,6 +776,8 @@ def load_weights(transformer, sd=None, weight_dtype=None, base_dtype=None, is_gguf_quant = tensor.tensor_type not in [GGMLQuantizationType.F32, GGMLQuantizationType.F16] weights = torch.from_numpy(tensor.data.copy()).to(load_device) sd[tensor.name] = GGUFParameter(weights, quant_type=tensor.tensor_type) if is_gguf_quant else weights + sd.update(unianimate_sd) + del unianimate_sd if not getattr(transformer, "gguf_patched", False): transformer = _replace_with_gguf_linear( @@ -795,7 +804,7 @@ def load_weights(transformer, sd=None, weight_dtype=None, base_dtype=None, except Exception: block_idx = None - if "loras" in name or "dwpose" in name or "randomref" in name: + if "loras" in name: continue # GGUF: skip GGUFParameter params @@ -820,7 +829,6 @@ def load_weights(transformer, sd=None, weight_dtype=None, base_dtype=None, elif vace_block_idx is not None: if vace_block_idx >= len(transformer.vace_blocks) - block_swap_args.get("vace_blocks_to_swap", 0): load_device = offload_device - # Set tensor to device set_module_tensor_to_device(transformer, name, device=load_device, dtype=dtype_to_use, value=sd[name.replace("_orig_mod.", "")]) cnt += 1 @@ -869,6 +877,7 @@ def patch_stand_in_lora(transformer, lora_sd, transformer_load_device, base_dtyp param.data.copy_(lora_sd["diffusion_model." + name].to(param.device, dtype=param.dtype)) def add_lora_weights(patcher, lora, base_dtype, merge_loras=False): + unianimate_sd = None #spacepxl's control LoRA patch for l in lora: log.info(f"Loading LoRA: {l['name']} with strength: {l['strength']}") @@ -885,7 +894,7 @@ def add_lora_weights(patcher, lora, base_dtype, merge_loras=False): if "dwpose_embedding.0.weight" in lora_sd: #unianimate from .unianimate.nodes import update_transformer log.info("Unianimate LoRA detected, patching model...") - patcher.model.diffusion_model = update_transformer(patcher.model.diffusion_model, lora_sd) + patcher.model.diffusion_model, unianimate_sd = update_transformer(patcher.model.diffusion_model, lora_sd) lora_sd = standardize_lora_key_format(lora_sd) @@ -906,7 +915,7 @@ def add_lora_weights(patcher, lora, base_dtype, merge_loras=False): patcher, _ = load_lora_for_models(patcher, None, lora_sd, lora_strength, 0) del lora_sd - return patcher, control_lora + return patcher, control_lora, unianimate_sd #region Model loading class WanVideoModelLoader: @@ -1033,15 +1042,18 @@ class WanVideoModelLoader: if "vace_blocks.0.after_proj.weight" in sd and not "patch_embedding.weight" in sd: raise ValueError("You are attempting to load a VACE module as a WanVideo model, instead you should use the vace_model input and matching T2V base model") + # currently this can be VAE or MTV-Crafter weights if extra_model is not None: if gguf: if not extra_model["path"].endswith(".gguf"): raise ValueError("With GGUF main model the extra model must also be a GGUF quantized, if the main model already has extra included, you can disconnect the extra module loader") extra_sd, extra_reader = load_gguf(extra_model["path"]) gguf_reader.append(extra_reader) + del extra_reader else: extra_sd = load_torch_file(extra_model["path"], device=transformer_load_device, safe_load=True) sd.update(extra_sd) + del extra_sd first_key = next(iter(sd)) if first_key.startswith("model.diffusion_model."): @@ -1206,40 +1218,54 @@ class WanVideoModelLoader: log.info("FantasyPortrait model detected, patching model...") context_dim = fantasyportrait_model["sd"]["ip_adapter.blocks.0.cross_attn.ip_adapter_single_stream_k_proj.weight"].shape[1] - for block in transformer.blocks: - block.cross_attn.ip_adapter_single_stream_k_proj = nn.Linear(context_dim, dim, bias=False) - block.cross_attn.ip_adapter_single_stream_v_proj = nn.Linear(context_dim, dim, bias=False) + with init_empty_weights(): + for block in transformer.blocks: + block.cross_attn.ip_adapter_single_stream_k_proj = nn.Linear(context_dim, dim, bias=False) + block.cross_attn.ip_adapter_single_stream_v_proj = nn.Linear(context_dim, dim, bias=False) ip_adapter_sd = {} for k, v in fantasyportrait_model["sd"].items(): if k.startswith("ip_adapter."): ip_adapter_sd[k.replace("ip_adapter.", "")] = v sd.update(ip_adapter_sd) + del ip_adapter_sd if multitalk_model is not None: - if multitalk_model["is_gguf"] and not gguf: - raise ValueError("Multitalk/InfiniteTalk model is a GGUF model, main model also has to be a GGUF model.") multitalk_model_type = multitalk_model.get("model_type", "MultiTalk") + log.info(f"{multitalk_model_type} detected, patching model...") + + multitalk_model_path = multitalk_model["model_path"] + if multitalk_model_path.endswith(".gguf") and not gguf: + raise ValueError("Multitalk/InfiniteTalk model is a GGUF model, main model also has to be a GGUF model.") + # init audio module from .multitalk.multitalk import SingleStreamMultiAttention from .wanvideo.modules.model import WanLayerNorm - norm_input_visual = True #dunno what this is for block in transformer.blocks: - block.audio_cross_attn = SingleStreamMultiAttention( - dim=dim, - encoder_hidden_states_dim=768, - num_heads=num_heads, + with init_empty_weights(): + block.norm_x = WanLayerNorm(dim, transformer.eps, elementwise_affine=True) + block.audio_cross_attn = SingleStreamMultiAttention( + dim=dim, + encoder_hidden_states_dim=768, + num_heads=num_heads, qkv_bias=True, class_range=24, class_interval=4, attention_mode=attention_mode, ) - block.norm_x = WanLayerNorm(dim, transformer.eps, elementwise_affine=True) if norm_input_visual else nn.Identity() - log.info(f"{multitalk_model_type} detected, patching model...") transformer.audio_proj = multitalk_model["proj_model"] transformer.multitalk_model_type = multitalk_model_type - sd.update(multitalk_model["sd"]) - + + extra_model_path = multitalk_model["model_path"] + if gguf: + extra_sd, extra_reader = load_gguf(extra_model_path) + gguf_reader.append(extra_reader) + del extra_reader + else: + extra_sd = load_torch_file(extra_model_path, device=transformer_load_device, safe_load=True) + sd.update(extra_sd) + del extra_sd + # Additional cond latents if "add_conv_in.weight" in sd: def zero_module(module): @@ -1266,178 +1292,54 @@ class WanVideoModelLoader: patcher.model.is_patched = False scale_weights = {} + if "fp8" in quantization: + for k, v in sd.items(): + if k.endswith(".scale_weight"): + scale_weights[k] = v.to(base_dtype) + + if "fp8_e4m3fn" in quantization: + weight_dtype = torch.float8_e4m3fn + elif "fp8_e5m2" in quantization: + weight_dtype = torch.float8_e5m2 + else: + weight_dtype = base_dtype + + params_to_keep = {"norm", "bias", "time_in", "patch_embedding", "time_", "img_emb", "modulation", "text_embedding", "adapter", "add", "ref_conv", "audio_proj"} + + control_lora = False + + if not merge_loras and control_lora: + log.warning("Control-LoRA patching is only supported with merge_loras=True") + + if lora is not None: + patcher, control_lora, unianimate_sd = add_lora_weights(patcher, lora, base_dtype, merge_loras=merge_loras) + if unianimate_sd is not None: + log.info("Merging UniAnimate weights to the model...") + sd.update(unianimate_sd) + del unianimate_sd + if not gguf: - if "fp8" in quantization: - for k, v in sd.items(): - if k.endswith(".scale_weight"): - scale_weights[k] = v - if not merge_loras: + if merge_loras and lora is not None: + if not lora_low_mem_load: + load_weights(transformer, sd, weight_dtype, base_dtype, transformer_load_device) + + if control_lora: + patch_control_lora(patcher.model.diffusion_model, device) + patcher.model.is_patched = True + + log.info("Merging LoRA to the model...") + patcher = apply_lora( + patcher, device, transformer_load_device, params_to_keep=params_to_keep, dtype=weight_dtype, base_dtype=base_dtype, state_dict=sd, + low_mem_load=lora_low_mem_load, control_lora=control_lora, scale_weights=scale_weights,) + if not control_lora: + scale_weights.clear() + patcher.patches.clear() + transformer.patched_linear = False + else: from .custom_linear import _replace_linear transformer = _replace_linear(transformer, base_dtype, sd, scale_weights=scale_weights) - - if "fp8_e4m3fn" in quantization: - dtype = torch.float8_e4m3fn - elif "fp8_e5m2" in quantization: - dtype = torch.float8_e5m2 - else: - dtype = base_dtype - params_to_keep = {"norm", "bias", "time_in", "patch_embedding", "time_", "img_emb", "modulation", "text_embedding", "adapter", "add", "ref_conv", "audio_proj"} - if not lora_low_mem_load: - log.info("Using accelerate to load and assign model weights to device...") - param_count = sum(1 for _ in transformer.named_parameters()) - pbar = ProgressBar(param_count) - cnt = 0 - for name, param in tqdm(transformer.named_parameters(), - desc=f"Loading transformer parameters to {transformer_load_device}", - total=param_count, - leave=True): - dtype_to_use = base_dtype if any(keyword in name for keyword in params_to_keep) else dtype - dtype_to_use = dtype if sd[name].dtype == dtype else dtype_to_use - if "modulation" in name or "norm" in name or "bias" in name: - dtype_to_use = base_dtype - if "patch_embedding" in name: - dtype_to_use = torch.float32 - set_module_tensor_to_device(transformer, name, device=transformer_load_device, dtype=dtype_to_use, value=sd[name]) - cnt += 1 - if cnt % 100 == 0: - pbar.update(100) + transformer.patched_linear = True - #for name, param in transformer.named_parameters(): - # print(name, param.dtype, param.device, param.shape) - pbar.update_absolute(param_count) - pbar.update_absolute(0) - - comfy_model.diffusion_model = transformer - comfy_model.load_device = transformer_load_device - - patcher = comfy.model_patcher.ModelPatcher(comfy_model, device, offload_device) - patcher.model.is_patched = False - - control_lora = False - if lora is not None: - for l in lora: - log.info(f"Loading LoRA: {l['name']} with strength: {l['strength']}") - lora_path = l["path"] - lora_strength = l["strength"] - if isinstance(lora_strength, list): - if merge_loras: - raise ValueError("LoRA strength should be a single value when merge_loras=True") - transformer.lora_scheduling_enabled = True - if lora_strength == 0: - log.warning(f"LoRA {lora_path} has strength 0, skipping...") - continue - lora_sd = load_torch_file(lora_path, safe_load=True) - if "dwpose_embedding.0.weight" in lora_sd: #unianimate - from .unianimate.nodes import update_transformer - log.info("Unianimate LoRA detected, patching model...") - transformer = update_transformer(transformer, lora_sd) - - lora_sd = standardize_lora_key_format(lora_sd) - - if l["blocks"]: - lora_sd = filter_state_dict_by_blocks(lora_sd, l["blocks"], l.get("layer_filter", [])) - - # Filter out any LoRA keys containing 'img' if the base model state_dict has no 'img' keys - if not any('img' in k for k in sd.keys()): - lora_sd = {k: v for k, v in lora_sd.items() if 'img' not in k} - - #spacepxl's control LoRA patch - # for key in lora_sd.keys(): - # print(key) - - if "diffusion_model.patch_embedding.lora_A.weight" in lora_sd: - log.info("Control-LoRA detected, patching model...") - if not merge_loras: - log.warning("Control-LoRA patching is only supported with merge_loras=True, setting it to True") - merge_loras = True - control_lora = True - - in_cls = transformer.patch_embedding.__class__ # nn.Conv3d - old_in_dim = transformer.in_dim # 16 - new_in_dim = lora_sd["diffusion_model.patch_embedding.lora_A.weight"].shape[1] - assert new_in_dim == 32 - - new_in = in_cls( - new_in_dim, - transformer.patch_embedding.out_channels, - transformer.patch_embedding.kernel_size, - transformer.patch_embedding.stride, - transformer.patch_embedding.padding, - ).to(device=device, dtype=torch.float32) - - new_in.weight.zero_() - new_in.bias.zero_() - - new_in.weight[:, :old_in_dim].copy_(transformer.patch_embedding.weight) - new_in.bias.copy_(transformer.patch_embedding.bias) - - transformer.patch_embedding = new_in - transformer.expanded_patch_embedding = new_in - - if "diffusion_model.blocks.0.self_attn.q_loras.down.weight" in lora_sd: - log.info("Stand-In LoRA detected") - for block in transformer.blocks: - block.self_attn.q_loras = LoRALinearLayer(dim, dim, rank=128, device=transformer_load_device, dtype=base_dtype, strength=lora_strength) - block.self_attn.k_loras = LoRALinearLayer(dim, dim, rank=128, device=transformer_load_device, dtype=base_dtype, strength=lora_strength) - block.self_attn.v_loras = LoRALinearLayer(dim, dim, rank=128, device=transformer_load_device, dtype=base_dtype, strength=lora_strength) - for lora in [block.self_attn.q_loras, block.self_attn.k_loras, block.self_attn.v_loras]: - for param in lora.parameters(): - param.requires_grad = False - for name, param in transformer.named_parameters(): - if "lora" in name: - param.data.copy_(lora_sd["diffusion_model." + name].to(param.device, dtype=param.dtype)) - else: - patcher, _ = load_lora_for_models(patcher, None, lora_sd, lora_strength, 0) - - del lora_sd - - if not gguf and merge_loras: - log.info("Patching LoRA to the model...") - patcher = apply_lora( - patcher, device, transformer_load_device, - params_to_keep=params_to_keep, dtype=dtype, base_dtype=base_dtype, state_dict=sd, - low_mem_load=lora_low_mem_load, control_lora=control_lora, scale_weights=scale_weights) - scale_weights.clear() - patcher.patches.clear() - - if gguf: - #from diffusers.quantizers.gguf.utils import _replace_with_gguf_linear, GGUFParameter - from .gguf.gguf import _replace_with_gguf_linear, GGUFParameter - log.info("Using GGUF to load and assign model weights to device...") - param_count = sum(1 for _ in transformer.named_parameters()) - - out_features = sd["blocks.0.self_attn.k.weight"].shape[1] - - patcher.model.diffusion_model = _replace_with_gguf_linear(patcher.model.diffusion_model, base_dtype, sd, patches=patcher.patches) - pbar = ProgressBar(param_count) - cnt = 0 - for name, param in tqdm(patcher.model.diffusion_model.named_parameters(), - desc=f"Loading transformer parameters to {transformer_load_device}", - total=param_count, - leave=True): - if "loras" in name: - continue - #print(name, param.dtype, param.device, param.shape) - if isinstance(param, GGUFParameter): - dtype_to_use = torch.uint8 - elif "patch_embedding" in name: - dtype_to_use = torch.float32 - else: - dtype_to_use = base_dtype - set_module_tensor_to_device(patcher.model.diffusion_model, name, device=transformer_load_device, dtype=dtype_to_use, value=sd[name]) - cnt += 1 - if cnt % 100 == 0: - pbar.update(100) - - #for name, param in transformer.named_parameters(): - # print(name, param.dtype, param.device, param.shape) - #patcher.load(device, full_load=True) - pbar.update_absolute(param_count) - - patcher.model.is_patched = True - - patch_linear = (True if "scaled" in quantization or (lora is not None and not merge_loras) else False) - if "fast" in quantization: if lora is not None and not merge_loras: raise NotImplementedError("fp8_fast is not supported with unmerged LoRAs") @@ -1577,8 +1479,6 @@ class WanVideoVAELoader: def loadmodel(self, model_name, precision, compile_args=None): dtype = {"bf16": torch.bfloat16, "fp16": torch.float16, "fp32": torch.float32}[precision] - #with open(os.path.join(script_directory, 'configs', 'hy_vae_config.json')) as f: - # vae_config = json.load(f) model_path = folder_paths.get_full_path("vae", model_name) vae_sd = load_torch_file(model_path, safe_load=True) @@ -1592,8 +1492,9 @@ class WanVideoVAELoader: vae = WanVideoVAE38(dtype=dtype) vae.load_state_dict(vae_sd) + del vae_sd vae.eval() - vae.to(device = offload_device, dtype = dtype) + vae.to(device=offload_device, dtype=dtype) if compile_args is not None: vae.model.decoder = torch.compile(vae.model.decoder, fullgraph=compile_args["fullgraph"], dynamic=compile_args["dynamic"], backend=compile_args["backend"], mode=compile_args["mode"]) From 288a7e96a97a8a233cd1a8b993adc28c640bca70 Mon Sep 17 00:00:00 2001 From: kijai <40791699+kijai@users.noreply.github.com> Date: Mon, 25 Aug 2025 14:53:36 +0300 Subject: [PATCH 22/23] Add experimental scheduler node with sigma plot --- .../wanvideo_FLF2V_720P_example_02.json | 421 ++++++++++-------- nodes.py | 88 +++- wanvideo/schedulers/__init__.py | 12 +- 3 files changed, 313 insertions(+), 208 deletions(-) diff --git a/example_workflows/wanvideo_FLF2V_720P_example_02.json b/example_workflows/wanvideo_FLF2V_720P_example_02.json index 8d37929..a2fd652 100644 --- a/example_workflows/wanvideo_FLF2V_720P_example_02.json +++ b/example_workflows/wanvideo_FLF2V_720P_example_02.json @@ -611,6 +611,7 @@ }, { "name": "image_2", + "shape": 7, "type": "IMAGE", "link": 152 }, @@ -662,6 +663,7 @@ }, { "name": "image_2", + "shape": 7, "type": "IMAGE", "link": 150 } @@ -806,7 +808,14 @@ "flags": {}, "order": 9, "mode": 0, - "inputs": [], + "inputs": [ + { + "name": "compile_args", + "shape": 7, + "type": "WANCOMPILEARGS", + "link": null + } + ], "outputs": [ { "name": "vae", @@ -903,7 +912,7 @@ ], "size": [ 887.1368408203125, - 934.646484375 + 334 ], "flags": {}, "order": 38, @@ -988,6 +997,7 @@ "inputs": [ { "name": "vae", + "shape": 7, "type": "WANVAE", "link": 170 }, @@ -1095,6 +1105,7 @@ "inputs": [ { "name": "t5", + "shape": 7, "type": "WANTEXTENCODER", "link": 15 }, @@ -1123,7 +1134,9 @@ "widgets_values": [ "CG动画风格,一只蓝色的小鸟从地面起飞,煽动翅膀。小鸟羽毛细腻,胸前有独特的花纹,背景是蓝天白云,阳光明媚。镜跟随小鸟向上移动,展现出小鸟飞翔的姿态和天空的广阔。近景,仰视视角", "色调艳丽,过曝,静态,细节模糊不清,字幕,风格,作品,画作,画面,静止,整体发灰,最差质量,低质量,JPEG压缩残留,丑陋的,残缺的,多余的手指,画得不好的手部,画得不好的脸部,畸形的,毁容的,形态畸形的肢体,手指融合,静止不动的画面,杂乱的背景,三条腿,背景人很多,倒着走", - true + true, + false, + "gpu" ], "color": "#332922", "bgcolor": "#593930" @@ -1219,7 +1232,7 @@ ], "size": [ 315, - 154 + 202 ], "flags": {}, "order": 11, @@ -1245,7 +1258,9 @@ false, false, true, - 0 + 0, + 0, + false ], "color": "#223", "bgcolor": "#335" @@ -1477,7 +1492,8 @@ "0, 0, 0", "center", 16, - "cpu" + "cpu", + "Output: 1 x 640 x 640 | 4.69MB" ] }, { @@ -1489,7 +1505,7 @@ ], "size": [ 270, - 286 + 336 ], "flags": {}, "order": 28, @@ -1564,9 +1580,199 @@ "0, 0, 0", "center", 16, - "cpu" + "cpu", + "Output: 1 x 640 x 640 | 4.69MB" ] }, + { + "id": 106, + "type": "WanVideoLoraSelect", + "pos": [ + -336.7720642089844, + -698.3348999023438 + ], + "size": [ + 424.9496765136719, + 150 + ], + "flags": {}, + "order": 17, + "mode": 0, + "inputs": [ + { + "name": "prev_lora", + "shape": 7, + "type": "WANVIDLORA", + "link": null + }, + { + "name": "blocks", + "shape": 7, + "type": "SELECTEDBLOCKS", + "link": null + } + ], + "outputs": [ + { + "name": "lora", + "type": "WANVIDLORA", + "links": [ + 179 + ] + } + ], + "properties": { + "cnr_id": "ComfyUI-WanVideoWrapper", + "ver": "974dd656dab305f7fa122cca435759105ea44488", + "Node name for S&R": "WanVideoLoraSelect" + }, + "widgets_values": [ + "Wan21_T2V_14B_lightx2v_cfg_step_distill_lora_rank32.safetensors", + 1.2000000000000002, + false, + true + ], + "color": "#223", + "bgcolor": "#335" + }, + { + "id": 35, + "type": "WanVideoTorchCompileSettings", + "pos": [ + -307.4797058105469, + -1197.4749755859375 + ], + "size": [ + 421.6000061035156, + 202 + ], + "flags": {}, + "order": 18, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "torch_compile_args", + "type": "WANCOMPILEARGS", + "slot_index": 0, + "links": [ + 190 + ] + } + ], + "properties": { + "cnr_id": "ComfyUI-WanVideoWrapper", + "ver": "d9b1f4d1a5aea91d101ae97a54714a5861af3f50", + "Node name for S&R": "WanVideoTorchCompileSettings" + }, + "widgets_values": [ + "inductor", + false, + "default", + false, + 64, + true, + 128 + ], + "color": "#223", + "bgcolor": "#335" + }, + { + "id": 22, + "type": "WanVideoModelLoader", + "pos": [ + 119.37029266357422, + -926.8419799804688 + ], + "size": [ + 477.4410095214844, + 314 + ], + "flags": {}, + "order": 24, + "mode": 0, + "inputs": [ + { + "name": "compile_args", + "shape": 7, + "type": "WANCOMPILEARGS", + "link": 190 + }, + { + "name": "block_swap_args", + "shape": 7, + "type": "BLOCKSWAPARGS", + "link": 174 + }, + { + "name": "lora", + "shape": 7, + "type": "WANVIDLORA", + "link": 179 + }, + { + "name": "vram_management_args", + "shape": 7, + "type": "VRAM_MANAGEMENTARGS", + "link": null + }, + { + "name": "extra_model", + "shape": 7, + "type": "VACEPATH", + "link": null + }, + { + "name": "fantasytalking_model", + "shape": 7, + "type": "FANTASYTALKINGMODEL", + "link": null + }, + { + "name": "multitalk_model", + "shape": 7, + "type": "MULTITALKMODEL", + "link": null + }, + { + "name": "fantasyportrait_model", + "shape": 7, + "type": "FANTASYPORTRAITMODEL", + "link": null + }, + { + "name": "vace_model", + "shape": 7, + "type": "VACEPATH", + "link": null + } + ], + "outputs": [ + { + "name": "model", + "type": "WANVIDEOMODEL", + "slot_index": 0, + "links": [ + 29, + 103 + ] + } + ], + "properties": { + "cnr_id": "ComfyUI-WanVideoWrapper", + "ver": "d9b1f4d1a5aea91d101ae97a54714a5861af3f50", + "Node name for S&R": "WanVideoModelLoader" + }, + "widgets_values": [ + "WanVideo\\Wan2_1-FLF2V-14B-720P_fp8_e4m3fn.safetensors", + "fp16_fast", + "fp8_e4m3fn", + "offload_device", + "sageattn" + ], + "color": "#223", + "bgcolor": "#335" + }, { "id": 27, "type": "WanVideoSampler", @@ -1675,6 +1881,12 @@ "shape": 7, "type": "MULTITALK_EMBEDS", "link": null + }, + { + "name": "freeinit_args", + "shape": 7, + "type": "FREEINITARGS", + "link": null } ], "outputs": [ @@ -1685,6 +1897,11 @@ "links": [ 166 ] + }, + { + "name": "denoised_samples", + "type": "LATENT", + "links": null } ], "properties": { @@ -1704,184 +1921,10 @@ 1, "", "comfy", - "" - ] - }, - { - "id": 106, - "type": "WanVideoLoraSelect", - "pos": [ - -336.7720642089844, - -698.3348999023438 - ], - "size": [ - 424.9496765136719, - 126 - ], - "flags": {}, - "order": 17, - "mode": 0, - "inputs": [ - { - "name": "prev_lora", - "shape": 7, - "type": "WANVIDLORA", - "link": null - }, - { - "name": "blocks", - "shape": 7, - "type": "SELECTEDBLOCKS", - "link": null - } - ], - "outputs": [ - { - "name": "lora", - "type": "WANVIDLORA", - "links": [ - 179 - ] - } - ], - "properties": { - "cnr_id": "ComfyUI-WanVideoWrapper", - "ver": "974dd656dab305f7fa122cca435759105ea44488", - "Node name for S&R": "WanVideoLoraSelect" - }, - "widgets_values": [ - "Wan21_T2V_14B_lightx2v_cfg_step_distill_lora_rank32.safetensors", - 1.2000000000000002, + 0, + -1, false - ], - "color": "#223", - "bgcolor": "#335" - }, - { - "id": 35, - "type": "WanVideoTorchCompileSettings", - "pos": [ - -307.4797058105469, - -1197.4749755859375 - ], - "size": [ - 421.6000061035156, - 202 - ], - "flags": {}, - "order": 18, - "mode": 0, - "inputs": [], - "outputs": [ - { - "name": "torch_compile_args", - "type": "WANCOMPILEARGS", - "slot_index": 0, - "links": [ - 190 - ] - } - ], - "properties": { - "cnr_id": "ComfyUI-WanVideoWrapper", - "ver": "d9b1f4d1a5aea91d101ae97a54714a5861af3f50", - "Node name for S&R": "WanVideoTorchCompileSettings" - }, - "widgets_values": [ - "inductor", - false, - "default", - false, - 64, - true, - 128 - ], - "color": "#223", - "bgcolor": "#335" - }, - { - "id": 22, - "type": "WanVideoModelLoader", - "pos": [ - 119.37029266357422, - -926.8419799804688 - ], - "size": [ - 477.4410095214844, - 274 - ], - "flags": {}, - "order": 24, - "mode": 0, - "inputs": [ - { - "name": "compile_args", - "shape": 7, - "type": "WANCOMPILEARGS", - "link": 190 - }, - { - "name": "block_swap_args", - "shape": 7, - "type": "BLOCKSWAPARGS", - "link": 174 - }, - { - "name": "lora", - "shape": 7, - "type": "WANVIDLORA", - "link": 179 - }, - { - "name": "vram_management_args", - "shape": 7, - "type": "VRAM_MANAGEMENTARGS", - "link": null - }, - { - "name": "vace_model", - "shape": 7, - "type": "VACEPATH", - "link": null - }, - { - "name": "fantasytalking_model", - "shape": 7, - "type": "FANTASYTALKINGMODEL", - "link": null - }, - { - "name": "multitalk_model", - "shape": 7, - "type": "MULTITALKMODEL", - "link": null - } - ], - "outputs": [ - { - "name": "model", - "type": "WANVIDEOMODEL", - "slot_index": 0, - "links": [ - 29, - 103 - ] - } - ], - "properties": { - "cnr_id": "ComfyUI-WanVideoWrapper", - "ver": "d9b1f4d1a5aea91d101ae97a54714a5861af3f50", - "Node name for S&R": "WanVideoModelLoader" - }, - "widgets_values": [ - "WanVideo\\Wan2_1-FLF2V-14B-720P_fp8_e4m3fn.safetensors", - "fp16_fast", - "fp8_e4m3fn", - "offload_device", - "sageattn" - ], - "color": "#223", - "bgcolor": "#335" + ] } ], "links": [ @@ -2216,13 +2259,13 @@ "config": {}, "extra": { "ds": { - "scale": 0.6727499949326076, + "scale": 0.6115909044841886, "offset": [ - 359.0502881120043, - 1009.7385911003805 + 710.2610924809787, + 967.8431584929548 ] }, - "frontendVersion": "1.23.4", + "frontendVersion": "1.26.3", "node_versions": { "ComfyUI-WanVideoWrapper": "f8f423eceeadf2edcb58fab73701333e83ca733e", "comfy-core": "0.3.26", diff --git a/nodes.py b/nodes.py index 1c44246..422201b 100644 --- a/nodes.py +++ b/nodes.py @@ -1582,17 +1582,78 @@ class WanVideoScheduler: #WIP def INPUT_TYPES(s): return {"required": { "scheduler": (scheduler_list, {"default": "unipc"}), + "steps": ("INT", {"default": 30, "min": 1, "tooltip": "Number of steps for the scheduler"}), + "shift": ("FLOAT", {"default": 5.0, "min": 0.0, "max": 1000.0, "step": 0.01}), + "start_step": ("INT", {"default": 0, "min": 0, "tooltip": "Starting step for the scheduler"}), + "end_step": ("INT", {"default": -1, "min": -1, "tooltip": "Ending step for the scheduler"}) + }, + "optional": { + "sigmas": ("SIGMAS", ), + }, + "hidden": { + "unique_id": "UNIQUE_ID", }, } - RETURN_TYPES = (scheduler_list, ) - RETURN_NAMES = ("scheduler",) + RETURN_TYPES = ("SIGMAS", "INT", "FLOAT", scheduler_list, "INT", "INT",) + RETURN_NAMES = ("sigmas", "steps", "shift", "scheduler", "start_step", "end_step") FUNCTION = "process" CATEGORY = "WanVideoWrapper" EXPERIMENTAL = True - def process(self, scheduler): - return (scheduler,) + def process(self, scheduler, steps, start_step, end_step, shift, unique_id, sigmas=None): + sample_scheduler, timesteps = get_scheduler( + scheduler, + steps, + start_step, end_step, shift, + device, + sigmas=sigmas) + + scheduler_dict = { + "sample_scheduler": sample_scheduler, + "timesteps": timesteps, + } + + try: + from server import PromptServer + import io + import base64 + import matplotlib.pyplot as plt + except: + PromptServer = None + if unique_id and PromptServer is not None: + try: + # Plot sigmas and save to a buffer + sigmas_np = sample_scheduler.full_sigmas[:-1].cpu().numpy() + buf = io.BytesIO() + fig = plt.figure(facecolor='#353535') + ax = fig.add_subplot(111) + ax.set_facecolor('#353535') # Set axes background color + ax.plot(sigmas_np) + ax.set_title("Sigmas", color='white') # Title font color + ax.set_xlabel("Step", color='white') # X label font color + ax.set_ylabel("Sigma Value", color='white') # Y label font color + ax.tick_params(axis='x', colors='white') # X tick color + ax.tick_params(axis='y', colors='white') # Y tick color + # Add split point if end_step is defined + if end_step != -1 and 0 <= end_step < len(sigmas_np): + ax.axvline(end_step, color='red', linestyle='--', linewidth=2, label='end_step split') + ax.legend() + plt.tight_layout() + plt.savefig(buf, format='png') + plt.close(fig) + buf.seek(0) + img_base64 = base64.b64encode(buf.read()).decode('utf-8') + buf.close() + + # Send as HTML img tag with base64 data + html_img = f"Sigmas Plot" + PromptServer.instance.send_progress_text(html_img, unique_id) + except Exception as e: + print("Failed to send sigmas plot:", e) + pass + + return (sigmas, steps, shift, scheduler_dict, start_step, end_step) rope_functions = ["default", "comfy", "comfy_chunked"] class WanVideoRoPEFunction: @@ -1744,8 +1805,11 @@ class WanVideoSampler: #region Scheduler sample_scheduler = None - if scheduler != "multitalk": - sample_scheduler, timesteps, scheduler_step_args = get_scheduler(scheduler, steps, start_step, end_step, shift, device, transformer.dim, flowedit_args, denoise_strength, sigmas=sigmas, seed_g=seed_g) + if isinstance(scheduler, dict): + sample_scheduler = scheduler["sample_scheduler"] + timesteps = scheduler["timesteps"] + elif scheduler != "multitalk": + sample_scheduler, timesteps = get_scheduler(scheduler, steps, start_step, end_step, shift, device, transformer.dim, flowedit_args, denoise_strength, sigmas=sigmas) log.info(f"sigmas: {sample_scheduler.sigmas}") else: timesteps = torch.tensor([1000, 750, 500, 250], device=device) @@ -1761,7 +1825,11 @@ class WanVideoSampler: start_step = steps - int(steps * denoise_strength) - 1 add_noise_to_samples = True #for now to not break old workflows - noise_pred_flipped = None + scheduler_step_args = {"generator": seed_g} + step_sig = inspect.signature(sample_scheduler.step) + for arg in list(scheduler_step_args.keys()): + if arg not in step_sig.parameters: + scheduler_step_args.pop(arg) if isinstance(cfg, list): if steps < len(cfg): @@ -1778,7 +1846,7 @@ class WanVideoSampler: vace_data = vace_context = vace_scale = None fun_or_fl2v_model = has_ref = drop_last = False phantom_latents = fun_ref_image = ATI_tracks = None - add_cond = attn_cond = attn_cond_neg = None + add_cond = attn_cond = attn_cond_neg = noise_pred_flipped = None #I2V image_cond = image_embeds.get("image_embeds", None) @@ -2792,7 +2860,7 @@ class WanVideoSampler: # FreeInit noise reinitialization (after first iteration) if freeinit_args is not None and iter_idx > 0: # restart scheduler for each iteration - sample_scheduler, timesteps, scheduler_step_args = get_scheduler(scheduler, steps, start_step, end_step, shift, device, transformer.dim, flowedit_args, denoise_strength, sigmas=sigmas, seed_g=seed_g) + sample_scheduler, timesteps = get_scheduler(scheduler, steps, start_step, end_step, shift, device, transformer.dim, flowedit_args, denoise_strength, sigmas=sigmas) # Re-apply start_step and end_step logic to timesteps and sigmas if end_step != -1: @@ -3310,7 +3378,7 @@ class WanVideoSampler: timesteps = [torch.tensor([t], device=device) for t in timesteps] timesteps = [timestep_transform(t, shift=shift, num_timesteps=1000) for t in timesteps] else: - sample_scheduler, timesteps, scheduler_step_args = get_scheduler(scheduler, total_steps, start_step, end_step, shift, device, transformer.dim, flowedit_args, denoise_strength, sigmas=sigmas, seed_g=seed_g) + sample_scheduler, timesteps = get_scheduler(scheduler, total_steps, start_step, end_step, shift, device, transformer.dim, flowedit_args, denoise_strength, sigmas=sigmas) timesteps = [torch.tensor([float(t)], device=device) for t in timesteps] + [torch.tensor([0.], device=device)] # sample videos diff --git a/wanvideo/schedulers/__init__.py b/wanvideo/schedulers/__init__.py index dc63457..407e107 100644 --- a/wanvideo/schedulers/__init__.py +++ b/wanvideo/schedulers/__init__.py @@ -23,7 +23,7 @@ scheduler_list = [ "multitalk" ] -def get_scheduler(scheduler, steps, start_step, end_step, shift, device, transformer_dim, flowedit_args, denoise_strength, sigmas=None, seed_g=None): +def get_scheduler(scheduler, steps, start_step, end_step, shift, device, transformer_dim=5120, flowedit_args=None, denoise_strength=1.0, sigmas=None): timesteps = None if 'unipc' in scheduler: sample_scheduler = FlowUniPCMultistepScheduler(shift=shift) @@ -130,6 +130,7 @@ def get_scheduler(scheduler, steps, start_step, end_step, shift, device, transfo # Slice timesteps and sigmas once, based on indices timesteps = timesteps[start_idx:end_idx+1] + sample_scheduler.full_sigmas = sample_scheduler.sigmas.clone() sample_scheduler.sigmas = sample_scheduler.sigmas[start_idx:start_idx+len(timesteps)+1] # always one longer @@ -138,11 +139,4 @@ def get_scheduler(scheduler, steps, start_step, end_step, shift, device, transfo if hasattr(sample_scheduler, 'timesteps'): sample_scheduler.timesteps = timesteps - if seed_g is not None: - scheduler_step_args = {"generator": seed_g} - step_sig = inspect.signature(sample_scheduler.step) - for arg in list(scheduler_step_args.keys()): - if arg not in step_sig.parameters: - scheduler_step_args.pop(arg) - - return sample_scheduler, timesteps, scheduler_step_args \ No newline at end of file + return sample_scheduler, timesteps \ No newline at end of file From 4f13aa46d43c83c07083aff2350ee646bad28979 Mon Sep 17 00:00:00 2001 From: kijai <40791699+kijai@users.noreply.github.com> Date: Tue, 26 Aug 2025 01:12:22 +0300 Subject: [PATCH 23/23] Update nodes.py --- nodes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes.py b/nodes.py index 49d47f5..37e7ea4 100644 --- a/nodes.py +++ b/nodes.py @@ -3839,7 +3839,7 @@ class WanVideoDecode: images = images.permute(1, 2, 3, 0).cpu().float() return (images,) else: - if end_image: + if end_image is not None: enable_vae_tiling = False images = vae.decode(latents, device=device, end_=(end_image is not None), tiled=enable_vae_tiling, tile_size=(tile_x//8, tile_y//8), tile_stride=(tile_stride_x//8, tile_stride_y//8))[0] vae.model.clear_cache()