From 3b5a2298d7e62c7cb6505d1f3f8f09e8c5cb9d13 Mon Sep 17 00:00:00 2001 From: RVC-Boss <129054828+RVC-Boss@users.noreply.github.com> Date: Sun, 14 May 2023 15:05:42 +0800 Subject: [PATCH 01/14] Add files via upload --- extract_f0_print.py | 19 +- extract_feature_print.py | 19 +- infer-web.py | 356 ++++++++++++++--------- train_nsf_sim_cache_sid_load_pretrain.py | 47 ++- trainset_preprocess_pipeline_print.py | 10 +- vc_infer_pipeline.py | 72 ++--- 6 files changed, 305 insertions(+), 218 deletions(-) diff --git a/extract_f0_print.py b/extract_f0_print.py index d2fef0f..fc689f7 100644 --- a/extract_f0_print.py +++ b/extract_f0_print.py @@ -1,5 +1,7 @@ import os, traceback, sys, parselmouth -import librosa +now_dir = os.getcwd() +sys.path.append(now_dir) +from my_utils import load_audio import pyworld from scipy.io import wavfile import numpy as np, logging @@ -33,17 +35,14 @@ class FeatureInput(object): self.f0_mel_max = 1127 * np.log(1 + self.f0_max / 700) def compute_f0(self, path, f0_method): - # default resample type of librosa.resample is "soxr_hq". - # Quality: soxr_vhq > soxr_hq - x, sr = librosa.load(path, self.fs) # , res_type='soxr_vhq' + x=load_audio(path,self.fs) p_len = x.shape[0] // self.hop - assert sr == self.fs if f0_method == "pm": time_step = 160 / 16000 * 1000 f0_min = 50 f0_max = 1100 f0 = ( - parselmouth.Sound(x, sr) + parselmouth.Sound(x, self.fs) .to_pitch_ac( time_step=time_step / 1000, voicing_threshold=0.6, @@ -60,19 +59,19 @@ class FeatureInput(object): elif f0_method == "harvest": f0, t = pyworld.harvest( x.astype(np.double), - fs=sr, + fs=self.fs, f0_ceil=self.f0_max, f0_floor=self.f0_min, - frame_period=1000 * self.hop / sr, + frame_period=1000 * self.hop / self.fs, ) f0 = pyworld.stonemask(x.astype(np.double), f0, t, self.fs) elif f0_method == "dio": f0, t = pyworld.dio( x.astype(np.double), - fs=sr, + fs=self.fs, f0_ceil=self.f0_max, f0_floor=self.f0_min, - frame_period=1000 * self.hop / sr, + frame_period=1000 * self.hop / self.fs, ) f0 = pyworld.stonemask(x.astype(np.double), f0, t, self.fs) return f0 diff --git a/extract_feature_print.py b/extract_feature_print.py index f1c4f9a..37cc4e2 100644 --- a/extract_feature_print.py +++ b/extract_feature_print.py @@ -9,7 +9,7 @@ else: i_gpu = sys.argv[4] exp_dir = sys.argv[5] os.environ["CUDA_VISIBLE_DEVICES"] = str(i_gpu) - +version = sys.argv[6] import torch import torch.nn.functional as F import soundfile as sf @@ -18,12 +18,9 @@ from fairseq import checkpoint_utils device = torch.device("cuda" if torch.cuda.is_available() else "cpu") -if torch.cuda.is_available(): - device = "cuda" -elif torch.backends.mps.is_available(): - device = "mps" -else: - device = "cpu" +if torch.cuda.is_available():device="cuda" +elif torch.backends.mps.is_available():device="mps" +else:device="cpu" f = open("%s/extract_f0_feature.log" % exp_dir, "a+") @@ -39,7 +36,7 @@ model_path = "hubert_base.pt" printt(exp_dir) wavPath = "%s/1_16k_wavs" % exp_dir -outPath = "%s/3_feature256" % exp_dir +outPath = "%s/3_feature256" % exp_dir if version=="v1"else "%s/3_feature768" % exp_dir os.makedirs(outPath, exist_ok=True) @@ -67,7 +64,7 @@ models, saved_cfg, task = checkpoint_utils.load_model_ensemble_and_task( model = models[0] model = model.to(device) printt("move model to %s" % device) -if device not in ["mps", "cpu"]: +if device not in ["mps","cpu"]: model = model.half() model.eval() @@ -93,11 +90,11 @@ else: if device not in ["mps", "cpu"] else feats.to(device), "padding_mask": padding_mask.to(device), - "output_layer": 9, # layer 9 + "output_layer": 9 if version=="v1"else 12, # layer 9 } with torch.no_grad(): logits = model.extract_features(**inputs) - feats = model.final_proj(logits[0]) + feats = model.final_proj(logits[0])if version=="v1"else logits[0] feats = feats.squeeze(0).float().cpu().numpy() if np.isnan(feats).sum() == 0: diff --git a/infer-web.py b/infer-web.py index 089eab4..200f2c1 100644 --- a/infer-web.py +++ b/infer-web.py @@ -1,9 +1,9 @@ +import torch, os, traceback, sys, warnings, shutil, numpy as np +os.environ["no_proxy"]="localhost, 127.0.0.1, ::1" from multiprocessing import cpu_count import threading from time import sleep from subprocess import Popen -from time import sleep -import torch, os, traceback, sys, warnings, shutil, numpy as np import faiss from random import shuffle @@ -11,8 +11,8 @@ now_dir = os.getcwd() sys.path.append(now_dir) tmp = os.path.join(now_dir, "TEMP") shutil.rmtree(tmp, ignore_errors=True) -shutil.rmtree("%s/runtime/Lib/site-packages/infer_pack" % (now_dir), ignore_errors=True) -shutil.rmtree("%s/runtime/Lib/site-packages/uvr5_pack" % (now_dir), ignore_errors=True) +shutil.rmtree("%s/runtime/Lib/site-packages/infer_pack"%(now_dir), ignore_errors=True) +shutil.rmtree("%s/runtime/Lib/site-packages/uvr5_pack"%(now_dir) , ignore_errors=True) os.makedirs(tmp, exist_ok=True) os.makedirs(os.path.join(now_dir, "logs"), exist_ok=True) os.makedirs(os.path.join(now_dir, "weights"), exist_ok=True) @@ -70,7 +70,7 @@ else: gpu_info = i18n("很遗憾您这没有能用的显卡来支持您训练") default_batch_size = 1 gpus = "-".join([i[0] for i in gpu_infos]) -from infer_pack.models import SynthesizerTrnMs256NSFsid, SynthesizerTrnMs256NSFsid_nono +from infer_pack.models import SynthesizerTrnMs256NSFsid, SynthesizerTrnMs256NSFsid_nono,SynthesizerTrnMs768NSFsid, SynthesizerTrnMs768NSFsid_nono from scipy.io import wavfile from fairseq import checkpoint_utils import gradio as gr @@ -121,11 +121,11 @@ names = [] for name in os.listdir(weight_root): if name.endswith(".pth"): names.append(name) -index_paths = [] +index_paths=[] for root, dirs, files in os.walk(index_root, topdown=False): for name in files: if name.endswith(".index") and "trained" not in name: - index_paths.append("%s/%s" % (root, name)) + index_paths.append("%s/%s"%(root,name)) uvr5_names = [] for name in os.listdir(weight_uvr5_root): if name.endswith(".pth"): @@ -144,29 +144,29 @@ def vc_single( index_rate, filter_radius, resample_sr, + rms_mix_rate ): # spk_item, input_audio0, vc_transform0,f0_file,f0method0 - global tgt_sr, net_g, vc, hubert_model + global tgt_sr, net_g, vc, hubert_model,version if input_audio_path is None: return "You need to upload an audio", None f0_up_key = int(f0_up_key) try: audio = load_audio(input_audio_path, 16000) + audio_max=np.abs(audio).max()/0.95 + if(audio_max>1): + audio/=audio_max times = [0, 0, 0] if hubert_model == None: load_hubert() if_f0 = cpt.get("f0", 1) file_index = ( - ( - file_index.strip(" ") - .strip('"') - .strip("\n") - .strip('"') - .strip(" ") - .replace("trained", "added") - ) - if file_index != "" - else file_index2 - ) # 防止小白写错,自动帮他替换掉 + file_index.strip(" ") + .strip('"') + .strip("\n") + .strip('"') + .strip(" ") + .replace("trained", "added") + )if file_index!=""else file_index2 # 防止小白写错,自动帮他替换掉 # file_big_npy = ( # file_big_npy.strip(" ").strip('"').strip("\n").strip('"').strip(" ") # ) @@ -186,21 +186,14 @@ def vc_single( filter_radius, tgt_sr, resample_sr, + rms_mix_rate, + version, f0_file=f0_file, ) - if resample_sr >= 16000 and tgt_sr != resample_sr: - tgt_sr = resample_sr - index_info = ( - "Using index:%s." % file_index - if os.path.exists(file_index) - else "Index not used." - ) - return "Success.\n %s\nTime:\n npy:%ss, f0:%ss, infer:%ss" % ( - index_info, - times[0], - times[1], - times[2], - ), (tgt_sr, audio_opt) + if(resample_sr>=16000 and tgt_sr!=resample_sr): + tgt_sr=resample_sr + index_info="Using index:%s."%file_index if os.path.exists(file_index)else"Index not used." + return "Success.\n %s\nTime:\n npy:%ss, f0:%ss, infer:%ss"%(index_info,times[0],times[1],times[2]), (tgt_sr, audio_opt) except: info = traceback.format_exc() print(info) @@ -220,6 +213,7 @@ def vc_multi( index_rate, filter_radius, resample_sr, + rms_mix_rate ): try: dir_path = ( @@ -249,8 +243,9 @@ def vc_multi( index_rate, filter_radius, resample_sr, + rms_mix_rate ) - if "Success" in info: + if "Success"in info: try: tgt_sr, audio_opt = opt wavfile.write( @@ -335,8 +330,8 @@ def uvr(model_name, inp_root, save_root_vocal, paths, save_root_ins, agg): # 一个选项卡全局只能有一个音色 def get_vc(sid): - global n_spk, tgt_sr, net_g, vc, cpt - if sid == "" or sid == []: + global n_spk, tgt_sr, net_g, vc, cpt,version + if sid == ""or sid==[]: global hubert_model if hubert_model != None: # 考虑到轮询, 需要加个判断看是否 sid 是由有模型切换到无模型的 print("clean_empty_cache") @@ -346,12 +341,17 @@ def get_vc(sid): torch.cuda.empty_cache() ###楼下不这么折腾清理不干净 if_f0 = cpt.get("f0", 1) - if if_f0 == 1: - net_g = SynthesizerTrnMs256NSFsid( - *cpt["config"], is_half=config.is_half - ) - else: - net_g = SynthesizerTrnMs256NSFsid_nono(*cpt["config"]) + version = cpt.get("version", "v1") + if (version == "v1"): + if if_f0 == 1: + net_g = SynthesizerTrnMs256NSFsid(*cpt["config"], is_half=config.is_half) + else: + net_g = SynthesizerTrnMs256NSFsid_nono(*cpt["config"]) + elif (version == "v2"): + if if_f0 == 1: + net_g = SynthesizerTrnMs768NSFsid(*cpt["config"], is_half=config.is_half) + else: + net_g = SynthesizerTrnMs768NSFsid_nono(*cpt["config"]) del net_g, cpt if torch.cuda.is_available(): torch.cuda.empty_cache() @@ -363,12 +363,19 @@ def get_vc(sid): tgt_sr = cpt["config"][-1] cpt["config"][-3] = cpt["weight"]["emb_g.weight"].shape[0] # n_spk if_f0 = cpt.get("f0", 1) - if if_f0 == 1: - net_g = SynthesizerTrnMs256NSFsid(*cpt["config"], is_half=config.is_half) - else: - net_g = SynthesizerTrnMs256NSFsid_nono(*cpt["config"]) + version = cpt.get("version", "v1") + if(version=="v1"): + if if_f0 == 1: + net_g = SynthesizerTrnMs256NSFsid(*cpt["config"], is_half=config.is_half) + else: + net_g = SynthesizerTrnMs256NSFsid_nono(*cpt["config"]) + elif(version=="v2"): + if if_f0 == 1: + net_g = SynthesizerTrnMs768NSFsid(*cpt["config"], is_half=config.is_half) + else: + net_g = SynthesizerTrnMs768NSFsid_nono(*cpt["config"]) del net_g.enc_q - print(net_g.load_state_dict(cpt["weight"], strict=False)) # 不加这一行清不干净, 真奇葩 + print(net_g.load_state_dict(cpt["weight"], strict=False)) net_g.eval().to(config.device) if config.is_half: net_g = net_g.half() @@ -384,37 +391,17 @@ def change_choices(): for name in os.listdir(weight_root): if name.endswith(".pth"): names.append(name) - index_paths = [] + index_paths=[] for root, dirs, files in os.walk(index_root, topdown=False): for name in files: if name.endswith(".index") and "trained" not in name: index_paths.append("%s/%s" % (root, name)) - return {"choices": sorted(names), "__type__": "update"}, { - "choices": sorted(index_paths), - "__type__": "update", - } + return {"choices": sorted(names), "__type__": "update"},{"choices": sorted(index_paths), "__type__": "update"} def clean(): return {"value": "", "__type__": "update"} - -def change_f0(if_f0_3, sr2): # np7, f0method8,pretrained_G14,pretrained_D15 - if if_f0_3: - return ( - {"visible": True, "__type__": "update"}, - {"visible": True, "__type__": "update"}, - "pretrained/f0G%s.pth" % sr2, - "pretrained/f0D%s.pth" % sr2, - ) - return ( - {"visible": False, "__type__": "update"}, - {"visible": False, "__type__": "update"}, - "pretrained/G%s.pth" % sr2, - "pretrained/D%s.pth" % sr2, - ) - - sr_dict = { "32k": 32000, "40k": 40000, @@ -481,7 +468,7 @@ def preprocess_dataset(trainset_dir, exp_dir, sr, n_p): # but2.click(extract_f0,[gpus6,np7,f0method8,if_f0_3,trainset_dir4],[info2]) -def extract_f0_feature(gpus, n_p, f0method, if_f0, exp_dir): +def extract_f0_feature(gpus, n_p, f0method, if_f0, exp_dir,version19): gpus = gpus.split("-") os.makedirs("%s/logs/%s" % (now_dir, exp_dir), exist_ok=True) f = open("%s/logs/%s/extract_f0_feature.log" % (now_dir, exp_dir), "w") @@ -527,13 +514,14 @@ def extract_f0_feature(gpus, n_p, f0method, if_f0, exp_dir): leng = len(gpus) ps = [] for idx, n_g in enumerate(gpus): - cmd = config.python_cmd + " extract_feature_print.py %s %s %s %s %s/logs/%s" % ( + cmd = config.python_cmd + " extract_feature_print.py %s %s %s %s %s/logs/%s %s" % ( config.device, leng, idx, n_g, now_dir, exp_dir, + version19, ) print(cmd) p = Popen( @@ -561,12 +549,33 @@ def extract_f0_feature(gpus, n_p, f0method, if_f0, exp_dir): yield log -def change_sr2(sr2, if_f0_3): - if if_f0_3: - return "pretrained/f0G%s.pth" % sr2, "pretrained/f0D%s.pth" % sr2 - else: - return "pretrained/G%s.pth" % sr2, "pretrained/D%s.pth" % sr2 +def change_sr2(sr2, if_f0_3,version19): + vis_v=True if sr2=="40k"else False + if(sr2!="40k"):version19="v1" + path_str=""if version19=="v1"else "_v2" + version_state={"visible": vis_v, "__type__": "update"} + if(vis_v==False):version_state["value"]="v1" + f0_str="f0"if if_f0_3 else"" + return "pretrained%s/%sG%s.pth" % (path_str,f0_str,sr2), "pretrained%s/%sD%s.pth" % (path_str,f0_str,sr2),version_state +def change_version19(sr2,if_f0_3,version19): + path_str=""if version19=="v1"else "_v2" + f0_str="f0"if if_f0_3 else"" + return "pretrained%s/%sG%s.pth" % (path_str,f0_str,sr2), "pretrained%s/%sD%s.pth" % (path_str,f0_str,sr2) + +def change_f0(if_f0_3, sr2,version19): # f0method8,pretrained_G14,pretrained_D15 + path_str=""if version19=="v1"else "_v2" + if if_f0_3: + return ( + {"visible": True, "__type__": "update"}, + "pretrained%s/f0G%s.pth" % (path_str,sr2), + "pretrained%s/f0D%s.pth" % (path_str,sr2), + ) + return ( + {"visible": False, "__type__": "update"}, + "pretrained%s/G%s.pth" % (path_str,sr2), + "pretrained%s/D%s.pth" % (path_str,sr2), + ) # but3.click(click_train,[exp_dir1,sr2,if_f0_3,save_epoch10,total_epoch11,batch_size12,if_save_latest13,pretrained_G14,pretrained_D15,gpus16]) def click_train( @@ -582,24 +591,26 @@ def click_train( pretrained_D15, gpus16, if_cache_gpu17, + if_save_every_weights18, + version19, ): # 生成filelist exp_dir = "%s/logs/%s" % (now_dir, exp_dir1) os.makedirs(exp_dir, exist_ok=True) gt_wavs_dir = "%s/0_gt_wavs" % (exp_dir) - co256_dir = "%s/3_feature256" % (exp_dir) + feature_dir = "%s/3_feature256" % (exp_dir)if version19=="v1"else "%s/3_feature768" % (exp_dir) if if_f0_3: f0_dir = "%s/2a_f0" % (exp_dir) f0nsf_dir = "%s/2b-f0nsf" % (exp_dir) names = ( set([name.split(".")[0] for name in os.listdir(gt_wavs_dir)]) - & set([name.split(".")[0] for name in os.listdir(co256_dir)]) + & set([name.split(".")[0] for name in os.listdir(feature_dir)]) & set([name.split(".")[0] for name in os.listdir(f0_dir)]) & set([name.split(".")[0] for name in os.listdir(f0nsf_dir)]) ) else: names = set([name.split(".")[0] for name in os.listdir(gt_wavs_dir)]) & set( - [name.split(".")[0] for name in os.listdir(co256_dir)] + [name.split(".")[0] for name in os.listdir(feature_dir)] ) opt = [] for name in names: @@ -609,7 +620,7 @@ def click_train( % ( gt_wavs_dir.replace("\\", "\\\\"), name, - co256_dir.replace("\\", "\\\\"), + feature_dir.replace("\\", "\\\\"), name, f0_dir.replace("\\", "\\\\"), name, @@ -624,22 +635,23 @@ def click_train( % ( gt_wavs_dir.replace("\\", "\\\\"), name, - co256_dir.replace("\\", "\\\\"), + feature_dir.replace("\\", "\\\\"), name, spk_id5, ) ) + fea_dim = 256 if version19 == "v1"else 768 if if_f0_3: for _ in range(2): opt.append( - "%s/logs/mute/0_gt_wavs/mute%s.wav|%s/logs/mute/3_feature256/mute.npy|%s/logs/mute/2a_f0/mute.wav.npy|%s/logs/mute/2b-f0nsf/mute.wav.npy|%s" - % (now_dir, sr2, now_dir, now_dir, now_dir, spk_id5) + "%s/logs/mute/0_gt_wavs/mute%s.wav|%s/logs/mute/3_feature%s/mute.npy|%s/logs/mute/2a_f0/mute.wav.npy|%s/logs/mute/2b-f0nsf/mute.wav.npy|%s" + % (now_dir, sr2, now_dir,fea_dim, now_dir, now_dir, spk_id5) ) else: for _ in range(2): opt.append( - "%s/logs/mute/0_gt_wavs/mute%s.wav|%s/logs/mute/3_feature256/mute.npy|%s" - % (now_dir, sr2, now_dir, spk_id5) + "%s/logs/mute/0_gt_wavs/mute%s.wav|%s/logs/mute/3_feature%s/mute.npy|%s" + % (now_dir, sr2, now_dir,fea_dim, spk_id5) ) shuffle(opt) with open("%s/filelist.txt" % exp_dir, "w") as f: @@ -651,7 +663,7 @@ def click_train( if gpus16: cmd = ( config.python_cmd - + " train_nsf_sim_cache_sid_load_pretrain.py -e %s -sr %s -f0 %s -bs %s -g %s -te %s -se %s -pg %s -pd %s -l %s -c %s" + + " train_nsf_sim_cache_sid_load_pretrain.py -e %s -sr %s -f0 %s -bs %s -g %s -te %s -se %s -pg %s -pd %s -l %s -c %s -sw %s -v %s" % ( exp_dir1, sr2, @@ -664,12 +676,14 @@ def click_train( pretrained_D15, 1 if if_save_latest13 == i18n("是") else 0, 1 if if_cache_gpu17 == i18n("是") else 0, + 1 if if_save_every_weights18 == i18n("是") else 0, + version19, ) ) else: cmd = ( config.python_cmd - + " train_nsf_sim_cache_sid_load_pretrain.py -e %s -sr %s -f0 %s -bs %s -te %s -se %s -pg %s -pd %s -l %s -c %s" + + " train_nsf_sim_cache_sid_load_pretrain.py -e %s -sr %s -f0 %s -bs %s -te %s -se %s -pg %s -pd %s -l %s -c %s -sw %s -v %s" % ( exp_dir1, sr2, @@ -681,6 +695,8 @@ def click_train( pretrained_D15, 1 if if_save_latest13 == i18n("是") else 0, 1 if if_cache_gpu17 == i18n("是") else 0, + 1 if if_save_every_weights18 == i18n("是") else 0, + version19, ) ) print(cmd) @@ -690,10 +706,10 @@ def click_train( # but4.click(train_index, [exp_dir1], info3) -def train_index(exp_dir1): +def train_index(exp_dir1,version19): exp_dir = "%s/logs/%s" % (now_dir, exp_dir1) os.makedirs(exp_dir, exist_ok=True) - feature_dir = "%s/3_feature256" % (exp_dir) + feature_dir = "%s/3_feature256" % (exp_dir)if version19=="v1"else "%s/3_feature768" % (exp_dir) if os.path.exists(feature_dir) == False: return "请先进行特征提取!" listdir_res = list(os.listdir(feature_dir)) @@ -713,8 +729,8 @@ def train_index(exp_dir1): infos = [] infos.append("%s,%s" % (big_npy.shape, n_ivf)) yield "\n".join(infos) - index = faiss.index_factory(256, "IVF%s,Flat" % n_ivf) - # index = faiss.index_factory(256, "IVF%s,PQ128x4fs,RFlat"%n_ivf) + index = faiss.index_factory(256if version19=="v1"else 768, "IVF%s,Flat" % n_ivf) + # index = faiss.index_factory(256if version19=="v1"else 768, "IVF%s,PQ128x4fs,RFlat"%n_ivf) infos.append("training") yield "\n".join(infos) index_ivf = faiss.extract_index_ivf(index) # @@ -722,9 +738,9 @@ def train_index(exp_dir1): index.train(big_npy) faiss.write_index( index, - "%s/trained_IVF%s_Flat_nprobe_%s.index" % (exp_dir, n_ivf, index_ivf.nprobe), + "%s/trained_IVF%s_Flat_nprobe_%s_%s.index" % (exp_dir, n_ivf, index_ivf.nprobe,version19), ) - # faiss.write_index(index, '%s/trained_IVF%s_Flat_FastScan.index'%(exp_dir,n_ivf)) + # faiss.write_index(index, '%s/trained_IVF%s_Flat_FastScan_%s.index'%(exp_dir,n_ivf,version19)) infos.append("adding") yield "\n".join(infos) batch_size_add = 8192 @@ -734,9 +750,9 @@ def train_index(exp_dir1): index, "%s/added_IVF%s_Flat_nprobe_%s.index" % (exp_dir, n_ivf, index_ivf.nprobe), ) - infos.append("成功构建索引,added_IVF%s_Flat_nprobe_%s.index" % (n_ivf, index_ivf.nprobe)) - # faiss.write_index(index, '%s/added_IVF%s_Flat_FastScan.index'%(exp_dir,n_ivf)) - # infos.append("成功构建索引,added_IVF%s_Flat_FastScan.index"%(n_ivf)) + infos.append("成功构建索引,added_IVF%s_Flat_nprobe_%s_%s.index" % (n_ivf, index_ivf.nprobe,version19)) + # faiss.write_index(index, '%s/added_IVF%s_Flat_FastScan_%s.index'%(exp_dir,n_ivf,version19)) + # infos.append("成功构建索引,added_IVF%s_Flat_FastScan_%s.index"%(n_ivf,version19)) yield "\n".join(infos) @@ -757,6 +773,8 @@ def train1key( pretrained_D15, gpus16, if_cache_gpu17, + if_save_every_weights18, + version19, ): infos = [] @@ -768,7 +786,7 @@ def train1key( preprocess_log_path = "%s/preprocess.log" % model_log_dir extract_f0_feature_log_path = "%s/extract_f0_feature.log" % model_log_dir gt_wavs_dir = "%s/0_gt_wavs" % model_log_dir - feature256_dir = "%s/3_feature256" % model_log_dir + feature_dir = "%s/3_feature256" % model_log_dir if version19=="v1"else "%s/3_feature768" % model_log_dir os.makedirs(model_log_dir, exist_ok=True) #########step1:处理数据 @@ -807,12 +825,12 @@ def train1key( leng = len(gpus) ps = [] for idx, n_g in enumerate(gpus): - cmd = config.python_cmd + " extract_feature_print.py %s %s %s %s %s" % ( + cmd = config.python_cmd + " extract_feature_print.py %s %s %s %s %s %s" % ( config.device, leng, idx, n_g, - model_log_dir, + model_log_dir,version19, ) yield get_info_str(cmd) p = Popen( @@ -831,13 +849,13 @@ def train1key( f0nsf_dir = "%s/2b-f0nsf" % model_log_dir names = ( set([name.split(".")[0] for name in os.listdir(gt_wavs_dir)]) - & set([name.split(".")[0] for name in os.listdir(feature256_dir)]) + & set([name.split(".")[0] for name in os.listdir(feature_dir)]) & set([name.split(".")[0] for name in os.listdir(f0_dir)]) & set([name.split(".")[0] for name in os.listdir(f0nsf_dir)]) ) else: names = set([name.split(".")[0] for name in os.listdir(gt_wavs_dir)]) & set( - [name.split(".")[0] for name in os.listdir(feature256_dir)] + [name.split(".")[0] for name in os.listdir(feature_dir)] ) opt = [] for name in names: @@ -847,7 +865,7 @@ def train1key( % ( gt_wavs_dir.replace("\\", "\\\\"), name, - feature256_dir.replace("\\", "\\\\"), + feature_dir.replace("\\", "\\\\"), name, f0_dir.replace("\\", "\\\\"), name, @@ -862,22 +880,23 @@ def train1key( % ( gt_wavs_dir.replace("\\", "\\\\"), name, - feature256_dir.replace("\\", "\\\\"), + feature_dir.replace("\\", "\\\\"), name, spk_id5, ) ) + fea_dim=256 if version19=="v1"else 768 if if_f0_3: for _ in range(2): opt.append( - "%s/logs/mute/0_gt_wavs/mute%s.wav|%s/logs/mute/3_feature256/mute.npy|%s/logs/mute/2a_f0/mute.wav.npy|%s/logs/mute/2b-f0nsf/mute.wav.npy|%s" - % (now_dir, sr2, now_dir, now_dir, now_dir, spk_id5) + "%s/logs/mute/0_gt_wavs/mute%s.wav|%s/logs/mute/3_feature%s/mute.npy|%s/logs/mute/2a_f0/mute.wav.npy|%s/logs/mute/2b-f0nsf/mute.wav.npy|%s" + % (now_dir, sr2, now_dir,fea_dim, now_dir, now_dir, spk_id5) ) else: for _ in range(2): opt.append( - "%s/logs/mute/0_gt_wavs/mute%s.wav|%s/logs/mute/3_feature256/mute.npy|%s" - % (now_dir, sr2, now_dir, spk_id5) + "%s/logs/mute/0_gt_wavs/mute%s.wav|%s/logs/mute/3_feature%s/mute.npy|%s" + % (now_dir, sr2, now_dir,fea_dim, spk_id5) ) shuffle(opt) with open("%s/filelist.txt" % model_log_dir, "w") as f: @@ -886,7 +905,7 @@ def train1key( if gpus16: cmd = ( config.python_cmd - + " train_nsf_sim_cache_sid_load_pretrain.py -e %s -sr %s -f0 %s -bs %s -g %s -te %s -se %s -pg %s -pd %s -l %s -c %s" + + " train_nsf_sim_cache_sid_load_pretrain.py -e %s -sr %s -f0 %s -bs %s -g %s -te %s -se %s -pg %s -pd %s -l %s -c %s -sw %s -v %s" % ( exp_dir1, sr2, @@ -899,12 +918,14 @@ def train1key( pretrained_D15, 1 if if_save_latest13 == i18n("是") else 0, 1 if if_cache_gpu17 == i18n("是") else 0, + 1 if if_save_every_weights18 == i18n("是") else 0, + version19, ) ) else: cmd = ( config.python_cmd - + " train_nsf_sim_cache_sid_load_pretrain.py -e %s -sr %s -f0 %s -bs %s -te %s -se %s -pg %s -pd %s -l %s -c %s" + + " train_nsf_sim_cache_sid_load_pretrain.py -e %s -sr %s -f0 %s -bs %s -te %s -se %s -pg %s -pd %s -l %s -c %s -sw %s -v %s" % ( exp_dir1, sr2, @@ -916,6 +937,8 @@ def train1key( pretrained_D15, 1 if if_save_latest13 == i18n("是") else 0, 1 if if_cache_gpu17 == i18n("是") else 0, + 1 if if_save_every_weights18 == i18n("是") else 0, + version19, ) ) yield get_info_str(cmd) @@ -924,9 +947,9 @@ def train1key( yield get_info_str(i18n("训练结束, 您可查看控制台训练日志或实验文件夹下的train.log")) #######step3b:训练索引 npys = [] - listdir_res = list(os.listdir(feature256_dir)) + listdir_res = list(os.listdir(feature_dir)) for name in sorted(listdir_res): - phone = np.load("%s/%s" % (feature256_dir, name)) + phone = np.load("%s/%s" % (feature_dir, name)) npys.append(phone) big_npy = np.concatenate(npys, 0) @@ -938,15 +961,15 @@ def train1key( # n_ivf = big_npy.shape[0] // 39 n_ivf = min(int(16 * np.sqrt(big_npy.shape[0])), big_npy.shape[0] // 39) yield get_info_str("%s,%s" % (big_npy.shape, n_ivf)) - index = faiss.index_factory(256, "IVF%s,Flat" % n_ivf) + index = faiss.index_factory(256 if version19=="v1"else 768, "IVF%s,Flat" % n_ivf) yield get_info_str("training index") index_ivf = faiss.extract_index_ivf(index) # index_ivf.nprobe = 1 index.train(big_npy) faiss.write_index( index, - "%s/trained_IVF%s_Flat_nprobe_%s.index" - % (model_log_dir, n_ivf, index_ivf.nprobe), + "%s/trained_IVF%s_Flat_nprobe_%s_%s.index" + % (model_log_dir, n_ivf, index_ivf.nprobe,version19), ) yield get_info_str("adding index") batch_size_add = 8192 @@ -954,11 +977,11 @@ def train1key( index.add(big_npy[i : i + batch_size_add]) faiss.write_index( index, - "%s/added_IVF%s_Flat_nprobe_%s.index" - % (model_log_dir, n_ivf, index_ivf.nprobe), + "%s/added_IVF%s_Flat_nprobe_%s_%s.index" + % (model_log_dir, n_ivf, index_ivf.nprobe,version19), ) yield get_info_str( - "成功构建索引, added_IVF%s_Flat_nprobe_%s.index" % (n_ivf, index_ivf.nprobe) + "成功构建索引, added_IVF%s_Flat_nprobe_%s_%s.index" % (n_ivf, index_ivf.nprobe,version19) ) yield get_info_str(i18n("全流程结束!")) @@ -969,17 +992,18 @@ def change_info_(ckpt_path): os.path.exists(ckpt_path.replace(os.path.basename(ckpt_path), "train.log")) == False ): - return {"__type__": "update"}, {"__type__": "update"} + return {"__type__": "update"}, {"__type__": "update"}, {"__type__": "update"} try: with open( ckpt_path.replace(os.path.basename(ckpt_path), "train.log"), "r" ) as f: info = eval(f.read().strip("\n").split("\n")[0].split("\t")[-1]) sr, f0 = info["sample_rate"], info["if_f0"] - return sr, str(f0) + version="v2"if("version"in info and info["version"]=="v2")else"v1" + return sr, str(f0),version except: traceback.print_exc() - return {"__type__": "update"}, {"__type__": "update"} + return {"__type__": "update"}, {"__type__": "update"}, {"__type__": "update"} from infer_pack.models_onnx_moess import SynthesizerTrnMs256NSFsidM @@ -1112,7 +1136,7 @@ with gr.Blocks() as app: value="pm", interactive=True, ) - filter_radius0 = gr.Slider( + filter_radius0=gr.Slider( minimum=0, maximum=7, label=i18n(">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音"), @@ -1131,9 +1155,7 @@ with gr.Blocks() as app: choices=sorted(index_paths), interactive=True, ) - refresh_button.click( - fn=change_choices, inputs=[], outputs=[sid0, file_index2] - ) + refresh_button.click(fn=change_choices, inputs=[], outputs=[sid0, file_index2]) # file_big_npy1 = gr.Textbox( # label=i18n("特征文件路径"), # value="E:\\codes\py39\\vits_vc_gpu_train\\logs\\mi-test-1key\\total_fea.npy", @@ -1146,7 +1168,7 @@ with gr.Blocks() as app: value=0.76, interactive=True, ) - resample_sr0 = gr.Slider( + resample_sr0=gr.Slider( minimum=0, maximum=48000, label=i18n("后处理重采样至最终采样率,0为不进行重采样"), @@ -1154,6 +1176,13 @@ with gr.Blocks() as app: step=1, interactive=True, ) + rms_mix_rate0 = gr.Slider( + minimum=0, + maximum=1, + label=i18n("输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络"), + value=1, + interactive=True, + ) f0_file = gr.File(label=i18n("F0曲线文件, 可选, 一行一个音高, 代替默认F0及升降调")) but0 = gr.Button(i18n("转换"), variant="primary") with gr.Column(): @@ -1173,6 +1202,7 @@ with gr.Blocks() as app: index_rate1, filter_radius0, resample_sr0, + rms_mix_rate0 ], [vc_output1, vc_output2], ) @@ -1192,7 +1222,7 @@ with gr.Blocks() as app: value="pm", interactive=True, ) - filter_radius1 = gr.Slider( + filter_radius1=gr.Slider( minimum=0, maximum=7, label=i18n(">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音"), @@ -1223,7 +1253,7 @@ with gr.Blocks() as app: value=1, interactive=True, ) - resample_sr1 = gr.Slider( + resample_sr1=gr.Slider( minimum=0, maximum=48000, label=i18n("后处理重采样至最终采样率,0为不进行重采样"), @@ -1231,6 +1261,13 @@ with gr.Blocks() as app: step=1, interactive=True, ) + rms_mix_rate1 = gr.Slider( + minimum=0, + maximum=1, + label=i18n("输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络"), + value=1, + interactive=True, + ) with gr.Column(): dir_input = gr.Textbox( label=i18n("输入待处理音频文件夹路径(去文件管理器地址栏拷就行了)"), @@ -1256,6 +1293,7 @@ with gr.Blocks() as app: index_rate2, filter_radius1, resample_sr1, + rms_mix_rate1 ], [vc_output3], ) @@ -1324,6 +1362,13 @@ with gr.Blocks() as app: value=True, interactive=True, ) + version19 = gr.Radio( + label=i18n("版本(目前仅40k支持了v2)"), + choices=["v1", "v2"], + value="v1", + interactive=True, + visible=True, + ) np7 = gr.Slider( minimum=0, maximum=ncpu, @@ -1353,7 +1398,7 @@ with gr.Blocks() as app: but1 = gr.Button(i18n("处理数据"), variant="primary") info1 = gr.Textbox(label=i18n("输出信息"), value="") but1.click( - preprocess_dataset, [trainset_dir4, exp_dir1, sr2, np7], [info1] + preprocess_dataset, [trainset_dir4, exp_dir1, sr2,np7], [info1] ) with gr.Group(): gr.Markdown(value=i18n("step2b: 使用CPU提取音高(如果模型带音高), 使用GPU提取特征(选择卡号)")) @@ -1378,7 +1423,7 @@ with gr.Blocks() as app: info2 = gr.Textbox(label=i18n("输出信息"), value="", max_lines=8) but2.click( extract_f0_feature, - [gpus6, np7, f0method8, if_f0_3, exp_dir1], + [gpus6, np7, f0method8, if_f0_3, exp_dir1,version19], [info2], ) with gr.Group(): @@ -1422,6 +1467,14 @@ with gr.Blocks() as app: value=i18n("否"), interactive=True, ) + if_save_every_weights18 = gr.Radio( + label=i18n( + "是否在每次保存时间点将最终小模型保存至weights文件夹" + ), + choices=[i18n("是"), i18n("否")], + value=i18n("否"), + interactive=True, + ) with gr.Row(): pretrained_G14 = gr.Textbox( label=i18n("加载预训练底模G路径"), @@ -1434,12 +1487,15 @@ with gr.Blocks() as app: interactive=True, ) sr2.change( - change_sr2, [sr2, if_f0_3], [pretrained_G14, pretrained_D15] + change_sr2, [sr2, if_f0_3,version19], [pretrained_G14, pretrained_D15,version19] + ) + version19.change( + change_version19, [sr2, if_f0_3,version19], [pretrained_G14, pretrained_D15] ) if_f0_3.change( change_f0, - [if_f0_3, sr2], - [np7, f0method8, pretrained_G14, pretrained_D15], + [if_f0_3, sr2,version19], + [f0method8, pretrained_G14, pretrained_D15], ) gpus16 = gr.Textbox( label=i18n("以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2"), @@ -1465,10 +1521,12 @@ with gr.Blocks() as app: pretrained_D15, gpus16, if_cache_gpu17, + if_save_every_weights18, + version19, ], info3, ) - but4.click(train_index, [exp_dir1], info3) + but4.click(train_index, [exp_dir1,version19], info3) but5.click( train1key, [ @@ -1487,6 +1545,8 @@ with gr.Blocks() as app: pretrained_D15, gpus16, if_cache_gpu17, + if_save_every_weights18, + version19, ], info3, ) @@ -1526,12 +1586,18 @@ with gr.Blocks() as app: max_lines=1, interactive=True, ) + version_2=gr.Radio( + label=i18n("模型版本型号"), + choices=["v1", "v2"], + value="v1", + interactive=True, + ) with gr.Row(): but6 = gr.Button(i18n("融合"), variant="primary") info4 = gr.Textbox(label=i18n("输出信息"), value="", max_lines=8) but6.click( merge, - [ckpt_a, ckpt_b, alpha_a, sr_, if_f0_, info__, name_to_save0], + [ckpt_a, ckpt_b, alpha_a, sr_, if_f0_, info__, name_to_save0,version_2], info4, ) # def merge(path1,path2,alpha1,sr,f0,info): with gr.Group(): @@ -1589,15 +1655,21 @@ with gr.Blocks() as app: value="1", interactive=True, ) + version_1=gr.Radio( + label=i18n("模型版本型号"), + choices=["v1", "v2"], + value="v1", + interactive=True, + ) info___ = gr.Textbox( label=i18n("要置入的模型信息"), value="", max_lines=8, interactive=True ) but9 = gr.Button(i18n("提取"), variant="primary") info7 = gr.Textbox(label=i18n("输出信息"), value="", max_lines=8) - ckpt_path2.change(change_info_, [ckpt_path2], [sr__, if_f0__]) + ckpt_path2.change(change_info_, [ckpt_path2], [sr__, if_f0__,version_1]) but9.click( extract_small_model, - [ckpt_path2, save_name, sr__, if_f0__, info___], + [ckpt_path2, save_name, sr__, if_f0__, info___,version_1], info7, ) @@ -1615,16 +1687,16 @@ with gr.Blocks() as app: butOnnx = gr.Button(i18n("导出Onnx模型"), variant="primary") butOnnx.click(export_onnx, [ckpt_dir, onnx_dir, moevs], infoOnnx) - tab_faq = i18n("常见问题解答") + tab_faq=i18n("常见问题解答") with gr.TabItem(tab_faq): try: - if tab_faq == "常见问题解答": - with open("docs/faq.md", "r", encoding="utf8") as f: - info = f.read() + if(tab_faq=="常见问题解答"): + with open("docs/faq.md","r",encoding="utf8")as f:info=f.read() else: - with open("docs/faq_en.md", "r") as f: - info = f.read() - gr.Markdown(value=info) + with open("docs/faq_en.md", "r")as f:info = f.read() + gr.Markdown( + value=info + ) except: gr.Markdown(traceback.format_exc()) diff --git a/train_nsf_sim_cache_sid_load_pretrain.py b/train_nsf_sim_cache_sid_load_pretrain.py index 6078490..494c561 100644 --- a/train_nsf_sim_cache_sid_load_pretrain.py +++ b/train_nsf_sim_cache_sid_load_pretrain.py @@ -31,14 +31,21 @@ from data_utils import ( TextAudioCollate, DistributedBucketSampler, ) -from infer_pack.models import ( - SynthesizerTrnMs256NSFsid, - SynthesizerTrnMs256NSFsid_nono, - MultiPeriodDiscriminator, -) +if(hps.version=="v1"): + from infer_pack.models import ( + SynthesizerTrnMs256NSFsid as RVC_Model_f0, + SynthesizerTrnMs256NSFsid_nono as RVC_Model_nof0, + MultiPeriodDiscriminator, + ) +else: + from infer_pack.models import ( + SynthesizerTrnMs768NSFsid as RVC_Model_f0, + SynthesizerTrnMs768NSFsid_nono as RVC_Model_nof0, + MultiPeriodDiscriminatorV2 as MultiPeriodDiscriminator, + ) from losses import generator_loss, discriminator_loss, feature_loss, kl_loss from mel_processing import mel_spectrogram_torch, spec_to_mel_torch - +from process_ckpt import savee global_step = 0 @@ -63,7 +70,7 @@ def run(rank, n_gpus, hps): if rank == 0: logger = utils.get_logger(hps.model_dir) logger.info(hps) - utils.check_git_hash(hps.model_dir) + # utils.check_git_hash(hps.model_dir) writer = SummaryWriter(log_dir=hps.model_dir) writer_eval = SummaryWriter(log_dir=os.path.join(hps.model_dir, "eval")) @@ -104,7 +111,7 @@ def run(rank, n_gpus, hps): prefetch_factor=8, ) if hps.if_f0 == 1: - net_g = SynthesizerTrnMs256NSFsid( + net_g = RVC_Model_f0( hps.data.filter_length // 2 + 1, hps.train.segment_size // hps.data.hop_length, **hps.model, @@ -112,7 +119,7 @@ def run(rank, n_gpus, hps): sr=hps.sample_rate, ) else: - net_g = SynthesizerTrnMs256NSFsid_nono( + net_g = RVC_Model_nof0( hps.data.filter_length // 2 + 1, hps.train.segment_size // hps.data.hop_length, **hps.model, @@ -343,7 +350,7 @@ def train_and_evaluate( spec = spec.cuda(rank, non_blocking=True) spec_lengths = spec_lengths.cuda(rank, non_blocking=True) wave = wave.cuda(rank, non_blocking=True) - wave_lengths = wave_lengths.cuda(rank, non_blocking=True) + # wave_lengths = wave_lengths.cuda(rank, non_blocking=True) # Calculate with autocast(enabled=hps.train.fp16_run): @@ -428,10 +435,10 @@ def train_and_evaluate( ) ) # Amor For Tensorboard display - if loss_mel > 50: - loss_mel = 50 - if loss_kl > 5: - loss_kl = 5 + if loss_mel > 75: + loss_mel = 75 + if loss_kl > 9: + loss_kl = 9 logger.info([global_step, lr]) logger.info( @@ -512,12 +519,20 @@ def train_and_evaluate( epoch, os.path.join(hps.model_dir, "D_{}.pth".format(2333333)), ) + if(rank==0 and hps.save_every_weights=="1"): + if hasattr(net_g, "module"): + ckpt = net_g.module.state_dict() + else: + ckpt = net_g.state_dict() + logger.info( + "saving ckpt %s_e%s:%s" + % (hps.name,epoch,savee(ckpt, hps.sample_rate, hps.if_f0, hps.name+"_e%s"%epoch, epoch,hps.version)) + ) if rank == 0: logger.info("====> Epoch: {}".format(epoch)) if epoch >= hps.total_epoch and rank == 0: logger.info("Training is done. The program is closed.") - from process_ckpt import savee # def savee(ckpt,sr,if_f0,name,epoch): if hasattr(net_g, "module"): ckpt = net_g.module.state_dict() @@ -525,7 +540,7 @@ def train_and_evaluate( ckpt = net_g.state_dict() logger.info( "saving final ckpt:%s" - % (savee(ckpt, hps.sample_rate, hps.if_f0, hps.name, epoch)) + % (savee(ckpt, hps.sample_rate, hps.if_f0, hps.name, epoch,hps.version)) ) sleep(1) os._exit(2333333) diff --git a/trainset_preprocess_pipeline_print.py b/trainset_preprocess_pipeline_print.py index 1f4039c..5c87061 100644 --- a/trainset_preprocess_pipeline_print.py +++ b/trainset_preprocess_pipeline_print.py @@ -32,19 +32,19 @@ class PreProcess: def __init__(self, sr, exp_dir): self.slicer = Slicer( sr=sr, - threshold=-40, - min_length=800, + threshold=-42, + min_length=1500, min_interval=400, hop_size=15, - max_sil_kept=150, + max_sil_kept=500, ) self.sr = sr self.bh, self.ah = signal.butter(N=5, Wn=48, btype="high", fs=self.sr) self.per = 3.7 self.overlap = 0.3 self.tail = self.per + self.overlap - self.max = 0.95 - self.alpha = 0.8 + self.max = 0.9 + self.alpha = 0.75 self.exp_dir = exp_dir self.gt_wavs_dir = "%s/0_gt_wavs" % exp_dir self.wavs16k_dir = "%s/1_16k_wavs" % exp_dir diff --git a/vc_infer_pipeline.py b/vc_infer_pipeline.py index 9564493..7470a91 100644 --- a/vc_infer_pipeline.py +++ b/vc_infer_pipeline.py @@ -2,18 +2,16 @@ import numpy as np, parselmouth, torch, pdb from time import time as ttime import torch.nn.functional as F import scipy.signal as signal -import pyworld, os, traceback, faiss, librosa +import pyworld, os, traceback, faiss,librosa from scipy import signal from functools import lru_cache bh, ah = signal.butter(N=5, Wn=48, btype="high", fs=16000) -input_audio_path2wav = {} - - +input_audio_path2wav={} @lru_cache -def cache_harvest_f0(input_audio_path, fs, f0max, f0min, frame_period): - audio = input_audio_path2wav[input_audio_path] +def cache_harvest_f0(input_audio_path,fs,f0max,f0min,frame_period): + audio=input_audio_path2wav[input_audio_path] f0, t = pyworld.harvest( audio, fs=fs, @@ -24,6 +22,17 @@ def cache_harvest_f0(input_audio_path, fs, f0max, f0min, frame_period): f0 = pyworld.stonemask(audio, f0, t, fs) return f0 +def change_rms(data1,sr1,data2,sr2,rate):#1是输入音频,2是输出音频,rate是2的占比 + # print(data1.max(),data2.max()) + rms1 = librosa.feature.rms(y=data1, frame_length=sr1//2*2, hop_length=sr1//2)#每半秒一个点 + rms2 = librosa.feature.rms(y=data2, frame_length=sr2//2*2, hop_length=sr2//2) + rms1=torch.from_numpy(rms1) + rms1=F.interpolate(rms1.unsqueeze(0), size=data2.shape[0],mode='linear').squeeze() + rms2=torch.from_numpy(rms2) + rms2=F.interpolate(rms2.unsqueeze(0), size=data2.shape[0],mode='linear').squeeze() + rms2=torch.max(rms2,torch.zeros_like(rms2)+1e-6) + data2*=(torch.pow(rms1,torch.tensor(1-rate))*torch.pow(rms2,torch.tensor(rate-1))).numpy() + return data2 class VC(object): def __init__(self, tgt_sr, config): @@ -44,16 +53,7 @@ class VC(object): self.t_max = self.sr * self.x_max # 免查询时长阈值 self.device = config.device - def get_f0( - self, - input_audio_path, - x, - p_len, - f0_up_key, - f0_method, - filter_radius, - inp_f0=None, - ): + def get_f0(self, input_audio_path,x, p_len, f0_up_key, f0_method,filter_radius, inp_f0=None): global input_audio_path2wav time_step = self.window / self.sr * 1000 f0_min = 50 @@ -77,9 +77,9 @@ class VC(object): f0, [[pad_size, p_len - len(f0) - pad_size]], mode="constant" ) elif f0_method == "harvest": - input_audio_path2wav[input_audio_path] = x.astype(np.double) - f0 = cache_harvest_f0(input_audio_path, self.sr, f0_max, f0_min, 10) - if filter_radius > 2: + input_audio_path2wav[input_audio_path]=x.astype(np.double) + f0=cache_harvest_f0(input_audio_path,self.sr,f0_max,f0_min,10) + if(filter_radius>2): f0 = signal.medfilt(f0, 3) f0 *= pow(2, f0_up_key / 12) # with open("test.txt","w")as f:f.write("\n".join([str(i)for i in f0.tolist()])) @@ -118,6 +118,7 @@ class VC(object): index, big_npy, index_rate, + version, ): # ,file_index,file_big_npy feats = torch.from_numpy(audio0) if self.is_half: @@ -133,12 +134,12 @@ class VC(object): inputs = { "source": feats.to(self.device), "padding_mask": padding_mask, - "output_layer": 9, # layer 9 + "output_layer": 9if version=="v1"else 12, } t0 = ttime() with torch.no_grad(): logits = model.extract_features(**inputs) - feats = model.final_proj(logits[0]) + feats = model.final_proj(logits[0])if version=="v1"else logits[0] if ( isinstance(index, type(None)) == False @@ -176,14 +177,14 @@ class VC(object): with torch.no_grad(): if pitch != None and pitchf != None: audio1 = ( - (net_g.infer(feats, p_len, pitch, pitchf, sid)[0][0, 0] * 32768) + (net_g.infer(feats, p_len, pitch, pitchf, sid)[0][0, 0]) .data.cpu() .float() .numpy() ) else: audio1 = ( - (net_g.infer(feats, p_len, sid)[0][0, 0] * 32768) + (net_g.infer(feats, p_len, sid)[0][0, 0]) .data.cpu() .float() .numpy() @@ -213,6 +214,8 @@ class VC(object): filter_radius, tgt_sr, resample_sr, + rms_mix_rate, + version, f0_file=None, ): if ( @@ -267,15 +270,7 @@ class VC(object): sid = torch.tensor(sid, device=self.device).unsqueeze(0).long() pitch, pitchf = None, None if if_f0 == 1: - pitch, pitchf = self.get_f0( - input_audio_path, - audio_pad, - p_len, - f0_up_key, - f0_method, - filter_radius, - inp_f0, - ) + pitch, pitchf = self.get_f0(input_audio_path,audio_pad, p_len, f0_up_key, f0_method,filter_radius, inp_f0) pitch = pitch[:p_len] pitchf = pitchf[:p_len] if self.device == "mps": @@ -299,6 +294,7 @@ class VC(object): index, big_npy, index_rate, + version, )[self.t_pad_tgt : -self.t_pad_tgt] ) else: @@ -314,6 +310,7 @@ class VC(object): index, big_npy, index_rate, + version, )[self.t_pad_tgt : -self.t_pad_tgt] ) s = t @@ -330,6 +327,7 @@ class VC(object): index, big_npy, index_rate, + version, )[self.t_pad_tgt : -self.t_pad_tgt] ) else: @@ -345,14 +343,20 @@ class VC(object): index, big_npy, index_rate, + version, )[self.t_pad_tgt : -self.t_pad_tgt] ) audio_opt = np.concatenate(audio_opt) - if resample_sr >= 16000 and tgt_sr != resample_sr: + if(rms_mix_rate!=1): + audio_opt=change_rms(audio,16000,audio_opt,tgt_sr,rms_mix_rate) + if(resample_sr>=16000 and tgt_sr!=resample_sr): audio_opt = librosa.resample( audio_opt, orig_sr=tgt_sr, target_sr=resample_sr ) - audio_opt = audio_opt.astype(np.int16) + audio_max=np.abs(audio_opt).max()/0.99 + max_int16=32768 + if(audio_max>1):max_int16/=audio_max + audio_opt=(audio_opt * max_int16).astype(np.int16) del pitch, pitchf, sid if torch.cuda.is_available(): torch.cuda.empty_cache() From 404ce9338fc4e5622c40974e0b1160e71599d49a Mon Sep 17 00:00:00 2001 From: RVC-Boss <129054828+RVC-Boss@users.noreply.github.com> Date: Sun, 14 May 2023 15:06:50 +0800 Subject: [PATCH 02/14] Add files via upload --- train/mel_processing.py | 4 ++-- train/process_ckpt.py | 12 ++++++++---- train/utils.py | 12 ++++++++++-- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/train/mel_processing.py b/train/mel_processing.py index 668ea86..3cc3687 100644 --- a/train/mel_processing.py +++ b/train/mel_processing.py @@ -51,9 +51,9 @@ def spectrogram_torch(y, n_fft, sampling_rate, hop_size, win_size, center=False) :: (B, Freq, Frame) - Linear-frequency Linear-amplitude spectrogram """ # Validation - if torch.min(y) < -1.0: + if torch.min(y) < -1.07: print("min value is ", torch.min(y)) - if torch.max(y) > 1.0: + if torch.max(y) > 1.07: print("max value is ", torch.max(y)) # Window - Cache if needed diff --git a/train/process_ckpt.py b/train/process_ckpt.py index b4c8eb0..63cca61 100644 --- a/train/process_ckpt.py +++ b/train/process_ckpt.py @@ -2,7 +2,7 @@ import torch, traceback, os, pdb from collections import OrderedDict -def savee(ckpt, sr, if_f0, name, epoch): +def savee(ckpt, sr, if_f0, name, epoch,version): try: opt = OrderedDict() opt["weight"] = {} @@ -76,6 +76,7 @@ def savee(ckpt, sr, if_f0, name, epoch): opt["info"] = "%sepoch" % epoch opt["sr"] = sr opt["f0"] = if_f0 + opt["version"] = version torch.save(opt, "weights/%s.pth" % name) return "Success." except: @@ -85,16 +86,17 @@ def savee(ckpt, sr, if_f0, name, epoch): def show_info(path): try: a = torch.load(path, map_location="cpu") - return "模型信息:%s\n采样率:%s\n模型是否输入音高引导:%s" % ( + return "模型信息:%s\n采样率:%s\n模型是否输入音高引导:%s\n版本:%s" % ( a.get("info", "None"), a.get("sr", "None"), a.get("f0", "None"), + a.get("version", "None"), ) except: return traceback.format_exc() -def extract_small_model(path, name, sr, if_f0, info): +def extract_small_model(path, name, sr, if_f0, info,version): try: ckpt = torch.load(path, map_location="cpu") if "model" in ckpt: @@ -171,6 +173,7 @@ def extract_small_model(path, name, sr, if_f0, info): if info == "": info = "Extracted model." opt["info"] = info + opt["version"] = version opt["sr"] = sr opt["f0"] = int(if_f0) torch.save(opt, "weights/%s.pth" % name) @@ -191,7 +194,7 @@ def change_info(path, info, name): return traceback.format_exc() -def merge(path1, path2, alpha1, sr, f0, info, name): +def merge(path1, path2, alpha1, sr, f0, info, name,version): try: def extract(ckpt): @@ -241,6 +244,7 @@ def merge(path1, path2, alpha1, sr, f0, info, name): """ opt["sr"] = sr opt["f0"] = 1 if f0 == "是" else 0 + opt["version"] = version opt["info"] = info torch.save(opt, "weights/%s.pth" % name) return "Success." diff --git a/train/utils.py b/train/utils.py index 5ce030a..9b8f92c 100644 --- a/train/utils.py +++ b/train/utils.py @@ -284,8 +284,8 @@ def get_hparams(init=True): bs done pretrainG、pretrainD done 卡号:os.en["CUDA_VISIBLE_DEVICES"] done - if_latest todo - 模型:if_f0 todo + if_latest done + 模型:if_f0 done 采样率:自动选择config done 是否缓存数据集进GPU:if_cache_data_in_gpu done @@ -321,6 +321,12 @@ def get_hparams(init=True): parser.add_argument( "-sr", "--sample_rate", type=str, required=True, help="sample rate, 32k/40k/48k" ) + parser.add_argument( + "-sw", "--save_every_weights", type=str, default="0", help="save the extracted model in weights directory when saving checkpoints" + ) + parser.add_argument( + "-v", "--version", type=str, required=True, help="model version" + ) parser.add_argument( "-f0", "--if_f0", @@ -369,11 +375,13 @@ def get_hparams(init=True): hparams.total_epoch = args.total_epoch hparams.pretrainG = args.pretrainG hparams.pretrainD = args.pretrainD + hparams.version = args.version hparams.gpus = args.gpus hparams.train.batch_size = args.batch_size hparams.sample_rate = args.sample_rate hparams.if_f0 = args.if_f0 hparams.if_latest = args.if_latest + hparams.save_every_weights = args.save_every_weights hparams.if_cache_data_in_gpu = args.if_cache_data_in_gpu hparams.data.training_files = "%s/filelist.txt" % experiment_dir return hparams From 77ff5b08b6da75ddbf30862933a64095864e3931 Mon Sep 17 00:00:00 2001 From: RVC-Boss <129054828+RVC-Boss@users.noreply.github.com> Date: Sun, 14 May 2023 15:07:12 +0800 Subject: [PATCH 03/14] Add files via upload --- infer_pack/models.py | 212 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 173 insertions(+), 39 deletions(-) diff --git a/infer_pack/models.py b/infer_pack/models.py index a7e688e..085d26c 100644 --- a/infer_pack/models.py +++ b/infer_pack/models.py @@ -59,9 +59,7 @@ class TextEncoder256(nn.Module): m, logs = torch.split(stats, self.out_channels, dim=1) return m, logs, x_mask - - -class TextEncoder256Sim(nn.Module): +class TextEncoder768(nn.Module): def __init__( self, out_channels, @@ -81,14 +79,14 @@ class TextEncoder256Sim(nn.Module): self.n_layers = n_layers self.kernel_size = kernel_size self.p_dropout = p_dropout - self.emb_phone = nn.Linear(256, hidden_channels) + self.emb_phone = nn.Linear(768, hidden_channels) self.lrelu = nn.LeakyReLU(0.1, inplace=True) if f0 == True: self.emb_pitch = nn.Embedding(256, hidden_channels) # pitch 256 self.encoder = attentions.Encoder( hidden_channels, filter_channels, n_heads, n_layers, kernel_size, p_dropout ) - self.proj = nn.Conv1d(hidden_channels, out_channels, 1) + self.proj = nn.Conv1d(hidden_channels, out_channels * 2, 1) def forward(self, phone, pitch, lengths): if pitch == None: @@ -102,9 +100,10 @@ class TextEncoder256Sim(nn.Module): x.dtype ) x = self.encoder(x * x_mask, x_mask) - x = self.proj(x) * x_mask - return x, x_mask + stats = self.proj(x) * x_mask + m, logs = torch.split(stats, self.out_channels, dim=1) + return m, logs, x_mask class ResidualCouplingBlock(nn.Module): def __init__( @@ -636,6 +635,115 @@ class SynthesizerTrnMs256NSFsid(nn.Module): z = self.flow(z_p, x_mask, g=g, reverse=True) o = self.dec((z * x_mask)[:, :, :max_len], nsff0, g=g) return o, x_mask, (z, z_p, m_p, logs_p) +class SynthesizerTrnMs768NSFsid(nn.Module): + def __init__( + self, + spec_channels, + segment_size, + inter_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + spk_embed_dim, + gin_channels, + sr, + **kwargs + ): + super().__init__() + if type(sr) == type("strr"): + sr = sr2sr[sr] + self.spec_channels = spec_channels + self.inter_channels = inter_channels + self.hidden_channels = hidden_channels + self.filter_channels = filter_channels + self.n_heads = n_heads + self.n_layers = n_layers + self.kernel_size = kernel_size + self.p_dropout = p_dropout + self.resblock = resblock + self.resblock_kernel_sizes = resblock_kernel_sizes + self.resblock_dilation_sizes = resblock_dilation_sizes + self.upsample_rates = upsample_rates + self.upsample_initial_channel = upsample_initial_channel + self.upsample_kernel_sizes = upsample_kernel_sizes + self.segment_size = segment_size + self.gin_channels = gin_channels + # self.hop_length = hop_length# + self.spk_embed_dim = spk_embed_dim + self.enc_p = TextEncoder768( + inter_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + ) + self.dec = GeneratorNSF( + inter_channels, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + gin_channels=gin_channels, + sr=sr, + is_half=kwargs["is_half"], + ) + self.enc_q = PosteriorEncoder( + spec_channels, + inter_channels, + hidden_channels, + 5, + 1, + 16, + gin_channels=gin_channels, + ) + self.flow = ResidualCouplingBlock( + inter_channels, hidden_channels, 5, 1, 3, gin_channels=gin_channels + ) + self.emb_g = nn.Embedding(self.spk_embed_dim, gin_channels) + print("gin_channels:", gin_channels, "self.spk_embed_dim:", self.spk_embed_dim) + + def remove_weight_norm(self): + self.dec.remove_weight_norm() + self.flow.remove_weight_norm() + self.enc_q.remove_weight_norm() + + def forward( + self, phone, phone_lengths, pitch, pitchf, y, y_lengths, ds + ): # 这里ds是id,[bs,1] + # print(1,pitch.shape)#[bs,t] + g = self.emb_g(ds).unsqueeze(-1) # [b, 256, 1]##1是t,广播的 + m_p, logs_p, x_mask = self.enc_p(phone, pitch, phone_lengths) + z, m_q, logs_q, y_mask = self.enc_q(y, y_lengths, g=g) + z_p = self.flow(z, y_mask, g=g) + z_slice, ids_slice = commons.rand_slice_segments( + z, y_lengths, self.segment_size + ) + # print(-1,pitchf.shape,ids_slice,self.segment_size,self.hop_length,self.segment_size//self.hop_length) + pitchf = commons.slice_segments2(pitchf, ids_slice, self.segment_size) + # print(-2,pitchf.shape,z_slice.shape) + o = self.dec(z_slice, pitchf, g=g) + return o, ids_slice, x_mask, y_mask, (z, z_p, m_p, logs_p, m_q, logs_q) + + def infer(self, phone, phone_lengths, pitch, nsff0, sid, max_len=None): + g = self.emb_g(sid).unsqueeze(-1) + m_p, logs_p, x_mask = self.enc_p(phone, pitch, phone_lengths) + z_p = (m_p + torch.exp(logs_p) * torch.randn_like(m_p) * 0.66666) * x_mask + z = self.flow(z_p, x_mask, g=g, reverse=True) + o = self.dec((z * x_mask)[:, :, :max_len], nsff0, g=g) + return o, x_mask, (z, z_p, m_p, logs_p) class SynthesizerTrnMs256NSFsid_nono(nn.Module): @@ -738,13 +846,7 @@ class SynthesizerTrnMs256NSFsid_nono(nn.Module): z = self.flow(z_p, x_mask, g=g, reverse=True) o = self.dec((z * x_mask)[:, :, :max_len], g=g) return o, x_mask, (z, z_p, m_p, logs_p) - - -class SynthesizerTrnMs256NSFsid_sim(nn.Module): - """ - Synthesizer for Training - """ - +class SynthesizerTrnMs768NSFsid_nono(nn.Module): def __init__( self, spec_channels, @@ -763,9 +865,8 @@ class SynthesizerTrnMs256NSFsid_sim(nn.Module): upsample_initial_channel, upsample_kernel_sizes, spk_embed_dim, - # hop_length, - gin_channels=0, - use_sdp=True, + gin_channels, + sr=None, **kwargs ): super().__init__() @@ -787,7 +888,7 @@ class SynthesizerTrnMs256NSFsid_sim(nn.Module): self.gin_channels = gin_channels # self.hop_length = hop_length# self.spk_embed_dim = spk_embed_dim - self.enc_p = TextEncoder256Sim( + self.enc_p = TextEncoder768( inter_channels, hidden_channels, filter_channels, @@ -795,8 +896,9 @@ class SynthesizerTrnMs256NSFsid_sim(nn.Module): n_layers, kernel_size, p_dropout, + f0=False, ) - self.dec = GeneratorNSF( + self.dec = Generator( inter_channels, resblock, resblock_kernel_sizes, @@ -805,9 +907,16 @@ class SynthesizerTrnMs256NSFsid_sim(nn.Module): upsample_initial_channel, upsample_kernel_sizes, gin_channels=gin_channels, - is_half=kwargs["is_half"], ) - + self.enc_q = PosteriorEncoder( + spec_channels, + inter_channels, + hidden_channels, + 5, + 1, + 16, + gin_channels=gin_channels, + ) self.flow = ResidualCouplingBlock( inter_channels, hidden_channels, 5, 1, 3, gin_channels=gin_channels ) @@ -819,28 +928,24 @@ class SynthesizerTrnMs256NSFsid_sim(nn.Module): self.flow.remove_weight_norm() self.enc_q.remove_weight_norm() - def forward( - self, phone, phone_lengths, pitch, pitchf, y_lengths, ds - ): # y是spec不需要了现在 + def forward(self, phone, phone_lengths, y, y_lengths, ds): # 这里ds是id,[bs,1] g = self.emb_g(ds).unsqueeze(-1) # [b, 256, 1]##1是t,广播的 - x, x_mask = self.enc_p(phone, pitch, phone_lengths) - x = self.flow(x, x_mask, g=g, reverse=True) + m_p, logs_p, x_mask = self.enc_p(phone, None, phone_lengths) + z, m_q, logs_q, y_mask = self.enc_q(y, y_lengths, g=g) + z_p = self.flow(z, y_mask, g=g) z_slice, ids_slice = commons.rand_slice_segments( - x, y_lengths, self.segment_size + z, y_lengths, self.segment_size ) + o = self.dec(z_slice, g=g) + return o, ids_slice, x_mask, y_mask, (z, z_p, m_p, logs_p, m_q, logs_q) - pitchf = commons.slice_segments2(pitchf, ids_slice, self.segment_size) - o = self.dec(z_slice, pitchf, g=g) - return o, ids_slice - - def infer( - self, phone, phone_lengths, pitch, pitchf, ds, max_len=None - ): # y是spec不需要了现在 - g = self.emb_g(ds).unsqueeze(-1) # [b, 256, 1]##1是t,广播的 - x, x_mask = self.enc_p(phone, pitch, phone_lengths) - x = self.flow(x, x_mask, g=g, reverse=True) - o = self.dec((x * x_mask)[:, :, :max_len], pitchf, g=g) - return o, o + def infer(self, phone, phone_lengths, sid, max_len=None): + g = self.emb_g(sid).unsqueeze(-1) + m_p, logs_p, x_mask = self.enc_p(phone, None, phone_lengths) + z_p = (m_p + torch.exp(logs_p) * torch.randn_like(m_p) * 0.66666) * x_mask + z = self.flow(z_p, x_mask, g=g, reverse=True) + o = self.dec((z * x_mask)[:, :, :max_len], g=g) + return o, x_mask, (z, z_p, m_p, logs_p) class MultiPeriodDiscriminator(torch.nn.Module): @@ -872,6 +977,35 @@ class MultiPeriodDiscriminator(torch.nn.Module): return y_d_rs, y_d_gs, fmap_rs, fmap_gs +class MultiPeriodDiscriminatorV2(torch.nn.Module): + def __init__(self, use_spectral_norm=False): + super(MultiPeriodDiscriminatorV2, self).__init__() + # periods = [2, 3, 5, 7, 11, 17] + periods = [2,3, 5, 7, 11, 17, 23, 37] + + discs = [DiscriminatorS(use_spectral_norm=use_spectral_norm)] + discs = discs + [ + DiscriminatorP(i, use_spectral_norm=use_spectral_norm) for i in periods + ] + self.discriminators = nn.ModuleList(discs) + + def forward(self, y, y_hat): + y_d_rs = [] # + y_d_gs = [] + fmap_rs = [] + fmap_gs = [] + for i, d in enumerate(self.discriminators): + y_d_r, fmap_r = d(y) + y_d_g, fmap_g = d(y_hat) + # for j in range(len(fmap_r)): + # print(i,j,y.shape,y_hat.shape,fmap_r[j].shape,fmap_g[j].shape) + y_d_rs.append(y_d_r) + y_d_gs.append(y_d_g) + fmap_rs.append(fmap_r) + fmap_gs.append(fmap_g) + + return y_d_rs, y_d_gs, fmap_rs, fmap_gs + class DiscriminatorS(torch.nn.Module): def __init__(self, use_spectral_norm=False): From 60919b9b02676fb15c6e740d9d7d227939c7bcb1 Mon Sep 17 00:00:00 2001 From: RVC-Boss <129054828+RVC-Boss@users.noreply.github.com> Date: Sun, 14 May 2023 07:16:06 +0000 Subject: [PATCH 04/14] Update Changelog_CN.md --- Changelog_CN.md | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/Changelog_CN.md b/Changelog_CN.md index 351def3..d519841 100644 --- a/Changelog_CN.md +++ b/Changelog_CN.md @@ -7,13 +7,20 @@ - 训练n_cpu进程数从"仅调整f0提取"改为"调整数据预处理和f0提取" - 自动检测logs文件夹下的index路径,提供下拉列表功能 - tab页增加"常见问题解答"(也可参考github-rvc-wiki) +- 相同路径的输入音频推理增加了音高缓存(用途:使用harvest音高提取,整个pipeline会经历漫长且重复的音高提取过程,如果不使用缓存,实验不同音色、索引、音高中值滤波半径参数的用户在第一次测试后的等待结果会非常痛苦) +- +### 20230514更新 +功能更新: +- 音量包络对齐输入混合(可以环节“输入静音输出小幅度噪声”的问题。如果输入音频背景底噪大则不建议开启,默认不开启(值为1可视为不开启)) +- 支持按照指定频率保存提取的小模型(假如你想尝试不同epoch下的推理效果,但是不想保存所有大checkpoint并且每次都要ckpt手工处理提取小模型,这项功能会非常实用) +- 通过设置环境变量解决服务端开了系统全局代理导致浏览器连接错误的问题 +- 支持v2预训练模型(目前只公开了40k版本进行测试,另外2个采样率还没有训练完全) +- 推理前限制超过1的过大音量 +- 微调数据预处理参数 待完成: - 推理音量预处理归一化 -- 推理后处理音量包络融合输入音频的音量包络 -- 增加选项:每次epoch保存的小模型均进行提取 -RVC很快会陆续更新v2版的新底模(先发40k采样率的,32k和48k的仍在训练中)!大幅改善呼吸、清辅音(唇齿音)的电音和撕裂伪影,请期待! ### 20230409更新 - 修正训练参数,提升显卡平均利用率,A100最高从25%提升至90%左右,V100:50%->90%左右,2060S:60%->85%左右,P40:25%->95%左右,训练速度显著提升 From bbc3bcba3b4c7c3bbb44d195ebbd6f9d16aaf8bf Mon Sep 17 00:00:00 2001 From: RVC-Boss <129054828+RVC-Boss@users.noreply.github.com> Date: Sun, 14 May 2023 07:16:47 +0000 Subject: [PATCH 05/14] Create .gitignore --- pretrained_v2/.gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 pretrained_v2/.gitignore diff --git a/pretrained_v2/.gitignore b/pretrained_v2/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/pretrained_v2/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore From 1f63abe3e2c506f41424e74f686b8aaa7c78d7cf Mon Sep 17 00:00:00 2001 From: RVC-Boss <129054828+RVC-Boss@users.noreply.github.com> Date: Sun, 14 May 2023 07:19:35 +0000 Subject: [PATCH 06/14] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 6fb17de..6a02db8 100644 --- a/README.md +++ b/README.md @@ -85,6 +85,10 @@ hubert_base.pt ./uvr5_weights +想测试v2版本模型的话(v2版本模型将特征从 9层hubert+final_proj的256维输入 变更为 12层hubert的768维输入,并且增加了3个周期鉴别器),需要额外下载 + +./pretrained_v2 + #如果你正在使用Windows,则你可能需要这个文件,若ffmpeg和ffprobe已安装则跳过; ubuntu/debian 用户可以通过apt install ffmpeg来安装这2个库 ./ffmpeg From b42f4bf6df212df18fb67e00d78bf74a1d87ac7c Mon Sep 17 00:00:00 2001 From: RVC-Boss <129054828+RVC-Boss@users.noreply.github.com> Date: Sun, 14 May 2023 07:21:30 +0000 Subject: [PATCH 07/14] Update README.en.md --- docs/README.en.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/README.en.md b/docs/README.en.md index b24fe05..3a7989d 100644 --- a/docs/README.en.md +++ b/docs/README.en.md @@ -75,6 +75,10 @@ hubert_base.pt ./uvr5_weights +If you want to test the v2 version model (the v2 version model has changed the input from the 256 dimensional feature of 9-layer Hubert+final_proj to the 768 dimensional feature of 12-layer Hubert, and has added 3 period discriminators), you will need to download additional features + +./pretrained_v2 + #If you are using Windows, you may also need this dictionary, skip if FFmpeg is installed ffmpeg.exe ``` From ac807575ad35aaca00b0d9d58252819d875362c8 Mon Sep 17 00:00:00 2001 From: RVC-Boss <129054828+RVC-Boss@users.noreply.github.com> Date: Sun, 14 May 2023 07:44:03 +0000 Subject: [PATCH 08/14] Update Changelog_CN.md --- Changelog_CN.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Changelog_CN.md b/Changelog_CN.md index d519841..6847f0e 100644 --- a/Changelog_CN.md +++ b/Changelog_CN.md @@ -1,5 +1,4 @@ ### 20230513更新 -功能更新: - 清除一键包内部老版本runtime内残留的infer_pack和uvr5_pack - 修复训练集预处理伪多进程的bug - 增加harvest识别音高可选通过中值滤波削弱哑音现象,可调整中值滤波半径 @@ -8,10 +7,9 @@ - 自动检测logs文件夹下的index路径,提供下拉列表功能 - tab页增加"常见问题解答"(也可参考github-rvc-wiki) - 相同路径的输入音频推理增加了音高缓存(用途:使用harvest音高提取,整个pipeline会经历漫长且重复的音高提取过程,如果不使用缓存,实验不同音色、索引、音高中值滤波半径参数的用户在第一次测试后的等待结果会非常痛苦) -- + ### 20230514更新 -功能更新: -- 音量包络对齐输入混合(可以环节“输入静音输出小幅度噪声”的问题。如果输入音频背景底噪大则不建议开启,默认不开启(值为1可视为不开启)) +- 音量包络对齐输入混合(可以缓解“输入静音输出小幅度噪声”的问题。如果输入音频背景底噪大则不建议开启,默认不开启(值为1可视为不开启)) - 支持按照指定频率保存提取的小模型(假如你想尝试不同epoch下的推理效果,但是不想保存所有大checkpoint并且每次都要ckpt手工处理提取小模型,这项功能会非常实用) - 通过设置环境变量解决服务端开了系统全局代理导致浏览器连接错误的问题 - 支持v2预训练模型(目前只公开了40k版本进行测试,另外2个采样率还没有训练完全) @@ -20,6 +18,7 @@ 待完成: - 推理音量预处理归一化 +- 增加crepe音高提取支持 ### 20230409更新 From 32437314b8338fc17db06558e99fb5ef292acf9f Mon Sep 17 00:00:00 2001 From: RVC-Boss <129054828+RVC-Boss@users.noreply.github.com> Date: Sun, 14 May 2023 07:50:54 +0000 Subject: [PATCH 09/14] Update Changelog_EN.md --- Changelog_EN.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/Changelog_EN.md b/Changelog_EN.md index 87b95d2..ce15d27 100644 --- a/Changelog_EN.md +++ b/Changelog_EN.md @@ -1,3 +1,29 @@ +### 2023-05-13 +- Clear the redundant codes in the old version of runtime in the one-click-package: infer_pack and uvr5_pack +- Fix pseudo multiprocessing bug in training set preprocessing +- Adding median filtering radius adjustment for harvest pitch recognize algorithm +- Support post processing resampling for exporting audio +- Multi processing "n_cpu" setting for training is changed from "f0 extraction" to "data preprocessing and f0 extraction" +- Automatically detect the index paths under the logs folder and provide a drop-down list function +- Add "Frequently Asked Questions and Answers" on the tab page (you can also refer to github RVC wiki) +- When inference, harvest pitch is cached when using same input audio path (purpose: using harvest pitch extraction, the entire pipeline will go through a long and repetitive pitch extraction process. If caching is not used, users who experiment with different timbre, index, and pitch median filtering radius settings will experience a very painful waiting process after the first inference) + +### 2023-05-14 +- Use volume envelope of input to mix or replace the volume envelope of output (can alleviate the problem of "input muting and output small amplitude noise". If the input audio background noise is high, it is not recommended to turn it on, and it is not turned on by default (1 can be considered as not turned on) +- Support saving extracted small models at a specified frequency (if you want to see the performance under different epochs, but do not want to save all large checkpoints and manually extract small models by ckpt-processing every time, this feature will be very practical) +- Resolve the issue of "connection errors" caused by the server's global proxy by setting environment variables +- Supports pre-trained v2 models (currently only 40k versions are publicly available for testing, and the other two sampling rates have not been fully trained yet) +- Limit excessive volume exceeding 1 before inference +- Slightly adjusted the settings of training-set preprocessing + +Todolist: + - Support crepe pitch detect + - Support users to manually select export format of output audios when batch voice conversion processing + +####################### + +History changelogs: + ### 2023-04-09 - Fixed training parameters to improve GPU utilization rate: A100 increased from 25% to around 90%, V100: 50% to around 90%, 2060S: 60% to around 85%, P40: 25% to around 95%; significantly improved training speed - Changed parameter: total batch_size is now per GPU batch_size From 6a3eaef090ce1e0b14ebfd70fdaaabab23b54f65 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 14 May 2023 07:52:36 +0000 Subject: [PATCH 10/14] Format code (#275) Co-authored-by: github-actions[bot] --- extract_f0_print.py | 3 +- extract_feature_print.py | 21 +- infer-web.py | 297 ++++++++++++++--------- infer_pack/models.py | 10 +- train/process_ckpt.py | 6 +- train/utils.py | 6 +- train_nsf_sim_cache_sid_load_pretrain.py | 20 +- vc_infer_pipeline.py | 90 ++++--- 8 files changed, 295 insertions(+), 158 deletions(-) diff --git a/extract_f0_print.py b/extract_f0_print.py index fc689f7..7685ba5 100644 --- a/extract_f0_print.py +++ b/extract_f0_print.py @@ -1,4 +1,5 @@ import os, traceback, sys, parselmouth + now_dir = os.getcwd() sys.path.append(now_dir) from my_utils import load_audio @@ -35,7 +36,7 @@ class FeatureInput(object): self.f0_mel_max = 1127 * np.log(1 + self.f0_max / 700) def compute_f0(self, path, f0_method): - x=load_audio(path,self.fs) + x = load_audio(path, self.fs) p_len = x.shape[0] // self.hop if f0_method == "pm": time_step = 160 / 16000 * 1000 diff --git a/extract_feature_print.py b/extract_feature_print.py index 37cc4e2..fa46afb 100644 --- a/extract_feature_print.py +++ b/extract_feature_print.py @@ -18,9 +18,12 @@ from fairseq import checkpoint_utils device = torch.device("cuda" if torch.cuda.is_available() else "cpu") -if torch.cuda.is_available():device="cuda" -elif torch.backends.mps.is_available():device="mps" -else:device="cpu" +if torch.cuda.is_available(): + device = "cuda" +elif torch.backends.mps.is_available(): + device = "mps" +else: + device = "cpu" f = open("%s/extract_f0_feature.log" % exp_dir, "a+") @@ -36,7 +39,9 @@ model_path = "hubert_base.pt" printt(exp_dir) wavPath = "%s/1_16k_wavs" % exp_dir -outPath = "%s/3_feature256" % exp_dir if version=="v1"else "%s/3_feature768" % exp_dir +outPath = ( + "%s/3_feature256" % exp_dir if version == "v1" else "%s/3_feature768" % exp_dir +) os.makedirs(outPath, exist_ok=True) @@ -64,7 +69,7 @@ models, saved_cfg, task = checkpoint_utils.load_model_ensemble_and_task( model = models[0] model = model.to(device) printt("move model to %s" % device) -if device not in ["mps","cpu"]: +if device not in ["mps", "cpu"]: model = model.half() model.eval() @@ -90,11 +95,13 @@ else: if device not in ["mps", "cpu"] else feats.to(device), "padding_mask": padding_mask.to(device), - "output_layer": 9 if version=="v1"else 12, # layer 9 + "output_layer": 9 if version == "v1" else 12, # layer 9 } with torch.no_grad(): logits = model.extract_features(**inputs) - feats = model.final_proj(logits[0])if version=="v1"else logits[0] + feats = ( + model.final_proj(logits[0]) if version == "v1" else logits[0] + ) feats = feats.squeeze(0).float().cpu().numpy() if np.isnan(feats).sum() == 0: diff --git a/infer-web.py b/infer-web.py index 200f2c1..df2f9a4 100644 --- a/infer-web.py +++ b/infer-web.py @@ -1,5 +1,6 @@ import torch, os, traceback, sys, warnings, shutil, numpy as np -os.environ["no_proxy"]="localhost, 127.0.0.1, ::1" + +os.environ["no_proxy"] = "localhost, 127.0.0.1, ::1" from multiprocessing import cpu_count import threading from time import sleep @@ -11,8 +12,8 @@ now_dir = os.getcwd() sys.path.append(now_dir) tmp = os.path.join(now_dir, "TEMP") shutil.rmtree(tmp, ignore_errors=True) -shutil.rmtree("%s/runtime/Lib/site-packages/infer_pack"%(now_dir), ignore_errors=True) -shutil.rmtree("%s/runtime/Lib/site-packages/uvr5_pack"%(now_dir) , ignore_errors=True) +shutil.rmtree("%s/runtime/Lib/site-packages/infer_pack" % (now_dir), ignore_errors=True) +shutil.rmtree("%s/runtime/Lib/site-packages/uvr5_pack" % (now_dir), ignore_errors=True) os.makedirs(tmp, exist_ok=True) os.makedirs(os.path.join(now_dir, "logs"), exist_ok=True) os.makedirs(os.path.join(now_dir, "weights"), exist_ok=True) @@ -70,7 +71,12 @@ else: gpu_info = i18n("很遗憾您这没有能用的显卡来支持您训练") default_batch_size = 1 gpus = "-".join([i[0] for i in gpu_infos]) -from infer_pack.models import SynthesizerTrnMs256NSFsid, SynthesizerTrnMs256NSFsid_nono,SynthesizerTrnMs768NSFsid, SynthesizerTrnMs768NSFsid_nono +from infer_pack.models import ( + SynthesizerTrnMs256NSFsid, + SynthesizerTrnMs256NSFsid_nono, + SynthesizerTrnMs768NSFsid, + SynthesizerTrnMs768NSFsid_nono, +) from scipy.io import wavfile from fairseq import checkpoint_utils import gradio as gr @@ -121,11 +127,11 @@ names = [] for name in os.listdir(weight_root): if name.endswith(".pth"): names.append(name) -index_paths=[] +index_paths = [] for root, dirs, files in os.walk(index_root, topdown=False): for name in files: if name.endswith(".index") and "trained" not in name: - index_paths.append("%s/%s"%(root,name)) + index_paths.append("%s/%s" % (root, name)) uvr5_names = [] for name in os.listdir(weight_uvr5_root): if name.endswith(".pth"): @@ -144,29 +150,33 @@ def vc_single( index_rate, filter_radius, resample_sr, - rms_mix_rate + rms_mix_rate, ): # spk_item, input_audio0, vc_transform0,f0_file,f0method0 - global tgt_sr, net_g, vc, hubert_model,version + global tgt_sr, net_g, vc, hubert_model, version if input_audio_path is None: return "You need to upload an audio", None f0_up_key = int(f0_up_key) try: audio = load_audio(input_audio_path, 16000) - audio_max=np.abs(audio).max()/0.95 - if(audio_max>1): - audio/=audio_max + audio_max = np.abs(audio).max() / 0.95 + if audio_max > 1: + audio /= audio_max times = [0, 0, 0] if hubert_model == None: load_hubert() if_f0 = cpt.get("f0", 1) file_index = ( - file_index.strip(" ") - .strip('"') - .strip("\n") - .strip('"') - .strip(" ") - .replace("trained", "added") - )if file_index!=""else file_index2 # 防止小白写错,自动帮他替换掉 + ( + file_index.strip(" ") + .strip('"') + .strip("\n") + .strip('"') + .strip(" ") + .replace("trained", "added") + ) + if file_index != "" + else file_index2 + ) # 防止小白写错,自动帮他替换掉 # file_big_npy = ( # file_big_npy.strip(" ").strip('"').strip("\n").strip('"').strip(" ") # ) @@ -190,10 +200,19 @@ def vc_single( version, f0_file=f0_file, ) - if(resample_sr>=16000 and tgt_sr!=resample_sr): - tgt_sr=resample_sr - index_info="Using index:%s."%file_index if os.path.exists(file_index)else"Index not used." - return "Success.\n %s\nTime:\n npy:%ss, f0:%ss, infer:%ss"%(index_info,times[0],times[1],times[2]), (tgt_sr, audio_opt) + if resample_sr >= 16000 and tgt_sr != resample_sr: + tgt_sr = resample_sr + index_info = ( + "Using index:%s." % file_index + if os.path.exists(file_index) + else "Index not used." + ) + return "Success.\n %s\nTime:\n npy:%ss, f0:%ss, infer:%ss" % ( + index_info, + times[0], + times[1], + times[2], + ), (tgt_sr, audio_opt) except: info = traceback.format_exc() print(info) @@ -213,7 +232,7 @@ def vc_multi( index_rate, filter_radius, resample_sr, - rms_mix_rate + rms_mix_rate, ): try: dir_path = ( @@ -243,9 +262,9 @@ def vc_multi( index_rate, filter_radius, resample_sr, - rms_mix_rate + rms_mix_rate, ) - if "Success"in info: + if "Success" in info: try: tgt_sr, audio_opt = opt wavfile.write( @@ -330,8 +349,8 @@ def uvr(model_name, inp_root, save_root_vocal, paths, save_root_ins, agg): # 一个选项卡全局只能有一个音色 def get_vc(sid): - global n_spk, tgt_sr, net_g, vc, cpt,version - if sid == ""or sid==[]: + global n_spk, tgt_sr, net_g, vc, cpt, version + if sid == "" or sid == []: global hubert_model if hubert_model != None: # 考虑到轮询, 需要加个判断看是否 sid 是由有模型切换到无模型的 print("clean_empty_cache") @@ -342,14 +361,18 @@ def get_vc(sid): ###楼下不这么折腾清理不干净 if_f0 = cpt.get("f0", 1) version = cpt.get("version", "v1") - if (version == "v1"): + if version == "v1": if if_f0 == 1: - net_g = SynthesizerTrnMs256NSFsid(*cpt["config"], is_half=config.is_half) + net_g = SynthesizerTrnMs256NSFsid( + *cpt["config"], is_half=config.is_half + ) else: net_g = SynthesizerTrnMs256NSFsid_nono(*cpt["config"]) - elif (version == "v2"): + elif version == "v2": if if_f0 == 1: - net_g = SynthesizerTrnMs768NSFsid(*cpt["config"], is_half=config.is_half) + net_g = SynthesizerTrnMs768NSFsid( + *cpt["config"], is_half=config.is_half + ) else: net_g = SynthesizerTrnMs768NSFsid_nono(*cpt["config"]) del net_g, cpt @@ -364,12 +387,12 @@ def get_vc(sid): cpt["config"][-3] = cpt["weight"]["emb_g.weight"].shape[0] # n_spk if_f0 = cpt.get("f0", 1) version = cpt.get("version", "v1") - if(version=="v1"): + if version == "v1": if if_f0 == 1: net_g = SynthesizerTrnMs256NSFsid(*cpt["config"], is_half=config.is_half) else: net_g = SynthesizerTrnMs256NSFsid_nono(*cpt["config"]) - elif(version=="v2"): + elif version == "v2": if if_f0 == 1: net_g = SynthesizerTrnMs768NSFsid(*cpt["config"], is_half=config.is_half) else: @@ -391,17 +414,21 @@ def change_choices(): for name in os.listdir(weight_root): if name.endswith(".pth"): names.append(name) - index_paths=[] + index_paths = [] for root, dirs, files in os.walk(index_root, topdown=False): for name in files: if name.endswith(".index") and "trained" not in name: index_paths.append("%s/%s" % (root, name)) - return {"choices": sorted(names), "__type__": "update"},{"choices": sorted(index_paths), "__type__": "update"} + return {"choices": sorted(names), "__type__": "update"}, { + "choices": sorted(index_paths), + "__type__": "update", + } def clean(): return {"value": "", "__type__": "update"} + sr_dict = { "32k": 32000, "40k": 40000, @@ -468,7 +495,7 @@ def preprocess_dataset(trainset_dir, exp_dir, sr, n_p): # but2.click(extract_f0,[gpus6,np7,f0method8,if_f0_3,trainset_dir4],[info2]) -def extract_f0_feature(gpus, n_p, f0method, if_f0, exp_dir,version19): +def extract_f0_feature(gpus, n_p, f0method, if_f0, exp_dir, version19): gpus = gpus.split("-") os.makedirs("%s/logs/%s" % (now_dir, exp_dir), exist_ok=True) f = open("%s/logs/%s/extract_f0_feature.log" % (now_dir, exp_dir), "w") @@ -514,14 +541,18 @@ def extract_f0_feature(gpus, n_p, f0method, if_f0, exp_dir,version19): leng = len(gpus) ps = [] for idx, n_g in enumerate(gpus): - cmd = config.python_cmd + " extract_feature_print.py %s %s %s %s %s/logs/%s %s" % ( - config.device, - leng, - idx, - n_g, - now_dir, - exp_dir, - version19, + cmd = ( + config.python_cmd + + " extract_feature_print.py %s %s %s %s %s/logs/%s %s" + % ( + config.device, + leng, + idx, + n_g, + now_dir, + exp_dir, + version19, + ) ) print(cmd) p = Popen( @@ -549,34 +580,47 @@ def extract_f0_feature(gpus, n_p, f0method, if_f0, exp_dir,version19): yield log -def change_sr2(sr2, if_f0_3,version19): - vis_v=True if sr2=="40k"else False - if(sr2!="40k"):version19="v1" - path_str=""if version19=="v1"else "_v2" - version_state={"visible": vis_v, "__type__": "update"} - if(vis_v==False):version_state["value"]="v1" - f0_str="f0"if if_f0_3 else"" - return "pretrained%s/%sG%s.pth" % (path_str,f0_str,sr2), "pretrained%s/%sD%s.pth" % (path_str,f0_str,sr2),version_state +def change_sr2(sr2, if_f0_3, version19): + vis_v = True if sr2 == "40k" else False + if sr2 != "40k": + version19 = "v1" + path_str = "" if version19 == "v1" else "_v2" + version_state = {"visible": vis_v, "__type__": "update"} + if vis_v == False: + version_state["value"] = "v1" + f0_str = "f0" if if_f0_3 else "" + return ( + "pretrained%s/%sG%s.pth" % (path_str, f0_str, sr2), + "pretrained%s/%sD%s.pth" % (path_str, f0_str, sr2), + version_state, + ) -def change_version19(sr2,if_f0_3,version19): - path_str=""if version19=="v1"else "_v2" - f0_str="f0"if if_f0_3 else"" - return "pretrained%s/%sG%s.pth" % (path_str,f0_str,sr2), "pretrained%s/%sD%s.pth" % (path_str,f0_str,sr2) -def change_f0(if_f0_3, sr2,version19): # f0method8,pretrained_G14,pretrained_D15 - path_str=""if version19=="v1"else "_v2" +def change_version19(sr2, if_f0_3, version19): + path_str = "" if version19 == "v1" else "_v2" + f0_str = "f0" if if_f0_3 else "" + return "pretrained%s/%sG%s.pth" % ( + path_str, + f0_str, + sr2, + ), "pretrained%s/%sD%s.pth" % (path_str, f0_str, sr2) + + +def change_f0(if_f0_3, sr2, version19): # f0method8,pretrained_G14,pretrained_D15 + path_str = "" if version19 == "v1" else "_v2" if if_f0_3: return ( {"visible": True, "__type__": "update"}, - "pretrained%s/f0G%s.pth" % (path_str,sr2), - "pretrained%s/f0D%s.pth" % (path_str,sr2), + "pretrained%s/f0G%s.pth" % (path_str, sr2), + "pretrained%s/f0D%s.pth" % (path_str, sr2), ) return ( {"visible": False, "__type__": "update"}, - "pretrained%s/G%s.pth" % (path_str,sr2), - "pretrained%s/D%s.pth" % (path_str,sr2), + "pretrained%s/G%s.pth" % (path_str, sr2), + "pretrained%s/D%s.pth" % (path_str, sr2), ) + # but3.click(click_train,[exp_dir1,sr2,if_f0_3,save_epoch10,total_epoch11,batch_size12,if_save_latest13,pretrained_G14,pretrained_D15,gpus16]) def click_train( exp_dir1, @@ -598,7 +642,11 @@ def click_train( exp_dir = "%s/logs/%s" % (now_dir, exp_dir1) os.makedirs(exp_dir, exist_ok=True) gt_wavs_dir = "%s/0_gt_wavs" % (exp_dir) - feature_dir = "%s/3_feature256" % (exp_dir)if version19=="v1"else "%s/3_feature768" % (exp_dir) + feature_dir = ( + "%s/3_feature256" % (exp_dir) + if version19 == "v1" + else "%s/3_feature768" % (exp_dir) + ) if if_f0_3: f0_dir = "%s/2a_f0" % (exp_dir) f0nsf_dir = "%s/2b-f0nsf" % (exp_dir) @@ -640,18 +688,18 @@ def click_train( spk_id5, ) ) - fea_dim = 256 if version19 == "v1"else 768 + fea_dim = 256 if version19 == "v1" else 768 if if_f0_3: for _ in range(2): opt.append( "%s/logs/mute/0_gt_wavs/mute%s.wav|%s/logs/mute/3_feature%s/mute.npy|%s/logs/mute/2a_f0/mute.wav.npy|%s/logs/mute/2b-f0nsf/mute.wav.npy|%s" - % (now_dir, sr2, now_dir,fea_dim, now_dir, now_dir, spk_id5) + % (now_dir, sr2, now_dir, fea_dim, now_dir, now_dir, spk_id5) ) else: for _ in range(2): opt.append( "%s/logs/mute/0_gt_wavs/mute%s.wav|%s/logs/mute/3_feature%s/mute.npy|%s" - % (now_dir, sr2, now_dir,fea_dim, spk_id5) + % (now_dir, sr2, now_dir, fea_dim, spk_id5) ) shuffle(opt) with open("%s/filelist.txt" % exp_dir, "w") as f: @@ -706,10 +754,14 @@ def click_train( # but4.click(train_index, [exp_dir1], info3) -def train_index(exp_dir1,version19): +def train_index(exp_dir1, version19): exp_dir = "%s/logs/%s" % (now_dir, exp_dir1) os.makedirs(exp_dir, exist_ok=True) - feature_dir = "%s/3_feature256" % (exp_dir)if version19=="v1"else "%s/3_feature768" % (exp_dir) + feature_dir = ( + "%s/3_feature256" % (exp_dir) + if version19 == "v1" + else "%s/3_feature768" % (exp_dir) + ) if os.path.exists(feature_dir) == False: return "请先进行特征提取!" listdir_res = list(os.listdir(feature_dir)) @@ -729,7 +781,7 @@ def train_index(exp_dir1,version19): infos = [] infos.append("%s,%s" % (big_npy.shape, n_ivf)) yield "\n".join(infos) - index = faiss.index_factory(256if version19=="v1"else 768, "IVF%s,Flat" % n_ivf) + index = faiss.index_factory(256 if version19 == "v1" else 768, "IVF%s,Flat" % n_ivf) # index = faiss.index_factory(256if version19=="v1"else 768, "IVF%s,PQ128x4fs,RFlat"%n_ivf) infos.append("training") yield "\n".join(infos) @@ -738,7 +790,8 @@ def train_index(exp_dir1,version19): index.train(big_npy) faiss.write_index( index, - "%s/trained_IVF%s_Flat_nprobe_%s_%s.index" % (exp_dir, n_ivf, index_ivf.nprobe,version19), + "%s/trained_IVF%s_Flat_nprobe_%s_%s.index" + % (exp_dir, n_ivf, index_ivf.nprobe, version19), ) # faiss.write_index(index, '%s/trained_IVF%s_Flat_FastScan_%s.index'%(exp_dir,n_ivf,version19)) infos.append("adding") @@ -750,7 +803,10 @@ def train_index(exp_dir1,version19): index, "%s/added_IVF%s_Flat_nprobe_%s.index" % (exp_dir, n_ivf, index_ivf.nprobe), ) - infos.append("成功构建索引,added_IVF%s_Flat_nprobe_%s_%s.index" % (n_ivf, index_ivf.nprobe,version19)) + infos.append( + "成功构建索引,added_IVF%s_Flat_nprobe_%s_%s.index" + % (n_ivf, index_ivf.nprobe, version19) + ) # faiss.write_index(index, '%s/added_IVF%s_Flat_FastScan_%s.index'%(exp_dir,n_ivf,version19)) # infos.append("成功构建索引,added_IVF%s_Flat_FastScan_%s.index"%(n_ivf,version19)) yield "\n".join(infos) @@ -786,7 +842,11 @@ def train1key( preprocess_log_path = "%s/preprocess.log" % model_log_dir extract_f0_feature_log_path = "%s/extract_f0_feature.log" % model_log_dir gt_wavs_dir = "%s/0_gt_wavs" % model_log_dir - feature_dir = "%s/3_feature256" % model_log_dir if version19=="v1"else "%s/3_feature768" % model_log_dir + feature_dir = ( + "%s/3_feature256" % model_log_dir + if version19 == "v1" + else "%s/3_feature768" % model_log_dir + ) os.makedirs(model_log_dir, exist_ok=True) #########step1:处理数据 @@ -830,7 +890,8 @@ def train1key( leng, idx, n_g, - model_log_dir,version19, + model_log_dir, + version19, ) yield get_info_str(cmd) p = Popen( @@ -885,18 +946,18 @@ def train1key( spk_id5, ) ) - fea_dim=256 if version19=="v1"else 768 + fea_dim = 256 if version19 == "v1" else 768 if if_f0_3: for _ in range(2): opt.append( "%s/logs/mute/0_gt_wavs/mute%s.wav|%s/logs/mute/3_feature%s/mute.npy|%s/logs/mute/2a_f0/mute.wav.npy|%s/logs/mute/2b-f0nsf/mute.wav.npy|%s" - % (now_dir, sr2, now_dir,fea_dim, now_dir, now_dir, spk_id5) + % (now_dir, sr2, now_dir, fea_dim, now_dir, now_dir, spk_id5) ) else: for _ in range(2): opt.append( "%s/logs/mute/0_gt_wavs/mute%s.wav|%s/logs/mute/3_feature%s/mute.npy|%s" - % (now_dir, sr2, now_dir,fea_dim, spk_id5) + % (now_dir, sr2, now_dir, fea_dim, spk_id5) ) shuffle(opt) with open("%s/filelist.txt" % model_log_dir, "w") as f: @@ -961,7 +1022,7 @@ def train1key( # n_ivf = big_npy.shape[0] // 39 n_ivf = min(int(16 * np.sqrt(big_npy.shape[0])), big_npy.shape[0] // 39) yield get_info_str("%s,%s" % (big_npy.shape, n_ivf)) - index = faiss.index_factory(256 if version19=="v1"else 768, "IVF%s,Flat" % n_ivf) + index = faiss.index_factory(256 if version19 == "v1" else 768, "IVF%s,Flat" % n_ivf) yield get_info_str("training index") index_ivf = faiss.extract_index_ivf(index) # index_ivf.nprobe = 1 @@ -969,7 +1030,7 @@ def train1key( faiss.write_index( index, "%s/trained_IVF%s_Flat_nprobe_%s_%s.index" - % (model_log_dir, n_ivf, index_ivf.nprobe,version19), + % (model_log_dir, n_ivf, index_ivf.nprobe, version19), ) yield get_info_str("adding index") batch_size_add = 8192 @@ -978,10 +1039,11 @@ def train1key( faiss.write_index( index, "%s/added_IVF%s_Flat_nprobe_%s_%s.index" - % (model_log_dir, n_ivf, index_ivf.nprobe,version19), + % (model_log_dir, n_ivf, index_ivf.nprobe, version19), ) yield get_info_str( - "成功构建索引, added_IVF%s_Flat_nprobe_%s_%s.index" % (n_ivf, index_ivf.nprobe,version19) + "成功构建索引, added_IVF%s_Flat_nprobe_%s_%s.index" + % (n_ivf, index_ivf.nprobe, version19) ) yield get_info_str(i18n("全流程结束!")) @@ -999,8 +1061,8 @@ def change_info_(ckpt_path): ) as f: info = eval(f.read().strip("\n").split("\n")[0].split("\t")[-1]) sr, f0 = info["sample_rate"], info["if_f0"] - version="v2"if("version"in info and info["version"]=="v2")else"v1" - return sr, str(f0),version + version = "v2" if ("version" in info and info["version"] == "v2") else "v1" + return sr, str(f0), version except: traceback.print_exc() return {"__type__": "update"}, {"__type__": "update"}, {"__type__": "update"} @@ -1136,7 +1198,7 @@ with gr.Blocks() as app: value="pm", interactive=True, ) - filter_radius0=gr.Slider( + filter_radius0 = gr.Slider( minimum=0, maximum=7, label=i18n(">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音"), @@ -1155,7 +1217,9 @@ with gr.Blocks() as app: choices=sorted(index_paths), interactive=True, ) - refresh_button.click(fn=change_choices, inputs=[], outputs=[sid0, file_index2]) + refresh_button.click( + fn=change_choices, inputs=[], outputs=[sid0, file_index2] + ) # file_big_npy1 = gr.Textbox( # label=i18n("特征文件路径"), # value="E:\\codes\py39\\vits_vc_gpu_train\\logs\\mi-test-1key\\total_fea.npy", @@ -1168,7 +1232,7 @@ with gr.Blocks() as app: value=0.76, interactive=True, ) - resample_sr0=gr.Slider( + resample_sr0 = gr.Slider( minimum=0, maximum=48000, label=i18n("后处理重采样至最终采样率,0为不进行重采样"), @@ -1202,7 +1266,7 @@ with gr.Blocks() as app: index_rate1, filter_radius0, resample_sr0, - rms_mix_rate0 + rms_mix_rate0, ], [vc_output1, vc_output2], ) @@ -1222,7 +1286,7 @@ with gr.Blocks() as app: value="pm", interactive=True, ) - filter_radius1=gr.Slider( + filter_radius1 = gr.Slider( minimum=0, maximum=7, label=i18n(">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音"), @@ -1253,7 +1317,7 @@ with gr.Blocks() as app: value=1, interactive=True, ) - resample_sr1=gr.Slider( + resample_sr1 = gr.Slider( minimum=0, maximum=48000, label=i18n("后处理重采样至最终采样率,0为不进行重采样"), @@ -1293,7 +1357,7 @@ with gr.Blocks() as app: index_rate2, filter_radius1, resample_sr1, - rms_mix_rate1 + rms_mix_rate1, ], [vc_output3], ) @@ -1398,7 +1462,7 @@ with gr.Blocks() as app: but1 = gr.Button(i18n("处理数据"), variant="primary") info1 = gr.Textbox(label=i18n("输出信息"), value="") but1.click( - preprocess_dataset, [trainset_dir4, exp_dir1, sr2,np7], [info1] + preprocess_dataset, [trainset_dir4, exp_dir1, sr2, np7], [info1] ) with gr.Group(): gr.Markdown(value=i18n("step2b: 使用CPU提取音高(如果模型带音高), 使用GPU提取特征(选择卡号)")) @@ -1423,7 +1487,7 @@ with gr.Blocks() as app: info2 = gr.Textbox(label=i18n("输出信息"), value="", max_lines=8) but2.click( extract_f0_feature, - [gpus6, np7, f0method8, if_f0_3, exp_dir1,version19], + [gpus6, np7, f0method8, if_f0_3, exp_dir1, version19], [info2], ) with gr.Group(): @@ -1468,9 +1532,7 @@ with gr.Blocks() as app: interactive=True, ) if_save_every_weights18 = gr.Radio( - label=i18n( - "是否在每次保存时间点将最终小模型保存至weights文件夹" - ), + label=i18n("是否在每次保存时间点将最终小模型保存至weights文件夹"), choices=[i18n("是"), i18n("否")], value=i18n("否"), interactive=True, @@ -1487,14 +1549,18 @@ with gr.Blocks() as app: interactive=True, ) sr2.change( - change_sr2, [sr2, if_f0_3,version19], [pretrained_G14, pretrained_D15,version19] + change_sr2, + [sr2, if_f0_3, version19], + [pretrained_G14, pretrained_D15, version19], ) version19.change( - change_version19, [sr2, if_f0_3,version19], [pretrained_G14, pretrained_D15] + change_version19, + [sr2, if_f0_3, version19], + [pretrained_G14, pretrained_D15], ) if_f0_3.change( change_f0, - [if_f0_3, sr2,version19], + [if_f0_3, sr2, version19], [f0method8, pretrained_G14, pretrained_D15], ) gpus16 = gr.Textbox( @@ -1526,7 +1592,7 @@ with gr.Blocks() as app: ], info3, ) - but4.click(train_index, [exp_dir1,version19], info3) + but4.click(train_index, [exp_dir1, version19], info3) but5.click( train1key, [ @@ -1586,7 +1652,7 @@ with gr.Blocks() as app: max_lines=1, interactive=True, ) - version_2=gr.Radio( + version_2 = gr.Radio( label=i18n("模型版本型号"), choices=["v1", "v2"], value="v1", @@ -1597,7 +1663,16 @@ with gr.Blocks() as app: info4 = gr.Textbox(label=i18n("输出信息"), value="", max_lines=8) but6.click( merge, - [ckpt_a, ckpt_b, alpha_a, sr_, if_f0_, info__, name_to_save0,version_2], + [ + ckpt_a, + ckpt_b, + alpha_a, + sr_, + if_f0_, + info__, + name_to_save0, + version_2, + ], info4, ) # def merge(path1,path2,alpha1,sr,f0,info): with gr.Group(): @@ -1655,7 +1730,7 @@ with gr.Blocks() as app: value="1", interactive=True, ) - version_1=gr.Radio( + version_1 = gr.Radio( label=i18n("模型版本型号"), choices=["v1", "v2"], value="v1", @@ -1666,10 +1741,12 @@ with gr.Blocks() as app: ) but9 = gr.Button(i18n("提取"), variant="primary") info7 = gr.Textbox(label=i18n("输出信息"), value="", max_lines=8) - ckpt_path2.change(change_info_, [ckpt_path2], [sr__, if_f0__,version_1]) + ckpt_path2.change( + change_info_, [ckpt_path2], [sr__, if_f0__, version_1] + ) but9.click( extract_small_model, - [ckpt_path2, save_name, sr__, if_f0__, info___,version_1], + [ckpt_path2, save_name, sr__, if_f0__, info___, version_1], info7, ) @@ -1687,16 +1764,16 @@ with gr.Blocks() as app: butOnnx = gr.Button(i18n("导出Onnx模型"), variant="primary") butOnnx.click(export_onnx, [ckpt_dir, onnx_dir, moevs], infoOnnx) - tab_faq=i18n("常见问题解答") + tab_faq = i18n("常见问题解答") with gr.TabItem(tab_faq): try: - if(tab_faq=="常见问题解答"): - with open("docs/faq.md","r",encoding="utf8")as f:info=f.read() + if tab_faq == "常见问题解答": + with open("docs/faq.md", "r", encoding="utf8") as f: + info = f.read() else: - with open("docs/faq_en.md", "r")as f:info = f.read() - gr.Markdown( - value=info - ) + with open("docs/faq_en.md", "r") as f: + info = f.read() + gr.Markdown(value=info) except: gr.Markdown(traceback.format_exc()) diff --git a/infer_pack/models.py b/infer_pack/models.py index 085d26c..724bd88 100644 --- a/infer_pack/models.py +++ b/infer_pack/models.py @@ -59,6 +59,8 @@ class TextEncoder256(nn.Module): m, logs = torch.split(stats, self.out_channels, dim=1) return m, logs, x_mask + + class TextEncoder768(nn.Module): def __init__( self, @@ -105,6 +107,7 @@ class TextEncoder768(nn.Module): m, logs = torch.split(stats, self.out_channels, dim=1) return m, logs, x_mask + class ResidualCouplingBlock(nn.Module): def __init__( self, @@ -635,6 +638,8 @@ class SynthesizerTrnMs256NSFsid(nn.Module): z = self.flow(z_p, x_mask, g=g, reverse=True) o = self.dec((z * x_mask)[:, :, :max_len], nsff0, g=g) return o, x_mask, (z, z_p, m_p, logs_p) + + class SynthesizerTrnMs768NSFsid(nn.Module): def __init__( self, @@ -846,6 +851,8 @@ class SynthesizerTrnMs256NSFsid_nono(nn.Module): z = self.flow(z_p, x_mask, g=g, reverse=True) o = self.dec((z * x_mask)[:, :, :max_len], g=g) return o, x_mask, (z, z_p, m_p, logs_p) + + class SynthesizerTrnMs768NSFsid_nono(nn.Module): def __init__( self, @@ -977,11 +984,12 @@ class MultiPeriodDiscriminator(torch.nn.Module): return y_d_rs, y_d_gs, fmap_rs, fmap_gs + class MultiPeriodDiscriminatorV2(torch.nn.Module): def __init__(self, use_spectral_norm=False): super(MultiPeriodDiscriminatorV2, self).__init__() # periods = [2, 3, 5, 7, 11, 17] - periods = [2,3, 5, 7, 11, 17, 23, 37] + periods = [2, 3, 5, 7, 11, 17, 23, 37] discs = [DiscriminatorS(use_spectral_norm=use_spectral_norm)] discs = discs + [ diff --git a/train/process_ckpt.py b/train/process_ckpt.py index 63cca61..9d3d7e9 100644 --- a/train/process_ckpt.py +++ b/train/process_ckpt.py @@ -2,7 +2,7 @@ import torch, traceback, os, pdb from collections import OrderedDict -def savee(ckpt, sr, if_f0, name, epoch,version): +def savee(ckpt, sr, if_f0, name, epoch, version): try: opt = OrderedDict() opt["weight"] = {} @@ -96,7 +96,7 @@ def show_info(path): return traceback.format_exc() -def extract_small_model(path, name, sr, if_f0, info,version): +def extract_small_model(path, name, sr, if_f0, info, version): try: ckpt = torch.load(path, map_location="cpu") if "model" in ckpt: @@ -194,7 +194,7 @@ def change_info(path, info, name): return traceback.format_exc() -def merge(path1, path2, alpha1, sr, f0, info, name,version): +def merge(path1, path2, alpha1, sr, f0, info, name, version): try: def extract(ckpt): diff --git a/train/utils.py b/train/utils.py index 9b8f92c..434ed7a 100644 --- a/train/utils.py +++ b/train/utils.py @@ -322,7 +322,11 @@ def get_hparams(init=True): "-sr", "--sample_rate", type=str, required=True, help="sample rate, 32k/40k/48k" ) parser.add_argument( - "-sw", "--save_every_weights", type=str, default="0", help="save the extracted model in weights directory when saving checkpoints" + "-sw", + "--save_every_weights", + type=str, + default="0", + help="save the extracted model in weights directory when saving checkpoints", ) parser.add_argument( "-v", "--version", type=str, required=True, help="model version" diff --git a/train_nsf_sim_cache_sid_load_pretrain.py b/train_nsf_sim_cache_sid_load_pretrain.py index 494c561..481f754 100644 --- a/train_nsf_sim_cache_sid_load_pretrain.py +++ b/train_nsf_sim_cache_sid_load_pretrain.py @@ -31,7 +31,8 @@ from data_utils import ( TextAudioCollate, DistributedBucketSampler, ) -if(hps.version=="v1"): + +if hps.version == "v1": from infer_pack.models import ( SynthesizerTrnMs256NSFsid as RVC_Model_f0, SynthesizerTrnMs256NSFsid_nono as RVC_Model_nof0, @@ -519,14 +520,25 @@ def train_and_evaluate( epoch, os.path.join(hps.model_dir, "D_{}.pth".format(2333333)), ) - if(rank==0 and hps.save_every_weights=="1"): + if rank == 0 and hps.save_every_weights == "1": if hasattr(net_g, "module"): ckpt = net_g.module.state_dict() else: ckpt = net_g.state_dict() logger.info( "saving ckpt %s_e%s:%s" - % (hps.name,epoch,savee(ckpt, hps.sample_rate, hps.if_f0, hps.name+"_e%s"%epoch, epoch,hps.version)) + % ( + hps.name, + epoch, + savee( + ckpt, + hps.sample_rate, + hps.if_f0, + hps.name + "_e%s" % epoch, + epoch, + hps.version, + ), + ) ) if rank == 0: @@ -540,7 +552,7 @@ def train_and_evaluate( ckpt = net_g.state_dict() logger.info( "saving final ckpt:%s" - % (savee(ckpt, hps.sample_rate, hps.if_f0, hps.name, epoch,hps.version)) + % (savee(ckpt, hps.sample_rate, hps.if_f0, hps.name, epoch, hps.version)) ) sleep(1) os._exit(2333333) diff --git a/vc_infer_pipeline.py b/vc_infer_pipeline.py index 7470a91..a8f0540 100644 --- a/vc_infer_pipeline.py +++ b/vc_infer_pipeline.py @@ -2,16 +2,18 @@ import numpy as np, parselmouth, torch, pdb from time import time as ttime import torch.nn.functional as F import scipy.signal as signal -import pyworld, os, traceback, faiss,librosa +import pyworld, os, traceback, faiss, librosa from scipy import signal from functools import lru_cache bh, ah = signal.butter(N=5, Wn=48, btype="high", fs=16000) -input_audio_path2wav={} +input_audio_path2wav = {} + + @lru_cache -def cache_harvest_f0(input_audio_path,fs,f0max,f0min,frame_period): - audio=input_audio_path2wav[input_audio_path] +def cache_harvest_f0(input_audio_path, fs, f0max, f0min, frame_period): + audio = input_audio_path2wav[input_audio_path] f0, t = pyworld.harvest( audio, fs=fs, @@ -22,18 +24,29 @@ def cache_harvest_f0(input_audio_path,fs,f0max,f0min,frame_period): f0 = pyworld.stonemask(audio, f0, t, fs) return f0 -def change_rms(data1,sr1,data2,sr2,rate):#1是输入音频,2是输出音频,rate是2的占比 + +def change_rms(data1, sr1, data2, sr2, rate): # 1是输入音频,2是输出音频,rate是2的占比 # print(data1.max(),data2.max()) - rms1 = librosa.feature.rms(y=data1, frame_length=sr1//2*2, hop_length=sr1//2)#每半秒一个点 - rms2 = librosa.feature.rms(y=data2, frame_length=sr2//2*2, hop_length=sr2//2) - rms1=torch.from_numpy(rms1) - rms1=F.interpolate(rms1.unsqueeze(0), size=data2.shape[0],mode='linear').squeeze() - rms2=torch.from_numpy(rms2) - rms2=F.interpolate(rms2.unsqueeze(0), size=data2.shape[0],mode='linear').squeeze() - rms2=torch.max(rms2,torch.zeros_like(rms2)+1e-6) - data2*=(torch.pow(rms1,torch.tensor(1-rate))*torch.pow(rms2,torch.tensor(rate-1))).numpy() + rms1 = librosa.feature.rms( + y=data1, frame_length=sr1 // 2 * 2, hop_length=sr1 // 2 + ) # 每半秒一个点 + rms2 = librosa.feature.rms(y=data2, frame_length=sr2 // 2 * 2, hop_length=sr2 // 2) + rms1 = torch.from_numpy(rms1) + rms1 = F.interpolate( + rms1.unsqueeze(0), size=data2.shape[0], mode="linear" + ).squeeze() + rms2 = torch.from_numpy(rms2) + rms2 = F.interpolate( + rms2.unsqueeze(0), size=data2.shape[0], mode="linear" + ).squeeze() + rms2 = torch.max(rms2, torch.zeros_like(rms2) + 1e-6) + data2 *= ( + torch.pow(rms1, torch.tensor(1 - rate)) + * torch.pow(rms2, torch.tensor(rate - 1)) + ).numpy() return data2 + class VC(object): def __init__(self, tgt_sr, config): self.x_pad, self.x_query, self.x_center, self.x_max, self.is_half = ( @@ -53,7 +66,16 @@ class VC(object): self.t_max = self.sr * self.x_max # 免查询时长阈值 self.device = config.device - def get_f0(self, input_audio_path,x, p_len, f0_up_key, f0_method,filter_radius, inp_f0=None): + def get_f0( + self, + input_audio_path, + x, + p_len, + f0_up_key, + f0_method, + filter_radius, + inp_f0=None, + ): global input_audio_path2wav time_step = self.window / self.sr * 1000 f0_min = 50 @@ -77,9 +99,9 @@ class VC(object): f0, [[pad_size, p_len - len(f0) - pad_size]], mode="constant" ) elif f0_method == "harvest": - input_audio_path2wav[input_audio_path]=x.astype(np.double) - f0=cache_harvest_f0(input_audio_path,self.sr,f0_max,f0_min,10) - if(filter_radius>2): + input_audio_path2wav[input_audio_path] = x.astype(np.double) + f0 = cache_harvest_f0(input_audio_path, self.sr, f0_max, f0_min, 10) + if filter_radius > 2: f0 = signal.medfilt(f0, 3) f0 *= pow(2, f0_up_key / 12) # with open("test.txt","w")as f:f.write("\n".join([str(i)for i in f0.tolist()])) @@ -134,12 +156,12 @@ class VC(object): inputs = { "source": feats.to(self.device), "padding_mask": padding_mask, - "output_layer": 9if version=="v1"else 12, + "output_layer": 9 if version == "v1" else 12, } t0 = ttime() with torch.no_grad(): logits = model.extract_features(**inputs) - feats = model.final_proj(logits[0])if version=="v1"else logits[0] + feats = model.final_proj(logits[0]) if version == "v1" else logits[0] if ( isinstance(index, type(None)) == False @@ -184,10 +206,7 @@ class VC(object): ) else: audio1 = ( - (net_g.infer(feats, p_len, sid)[0][0, 0]) - .data.cpu() - .float() - .numpy() + (net_g.infer(feats, p_len, sid)[0][0, 0]).data.cpu().float().numpy() ) del feats, p_len, padding_mask if torch.cuda.is_available(): @@ -270,7 +289,15 @@ class VC(object): sid = torch.tensor(sid, device=self.device).unsqueeze(0).long() pitch, pitchf = None, None if if_f0 == 1: - pitch, pitchf = self.get_f0(input_audio_path,audio_pad, p_len, f0_up_key, f0_method,filter_radius, inp_f0) + pitch, pitchf = self.get_f0( + input_audio_path, + audio_pad, + p_len, + f0_up_key, + f0_method, + filter_radius, + inp_f0, + ) pitch = pitch[:p_len] pitchf = pitchf[:p_len] if self.device == "mps": @@ -347,16 +374,17 @@ class VC(object): )[self.t_pad_tgt : -self.t_pad_tgt] ) audio_opt = np.concatenate(audio_opt) - if(rms_mix_rate!=1): - audio_opt=change_rms(audio,16000,audio_opt,tgt_sr,rms_mix_rate) - if(resample_sr>=16000 and tgt_sr!=resample_sr): + if rms_mix_rate != 1: + audio_opt = change_rms(audio, 16000, audio_opt, tgt_sr, rms_mix_rate) + if resample_sr >= 16000 and tgt_sr != resample_sr: audio_opt = librosa.resample( audio_opt, orig_sr=tgt_sr, target_sr=resample_sr ) - audio_max=np.abs(audio_opt).max()/0.99 - max_int16=32768 - if(audio_max>1):max_int16/=audio_max - audio_opt=(audio_opt * max_int16).astype(np.int16) + audio_max = np.abs(audio_opt).max() / 0.99 + max_int16 = 32768 + if audio_max > 1: + max_int16 /= audio_max + audio_opt = (audio_opt * max_int16).astype(np.int16) del pitch, pitchf, sid if torch.cuda.is_available(): torch.cuda.empty_cache() From e06994f473fc59f5fd08e7be776ccf4c290bb28f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 14 May 2023 08:00:48 +0000 Subject: [PATCH 11/14] =?UTF-8?q?=F0=9F=8E=A8=20=E5=90=8C=E6=AD=A5=20local?= =?UTF-8?q?e=20(#281)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- i18n/en_US.json | 17 +++++++++-------- i18n/es_ES.json | 14 +++++++++++--- i18n/ja_JP.json | 14 +++++++++++--- i18n/zh_CN.json | 18 ++++++++++-------- i18n/zh_HK.json | 19 ++++++++++--------- i18n/zh_SG.json | 21 +++++++++++---------- i18n/zh_TW.json | 21 +++++++++++---------- 7 files changed, 73 insertions(+), 51 deletions(-) diff --git a/i18n/en_US.json b/i18n/en_US.json index 91d1bbd..8a41ab0 100644 --- a/i18n/en_US.json +++ b/i18n/en_US.json @@ -10,7 +10,6 @@ "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.
如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录使用需遵守的协议-LICENSE.txt.": "This software is open source under the MIT license, the author does not have any control over the software, and those who use the software and spread the sounds exported by the software are solely responsible.
If you do not agree with this clause, you cannot use or quote any codes and files in the software package. See root directory Agreement-LICENSE.txt for details.", "模型推理": "Model inference", "推理音色": "Inferencing timbre", - "刷新音色列表": "Refresh timbre list", "刷新音色列表和索引路径": "Refresh timbre list and index path", "卸载音色省显存": "Unload timbre to save GPU memory", "请选择说话人id": "Please select a speaker id", @@ -18,13 +17,14 @@ "变调(整数, 半音数量, 升八度12降八度-12)": "transpose(integer, number of semitones, octave sharp 12 octave flat -12)", "输入待处理音频文件路径(默认是正确格式示例)": "Enter the path of the audio file to be processed (the default is the correct format example)", "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比": "Select the algorithm for pitch extraction. Use 'pm' to speed up for singing voices, or use 'harvest' for better low-pitched voices, but it is extremely slow.", - "特征检索库文件路径": "Feature search database file path", - "特征文件路径": "Feature file path", + ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音": ">=3:using median filter for f0. The number is median filter radius.", "特征检索库文件路径,为空则使用下拉的选择结果": "Feature file path. If null, use dropdown result.", "自动检测index路径,下拉式选择(dropdown)": "Auto detect index path in logs directory. Dropdown.", + "特征文件路径": "Feature file path", "检索特征占比": "Search feature ratio", + "后处理重采样至最终采样率,0为不进行重采样": "Post resample the audio to the final sample rate. Default: don't use post resample.", + "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络": "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络", "F0曲线文件, 可选, 一行一个音高, 代替默认F0及升降调": "F0 curve file, optional, one pitch per line, instead of the default F0 and ups and downs", - ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音": ">=3:using median filter for f0. The number is median filter radius.", "转换": "Convert", "输出信息": "Export message", "输出音频(右下角三个点,点了可以下载)": "Export audio (three dots in the lower right corner, click to download)", @@ -43,6 +43,8 @@ "输入实验名": "Input experiment name", "目标采样率": "Target sample rate", "模型是否带音高指导(唱歌一定要, 语音可以不要)": "Does the model have pitch guidance (singing must, voice can not.)", + "版本(目前仅40k支持了v2)": "版本(目前仅40k支持了v2)", + "提取音高和处理数据使用的CPU进程数": "Number of CPU threads to use for pitch extraction and dataset processing", "step2a: 自动遍历训练文件夹下所有可解码成音频的文件并进行切片归一化, 在实验目录下生成2个wav文件夹; 暂时只支持单人训练. ": "step2a: Automatically traverse all files that can be decoded into audio in the training folder and perform slice normalization, and generate 2 wav folders in the experiment directory; only single-person training is supported for the time being. ", "输入训练文件夹路径": "Input training folder path", "请指定说话人id": "Please specify speaker ID", @@ -50,8 +52,6 @@ "step2b: 使用CPU提取音高(如果模型带音高), 使用GPU提取特征(选择卡号)": "step2b: Use CPU to extract pitch (if the model has pitch), use GPU to extract features (select card number)", "以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2": "Enter the card numbers used separated by -, for example 0-1-2 use card 0 and card 1 and card 2", "显卡信息": "GPU information", - "提取音高使用的CPU进程数": "Number of CPU threads to use for pitch extraction", - "提取音高和处理数据使用的CPU进程数": "Number of CPU threads to use for pitch extraction and dataset processing", "选择音高提取算法:输入歌声可用pm提速,高质量语音但CPU差可用dio提速,harvest质量更好但慢": "Select pitch extraction algorithm: Use 'pm' for faster processing of singing voice, 'dio' for high-quality speech but slower processing, and 'harvest' for the best quality but slowest processing.", "特征提取": "Feature extraction", "step3: 填写训练设置, 开始训练模型和索引": "step3: Fill in the training settings, start training the model and index", @@ -61,6 +61,7 @@ "是否仅保存最新的ckpt文件以节省硬盘空间": "Whether to save only the latest ckpt file to save disk space", "否": "no", "是否缓存所有训练集至显存. 10min以下小数据可缓存以加速训练, 大数据缓存会炸显存也加不了多少速": "Whether to cache all training sets to video memory. Small data under 10 minutes can be cached to speed up training, and large data cache will blow up video memory and not increase the speed much", + "是否在每次保存时间点将最终小模型保存至weights文件夹": "是否在每次保存时间点将最终小模型保存至weights文件夹", "加载预训练底模G路径": "Load pre-trained base model G path.", "加载预训练底模D路径": "Load pre-trained base model D path.", "训练模型": "Train model.", @@ -74,6 +75,7 @@ "模型是否带音高指导": "Whether the model has pitch guidance.", "要置入的模型信息": "Model information to be placed.", "保存的模型名不带后缀": "Saved model name without extension.", + "模型版本型号": "模型版本型号", "融合": "Fusion.", "修改模型信息(仅支持weights文件夹下提取的小模型文件)": "Modify model information (only small model files extracted from the weights folder are supported)", "模型路径": "Model path", @@ -91,6 +93,7 @@ "Onnx输出路径": "Onnx Export Path", "MoeVS模型": "MoeVS Model", "导出Onnx模型": "Export Onnx Model", + "常见问题解答": "FAQ (Frequently Asked Questions)", "招募音高曲线前端编辑器": "Recruit front-end editors for pitch curves", "加开发群联系我xxxxx": "Add development group to contact me xxxxx", "点击查看交流、问题反馈群号": "Click to view the communication and problem feedback group number", @@ -115,7 +118,5 @@ "性能设置": "performance settings", "开始音频转换": "start audio conversion", "停止音频转换": "stop audio conversion", - "常见问题解答": "FAQ (Frequently Asked Questions)", - "后处理重采样至最终采样率,0为不进行重采样": "Post resample the audio to the final sample rate. Default: don't use post resample.", "推理时间(ms):": "Infer Time(ms):" } diff --git a/i18n/es_ES.json b/i18n/es_ES.json index f3f0baf..6786a84 100644 --- a/i18n/es_ES.json +++ b/i18n/es_ES.json @@ -10,16 +10,20 @@ "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.
如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录使用需遵守的协议-LICENSE.txt.": "Este software es de código abierto bajo la licencia MIT, el autor no tiene ningún control sobre el software, y aquellos que usan el software y difunden los sonidos exportados por el software son los únicos responsables.
Si no está de acuerdo con esta cláusula , no puede utilizar ni citar ningún código ni archivo del paquete de software Consulte el directorio raíz Agreement-LICENSE.txt para obtener más información.", "模型推理": "inferencia del modelo", "推理音色": "inferencia de voz", - "刷新音色列表": "Actualizar lista de voces", + "刷新音色列表和索引路径": "刷新音色列表和索引路径", "卸载音色省显存": "Descargue la voz para ahorrar memoria GPU", "请选择说话人id": "seleccione una identificación de altavoz", "男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "Tecla +12 recomendada para conversión de voz de hombre a mujer, tecla -12 para conversión de voz de mujer a hombre. Si el rango de tono es demasiado amplio y causa distorsión, ajústelo usted mismo a un rango adecuado.", "变调(整数, 半音数量, 升八度12降八度-12)": "Cambio de tono (entero, número de semitonos, subir una octava +12 o bajar una octava -12)", "输入待处理音频文件路径(默认是正确格式示例)": "Ingrese la ruta del archivo del audio que se procesará (el formato predeterminado es el ejemplo correcto)", "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比": "Seleccione el algoritmo para la extracción de tono. Use 'pm' para acelerar las voces cantadas, o use 'harvest' para mejorar las voces bajas, pero es extremadamente lento.", - "特征检索库文件路径": "Ruta del archivo de la base de datos de búsqueda de características", + ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音": ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音", + "特征检索库文件路径,为空则使用下拉的选择结果": "特征检索库文件路径,为空则使用下拉的选择结果", + "自动检测index路径,下拉式选择(dropdown)": "自动检测index路径,下拉式选择(dropdown)", "特征文件路径": "Ruta del archivo de características", "检索特征占比": "Proporción de función de búsqueda", + "后处理重采样至最终采样率,0为不进行重采样": "后处理重采样至最终采样率,0为不进行重采样", + "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络": "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络", "F0曲线文件, 可选, 一行一个音高, 代替默认F0及升降调": "Archivo de curva F0, opcional, un tono por línea, en lugar de F0 predeterminado y cambio de tono", "转换": "Conversión", "输出信息": "Información de salida", @@ -39,6 +43,8 @@ "输入实验名": "Ingrese el nombre del modelo", "目标采样率": "Tasa de muestreo objetivo", "模型是否带音高指导(唱歌一定要, 语音可以不要)": "Si el modelo tiene guía de tono (necesaria para cantar, pero no para hablar)", + "版本(目前仅40k支持了v2)": "版本(目前仅40k支持了v2)", + "提取音高和处理数据使用的CPU进程数": "提取音高和处理数据使用的CPU进程数", "step2a: 自动遍历训练文件夹下所有可解码成音频的文件并进行切片归一化, 在实验目录下生成2个wav文件夹; 暂时只支持单人训练. ": "paso 2a: recorra automáticamente la carpeta de capacitación y corte y normalice todos los archivos de audio que se pueden decodificar en audio. Se generarán dos carpetas 'wav' en el directorio del experimento. Actualmente, solo se admite la capacitación de una sola persona.", "输入训练文件夹路径": "Introduzca la ruta de la carpeta de entrenamiento", "请指定说话人id": "Especifique el ID del hablante", @@ -46,7 +52,6 @@ "step2b: 使用CPU提取音高(如果模型带音高), 使用GPU提取特征(选择卡号)": "paso 2b: use la CPU para extraer el tono (si el modelo tiene guía de tono) y la GPU para extraer características (seleccione el número de tarjeta).", "以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2": "Separe los números de identificación de la GPU con '-' al ingresarlos. Por ejemplo, '0-1-2' significa usar GPU 0, GPU 1 y GPU 2.", "显卡信息": "información de la GPU", - "提取音高使用的CPU进程数": "Número de subprocesos de CPU que se utilizarán para la extracción de tono", "选择音高提取算法:输入歌声可用pm提速,高质量语音但CPU差可用dio提速,harvest质量更好但慢": "Seleccione el algoritmo de extracción de tono: utilice 'pm' para un procesamiento más rápido de la voz cantada, 'dio' para un discurso de alta calidad pero un procesamiento más lento y 'cosecha' para obtener la mejor calidad pero un procesamiento más lento.", "特征提取": "Extracción de características", "step3: 填写训练设置, 开始训练模型和索引": "Paso 3: complete la configuración de entrenamiento y comience a entrenar el modelo y el índice.", @@ -56,6 +61,7 @@ "是否仅保存最新的ckpt文件以节省硬盘空间": "Si guardar solo el archivo ckpt más reciente para ahorrar espacio en disco", "否": "否", "是否缓存所有训练集至显存. 10min以下小数据可缓存以加速训练, 大数据缓存会炸显存也加不了多少速": "Si almacenar en caché todos los conjuntos de entrenamiento en la memoria de la GPU. Los conjuntos de datos pequeños (menos de 10 minutos) se pueden almacenar en caché para acelerar el entrenamiento, pero el almacenamiento en caché de conjuntos de datos grandes puede causar errores de memoria en la GPU y no aumenta la velocidad de manera significativa.", + "是否在每次保存时间点将最终小模型保存至weights文件夹": "是否在每次保存时间点将最终小模型保存至weights文件夹", "加载预训练底模G路径": "Cargue la ruta G del modelo base preentrenada.", "加载预训练底模D路径": "Cargue la ruta del modelo D base preentrenada.", "训练模型": "Entrenar Modelo", @@ -69,6 +75,7 @@ "模型是否带音高指导": "Si el modelo tiene guía de tono.", "要置入的模型信息": "Información del modelo a colocar.", "保存的模型名不带后缀": "Nombre del modelo guardado sin extensión.", + "模型版本型号": "模型版本型号", "融合": "Fusión.", "修改模型信息(仅支持weights文件夹下提取的小模型文件)": "Modificar la información del modelo (solo admite archivos de modelos pequeños extraídos en la carpeta de pesos).", "模型路径": "Ruta del modelo", @@ -86,6 +93,7 @@ "Onnx输出路径": "Onnx输出路径", "MoeVS模型": "MoeVS模型", "导出Onnx模型": "导出Onnx模型", + "常见问题解答": "常见问题解答", "招募音高曲线前端编辑器": "Reclutar editores front-end para curvas de tono", "加开发群联系我xxxxx": "Únase al grupo de desarrollo para contactarme en xxxxx", "点击查看交流、问题反馈群号": "Haga clic para ver el número de grupo de comunicación y comentarios sobre problemas", diff --git a/i18n/ja_JP.json b/i18n/ja_JP.json index 9588955..d918954 100644 --- a/i18n/ja_JP.json +++ b/i18n/ja_JP.json @@ -10,16 +10,20 @@ "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.
如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录使用需遵守的协议-LICENSE.txt.": "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.
如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录使用需遵守的协议-LICENSE.txt.", "模型推理": "モデル推論", "推理音色": "音源推論", - "刷新音色列表": "音源リストを更新", + "刷新音色列表和索引路径": "刷新音色列表和索引路径", "卸载音色省显存": "音源を削除してメモリを節約", "请选择说话人id": "話者IDを選択してください", "男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "男性から女性へは+12キーをお勧めします。女性から男性へは-12キーをお勧めします。音域が広すぎて音質が劣化した場合は、適切な音域に自分で調整することもできます。", "变调(整数, 半音数量, 升八度12降八度-12)": "ピッチ変更(整数、半音数、上下オクターブ12-12)", "输入待处理音频文件路径(默认是正确格式示例)": "処理対象音声ファイルのパスを入力してください(デフォルトは正しいフォーマットの例です)", "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比": "ピッチ抽出アルゴリズムを選択してください。歌声の場合は、pmを使用して速度を上げることができます。低音が重要な場合は、harvestを使用できますが、非常に遅くなります。", - "特征检索库文件路径": "特徴量検索データベースのファイルパス", + ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音": ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音", + "特征检索库文件路径,为空则使用下拉的选择结果": "特征检索库文件路径,为空则使用下拉的选择结果", + "自动检测index路径,下拉式选择(dropdown)": "自动检测index路径,下拉式选择(dropdown)", "特征文件路径": "特徴量ファイルのパス", "检索特征占比": "検索特徴率", + "后处理重采样至最终采样率,0为不进行重采样": "后处理重采样至最终采样率,0为不进行重采样", + "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络": "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络", "F0曲线文件, 可选, 一行一个音高, 代替默认F0及升降调": "F0(最低共振周波数)カーブファイル(オプション、1行に1ピッチ、デフォルトのF0(最低共振周波数)とエレベーションを置き換えます。)", "转换": "変換", "输出信息": "出力情報", @@ -39,6 +43,8 @@ "输入实验名": "実験名を入力してください", "目标采样率": "目標サンプリングレート", "模型是否带音高指导(唱歌一定要, 语音可以不要)": "モデルに音高ガイドがあるかどうか(歌唱には必要ですが、音声には必要ありません)", + "版本(目前仅40k支持了v2)": "版本(目前仅40k支持了v2)", + "提取音高和处理数据使用的CPU进程数": "提取音高和处理数据使用的CPU进程数", "step2a: 自动遍历训练文件夹下所有可解码成音频的文件并进行切片归一化, 在实验目录下生成2个wav文件夹; 暂时只支持单人训练. ": "ステップ2a: 訓練フォルダー内のすべての音声ファイルを自動的に探索し、スライスと正規化を行い、2つのwavフォルダーを実験ディレクトリに生成します。現在は一人でのトレーニングのみをサポートしています。", "输入训练文件夹路径": "トレーニング用フォルダのパスを入力してください", "请指定说话人id": "話者IDを指定してください", @@ -46,7 +52,6 @@ "step2b: 使用CPU提取音高(如果模型带音高), 使用GPU提取特征(选择卡号)": "ステップ2b: CPUを使用して音高を抽出する(モデルに音高がある場合)、GPUを使用して特徴を抽出する(カード番号を選択する)", "以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2": "ハイフンで区切って使用するカード番号を入力します。例えば0-1-2はカード0、カード1、カード2を使用します", "显卡信息": "カード情報", - "提取音高使用的CPU进程数": "抽出に使用するCPUプロセス数", "选择音高提取算法:输入歌声可用pm提速,高质量语音但CPU差可用dio提速,harvest质量更好但慢": "音高抽出アルゴリズムの選択:歌声を入力する場合は、pmを使用して速度を上げることができます。CPUが低い場合はdioを使用して速度を上げることができます。harvestは品質が高く、精度が高いですが、遅いです。", "特征提取": "特徴抽出", "step3: 填写训练设置, 开始训练模型和索引": "ステップ3: トレーニング設定を入力して、モデルとインデックスのトレーニングを開始します", @@ -56,6 +61,7 @@ "是否仅保存最新的ckpt文件以节省硬盘空间": "ハードディスク容量を節約するため、最新のckptファイルのみを保存するかどうか", "否": "否", "是否缓存所有训练集至显存. 10min以下小数据可缓存以加速训练, 大数据缓存会炸显存也加不了多少速": "すべてのトレーニングデータをメモリにキャッシュするかどうか。10分以下の小さなデータはキャッシュしてトレーニングを高速化できますが、大きなデータをキャッシュするとメモリが破裂し、あまり速度が上がりません。", + "是否在每次保存时间点将最终小模型保存至weights文件夹": "是否在每次保存时间点将最终小模型保存至weights文件夹", "加载预训练底模G路径": "事前学習済みのGモデルのパスをロードしてください", "加载预训练底模D路径": "事前学習済みのDモデルのパスをロードしてください", "训练模型": "モデルのトレーニング", @@ -69,6 +75,7 @@ "模型是否带音高指导": "モデルに音高ガイドを付けるかどうか", "要置入的模型信息": "挿入するモデル情報", "保存的模型名不带后缀": "拡張子のない保存するモデル名", + "模型版本型号": "模型版本型号", "融合": "フュージョン", "修改模型信息(仅支持weights文件夹下提取的小模型文件)": "モデル情報の修正(weightsフォルダから抽出された小さなモデルファイルのみ対応)", "模型路径": "モデルパス", @@ -86,6 +93,7 @@ "Onnx输出路径": "Onnx出力パス", "MoeVS模型": "MoeSS?", "导出Onnx模型": "Onnxに変換", + "常见问题解答": "常见问题解答", "招募音高曲线前端编辑器": "音高曲線フロントエンドエディターを募集", "加开发群联系我xxxxx": "開発グループに参加して私に連絡してくださいxxxxx", "点击查看交流、问题反馈群号": "クリックして交流、問題フィードバックグループ番号を表示", diff --git a/i18n/zh_CN.json b/i18n/zh_CN.json index e83a290..e5e8062 100644 --- a/i18n/zh_CN.json +++ b/i18n/zh_CN.json @@ -10,18 +10,20 @@ "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.
如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录使用需遵守的协议-LICENSE.txt.": "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.
如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录使用需遵守的协议-LICENSE.txt.", "模型推理": "模型推理", "推理音色": "推理音色", - "刷新音色列表": "刷新音色列表", + "刷新音色列表和索引路径": "刷新音色列表和索引路径", "卸载音色省显存": "卸载音色省显存", "请选择说话人id": "请选择说话人id", "男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ", "变调(整数, 半音数量, 升八度12降八度-12)": "变调(整数, 半音数量, 升八度12降八度-12)", "输入待处理音频文件路径(默认是正确格式示例)": "输入待处理音频文件路径(默认是正确格式示例)", "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比": "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比", - "特征检索库文件路径": "特征检索库文件路径", - "特征检索库文件路径,为空则使用下拉的选择结果": "特征检索库文件路径,为空则使用下拉的选择结果", ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音": ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音", + "特征检索库文件路径,为空则使用下拉的选择结果": "特征检索库文件路径,为空则使用下拉的选择结果", + "自动检测index路径,下拉式选择(dropdown)": "自动检测index路径,下拉式选择(dropdown)", "特征文件路径": "特征文件路径", "检索特征占比": "检索特征占比", + "后处理重采样至最终采样率,0为不进行重采样": "后处理重采样至最终采样率,0为不进行重采样", + "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络": "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络", "F0曲线文件, 可选, 一行一个音高, 代替默认F0及升降调": "F0曲线文件, 可选, 一行一个音高, 代替默认F0及升降调", "转换": "转换", "输出信息": "输出信息", @@ -41,6 +43,8 @@ "输入实验名": "输入实验名", "目标采样率": "目标采样率", "模型是否带音高指导(唱歌一定要, 语音可以不要)": "模型是否带音高指导(唱歌一定要, 语音可以不要)", + "版本(目前仅40k支持了v2)": "版本(目前仅40k支持了v2)", + "提取音高和处理数据使用的CPU进程数": "提取音高和处理数据使用的CPU进程数", "step2a: 自动遍历训练文件夹下所有可解码成音频的文件并进行切片归一化, 在实验目录下生成2个wav文件夹; 暂时只支持单人训练. ": "step2a: 自动遍历训练文件夹下所有可解码成音频的文件并进行切片归一化, 在实验目录下生成2个wav文件夹; 暂时只支持单人训练. ", "输入训练文件夹路径": "输入训练文件夹路径", "请指定说话人id": "请指定说话人id", @@ -48,10 +52,6 @@ "step2b: 使用CPU提取音高(如果模型带音高), 使用GPU提取特征(选择卡号)": "step2b: 使用CPU提取音高(如果模型带音高), 使用GPU提取特征(选择卡号)", "以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2": "以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2", "显卡信息": "显卡信息", - "提取音高使用的CPU进程数": "提取音高使用的CPU进程数", - "提取音高和处理数据使用的CPU进程数": "提取音高和处理数据使用的CPU进程数", - "刷新音色列表和索引路径": "刷新音色列表和索引路径", - "常见问题解答": "常见问题解答", "选择音高提取算法:输入歌声可用pm提速,高质量语音但CPU差可用dio提速,harvest质量更好但慢": "选择音高提取算法:输入歌声可用pm提速,高质量语音但CPU差可用dio提速,harvest质量更好但慢", "特征提取": "特征提取", "step3: 填写训练设置, 开始训练模型和索引": "step3: 填写训练设置, 开始训练模型和索引", @@ -61,6 +61,7 @@ "是否仅保存最新的ckpt文件以节省硬盘空间": "是否仅保存最新的ckpt文件以节省硬盘空间", "否": "否", "是否缓存所有训练集至显存. 10min以下小数据可缓存以加速训练, 大数据缓存会炸显存也加不了多少速": "是否缓存所有训练集至显存. 10min以下小数据可缓存以加速训练, 大数据缓存会炸显存也加不了多少速", + "是否在每次保存时间点将最终小模型保存至weights文件夹": "是否在每次保存时间点将最终小模型保存至weights文件夹", "加载预训练底模G路径": "加载预训练底模G路径", "加载预训练底模D路径": "加载预训练底模D路径", "训练模型": "训练模型", @@ -74,6 +75,7 @@ "模型是否带音高指导": "模型是否带音高指导", "要置入的模型信息": "要置入的模型信息", "保存的模型名不带后缀": "保存的模型名不带后缀", + "模型版本型号": "模型版本型号", "融合": "融合", "修改模型信息(仅支持weights文件夹下提取的小模型文件)": "修改模型信息(仅支持weights文件夹下提取的小模型文件)", "模型路径": "模型路径", @@ -91,6 +93,7 @@ "Onnx输出路径": "Onnx输出路径", "MoeVS模型": "MoeVS模型", "导出Onnx模型": "导出Onnx模型", + "常见问题解答": "常见问题解答", "招募音高曲线前端编辑器": "招募音高曲线前端编辑器", "加开发群联系我xxxxx": "加开发群联系我xxxxx", "点击查看交流、问题反馈群号": "点击查看交流、问题反馈群号", @@ -115,6 +118,5 @@ "性能设置": "性能设置", "开始音频转换": "开始音频转换", "停止音频转换": "停止音频转换", - "后处理重采样至最终采样率,0为不进行重采样": "后处理重采样至最终采样率,0为不进行重采样", "推理时间(ms):": "推理时间(ms):" } diff --git a/i18n/zh_HK.json b/i18n/zh_HK.json index 169f3d6..0ec1528 100644 --- a/i18n/zh_HK.json +++ b/i18n/zh_HK.json @@ -10,21 +10,21 @@ "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.
如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录使用需遵守的协议-LICENSE.txt.": "本軟體以MIT協議開源,作者不對軟體具備任何控制力,使用軟體者、傳播軟體導出的聲音者自負全責。
如不認可該條款,則不能使用或引用軟體包內任何程式碼和檔案。詳見根目錄使用需遵守的協議-LICENSE.txt。", "模型推理": "模型推理", "推理音色": "推理音色", - "刷新音色列表": "重新整理音色列表", - "刷新音色列表和索引路径":"刷新音色列表和索引路徑", + "刷新音色列表和索引路径": "刷新音色列表和索引路徑", "卸载音色省显存": "卸載音色節省 VRAM", "请选择说话人id": "請選擇說話人ID", "男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "男性轉女性推薦+12key,女性轉男性推薦-12key,如果音域爆炸導致音色失真也可以自己調整到合適音域。", "变调(整数, 半音数量, 升八度12降八度-12)": "變調(整數、半音數量、升八度12降八度-12)", "输入待处理音频文件路径(默认是正确格式示例)": "輸入待處理音頻檔案路徑(預設是正確格式示例)", "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比": "選擇音高提取演算法,輸入歌聲可用 pm 提速,harvest 低音好但巨慢無比", - "特征检索库文件路径": "特徵檢索庫檔案路徑", - "自动检测index路径,下拉式选择(dropdown)": "自動檢測index路徑,下拉式選擇(dropdown)", + ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音": ">=3則使用對harvest音高識別的結果使用中值濾波,數值為濾波半徑,使用可以削弱啞音", "特征检索库文件路径,为空则使用下拉的选择结果": "特徵檢索庫檔路徑,為空則使用下拉的選擇結果", + "自动检测index路径,下拉式选择(dropdown)": "自動檢測index路徑,下拉式選擇(dropdown)", "特征文件路径": "特徵檔案路徑", "检索特征占比": "檢索特徵佔比", + "后处理重采样至最终采样率,0为不进行重采样": "後處理重採樣至最終採樣率,0為不進行重採樣", + "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络": "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络", "F0曲线文件, 可选, 一行一个音高, 代替默认F0及升降调": "F0曲線檔案,可選,一行一個音高,代替預設的F0及升降調", - ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音":">=3則使用對harvest音高識別的結果使用中值濾波,數值為濾波半徑,使用可以削弱啞音", "转换": "轉換", "输出信息": "輸出訊息", "输出音频(右下角三个点,点了可以下载)": "輸出音頻(右下角三個點,點了可以下載)", @@ -43,6 +43,8 @@ "输入实验名": "輸入實驗名稱", "目标采样率": "目標取樣率", "模型是否带音高指导(唱歌一定要, 语音可以不要)": "模型是否帶音高指導(唱歌一定要,語音可以不要)", + "版本(目前仅40k支持了v2)": "版本(目前仅40k支持了v2)", + "提取音高和处理数据使用的CPU进程数": "提取音高和處理數據使用的CPU進程數", "step2a: 自动遍历训练文件夹下所有可解码成音频的文件并进行切片归一化, 在实验目录下生成2个wav文件夹; 暂时只支持单人训练. ": "step2a:自動遍歷訓練資料夾下所有可解碼成音頻的檔案並進行切片歸一化,在實驗目錄下生成2個wav資料夾;暫時只支援單人訓練。", "输入训练文件夹路径": "輸入訓練檔案夾路徑", "请指定说话人id": "請指定說話人id", @@ -50,8 +52,6 @@ "step2b: 使用CPU提取音高(如果模型带音高), 使用GPU提取特征(选择卡号)": "步驟2b: 使用CPU提取音高(如果模型帶音高), 使用GPU提取特徵(選擇卡號)", "以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2": "以-分隔輸入使用的卡號, 例如 0-1-2 使用卡0和卡1和卡2", "显卡信息": "顯示卡資訊", - "提取音高使用的CPU进程数": "提取音高使用的CPU進程數", - "提取音高和处理数据使用的CPU进程数": "提取音高和處理數據使用的CPU進程數", "选择音高提取算法:输入歌声可用pm提速,高质量语音但CPU差可用dio提速,harvest质量更好但慢": "選擇音高提取算法:輸入歌聲可用pm提速,高品質語音但CPU差可用dio提速,harvest品質更好但較慢", "特征提取": "特徵提取", "step3: 填写训练设置, 开始训练模型和索引": "步驟3: 填寫訓練設定, 開始訓練模型和索引", @@ -61,6 +61,7 @@ "是否仅保存最新的ckpt文件以节省硬盘空间": "是否僅保存最新的ckpt檔案以節省硬碟空間", "否": "否", "是否缓存所有训练集至显存. 10min以下小数据可缓存以加速训练, 大数据缓存会炸显存也加不了多少速": "是否緩存所有訓練集至 VRAM。小於10分鐘的小數據可緩存以加速訓練,大數據緩存會爆 VRAM 也加不了多少速度", + "是否在每次保存时间点将最终小模型保存至weights文件夹": "是否在每次保存时间点将最终小模型保存至weights文件夹", "加载预训练底模G路径": "加載預訓練底模G路徑", "加载预训练底模D路径": "加載預訓練底模D路徑", "训练模型": "訓練模型", @@ -74,6 +75,7 @@ "模型是否带音高指导": "模型是否帶音高指導", "要置入的模型信息": "要置入的模型資訊", "保存的模型名不带后缀": "儲存的模型名不帶副檔名", + "模型版本型号": "模型版本型号", "融合": "融合", "修改模型信息(仅支持weights文件夹下提取的小模型文件)": "修改模型資訊(僅支援weights資料夾下提取的小模型檔案)", "模型路径": "模型路徑", @@ -91,6 +93,7 @@ "Onnx输出路径": "Onnx输出路径", "MoeVS模型": "MoeSS模型", "导出Onnx模型": "导出Onnx模型", + "常见问题解答": "常見問題解答", "招募音高曲线前端编辑器": "招募音高曲線前端編輯器", "加开发群联系我xxxxx": "加開發群聯繫我xxxxx", "点击查看交流、问题反馈群号": "點擊查看交流、問題反饋群號", @@ -115,7 +118,5 @@ "性能设置": "效能設定", "开始音频转换": "開始音訊轉換", "停止音频转换": "停止音訊轉換", - "常见问题解答": "常見問題解答", - "后处理重采样至最终采样率,0为不进行重采样": "後處理重採樣至最終採樣率,0為不進行重採樣", "推理时间(ms):": "推理時間(ms):" } diff --git a/i18n/zh_SG.json b/i18n/zh_SG.json index 36ece7b..0ec1528 100644 --- a/i18n/zh_SG.json +++ b/i18n/zh_SG.json @@ -10,21 +10,21 @@ "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.
如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录使用需遵守的协议-LICENSE.txt.": "本軟體以MIT協議開源,作者不對軟體具備任何控制力,使用軟體者、傳播軟體導出的聲音者自負全責。
如不認可該條款,則不能使用或引用軟體包內任何程式碼和檔案。詳見根目錄使用需遵守的協議-LICENSE.txt。", "模型推理": "模型推理", "推理音色": "推理音色", - "刷新音色列表": "重新整理音色列表", - "刷新音色列表和索引路径":"刷新音色列表和索引路徑", + "刷新音色列表和索引路径": "刷新音色列表和索引路徑", "卸载音色省显存": "卸載音色節省 VRAM", "请选择说话人id": "請選擇說話人ID", "男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "男性轉女性推薦+12key,女性轉男性推薦-12key,如果音域爆炸導致音色失真也可以自己調整到合適音域。", "变调(整数, 半音数量, 升八度12降八度-12)": "變調(整數、半音數量、升八度12降八度-12)", "输入待处理音频文件路径(默认是正确格式示例)": "輸入待處理音頻檔案路徑(預設是正確格式示例)", "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比": "選擇音高提取演算法,輸入歌聲可用 pm 提速,harvest 低音好但巨慢無比", - "特征检索库文件路径": "特徵檢索庫檔案路徑", - "特征文件路径": "特徵檔案路徑", - "自动检测index路径,下拉式选择(dropdown)": "自動檢測index路徑,下拉式選擇(dropdown)", + ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音": ">=3則使用對harvest音高識別的結果使用中值濾波,數值為濾波半徑,使用可以削弱啞音", "特征检索库文件路径,为空则使用下拉的选择结果": "特徵檢索庫檔路徑,為空則使用下拉的選擇結果", + "自动检测index路径,下拉式选择(dropdown)": "自動檢測index路徑,下拉式選擇(dropdown)", + "特征文件路径": "特徵檔案路徑", "检索特征占比": "檢索特徵佔比", + "后处理重采样至最终采样率,0为不进行重采样": "後處理重採樣至最終採樣率,0為不進行重採樣", + "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络": "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络", "F0曲线文件, 可选, 一行一个音高, 代替默认F0及升降调": "F0曲線檔案,可選,一行一個音高,代替預設的F0及升降調", - ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音":">=3則使用對harvest音高識別的結果使用中值濾波,數值為濾波半徑,使用可以削弱啞音", "转换": "轉換", "输出信息": "輸出訊息", "输出音频(右下角三个点,点了可以下载)": "輸出音頻(右下角三個點,點了可以下載)", @@ -43,6 +43,8 @@ "输入实验名": "輸入實驗名稱", "目标采样率": "目標取樣率", "模型是否带音高指导(唱歌一定要, 语音可以不要)": "模型是否帶音高指導(唱歌一定要,語音可以不要)", + "版本(目前仅40k支持了v2)": "版本(目前仅40k支持了v2)", + "提取音高和处理数据使用的CPU进程数": "提取音高和處理數據使用的CPU進程數", "step2a: 自动遍历训练文件夹下所有可解码成音频的文件并进行切片归一化, 在实验目录下生成2个wav文件夹; 暂时只支持单人训练. ": "step2a:自動遍歷訓練資料夾下所有可解碼成音頻的檔案並進行切片歸一化,在實驗目錄下生成2個wav資料夾;暫時只支援單人訓練。", "输入训练文件夹路径": "輸入訓練檔案夾路徑", "请指定说话人id": "請指定說話人id", @@ -50,8 +52,6 @@ "step2b: 使用CPU提取音高(如果模型带音高), 使用GPU提取特征(选择卡号)": "步驟2b: 使用CPU提取音高(如果模型帶音高), 使用GPU提取特徵(選擇卡號)", "以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2": "以-分隔輸入使用的卡號, 例如 0-1-2 使用卡0和卡1和卡2", "显卡信息": "顯示卡資訊", - "提取音高使用的CPU进程数": "提取音高使用的CPU進程數", - "提取音高和处理数据使用的CPU进程数": "提取音高和處理數據使用的CPU進程數", "选择音高提取算法:输入歌声可用pm提速,高质量语音但CPU差可用dio提速,harvest质量更好但慢": "選擇音高提取算法:輸入歌聲可用pm提速,高品質語音但CPU差可用dio提速,harvest品質更好但較慢", "特征提取": "特徵提取", "step3: 填写训练设置, 开始训练模型和索引": "步驟3: 填寫訓練設定, 開始訓練模型和索引", @@ -61,6 +61,7 @@ "是否仅保存最新的ckpt文件以节省硬盘空间": "是否僅保存最新的ckpt檔案以節省硬碟空間", "否": "否", "是否缓存所有训练集至显存. 10min以下小数据可缓存以加速训练, 大数据缓存会炸显存也加不了多少速": "是否緩存所有訓練集至 VRAM。小於10分鐘的小數據可緩存以加速訓練,大數據緩存會爆 VRAM 也加不了多少速度", + "是否在每次保存时间点将最终小模型保存至weights文件夹": "是否在每次保存时间点将最终小模型保存至weights文件夹", "加载预训练底模G路径": "加載預訓練底模G路徑", "加载预训练底模D路径": "加載預訓練底模D路徑", "训练模型": "訓練模型", @@ -74,6 +75,7 @@ "模型是否带音高指导": "模型是否帶音高指導", "要置入的模型信息": "要置入的模型資訊", "保存的模型名不带后缀": "儲存的模型名不帶副檔名", + "模型版本型号": "模型版本型号", "融合": "融合", "修改模型信息(仅支持weights文件夹下提取的小模型文件)": "修改模型資訊(僅支援weights資料夾下提取的小模型檔案)", "模型路径": "模型路徑", @@ -91,6 +93,7 @@ "Onnx输出路径": "Onnx输出路径", "MoeVS模型": "MoeSS模型", "导出Onnx模型": "导出Onnx模型", + "常见问题解答": "常見問題解答", "招募音高曲线前端编辑器": "招募音高曲線前端編輯器", "加开发群联系我xxxxx": "加開發群聯繫我xxxxx", "点击查看交流、问题反馈群号": "點擊查看交流、問題反饋群號", @@ -115,7 +118,5 @@ "性能设置": "效能設定", "开始音频转换": "開始音訊轉換", "停止音频转换": "停止音訊轉換", - "常见问题解答": "常見問題解答", - "后处理重采样至最终采样率,0为不进行重采样": "後處理重採樣至最終採樣率,0為不進行重採樣", "推理时间(ms):": "推理時間(ms):" } diff --git a/i18n/zh_TW.json b/i18n/zh_TW.json index 36ece7b..0ec1528 100644 --- a/i18n/zh_TW.json +++ b/i18n/zh_TW.json @@ -10,21 +10,21 @@ "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.
如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录使用需遵守的协议-LICENSE.txt.": "本軟體以MIT協議開源,作者不對軟體具備任何控制力,使用軟體者、傳播軟體導出的聲音者自負全責。
如不認可該條款,則不能使用或引用軟體包內任何程式碼和檔案。詳見根目錄使用需遵守的協議-LICENSE.txt。", "模型推理": "模型推理", "推理音色": "推理音色", - "刷新音色列表": "重新整理音色列表", - "刷新音色列表和索引路径":"刷新音色列表和索引路徑", + "刷新音色列表和索引路径": "刷新音色列表和索引路徑", "卸载音色省显存": "卸載音色節省 VRAM", "请选择说话人id": "請選擇說話人ID", "男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "男性轉女性推薦+12key,女性轉男性推薦-12key,如果音域爆炸導致音色失真也可以自己調整到合適音域。", "变调(整数, 半音数量, 升八度12降八度-12)": "變調(整數、半音數量、升八度12降八度-12)", "输入待处理音频文件路径(默认是正确格式示例)": "輸入待處理音頻檔案路徑(預設是正確格式示例)", "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比": "選擇音高提取演算法,輸入歌聲可用 pm 提速,harvest 低音好但巨慢無比", - "特征检索库文件路径": "特徵檢索庫檔案路徑", - "特征文件路径": "特徵檔案路徑", - "自动检测index路径,下拉式选择(dropdown)": "自動檢測index路徑,下拉式選擇(dropdown)", + ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音": ">=3則使用對harvest音高識別的結果使用中值濾波,數值為濾波半徑,使用可以削弱啞音", "特征检索库文件路径,为空则使用下拉的选择结果": "特徵檢索庫檔路徑,為空則使用下拉的選擇結果", + "自动检测index路径,下拉式选择(dropdown)": "自動檢測index路徑,下拉式選擇(dropdown)", + "特征文件路径": "特徵檔案路徑", "检索特征占比": "檢索特徵佔比", + "后处理重采样至最终采样率,0为不进行重采样": "後處理重採樣至最終採樣率,0為不進行重採樣", + "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络": "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络", "F0曲线文件, 可选, 一行一个音高, 代替默认F0及升降调": "F0曲線檔案,可選,一行一個音高,代替預設的F0及升降調", - ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音":">=3則使用對harvest音高識別的結果使用中值濾波,數值為濾波半徑,使用可以削弱啞音", "转换": "轉換", "输出信息": "輸出訊息", "输出音频(右下角三个点,点了可以下载)": "輸出音頻(右下角三個點,點了可以下載)", @@ -43,6 +43,8 @@ "输入实验名": "輸入實驗名稱", "目标采样率": "目標取樣率", "模型是否带音高指导(唱歌一定要, 语音可以不要)": "模型是否帶音高指導(唱歌一定要,語音可以不要)", + "版本(目前仅40k支持了v2)": "版本(目前仅40k支持了v2)", + "提取音高和处理数据使用的CPU进程数": "提取音高和處理數據使用的CPU進程數", "step2a: 自动遍历训练文件夹下所有可解码成音频的文件并进行切片归一化, 在实验目录下生成2个wav文件夹; 暂时只支持单人训练. ": "step2a:自動遍歷訓練資料夾下所有可解碼成音頻的檔案並進行切片歸一化,在實驗目錄下生成2個wav資料夾;暫時只支援單人訓練。", "输入训练文件夹路径": "輸入訓練檔案夾路徑", "请指定说话人id": "請指定說話人id", @@ -50,8 +52,6 @@ "step2b: 使用CPU提取音高(如果模型带音高), 使用GPU提取特征(选择卡号)": "步驟2b: 使用CPU提取音高(如果模型帶音高), 使用GPU提取特徵(選擇卡號)", "以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2": "以-分隔輸入使用的卡號, 例如 0-1-2 使用卡0和卡1和卡2", "显卡信息": "顯示卡資訊", - "提取音高使用的CPU进程数": "提取音高使用的CPU進程數", - "提取音高和处理数据使用的CPU进程数": "提取音高和處理數據使用的CPU進程數", "选择音高提取算法:输入歌声可用pm提速,高质量语音但CPU差可用dio提速,harvest质量更好但慢": "選擇音高提取算法:輸入歌聲可用pm提速,高品質語音但CPU差可用dio提速,harvest品質更好但較慢", "特征提取": "特徵提取", "step3: 填写训练设置, 开始训练模型和索引": "步驟3: 填寫訓練設定, 開始訓練模型和索引", @@ -61,6 +61,7 @@ "是否仅保存最新的ckpt文件以节省硬盘空间": "是否僅保存最新的ckpt檔案以節省硬碟空間", "否": "否", "是否缓存所有训练集至显存. 10min以下小数据可缓存以加速训练, 大数据缓存会炸显存也加不了多少速": "是否緩存所有訓練集至 VRAM。小於10分鐘的小數據可緩存以加速訓練,大數據緩存會爆 VRAM 也加不了多少速度", + "是否在每次保存时间点将最终小模型保存至weights文件夹": "是否在每次保存时间点将最终小模型保存至weights文件夹", "加载预训练底模G路径": "加載預訓練底模G路徑", "加载预训练底模D路径": "加載預訓練底模D路徑", "训练模型": "訓練模型", @@ -74,6 +75,7 @@ "模型是否带音高指导": "模型是否帶音高指導", "要置入的模型信息": "要置入的模型資訊", "保存的模型名不带后缀": "儲存的模型名不帶副檔名", + "模型版本型号": "模型版本型号", "融合": "融合", "修改模型信息(仅支持weights文件夹下提取的小模型文件)": "修改模型資訊(僅支援weights資料夾下提取的小模型檔案)", "模型路径": "模型路徑", @@ -91,6 +93,7 @@ "Onnx输出路径": "Onnx输出路径", "MoeVS模型": "MoeSS模型", "导出Onnx模型": "导出Onnx模型", + "常见问题解答": "常見問題解答", "招募音高曲线前端编辑器": "招募音高曲線前端編輯器", "加开发群联系我xxxxx": "加開發群聯繫我xxxxx", "点击查看交流、问题反馈群号": "點擊查看交流、問題反饋群號", @@ -115,7 +118,5 @@ "性能设置": "效能設定", "开始音频转换": "開始音訊轉換", "停止音频转换": "停止音訊轉換", - "常见问题解答": "常見問題解答", - "后处理重采样至最终采样率,0为不进行重采样": "後處理重採樣至最終採樣率,0為不進行重採樣", "推理时间(ms):": "推理時間(ms):" } From 2d845e5222b649618152388a50d5c7fa9b90cb3e Mon Sep 17 00:00:00 2001 From: RVC-Boss <129054828+RVC-Boss@users.noreply.github.com> Date: Sun, 14 May 2023 16:08:37 +0800 Subject: [PATCH 12/14] Add files via upload --- logs/mute/3_feature768/mute.npy | Bin 0 -> 457856 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 logs/mute/3_feature768/mute.npy diff --git a/logs/mute/3_feature768/mute.npy b/logs/mute/3_feature768/mute.npy new file mode 100644 index 0000000000000000000000000000000000000000..b14cfb83e490f0abd05cc011fd1f9f2cf8595619 GIT binary patch literal 457856 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͏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

cHQ^4||Dk&i z{9;wSVl2I0p7C!wmYy)){|E0#c24H+A!N#@=m|7;I^Kp)t%XH$F|1FO2jJ<=-np*n z7iABAoNqH{O4ZaVHiwd}FD6esTD^Caf2jTGI`7NVF^Sw}Wa=}8dXe)(a;#(HYpD;$ zXPYO#59|EiQGN}b&(NVyluP(--DHgSF^-Zy>Mv6!55(F1#&MnxSJD*XjzP*nY^!7d_`!=F;Px{}N51+78ZHVMe+M11* z@Wmh6^~J0UyPClD3VkU*FQR{i&Gob!iZdYnH_hhZ8X z>#o@@&h?Y(+3QTSJ?pFgyDoo+<*_}g{~^iwD{amXVV=^7oW63M58~P~b6mQN7x7fs z{((i`%615CV!q0ro^l>tgYky@26ZC+kiS}6bNLQET=8FW{~S7YBfACqg>aBtoW=IV zdpJLdTzrx9n8>%ktf=|DV?iUw*IJynZQoj2MrX$35nBz6rc0Wu#$k-pvQnd5clHKa9dCT*! z^kp?L8BJz8ex6}0y0@;X?ZLN2jBi3s|Azf9G1wg)|A%LjahU(B^Fo*+)KrF z7}=-bYgMa$+c&xkuCL&n49i>EPhrz$>f$kYwz55~{Sba%(c3yn&HpCAcsf~p5!PNK z{U+bb^~|*pqwD)r^Z!y@itX@TWWO~U{Vq9@F7{?SqHSdV1RF+?(c7H=K{VTG_g?^U zuKhGJ^}i(C%a{{|u_{MfK5W~@@iM*{%0Bne@$TYrA~`psXJ33J+3$={FD>az5wp$$+{HZ#cch_I@N{rvLn177v}#_y z>*K`zQvPg0&wto-skSd+YE)OPtELI;->{$V(pZ%=<%fy-(#H7pw`%@xo*VUr{S@`= zK>CiR|1$I&$mdCLs%z0te13uZ{q0=89v*!p)*q|ipA2J}8W-LdD1U}W4asKX-_*vJ zX=j+avu&09x0aVQ71NYV{is@7lcT}EaXtQ6n|_#`Rf`h5*@1X-IP`@u2T7h)ZQr5f4uRzt*S1Hy7N4pMu{DpR8Glc(HD_BZw0DztqWbv^8wxVcptlVh+S%WW ze^YY)#5>pZ^)qboRUvnwxU?4ELAHbG z(pQSt>sNp0D|h3ej>qGBhVK8!v-{Xaez_mocG~WR^Fw}n4A#kVXBU2WT>AtuGyhLI zxxRlx^$a@aKH|G%>TjGUjy z6_c=T9&JJ||A)2YqM3HSPe;P>8Ce}%3pHRV|EiCb?b_1GuKgcb{958K*dOvLeh2P1 z*t{8@gS4+O?oQW7zozF?oBmb2#!qBdYu#tCr4`yk=_EhQ4bmg<$%!Q7!YA~8@A~bw z1!SKD*HE@!Pj6T9-m@*z4^G4XD0|U``?ENF`*0J* zZ;(W5;(Y+$gY3Bh@5Z%i-90`A&${r0=L)0X)IXEK_=nNi*ZC-U_n>qAz4)J+Fs5!@XwmYp?2=LwGh@Od!*3G4%hg_M8d#Vw?F)SewswC+BkU+MFM)7bbh6 z3$^MY{*YH`PqDrqO^fAf1>0MrlSj!q^1bvfXM1`l8si>E^D|!?*Am#Hnee{ICplRc zI?u=netzB@_*Hh-lXVtZ^ThpizIcqU4n(_+81!_#4O#ZZseHgUr5uUHA*}0!XBS0d zc#hKl#xZi%Fplgm;LGE&1~vF?pYlKXy&6iEbi) zQk~~lWGk!JCEW|22hbqK7{LV%+7=|0k?}Lwx<#ux8NV*@g{;ihhm!LV5-u;bB z9o(Z%Bz}f}h zwd6EHe>JQx@}cAOS@_P@HiO;?^odC#r{c?D?&`QR{;yy=6aS8K;5J`?0F_hG&yu{U@%GwUwMv2gAEz$);$w zTW;;QclBOtGP=Qd=9;{yyZ4#d{3;Y3A39$+)M^e+AgnA8kn%--TysVV0lfH=WUufpnRo_;Z z%ivNE%WcVh$u)H;|6bc-`a@pcTJK#TeELYFpO>xa%=n@MTrfuZdj12Royk0(O^4%q z5MOuKFGGKrwkzDj&q8}19WOY)*>Nv;YrU$vso!C&p0s-YAGPI^kDVU{ z=fUXu>sJHm+lKAxO8&HQXF5zb(&N3Kv<3TJFQ%|ZohgUo+nVm%T{EXHZg5?FiPt0R zPO@V%w&e5e?04ex@D9o$o{6q$%sk!oJ+)s+&e!Ds#kLpuNM7Yzh!_84OW-)lc_Xz# z4u&=J@LMy9Tu;@JRBWrYm;rQr<63vN%e~nAKihzfjoEfHet5z>F~1$nDReJjqwy;} zp5E3q>qqu?lF^3Ff8b|J`0gP;QQN0=)i=vI9m(_Bo1kAQzE?Tlp<(rJ!7oF*wewYc z@HXA@J|0uH}pMN4_cc_B&aJkUL#l@Q?XJG*ryD z!>9g6;+tMnXReJe_~AKv)?wcp=!VrtxmXvA*z^V;&ZGxTaUlKch{*zed4%4_;B^ll zb!F!&IW?Rg&Rky26{3UrU=dlT;2D8;0K3E7!#g?ASLi3#`yCT{HY4kuU>mt-0KDy+wWie8K0v*lzxx97yiNY%uPGwW^5UGxPssp9cSz z2WMZp&Ht;p<=13=R~Mz?5$R{)8ALLY4|GMT6r@MNuY84w+;O_#1e2fN}Z@gxHE}!C$*ztdGuq7imJ`~?TG;7!&>iSc3 z%7Oey+f&-r)%a8RzIA*jy$@^e$3K^{=QuX(;@Ug5rN*v{@GtLEeS;OxLfcz^7LQWx zh=$re!pAT91NKwk8vy4C_14<)uHk$Re~Nb|U((IxMDY1BbZq2&f$?)RnZx+tLT#gK z)%{m|J>NILd>9OwoSFp#-NiyYzw3YeT%JOY^JpS6Vr)?|8>%yq7RL^J^sVjZxxfrkfj6!Ul=2N_BiFSK38u!D%orr3rro+c;ZTfR?z@a{|t z^4}mo%p1+&^ZV(PWBG1mSR0KRt4nv+d+&>_*J*EJe2!|>f2)P}Qp$mFvp)^;IL z@l1gCbw1>SM87JAvGd=qZH?z?xWcI4Rg4e#-6;1Hjspw84=S*?phiV=s7xIPfRjw4LkLfn%lwo}3 z@AOw~&(>GJ-=2*j>pokE(-v?)&(2ZkzjplsGJkV^lD!;EN8@E5V_)897X@kTJ>A@>1Z;p7yHhxohvra!5xvY zANtmG$;o>}@#a&%Y@jhFmY;x{#irSFMaUL32JEGC0le5`8@VQI4O$M_pW-N}k-! z7mDZE{C)%d@;d&QyxYiF7mvP_tHtqnHRKO+)>OYkP7h}H_Tory)Q#LDmsP*-oOdK| z3ch*x#H6?eotheNMc0Gue@36Vhp*<0t4;YvPEE z@9?}v-YPo(uzd~ZyMB{!W4O<7thVLGsA!F(dgdE_i03`}$jOJ1CC-H$OJ3uH8vji+ zUwM-L_VVg1G<&+fEjfSk!8`iatztKoj2*?&{3`q=PIhUnde#+B7W2oJt^Ur7&FOl0 z`q+nUUG{Igyqe3Whr)Cld)~pnBVD^W9?gepV7!ibym*EGg^M1+zi-W0N2hhsq_yKw zFq?x!>RN8joqoiY-Qm1Qe~=1 z%c}2OV))|w*#Cw0G5oqY9XrVh^POUawpa0OP4_fBTh>>2^1kSvrqexqnEz*mcyGjx zYw0-#pMIB(6WdU$*W~BVE--kRM1V>{s zdyz4!R{cL%v@`v3JwBFx-wvjWVR#hHRt?qn^kMBL+Z+9{cppU5tXBQTRQb5$(69C| z=YIf(-N`fmkM*PMTz(4v@t#(?nRtwKeJFg7qYr)WD!xhC#}{c|{yu{}`d)k%EF;N< zH(h}L0lKEU_F`T2UQYV3`GS62nuCP@dk)XCv)lM)EwbLGV>uoAMRp1-n>tr3s&Az3 zXAkV<0zT`itvg%fUt;`=$HV$G9gXquZ^;ia|K@{TYsD8=(%nw~KT})4v!(0ZY;w9h zp1#Foi(&Y_B|k~qNov)tHNSo6+KaF(CA%%W7s=`U=$PD4efv-v+e@{-49_q#cI$)1 zPh{PW*Vq>K6vyuP=ec${EFa3d|G+bh4s_u+F~S;InEz+5k#W4^L-Z?sH@Z&#g*jML zw5#wOjpjJ`&9lRLVce9iki+Y$|FdD5$>+W|iO!~Lr0cWoJE0#6%LR`2*N4O)8Owj< zhxOm^+t7JOvbRI0-(*|T5y5HAHEjXMIegS#`(<+H-;ULpNWI8=I&PyzT*N=(7KvfG zwwMg(rwM4k!XL&MwKT*iJ_+4{uC21KHB`SbpZ&l__m<#qL{5bMGcgsr>YnZuw9n%`oJ~*B*$B;-aKo2wf$v20kCD;C^{>S7 zg?jHIvztB1gW6uA;|{uhbiTc7)_79u3F-BCp1{9U9Cv}w`#)hW75YcoTzqHq=k=az zcBN-yxiLjNuYpTEOZ_Tq;LFBjf66x_Dz?xi)oK^&9fx zcgvIY`Kl3JL&-A_NOo?hz5$Hu*-3tkx9G)IH6-(%PV_ZdcRC(IZcNrU=;qRYF8s#S z=oinfhLJakjfXk^8}D!S17N!x&3@z`$S2R@?@piGE8JI@P8m(_Z9M9=W;Ev~6ak@tF|8_@LN z$1!9*iI2SK32hVMgRMNhzIxV}hFUZl-D5D_qXKRkQPKW(I*H+SJu8^G}7E9?5`9WWJZy?+g#_z)(`pN`;xs2?G z#GkEEkh>0^tLaepqV{MyqlG8n%pcco-8wq}%_wqmHi%8}GF`jV^94FKM{Cft$o1Le z_vHU3@>JdyV{Lo#f&40V)8F}|d_fE^Xz=?x{QIoq!{B^H4qn9u{jhivF85Pmts?rz z9A!iD&Ht0xuIu+`FYOY=Fh2gjB`HR_PrQq_zM2p-1U87fwP!H$HR`Dhy2dY#MjiGPZROV`Z}M@ zXCYTUrRyI4Z7cp4sXd-67RQ)JY)AK5WS)-iVszHVGk(Z6BI7$Yp3SF|`0O*X!n$aK z{`odcWEL;g`)ye5#)Ie<{a_>+F&{m^k8&^nkNr^RYw^ty@SF?h9b{f@)0d+oVS8Oo zQxl5JHih0jjZ2%V52urFewWTp}VU z@a(T`8eMa3Tf4R$+ti9`{bEhJA13p0dTxjBDDvDBL`RB4=x?pX!CXGnmQe5WE^HF} zXgBzmX&VR2>2&==ZX@%>g=qOW`B#1QEHI2+(Up7@Y<7>9EFk-Ea`oFdj3=A8{v6$F z!L%+JAHX6vqmRh>g$y;W%Bvybb1FI8qPv5=O}+nfjq_LQyuZj_>!Z_$!#DWJ5O#=9 zSZ_>ERA=RMrvF6eq2G`%wnoQC(VN=trBi>+H-mi(*ZyM5$?)uBKgN93dysJ(cy@8# zQ(x0w?2RAZ#QZvKO#g|s>OZuS&*|>MAG_mk!dJ^-_S_*n`;4YpuQw)yIYhBPec^sy zu0*3;!ylbv^E|Nl5nml&oyY%d%2(NDuwyJeVqB^f;al49>?fH7#~RKj+j_A1Ejcoi zU)#BE{ifI&zHs0A4IB9;7x!rBvg*CMRF0PQ__slSllJxLZ4GySx}O)HAJD5=@keYJ zqQ4I3!)xJx72PDU3GLrw?<$+PL>rMg+wpN|Z&m9S+Z&t8EnyrXR$cjjKYCK~7sB?iwxeK@gJI1!>EZqV z2hr@oo-U4qZ$f|X09OZn-G5=06VVQ%V`a_nFp(eYxBIYfRh?(@a$%5b|6`vznTSjA zne|4#C>HQ7zeaQxw~)6Ct$tiwBqnmTJlyf!t~KH3x59ODhR}65o=z~aBYs@_BlZu# zewX-krgyJel$>NgUEYoN{P>O9>gVfc(tj}erueVqw`PtngmEo&gW2~0`2*qKiSE;F zC!v$?@j7UYZ^Shqcw6%8 zZ|o4K>?mWKdw_IjIv#UvINyZ%|4+_G!t@8aQ{~}MaY)b~C#I?6)9|UwiFLrJv+?T- z^1smzOSO*PY7cpc*R!cm+w)uac@Dc~k*S|#gV9fh<8J#c*>(v#ZW2r5OX%;#RgRmm ze*^9OS+pm6M>g$+e0H8w{cHZ` z%k@I6=eXX+`F&_!MAO{)7vyix{`=I~@I3YgIzoLnriPjwekV7rp}h|NzsQ>a?*x6L z3pp+2*Dl7m;qY}Ma|~>c(({A%kLyfY^wcHGEY)3_0Pim zzxWQ$_1Mg>$x+L#y=a#oiF=*6J)EQI+?sDcthXK|Prf8)IbBDQE2c>^*QYr@hh1Wj z@2-~1yT~|No?0ib_-sw~okHGa^z4uBK(@k`?y7c~|A%|n{BbcD3E$1Gze(Qyu8ia4dmqE%c!_ zX0E-(hrhGqR;Hx6 zWwgh`Jl{3Bki5z6FVWoN_-Q!4)348RejXpy@Vr6ShvuT!*uTsV`c^*F=6*i9neINY z%7O6wCud*zrafEpSo>LY?MgR1=?Shq4co0~x2{$Hi4~rCC)>g@hpf?L4y*a5g-p4Y zi$Ok1-o5KQIMv)#=<^kmDW9f+< z=i&R`&FOw!EeW)X`EVKizu@1ItPSOV3%VP~xQM-zwf{*k?D-_ev-$f3Hb07oPvYn7 zZ-LRjTi(FU#fWD#9ExaYdpIKQ=={L1n3Xw1#x zJ?Sv+7_oL%!S37y}trz5^y@ps`@*kbeG_zrCk^63wB9*S1~ z%iWKpP2d|2+kU|&@|w!0h@bW$e~>=Vl+I6rUA5{r7n0l23?u7WemM#j{Vs208-Z?@ zTD2BiguG%$Zv8UfQa}9Ic>X27jzzN@J@erBml*c0tA4XO-A0?-DPnlnaeO#=FWJN( ztRKeTqwC?Dfst@cBu9>B*NO27u>35S)`EXAdw*=GzD3KvB#V#AVE0w7^(X5?vaS@P z8y}0JIkl<=B<=XNJG(A&em)!9k~^PoPT}7>#A-3VQ0ulPV?4ZKmJFct3^ez<){FgD zllu_f(b~Fuui-(oeaN%^AJ(mk$>O;aT;9=0Q#SBdIn?#vY~As`#5dcs$$U4K@8uA3 zTF}!EAA94j=FqT53+Uyekb}i+d{2qZCiY{*^BpqPfb4#9tan6jpbpuiMfo?pafOceDK(G@sP0W7ztL-=6pzxz2Cd8hFlj-Fq$h#Wm|_ z+Q+hwZP6KUoGkW_lJ~3FPC=t@XIwEDi_KlQ>;a)^c zb2w6Sq}(`?{R$@?d04~VTP(ImYYq@!QSZGI{pn}6jDhceXm@rVe7z_7)0cRM3hfYM z_d zM26og$Y0QYO8x5ZPdB3TVY=6+vl~0bp;()pom?NvZ~9nvF`Q~^M0fEfUu|gr6Zyxm zp&8#_$=?(CK!4BOpQZ9EnQEJ+e!oM1E3q{0gtg3gAG|A^hZ@j_kM+IOx3-TH}Zi_zXyMpZd@Ug9WckwaT)u-^^0=d}6 zo#59;QvEDBjO@Q$Uqt5&*E_pDj}1@5vjzWs=zJ@2nq^#5Px2dFyQd+FpHOdh;^VH~ zliLNJ5VJ;d{!;#2L*8sg_Vw&NTfMs$j;-+x)3#Wf`k%e2&0H*L%~!^r^iw)UIaZs( zJTG6vaXmbLx__HT_6=k|1gE;3XZ)~_J{Wv%97)xq%zU93MaTNC@pEjQGt7m{_vuT> zUl-=}*%IP7nEf}SA1;5#vGH7dm&5Z8UOp@@a7~=Ee)Ou%VT~f|w!C`ATK15O%V8Z3 z-_2-VA%8!*^qugnPI&>^-^ptVXCwR9$>ihY##(ic5Kpk*mwxp!=YxEJes&9a>lu^i z%I_7=I{Mk3uE{?0xNHO+uhmt*LzK^|H|IkC6Wt~M^GB#@`N3pe%AX&z@fCW<%KO%I zy~Ot2&>loy@OwY@HNjWoqZ9GYww+{q9_=Ua-)noBuddUFPN)C6CFU!5>+=O+Z?xd{4G4=(Y7V;9D0wXuX(MySIORH!|ilz?z%h)zcUx{ zUpkYlk$f|P4gaVE(_j*Ve7d}QTkJ#aX+q9i{+xi$I2bRWC-_mk@_*S{(6=?4f8~oa z$ua-S*Q946zg~oAUcGsY_5{o59@?j*ZCO1jZJ&mmT+0+x8-J9=#EHk81l= zyh45WTHD_E>e%)O8M9&iKYD-AzJ%QC(d-WMI5Zd5Rqq4FH^?#h8rB)pS&rp>_7poE zXZz7lelEYFQ`pl~JD+6l>OcQ-K3B{OcKpD;Ze*HYl=@}#7GItU+YR*n2YpLe=uX}U zK8Izgb3V!S>?JIbi8_Rd6d$`!u(7p$kc*nP}Wu%SHLe0yT+8gJ>dSbCHyr;AKUdL)j^s`uA zLgtrj+ZF$b>^~f)vD$tj)3=53Ogg$QcTb_e?}F|ydRw_}{E7#{Ihw4m#OYzOzGFjE za_{ilx;YGAHi(tJXA#Jg6_nlZl>c;sgE13BN)`z`rB#qnW!k3_o>eBJ}i*GkOK z(JsfcAmp55{V3ZKPw?5jb-t@7b1S}svs(YZ41XdnXp`^x=mlf6S{UCYU&8x&y9b^0 zZAgb0rS7}ZG0Rr}wy5zw=ZowRdJZP9G0f)wQET`8=h7z!i=WxEG3@$Ev2%U(4pQ}9 z+ui6_s>SMBe0)uPg>5~$|Dbm$c_C-J+8Xm;BYF?y&%x@7+%MmUS$$2;hx2xN*bq&J zQ+~wL9skW!O=&z~9pH(&03DEv;G?+G){BjW$?yLEvuUyRg+_!oIRmi&|0|9M^YyTSRx_`V_QHhf>w zzc*i*|7RiYA!g#4+>EEUnluyNFgn*V_ud`f*>qn>XGi|3$9pzj&z1AVc;HNSfcrZ8 z?dd-f?I1MwvUioW;K^w2p_jbE?;4hi@b2rn-~TE3wY(SB{m``G*L$pS@>jt>(b|05 z7i~mFdp0!3&)=zj8nvOv{3G0#Ws`e)4+PJGT9oopI-32rko%(8b+DfS*PE{IPe-l}Y_FKfP6M9$+_n5JM75^nCzNNnvJsZ%EKmJL6 zT*5DFkUy9V_pVhGZ{ybWER zF=n9UF#Yj z#p+e~MmE`s{-4M_g^!x@`BnJdC0jm}ACukBbvasg)?ZiBv!P@8m&(1c1{UUB@c=Rp zpm!~D!&vt*zray!P_vc__h58;v3qOrej1kJ(8{s!oVAn_VXmJvg|(BoUEq8qzBzEO zK!39H266eoxq6VD0AJi756~}i?HIKBX(ortF?4Q6u6#)3SE$SJ+s@a6N1x5C`IXnh zGK*gKtfd;0w>AG4&*XBO_oHI9DE~rD-kQt?arz!#DmORdhYRs8)yBT?Od@^4vH3$f zpI;i2Ii4S<;|ueaR&+iN=WBjn_HNgvkZoQbo_FWhlGh8CA@H5a?|hNH#rMPQ|EmtI zAYaaeZ-+wOWIKsRGq!Ew{1|p#K*n@3rlFmLpAX`3aJ*sb!lsM(lYeq`GZDw)b^JRT zo2~zsJImom;XFwkZbBp0@xHL_6zH5!L;GJoR!6h7>3fcz{_MWlarcI5{VhG1&fVyE zhCTh@o&oP>j*n%}9rSm^!}eGnCijtV3{IEA=3XYcjn5`(`@KQUB6CAJcSM)TH8nB) zln-8_PoF3@WY>GzLf>ag@dN$=S{WVycN!WHV&QTcy0Y> zd$C(VmNlSwp#9tG)eJVA>bmD4*{#7wcxKzwjX2W&4?J=uyk8Ixq<64wE!fuQgA)F^ z_MOSyf!^7Cumjyw)#(v*%iriObzvG^i6?u!v5Z_{^-2D^&@8~>~ zZzrMsirn?#ptJZ@n;MhC9^Si%e%1a8Io<;ZbD8KDw(JUFe1m_GjZwcLES9a%@ z4s7Vd2kJ{$M=rmIQC|%2PgeIdC)BFnR4IqiqwYqxsoP`e*v@!+o!WICGDL-`e* zNaiu{kKvOq)O-D;c$xfGWE@Vf{#|?yQp&L#9Oc;$R1`-fh}&KmK}iiVCQ$h-hAw-4prk@!L!Ta)ns?4#wMef}6< zT~5|{tM^GqF&|9cjdb^d9j5dpwp^+Ga#-e&^BMi)*_zQEV${JnX>J$hgUK#*+=l-N zJg3=ygyjj>hS71U`RZ`;7P3V?Wk;glke;*2li%@tzF3DJ#UQMmM?2VtkwIr^eo)*c zHan1G4KB6*oatxr9qjyv%#+~@<8h}tea`WTd>wLSC>zdjPEWE1f9%Oedy^UJ>W<>w z2+b%o<7}axxrd4`)82s|HYDBH@`2;E*|{};ErMkwT72o(eD=NL$K-Pu6AyOW4qZ$4 zw=I1COK$wAIL{(?XY~A^JzEr+Wzxcbtu`P`5 z^~;swuxFoYzFPb&7ej8G%J(D4X$8;su3trNC;UzLGhp~jtooCGzUyy@;hT=-L2BHM z?j-ke=X3Zr#CRqwzl+JhhU)k5!}ki&Wn>-0A0=E}$eSY%pWxTwaP3FVj_BVb>s9v! z0-erVQne=UsUn9{aW~c;m2?IbOioThnnNL5=J&hrE|44ydN0WAaZ#b z|66~a1HNES>piO9g3S0MxfowJ{(4sX*?1PH0T1DMi;eOl zn#N!D<#DhMs#X8B6VGJd?exsSdr8fDeo?*0nGA5ev3DFU<)^tROtOw<+o#T3 z!u)`5(vRpJmH*?PIVw!~czx>U*u6juebS8W8QOMDc`Q&TQm$jE_Oj4t#3;*id>3Xp2!{5^NL&W<3*kWFgtP+Fe{BWvk&DrrR{U?z<;gO#T)T+!iQa*2du`gAWrcpYSQ) zr*9fpL#)n0{}x$m!?rP`6&%X5E z-Q{_7^bz}w(Z9-;dj0Vb`;~k<72Q$dvLB!5_fbDG)ayiC!~7#&i*Dm)yook-ATuw> z)^;u)MCr4^KLfog(+h2ROym|*FKN^1@vhO5YjVNw% z?e;qFu7%i>r$3ZzjdmelytC74-U$_pulSkFXrSxA^TBWA9EA5kGD3gQcZx01%8$G| zOdV>~f4aoKsw;e(ysUktHNpa}Z^f$#IbUh3HKfE?pV^_?yMmHX0pH#xh@r5bzM<7InT|Bv5wKAqjm(R@r!ZCV~mf3~h@Z-VbJ ze)x{QJ@}<5`j+&~t9kFl_Oo10@jXHIc5FHp|6zP{75#sZG4rt~Js*$vqQf(wupXKm z?)Zy(b5%GG#Y1P}Sy6eLYxBw5fSzV}E|pWph$4(rU&yO3(YKQWVi)Fl`2x5{+4O-z zd-V+X2L5Q}d^VX|l6@jPJsqpN@gTGb9euPP!ybLM2;;)@_WQ%8J|vrybDVSiARn_j zrfEdx@$R+vtQnh@xz}a)-mZVrTTO+tBl|OL4SZ<+AMP)Toz%}G>AAk4`W_{|i>xX7 zp+26x2*V}l`98VOUjHhtpkt=veb6_8NgjrKsJt_pT-!={b}jpd*H%B13%PY5pUIIz z-;eIJe-`aT*yVNjo+28=?t$#SOuIgoJO%4e{%u3g@!~b5q53VaybEks@Y7H-cGV_N z)7kK}muK_kPgmELiQ{?Vus&Unqi+n`>9)sVRR_~9j!&iUQCKtE|Fd-G@n1~)AHYXx z5g{o_7)h2&*_Zl$j6Gz@?%Kw_?__66drAoHO{Gw%R9e5^@7VX9i|b-6AzaIKaqqR< z-}6krKjtwr=e(EKdpYlOX8FwLTy*j{^^7TM#g?uxj6u5{UwsC{5Wb;5yx$b(?sKp; z-b`%Y)dxfLDZT6A-(H+%!1V!{&1|2u;h*~dvE2HpuDVATtA)kd*6`~k)%)Cqu^R3} zg?F^#k$Bw8D#r6k@WGuhTA$=AwTE{B*qnxEBpqS-UB5Xoti?-lDnCMV5`S(erq(~1 zoQ@yj^Z$@{5Ddri(FnF5#TGRoS652+*NZz=`j!D(uC7(@X@qy4!kQtxe;l5vmVRp% zYIJNYm3$QLcPFlObK^VIrZ8{C8>3ef%irm7&6CTi_;T3HCDm^?LOc(#l(43&{t(8%}g|XMfv3yK#BeOrd82P>?Lo#V=+&vHmsr0JANu%lw)0u^3f()=%U|j4_NU=J zAMb4PV*XsnZa&C@Pp$t`=fx3dHgo^~B3Rys^HlPzqoOU;LA1%ubas~8;+gal+jYtA zK;{rS2h}{!!FL4zUXAaX-qmyad?B70bf_uOOgcQDEH<*|kMImT>C0E2!+H*%23uFw zd{+XtnPTxZ3_r=a2KKC!bMw&}b44G%+)e+U=KX^0JJ9h@eBzj?Q+X$J=8@!rde45z zJd1qybj!i$?zgQZKh)qW?2m`-eDbWDiXn1Or%z1B14inu5GA$%hDiXLd6vRNAh{h>Z);U2(md{|Fj zgytByuO-8M=i)|d+l6$wMvGe3s{bF3Lw*iIvo8M5^oeJ9M<-c8hkQ?rtFZo0UlIfJ zOL816+cda`ZhM4`ljsOIhruSdBYrQ<&*eOr)^q+Qniu5yd*TGOmPmM}FI!|F@%8UZqR4MflHy=~waSh;A{OUi8g`;X(d6 zna)t(R%n~iyLt~WnJ90j$c^@NjU{jQ#%c|ki$xj3RMLARJ6<$*ng7z0j7iwTb#M9{ z{H^KiO76yVUCxdk{IP*&hIeW2ru|hi7xN?gqj6+~aj*}%&Ddq0Nv%Oj>;EiV13U=# zM(i*@gy#z3osBq#<7xgf$7E~s!zXBVB8%^{-f-OuOJ}<7(FSv|r}oLVE^v$|{{hEC zwciB`JF9QjwW9koei&QtodVCQjQ#v^v}f|uCjl3kd)n_t_aCtHP5Bl7J;5Je`u!+- z3wa)%Nrd|o`7h+`tA8^(;40-&a*M5}yql}-1^b20Ung^lc!zP{N$#&*b8S;&w|XIe zlaJXuimv_OJ%&F9*H!<+mds-RO1^u5o(||n!56R{#TRqgAzwlr%h$p;U;9RALcUGq z`>p66CC2=o8Q0-`ll(sT_jf+B(R-O_{(}CpdTUHP^k;W8RQKibd3-m7yw}L(gZL2o z9pHswxadM7^m>hbD-0ZayOy6M*uI1?NVjt#~Fy^j=zqw<%mv)y+)0j0ec0%lDQ&{f#&~iTeILNGF*!%+`@uTm5ba~hX&GeVzjfuB-nY2;YK47~fF#Y$gW%)Je96Ysv6FXSf!P-+;Z; z?|xadzrFWp^UKLHKI8rMPiAlMVOPiUJDX4TiR>7wP5za8+nz-)|Ds;3cu|qchlOM=jMCRz1nd*y0!gIi#+d?=$tccvf8;hOUu}#q^y^ zUk|w}|D(ZpKH=B9t(i`w#}>ZFl^tY%3SH*vsI$2={C*^Z|Atz%4vEg!&z8bCNabmA zEWa)wyEQ*_tGQ>SZw`IdW9ffj;J>t4O}yax8NS!}Z9lrbj}qQ_PM&7ddF069=t29b z=nlSn)rf{GnvH|5tWs^c`M4XJgDag_vcz^XJIglOdC#A|$}=9YY^{+4)pI1lx~m<;nn^ ziu?KG6c}FBcPH7}V(Mowa#~ zGV6?IjCc%&t1J3F`G_CFH`=np( ziZ8>f_NTC<|G~!(>EUY8d-ldg`fx3Zt~Wl+$KgJBaX;JC%J94-b6pq>qQ5!4?mdKY z7uM^4PMnVmYtQDif`0g)c-P_>W)OA*{YZ;o(e6gJV zE9%z#FXE}SYOLkv-pqI6;vRMGUBY}G{Ki+Yh^_0`dhp+cV*UcTH?iX@G(E+6w6-(! z?}k?Vqht94w&)yj`3Gq;4$gyY z8`#|ckDAa?56}CsZ6^*FvBmm7d&KjgIdJe*(u~Yia2Pky!Dy^^@=oN9qJO;olXQgb zNd4rLVJz-!?mPtFR^*T1rw8EUk8rOf7K?OG?FZrwc&C$h0iVB3_m|?lk^Z0P9m;=~ z>U#+uIhsA$SdHO)7ua_+&Q7OuXKVJ5cdhxpC%&h|bSrWX!yB$&wx+xFn)#;;_?FjK z|CbP%r{aaR>iz#{6`k`Mysz(>*#!G3#>n+@du&HQ#7> zyrVaJWq5Ns6v*`SRpV?WclVxx8H)uN$4;!+vcphJ4L-p*b zE4$UvWDGekvY`>aFU z*^q65?qM|TYHPj=V=fB$TfMV&nSF>8JL73E?&f@4COh(nzEDrY>Khl2j0h>Pvx@>jMw(Coz5T6yWjacT}R>Vr)@b~Ze#27eY{i0 zpG)DNY5eUD)8TaW_g}!b=pPP`SZ5#gsovEHYuz-1f3m&?bf?j`f-RwDsh!bPV)(lD z?l6pm-MeIgH=E)34RW@le;-(lrEq;-ru6l6-k;Cf;IWp?X1hnTjk@LDPkFg^>;G`? zDBL>?d0)**-}mu-b@on_pS$7<@!2=Tiyg1kTsOplHDpfeVd=42eNZxlP^YM2w#Phqqk&)!!17Rcka z+Kz)s?v$~8FEXZ}y`S&ygukb?wtA6Hg5gFwrfM_SmhvgNk#EjMH(Ja#;s0&$?ZsCQ zHB@WEcw@4Izb1Ls^$r{VFjlr@Psl&($wHluzbEGac|8m5BXrM)?=f;uA!~ozR@%so zkK*%p>3WIZYIv`f*MsZbXCzB}(vfKSD(#N{ukiI}|1xa{>N7UW2JKrl`u?hQ-B$Y5 zgG4QkZX@Fic)w_H4dMJ+ahr%ILk9+={=i{chSCS|AN?k${)Lu_XPVR zavp-uf7oWNlIs8Fb2(DD_Ym*LFGKJRheN(bL)bmL=0BUvWlzDWhJHa{NfmvmSQxL%IolIUKK|*_wU9p3kgj&ar=4+fX&e`#WJBn$P63TgbVX zzV-3Xg8d?~I1~Rbb>92q|J%JAauYwCz|JS(T~3F4n`yvkeVUuAvZZ|bIlI)a>@Ylk zC+By%)c5N5!jGX@1*}hJ?4G}IQT8Igy=MXY>BAdc zWxtw?P_xvFd;}SLlRwb0^=>-Kdq{P)HUBw&9oa`}@5aWX8a#)PJH~j*zHBBxSQmxy zS^g?^>%rL)-)&@{OpmdhcX0d+JkP*$uw44eUM-KpT3`VhYp7(Qy)hB;IkuH!>6nQo zqr18F*vWX_L$4m>6VS+kT#bvux>rn-;ppIr=JUaxFkVfkT9j>$cA+|SyzOQfFSAy@ zUi$%PS2?%-55LWcw^A$W(HaX`$o*;BnzAL*wsja|@U*AnLG}!mgNGS6H(S$97CU*6 zjmNW@yg!59u4s&}Vle*0Yt?V9(}Q5WimpX$GzWzL|H=+!-)r;*|LzNq98dW+fg{|L zjm=f@rTE`u^J;v}(Cr3KBYoG@{HB}EQ;f5I@=hJhPe#M<;d-^0!8ZQNcfx-TOnh40 zr~Z;tgm-Ylm_HcpF0h_O{^?}DMXsEyo;%!AvmSA7{hF@p_~@0@|GkCp29%@e`3t$m zdM-YR7)P(7X$P}dr+?FLUeD!rB<^`GMqAWXV?4aakTjLkv)MkLezFtKO{! zjEF3?Bb%+yyb*pEknitUZ4AE!$os2B+p~XjHcn=TxTgofu$8tG*>?xoebG<0i9!5; z*nV2`JsQ61&89D5;`4Hc2Jgzi(;WW+@_DhCZ-`!O615?GBRJoK+#`+2EyevtU~yE+I!ZlzZ0pNtlaT+xQ`tpXFBCK6Bnchgy|1k>lUtJG$nbd06FN zX`JOSl=Ij(lH3t|;ALDI-Zg*Htvkic!J^niU!^m31p4S6L z=j)-pg^qqOzFt>-M&|dbC;48RI+2XRn`@uod<;CNv*i@~oUYTwxf_ zHtPiYUi3Z;^K>-b@E$>y8kXH<+>C2bL&&#|EoRYc&QH!Vw!I^rHi)NnMgD4?`xs;l zX8&~kZ;Q*`&Al!mJJKP02RD7V;tg z!Z>P1-x!z|8ZX1p%hPyFt$Kf|98A{T=o-lGize9rqBuNBk2;i@lanuP`@$4(HK~b- ze0ZN6<2fH{n*i$!7^ahTj5y7+4{<#kmjB>=n!b+u#VYxo{1a{C_&T<~5>|6kw2S{Y z+rc&AygK*z#N$A;t;krb<~bs|Nj5sl9KAI~{v2N#i{YKmLXIbDM)*c+eigfn%XFGC z-IIQPO1FX)P3n3k-T_ac-?P7PkF-2=Z)@9?)q6+bdMjSRmN&?JUCz$r!$-t}j^qh8 z$?3|jP>bYeF3+-$Yu1hM+tLBX;g{@k&pTDqQe!2oV^XopLQOk{j1_phvCkSSxrH`|{rka{Jgn%kE~z(x?pd%*VebR-W`OMydX9zFxXD++WIjswn=$pzjYD9y3oIOV@RB`89es<%?6{F-D`Abhc1Cn>rtY=N0tF7^5%Z9n43q z(VwcH{n==3n~~k2PxVd4a4$Dpdl$RWDSuKiDdkwSwsYepI^F&YZ4aqQd>*$T-}Oa! zP8*-6PyVELuy=bjN8($~KX<|L599m@bp7?$Yd03t9gX3QYSnu*^jsY2czT2 zewUn3ORWEsbLl%7rjBHWSaxq%^KL{h^be3Zo_*Hlk=R71Y1_$r%@6V04rKU^W4PW3 z_oDKQ-Vbf+VRkdVQS7lUjE6biMc&*_&I#Hk^Edxwr=aaE4^E)p*i2nRW&Bf4gL^G8 zl^11`#5)7{;ZLrnM?OT`)x=QWayVb&&r{4r|0K`4Da0V1L!PmjtJU# zxrtnuA{O`7++&5|EciDe<1uu%$T4ex;y-dn9v9~G6#is9`45tL0Gg}l{*r$V6^nq+ zyDx=tQ2no8inceopQ4rj;hoE9PuB&L`T8Dh1L;5KRfM@{ubSFvE*!+}gsvmWls`$TmW*f9{pi}V$=W2$tI75Jfv$Li z9o_ML#s1;2mSS)j|CQu)asC~Bo#T72c+wjg^c(xS1Xy4Af-iq8e;JJ_91nr(=9%$Yk-p6w^zP%r=Hf(Pz zUq|w*8dlAjpYZ<}@*lSSz!wv>?~l%S5ASFtC#yx~n#>poHNOm4dph6A{t!N}j!5}4 zBO^Cnl1b|P7ch!xakBo;8>;uMlIHmR)+xL@S<1uobhy_e&)PV8QOtjr=ex1%BiCf= zRQ9!VYwT=yZFh>}-DH1Pzvf!|)gXg>{)<+keT#l$GMc?6?@IX-jUoG9vZv}F%}?L( z%lgLA-tatV6Vqt4n4V9TXFuuo#^G>zvdFpo$v3381D$*ob#y&(su=z$x4V!x4ZoTn z_p8Y}ye-knm+)PXtUKOZ&IEj$@SSI@@tzecu8p&w z*mpRY--^N4b=Cg}h2Qw63)wf)zOU!jAGnVOM=^m-XNtiJ?F0C}AKu5w-VEl>_F=4S zLH5?Rf%J3}XL(r8CVw!D=EM9NxCi3@Tg~-^t*d)?owS8|ejfWSXY&Ve%Y#(B%M0Pq zR{Tzve2$0EyNH~3v^~UzzZx6l#bd-!y)PD%)gJBk_*bi^>(jp$x+}%y*FM!fy;yB7 zE{5$2eFu~GKePw1VHo^B;+4mtHivaam=D7|6d!gLXDb%Ufhb? z8@(ri_GlQ^K{rJV?tpcFoBC0nQfCbZ%lCX0^6Ck8!WW5qw2zoQ$^Yxsto6|}(H7#U z&WGHInmadt=Pl@Z9*&XptS0Ys?Ms$b|EW~IjJM9V!WL@8uJry`tNyz(zgIl?J6CVB z3FH<0rEZ1i>cvpw=NUTXeY6dpZOCSSwsV8~-{KPS!K=o`W47DL{+uma$fajjR<$%d zQ;YiY!(h17q%aSJ_Y;F{@s@mItcAI{xLRE}gU{Cn9_vzo%cDwUO+4wd(HK@GD_K^QwJw&dIA=f$~>#eVbuHy>dPbBLGG<=ux zPrNQ)-Nz4Y>2s~0x%ZO|(SD-6^=-jdabI>`i*5j#ZRmQQAL&Z^kgFc#3;Ba>ne~5a zZcHDgJLK#!_&TCX`R!}6u4J?KPV-@W_$6PBz#}&CF!qe&n`gD{t>(;XV5fNZ5#w3( z9bVaOI(H%;lR8*>omb_%^J$@<)R0HP5T9Kjx9SA33MO^C6p`v2CP3)cAkl zI|;V2<}Y!L&bKWlb4RiKVVUc4I77|p!{!ZOr7sRXyieOS^2H?CK$~%%O@;pt^fUCE zJF}tmU4bu*LAF-!N9~2CjsA)7ggT+#Ma$t(lhQDz-d*nd0FD>n4Qsw7{ICR`4mR@3 z`FKlxE7>Vm!>wTk{XC(N^#?8SGwnxRNtG4S339JR1$2FZ^=TrC3lOi{P8^hT|nN8 z^wSaQc+|e;cMEWB$_Lh&`E>LLkim|8Fs!$jqp#B^4$)1<%2M{92k+6&R~uJyE36R< zK8^R3+dZ6{Bhnjd)$gfGw&nlj<2G{O3^+1=Rioqm=scBfV>}rLoArOFZJ8V{UKOkB z&^OX^D|yY(8~5o7JOdrCgU2`0(^>5K9*zy!vp=2F96to}CUmNc>5g^P?*}7evuKnD z|3=5h<*$5qPJ`cv(ASlYA+YOD`jIWxMHt`f;XMeQ`VsE^huB8e|1p0RU-N&WO>EL9 zVftpd>nlEbiXE%O^fLUb$a)yfD(&mi(ZxKoP#Zs%uaflxz6a{7-(7{V7B`C7hWHL+ z+aBmLvfrf3ar&})e|&?vr_Y-Cq$j-cBs(2#7rb-m`K-5VYU|63*`+;o|3A!w$+q-w zz`wHTdo=Em_{CBGTa=F}6PLHN@ zitV3kayMyi{r?-g)q(gL@{Rj!2iPxcaQ)j*eT%MqP|f*;TsB8BTo1ysw`15N>&h@k zrlO{aS!IRQ(&6B&!iJYHU!@00KAqg4HgwnaCJ5AL<{-G$}{w68&bFeg^+0+>6P5*vmKWoemVz)XKu74tNOTF_J-HrA^Yp`%1>wSKE zQoAt{=9bhoP5v}Jf3klBY#TejlCR`YLT*k+x(UC`XUiZu+Oqv2_8g|pUJA=W{4okG zJJLz$M>*dP-9_}5`VT}eFVkJ%xJCb7bo6G=4tNH@sosWXc*P;)<@~*t>)A{`b%3v_ zzEB^Zww5>ru4~~{Q{v(H*Tee)n)l)Ql;5mdk_{Wz{AOH^CHJ8VKHaw_uf=kl99W1} zUS{p!>x4GUQF1-9&WisE{}{R+v;E56QFYb(&EdN@VVzT)CBKcoXj8t+8>%@Y~p;5(2RcT^&->W1E%Tqes@6U#(Wpn_5ans2;YYI+ro7gy3LJ+*V(WD zmY&W%cMI=PW{05ti9g<~tL`gjo5L(N(MbEzYQO8naGyQ=o;O^tCI#NBV7-DrA7dN) z3OSaC`DF{|+ro1pA0+S^BVo=@huWWn?q0+`@7uPGu`3T1E z`DuH$(pO%LUTnj9G#yf_>TC7AF+M40sbhoLH;XS{K?_rP0Q#@QJkd51?dR+?rqi>@WLG>Mp3R*fWc$gS*dG5eVmy#7;uVvh zvM;Pp;)~UXR`4EfTc5niY#gh-589>tTVtObNxr97?I~Zu+uZT`=n^s;`G4)2YjHX^ z;$QbJ((~wh#P)Bz>Ow+({&wA(_cZWc@T}S z_uF(f+^ugqovqk%XhXH83itoBr|8&+tZne@Mn^w1;#i19c$Y1DA>=Cm-Hsp5w3BhA zX2e(1BbTzn(G9Pw{`W0<33hX7zA^r-8+}6t_RY|UQF!+&{1Mm~pmKRhG!^JkjVy$^Xk>77abTh@L%zm&TVYNUN|08Wpi?Z_dZ_@ob@OH-1{5-&Vt948-@^Cebn1-uO$6wQ3$y zpHn$mOr~cvY*#zqsmA~EZ4Wl%O`GvG{`7gd+=Fix$%oeHt&8J>y%!U!Q*-J4j9l?d zAJX1OOeWB^h(G=X!vkc>@3Lk)M_a7#EI$8&O&##z&u(x1-LM}E@v@rSuO%o~y1ieI-M zuK#5iBXw^in$5&wKDnLry+Q9-^lP)XH9aHf8DgB?R;%vW<>6Z9XZD=kP_1p^FXZi7`-OKpw%#Iss|{370a zYP+e`VB|O<*;yi(mA$mT#A6KY`3$toa{w z+*QBze=$h@uq7GM;9GdM3;6d+IE?Yw{r_x~wnzD3x$$xt{8QC&a!Nee0I@n9@8e?J zLM;omeqzo260w;|M+@(s{lF*dX}bwN7!rE(8v_p=Z_u&69QeJq=KjLY?1L@28m5Qv zUr4@~CkL@hT}j80H4AM!K0DL?05tRQ^y1&9Bs6EzzksZh z$@$LOzB?UkPP_x3?t=DU*gtXJO0E}TwZTg3QF8BOKi%P4F?~yHcGNb`nEBXsW_R)* zt;sz(817@kT71a%CG@YvWBs4)MF0L|yN44Gg0UBykEG{#c>0;M?n3{N@!{TGvKW>p zwBJl_U-tbS#xdS0YDPzhLl1dzEm^DaAB^rU_H?4tIE@FgVI#KR4EGLldVszom{_MtA7u2`;fCK*|*Zq-tuIa$G|mR`!Kn`w(-@e zR(->$cmkIB?)M%@?v3ah$Q!P&iQ{K$>I&Ip6wBe3gIQa${!Y)`@SKnKI9QI5W5>zS z$Jr3_brZau8>{CT@o@I^W%oOE)xG;-Df<68z6!5+u}DF1>f~c@H{5%%6nCHDo#pmN|TTHn}^{(FN_@M6QO;6iQ`s7~q&0qI?!nb4ch3s#_uGVCSdTPxUep?=} zB)#xh|EFKzIgqUXlC7>)b3kX9A7kHewtuI7?58T&**u^w7{|wxXN;5+#Ce!D_C)eJfw}yUd^Iut)q99)cy4|v`|=H6W?!%IUEUer zHMQz}=5Svl-;V5I&ga{|3;zsz<0Btx@0n%tGJT84U7zl=`1T9AxQY*culIcr<8gqz z6wiDztn2XIC^Fd@?S8tMKb?({wtcKbf1PjX$lI;p zKi_e8JV(+o*6{=K=_S~g!3#X9E%`w#K`6ZWg&d&e54DSywUa}M9P zF@8G3?;0y!Aot$Xm!KO7`+ekw98LIQPrjTEqi=quJ+&Xrjy>>yC|4hc7fo?3ERM55 z^nIybH+oN`5nUHDKP6`$Ie#BKaw~p`4M)(+KhgNzy%%CUk8r*i%^_%P#n=4&wipb= ze=gtcL{=+43v17lVCtbJPO)|fxqh6Q_pvn~&IV4jhARf5W?&UB*wi|Ci2Vdtd#V!uNcAwXV&YYlA!g zmd=y-K2^hvhs2zcOs99Au{g~)6&@FFxf7n(mh1D~D!#6vzsK=-ZI3!Wq^|lug;M^d z?dhCmKOIgvR9?-N?zV|)U>Gxai~q92SW48dXa}Vp5 zwBJwXQTmMEVhKB%kSDfD2YTdFbSVr$j`e@}rS{+Xd=X4H8Hd5g54+df6%GF6Nxp(B znhDfxcd@<^|6cNsuae_oELK+EIjYwG+wtwjFwMl%f)Crm&<-xw z_emSL?xOGSz2bbXv9pNXLt*&E<{oOnhhd!(eOp)6oN^}qU&Ts|O^u^Wu7r1#3pFJ+ zKEiK=OFD~Ct3F*>{XcxR4f=K2sxAbcVmGvGju*R@-kyPw+ix`>s~K?~-*^w-%BiM$vm>W6hMz z!Yl8S6WMW%Z*OksxG&zA9RuioVGX|Yb-4&zcsD-S8gB`2OXsKQU!VNP;D$Bdpt1Tk zNOBaP`d`!X0qxtfwT>iPOcv(_9M~Ern^1*GvGf0ExN3g*tCN4C-Ias=^^+=vGp$UbM2>~ z`wMx-d-#q^d8#_povh(_FJ#x&K^EH2*uUPIe2V%Tk4wHOx;HGH%iKJe?!>@>f23O5aQL8=LvOde6NZtLuuSq~|XE@Rb*^C9MD5 zKPZ;Kwt!t>e0Gtq*YKG&Ntn~(*Wnz4wjQ>%w4dnQc!Nh80&dkTK@l!l!@yiE}t^ZSXpt{!0VNcFx+>_Kd0*+x-SiQ#OFQdYH87%%!^@YVa(iZf2Z2o z!1j}2`LeG1zo8`7K39y!v3Fnb74xily)njb1K~3U((}pfp??Sad-YG?!!z)0N!KQ1 zJ>1}31@vl2KF*q{Io$u?&!O6PhR^yx+`o?7$k9J*?&qUhN=Kw^Ej02W>L@=yay}b< zH+Zc7Lr%u~(jT#91-yKkZjXKe`;4b@t9tK)$(NXa?qt_6a$g|pB0BEX2Ungr-^u2> zFy`O5mp1;3&WHClGT2iNehv1Kcs(a@fc43Bk;Xz%jv3)rF2b(RXpapY3BhHrM7ESMYnZ4PEL;JQ4oZ z>^s!@f9=|u-*&ZkJ{iwg82dC-ziTgz?bLbn53?$xp5r6o0#k?FVAJu zj`SFp>AjAFo>$N;X{i2FIdT6#`WbyEHh=2+;b^*FMe|RwzRGb}XZ==Jt^X5sFE$tC zTf))b{sA?qkuCg}ihDec+)v4>v+c>g5dV=d?ZQv$T6~T;ua>JT*sv4%w>n>j_qKY^ zv-$Q{bAJQ7$WPSv=m2^rqkRtcr|=(5e(=!&=11?bN5jaS$EJR;9|CK4xu*Ul1K~T@ z`EG1fTT(SMJ`bMo-hli6@d&bxV)ys#G)Cit={UAlefu_im!!OuUcQcl|8qEIpnr(2 z@7TOYo#!84!tWoWj_h2iUyUw3 zo6IhU_dwfQd~5w*o(z}T7m*iz#D=qKe&^30Uprqx&QdZzlIM@uAFBUHb?9+p{|Wse zw-2{{qy0pFJ%!!v=nu!^$$ZT`wZv~lm$9J(nw`ltE=s{d@fIC%a?4_ zmbRmJivHPfj^vxG@O7<4k#%_9f?Ro=^JRRyy?iXU#yJ*^`f+q5CMf!hN9-U-wbd&9&_)e)p5tlKpri zehc>q!|zAp!PXK@;ro~V9PhaLHS7O3?T4`G9diE--!%TV1}kRqZG$-bpXrouvP;No zWcLU@dsFN_2>xWlD|A?krTiAw|Dj%odsg|I>f!)$uSWa3HtpftW$|cyv&s6_`hRos z&%u8zUH>qq)c&#`IajgsVC&<9;Czm(E7-G}_L=zJ;)^fD>{4=uu}ywe*A{X=Vs|OF zk^8Y}s0V||Rz+mw)%;|1TUHXgiObFz$!K+?jv3 zpz8v*TvGF0VLtwik5+3JyRiNb@0^yW)XZ`Ax6nTVzMl9GBYPO$@T^UqWX5O)NAXhN zwYF(n^V?C!yVH9X-~L?;_CniRd+@#SRIsZoVdt~*2l`t$w*D{Xll1`G|E^s=gm(|( zNid+#NAYbN#|N`%WAti4@vP%r=zdEs_Q5BYvgTxL0GGKiJC*EpV1+Nai|@R9kzS$y zkeV7)tXX4sC$p{J|2}IB8jsmXx}UX;lZWRwRPS~b`|xdOf7SJkrH$eku0F_)%X(^}qC%ISO32f!_!u|h}kCUeC7)Zw@+B%UzX1Kjn@7D zxGB94%f*7en}bYr@;m>xF}orDF~NV%uXFr0-Xm?tvSmlxBJDTf*^B;L$@tQ9=Yjmy zgN^E0G8~rs#PLMuajp6v>Es8rqw#)Ee^36DAE|L!_Th{7*?D`-J-&MX@k*~bGUxXq z#OhGKHip7~EN8FKc@2Gh8Qlt(SVg1IksTM#U*Lh`h5I(~ z;e22%oGyVa)X9$8I-|YNo}Y6yBzm6D@2I(sruR=e*qIp*b@yugdMk z_p3VBNp#orwbS<@yRBs+^L-(vaTj_XB)c{G2@S?STw~dErQ;dm^Bx{~7L!@61=f-e zck%5V=8vcJA0}r%WaszjJF#PKu!W4%$REI-t;uTd_;gsN!=TpY-R!&58R%|elRPir z2*0xp&r%XOketfy9ob%Qyog)#gZzW=e=`oGx9 z+_es$j<@k|GMb(J$a@iQ7%R8&^HR9?qLa*$kHR=Dy24jyGq=TCYws(@Y)HD$)r1W3 zO4f(r0(ssXom`GPI-g>HhkYM%USiv3b=B{GtLy!co1ciyced7ejue~u`kU4~vnRVd z+yCwO4Eh$3QHu3~`ZdoNzUCYANoKw+U!!BHdQM;BI31#WKAUbwa{%7|IiJG^kJ!X6 zjJuFa>Fx4ee>ADV??>3x*s$jPmu>O6=I1Ne z)eY@se0R6@S@v*5%d~9;llTA2CT!Wn`7iu`6g|(Q`3Ks|9dF}zSAW)3-`Xr5=6lzu zW#<|?KDK^M7vtR>-OyU4J8MSvzUYnJJcrf$Fj-G_9gF5>Sk*Q!`FJ*g=6dRY55Iy_hpXL~bu--0y zPzwUiL2UX~yu>F_n@a2KaDAWMg!cVDYsS)ZYj8v@$uKWwVGHB0C7ak%ih1^q7+*r) z@%;K8`n}y7I1R4f=$JzOM{GKW{K2r8=ZeOfXP0oU%jSp4>r0MjUg6p?UWtBf{p={e zZm8zF@IFe>4#pGNcc)zZ$oUNGo5%6D;e%b!s-N-O^s%M9(>8%FF)41~uYbUH4-9S4 z$-`ncJ%h#dV!qg%-@fLDC*)m1R;W|M=`n|fF__$6^Iz@kg0&dT|DDl2M6X=RA0u}T zU-fft{1q$cHO7(~ZB57sSTZ(*x@r9%eZj7!aue=QC(6yqbnh+=WBqRY@->~vui@R@ zv-o8Z{p>CV!fsro-NgM3{JWr2b5m>M_$AkD`=bf#sE+U)C^j?L(UPu>@rUtXZ4z)r zHT|v3V3bwy3$zgKGygZ?kzI-`pU!tH_=}kNf}0U2K~h;>MRTKg#j!X!6%( zles05$LZ#Hj$~6mZEw;ufc(ACO{e2oI-A%or(?L<`!Ra5qho7+!zrG_VYdEH)US9b zZ12+Xv+*h)q9JU4R}NbLr>~0jzHEAj?f3EP4A_4|)7Ex1j5%Eyxn0nhBPt)APsfMs zXlDBgo!F&(9qLVbvc5z3^9p*yZ!J1$>nX;=wNGH{VcHKO6OQCnwrp$tZ``GFH`tb* z2shcu<#_ida~WU1O;3L`pW&N{=lfdqeZg!ib!#5m_^~MQ*TZSOP)jAVEtY4Ahxq2!|C#HcbZxRSIxd8DQy9jwb*bZbVKC>1=UT->c=$YEOQy)NhsZsV z&cE^XT4=6i$K}o+U{{z+&cS;U+BxV(vVRNuR_nhXt$8LqyDP@g%h&PAupZB*N69*g zocq|^hQ46)rYp@kXb(rb3dWY!I3KcW0h<@fdG=?`_&n5s#dzd-VXUOC1JmvC%wum@ z!`2xiayDI?%wP+@CvDZvZq94LX7o2Zj?u6)V2^vt-Mi4vZFFCouO}Fvjc9J>-&1W7 zJWb%(*zp+c#$$RNtnxJvd3p>SJF#ggf89a{+d}-x71sZEz}Z!#og~i;{KZ$CmVdLEdP-xd-mc(ehoS24&0WTBc8aq%nV- zMIS#W=F;#kPBK<|Bbk4a-Az0Wln0yP-*vF?CtKP$-a*?< zeAKsry}mo4hNog$OkYv$U!iwj+edX# z`Wt<1Z1Z56LYMfaSHrWres)*&PHo82hHA|ho=NBEvOVP2U+CJVo}c*~f4EnW@nb0` z(*N*xME`K~;vC+c&W5A2{?C3w!`|X0zB;77s;k-6* zPT#m%^_}lTZOKRczub>&ek()P&Bl6L{bOJ~qt0_Law2;FAr_tVkAml1=NIvPFE%(& z=F|BRxs&bR=6B<;*dG1=;9rPd{+9cDSMy8b_+|DR!|Ao=+Kbitb=ZC%IsUV-ybGQq z=vabxNAirv=n;0-!3amZjkZy?u4v>*@-6; z;}3azJN`PyFNxP?a!ZaRtMR-+&nIkJ1#63%_h-Z=tUto>AKLe@|CNu=pyx66ea<(= zUNw)d;@7EUFSmb%?@pEfo#}bT@vxd_P4wTcub;M1haTmFCAN{;jk}PGxo2U~{`ON~ zyP}VEElmCB+?Kwx?T^&{W4(8c;9Lt`cqigqu@cK<3|m4jiAj1RpYutQ!K^*pS1w=2 zzmjhCA-ppguS4gCY*>qZ$JnbQnemrhDi)u*PHTex5!+P$_l{b!EqeF=%XFoC&wL>6 zhJ=@i&vJBj9Opp3zN5dM}zg;eL#r`17aqi$lJaEyUmy=2K?E^4ONW@ z@4MvNi~E1o>jTAvpF(Xf4tGs1ez|!v>cXyL^-U+QCBNbg_qL+&Zi4)XFJt3&HP6Yk z-9wi;9)3F-o?quD^QCz#aeb1$wX$0Om$T_F_^Bhi_vY90@x2D0e281gpU>Gdoh`;e z{)c1vl5EAtw~*Tne(V2ixR^WwyZV^kr+ow)#_`=e7ze`B0smR}`@^vb?1N$H>-_JY z*B)&?KZuKEgWS6TX{*_gFN4!b@jZk7b|P57(!rl`ZI> z&z|eado9rFw~uQu%bW0@e#LY){EzNUV7rAKLD#kLY~x&>g!i7)bNNrLDqE7V8s<*u zoAbv}mZP?*sFJ=oi`etg!x%+S9WUJ^Y*ZgX8`BD7i@d z_hy^F3* zJmGj3dS1iZ3(p)eY$B%NnlD`Yom{K#|A+fPFZ722)?^UzxWsHHCFFAX4Z|l zIvUSpkM)1b55+q0-b&_$csA32H=bqs->rG?h_9^wX*DTl33Yx;v=(=dtlLc05Y%$?V?&{kwEMA~x!GSVNTekWWtZ7kb%P%JJf=I_n6v zx(k{x)?>$8k<}0F7v#ZGuHwU2v`?w4ehU+S%09j?muTM>-W(QrknDtK0p5g9_Erb1 zC*pO*cRtz&@LF5t-Pn`VA{XACU%<%z!ni0-foBhP7{Ae@#*%qAzSvsdyqey`&u5@( z&9*_FD|evh4m@}8%eC6S(k@Ta<6!9ti+MgBNXJENo3~OuR!e5Fb+eE!Y#J!v$D!}& zyko8UpRfEU{UgwS&!!&o=n`~2&>T>!p25ZU(fJBHLT+@xH@jAiul#mv^)2{zJ-&Ve z?Gl*7m{d#Bk6{@L$3MkjIsS#(A18kr{%~I-=9^V~eh)k|U_Tq};p~1!{Hz7zmF$AA zaR0wxfBYc2Bk-ux)m(0_Nt@v5j(0yk+SvK_wkwUl7=3#-w_S^@V$~ z5#MEUEO*UYeD1t?gZJ6kVcg}$O#BACPm7}%#jVw&0qzxdY_Oi;pC83DqIWlZEy!8O z?%UWoSv%QrD|X7=vL*V-_J2ilFPqL|)5HAuAzz7ObhW%nwRyKBH|C1l*>8-bd)NCf zHu3ltFI=(Ol1zcWk-rC!e~3KUPt43e`2=!;j2+pv4H?tzH&yRX)V3vAayy<+#yRrw z0)2A1{MzwaFsSX}etj{4yy0-Q=Iig!e5>y@yypLKJ(3vLh2Pnf@3G5R&dfhy{h$96 z&o1;gwH4w$7&h{v$DI#FGm_kit~dIVp_YeyC|;-2dL~@sMYH&4H#qTxdtYT3FMGhc zoL^@0@72!lu2pk?xL*+Nxm4HSCHZPgG+M5Rdwd(Lm#}FdS-+C|ZJo7X;Nvs(t2~?! zf}Y#yeGI-3hkN*bed&Axm?Lv0Tk>oe;Os`h&o+WoZc&z^u*Sc{FJon-4<{oc| zYd<=St$celx5NJ+J^QjTBeN^I;r830*%R)s)eUW>`zVE2=OG8zfoUpw>zr~(WAz`; z@%}Kx`mIrlk!)65vlsZnoLV{$_ovF2;rfiOzl%>3virfhT)$k5|D)|-GJdhii?Ciw zSHoybCBLIFE@L?o)+_NVHQ)R6?!&h9H1N$ZJP+89Mt>~5p8sc$@aGEK2<_q*gRKImCZij1YvisB7gRGhS@*YfG@Tx1}J)isscD;|jB|i;>Z=UwcVQNdCF_kNeaNRZd4R;Y`EwIAkqZ9E&++}EMw7{2`*+{RHl*1jLv`||Nzahi&LwtnmX@cZ6m zd-3=ZCh^Je7iv>9ODxW2)0XH*(7l|kH{tnR`+fFfY;EuLqS4wv5{pa7AAolqGM^HM6>RG(zK_7YAG=%g^L2DQgC1Xcy#B8ns^5Yp z1NdnpwjD=Ki2Vo7_f_8>~FrCL`!hJR?CZxo{$M{gT=yKd|v7Qs_D4M_A321koBGM^i{38u8dyb z=l|B$)Z4A~W%8lB^LLD`k?1F~M_mZ-EXUseDaOMfHt`5}!gx8=ai|0B_-qI)2a)%z z_bQJ?Tj!kL(pzfPyW=5;ga4ED>#A>>mm|$BpP-*DZb$L^fA!IsTL0&ti|Z(|ztOff z*^j_~DIBlVyFXx_ehJPRc~6n$T_i7Dn6vpf_-r6MfZ#>K3e@jgEgT+|L#Wm*hya`_4MJpD-uEs{I@IK6@N7*(>|EYKv^;Q$@PsAJM zxqHcOWZ$mjyu>#>@W`{UmMN?iqF3?a3v2Ey)a`|J);s)v4f!XKY5kwd$3p%T;r@Sr z^&`Y>jJBuj_fWIWgy$mt-cQMgIv%;wGf=qH)6(yM)7|-SANoh}-3|CIRDa}cl+k%7 zti#~EpFZE7&D4=-J$P>kGPP~)_#VDnitk;tVq7*grr4YrXYpKp_pxD?{)@%+W3g(% ze}lwAT`C{Lqvn_A!UAW=zw{FNcP9Hqxx?N_9godB)f)C8{U_)~-|RhOWjNjZQms$_D}Hi6eE%n#2Fq&We-Anq!m%r!u$KRm zujNX*2>v-})^Du7b(q`o9bk=_?Fm;szpB$|%9rvf zZtY&(rm)?C*SO2C$Nv@I$j|VcDKjVKPr^G0&4qM6Y|QWMdlcsSu>P;s6Xx8K&y!Zp zH-Y7H{Ki+frq9`0bcg*yn7Y{xB>!f%8r$(-#r!O7#F;7;W>DEhx6t7n%VY*JK>`ZVC(^d^?!(A81Ly!GG=SvSi5l$Z$$TYj@7g9 zEHIU0+4r80d{4iPnm-tR2Up+~m;)^ZNyDl%rdM4YcA&NfYTkELs&UhK-sOD&0 zXQhMr@J<-FCp-9K9yzTVta}@(Z}f(DRC0M2?x*G-qv^m$H;M7-+ICi-N7&zPJbfsy zcNd4?ztTc*i%W#S`HZmjsqD=M*zw+T1uk(eV~^xdw=h zi!lF(XXEiFu&&~7`5E#d+`BI2U8+XsuG`~p(0s=?#%gtsRy|Fw#UIve*8jx}^d0GQ zZ5-DBMK5}rqJNyc!7%n@_hLR7LjT=l$cgL}GD2>TL-z*$qxIM8Qy22RobN=QbzQa| z-aQ@9z;i$Q29TkKRQ2d$$HVXqh2;}+?xO1sV|^oSax^{z{Xo1wllv9>jIFTd3-eIX zhfjNvJsK@vB%hNpvBCX4e!n^N^G!>%i)v~=+UNW>?kh2GV4pFZ4{&@f+O_eF$LpC| z0eg94|L%ulUvk) zwx^5mf5{(@qnEew7veOXY-`i#MKtco1zh2Mx_E@`ftvN5KKYYa|CbNYwVYkU$sCJ* z0o&eMS^ajfoP=+v@wyED{(Q#|u^fwz(H^d2SMiDb&E1Pi&o*AfKitPFHkRi%!g*a? z^=vb9&!^{2{7;axxy^5;a`8?1DZHCflAA0+D}U2V*fz}lu>Zk256@)w`CW0; zoo&|t$=c?w`FttABY9K8Uv9_ON7SwPmi|oq|4_fwf@=LQ|FeG^kE__{*?BsG-HYkF z!M-EE9VpkH#IqhB{j1LJ7v#(=c8Wn!znm1-t`$L{~*uKj-;=+STf@^`X#yq|AzPqbJ|2UoP%#$ev?C`Ivn4iFI+3$ONV+IewUR@<&S6CG`GI` zra`qP6{q3_=X*5z4Za**8~rF_T$A*wh;Fmj+X3i$7WmVU6{go zY|U2e2HU>_F1j-OFQP3SA55?OOpMX+ZJX@>*Z=X0FuLy*_aWy3IGS>*ktNtyea;Z8mjyM;k#P- zAXxS%Z@TsWF=+SDR`TghwmR~s;(G#yZTaxhn)+k>eu{qqTaI9(@s_C%iS>W+C7VW} zxBjo*LzzSF_2|sk;deioSVzIGr_g(@UQVUM`oHqoZ7|A}>@+^z98EiYVLe1=n0Mm{ z@0axI%Ukis!DOpz`B7-)L%a#QHqzGu&v5;3$(!A^vn|xw^cgYhBAy-DAV%T6m|~~8 zHQ&wHj&JwUu1<${l+r%reofXiJgdq2lP|-&1@a@E&nI8l9%R$Qwux}6FUb<~zkJV5 ztoe^N`692PdhNTTeNnC69^M7?G`F|@FP^2xcu1PlyFl9u=-cweb@U#m-TOab{a@WX zwEnN2>71r-EZV2x-*RR3JMQFMI_t=n3+Zre8<4Bk<<|ev?&S35(~t)@*dNa)-tYcD z_U`-biX!t95Z47bK*XXh&ku1qnLNqRo4WlLli+!vY_CApr|M!3M$-( z5pzzvuB*H2m=$waS6yAduRi#BuIG=KALg1f-PKj^s;;iC>FJr1WMqz|mwBZv-K~0c@SR_m(oRK zhiATLvB$Y+?nA#X|6}*)8T60f$8W>DlT9XT4!!tgm=~j=>WuTUKYb2ndpaivib-8+ zjrlX<2hpnf<8$r*DR!eRMr(Vo7`YNY3;4>;O}@PhlV|(k-Y(=1c{g}=V5=YTUkeYq zlykMUwi; z>uEC<{e))!0qr**iVq`aCpOty|2|3Y!DNW{(JW*Baqm=#P00rAHB$evUBc$^N^o^z zmrLQ03&uC1|B4;t|LNIqb|+&WcD+QuP9f(_d{gBclY6J~_k-=&VncfWLo9g(#%G*Y zCTEbo{E!^|AAjPkpQ7n>Gw+04Gh1b8<2|e}*T&P>W`W~mZLI&NE7QXm&YRV(uYGs^ zdIA{_G&RvO75!GXN;@(6!m}7XM@mB#pfJ!JChsN8~>3LovvR_#8;o^>+6pN#h&d);KD!LKE`;_sGrb?%TEdeg99sExE1e zcQ5}LqHRxg3zQ9`yS$??uZR3UpX|69_P@~cXmka>;zF1g!t={W{vWsUdv~%X8E>;; zyvA=nlo@yN#rO^<2j4JvWD{!c$Hkg8YmM)egmuS!5SoZBKIIc@slUN-vbNijwHZ94 z;nFYZ`;IB-Ze^#;xi9}~f%il3tw-k_^k3Nj{~%v&qrLV2bVvQ&676JdN6G(Z!*Kxq zx9jun@QebNQg^`e60M&VIGOuKJ5Pqc~kCp^gRp*YO4>EQ?%zh>3j6M z5ADjKoNZ>STk8BI`jO_yu5@{V9ml|aCw^jG@Sp5A*Y0VeNAx4xM>nbCOYw63)0=Kn zVL4PE1V24odv-`KtTp}*xqL;N_hI>sT={>wA0O9e`7nBPWP_n>dp-=CkaHzEb6L1I zE?jB#^^^Q2ihlHK@N_4yO4%&(b$x-@Y0@*F~;pgQ30PBq~!I6dBWeaVrYnIE@wMG9e z+{fWDM?2#rf0Rv5!~gog%b31>iSMexaldvj7YDJ^4f0#qL;l}*p0*p_tHQOr@i7*T z?To#tV%=cn2RW~%-D-FortQAyzM`{npG_k7F#WJMTR+5>w>aPF+WLQbi~E+aCi97L zs(-?oNa9&dOqXl`AJ{bL0kgR)9)S0+%8kj)7z=%zg!}1d$b&Q92-bbsv z!$VyUflFM{T3FnE9C#>Va@!DtZ&%=Y;x=D(~8V{*kokj1Jh7#AA@ym zdR|WU%k*aVe7FOqNdBL`r_DFUP_y>(|B!R%z0eu!@kDfVk3){|Uoy_ZV?M0>ISp|q z6BEpDVc$!1CL7n$Zp~I7S(8f8$)lp4uKU416Tda!?&$2ut^b#+)a)P7=W?*(C;Y~e zo8j?1n&r+-^m~KO`ZbsTH`f2}q|-C7wqMe?hmX&|>#-*P1&Mbre*Zapnrq`{@%UMv zUWa}Y{D;A?L(RQBoiEe=UvkmEvEfAcMw`#sG|YLqxh&q8J}0pEQQC?X(LinaWA?K3 zOY8qhlQ!?v+$-QKzU9*$4>x&^sh#){jgdpW&%TdpcTlbIZP08CnezXz_cjYY{4tEb z;(fQa#%TGx!?-VBWXD~}ehRNk*gPj^Wp?a@-|$*PRvP+V%nP|ob{)BwI?Hd0|A}iK z>6=Z^wuWslHWk-`zeXqFw+)%?{BGqu0xt7xyeB+;U|8UIg3V&%WL>~dUc}K`0;#*<8O8sGYtWHK&YwQ;d z_lNN;wsG$na)~fsg?q}d7dm05u%9-5gv`IgFp3|_D-vTltZC67|tIGGdCO-2*=9FOie$JKaUp@Md$cF%r{%8sTlzV<-zuL48~wxo*o1jIzKaj_G}g`kkv&1VF&HhR&qiz_ zUyS~Xe+PI1{yVh&J^#=5#y_kjT@AyUY-gNDr?9tsh9vL|`Tzg)?|SUq4DSGZ=@+eu zehYKjdh9yRZ}!dxqWjeEgSGF(k9Q&SDdlY6__p3`xQE$uXC6ws;(Y_UL9mERackF| zYSt{Y|CJ7t(eSBU{-2$xejB#$i~qrFb1U14ebGtEy0Pb+n)pKZijevgHSKpQ6T#rF35( z@2&X~U(LkVM8D-|i!rVXJXa-WOKtaZt>4nEm0h{CvA&_LiO)qhjy&8}fhBNO|=`hRqmK0ZPHX>`^%;d`E8uWGuZ z<4yK^m^^Wzd_di8=+8x$!E>&@;JeucuuP%L`ReIaZi@d*crNJW9zomn`EKW6cQQ_d z_m61I10e^@{^R;a^gHO&naz#=xz1b5w?3iMmw5hF+YqOpbo56P@_%zmJ`Jx89L8z% z9vs`Sqkbsn;Hlpe{IdDVhQcIvh3D&eif)qM)9CO9Tt}f_=K6Mg4nVh~vSu{D(RB~M zM`;trTc&<2eb}b>Gpxhm8dhJi{vXElRO6@(S%cVi+or~Qx3RIAeC~H!^`pt*v*Ev- zLc9;pjf(rUe-E#l$(b%j4nlt*Tdai7LipwX;eTcF5B0_UFt&z4{vUlS_O?Jf+2Na+ z$*j;$n|t{8Hu&8H!#GD%t?{02!B-l44!Yr~EdGqFZe-T<*;sA2Rn{utV3YQ2wzqNL zTH8J0){iM$#Ush?jn51GY9(@9hxMt#_(*OKFm49$S>$~q56UHe{m+fcNLy*G}eN`c(e`} zFL1w3UeZIGp|A~6-h+HGGOSU@w=3U*d}Ybec=6T7yB}Zcn~%()W7zg_dRzzp*09Z1 zwv5j0$odwKGswN$wecG6vC6d8cz+@fd;0F?KkSf+yZKT09a87(%I|>@mh^J%dXc#X z*{d6m2k~68tp7KjXWhom zAHt-6LjGSqNN&(!82?zWsgXP755UnM&j?M3ALIO9j7B~h_I;OPRJtu5y&UJ0`2ySg z|Mvff{6Br0PGV|!&!Je`Z@v^Q#p@6&D&IT*d`$mWPFk^!dS0lEG`=MEj z-6FQRnLgr6m=p7B^@CU%t;cS+z;^&l9ogh3I7ai&MdY-EG4#=BI`GY6Fj{?{cVWj9 z;dxy9ec0?e2mRtyOni^tzW-eW-17hASZ()Ux9(^rI$rhrUUltZJBQr+@oSH7MyKP% z=`g>oN&i#Xv`+SR&U5+hUii!Z^X{!?&g)>`Z&yw+Tt?>*b z?3vAnz_1H>^8e&q^s%+567R{%$G~}8ZN<9v4)AoN?+J7?uJX6|xA7g-;5*B{%Hz=X z(dHetxP+`GSf`^Ezrvbje1S6gf7pi`^4GA&5*g#sP3l%B`;#VX&~u};#?G6-ps&Low#IY3mEinP`DXAK zn2$1q2S{Xbb({kaal;%tNu-;C`E7c!DPx*h6DZdeo zIWe6@c6j#mgx|0v`mel5n@)5JbI2p=-&U?K!gobVV=y{K*?si7gOBmq#xt8Y^yw1% zT_1dr zlaA81HQn@kme%}V8@tH=i_h86eP-A@73TB&UVXnh9y8$5x5+FveVeU!r0YV*`s}o= z+~I%dJCHYxt!D5M`G4Mx+=N{YFwU-Jt2XHQSayo?p2jo1^ZVri|7DAkhFXKTuyj&3}Tdf{sDg z?r8hM@fbeGvgf1Dd@sy5@oI3a?|LuSYmu=Hdko-vn<-yc`yBr}@#SYB_J+0acsFO5 zv&-<@TfOJ?$-C%R!CRjuAJg#^d|rq13I4sVx_$I#;lCHUs%vYU1$(h~yaztplRI8t zO;9$Ie{PI_SYtPa6MhozLGtIxpFpQ`>*izj6Z@jh+MS_)*fhKw)W~s1@*Q%E9niem zIIh10C{$a9^LV4V##gOoM5idgB{a z*?WAjJ6!r9o!iv-wn-xv&BtR1nmh4)gMH7YySXW%L-=38OiV5GadFfb^Yp4DS_;;rhnfYpL{FUEr(274H z2hP@nVlbBGqk@3{c&uuin@jPt_#+Pu z`(xb`huE_x44a~xPOt0nFt=ncvxV3k*1e*S@D@kQAK(n*q!r%B;c1MA@lcrevjgz{ z)NekJKS)-|H|Y|sgy)aw?o#)V^JA{Vf2ggG@8fg{HoXI$k@`~G%)M@;4~u5UP_*oq z;aC2^-+RM0)v<@zw@~}T)or8h&+r^gZfNti;}?Bu{Xafh+{Ql@e~PvE5_`qx!^LOw z47MrC?`6N&$XSZdmUypY?03Ph4L@16i40|8WaIwsLhXjyPr#Rp`{^ULq+Rjd0)F{_ zHrX1g{tt01AM6Z&u?yZip+AIvv)HAFzS9q>`5-dSg#R%wz9!omL?NfhA46mQD0c|- z;?gp_TBHBA$vv(9xCiZ<@H~JnC6|AO?`DQIrR)OsxF7!`>npzTe3vpZ@*&DEMbFO@ z{T<#@h{w{cCtctU2>Z0jrYmpC&ifSU9)@HWrYuAd?6jcM}DR6EqIU9{t-0iX!{(#3&`o^s5$;j z|JNMy|LlyV){TOm`tEJ`&ZsrMN1Tea(G$v-;&U?SX z9OihkzCD$kc64e@->^P)pt>jMb~U^|<12QBHIw8Zx|=(SFb~R)yPv# zGK}B&aq`xyHNGDgo{^OMXb($5zwrIF=sh@JkPA2Cb*cH{ME#SnZ#VT5v}e1pHqv-6 z;9UIY;b*)@nL|F8nBU^{=$PWYM7!-^?C4!H<34;RFZ?%AdO1upU9)}2D^o|*&Rhv^ zSWAq9fBeio^2KN{KF`znTj#Cl@ppC!_d(wovvRO}4(w0Cnk*5E@H)ZqBzza?yYK1o z1^X>*G7ppSUwp5lLrm_Ka2P*f{Xf5yZT@EL;T`hR()xcivnIyS`E+pHQ|6g01k+nwtpX^7MP3W~T%%frbGyPs? z_m=GUk@AgT7fZt!D-KhaYI`idtifl@gxFUU%bT zU9`v4?60QhHEi%GoIB~Om&H7>wDFu-%q{On`v9GchcNbvhw%Fkdij4?&nx#=F8>en zL)gcV%m2%^^gD~}vC8Urov!arr3ZOQU$z~F$4%nZ>iFLXzx+Szscsu>X23H5?N0RM zw;>13$G|og{@L1v@BbKw1uWtIEv(-p#%^*8S&RLCn{D((F8|NW1LaXL-lv_I8SYtQ z<0E=oeKXsSay}KWMQkD84*P%N3-HJtEf+UpYw=e+US#_at0vQ5>`3myGx((V6ZLOu zd}F-)fy7+B2{HQ#^8bYP05(|8f5?iL z!L=T}x8h5E@O~UWeV3Z^3Vu~Sh9?Z+KaY#v>f531fk%IN)E4T*`Emvsu%?~RvtisG z-(Y{33uC_Mi)I%6-ch#--EMDg!Erh@`hoN|?X5CnSon80-GQK4mn2G`B=3~jdn9lkpmj9Q3 zLASl*1vYs?-M?X80A~*4!+d|BwwI{qzhT|CoIw6L>bIlgCiu@nw~c-|iQEm*t=rt# zvk@J-!p1fXHs1eDjl<|h_S}Jt=`daDkpHJ2(&=+`?`d}e+WBm96>ReV=u6jPb=1-I z%KGYKb=~L@`oZ|f2f?-zKYaj?A+X%1-t&g|LcDIJ#|*S@YI_L&FYqI_Df^(?-m#4D z{}}p5`(3rcFS&;O$D%{%zi1o^QVlv_UiwDSDz-inzpOa>1$ZpvIGB1 z*&$jL4z@{eVxtgWKOlE99M+|?{?6x!1#QqSg1ZY|);$vWf5Bgi_UNtaWg)J$^m`(H z-~FEd2R)4cs2kp6*hZ|$d&4D`WL=dFLc0~2yTP(@QzJi4YJ6#&a{X2Ck8+B-PR{4Z z{a^_93h`#Hr^7M=U0*U^pNOXCI3&w({g3Lb%MO(e)d`&9`PzSXNEnc z@u@I8ShvQZj^BlQzVds#?k4AMxC_`WFz3UX)U}!9n*Su?Yhum|`F|oG3Vl-!QOAB^ zzDTW^#`>+eMZ1u*Ep$Fy`!J@jAom#f7ic3th<|eYr57v?{PW@LApb9JRDV%ZW38*KqIYx>7WIHO5EYw|rN^_$2+zM}_!E8r}sn)9QMgwvS8w($OZq)8UmC`~aAbp&?XHbn zBCG|6oIN44I0=ur>fhue_v4k4%RkF$#`H^K%DL)`vsbZxgn^UO5})1Jvo8kXyuIj4kxL4;`PUzrG7OQn9!5HS7># zlKemI=V(v1{wm(0L%&)hhs)Q4;YsC7U7y?3@UM7Za^@N{N0a?By;owJlN`&HAC3MZ zKGfFv5PDn=+v{TH&1^3g7S}0T$yr=T;0e$2qKDv| zOurN9L+`Q^KJx4Qpt|R{d~hI|5MMfzHyPH$$=Dp$E_4|$u9BOzRDKtl8=D&cKUf;S z`Qz}eS8MFSZN$Q$SFoWzwJ9Ppq1&fzFU(@RE*6iE;ulBZy(MfD;C|ij*|2PFr z!QDaKHF$TXulX%EcPAIHk+qg=YkF+FV*gJjj|$)EYwT~IL1t_CI+EMTA^*=;c5VMp z-WR?f^@lkoy%vwqhhO`>X;ULd5B~`f{k)`+|HpT+$5Zq>T8!g^VLwE;4tqn(S@PMh zYK?b;!h0ZL|4%s#))?+T@tIx7`-?Fq?+kNH@>;ODL;j!Kj&?p?!}$<>$`iEL&qY`( zxDuu&nEY>GbP69j(Dg@nU5PJ04sj&ClYP!)2RPy};?4)`<9?_-h;AP#9|v>D|KDZb zk@WxCxjjsGvx_lWuw8MC{&0}J1d@TADCeQB6-L-j=?Vcy67ulb}FpYhev%`OzSNzAOSQ2>UpE+(`Vc*;sO;3hH z{-3X_-EsK;1J5Ds{D``p;C;~?wHbLOZ0;qZX=vrq>8bSKC&`24{Ls{hsUiQ54^|fT z|19)-Cp4Yi3v{O6S?oC$ZJjRriDM_@c@%lpK$D@$#Id9U8{9;f>H1^aTI1V#MNTKN ztK=6kzb(a=Vl)|J_4RBrcp z3G4P*KYb>bOdh8ny6iN%JxYdqru6JugI_WezJuid`XlUD$zNsrk?b^uoT+H;Vbi1V z<@3>>_}iuQwH}(+@EWb`2jgx{w5K>ecioE4-@#&yAi9HW`lsXgR7-efE87O%nN8M2 z^uuo2EMybUwo7a1`G3gfbMY*^r)ev<%C^QcVe2)GodK|{rcHv^Y4G;YCg}aZ(kS`` z*7oeI52F4x`5nG^mA?Oz^VwpYHu^TZO8G}<`r>6?%W81QtFmjg8AhhHpZGIlx|y!) zu*dcA42Ek0Uf-A(I_jTGwf#lA32467R{kISJ?o}?Ke9Z_j%PW)s1D9#C;c!-Uxl_O z%b(VxLo2rU8=7ClaQT0p!T&kinpa}uHRS)%MDianMvc|~TmO$g#P4RfpLK|h@&4?+ z3Vd`3b8WOfIo-vJz3_WNxx6BJ0M;>R3w5hHudi)Q{Tggx&Pc8@{<_r~-$;mN(eo~4 zu%`GI0cT%WHgNn|n|ZH%?>TtAWjmw{GXNqdU%8>9b{%>U{4 zH~7KM+HHyNK;tCj|F^*yyMEd=-;G+;-52A#OdI)caVFkkTJ|p4!G5FJ>$tkPnNN>E zC;!jM4fj~(^X&GR_FtfX2u)6h^UbGM<8=v|LF9$?|MB>oUAKP#&RCz#cHI))34Y7} zQ}bJhC*?u>;bPcU(e@MgSMqy|^6j;SExSVh@X_Q0a=vhUplu5CJm)LnkpHLV~AU;dkQfyW1Fy!9KjIQ z212fw*VJ#KjeZXI$O-)d&ah@$4#$5O`e45a& z+jxyb-2d2^c|>3RgwNOPdbj%7%9c8Z++|~Y7yHeo`R(}K0Bb+(V&?krtWH)d`X5#2XZU`G#~;zG<=N&B+AW~#?fQ5lKFQwU zzBoQstQ3E8n34>pA$}({-&fT3U~TTeb2~h{t2+$dS#YkwoTGIea6eXGxp!{c7q--L%x<)_o_IT$*U$%GdMAi}7?(O`WzBA{AwWR29JQDSf=yQD#-KYLLxlb!| zzWhIX7v^60w}!#KnsO}NGVQv2xW9oGM|VQ}4CYpk=T*RjRQc#Lth!*@!3 zMgBh(pX15UM`2wk*$BTw)P->}05AHco$;Bh&9QXa(irGU)<`y!1Bd)SyA$mwe2!LU z{Dzz^>q5^9YYm@{>6Nl!I7eaq{~bEtWDGq_p8P*L%=rZN-2%4pWc`Kixw0MTbuQZb z@Do#tf%>m2x!v^jres|PkGUc4uI=G+nBLmUqoQ8Qu7qg@UivfXNOmVY+KNwXnz{eZ z`q1|WJoR%j5TEDJnm6*z+0J~D&M-!Q&;O&l$Ti=lC$T>t40~I0b8GR3nsvVLJ`LME zs1KjQ?RCXgxrPiJXAALdDX(41VDe=_4W{;ycU zUkb8{!+y{I_lNN#y!x|8&~s|N@fkW$BU78O^0hA?KWZu{aTD>`%7w#_5XZj zJU)gQZMI6SvHqVOqK#Ns97v}=WPYWs_1-e@I*9Fi=-WPg;X#;|k}LmDJF{WnVGPFl zApMa3;XMtpz2Rri;o*0_9L=rTd_tDFFRW#UwS;T|Y@aE=8Qm22okrHFcy4Aqt?Ty* zaQ_4S2)rMGeJ8SC5c4+IR{o#=#)rnjc(1nF#r!(t0Ac@6VojyI5`XbJlK(gM81D#| z{J&fqzcba1gPShJHsaVRa2&0@_5XAz9uFw%#7;NCA^%Ue)t3BX8a&2J){WfNmp0xn zDo1O_KSHdHeqaBO*fkrD{{;?q%5TwTvG#A_r!T_(pKLDN;$Ae5Y<#0T(VT_jLXKc87v1T!S54lkAN%96YR&)A!myIcA$P1=mU zKc3=j(FNURo}YCkNB=Zp_?6m!gogjcd%))ixpSJ;8vlh7y=X34*%)|?9lEeX$R7s7 zI-%|!*1XdZ-%Ih5&lcm@gKsDD|A@aQ-SFI>-8{E0jO}oL9G#*4&M?k_Pv2#`)1wP} zt*-73G}Z;nx6qScegVsP=l94nKZo_cEX*tBlQ^vZZ-xH{^cJ&==g^#qW0>~f#x=PpYC@vzVG4*Q!!BtKE7^0t2lC9-Fs)f zeJfNS^f10&px2}1eX89eb+^%}wfQ;2|6(}xV}2%|86R{br-%Bk=*2Gm z_Qrl;UMenD*G^x3WSj>bZX~;><5qNGjtT4k@1yw=whsbcW%{hRQv0>VCRoa8Fm-Uq z|MM^P>6YZ{hvZ&(208Db?g9D@hUI=d*do0Gk6_!|@%4 zt-r%w(CBA8zBaz@!h4SMQW)m_eqY;+KG;+rh5WzhNA7Q~?`FHuH$$~yzmhM7Z%E~E zMPcr`fL;&5bf`LGI=>8tW1Q#fdvjC?XY!^w;S~0ph~IU1%m2f=OnE6>8>1bJW&->V z!uS_9SjK*vI?Pq^`nATpuz5@Ejz)VQ+E2AJf8?vf{sTQ0z&s1au6%MU^5y^8NPDQq z`OW6#AoWA&r*G2T@i~Zpn3GcRJKQgXJt*Z2cvmO?f68BmcZBQ5$dFs4yTE2GF?yWt zYt+0m;rdj^T=jn=*E|*W|Ah7bXu4SNlGu74IzC(;f%kswGs!rZjXxZXy=;5ZZ#BOU z=4<2e+McfR|CrBb`!BU;O}mbGg!X-$^>b=GMz^9pqSkmnG+)eb^+7aOo%}!R%%83M z#qa5}Uih?OJNF{#O?2r`?``ONJ^k1)tpBIq=>z_kuv2(G6es%VdF>WzUt{Nkl!@0N zr;2}H|Idu8a-eo^(fMrc{zT^u=<)aH)=Hvvyywt0cg_Cou*ViS?KGX>wYy^BrX4A0My%ApG@t z*n^hQGZznvz4-tehI^9q6yxq+$}f{QKZ;)dAHF3Joyfl3V48sTFKjoHO?uMnT)6m3 zw3hOLcm#XP|Km-`W7DJ#=a%gKu>8M14VkwTt&!PPSpKk2LKf`xWbL)NO@B9B_b4zw4KNV}k{>Wk}`RCKa`=!a(Z1WJj zPm%Fst?^7X%xUG-`0T7s{-2tAveWSlej)B)Eq8PSt|52ve9LPp{q5ZMhVVsTB=18{JujyXs9;8PzEb{+&9k%3W;k!6dtjz~7 zZO<-y(3ziwZ;Pb6)7@AI`G5HdUO&)vJ$*V~n+3{4-OY5G;?uQ;FbS}HLmC#J|E#Z$=NthPlJVD7y2gs5|&Qz^+zX$G}iwYX}cr&^8cta ze*Msmudn!~SqFW0iu$AQu>Zdt>i2>rjqj)wH?qq#GPi?eCs=2~X}rW+iJhzQhk@!x z*BZ~H{%`$1dt5)YQhps77m^WlxdoQRj<=Oxug~P%;l3q1QrUfMnzM^o9rh4sZ#DVO zB%6|5G-M=HeIlo`7~=vIgNN zR)_!G4zVPOjfr-6o{au8w6KJEHfy1N2HU}%4G_~>sGFs1*QUnzKk_x5o7i|ETXf{3 z+wfnu4n7cvc#^ZL{6FbVZ?U{=i^l*sR)squ_jLS1{x7~H3)t=#<*!)3s*~3r-+r#w zWv{R=uq%A}r@Wi5is8}6WZ+S52Hzg!@c;N)G{$IJHxI2s){}HyU-=09hVbKw=s(tv z9q4(PvWN_GQ1Jzu%KuY%$}P#;zb1By)3fka2iSl; zx8tvDRv6F8aqKi7PJR{Dm90iLz4ID9*s|PFnfyQGT=6=1&nDv@7}~owR~4(mj#pSy zEH1&LZ@uw+Jo%@#tJKYf>~Gw~r@0n43;BP6HaV6}F7X|uONmjS4zkua_D>|=JzugeJwi-5 zn%ypjZB5r7=@WgP+@xKP6?#Yg*~WYmeW3kUj`z`>46}JPzk>YEZ1Jh<+wkh>XaVc@ zuD8O6?W6nPg{{OddqCM>^6$}h8QWZj*ECq}WUs$zdpQ2jD4S9DZY=pd@qdy|5nGA5 z`3CHwpTk;c65VHfXieo}R2Ig1 z@cqr;xe2ZXu0O)}X6LXj-5=h5`VM`$NIlz!cS2J6e`-87)?wxUw)je;RoHpn^nqPQPN>|^|g{r}}SZMUm6zSErC;=C5R^Z7YH zEq8|-){y@v#%r=S+|TRlHuM{=J?!Now);1GJ;A2I7d;0`9%ipKwEs%^iO!#~)oI#3 z==el?ewY0W!xw(vMdsab^ULyabN60t;6WQq? z`b-c5_*#e~hrOnJ(62k5p??nadpf-GiID%tABmZx$XQATY-tblqv){A zbvwMiWye!spX>TBu+P&b4gE#GTiNC*{(Bz2_oFf2l>6#O&-#kld<&N3^1Amt>f(dG zK3t3*hi(VDPT>Prqdmay_S$vA;|TWI8=Zc(Amq7~zB#hi*f*Cp^9g-W&P5mY|960K zHaow^7QJ9=i|!e*c`RG^*YEUAuP2)gvjO;h2m2J5$DvycTTR?}p1eoU@9H>`?nBw- zWp%s5)Gy#7YakqN<8v-t7rNe{F5hylv&|)Rxeq^no5)3qgUNW^0e^fl`sMUK8n(;n z-5Sk7`bYj>cn+WPrSxgP#hJ7R9&N~Yimm%N53jHI|A_h845LR2IB(Jxo^*L>;H}YKTWV5jczM)#-pKoSpSQ5qz8K?!B_Nc1W$RQ z`Lmlo-?#||a+k7mcgH{E$>Lxf)?@Z^eUW1ZJzB%j38oI(w~?Ft#(&S~)tLXX@0E`v zOB^qsRsT5*+v58sTi#91C;U(TpUuJNW$g}QZ!#nazNH8A`D|w1$iJq~gW5fX?#Egq z-Zu8M8VAKr@XP;W_HW!XJ&*TIjvM*K?b_*^VvMn~0lOZD_fd3QE+4oK4Ow}2>;EU3 zWBStdeY~&K521XjcJtWh*xzj=|1aMs|6zI`faYWP#y8n_EhfK@W;FUR20PN1J{fEg z+oi^R$bX_;$>ul3!Tf0^Ir9IkGd)N7Jx$$yY$WbP>%bhw-WBxHPx)`Ke$4K2t+1Ao zH^FugzdfBE`=Hx{%wN#8^c%182y?;?aP5WuK}WN;FfDYBX*ox_k9Fd<^S<8Jmi!`d-l6g*>p0uTOmK53F{#B-OUH`|M+V4W5|U+z5}mS z_?|gF#&%f8h|W^plP%^19n^)~VO@AuVT;#ljWvewJ+&f(`73@t zUb}b6dl3B?c36b&I()+Wzgyz}0o|vw-7{$QVc7o@b%DcJ%!2>XHSftDeaU(f%?WVd zr%y+tZB`e2$($DT#^3LhAII|l#-3~Ay`0U)bCv7UH&%H{vj`sj{elaJYcQ#7x*Zo$5v8H>9(?|`?tEEk^=HY{V;o+)J^ z7OqCWnPe2~JB#ep?_h)X@MrsCra6#Ksr8xY`ntT4JacWdi{oYd_J@h1Le#?8qe-S6JM8`En=|$>R*MDEKvAH81 zTVJtP@)q*0z>|-Lb(!Kz_IO{rLzO+E?#g=O{omjp$uu}S;TQ7%Z}4*e)9~ZD@bJ5I zd-}|G9*l`vTWBotGpKu?PZjN`%9%IR0;Q9kR zrl4yUBL^x!5q%rHABJmtxDxX1|H(rfYC|?VXBX?EmDzcsb|JUSoe!+Z)3x0SzsYnQ zE7sI%jrIRB^hJg~*k?~=*8dCRKTGf(#|GPI+XC;Y_T#^Qq>&g>aa&vagk$rtEX=Pec2V_8+p1Hu?Y9^gD;~ zo6f^?Df$DfUBa64(UPspS^9r8`hINxD=c^G!^g;D`;`46_A6cxC-=eoR=h6~%NF|0 z7MU>}?yKWt@LLGSKOH}l8}73X?bX<`m52Ca{XaajPcDJQn2N7PH>Jt_9NO3Q(PQ-$ z-{3G;<(*x(bG;N?8uVQU}^fR5l)7PV#SL{O?q+A}=c%HrtUAtgo?M{V# zZoTonuHqj0vUzqL`%D%8p5#A&V2Alljd?8F58X&H;ST-{ONhB)Z7}2*<&N$b#psrE;&l!zH={j*9Db44>7fs@d-a+8Kiig%J#6g1hprd9 zt_jl;eRU)I4n(_&wtOm`&sGD;{(+8D@S4B|@~0%F_Y1H!qu;@CjAIC!h)MAt;;{Tb z#k06Z*<1LWqus^$tOv^z_|)lk9$Vd~oPT7VqZG&C@hZK=o5s4@a^?Cl^~^MG?Kj&O z1N7%t!Di^6gY!$cdf=ho^JiV}g>Hm4lWL8)8jWajKT-F72drXyxR(#>6xr=fjXg#| z?_w=D_GXJiwF`O2Kxbnk6T4zMmq*cQ3w$=>PxAk48QZL+9Y0FN*6_Y(I*8oI$ypB; zx@Hg3h26tiO;M{`b1;_wh1W~Q(4%;T_5Z!JJCOaihJC!Yudo$d*$#Z>Jhb=W* zw*(gXfBBNKo!H_jI>4CEtl0w*;)t>l^q3CELFhNbV_nzg?DQ(w^-~^c`!Ou*qG;*@V>~w{vrQQ7t{AG<@8CdxyN_Y`&i}1N`Y@OM<1tjdRzSq^ctftE+wx{ zuMPR*S@>KC8(T&#ea}6CU(5;jxycRAH^az=(Ofh~s5=gC{ZjU)?_b58Bk&qS)}Bim zc|&$GzMr9iCHoG3eo@RvI~>hOeb9o9ZdYDY7GloIa5dE$-wzD$pq1O`$IpVT$wOD% z*3{Tr9f=9CSRQrLM_1v$Dmk#0r=yeqhx?vvzOnQ(d%te1EJfcR{pqedvcWv}&t2&n z`iG6eGnVutzxPnLk@&JZInR@)yvXSHfHD48vB^A4*$Os*8ju)sN^*~ei75f@$_2u zHb;kbrT888S?KyEJ|mY*N0MRvKj*7qFGGBb`ln&P0ImE#TaztcBkQrClXmj|XkX`L zX!Kh=k6t&pZf2KOWN*RFy`6(CcT|1_`)#SNv-ZL7?!lLy@i}x@69%;9hK@_&?_2kN zfO+|!+P8qmc*~8+kU!<(W@G<9A1w|QYp>s}@t=X|hj_2-_(p8m)j1s37!woOcru;! zPht;LCKje^z;JuLabFnr7i8?(h-vSl>7?Cl#@C5xZZ%JZd0GA+*2RqXAfwej4j97LBt!a205vHqWq57+#sCw?0_&!*>kum!$hoOa|7^Xg(AyI!Qo$RG-tb5;(&t8ky z#9HItJmROxP_l+P2m2|{o;P2uN$+#m|{m$Wb@ZpGt(T4Vh` z+S2bS+FeJdq}KRuXSAWR0d(yK!yd}oz_g9_d*M3)k8PE;bUl^Kj;_z=w{6kxrrg-b z^>=Q(ru#cyqT4!-;dq*#%KPa1BYAaavAqoWzx*R@Q)|ro(fRE2k@lzI{~+GWo9v^8 z?N>e{cTMK1pGEg2=zSj`j`3ZrZ-Px{sta>%@TvdeF^}!^Rj_@qUv6&7t#2oAmDBK- zJEg&<2Wr1LK3A~Gamqs;^`^G}hVg0s*yIR(c?0?K|Hk_NRWOhp2mg@QhV{P2KElWF z+f;d5aiR;1ZT)7yEbx7Z59;6K0yGcE@xN8RsMh#aMzIOovUg-ZRQAl`#`lU6ajd+Y zPD5Zn7{(rKA-8M9hCSJI8#?d9Mq+QeF+G3sdnNUw$$5(H2RnCTk5Rq6dxlp>I(!57 zapW4~nH(taicg1OI2nt?zc1M5OxF+Lf4DaLsUIOW8Uy9EuozEiLQWg>d-J97Fo|=y z|Njj>6CKDGIG3N&gf&aP9@ZX0{-3YO22ZFH6B_IPlgSXv@{#&uWo>UFmkp!I_yym&vx)DaS)=Bj z#P5(Vv0oAVSNuqWz8&d@Pt*_n=4f_NcOIP2vRezd?{YmD|HIkpS~B=Rv;o|w=z~ya z&ItEV0e5<`c>NDJml{J4qQB5}6F)u&T@P}`JA&=x2+3*mIv4+YVeX)Py!T z@w^hh-mu;R!yGbCXG1u$G3@vu+bu%3uj^0QkKae~|Dq)OMsmL6PwO`~)`oLqG+9Vb z<389s-vvK8PkEM@Gm9MSjoJG6UC(}ERal2OkXn8S=Jx^;%q{{$tYwDWD8)1Xg6y!SawYoXm529#A0=zo8ou`bcY^f{JSM`h zO!<5Ep`A*Pqt*AtpD(2RC|;-8eV_KX!rLA1o$C~O4R)MF@2l{7 z9DnyrnK)EjgonN@Z#Q-h#Pdb=d=tN$w7UhJ`81h_=OOA&f#)ZEcO_p6`K>q?@u{%x zm$$Dq;#Bzsn*YM&zARrQU?6iC{RY!7Vjud(`{HkGXYCz(Yq!X;j$C0|e)v9r?Sc;e zbTT={a?IyKuG+}sE{EfP%KPBi&(V`DAHnlMbidTR8)J=;UGl47I1OLCl2N{&yK$}Y z{hwk1d#j5+pfi8Z4%T;jun)a6{u~X0=~=q%V4RAfA+7}cA^%S%Y14vUYqHxF;Wtcd zng`#O|7Y;T+pxz$ILBkL)}+#mj6C`rRD9iJ9>Av@83(juy}Cee~D*EjGmy z)V<}*E+M{!wd7d5h~)oCH@bagEjK|*iT_!&9 zy=-N)6WQo)>rcf?JL`iUEb8TC7#dn1Me{t+5j_KTLteoy^J>-le-CjY#ENSDzgqvV*8i*Z z|7!ieTK})s|Ev8!)&8Gq|Ig+1YX48Q|EJpjbERkUy*-1zrC#m-srLU=`+utaKh^%9 zYX48Q|9=bnzU=o3`y{LV|Ms)B_1vY6b>-unAF_w9+W+5pXQA5v@3})8{xMnpSndC> z_WxJ=|EvA~)&Bo#|9`drzuN!bT3&FI9Qt_cOKrXLu#sG0ocB5&k}G_q>}I)SEAK({ zmup|pRPFz-_WxJ!|5oq+R`36QU#s5#?PPAK-v6!M|NU>RdjGe2|F?So*M5cS`#-)H zQ0@P(zW?KU2i5m~JcD`5v#E3J_xIg~>ia*{_kXJI|5!&_}@ZGBF`=8bR|7!n#wg11`|6hIo^H%T3H(OtP z+Z;LA+)#c0v-+6dx`VCx+Il@Be>XufG3Z?f|_WxJ=|EvH1^8QEl|6l&!WUT*P zx!V7x?BG92Mtc9{0r}FvTJ`^5n>SVe|K&e*s{jA8hpqbmuj>E5s{jA0{{O4`|F7!* zf2;rht^WUav_0-m+2d|)vHJgCYpd1&|5pG1TmAoU_5Z)s|NmD1|2xOJ+HQ{O|9`9h z|J{-w_*OzX&sy35>nPjVvoqg0lRJ4PTQ)C=lFa&J?thGxr+>F6{!n{*mbso`FH4j4 zr=Dn^NBfm^$-R_~^*`~|{-5gmpKbkDefaieI*RmBdc$it@?XGa@f`xr-$+aovK zc$w?^yWUZ8&z@1%(jMA((Cw+do$_a@_5VVwN$ej?zh#$>^(dLlmi?Nes9OJz(rW#` zv0tKE|1YZb|7!ieTK})s|Eu-?YW=@j|F72nqxb~*@+i+g!hhIS>;KjIf3^N!t^Zf+ z|JC|`wf-L^&-RMSU2E0)f3^M}MO)URXi9UGUFVrb;yVWRSVtQ=s_*|q<-a}qdD^#s znyT;rglAyowVsz%|Nk2m)%Sm@@BdWa|Ea$JQ+@v@O8a>>*|T>PSO5Q8{r_+E|G(A# zpX&dAqheFvcd7ROM8)Ck(8oPxwf`q7?b|8l*BOM+tt0I;$HjSQe$RS`)(H)H(xYGMJIbIuS9>m@|}vPc+@^Y>zHNd zYX47E?fbs{KFJ{-0|9PqqK2+W+JG!?Ab3qYdOwr?>~ZOFq?CzI46v{jAxY zY|ZW;wJ2X&{r^|>|6lU!>i@r@bVK_hR$Urp-UZBW@T_x^F>{yuja8DUc+B(hRg{nL z&e9)@qjmkR*8i*Z{}S)7&0j9_eT=u&d!8Ikv_H36|F72ntM&hC{l8lOuh##o z_5UauYK}BtMuWWHRK5ROz5iRi|69HPTfP5Vz5g5aj`E+p+qtFttLpoo)%(BhtJBTh zLto*(`Z)U|W_#BAru*sY{okmxS0o;>r11^h>iu79*GF5!uHOHx-v7PQnp|%&;}-rf z$GZ%tH%0l`*5bz4SM^~%N*0MB`?~(LDN20zHd@s;ZcG1T=l|f#@0y})eetDQ|Bv!& z|9@0e>;F-{M^lu(=srFCx8oq=MO$U zuusd_`_y|Q-Frt_KXls|mj@YpM=pu7JB?HSkC&Y%cJJa`<^NUwU*-Q%bb#@5i+QQ~ z{!dg?`F|7-7bh1jiPA6p=f#<|D1OMkM(^)d`M%y7othc{=`bag@~5ui;(I1I)<-l+DnlEuX6P|5W+^3F6FK^03kFnHKt8 z<^NUwf3W<$%KxM6@}*Hy?f;456Rn@LH}7`z?e2Nzl7rkEUS$65qU=LC>q>IhaqjW9 zM>o~nb1}NsOQZNbG+(*z`&@k4U-|v!9^WgBI@@phoqI-WHA$F*s{Fso|LwPoGdavd z{GrPKtNee7*l~qCf1dTEK78UWzOk!#lOFv}MnY*k+vjnvko0r0iz7Yb!SH&&C%t z`R_w^d_?_@Y+LRBulE0scCY(XJxaY>n0MnJqkLEIaX!?s7M0)do8#oU_t&HBjpits z&6iF${;Ku=D*tb?&TzT+9K>)Se=%~93*e^g$@HjlfXUf+I|b5`U) z)%(95{%15|Q)AtKN^y$ER}}fKSiXh&AL(kpK^fZ0|MMGRXw3!_wD(SU z`i`;*=)U%!RD<9d*c8RTHAVRn^i6oZYp?dZ-fx%)k8df*SJ3?q_f%2fg}&IcaZV3` zVL6=JDjS2&yr1vE200mQlzDEFY>Os=wskEZ6$39LpBxX!||hi|C|pia~z6e@Y)D zcXKj&!4l@KkN1p9W%>TvcT>j4!o6oSicjg!c;$Lj>?3#HPXA28<0}2qo;|1WjZ@*$ zCO#M4LvYO|>rFBqq4TaVwOSfQUGeMUn*PbbXz84M1K)*YtZ_H zJy(sM(Qc_WTjD`}bY+wOYk})8`eK~+=hxiBtMh(b^j~`>&teaGUv!u@N8$61apzlj z86QqAtw-q*%GW`E|Kg~a2G3T;-YrY{qPm0m!UoQ3!5zj!&svnNf&b~+-wg9%c#n3lG06XP{jZo>AI8%Fe+@TA;a&j2qE?N6(G4 ze;vOU&}ZzqnX>cs&ENgrYiU%TwKPgMs71vH*Kgr-jNezlwG%!s`rYg}n4J6A^q{)^ z+l!-kD7%*UeZ^kqsQ-$sPGDpEN{d$YsMss~hU@Qe_As9R(G-<$!nXrVZSehwK6EW^ zU@zl2e}G-CC*u<|BVp(Qzi|;gP0n6C;w~7(l9a#4)>iT}^~q)EpCNZk{8opZPe=5MuV0}c7)**Wd&JcVfmuA;#Rg2zW>Ir1^HjG_i9O$ z+(VzIo9s^$+Yj+O=yNYyoxvtsv;PnDd>P*-+4Q$s6wx(&hbkQi+mYlvXN>hxzvG@! z@-4gGNZw6w=Gxs$=e}&Y7XGLEeJV_ciM>P6ut%{S4CkOd3AW{IdOUjsKb;205LokI zcQPgzzweX#3Y+X(;}7`Fg>kjsQTeWZ8jd%=$alndF8ovQyO)hlVt>9`Y^UrM_3Jd5 z``}uI-*%I>4@Sn0BKJ1unso%cTb~Chxz}O!~<0{$9@e;Z= zu#94p&*^iN_WUyu1EVE$TzhGhucA!{zYlh_rPpfCGxd{spu{)C#iTdezDpJ#iN0lv z|FQ1|{E0r{d42IE*;mqkPx5Z7*++=yJaLI{CopC2!rFuE!tdSSdzH<$qIYZdQCE%= zZzpRX`n4sR0?m7L^8Np00RDaGzH1Ssi(#*+U)%TpjfYs=k0#cm>=Eaq#H^F>+#T(4 zYX@|7|HUIN2z^On=ZRYUTT%##W;LVtk6T z(XNh%zAs?QN_@`KXRX;loXpQ6cad^)T@q}v9saMe-8IInu~h2&WFZ;yl1zLr#nf^{ zJ<1Dx(wDp+`GYw<>CaBnYu+(I%dXi0>W;;4GCuk-KabrvatzUaZTs$iVblJwe2drD z+ALSsnJif2(_ns;UE4d4rI&S~=srBm7x{LzD0>)9JNqQM@za0n_s-}>qPv*RZQS>6 zizj=HeZp8n-!wWv51e*RQWGFNN_lm1DTvC$uD zQObu({hnU}_c4x_>3sqE(PTcapYDeDURavwAYLXT{hkchw&>QQXYhpx_FG~3nXS6( z=QG)9kNS%Low?oIJr|xk$%8ZR?tCx$qsiD?-0OtLVRY1giMg+wOQ!J@;~7n?$qiuA zPuU&hJwU(fom(0sJH!1E8E~dyeBXd}7kxjNEgy&VIrVf+#m9zizcuDkW#T|Qf~;rR z<$J%oYr7Zz9kt)daV6a<+iJQ@?^nQ^Y#Mx*S z{O^S0Hf8kB|K#@@t4V2#4q@ZoW9`8`FnU7d$IUi z%!7?TWcL3g@7JR83-XG%huEF)yKEQy z=8!Y69wl=8=ux@QpXoHdIf|b|_lf#L$WWKg#OEZ}J@MtwVeZZQ1YMRyvAH}Q3g1-v zjKb?`bXSvUoQ8Xp^j3PW$p$Mc8>Q_8V~P!n9ko}M{zzYAK0k$w2}`29g?5u%&w~H$ zP=@X`V`DJcgZ0~2=$qjZSE3L9A4~TEZ8fp=0X#@iKt${XG>BcnhA8D8q9BU(*}KNB z*t>#g=tYVGf;5Ss(yX9>z`ewZVnOWPD0Y2f_u0SS9KOZMN;0#{fA86Q&t#Hwf%!vY zF^*4uAp1Jwe|)DXSqJS1yonecsdT#dMJ4(m^Ag<^%iIb=D?(PW)n7bU-u zv6w%e#hbx12K{5?ZSG#(3VT=Czn!XW)!*sCU0%i3lk|zvQXc1gmTahow6uO6NB0f< z&|IyXM#jnX@LhJc*jNJ3WIS)-hdE8iu>Q%m=BI7R2y2Ri_ye9ejP2!gy=MKt0^eh> zeL$WX8p-Xj{*S-f-{1Fw7pD9adg0IIYvKRxjx#*>)>+TNB7d`!(U>oyZe;xAdX2f- zc;?@@o&i%$P4&4Uu7hJIGQY-m6Ff`dd<)%RSbNbii0^(EYmLadkiKbf9*xHl+N06@ zd_B5L$qhbgMfb5wtV@iq@4(|J>=ozbL9W~A-;BJ@bnJ$%0eKg(eLCHTxexxCR}&Rt zB9~X?FKX3+oxC4}HTa^V{`D$RvbS8i5Z^+0KV;Xf@W{QqufFx@n&CVaf8_dzPJBw= z%jn0jdlz`mV2j#V9B5uTAFl1u%eU+u{_DvX{a}&v<;(nDIJ&}gKR^Gc&f4Ex&=3FX z_`jh4BJFGHtovZD$gvO`2e|IWrd9lQk+HF^E72z%$Zm}GGkrarZznJ0gxE-iX?qvV zP&RHz=17=V&~ZCIUcyf;(Ctc22l~6?Ri|P;k2iK*57r5A?u34s{Ex{|2U7VH>PE6i zPToPzaqN)4<@5CIUa_Xuc8k8F;H5V`nQnjoKlzxfm+cKK3--yw{`lIFy+6K?=X@D` z3XA$!ijgwMw*wi*IgZSq?fCVe8haqFSM;PE+f#s!cO%r{zl&YLFSfp*N5HuKkNmSwQLz8F4z+MA3t0Z zWvBCZJ+gl0zgP7?rLP_xAzsvt;v6=eK>zb>HkYKHdEy3mCz5adpX8M&o&&?7#&BEu z&WAIl>l%9cz@=W~7aNaDt;Mf|@f(c+MJi1U9rAVBR?VQMLG}SvscKQ zOJ`$v-l?hnO`>?UHuGfh2;QmWPbSlNlc%&JKUj;rj787;HQ?Z&BM7Ei{_zOhHv9# zQPhAuu@)T~E;{ZPXm5i78><~2X(7avs9>z4J}Rz6ILp za30FPPs!g+@bO8a?qm^J1>Swpzh&JSaBpfXU(jd$pUUCb+A;YTUgMem!oSx4S#Q^! z$g%#h zue=eCvFvOn9x}cjj^<45VlJ+qM5)?c7?(apA3h!GrQE?W#J=$Uz&kyZiv|?Z{Af%5z|Ug*_Lc8SnZ>cG(}O z?u&F}gIq2~@p0hq3RlZYlw9vR#KmM7BeHgZ{e1GwJ7q%mM(lVP=JDu5&FetUgYaBR z$3yB@3)kkC@IJ5n2j&4wtNE0Pxni6?^G>mlUyNf||0ma@4eS37Z2p3djQkH_m7CE% z;(u4Z6esBm>}6}Z6MwXE{t50=@yurDP~-gq`mgb=k3ZntjQ;(c`-yMynr}k(499FZ z@rQl4=qvH8&LyqgXU<2~Md<{%-gW(v^F3_)49`jQiRt`lW3oP77dkJp-?1%BYD__I z)RND7ka+^$t?hG7hvhS|5W!Km)H;e^|7GvYx+oe&-gL4<-o49@pWrd#6efqjF z8bbC!zJIi~>f`b*@;-v$=e06ov0mQ6cJWXQfb}rCK4-@O?dPG}5{{kgqU;{F|Fk$t zPj|fySzF?VCD|S3OVB)JjGDmn1Nl?MLnr#@)LOTa=@~WpMBmqBh=p{-QhPh_UW(uP zKiZs3u~Ys-?izYmiPvq(RFlFuhv&|)UdiS<_d%zANB-_faSPk0!0}uq%KpnQ2k2L$ z@@cM*g}p5wEq6cDxQ85jV@Z_DtN3R9Q{fq*-*p2fgH8Ncl3$wZ!a5*g zPogdVN8b!IDZZ1~(TLm$_{Bu=9*kq%tK*UQ&*e&7U*A&n+mq!Pwy^$>?{@to8?G_t z*0AMzXotb%|2TRwN}yX))taPQzpHu7tZHn~>&UTC!Co#^NSU&R=Ycix>1 zzmR`hrMlkFt*30^qy_J<$Ekv%4zCqsN3W9jetds z4EqV`#r(e)ImRz}SUlc={vA3WVcP+YAIMRovX;*4;yakW5GQ}5y#n8U^7%d2i^x?E zi`~U&YyJy+RgZS6zGn*0>|u|;?9X=Nl@#XC8`Y9o+Q-s=JiAU}t9XwOBx8;CFOBtO zaDU>?njOiK=gHah*0J|h{<%eaFE|I2&o{}Y>`2L-iqBk=9ZrrpCNiI= zS5%^yZ^Ltc+6vEh>g8}_vAy|Ws=9cS_GFp$DcL)qP1xCv+)z(Xg->2Yhq0xL_L(qD zK=&HD-^IX=ayyLON43>8dD0Ny5#|7MP_bBiyeUUQEyr&3${m?vFOqg6`IBy&UafHeUHV+IotIzI4mE=ndzBzBA!_kjx|DvfmqD$rn#M z#BkUjD2!=&9QsqNA^z2FOyhmnVc#x!P96LLPV`X?+3V8r4!%$mM&r4Q{Q2Y#`V8Vm9_hdJ;`~EO!9NFAIXJm!#dBju#Y9D4Z9Xws~qI~ikL93g!M>f z?#a~NVt<(Ac>V%>yTP)W>|S_bFV%psZ;_b`;*Z#5{h!X$f0p$>48d>7zHr`-CiwDo z^5k21Hx~9>LcNIkz!Dkz-Hr8WHTDEyT)?Iy;qk7lx-Y-ZvZ&mNPI(cD*J4wCZ3@q3 z^xO9=VJaRFs|S+%5t(n|ABFxkvg@H)P7ZscUHE7Va>M@r!|0a6a*weIaakcR+?&Vp z%(LikWIgX*Y{%=!r(5aWxDv(t)mHcG^W|(jiLE)`{Yv(Da!0CNQ~CV?v=714oG&kd zLG8`#|CBet)z$SdV}320#8mXFF`%;y`lrBpBAMbjF@9nHzx)KwC3K3h;?)}ee=SV@ z{!jKSTL$U-PFqUOLgR5e3`6-j?YcJhx7Lp*Iv9>eD^V8K|GUvYp;G;(Hsoh`KF+px zKM|dAN$ZT+HhlLDpKJ;HO8V5{>_{|xkRM9lL5>U1u`d|~R|7haHg*TGTU;hf@NPy| z#ICJepBZ$(yNN#Q#>6;9;x#pICja46W0sH6w+4M9wATM&?T+1G*vxj3IJQkmvFV7>tKR)r8u{)Vo@yrMBw)&c}pU&`{ zRM@`_I^y1R4kx!KoMJAoxAy=4ip@n~&n-F?ZGF7cU|+8P6Y_fT3HHa4jZ*+>}WYW$bDnvQ34F>1bx#9J|t+*Za!?TPI_jDVvfn)Q}>w}+3v;`h{xYxFJ04^MV7JZ;$hqVb+<9{7v? zW$b$hCRoY~;b=v7H~G_so^g0en9gALyRP*W_wmgo4)alb2^{yZZxg<=|6j$}(fFua z$zVEfL%#>V#B916CRoE7s8r_@>;Lpp{pwfQ4UUVnFQ8{KS?9uVF!>L{V6Mx5v51Y_^)70X5!N!!#0qTX{c8j6V+R z%lcc>(;Dp#&cC8L5vIv(9Kk2glKru^#^l$K-;B;gdtdaO$=aCgFvmZDm(R+++6M3+ zUq;($>t`H}(f=Ahyo2|B{+vbc=X9KiwsD;~pD)zh{1W52${J?-I?wQG&}T4zqR!Em zcGQ1@{r2Gh5Zm&*^n4u6rvEE8-@~WZqM03hqwO>H^Hn4^i%^G7qvtO%)sNo(^eu%) zt&PSR6ZJn^jplwd_tSMN*~Yf)OU5DWewp2TUESku;d&?XXOr7W?1-uGUMt-PKMdK{ ze080^-^BX&aQ^LnB6{PH&!~;ckf&k&{{dfo!8hyijrd8_ppc8X^?%rRN~YlXh+Uu2 z_j9eaFxrh^dx=l3!P^P#!|b~W|J&%SZ<3*8%prd{{oiVDi~e;wr^46~wq2ZG*8dcF zN6@j-KIAJkzGXlw$5ZvFkS|4l`~&zYV4UE(8yn0`$&vhJEg9z9cyIF7$gwF0%9Bt1Hm6wP*)p4|H7vubMd?&fVy0fbLEh*K&En@FHJ)quVj_7{ z;0foCU|T@9aSY!vgj_8*aBp7Ak8%H|xcLF?<@|7tJo{7oBG~TGZr>%@6OQBM=x?2? z`|;`K>_3>^{*@>>hpczx+8OlTPd@$Oy+v3DC2R2S!p`qt_bizn0sDvAht!H`@v*(S zR7cj%Wbt9%j*r}j^<6fc4ZX-7PPcrE+mLgNYc{3b^c{rHcW}iebX*@1YHdt@f>%gYX-eXxbFb}EPj~c{8~i~5u-PfmFfS0 zp1ts`gMW~k$FE^cTef2N2v{D6aR7hF-|)UC8HDaDm=|~#^ai{y8MB;>!_ZCBz79LB z|Kls*joojMJBlr9(2vyiJRa+Z z;xK%F&~>`&_14OdpQ*JchF?u9LO$PKvG2{cMrf`jXPWU|K_(v;3;1L_Um4%9pBcXY zDdkn(9ZxTIi0z;+KF#5Klj{4bJr-N1kmb3v6f4mcWVXYLE>Q!M2lPE&6J;0kmztOD z28Y^^Zm3S%--@oo(*yp8;q3rxY|dtL*#9roqjCy))6s7VU+~E`j;++=lFW(n?@(i4 z+{&l%4s)!6?Hlquvlc&*8M9?4a;*QO2l@L6K3ht6cXEQB=ja!&saPrhpkr~st1nWk z_&wdaQhh$jPUM4U#n~|Ns&=NeWDccoxY(Eq!=voACMv_a>JoPHQT~njW}p}n59O`K zxVIP@z$f+9fU_&+P&5{ez=sdj=MJvb(b!`oQG^Klv z_O@)0YY~0P4q|F|erg5#hWsan^6>n&Gi>~rEh2v|T&?7;yvw#DN9~T**H2#YjMzSq zZ~tM(>&E6tx<7{@#K>oKG(^+Vn9jtrSo=@p-NJrrf%INu!!P+tW4#3%jwioP-x*{* zjh8LaO1wLg^&35Mp$z+##wI=u?I!pi=ciiZ+I(5{-F$pP#W!$86um%iPcp*#-!ol& zK3Sv5S%`j}rT+dSEL~u={*U`I}B!V zUCz_Kj`cqu$JR&56|2 zSPd+jku?Wyd63=67P!OvwyY`o)16B)*5xbpJD**NGI;Z)WSWCB`mmW1_XdeT|i`GGWT-`tZtRg3C#V_2w z;jQmpzE#(8i^8?svi{H2#&lgZuPw|UvHLbY_!`!0VK#qft;DF<4mGT7h0na0wI@&B zWaiCu4E!U=t<$#}ZF~6kho_!+H)K%ZfrH|^{CbT;@V)K>gV)vPQF;*Ji zuzyy5%D!oiuic;OzEPe3*WH+ec(_!pI??wZyK4JgOnlGJAy@Wg`-WtVmTPyh<7r0& z{rphQCi^o!zq`(J8M?)6I@|S+`o1HxsY6U>skV*SCMHws|KwG4#wyOqQUmf@K2zhu zx<2!sASEm8zePRS?b$aLAK3|bH)fYO2y43Rc6OeGcN4nkD9s)DHhgsp8nrK9$=|;_ zCcwCxV+I^2)<%i-fA$t!U-MrRIuo?=C%g~Jl$6OJ-SH0xGW!n>sT@__g%#P&bMiQ5WcVJ z9PNAxADoHjp&D@y^AhqefYrR5f5EqMJQfF$^>x;aeAnr%b>1C_1?Tc4I>cbf@97}+ z9F6{viuXP4w`9jErY0VYF?fQO7r>U@){Zm*+%AzbIuwS#=E;kOfv*P(LdZta`FcsQAT;Xj*x zb-z5>n2Cd|w=oIy-Qj*8hHc3Ho!syE&N@{DoTTHL?MmR0D-qdA2SW@`V=*)vIc<+3R50n?#;{Q(;; zB>#9v1=f(0kHdI7o9DA#d_?!~%v zE`p~%y2kuDjtv*FYg@W*g6{~iQj*ya?<2MLtI0Xg{q<;{r9+Jg&(ziZSa`FMFrP}U z^?&jjSz#SGwZ?w7HQ2g%?;w-^Q+1#)PsbDKSxDY_>{s)$)?{7~h8@(WZ1YCvz)@9LheVYmE85YehYU=V5g0$zDMFuImr< z{p7p}{Tn)m{eL-Ir~&B=aVPF$^F-MHPsLPrhFJN>*}5dGz0yC~JP6jf;@e;N)Vu5% zHp|uGgqoT%-TFU#kC`q&y9-?d<@&k!PpMOv_+~U47`AjmN4}RybXWVziW3MvW9pCqI zPHtq6saJ#9bPk-Y9FM}Fc7*kR-j`0fTeL6iA>us%7T^D;BgD(;=*HIZpZ1;EcOsdU zO7+{SXdpkF0MnlQ9md=GKm0x`-=E#aDmE_V4Sc>e9oLXQT%Wip=hN3PiE^03nmiTz zNr=16*kL@1XUP4~b$h;SB8MjM@d4VzQ$Eu5JEX${OL9)<5B?4I#Oh+{{a3ORnP;>2XZMfc z`&a+Y`d_5GKg@T9T0!;_a(mQxw;?voBZWDpRR0R!|0nI_=IiL&uyY~0W6_0Y`S$Mj zs#s4fsm|^BJne_mbH1_OHsmuK7l_q{e9%R%+zsosWS&KK4}NMdhPH=Ey(`3Pcn-|p z!W*;aS+d|MSHjj8%?!9&xNa;)%$JFpUEYlE`WkaB`VZ9G9ntlszaBXm`d^HX^?z75 zL>*u~q7tR&k^3n9E6D0sXI^oZQ-%012R?3I#H(JXVmMx|roZT*KVQ$id<%X{!n`mP z&3u@LurbuNUFm%v_Q^1R1rwjg_Wz>_ztL5!tczl?mHJ&=c)wZIb0MBFpKbNwsIdl2Lt#m@8et1ZPPfsVc~cXtZD;up0bpF_qXeD|XFf99mu(K*mq z9#vx>&RB{4u+Nfh?YtSxkI;VsJJp_~3A+6p@+aP{X6-i|5&ci${S?+obneVY55sYU zu~8@UH}HQCUqd`w@yT@hc<0#L2MdDR!dla)*hji_tp34?|YxHhrUtx9wO&!*luI{nS5|D9U)g* zS9}kM=Q@746Xws2`83z!AiIX2Blgw9Gm@OlbMHhrj>hvjoUP%rCeO}w^rUkFo^2gu zmvSucOzuAT*_!Vm&!>>F55MtWHbsBP-wT#i=d|#9#&SRR)19w$KHc#$+j_!CZob<6 z9ma57I;~a0^JZcl65fl)>U{A=@GA_jk{fJ$jJ<2{Yfl?hyzdeR3-p-_(lAcGfhg3e z=mBjL`FaLiY;- z;`<-|gCDPcr<_j0KNc3xt%YEeZrteK-#_qhmvmA(Dby)w$mzkT`pPbCb56Hj7^)YZA2+R90 zE`p1mib506|4&u!s7Xs%ut>O#aX#W*&pALUfG8{@1#J-gRL<(K?%9Ny>H5^_-- zg>My-$!N|uZX3dM0lq!tz&q&WN4Cfq9Zb%7`iw;;2FtD3IFQUCIpoUyYCYlqLhMHS!v2Ku zxSD?-tXS{Mt@e2C!ZX$RbH3OC*7abxi5=(DxeBHR^vU^rD}77oX~|dWd3g(Y`=M** zu-1vgyfYg1Z>{58$KCKOMKht!zK{A5;%H0PC*fZy9_s1uVJr@UMQmm-@yGtKe9Oks z_*TPVoJ#N5i-+7lO8*b|&#aBo6WBHlkGh)86sJv{jYC|rQyzppwX{1ug*}x$@&5h) zW8Q&YW0qcA@q2Uf7wPNA$1UWsT*}xShwpz@xbBQ*Bm4hT){a{kkNj!vORWD-a}8?| z_Ed(_(;fD$>7D?G^?$rG+3nCg!7pry!*fpXL0|Gmu=gr<%@dF7CcY0uqb9|dvRnRC z*JYFFp)2hFhu@9ljmR{=<>J5Ohin2H?j!dQepm(nD)NKfN07CQ?bglFRd}yq-+0Gk zORMXl#C%sY(JuDV*>X2WE2gVs)f?U0zL7qbzEpn?vWL+(#{19B*m@<}U+V1H;`>9t zx|@GiQ~gGxx?lDqo6NmokD**F&Q5b2j<1$4n!>+pSKo`E-;TaHaGV?L;`cqs+>h*H z|LXi2-Nz2~JwF$oZH)aII2Or|2I7BHxpKF@>tQ&B9Uaje*JbT~^f*|brT=8I-lwAt zKjq@^aK}nA@ML57YPH(GIgIaVKZPCr@%4t~PX7K?UbcaEfVRfyZ-@7HG_Y6qO5|&Z z{V3$Q9ICEg`{3J#FCNl96wj;twE?@wYWo1jN7Z!C6{WEc-%&+V9qL}ONE{3`UJJzy z+N`0v)|M~cgMAu&pTgIRoz_OtX6Rpl<7GC*npWuhIm_GfUE{OL{h!X}=j1zlYEaY= zul0YrDZS^xwXe8pr|ngIO~L`Eyb0fp#1s6TiI7_lYHQ@aRjv8J*sW8ycE9{iZBLPX z41MP2=m+@aWG0v5^U<|s!;NGQ;``Nj59FhTzb6x|?Z zGVQ(Us_!(y{(l&&cu(VUIk}DSwxwgH{yq5kMz%aIuGG-HAU{XH8@(Yf<#g6WjJ^%q zkB*3L`>Wx5*f4iy-cRM$YS9eWP4TSe1MwOM-);zl`W^N*8kC6#pbY@>U+YR-RVd)mymZMJsJKFD&Ds{ z*5`xzY`O*CHt2`b&7S=Gn(E&TDQ4+AtWI6(7)6_qJDRLntHSqV>?+LB@7473}(2uJL8k5$36UXbfX9ki5vZo!Epg{ao8! z{4Tzu+4NZxERxHw`Ekz2c3Jy(0@~m`kzX!gm$4}(YBztxbIE3Bd_4N2 zUH<_?0<-mh){y)$^fXYX__+F>=^C|n8JoMZ;b(lk>2)8A+vuX&CA&^urf%cej0~|*?&)movUbM1 zPw)d>-C;I{#hrE4eX#6TG3q7JV^VB|CgP6nA3YLiwfhB^{-vK|9=|3Gud!xUG+Cq>Ery{ zlb*-W^niNyW8d#~17WtuD&XaNMG=9*l{;&c=S2`-Pq9cWo?_efT+ydp+{I zIuD^^BCL;)JBW_Y*dQ0W6O3xwMH zmi0~-eAdu~F-RKYdzw!U#5=I2T37SsbnM8Uc8=@#fvwRnGUP{cviacy`mAxYCya~z z=XhuM`_Xrp@w)@AkMMk06Q#?@JBR$K__x-MzX92v~QGRa*m)}ffN1_pb zaR>Y(9coI5hj;_NV?(j2@%{|o95%G%tGCEiKl8!(UxN8t^1ikfUm!*8lNr zK6n|Hjh3$coz78YjnRK<#cz1T_}_HMuk;Cg;hL@GHkIoC5mSACQ?Pkg{%O?3Z^-Do zQk>k*h6(r|hHW$%kI8jo9GyqDedu&Je{?42D)U$PhU_>zKN(l~nC^panm%nMPJl*Ico-Exls7?2qmW_B{_%Bfk3@9Zcn;u&j^9x-RMG{#5#Qfx{T({F%u0 zw597Fa34tDVziUcZ6Hq~z6iXhkhP*q^>-(+?*;N6WHp6Btd!S>|AY=a`ik`vKnambNl&j_0S#{O_<0mfY|Lt+liLi+Om~X@0 zSJH{iYFRcOrn|-a-s~`sh4-@ISuuWATx_=$aq?Tiby21IH;qc;6nshIhfo5R~Idq~l;_0|{N31PZIz0_@VmdH zDIX0aOWuVwXiRSS+fTVUD1B7UM{>;fk!jAJYmLqEu(#%~R&;NJe*(Er!F`Ip57ET< zFQDUe$4dHop&tp?3gfhc7+DIZaVXT#uumH1?Sjp@aVAL{m2ISAj*I%Fir?A|}^$4<7!*vJW&zIwU^)+)$D(`w^Cos|JMIu&nY&R(RHxSL*I|xFS=jD?^pA4 zH}{*P*&mh+z5B4Q7==0hF>QPn_UDpUmR8^GB(2FEg#RG&-lOYP{a-teW}E!a&mqqk zN43VGf$Ov3I@H{_i?KS;IMqjg61_)|Bah6o$vN zo#*=dT7JW`72mYiCJ*Ah@C|ad|6jbM?a7G9JP|o7}zWHRmNC@s00) zlK1p|%dUp(?_~a%Wz1mAw^LtsLpzBLk>f))1*{wMqj@PAFZRxI7US7;dafkf+*f{M z{c#f+x5Kg;w!g{Rt5W^DGWp%EFLdmR=L!8Y(aDGCOY`=_{CSn@d&n9_*7a=SFMziA5l zhS7h?S;FpaVqg=;2Yj32d7F*bv3(1^Z-i$6`H!35`jB%Zdv|7w`J(!KyE%K?k?}aX zU)Xbz^X_yWgwEP4?16>ve`5I;?V&B?+lY#JQ2X_4kf-5!ChVQ2awodXnSX*UNl(Wt zdcNYTY4F9aC(se%Mervfd=;HnQh9F2VmWI_rc|PL*x-n>W)Z==hp{Cd0P9 zd|N}_Dt+_ZKTz=vADZ)F`jYHV@hza|8vWy7TBzNepNoaCkC64TXZRpJd{MTli<0x5 z&(*gNnuUDV49#`w(3{?o-HHEtHiqxkLj5`lE@NMw;`#;l^+zxMikWmA;aILuUgz79 zU*W$V&M&Y}-lx6j*x5Wj$MvIleil2{|LMN;pU59w)!1%q*#)Nd`sIIi6rb4B%I>f6 zUX5&Pw&XH2r@Gz-T^}-jptqI&iLRSjkBjlJCy|+ZlUlKK3>$ue`v&pyynB9)&tqez z-I^e7%a&d796{f0env7#1O~e}{2TzgvQ*{DR*% zbU%vx=U}-KPgA_|D7*{E+K_j-+Wiq+pBuZv(GuRX#K!;F=$oYSBJ2Ns(2gVTeZ2fz z9dGs(C5(^jyNsqJj2o5{Pr*T9r%KOlRoaBFt^LY z$ofAGW7dQXe;bQ~oJZ7I)6ns#^WYlm8M24q-GL8>YAa!y$Txk_Y{)-*;Ja7cRp@%1 zKTda_jEmX|ZxA-WFu7g6VR+*T5mhvK9FE*Dh{@AHz3^(eSlL zdV;zjUXyLq&V~H$xwE*D{q0~m7R^|^@-b`1mM|8^J{_-3OvG|KUM?rX{?>7H{bTNY zkWHQW`spRrzq=CiRk{iOkmvW4CmzC>l?@%%J;{4yZtf5p)jj{vKDpK&xbgUh9Ba<3 z89ucmy^DVv`3CzTGzFf|ed{2{lLO!w#r6=d_7{_XVf_pJ5`6W=)NN!1{MIq)po%e; zThAG%>E`}T$hw-pMlZ8o!LJU)C-UXX^os9bWAZB-FXNA{{6TXj+=D~13{|qDZTs~2+ zLcNHeMSqqtsiVW1yt<~JEiUe%>t=J{PWaS{Vko`6DxN*r_q+K2n(R)FEAg8%(w_K@ zWA%6K9q5!3#ZKgoAnP`|E zU+_nHy)n8p;KR2O`77(J0pV^TkNc2)Aij=8R4#|@(2C~*-vVuF4n0@jB=R0bznS`a zB42E!zZYzy(GG;k^J#Q1-%ZuF2R!n%_|{n6jIRlQY#|={SE~CVMOS_1!_43RDQBR0 z1is7RJen*ykxV5YhVn}~>hrJnTH)Pmav|S5fe%ku|Cb}^6bI35VssKazLhWc(P1tL zHpaclIWO2{%;bFB7?u!UM~aa-72m4C>vNcE%H1Z zS^t-GhyC*CZ1;oNzaM+Mk$FOpYy9fzpKJa9Cz^(E-Ad0D^qv7vE7-gGeL~PPk=!qg z?QxarS|)Fb{~R%QGwko+L!Zoqvjv*nwT*{S4i;i9m+R>i{HLSai+={Vj>wtDhURqa zCdV#g`%$oTrt3lN^U1pi|HayNab8rZu4&Wn`L90SkUML%<>KX6b)`4F8w?JK+g&ZLABio6((%&ty70Gu7s+;cssIPoh`-iXJuB1+4e;K|{1~rVrrj zqR(8Knt!6^V)QL~aVNF4gSK(#<$LlD{MHGndKBJ~q)+k5G5Fe( zIiphj+w&ow)46KOG&p9m;}`ArVxs01e_K`CWHtxvVmtdtT%AeYvE-|3`Qn=DyMbsf z8^vuH`>Ye(H}J{FX1U8=twFV*1^reZhp za} zbnVyRH7?b)`L6g5)BZBs#cyof(l@PX9>P~g_wU;6pA|Le?ZcKoSodzr9`eK5tL)46 ze)xJBTXiFu2dlah^~Nja%7f6|Z9Lv{?ymhd_`*Kco7z5*-|HBc#dM}*eoo%W#_An> zllZ1NACVoN<+5Xpd!lVubaFV<{OB}x$i;F?b{?&rU16>)c80ZL?KqUat>_xJ%zJk9 zC&@#$#s`rX@QbPNj9s>?^$bNO8Oc%FgM7J>)f1n8JI0gMPM`I9xwH09*y-E1@VntO z#7RWYSeV&VUP1OIaNSStl`yp@Z#I8^=KKSk#=W{vo3nolvW_+{T_$%=Mn8(L-__Qs zvi5HPWoXxEH%~;yw0O=nJIaRe{zVpjX~?nu=%Zz8e^b~(9a^oOeW`acY3}<<_GDr; zyNCP^Xz`|R)_C_o{y_33v(3207igPIuG}cPU?5wcyzsB-# zdbUFM0okL)!QS|1$m0R}YK`wqz6|lArsdZfYx8Cn)&wu(3FDA;u~rht){s~pRHgLMQfU176kD?Q`J^1TduoZI1% zAIW_%-e)Y`D0VrK`ExL~kyB!yasSR*z@lpC$g+z_|mOX6$>0-_?`i z5%-PB+qcHMaQY90<#s%G@rhV0_%M1L-Whn!p~)-ows1en{l+kKrt4U|awpoCyf@&x zkezHy_$m6h;`s+Y-~WU?l_dBveEansf9>kGAhY!!2J096&S%xkqJu@_Mv;DKLM8gegE?ojHm1O{eRKjyPEUinFxEp zFo}G%F;l0C-sF#{^Ia8RkA`cZu^XptQ~DpI=M%mX+xeDk_bxNNLH`gw+J#@ACc_s6 znei-*U#T9Z9oYFRJd?|*kg9rdA0$Js0Cqy~Kf)3lCJe!9NP z_o@Yj>Gw3C|WTUz8@&x<);yHww9g-=zoRrL;3TF+SOa% z#*Vx2hq-Nm>v!ot8@4g(kTqah1Ir4290&LBXhx&4-%xJ3r27A$q_62~i$Bo*L`Qo% z;R^nauc&zUUhy86y}j^v=J(C$KUSOlg|LSZ)|AP^>{+T!U5|!ovqxNxL)%qbKeEL^ ze2rrT`xd|^pR;f1+Sj0kqcwZZ)4#-Zz&u_5Dn7nk+uuv8?*OxbWT)yGzvbS2Mk`=# zi0)qg33d5t@-}m9z;`Rz^GT)pO?&)%sPpuzFX1;Wr5KDted-V6Q|LmD)gxyU_WeQT z;m!w?N9OB<3k zkB^6ubuC$)D%HKyFz1%J_Q_<6&!{DTvnR}1nHb4;fkRA%eeMK~)L2D9|3Z9&$tua} zgHBu(hu~SC+*Ww>XTOQRb@}!qIoNkC?kqJfgT!4=*gDpE_w{)7|G$d6k=F&^mTb5j z2H%_JTf47AHx%y)bnl2}cR1do>lnKCAnRVbThjS0AKVUq7@srMhll8>$9L*P6mloT z<{gfI*b;Jk3AvxpzXe~daj1>ihuW_ZlOxd_K+nQ}gG|@)b@WZ4i_FY8XS+E+#~1IB zJrh)_0h=b>=FFav^`T({eMBSuibA2%K&=*L*{Mzo^pQy+@0{uC39Cf^#D81 zCG&mpJOK^dY?Ue-cjlRc=DAI-U9+D(lX!uG)9yua$V&8c%d= zASXV>!;Z2EUtb6B0Wh3SM*(kWrz^RZp0Fl=g^qWv55wN{&m%DLp21M=h0tOiL$DmFs94jKHHo}gWfWCQRG*KgfWnqQ;(d~hgya;dsU^%9?sFlU^qozKF2 z6>=`Nt|@LNvoT$vt{m)oI~d3?*3pOW#Y6f!-lJU0 zn zcbDYvM;1HsW&C^yT^I1#R9NTZwKk8g!aI_Vx*B5$dvooF;gyfka&q{o`pw}{cpK;! z|3x#$A~FY&vojwxLH8)%_^vuyWlVR%8*IOT4R5JIXS3@${PH}yk)HFd8&4yH&m-++ zSpTbo;d{aG?2&}{yBr2{cS&z~4$O0mnc9>lm9>ArjIYv*jX{uIPoLkn6(`f}St-8{ z-`U#E7rR&Ef0M2nzEGd@9M2wb)Ti56#o;}@91g$fD0b9tZC1A6k5&BgHJZ2B5x(bW zincEr&)}K$fBG0q)~Dg`_NG_Ca5&n__-Z>cp7A~Vx^ia?zf8oZUMJ!u>_24Q8|QL6 ztj(hz;j6HB79V~_ZYC}={PH6ijQ2nE%FpWek53urJ>c)6?`tw+mjg zijnj}a;+o6Iy>Eg?+zlXmc4h<(Mk?KL*}-4+!yuWPWbtFbf>dTe1>n0Lfy$r*pI=t z0uDM8d%$5&EL%jsdXPTLw@2{b{bmJD7Lt;8iMASO7-s{me#(-Uwr&8+Ci?ZaZ-Q(r}zrbxo}zkXXkr2dXf7v^gqm&2d$Bh zhVKae8A$$MZ6CAQm}cTW9R+Wg_vK9Wo!wM6tmD4jGV>X|Ltx#Ut#n6!$_;jxYHvnn z(HiZ)#&Q&y?;4XY$(tzt!rbr(c_HUtb?k_Lg8p&-##Uo8L(O}WA8vqQGQVtqeysB; za9@E={f*8hQygSHwBN!9OUTaI_=)zmWXi3)DL=L3qmr*ict?dlUq>C-oo@&8sXCR) z$5g(RFOb<&yKydG5!?UZsg+-Q*We>3ceK&}9DKX-Nk_3Qr%HCleaU#s7=8)Q!E}6p zrwzZJ!~Pf5<^#xNYvNfu*%18<^FTBFyRrLKN8d{I@7-HeL{ZoMtKZe+cNml1@O9KD z?&6doTsR8k2Mf_=joR zpIq|eE6IADo{SyFA)Cyf3-EatS9oSGN792Y{|nuZ>b)3BU=Hh`;vRmlCHpb_>QTBM zosWw#&&bgpkt+@m4 z_W0JJ<3i`F)t5f5Lwqf%^LOFkYJ_$Werx7owXgMZ3UacvyZ%p>Z8312J5Qici4ZVBOxc$P4ix4tim&I{A_J? z&$-wgu0QcT$)I%JE1cq4MAYTpkY*wSV&TmR>L zk$pn0@hPmKil(*IcO=EW@@z*~XYoM=?F=@w#Q!~CZ0y=vCJ+8NysrBHLnKF_+kkAo zDgH;s*Dy7;PPG@4b%%8Y-|$hkPhFIL&z|+*T^G-V+V*4n4)C=_vxHprs=8lRV|;s| zmuKlzI6Y%$-SnR*kLj*{8+;2)yXZIO>2mbPpdVACc9Jn4zLD%&qwONLY|74^=-r%* zeb9>Q(q3NP2foi?9mFq-Ysq)5rbj2@ZA*T;rPaT0o*YI8zPJ(DL)q}EHN#G1JkE~8 z-5;lY8#HXmLVO-c?>6%00sVX6`;lL!I}d?j(K7E;;H-zfn|t-DIESuDaDK_oI(_rB zzvZycTZH;^g5zO*_Pg_Y#lg{drW>37?A)20KKRF@Z&I z=GEt0d0)0*=hpDgqW1~$;QeU2oL{HXvlaQqzr0gFd$JGk-;VzfGU2X%5B?4Qmd2z% zeY4oyT>DM%g?eHw9`;?*3(0FBf8=g*o*ey7ogT(MwiRJ**9-Q0@g2-}zZlCm*xVQ& zAH*RBFQ8MsEgvEG40Y`)*PAa}i?ab6hnXXm(mwzXou#!^64qIbVg8x!8?{e%EQ9rf zrQSbRqH-y|z0n*-<~!Ohu;;ob`_3hYzU(vD_h&;_@_cI)jis**ESJf{gYl?Qd1rKc zvm=K6K6BnEwwytBM}E7W|3;E!&n)pT{ahX#kMAl+Zw>8yyB@f^2 z=6wGvogdR>y_a63=BQ`cLi*~#ul{7g&I9ophinlalbvpAUGk~9Kj8R?Pvm{M&;MhZ z1M}f9ba&i^U(7|{o2QLWs(zG{>F=j+YZ&+D$F1m|u5F<)z6(yiu6~Oh=Ck_f<#Pf@ z9`f^YG_M=G%gBQ-4>|KCo;|gDZ&{vfg>vPH=AK-ugeh ztE>JN<1V#5ukg1(%ds$g2mefK81Y?brPCA z4+==#2vGTtl zvtmDtUtbTh$oZOY=FwLlzBTBFxF3qAA-a`(Q-^L#{&{Sn{dPY2i|pJOf2#hR#IBF= zY|F=^@K~dS^>y*OJsx?L>`F#&I>R&Phy2=Ej{l_pQ~Vz}7Qo$_-e>vDb561=+tiWx zS{Uvm>m}oNFWf!r{NMI)48yzYvg+Tkidt)%$bNM;3%S}IPg?O?amNaHui~$-U=o+5 z94vmUjS73&H4fidrbEaOSJ8NJ@+JFrFphJ&u3ZzV zCE+{f((_t6!np^$$2*>eXB4d8I*&jPh(iCw<@VZ{$lg))u0huEw3< zd^sOj|L22Y3-R|dTu)W}PDQM!rC}|a-vj?F=jHNdKR%#08pbYhoxRF0zoY#Go~GK5 za=#hhsF6{auiv6$H9HoXd&9e7Iho4m9ACOQ{^5LdvG*CRDxM$3;z~9?V-9|p4c5xB zxXgQ?kt69~IBs-pJmZ7tpW^cag$&5XrIbP}vj80W#p_EPPei{)(t92JQG8fq9f0;dw%*}BtQpk4d^>tyawa29^^K=Fy*9`4nN@Lf=5o=Vvtaw2(-{CC)}ip)&g(fl(XmecUwLf(Ja`y`orxAWndGatj2loimu-i@=e>NWGpW2Q zj)tcb`4^&jn(n*UIg8H^*H%wVU83z_ymBsXsc&6)o`tJBzFHVNIM1n6YjXZ48DZYr z8IL+$HlQQHv%q;Tfn?Aox72{9{I4u>Q#6LpBDPd#oLHa4ydVq zV^iGbH!FM=?azk^x?b?zp?@T-Z;~|&-|PBo@ZDBL zne@HK_7(U&vqrbkz0mbvHEaKV!Up)Pt&&=}Uoj@Hz&nxt3&q)mXl83~3CquP{zv;1 z_nA01-qC05YO3ul*Wx%i$Nl^82b<0j_vX+f>>H|E-^u*cwrBJ3o(4V7JK%NM$@;k z@g2Nu?YE`_&?fM7rc+#nzc-#A&)$pZ=|aW?*S9-+t`2|yv*>TmKaAcrFt?!h0Y2D_ z&hap*vEh4>@XQ_7U+GO`E@AK8WG&KX&66MI{!98B;^nvUHhfK7t5fA^YSGOw4iz6E z#$MJwykd=QT!*mFK3qDUZgwZDVcms&5&cuh_=aqG5T4D7@ce(2z7Ez9o?+wN@LHEd z!`RjY?@N5qLTvAjwwXRQ7Du2rM!C37ALWl3d_NWMWaANRQe%s);Lgx)0mI$=GLxM1 z=EGPCpG(4V#r;rWH!#^m11m*S~d z%%7{}zx|!^68D#iYvUeYFV9!l?+o#|oZPF)Y|Fl{VBQ@5G43DW(>?L;%C-w(?ppCT zW9d2r|Bo>3>bOh$TX35jvUzxxqHiTn=2=UPWsA6v`k~*O+#~3xJDo>H2jja&Uwb^G z*=BA^52xo#F?<%ET*uFcve9}edK$+6Em`}_A%3Hr&b#V`yqPEDPUWP^I1J%IKJ@z7=2+HXxq(Xk!;;yC*k zzL(+IQk&c;n`_&I-b?9v5nri&AN^rHAMpRr7-&yh)>i-iQuetyK89nNSPt{XL1n1x({Cq5AU9Q;qicqjS4^Fe1a@1t{9Hf+S7bLr_q)<8Vg+ers9 z`|$PpV)|`#?2XnD-I~;x1i}zB_At=T63NHP!v=^ldoWs>AJIvNjFx`J!2D z8lY}G4cmeE*Cl&LadwgWFU0I2fBrB|MQ<{Kt@0(}pV)XuE9iMl zoNnQIJO1at!ul;cME__uE$6#cd@xtrNHU*<6rTRB6@(s!R16?=qI);A+(an$L zBXEC1|6FJFx@^qXawfC>Pj<({rtn;!eaTm^Ipk{kit~4LybQ}W^p|w1&EfgCx?c5+ zQ^Hlshs@lQ>x=ess9D+7^z^X49F8{R)k-o}qZ?1AG0pZu{}A4j(cj1?9qE4_&Hea3 z;_n*AI>vpl{!RJdJ~7)3oqe8izHw|x<~n5mL)Uom*p{ruu7~j780Wji1I*E7Y`vv! z?f+*rf{v8WpCkJe{5|PYhr;(+p^k?bDeIBLAL0K$NE*7|6~B6z@pt)-cSQ0kGNxrC zvJNEw0a%8!N&e;clXDhc^If)${@H99$;UV2Rp;{O`TQo=-*+PNPuA8KPPquwVzqzaIMZOpfzip0BBkM0Q`8>?m zz;dW#7j0*tS)grZ#r_7};w*XBzSSA}=HNY-{!Q2*9`d?Mb$>CkhAhN(oV&l1oFCDh zhORwcF_4JAWGDO!*&Slk+O_=B*dNRGeh%XwucRyFX?OfLFJAjwgM%v7zd4(T*T{21 zw18cEk|TB#wJewKVcnmh%bU^NN&ByKKE>uMVf@WF&S%GUupF)4H$wA1++w6u)6yRJ z$HE=z%sbj=vt2C>-_V71Ojs+#_lg5Gr>te;G5m4}U*AK{#<2B4&)(`@8NVglXuF0T zZ_wQWUrNV*Y~5L(oC$TbybIQE`Qt%t%U}=wxsWY~xgLsdIsMHX?-(!sPVYy1KRwst ze?zSw>pZ;9_nz8+K%;hsZ_CnK=$S!3KW6*#t#x%a85VW^|46#)xUH!+4&Vbs0TsIi zCyI*LNj*2i4#WoADRzt9qmhzERB#9gDgp|k#Pcw)ySrw$zP7Kg@qW+vW1ns3T=Bc& zT<5IrJ8eYHa(He>|0Vt8M!VB-x?{16AJ=|?eswRs*YUq(^>=)y`sunin+I1-0to-dqFFh;~R9l$@K&V9mH4_IF`uT}p+l!ScgOTP6(?iwIJfbId> zj&1Os8;qUknrQFZJ0EWRt&Mi98lQol6wS~KztrrZt$%Bi@uH*9;#C*8^rpD$^ za&(}3WX4Un-<@pIP~HDecGtER8{VKptU^8|S3185-6MQ99v(SSe!<>$&c7pXkA7{7D=0etQ8-^Mqu(zPjDSFcsS zWmj&x%=<`q2e9RR`nKY4>yG3s^U)9T;c@)t<7%#NsqcBXgAdy|o=C<5_^$Qtig_rx zO}kjcBkkMJ;Tke)k7jY5@2qY7T@IwH6?`4^tF5W{6qDHA%h-`4$#ZOJ4CjCNhM#jZ zN$J|yx-j3x@dNmFL_fJ^Zm>QG$j zA@ROvxt?4KKAnl~TlS#O|Kit)7 zMeZ47bRhdz_H<_R6zy}^y9ZhHa&Ak8ffLO`P=yn*?`J%NrU#ef-%&sIKU;YO_ZOIo8XbZWp4f!3( z3-u%T$#dVhBOkySk7Vy=V)z=F;o5T+-c{LhzVnu1w7&k+>3JURkJ0xJ{nkLgh+)X_ zXJB5R+(BqB70`y*wtR78v{u009i8_kOeRvnbd^a0r!quqW`}}aY2Na&U#~}}!>wA-o z@6f%*&W9YEhm)6J*_@mo;DA4pgJG1eNFnW;%m>ibL*Zgyqh+j9b%d{f^|2xiACyqFPo13Hv22^s$oTtF;&0ovUnod zADd$v*k$~rtH{BDHFKGqa8Izz<;8>O+ry*wl|RvA{a?&v?@wgxsQq;L)C-0+U_3y) z_aJ8>p5_R3*N5!CpzB~&pP@udW@CwVLThit?(>1JX;@2=VUtg zDcpBWRzZKL`ua zWB4mSldR3~T6gBKr|t2aO#ffv{51Ri=J$wzHZ-yulO zN7syQ@rp*UE!5~w`H~+)j>IF-A7g(DpWMyvhxud?oo_q$+&MfiNnfWU_<#4Vp2gZ5 z&*7eDHi^uU=+DJ3chcWrCo9Z3;XB3TC3G(vJ6k*7Tc5m29%IXW&c#3Fi_9F5KMhky zGLDfidy#o1%x}OdAM)4fxfNeqzMIO9p=2)LgUM**eELD>>izOKV)Mb;*JsylbPS^x z-f+#AUEz3j@}Acp)=1a$^?T$D)OHeIZvoF_eAb{T+H5F&Cp%sZ&Bb(%=ZBxn$q%8E z!_^wZ+?buqA7O3`@im`?`}GOm6n)vYPkr?}0m;X7bY;^`=zG98*tT}V%5V651CsuS zp8c&=w$c{vCCb_SQO9%WYEI4(2#i)rmd;t4fu8@8#hq*2O59;QA}J`eV-V^SM21x1$_s@seZ=0^HU#uDg0_r zaS2(Q@aK>6YOtC#3|&h)H-vQ-3@!QRW3kwbjBC-0O>`&Qj)nCfF$na0T#9LU?il|- zp4^J*O%8Cr0!F9EWjef54(I>mbaI=Q?Snm1q^U0>DMuqKO^kY5K|d-_J=HwNPLOMK&Mt}W}U-@VM{vv0WA z;?2b-U@dO&e(r^GW>>uP*w(97{qAJhS6$eaoKfV2_cIPr&*Xc!ZjI~N{R+9A<*D;z z1k9amx#JG(>aXvLl~}{GxNt8aX~ze<^2ZA6j&tSA4769UIb0|9hj}q9=g6&v{9&w> zC=iOjiz{Z7We|8@31n5iU|6sVS!8_?)JXg>+9Nr7bI=|-nRG*v*wLDrE%?vVMAwx?ZrG?7nS4X@BlK8s(C*R z&!=SWM(=O-BjFsSZSTTwP{7uMZ0rAUEg5{9-=%FSy06)G5j|(>zd=l9v9pzaF^!(6 zRlh%;idnvl|E-h5vz4?xU+yla4R+}+d@f})&mkx7AGT4|pk8fV4@1~k@ zuTSkL`taMU{56ujC!;mjL__ia#@2(-g<8a~fw!Q)@cl)3Jvz1~yRvx<-3#q6$1g9! zHC+6R^R0~~b8l(x2+x}$>ze3yIXAfjzwm`|oZkui>HILu`HyhjYCY%OyD-;9d{K?X z=K5ZtU+vH4qZj9dy!=`AZsYuOSm96jA->P?GB&osbBn&Qj$6WaxV}xa^`!GO{u}B% z;n#=A_)z=RFpflTP6)qm7~e=&hIR)uaxb0k{9X0(JhuJL?qOtZPuEm&XpK*uFRgdN z+>i}m_Xljcg6=;0wyRa&U1ahy`qs7qUhAFo60$$%|1spXf?=GtK@G0q8Y*9f_cgLz z=r~#%o?PzcE%@*gwx?+8U|q_u)8y#2WWk?}*1kXdjnK}o^ZPh*jlW`Y!|##A>QEYN zcTX~*x0ougZ^hFeeS30_g?DJZd0kFCL4N}*2jlsGo|;&?=1tV1=m)xXhFh*h|Mh;u zbH-ZDxa^3293QM;*HU(VPuAUHv%X{N$#9P^I=-R$-SzNnpfJ{w5F!KeiY9 zdGc5dOyqGf9QOAeZ$Y*-S9pv=lAgzeoxyty2kLqwy-An z_NcA=mSZY;yYT1Z^gaOB;dB_Ead)-yTRdm;#p`T7k)D&uxrDs8^c$DyGI#0B1 zjrJtEwv|7jj`o0CoeS?_lne2%L*IRLPbH%}Z2e%l5Erl>+RES9dm5fCY{5sn(idX!6Me=; zaXa4c`2R+_K7$RG@SHh32hV!r`G}lH=vYnvNU}GSS1{&N$v#jX6*cQCeX-b~N!GEA zsCPZ)`qH?HH|Lk#;9XCQA7 zW3}9jj%#Yw|0!3`Hm#w`ANWzNOHS7}-Tn*y+Ln%9>gu_0okDlSH?Ps}xTxpb8P1!^ z-@$C#h3}fdatb+{i+f`@$SB@~r9Yi5*~ljWOEF*nzp$PthwimjKaT(Y3nTo691MAp zZwvcwbhV{pJoyj8b+dS!%}*C=Z^N#$^r>Ts8WiGRJj_Qs(bor!_@(M_xugBs^tQk= zkdJ0)n}O~g`sb>B?>g>MtNw2xx`AJfi|{Nmool-k{WY*yH>Z5?rt z>&5-(Hl;Vz@Y`XRuhF-T`7GX^kGHDx9d@1i${#!H-wD>Q^}X3peWw}j^_3gKP_oCf z`SK6*3z^}*TFUlPUgmrl{(Cvp$W%S8zCmqT^W7wQf7`P^%opK1%xo$A{psxw(}m9e zX7^_JE?ZW8cV2uz?^*D)CFfYjayWX>?@w*Q*PHXl`|NynnR^oU;XZGUcUAHqv+XSA z@+t3Bi<0~0^GkRa!S%W|`5gVi(r_$(HsLVZ6D{b82?WxA1%}>+XDQnEq~v@~6b4 zj*dz2O&9AU#9}oxC!^`2{~g%bdIRNX)6lcW|uEwp)!q@d)3c zWFy3TeKqKIG>6l3j7?7DTe9&_I>TC-&cy%!R?j<5AbTzE|Hm+faXX#wA4cDUzLT6A zm)Z4vI}>kD+m>{^i~kt$Xic{3yL1g0*k6i$5ynQ1owvZ*h^&|Oh3}K(aV|enZBlWQ`M&l1_)%vm=$#>ol3IErXY*k}7+^`q&F$p$b#0Qfd_hRc=c;=9? zh)KD`o8cTQL+tk)f+wW)^@n6WHj1Swx412g{uAZ64ct7Nm zo%w1b<8dwa8fGni$DffgksAlaTeb;gnTyhE`0)q0#su8< zljUOYkvz}()mQhC^5?~NCY>W}gUC2g4CbxGlr|y9%MuWzQ36H+6gin(;NiKTuyiM=o17thC!4m49rl zKV1JrHPXBquJxW z_yL|a{1@gH-#u2p|F}0Fz?)38$>-!*{Aye|l`Qed*&fN4xj9CEz`jgh(6@rW`tpOEDqFx{Z5K_X=K?yl=S%raTr;{ewIvO? ztj?6bm`C?_EidlFe5Lv(y*GSe9E5mxrt?yJV>`MMkM(~M{H(uR&bRU`{Z!oUusy)X?~5njM2p!o zj1Rs=ua?HYIz9kjXSTE?`#4zt!~grzy%k*i5j|;LVIT4)-CFJW49{3J-^d?@rF4{P_)=8$9ou!?wr7p%MS|ApahEH;1)1{>O~FiQ1R*cWdX{ zz%hiZcgZ(z6z-RY_y4mu#o=1}1>zTKJ0E1nsSV!qNNys(rM49|HfOK0DR;aY{R8zq z;JlGqaVdPin|nVXYXICo)~)<5tHmaHxbB*zw z#%A+jyadfGIySL?k(?d*dpC4H857%I2XkXJi<= z(XBOoeD3{-Ft0|>(BCQG447ayuM}!|Jk@p(yz)Kn5d6W_Q}p0@y%-1Oq&NBFuZMk{zk3)u4c^Dt^Dn@`DpLccMiR4)EsxMp8v<* z{|x`Tk@u(jId-a1VeM43L!aB<$zMwyi)B6%_DRNpd@8RNgE92}X8$dowqiAj{uuUK z`KE<2`&E7Q4nX!EyH}MDcawD;`nULJ6EfA8Xu3Qwj-#gR>%pHF^Y?vxavI%d!Wwj` zyQSPq?sWX1{W{C4?-jy*{c61gOJOWUPt$Wv%{^!Qv+3&3&X>(!`pnU}!zSp-po2IaRu{LXwcy&HIPE22fc?WSh z()JRXuVDSu{wjKn`)n7h@}KBpOXB~33s{pgkvtaJc{+{q$Tr;-KTa#fu*m)y# zpTKjV`P|%8$m8@!+ZeK^;&HtdwI|l7xjL}=ga+qA>mt6f%ilx=>J!aR}s{66oFgR`}cPjdA;PlQ+sMq0l z^pL@gMo>1`sEW47^lg{S)t`?KKwarGm6`nfhZOK{+Lk(RE zx-P;W?%A26^1~Xc=M~}i#3T3E^1JPav-3$bqiWTfEIx~kax9&KpWpJ^=>3T;A#ZoI zpQ&DmdvUn^X?)p~%*E_HSG>1_<2-h4Nbh5CY=>@B$EV?a!~C=lx$1dwH5<=j_YA(7 zr%ikQ6`H?c;^S~%s$@^r9bI0NN8;2?Y}~U+4&bL*jz^&x%BKCre;3&0N!h?BYDMvn zZ!Y@7HIO{AV`Dv;xU~9x*?58L+Q;GUf$m5c`p_%q;<;U_Zwk{T`1l})Gjk8BY+~IZ z-@@1~+rV=M8}AEzcy^W38^M1&`lj;jRhZktu~$HIlH#< zd+txgUJS}3ta0Q=wj4G-i4Ljxei6-Fn{iS&PAAFV&$Yvse?eYC_nBljLvPHNXtLYT z^J^|glaFCtsK)FF(@tXERR5iL-sYzl;FX_=m?s^`T*kI{wS6cr?zO!StMzZbt9@&j z+oC(grgrALsBd%l?J&9?6KgqN+zaDOevwDzn&@_OJ_x3vuuUgp6*>m+Ndw#k-es=U z)~AzA*^^@F-K?T7+;T6I!`Y6t>VImgYx@lSC*-Q>iTI@OWp9x!e=~DMxg5?l=y@OS zgWAtQQ__Vm{tLE4U~cSOjANL~f5`ifT;4%HJBrEb{WP+Tq3pkE-QW26IJ(VP`$68! zvuz9ONqjm&-w6KOgFip3xAul%d%S8vJQV%Ka$*rVX9WATJ<1oo(2x`E`Ia}6yN0|s z_QUl_=~^P(<4l&5y8$_mpjUHJ_o}jaFwT{G=a6#<{QL4D+2OYu!(1A_)v)rq>=N-= z2k#7ab|Jqb`iI4R5V~+relu7uVdE73m0vOW#Si4I%WuDrwR!M&^ctVDBZfb|!|_`DF&w=$Mmo$oBSL?TV>H7ur zCFIF1HP3qZvYqzB$mOF{9_Q!jGiK5spF!qIF;Az! z!-s{nU1Y3;|5%CmEI*z9mdep>=^ITx{N+IMCX&%z|DE`DGvDu4?->stsr|+Kc*co` z{79yt-JA_CYP*gdyRq$UHq;#NAl~8rV;Il!DBBBdGrnPG{;y+ef)Llx7T!xt_ar;q z|DVjJ4Ph~lmKhzrU^##3%KNhFZti`G#Q2ZIKl&E#+vys{w$t>@Ve4RV4sqR={2E)$ z>B(7Q+M8{1Cw>a=?P&YrKZLHk+1B2(I59|z#cHG+GJk~ooz?pdozNM3*~@BLk6QJg z9P!<7zKA}|?Gbt3it7p(-sj)ue6v40#Wz{RH}&Ygl(#R@8SdAuL*4~!qqq9jsANMM z<9HT7g!yN*{TbpD!FmM@?~&hx-Y4O_l07fO@|w5|K-bcK4!x_u9BRBZO8N+SaxOg^ z&rtoV($xWmTlw;F_HMnb(wnw%{s38Z_%F7fN>9j-Bk=kkE*#R!oQ=9g_-z`qx?PjcoyEz^{q?Sc=^zmKc>-l<0AL)jHmzb z!K!GFB!4NHL&$g*Mz$p*wCzy1#)IKRGS+u|KaAJ%pYfdC4adFmMxMsQ>FiJb5N&cV z+ueKK^rm(EX$_c~+tW~U?$;OQChPyQ5nBh-0e|rlnLo&zXX>l_ye0YNXc_8B?+KLA+SsFuJ?dS94~_kuX1({n&mdIbUf1gPbt#M&P@S z4QgBhXE{|2+tyXTC7T?HZzlb&3$h#3j*ZBD9{tgL`;u|IJsi!uR_~Lfjrb|_2V9TW z%$e+1K-W%W&eC?e+Bc`pI~pCTdsM|5#;h8XTepVygwu|2Pq2?*x!dt3bho4P6SiCb zmyOwTjJCMuo&(>hC#BpD&)IW*VQo>iVqa7HoSt)FxC^~8SaxGum>&*6JI}Tg9qLZF zrp~uDZf?-m1MOVfdye~CAKn`H$$5f4xe$wUdRl}3IAYUn+T?F$zDxg=Lt%V1)29vv z8?uAN)BG5o_f@~qb1=LMJNrHmj?4J&c|PqzzPwE2PS&8Fc3{Ir{Bb;HTit-MXtvwSdtG0DNMVo&)!=6t&QkU74-iedOxE!-E)2H7^Ie+Eqa6|XK&UWTc)n3EgqExM68nm&Fl z#WMO#`>k{}RyJ_lgpESs1h7`ZsPw$DNMR=JKklZN13<7S7(FlxxanL zx6|lYZk&Co|4G=U(9>7@7(jl1z9*c|ra#oRcN+Kro`bZ(8GM^} zCx2V*>$2k>YSAmN&R(M2?!4>;?Z{&QG%z^1FfMh4c;}>tVdpymRx0 zyic^9#lEA+c0W07&?dJcF^Nvn&Ue`+Y-^>@*h>egUEezI7seqRv-#pM81{y@Q>}V` zHn(1hFL2x&R{vpBc0uR)Wb^@_!W7AyNPH6WLAfURr#f!Nulw@R7`n|#;oGu!N9Rx5 z54K;X#%v>(TH$$4{}}Y=ufz^$@O(KIm)LXT=z9L# zK>wiqYFwwV4k(f-A+8^N$UAB=_X9C1{S!uJ)$=HyMFtGjW~i_f*E z)*9IfZ0+LsSUGt)UGSuB+0<2^m?dNN4Pq1jCwJiAg`S)AxyP7aiQc`lbc8)w#Y^y< zhweT!o#2~d>ja0Gg|%re9*O%1`DS%~FN6(0)7LE#;N`@u>Sm8<4XD`c23UbwSN8UgZ-s@pyXHW#0qN$LT-T@z&&@ zgU8xD{N`SM2K)Xi9>hM^o*LHw#g*od&-i)){sYiW=I5r~ z6EYrCwuJxxjb71atb}W`@V{Fbxy5Vr2U#buQGBEC`EQ=%^VPbiV23SyD-^Y`y<$u8 zKS$3l@Xdu~TXmtI{lKZtFG z7>t((7uz>e7y6oey1;N7yertUjdA<~y4AF)>*2X&aV(wpvf&Dtz2`7vvU{$#ehRt(o( z;k~J{J^RA-^LK1J3eElSokj-PMSolFxQ%!IjmIM7a9IC;$zRvP8e%>hy=$BJ2*)?$ z@56Tkf*!nw8-L%|j3aT9W4UpX58*TRCQs_yVVNZ|-Vv~B&)>xNow@(z`jz)OZ*Hi* zQ3&7Z6ipqQ)AG03eg@jG{_IH30@&ZTKhFB55e)99hqZaUJ-@X;dptdpVPJoBzw@r- zc(#}tOIfH_Z}QFF>{3gjNA(+fX%n`tsc$4a4~pR)#^nh2A}_>)Ki(bfndF^}ehvOV zSKjQ@u=01njxmPrqT>#<_4VGjf^{7J>CRV&%T~N@eYcGtea!aZvrov{Uf(Z#HJ;3H59oi6J8Hj@%n6QH*gpdE;pQ&$YI!Ta^o4~@ z$yDufzWRP;J9zjl9bT*6k12j8|9JUX@N+l+pFn4_1kGA_)ynb-7;`o!WFD<1m0r4{W$r&h4#}L+{Y$gU-Y0D zUB{2j<;XLby#+!^k^GCHFeA}M9lx?xGTCTpdy2ebd zCnMz54cfQD--AslogdNvru^##;|^@v7f&aByTkN1Ki{Di4j@x4iMo0IHJ^++@^9gn zHh6!pcmISftH8C5JvqrObo?lm=dtf>wzSpOjSO`ymV4Rv;>4~b#CA-5wI)nnpuZd0 zH}cPU*5GTho$u1mY=_XbT>IwaZUDQSF3h2E1O8dAeS$35bJsrk-f-{CXS>v*n7xI1 z5!Q6!nmm?osktEemR;+s7iw|Qh+KB2uw>uCdLUn{kEW;XFq<)w9K-Kj$dSwOcrq^~ zt0Ntk(JzMKo<-7>UgIM?y9(ES$$XfDJzMkVv1p&hdxkc0vOOET^P(+>+5MdSU$zX; zZvM}f@}b&TT_3$;E;*e3U*-37>!J~C-vI7C&|XbOxK=qDhCdwd1LHzIzKm__()$Hp zY>rNSOUzU0#&qFJ)!<@3?dHIEBeL$ne?BZ5u&aR$OB%$-xbK4I1-W&+^HK2dWy0R@ z+$tKykJmX~s;$Oni*3E>cucMTgp7K8=A^VQyi4tmVgp~MBW!XfSG&r!$iGJ&U7>$N z_BW%$xXG_1w;f;I#)qqEbedXm?bhGGPg&l{;rD<@!s%?9E9(4Sy7|O$NkFl6Qr`$^ZM1QR@ zPDVTh?n!L<&V0}ujhv6xAp1Fd>`BahaYwe83!=el*hv5B81(Ii?jdz&RWy&X-#Z2Q zX7=xBZ_8$ND%_h0*E{KX+WPSQ$?!faKVNjbIUJifU(#jeyH{jpt?56AKG%_HKYmuX z!@Zd7a{jtU`zG>6ZA!b-FK^3p$bE`lF)Cp%Z`XFBw#S_xzy`Q8b5nY`9C(p$C)r=b zhiXr_Uy$`6_rh8fog(IU(sw0YgUGmnPddYHEm(SAEsX1Mk1skLT?_4Nl6yR#KA^Vm z!v44A(P(nox=A2!Mq5r z(PWMwTl`D+f3i#Xa@`ue#*W;NPZN*Vto7tYbOKv$)!&kBo5HXj|8%6k89C<|Q<>wD zFiop-ZHzvQn-ZRT;opV)uVD%Nv-#y$>(w2!-7hxV(s7OB^LO#UeNdcg9MzE91ijp&yv zu{CenNgi*3??3#$C7plPsa;}!9b4!P&uincj*Y2!6knZ7&RFs%lCdTIE%kdBHkxC< z0H5_oxs0qia9u#})96Be^tY)MaXb89@(0<8`v}F=a_T8IKTucw$4XcaCvU+0Et~7D zf1a+ZetR|Dip=?9{vYd-k@_wmM@>qnz$lNRRmp5Fj#p`Ok0w03%IGf^)vEspNT=}S zIQW&*(sFn@#BD!{{zJ-(l}ac6DLnA@clN7@p6T6!TPlDwo=f`=p-V_YteP^u**|Z$H60WgOo2awRAC4g53Mb06IA=^rK@=yPKy zd~YAVkuC1mZ!S#lg>gM{jmLcG617on=?G7bW;)E)pkY0jej4Oy-&X$-_F`Jx2+N^# zeq8T=zu2#qCJ)fjfz7vy!E0<XOPyhRH z?27*9AXkj|BHW)zx1pmS3{ABkK<@)+V)EbSuVHj7sIkXACv$$<36{03|HVD56;e48 zKVolQ%~N)T+zsEljL+^llMQGL)zom}9 zb$lNmTtd!T^6**Mj=>k|LN|S_;4*geo9U9D;dhgYd+0Y$hIe+NuwH$gt{VSni-IpM zwYmQv-ouR7BX=MEI0)Y&c80mnn2ukzO_JA>?D;L-o^L<2?aof?g>0`nzllfY>GT{( z?#Xyhch2TyS)FInV2iE85Y^HAsJ9}$iqvqZOxy>8A2S(qT>Zbc) z^mT9WTlr+dQS3y%Jj`E2JBW<$ogd7OGaI}=OrD$$&+$vX$yaUg4xIbDPr!Pm7+qzI zt8v*nbiGC9?r1-ePyZFu6~^Ci`xD6dh<s*B)Xq zP~R)s541f4*US8Ad?ZKI+(TlwF%-vgVmrBUEPY+%btAOPVHqID`mv!6nmhEHbBhny zv!6Y?Bfc)hHtmM?2)?<_u{u|V9Pg?&Z0MK`Wk2%vVp9jWpCI#G@=im0Cfm=cc_*q? zeg7K|AoCh@k@G{yoK5$&j$fp6B%N!soo(UyV|ZU7?ozAn*Ozm(u{Y)4=yEnZg_fN7 z8@^tR&)_V!bG(AS?a>ayM`qk?se4t{Q@vrD4V$%1xt;#I=pLeP7yAv=2JtWUCVL25 z)*#n;{GJ%j(jR`e>21E>luZ7KkK>bFVKJVv20ABe|Crw&(f&|_-%#Rv^I!28TMlZd z)_d`lc*+?4Vl-%;PFTJ`;XxDEb9sIB zTRGXs_$P_a3Vioj$Gwkcy8an>zU1?}(79#`_k+^DXr6=Xa6ZtNjK#YSUwp@wFW|YC zUGwOX@5$L@{zlf1=vQbTC4cXPk_UD5Ie4@VPGqnxW_BQ*iA)=bG zC?}&+jE%))&9a8r6qbwW>Wr>Ap02g(zGisWBRPZqTN(16o<$Ukj%HOA5M$RQL&G)S1Vg6Gyf?t!RbT)Oo6P}j*eh*pyv#DFzQ2p!h>9**v zmk(+}c&9Ml%YNH>_w~{259|DT^C(|-mKVP9PCvx2M&3NzDdrpj`f_s+>;D*Ww_U#smbvMi>v!h)iuI9^iPI$XL3iP zJKg?zSmbWfom}HMeCHW&EyvcgZdpUD8tDslTYTeC7tVv_1U@(uO*K)rL zb*}TxDeKWA?(tJ%Jp_F{9bx@H3(w8+%-kD^Tlxsu_t9~hnD*!Uf7#^PpxjzpM{8v{}G<$^v=MSs0G&ZnY>NJD+&48 zNv#-z|9*Z7W9KL1^$#-lBxf=IsI}!J*!sc$kofaM`9J3;qkoM3JCX4`eCC358on)j z|Er!CYJ0w#YXQEGuVTj-+k@zLVDF`9$H8@4*J`bq--!PhzWyH18gii%JkPbg}af(KaW0xqdY`YK!M}+jw$T zZSemjYF111=E!_qcASNO1s>NR(L!y;RMwa+pBlHj@!4Rxbrhf6#Q)F1coW`#$bSgd z$>i=z@8i}y=klXig>_d6dv=?gnabbcKJaMUtLVZUuo_>C=98zyPTnVXYu~xf_gju< z)>Yp@r@!DcE~C}u;o4$ltVef?;W6ai1k;5uibwe}o35qrAG|-4^QSSgrSbeO-wj&k zoiO(GGlyKqu6tmg?VNAp7O>rH6QA%+Xwr{;;uII~8)rpteSeUdqHl+9ptdkS8l!O= ze&N@+1wX`aEKoDvsWW!?_Eb5-?&4qit34FN-_m-X!I4)2C^ zG?Ked;`5xKJkgx^ruug^9Y2$KJN$FlI}ra?@S1;8Vc&R;EguIu zd6UZLDCEd4;v01S1KWvgGB%>d_B)c_pG|XZo6*r3j)(d582se0Gi|<8k@)C_lRHi<~EH%Fbt#Jgyw13%}v4o;n{L| zH2P`su}Opbwsd!+V>_{US{|H*rUv6uzL5X%YWAD6qp>md1fTaKGsOOQ_|TO{!!(3E zYrv4d(E$9nSex-nxF4GTu5FpVx7i}rsoYPW#4qQ=Iw5IktasOTuo&8k3GgIctLvX) zo_6zbemPs0kkeIs_u!*@(27%b8TrS-)}Cx~h0pjbhv*)wBKZ|BT_ed#tXclhGeZx7;pPuTvY@yAC-|;9rBzQ)`}c+xR5BCy~g@ zayq_^$YV>m-(8H>z5*|Qm;1wai2e}Qiya@U{bcPAIz}7kY`M4IJ8atJO!*KU`>+9) z>>uygUgmtm`sy3e@@7~9c0P>z!azsfV84;AHU4wi{Qw))^W=3pGwr*RGoGK`)pkik zwSFv*)UN(Uu8*Vb;H5tshUQ)}MW>lv}BKSnkW8 zY)|*aYo81wYYUjCi0wQyViQfIV-bC~llde5NWM-XcL*NiJvssZ1M*}GK1LVTRmH*l zvk=a!Gmsprf!*3IXciR%a&n_ivGdNS@ zO1?%Xc~0{TnX8a5*U}sHd*3NMqY2jx>7#r&n%osj{k8_ZpOLq!_QtT7%c8BV8D4fg zn@@+5e^UL*?=!!&KiOQ^8?Fv)zli+BQy;N`)cgmm+UUV5Bk5dZBp+Zk^N9{okd<#vHVwmbNIqu)B6V>8p>b;`_%MEa;?HNCYTAA}r^^VrgA&+a-f4-&gM$O25)^BpHW6d!iO}#bk zdVFczh5Jsq`K>sY{6X;8M-9(kE_lQ??s-B|YKZLZrPgezQGcw2sey zg}oKs2bkL*mOE?1xW4|wVKe5UckO?L;Ty5|m!G@~SE^~@8+<934_n_lUa@M2Ax}kbcbq)BVWiYG7*Td9V zf3Vdv|2T5K344AvFFhoOjN#r%5Y`aMwO~${F?u5=)^v{L04d0!u?O*+360T7S_sOCI)xQ6*@ffu0 z*F0BuK8l>X$l$l^ewfTn@osRq{*Di=H^HQSOW9<*3 z=M8kbiNT)sViwk`d1EsFpnn_Vb{;>h%I>-LaxGl<7B`Uh2*2=gHURCp@Vp5Bk$n3x zIZukqReZcFI_tCYA#%)5)w9#ij;9+_Z@{uD8^(&e8jv4IZb$aCrGxCEz4PVnmmCF? z91PFHLcJ=ioeOK6d=>i}Uz)Tn^vW#A;GHhP+0Oy&I9jQk+Te zcku4v`a!ORXXdeZ#}m-bUZiHiH;uoBIM2|@)AV$F7m`1=uKEx0R85Tc<;Mo?8`rIT zUOtr{VtV9VZlCplZyP>QH^X;g5nJ+&_~i>a+rYgc9eiE=2Edgy_q_3&f0G^A{y4r~ z@czU881EGRYa%~7)EUq22OYM1FRTJ_J@z0~rc!~#;`4mjsYHMQqRokod$+PTem|-b8z$>3q=P7?AGx_FI zGQa1CIe7lUGX(8}c=|Z+LC*j-Uya`SJmUXwf3qA%PE&oyvJqXrgLv{y^-TMEHHOXM zzGt{T3)fTO{i>v${aWPCwrxhv|HQn%+}RucJ7HVVsd|?wz67rK(AL9pJegu2-oFd; zZ9Ws9dXQfNZ>T$Je6l`2c0(6pdN!=h;ps`n8vJoBe4g9Hfp@rC*$(Da^?$l@p3l3Q z|1Ks|f9kgcO8!kYrmvH>;bQR_`tzMPA+G@*>;ITd;krIOTAx}{Jk8c=#_gWsy9qh7 z8(dewH;Mm@jpBLpWH(ONPqbtOwfT<0?jb(FNeQ$c7!gWdUq`p(&T2AH|{`toFV0`1q z?uC8>Hmt$!#$@tQAy&l{xQwCX1va*W{~fY#!8@9al3(sbH;NCJunT|iZRUP;ei)v~ z=+{Dfm$n`8H^}8BHNQ(tt~}!i^?7OaThQr8av7#@FEY9W#{KYZpaxGQdpw?CX9ve( z8eeK&dV_EFA?Idtp7QRS*ra@((v`@W;vM`4*-u2j9o{G4k&Dq#GB)PhRq=LFi~FP7 z40iRsd{5i!YzX7X^-c7Z^FjLBk~=}$qm*2d1eE;RR1NO>{4gV zM9-ySz9l*Qm#Po(mgeCDjKAOA=bFsN{GK=A|1gHO(SI!2ZD0&*rvtQ;kv-&^!dfRi zlf6&L0c+OsIeOoMU;IN|O+9Z3v5tG<@9jAFaD)2ldy$Nd$zNoz(@_0iMtD}7e64Ly zF&oFW0rnx+jpeAPb(<~J!|**rVhlwmv2T6)%S1Noix)0+%7#y2x&_%CUw_x(JbUy<{OTKT40JdxgG^(|BD zhLgLfR{cIuR;Qi6!uwz85`25{2YKN+Yt#qcJ;>h2vHoJL;~V+#SiTvIrv~pZK5NN_ zHgs>vKjy|z)3di>H3rf*;araPBYXCw&Cq&hE}KEdyJ~n}eK%_FW_tjACpxaA_j&yC zwcMKA56SFJ|Ccr27?Hh&Sajf%NBLo-{sM+$8mjpy%wv)3!t5bDYD3({-Ze>nG`)P4 z?an9G;vv`4F~;}n?7aZZe7deC=M&pfx;D3;tgTtibB3BC)fd5j(zCcg8hfU`zo2%(&0IOWNlXPV?Nqg+yw6+{@g|W zY-B&UzWVkmJev(zi>J|lCZ_MyRlfsS9Kk;=yhFWE9KYm`+1gJ=^Sk5S_#$)sMg#oh zzpL*K@}DB>81_$MyRn{`TeIoxGp_RO=&aX28qRa%RmWfhEDN;_BC8XhzH5A+&ejy) z+hl&@e--Yfe>55De{rbTS$BmR8t%^}v*n%nBN_?!U*h!=48~`EzU>(@XNx(zs`c!- z{Ia$C|BdAF-sF4#CwdHTKmG8=x50cFo7>{s6V|i%*4$dc7Waquzhue(WH)j=A5Dy_ z1aCIo^^Uc3IUI&5?D-o8zR!QQZra1~Yv!8g$#n0bFh25i?5C3{PT^bpbUiW;)Zd1F z{>)~=BuAsS*#CH)--WWtk>ZI(zUhGBHu}XRJa5cCpywbmJ~VHOLpDr{#Pwc$x;u#HE zVOgW1b4WOn?-*I zdX2kcYsXXJpH^G>POSV&Vab0cZwdOTY`9#%{LdDd>n4-;C%MK(Sht0_GnOMc9O1rq zvgXq2x2%)>@EGfvHDc75U%KMk70s#a;j`!oHYDVC&^|{yT;W~o+!d}XdnpXSRa>#P6eN!7df zI&z2MJJj)d^jo$a4Mb6Cx|vmZ_8 z$1uQ`*W-Hu)*<@jOSzX#3_^V?&Lq3B_}ABqg*kr$o^|mbAddW4?qZBtH{@%ht>=#( zbe(Gpc(Vu{pnZn*65n?_c&!A#Vrx-)3j1C1>GhXYwH)c4qs)wYTj+Ii2*!nZ5lOUqWldm+p_+Miad?u&-sE6zjh4ZdkAKerc`LHe)7R|oS}+O0Lhx~F(R zOy|p^GaJl%hGPY~ zFbF8Dw`$qh;Oue(7iabY8 zpQUd;-8q}it6Ta0GhbzDYXL{`etq?QVY;>B_sm)Uvf&wYYFx?}MJF<^uT|H7$x-rW z9-D{LeV+cw_T)x?%a1+a_?aDh!4xpxMu+iTs(abad|{qUuGjWFe~smbuJXiMqiic) zL-4^8wR7J0Z*`hv_b^12Jzn<~2l>R;78VM)8**JRSLzbGa)QfQ4QJ4eEZ^%7MOxwWnFn{n@ z`DlIhd#d4nW%%AO+m)Vsw6)})lpk|6?dZG*-l=@&9oTR`JKI?PjIm!RANeM|ly2`K zEq6kDfy?>JdU$>Z`YdO{sm10uC8e9u}eB{%42 ze>nlJFph5I^C#u&nPO?~NZ#U)T<1Ula6K;+G@E*)SU)`3>kh z*VG@lLp)j=um2Ut`^0Um`DPuooweJ?@-p1>O2306`0ik~<@K%!tgX%`|5*04AuC5` z9OgaYKM}q9ns3Uc4Pd<#->>#__)m_OSJ|F~E4*VrUQO&m&k}sv^V8MzkYgX9P2pJ` zT^}(y*!g_e+#`x%jy$hON_q6Be7~aRzJ~jmTcMk7TZJuS_~$%&?l$kf2iHKdR@AwE zQ|Bg;|E2!Vtd|~ubz^j&*ZaLIcK6`7joEW6pU9nPALByqB)e+EleOdHg56u`AEV#B zzVNPfaS;ryY^&6&dvE1by6z_LgZk<>H}b9d&9zUmvGF)s{=gm2ta(mGH@-w|$bUl9 zNj!UyyP2HmP0un|3-nL3>)yKR8ZwvHvHXqu+rpT*ge}YPqpSY&Xr}$o{CzJuYG1rR zosY7+9~*mWZ-j5IoUg|>-quumdwTzM%(vN1Y+H}s-^Ak)_U}zc8|@MMk7D05bgipK zh-VgXpI`ItK@lZCI3~aP{`Viene#DxFbobkkz0Ed2a$2D@jZ=gCp1*w*QBeeIUCC- zb7x+_sqW=d^n2Gc{?>jrdq=}Pj*JF z3v2ptt)6U)?jSh+fyca3e6Bv-0_WIAyc;auh4LN9gO%mp^Hr%EtBR`H;;+;Tur%TS@E@hhh!K1-e^o&#u&$w`4QD`7C^UkaId( zc^rS@cusxw-fk59J_WA1?13*A*KnUPy%mOaVE;s%+}BOQTJ3dy>BDxIa_g(2mppCK z5Ji*NxrKW=jmhds*0*X}6Ep|Yf0+G!_H+1r4BW0QQ+9=SVzTM5su8KObGgF68utrJj!IFx+Pz9)#DmV090#KfT?_mUrQOjkp88FZl9s{jPPxHBxx@qTIc~ zw-aQ=#=tp_*M#wIGQ-?yt(4saoA_n#q1}_s>Q5rCvPrNm=~DgoS#@9CJ%t$V!aG9g zzx?a^IBw7GSL>^1D&@nESZmX>F}-SLzJ17#T6Nz!xgFm%u(r^rKbx%oI>#@F!ERlx zF_wAGEr-_?o0GJsFob8udpK?k>)p;VoBktV66dfsEl+bi&zk-#?dn_d8oG83ez&?-{nt^pAw6;qC`Uyy$nzcpnezm$!& z%inA-IuAB~PPZRPr#U5hSbxCizF76FWFs=S)z62eF&&L?{0kp;Ay@4#PIm5ocDmSn zDM!LLU&&7VdJP&fv!?3FHDbNLm<}d)C?5Jly@)o2^(l4gb?4UA;rH&MVPX;T{&&84 zn@+w6V=R+%vFpJ2P;nW$xcU|&;_ql9cHboDPSC!?0#Kb8$OZ4+!IOm}yx{#zlkHp(W_ zH<6t4`RFSAM|;oaTIcF}vIY!&VYtk80e`r6R!)#l$7mnHAE9O}wOvQQe9eB=enhQ$ zE}VrmAzQ-S8^4R^X*36mse9G&?)=@fE=ogft%qqEOpR<8vFk5=-Ri1u2okxOU0{;O;M{tpDRf#Wdt?9X1SXw>%isfIr_mb*c`ZUa) z9m$ll=~ZHK8^6B=bNF4aP!o1iKLW{Tl0Q3eEc4ND^I=G9e!6m-&6Y}{lC)r1AU*XEenjT&TyW{*Efmp6Zn?!iFq!( z|Cb#G#|XY@O`qBs55#Y5W#-fHPR##Vy6d>FsrP^2BNR{&6)ZrU2#Ot8AorUYD7Jzf zIJ>)hNSCC5f;bRcP{2Usz8MA*cDM6mw;w;o*Zw`v`2DfRwzDf7%1~o=mw{&Jf!T**@9vtNM9~f1Et*LZ6(C^wH>S zxQvlu{Ve2iG6ME4Xbxe=0j_7ZfqY?IDB8)jpV2+-T7-Xd@~#tOK1#dU8{eb0aNq3O zB)+=@<}rMC8X2K~?5N-GrR`w+efeNN*Tg0{(|!ir!^ksF2 zQTzII+=I7`xNl3IvAJY_>7Jw5ie9;yeaeQeVzm;sjm)v&N=|d_b=dcJeKj_%Yg^3z zL3EQ>wsGxovad(?AGM>cI>3Js4CyTL=IB54#e5vi)+WEIdC|sf%kjyDFjq@LU+U}n zO)&CbJ{-nS1D_PrLA44~T2I$P^5kXovuktN_5uuh(|Insnf2B0HIj{Cb-$lJhvrVl zp5;X!yY?%ebfEKMK9k4s^K?I}E~<0o77f+2+$`8hZn+hjsj!@3yO)w6@C|FQ<|Jog$0xad72eFTx|5u&Pd0PjQvREdgx|?z6ZL^7$nA!wWW$Md z#;%%q1|0QbEccSR?D-S@lVm@Q{zAT4ouBwRytkMhiwP93Cq8G`#hR=uf z^lVhVjF->W)xv#on6F0aadEpCY!BOIqPejU#rvZze9gY^|A1tQr411N+4eDueD?C?-y)h&C9-ms5 zc?TiPMZ&#)bO3twG*$0H?JMMK=$Fx-`jY;fw-bl;$ht?apiPF#*W1~|?}@ob{Hxf_ za-FZjGn#ZLf1S*x+3-K)cwh3)kQa;CFfG^&=PX#xr1wsFvpL#OSLUGqQXBs#_rdWS z+58zlgue%D=fFJ#u8C-t!Y+>saW6+Yzn$KbSJ_@YH&jpJKWuN1aftE3`cop8ld1gF zoV*(OJF%Ib>>9G(<*)PHV{Hn98k+TFOR#HjgBpRR1NiyYjz5O`XH)a1qzB;9$`nFNopB~Tca(R>d;F@u&xQo3_==l=w=JNWP`sx{A5$-_- z1v;|d7muB5exv5RG1_bKUFckGO5{^4F6kIHe#D>NXR5wy5Z?RHACfa*Y>8ffD0X1u zE9}3VEn}S@zRIV`K=#PH@H{BKnEdwWme-8Kjyu$%Sl_SSwFwv&q3Lf6{v7Jsn`GSL zeE&d8?$>0EXsG@JJqvo(wPYHb-r^_z$i=<*)!4K-AAhR8og=n)y1qzzd)M*i*QghV z!Tue2$7)-P%n4{Vb?&%$mOqYXuQ4;|jQi6u)$z&bHh12mm-}|tM`-_&kJu7Fzz-XG z|MC;O#@>YdatQ2dZE=9(#qg+u)!NGmXsr$8Vqd<(^4*_3lW1ne$)Bnoh4dU2-y;H{yq5$lT0k z{lB<_&Nb!K3VbcuRiJsm-nd(SPmUNAtD_a;_%-VWoAS?tjev-N@l_*ShC?*tWc zpcn&-x|DR$rUs<@H>~;=)VFYZhdMXThWU8JZ|Np=-VdqyzNh0~>HC+A7w~pQ^QmKY z6ql3#kZ0waJBA^=Q=h1H*|Y2(AkXlcThM!nw$sV|1#hg)cprXWkWM69?JL5ZXAAmI(>~7m zsoEcR9PH{vzOgAa=9hiQy^4>;t$2j4Bj7)ZoU?4k!Q?glN$!U{&U?5o+ui;YIknVw z6F*LKZM^#QJ70$PcbjValb_CG=SVmwh-(}8+SJVL$lH$&^&$ADH~`PXVmjCOelvU< z*sg-(AUY0L8*a2MWoKLMBO9vs$)cykW2STOuV#H})%tz@yM0I3)tva0x>dg|(~rYA z5}q-}f5J3Hd?u)mTf;+d@i~7#hsOApUBxFCIKCO4LfzO1zHR8ZjsF@PPgh_6LjNRQ z>s{6Se|s1&Qj=TZd$FhA){z5$u`L={a=xklH@k`BCVa6TIT0UxK$o14#4gjGHe$pdw}w2@#=<;?d3qeF#id^t%){e>)!O;AU03J)d^i|y1!PF*KjTu z%JFcGB!3j%oXkCJ`cY;qEW7iGxp!ELOnQ=k7+kxdGk=VZ!vBu^_%9!A2gjl8I8D2I z{$i!EeIor^^NV?88gQ(G&zvrwYEJMbO#jf)K_7aMouwEJah*L`*V?Le_kGFg_qZ65 z3xBkkJo+16^*?(W=0Wy1JKxo{C!NnU?z1O)8=fX~hPA5jPUpttHI}!F`CtHBhO2i2HqpF_Wur=JXl^^p@ zJ(|_{&$wIaALXNDkCQ*|ll=_3C-qx>Gk%M_LGa#AkF~@Z|CR|NM4ejOl%s)dd zFTaxW2ji`WV;eG!2kGb92J&Aox_+a}*in9o_6B)&p6wp;KXZL9oNsEcGe^2qOje*B zUh~a(cBnIV3iTF8Ds8^G;aK z=QH`3v@!o@ThUwl`riLpPn+75-3WvJAHI_mcR}BsZ0p+DfQIT_gJPieX6AceiO)3t z+X~Nm_0{u%v>!V@#M5DwuaecAzr>!8@IU3a3t6+sVQ=*w)#=)dQ)#H-Z@}D0ULV&` zJ>w}~gW(&oATt@n*YdX9js2Z$i?rX3$Cl354nw(vINwU1c$AaHO}|K6I)Bst2Ak(N zd8j@2x_+@f^`6|_Om05J&yDGtYu^{X>)5pp+WW*Hf#o9pZE1U=q592x#J6P+SRY_x zBiA=4TkS}K4SUJKPz&d}b_&0cor+`ByrJ@4m?Kr|^y*$%cMtcS@rLNuz>}E=pDG@5 zHnv_A-Nde2$$s0WKSY0+hsmR22K=|4Q5 zZZN)(C;EM;QR#}F)q6kLM18VUH-~F`jh`QN{Uo}K*-=Nw-e)Q&*Q|xZIvdW;bkAbv z1=?Ga`?Ff9hJ^1=C7brNjwMc4z`uoS4{Ph}c$}>@-J1ko^NToyJ{;yhky@8N58H1I z=36jtNtbzYJ_YvQ>#FCzsXCS)Pu5B_-Q?S@cpif1GkkxN*$B@mX!$FrCtcI^ePDW? zj!*F2&&PMH!c>lQjg9fzXw|m3FFNrKYpKZ;agEjEdtFZ)cMwZ`E%OW{ndtlr{?TXC zKh@nu<~8bK(hQ~+aKBS0$6`0DUlf8&9BSWmqPso3ZOtFlclHoon5{K}7CA<$BPvs-)`e7cPEv09k zJXr49Z1OgTajNIi`h0p1S^8f34gPnvA7u;o2+u8y($?Z4|I5|X-?QQQ3HD|5&K1`! zdae5ZOg>F-kUQ7X{XU=E&;M##a#F4O58Z_SOEQX(W5+sv4gVOjK6d^c+1>T2KKTED zaiHtyl4r@#2U2xA#I0CbXH5m|er$ocDA3K&9&+k*w*O1t(PGxj^@r#UcIt1j+8ynN zc4u^ATIe^?b#fqed<+a~OEjv%xQ=cF{rX5)D<}uRXlyN}kh?mZukrb3>X5lb^r-Xs z^mO36lN$Us2JP|qH_=bk#Y7&Z@*+IH2=l^_SMibJ(HEY7={OyRJJ@qD`Oeesa_Me5 zFV?;$dC%LgVD~qC->Fu8izq*ztWoHQe_P5+#zt3 za_Lz8>Oiy)%JKcl5917M>2Hfx{lAocnaSC_u{_)u&BgrN#m1JhHD7KPaPsj?erQkw zRkgNYQKJajvz_ALjp=SVfn^um6po(?1kU5xJBbf=z}H>Q zx5M`rIkU74*7g>`7*Y)O_}NZzG$A$i~PMHsWsf%il0tzdY|`KIXRuf#E)-GOYcjH?hzG!1p0~38RI+^e1v*&ZZ)tkRJfmhx~AGscCG92aQe4dHbFKl{_t}S5s(b)Tp+`fanq2zWa ze@*px968(d(ysP}XH&(scvand2A4%5&aiHF47KtF^}~$Qmq9*CcmAP2SUcHJ!oVXW{8x=lOxWm}hS;8SeAb zj(p!A_Aa&u$==X4{XAcjpI=fxo~LIb45JoR??A^lv%d%bC44l;wXyQ&d-UOW+8%0} zd|m*V1J3eFz;&5_wD)gO+Gu?J;zG&BKBVl)64wf zxo%?a8ZUyaHC{Es3$(^>SUi6&K16p_eT6yP=NB)s|2FrmSMb5M^7b_Traa^^JKi{iBm&vWE#3-b|T zr#%}0UrWBZ5Y~Bo@DdsLk|*H%k<8X~ZsuNpG9Bt=H9qvidnew{*t8ekIcR3$y%$zB zAj}=IwX8Xr=cZk1)}#@*V}%p ztA3lGEvIjKgL?^>-ddFx$$WA*5G&`&*Z8l5`D=KluM)IZg`t)Qe(Yve1TSzvTk)X-C#oWN(0eDSWfxHup?M zkuyX7L~MOYp6*Ege{9~dD*u72C)|6ZABL`vZ69*flIr>TxA^*y_ZXeOvR@61@x@m; zA0!@fw)laL8{k$qvPW%iqnUz_&S)yUW5~N2PBNoL^smqVAMnY1{yvePTnq0!X6vD! z<@%+zgV}L3nSZgfo&K>AdB%Xm+E$k1U#b1Bnl&kYza4Kxj`jaE?w5mclfPC{DZa~_;tP}he~5fm@mdRI)8~DjQi=vaLjgoFh3g8%KOo;XKy{I{9WwT z{d^!@d>4s(sB7^f_S>*c{fLbdvH5Y-RAJ#Ov;wzA+pt?Y`kmoIMHvCpUD@;v>vvc@20Zl6#GYE?(h29 zaBOdzgYHzkC%g6teQ)s{9pU|-WC1+q)VybaM?O{WKi@+aKa{u0gD1uOeLO$#zj)=H z(B2ALd-gVA+h%IbGPKvwv9|Uuzr=Z{H%r;^A2N?(>&5h)M^DI+cJghQYa^XsfOgMSeKqN(?TC86Qzd^QzR-6! z;@hLi9wqi_M5>mD`;>ABn@@n{RkA)No4l+Q-G9o})#1v>c#@rald-Suac%q+?jgee zz{mPl*0xrC|0mq@rZ2#*jwbENoMJzpj)q0mH$w7T8diN5<$nIVP+XhT`|UM+@}7J|HtNy#SV0`E$>41Z|r>^ z@3-)@5W0sOs_)~3xWuqW z)@G~ca!<2ge@~yJ{~aU{E~IZ~GGjI#1oJuC29vdb{6%oh zA!kNI^`G+DMfA(<XuX8L^8M;>eo9J$l+np5ZR zpqU1@zMJ$W;}FLS9P?Asi;QE<8$VxEy%QN9?%EpgvM*ZW3F8zwP4TQt$N$LoUP|0w zn;fj}b;#4)xVIkz7Y-OV{3p$5;@4gOZyA#Og#jhOSq|=yZO(xmJzc;rT+| zAJ3Nbp2*f|Y_R?xekYgGS3FDKXgKE3u@0Kt`AB&-Q(S}p*2HUk$WD?Q!`b>Vp7rT` z%XRr1pG=o|cCi(IhW8k@)tl@Bf$e!G_PGWFL&HKBqO=H`C`JpdajcV?( zn4HLV^;kl{i{*|tY^d$nut9%KI;lCM9X|oHF(|zerhoa&J#BFttPy&3FE&4jT8C?Re{p^$-uW(z5oJ}lOU`$;<9R=gr-Zls@IGC1>* zwy<6^nXm3A-&{9)294TMnA69-;gnAWeARf5wkT{bp*tRy`}NP;$?c0yAJ0#-EmlYG zg6&K^yTSGo>@CFbd%D6s%bw_a;@`@~Z~3Lpjf2^n`qw4!{zUH=bc$v8mT+E@=^e`y zf831BYuGub=01-d#)rJGacrFSLF7!pFK?r%Y_aYTp2g)y)m7i^%;i?n3GZIypGsHg z8?EK>Vf+ba-q`*^^`Q;FeFa-1KE6(#-0S#bya$pw!0{J!c?TdJgf3S*?}Q=r`v$TP zQA;*v?-1X$SqGjE(R8QF93YIT*=>$*b)Bu@9geWR8+4Sv+uWyxHIvY1i_`JFRp-0P zYDhoWzJ_Bf*VKeC=L&1!>36ONTbF8I7tQvzt@Yvm)80{gJLjQ)^@PhDA??8iF)J6L z|Htt+{J@61vtxargg-gXxje6)EsfDOPJiY9@N6Q#ySD0kpK4*2k=cX~^zmddpIilJ z9bGGJTflb(*`r}*OQeq$_rY^NIcxK=97$X7WsG+#^6!FI4i#^pTZq2D_8u^v=zM#0 z^Xko4>b*;83-xfKJ~xg34o9;&j4#9cGQNV&R&cGGRR5tE*0v+h1H+n3vR5riHXvuD zw#I1HfcQAa>QS;UyY_CVzA;)o+j~`e;B8B;Tu9f|e-46WBV#~cZO4k$(KhxZePBVC z+=rf?EXWEuGO^Axe7sNbL72ZDi7)v70JJZ=K1tqPfagfZU!hZrizawdxbD`TqVJ>+ zeCc|P+$-T*X3o-;jE!p5Z#%<#A7Q?f%_m>KjeoAWmnQ30_Kii;%{y%T6Q1i8^Z4ov z*Pi3IN7#~)cMPn5dpG?>G-`Ah_riT_d8&5(Fc-V@FZpx_o!{ddDQ*w2_i1(y7mJr` z-X(^43Lfix$;b89Th!7PkgYxu4sM|_i==@F;6D}Sgf;XX6(Pmewk^Iy@;*fzbP zdXF@$CFZZtd4u!W`agTZ_kFAPxx^uZJv)rfP4ts1#ex3tEHY`K77c{!c=Y|fPje-F z<}k(WWIYsWLCyQ0)=S3GHw?BP@SjZA75wodAF?NF9ehKVJj-Hsen-Zup^ZIs=P-u) zp3)cob0^h@vqgBl|C4uyL0t^@IdNll4Tn?ShcUER2*YSPOTN&bvb)JX2JL73w+EUx z#Oh%A)rt)F9_2>t!x#J$);7cQoI;F?S!BbR@8Vihv>{)n@zYx{bcf|~Ix;!EvG%v| zo=eVPnCG$m0zQ5i-Gc7bdkpE;?ALG7apcjLOoQXU_>Z(djVw8r*0bSJZEM>Wi0{|7 zK8vebTm9yy8~@9j_3qs@Yx?=PJVO6?k4*ZDi}?_5SQ9Aa zT{5gzeOE8pkNtPC+4X8H+T6YcnOD`K^eQrbmj@ft(+B@3{Zj2ne$*$&*Q#d~c}sX+ zgKeb!S!5na|6w+EhUY)Y_H0&D@?*s4BshYP{)3-ANgKYH47dD^y4%02y)_%!!Mt5f zPQdyJA3vcVO+tSN{MVo}jzznY%~#p!WDZ>HH_g4Q#neSPyt%n{{4^T}82=t8Pp;&@ z>!)y}H;W0K>G|-(lWYs?Alv@NgkAZR9qAZ6eHT^lN``MvhV`R#B3d;lynmNp@3=<) zboVvux#oS_Y$x-VE6^TH*9cfgz}f}=7j37pLEfZ|(7MMgr;6>{@`V2M#@ec9Xs?mk z4$nw9URhwhgN??#gv|T~HtJXDbg~A@qdOO=XZ$mo-oyBQe|~6;#(X3`)3~w3`rx}{ zcZXwlZSpq1#MOfmM?i?Nzjg#P|3S#$B3;}^5oHyehWUq8nyC&N2A z*<^HI@U3w;TAS=!JWtwz+z0sOQoQaFOLOvM2)?)Kt9zH^HGJ!kx3K1(POO%~YJMGs zzTSe4F8nx2j;&_P&`hjf^&1C$HEqu)VNXWhf$i2NlbhIeuj5_d{saGiU^@nl{15Y$ z;&#Vu%=SgIz}Cul&{xRM^YN(xh4CpJUR$+(zZ}N>V0(d$ztPLL$=Up{ruc-|4WqxS zI{Q7JicQf6ul^8u?p0g|>mxAGmH&iiHS@6d`9Y4wd>BoJ=LGWC(zZQJfAWKVSA9$W zCi?G#@g`e;ZR-`)w|b&Y$!uIyYbIe%lum_Loe1mh;aNd==27ei+bi;A2%B~$^9OkN zGpwf;^>U+b74FhI2*m{0wje*$Lp3IO#(9|kAK;qY$oMMWhTKi~U}HXh#QAgR^}Y0c zZN{nu_Tpvd=ZbSL`w!gv@Oc#Cs&-}l=`7Ix%5MAU05-{)WD0+7Qt$sA>sLKv8f5-K zc5*BmKc(k0*G8kAW`8c4g?yzhMCOx;c}}>8kH00)T1>P=&HF^#CFsRH*{i{CztOi~ z>k#oDq>eV=-5#zTgAe7OXH41GFnPw5?ahYu*uMc8!KNMYJ&9IK!t?m5PG9C)D{{NY z%~#+#na=;v6~Qrz%sKoL`o(B;w&&!$5$Xu7qF^=cU<1qifjK8g& zlyV~4BgDn|k?MqgP(BWi7^gq7`69NdRq?Jcn>!ZQlfOj#X27y7J;C-PoNuCD^yX7z zMI<+4zD(XH_fxrWqhm2D=8Absd~&WB!G?@Y&%njDP^)wIg^|7+))lKY%YW(X0{bTo zQNAU<^U*%u;5#U2u7^*b2{9_zAD$cK6Y0GI%|Lcu%AVcedL7+5us!5jjoyx8as-)Q zqE|PgpV{VJ>+%|L-$VP}WVMG)-4FACVjFaK(K8-hW4cH3fAH@h#}Dh{m&sZEC#FBV zuM+0i>Hq4hZ$p;av(M3wH}{<^XLjU=N&1)mobHaNFP;%F&2zpb+ArDvi0j?#FDGYh zdHw`h>%gF&Mfz>FcTa0nY@$DJZ?A?V9kt)Uzq`=?spFJv@hZr?`%4HI~McsACh5?oHnUd&kB;&(Vjx?(b_geyP;Zj z2>-6mfAiphF`WrpV|eyOEAHiRewIU-+7N!*nT&vEG&->lbIo)ZJ~0jXkew>#DP3df z-Awy!4SwrQo;h8)KujKh>0-P`qph(;%}Q^i2VKFIFb@plLDZL?cJe^IN*;8)hIlQ2 z^&)Xx22%rhxAVh2WWOh8kHhcTZGI2mKS*{nI?f;`!oNUY`i<;|==(o0KZwqgYt?^| zB%$wEM=9z;G zGF~KWGK?Rg;rpzgJ~oIAf5B$WJN}EW-w{tWDEb8dHE^zA#|z>*pIv-he$W4pp*e$% z^KD-_m$S*;+V+O`9CBaq?qO5-db=L__3di>T>M+ny)d-H*^(W*i2dg5y#-GrZCA5F zzGPd=laKMpc>^@d zoj*-)EBl_}-o)N}&BYM5Y|Nj(lJ_yX&+r^-`$FD-NdD_`a69J%`R5kc^o^MAa6eQ0 zY%kWKmgTSV&4qB9&!*xXU1-}Dj+e>3pZu^6Z2q4O#d8O}BglC~`=;!oKR>@#y-yM5 z?%5Hw>YgHP!Ip=`;&OFhiTt?&{Tnd+m#1>2A{r_oQQrJyLMvt8f;=;vWEQW zz`xtl`;)e_@l7S?2ixBDp5d@7*swY~*Jsl>`aaV?nvKS8E35 z7R7U9uE$^MW>^ad&(yP4`pT7bsJWrWW_(({!Ty{KwKcKUoSvcH_9JUe*Z;*M*UDGP z3Vk*v?|68xf^R;)mfG6dxx@f62mTYXn~9@#HBUz5(i?R&~q^PKo4W7iFI zji^=M0?U`->jY01zTXZ{Cw6X%X1v(wH|fW4*OR#qf40E?Xw7_IoZoO9d>{wHdxMGj zf4N2-edhL^`F)gQ*NdLy^F?ui_($-6BEMci`!t?Vi(X-yJk1xlwosfOtX1pr`K>U# zN&b3l>(8(Ep&4tQ(bBloM_X-?+GTDmw?cd}at+wVR@XnFYYBV<(4WGd<=W+K{2aPg zh~u%Q`sr;SV(^*^qrtz^uL%AED#F%p50fZ~ku%Q5-2>XOg!~Eh~>Y%>SeJ0B-zx8URJ5WDh3#~sc8oAS+iu&rD8#s}YyqkAk`IhwvjuD)6r+rxY9VI8A% zE&T6D@k4FZ{mNc=*_?HUuSbPbe_XuJ&J6?fqbFywCXP7k! z{z+G&H8)A+b#|zIdpH}=yvJ_!AfCpi*=)Oyu2$@^_MRCl(xHx@WlI~h-}2`#ba-Z5 zIxp^l@jN(Qv7co71x;r@Z3k;-Ilo+9HI{e2dyqUv&)W3dYyT(O@Lt|iYSlgR;xu^a z%ywXxnpifcXAm5nY|pc=4v*XkYiPN((;|{*i;T;1Ge1^b>+o#kSiFkW;QfIe85zL` zANH)~Q)MH3av|KS#-EUNyBwc_mJKC8=A-edlVt&~KAArXtGb?tKL5L1TuRpJaCc?X z&HOqXUNs@S2Nl-o(=bo##jl6gs&6vI`cc~2aUc9m*wNkCyA0Mx=~EM;KgH=-J~uBY zx7BtK`X|}1E`|33<154oe|f!j{!HJZuNz;_^_#?YaD7YW@#NRjzn^^qpZR|_z}OSB z(YPI1bB``%;|XXcyMA53OrAQO-wT7WvAl)sS@qTbWfTu-(Ta?V{WY|B%iri`OCm>NzE94yU&0>;+fQQqNcJ4-ct6-*q$jNDJxIqM+V!pQ z4oWK5(=}jf)eyz^iPH!er}Ft2dK+NWf3n@tw6VS8xU1OFAHF3L>!mmujvi; zW7!B}(vvNBFIe@z=SJzm2|8m)G|=@Ku1!`mc7m&;emI>EhV$7Td~&sX31bzz(?xXibvn4d>R-`N zIvdrD%kb?6!|+vgC!b2@MR?^xG~Ol$@|)nHoCNfhBV#}~JI~wOYS=lW0WHukIhW8G<7m?kH?g`G%qf6Z5SJ5qEr+byWDZ7`- zhjqyK$Tj&>d|Bta!*sQl|L2jhTz;=L(*KULduIyMor$LYTcp6}Qi>dOo= z=nHE=DpPY?QfG$X$LfO z#9{|_?9K=C=y{CX`Rv$M+s^3Ku~2u?&-g^#(n;`{W2Bvp`Frv8`HQRH)P^}ju`66{ z>DrZixWe~mvn?E}Be8jW5#~^X*}GU?&EU^(UAu#g;-9~)CSCxGnwiMA;vhCnr2AXX zC&W14mThz->%$^mNo;<$65mAj&#|v3=U96-<^A;Au>L=p{3F>N^6HeDbzbN4xtfP; zMaTK%zQPYf(Jat++*3p+8>?HOQ_rGb;cn63nG2iXkI7DNtFPAHs`oq8(z1&j~)3&^D9Y`S?FzhjB9(^Xl36_Ut&*@ecesgdJfFX${9$a{Cb1c7t^pEb3!; zCYOp=V*IJ@S4Q&RTznsh%i6W--TGu(c6Wg3DtZRuC9@nr|9xos!>fOmgNzeR<#Bs9 ze}VoL_B>c;&5#e9)~fGkW%_K{0*;~h@37s2R^G>AkX-;*S?{+c<`{CJoFT54!*rAD zZP}@R<>Tmj7>-+D=Fen!+D{lKmqX@Ytf1>f;Be)YL z`5JluC)angjxX zTJ;;I@GgD143wTJ>G7_*%YSLDzKlKFZ&Z@!y%w*^_OgUrwjv z(eA!Oie9XuzhJwb%oyhGWbTj8+$}kK9ckgKyX$ewSKI;;+8&oI|Ghf2ffe`KjOkhTjsFH5r4-z-|Zo5E&l!)&l>8?X6Pp1y+i)bKqD{9TWi&OBCs5O5rs@5*UJ!9lv zwwR}Hz7ErM=n8u48dkk~sBh(0p*L>`zt@a!k`G}H@oCMwx8l%&tv9 zT6&A~Z`pH~ZBNHRc279OFZ1jtsfXP+lbvdu6@fMwzECr(eI! zN7Pom2lTv{J5S!T4|9W!`0{$&T6C)E`B>O~a__ja^M3MY4|?wCsg5|7r|FP-&kUca z)@)-nw(KDuYH}oo;T^|l0u0uj%E!f}KOCW!jZ_DwvOD}gW2`MayE@W5@g;IMhPwmI z>TLWF8CTf%WTUYwJVOiX|4}Ehj)(0?v~_Ii*RbmS(50}x7VyE^oDHAz(Zl?AAzSCL zaV@&rkT;3$XKd)hvySv9d|hkR^V^~=+C%tf3>klGyPw}yp!p8{DA(jmv7__Ra9@LF zn)Bb(DYY>nd(t5Yi%j7H@06UA8K$9(f$fMX5qVzo>R&EO8W%jU# zIvn2r$U?s13u~v*FXsI_lYOIFtDdFqtCG#(zn%Vr=`y#;wuL&hmS|pdCo`Hd^Y~6{Y(7pFITgTY^a`fg?F-I`5gQmeMrZ~#`=5Z%2*iXLi{=z zA!hPEUg3V}5Bnpv@67kFiq$*%_TPNJ1`M%lx6-wbTCow!Je7XYG-|Bov#Qql8 zg8egWd{aKyz51`?09p0isfvQvtith zukCJbuCMJ0&jjs_w9AROHQ)3i?_ct+r=vL?VqWZQ%z2pH_Iz|VeADc&fq(A?YtQoY zEU}-5uOI)M&nEpRY0aN|K3qL)ud%Oas=Wb?*k<}|nz{b0{qyX2lbg9^}GS()?xSXz_i>$&}lE}?sExhujT$dcRF6!#q5$vDL zp1zL9>-*=p-Zx-Yd&68soWr_MzMQ^WY(w!GXA*d#1IZtwmTyV!Ft*=j&o4zr#?`jp zV6x5|)<>$jR}Z|`yM79p`bByVn#bVO$1`<1?twpoBa9p2S?WOc?M2thx>f&g)(3AF z*UWRmdqZJNOoQ*vgZq#A>KiP@0CLYFM?NKTAyb#Lh34Kbkb6#@Z}6y3%g7u`PKjm$ z`UUKG-ga+|&&7EdedK2|Z12jiu>KE2T;Oq!6z(Ns{P|w+&x7MB^Xj>PbKf7e}-S>ShTkDdUT=oxQ{D3!?GLM|KJbysY6A-?$tYX z)$bF;HJVJ`di*jM{gyBcCi@0<-Hz`;`S&Eg+ZL%I{PhXDpJVG|j$fnaOgR?T(yq}q z4By+ZT!p?PIhm~~ycg2_9=z)BAzgn75bPlQ$dv$FTEJ80*Uh z{%{=66N`c9ZX>f7d5^e$gII4)pZ*=z&e8~t_x$tMTtBmJ)mRbcEVmms_&(=@(tJI< zPmoX4|BT7;Gr!_>`-+aF>`42Qy?}{Y5^Y0^YtjD&Tz6JJs z%jv6K-w^#&$7`6=Hp3(C0e5EXOZ1oQ4%gmtE|1Ia*~-Rvv~g{e`>FrY&5o#*>&E2t zD71Ig{DxEg_$KJoU)OD@{y!udidKyaYo+CQG<&k?Lb_d#4tBn^WBn+)fZnU&KeAr^ zRJT47D|wf%gXXCQ|Fg?(I5Xp1WPVc4bl$`H*XZuUa}nEKgmpV|pC#uQGR3Ui$apDk zC7AHrlg=}qG^S|MBtNsIFJZukZpHAm+vL2`B zUAZOR`N`sT_Dxz^P2&4Ct=^YD&X_`l2e9XY=heDW;Bx|}bjJ;maBSg)`@ zsxAu8Wm9qsIgu?zyNIl7#h1+VJ92v2LS0)%_uJ^-r@Nl7k3uI8ve9VY!9SBtC!$*) z2K6QZ?5?kmi*npn&U_MG0fSw=mxQ;rE6pGe#cM!?7weV z_1npP$y95SP2pOXo(Xl;GqPk3zif==d^ps|@Efe64ZZuS4a4nkA#WwVmtCJhUOV4n zdxRY!r}xJv1dc|ovqRE`s({A;dx8c zUX8u3-v2B%$TRZW;duuCT=w*o_iu>X-T`-zMaDDm?27&!F}_0EcE<8U`JfQ%%jmuW zZz|8$s`>UQetA`N#eYtN_XXKg$KP@|eG1<3{A4^0_kmeoG`GRkge`BPYfZ;KbYJcG zG_h+#cDTp>3LpMlUq~KCJCM)l3h@ii4?`U&*K(|1gzp6uqv`k`pAJ=(j zg)IH0gsBwgWD!i(h|;lq)s&peU^oa+Pmp)2z4%3B#ZS_y=7#&$Y7Kcm{;DH?pjzA@R%h_z z4A}Nq6vh9r`BC?=J1Wj2`N&M=*CI~>nkepZ*GR`hpq{v3S2qiKO>zdejEY}7Y{{&)^uf8qOE zOy>Cyk!5?V`reKFN`Ke(n(OL#etEt5Cp*s4_L1Xe4XfUro$C5hn673MKW9&o^^|dG zSNeCLZ}Ot*yQbkC@kqYqn~2}m=r>?r54N`9lWXihVgH8c#i(4$|D$0%o4#MP%Y`(d z^DCH)_3>47+)%52FPrPf+3~Qb+vR9;gSYXRbLG9r>O`mSSf}g`^S>}(Ot+}RM@E<< zjwWM5jV#ysJ3ojX^20hps3*w_XnqoVeZCxkP9KP#MRy_0uduhV^POtuZ0x2#?P9!j zT%G~D{t$i-k@eQT5gzlP{C>Idp;+L{w=~~=lbkoq;f6ZDQm*bTXXSj^7EcrLk@MBN z>+QwyQ!)yi=Ff7nPp7;A{^6w4;$YS!(Q^@V>bUwwtOhYutolcXBb69 z#|kx|zx^HTcpo-3D7}F1I)}AwG&kcr&wOVam`0K#pR;f2Z(dvVJ9_sIVa+tG;pG{< z-|*?JFsKpPGB&Q3L=$%c5{0lh|uOpWG;FDkJa{B8X zf1}=9Zr=)@xTg9{@qcvnv;P3!2!1yP7QvriqL~BV$NbS<4UmJ`MQp{F{a)vH7wmb8 z-xib8gdM_zI-#&-? zbNg@bFVTh8Jd+)t35T{~g6C^;I~}I|3Vdp65`ObVXSoo*ZP>lJYrC-Z z&^l|@wr1M5hVO3nJYheTu9Pl)Dr@ODy!SPhtnTvoAv(y2ZehcqUe$j{W=-ihQrpL9 zpL2h|lfHTe9nI;Sjc+q}hw#4~DQk7=sq5>TL+prWBpgS$_L;nn7W+?ea`!;5=4X@8 zm;7`Xov=pQSFNSNd^BAfiorVeYIbR>Xs#vebN0VQPl(rYGQK14TJr8fdzkB){Sx>( z(KXU_bGKFVO7@2N?Bys|n#-EZGBW{Ix-iRNoHaYj)-Lq6_owEAgtonOYduhT~Hjs_*|4Q^@_D zjHPHhiOU4nrm}H0x?iQ|M?T-2j05~7 z^BSt>Nbx7+yv6<#8?2kac%nYmTwD&ouMbA&;%Nrk2lQ@W+gzJ^6u+)rZo~u0R*U0l zuJy!o4jY~pC$%h3T$={>31q)d&&}k#&3_~KvztD(u6{>$aU)rWYyX~%F3!Klvpt*d zb-s12dS5BLx0ikl^AmitMJ>w6Oxqa8;LJC(&9{ApzOgy`T=I6IOTQ0mh2c3`IZ)em zWCh<^vq&!I%g-E(VSYK@wOsGTcj|e58#|8UORBPDVeVF~-O1gh)aGU z{!wtx*%v^A0sCyJjMl);=GiuVBd z6#8R=b|M<~$MPU~7Y_G=;hAzAVsaf?c=HWc=}6>tSgVX*!8=uLyn=s6Ili3yVPxMd zAK#Z#v*4;@-(#?Lx9`G^@Aywl3x1B)YcP&Gf0o|Q?U%Ce1G4UO+!c;D^qpPEdy_p& z@a$>3k4)ozxTgxgWy#f^bO-H=;A{e83w9hw&tyDnlY6PU*O@)?BOy1t$@VsxVW{i(qdyRTf3m08+L3*jIsMVv?`m-0>$m3eAl+L|)yvmMTo;FE zrM&2Z|5!e`hP|)jxe)&Y{4s(}VjR8$6}M;Cfn@PTyc4`H)K~Aum8-L747p^4_49Nu zx=uBAo}uqftyRC>EA)j_?#E4y3r{#U56QMC>zz8!kKp-}|5~&8Wwy<*KL@T`*zTSw z|Hn0BZ|WW`4SnZA=ReW;tn2&}y{5hnvPT!5njcB&u1|M~ETYm_3qg2DPE_{ADzP0(_4?OqC znNf0JhT|LQ*vhs0=)MVkPd+(-zQJOzEnP_`|0I*hFi*+f!uPp0zDs8qd*wrRJim;t zRqvTr_pPJFv_?iF_I-nHeORs(n;qdxwacS?YkHdS_b_;OBV#`Q>_~=OD-Xfrc}qM5 z&O#htv+bhq;7xx<|2-Lp^HB`*YL0t8Sv?<4UJ{oZoKGNMEsa*tac!_?Q8kB+^rf`3 zzVoA)U8DUD`c6l0>?x0dbw2-066aIvs_(OexktHnoqNf})i>+HJh{9LZ(D8s`FtDK zr@-@o`0q`Q_wbSx;@=pqOUXWmEoxvS*UN=+vaj}~ct^tUH(Mt1iE*>|%O_xyhMsE8m@NG!nhedi{>S|#5bKJw(>JM#Qu4FPosUw`DXH~o_^nL z${G|azHBx5d?MfG;vsg? z0y6lxcn6+8=@G|#9-4Oa$f00&eiYg4j@!Um&j;H({uvf{s`se*H@b_=A#8YwU+UR> z8T=C*FSLJ~o-uNDI$ivnPUD*c=o{eJ{JC76Jol>UO7ixF;c{E3f9t_`oW3vz&EfE$ z#J&aeZsK12FMaL@^Vnr#^mKjo9za;v4QqR0JuQ6<&n{}lV0zXeM;znG_5eJCjW_Z< zzh0jRa!0biT~F^MsmE{?jo5Ra>rEYZb<9tBM|O8KmV2I-o&dLgSl!c|Nxpl6{6KPd zL;o!-Swq!ls=hFp%wysHh7ZnU%Mw@~;@6hwH)H3Md@@=rhdDmU@$-(midO?2|3mXh zeRW?`_M+z;+p}cB9?f%owAf_MpR_JHj?EqA$m1|{(!QMUr=$DK^$%QY-eBE9e2gvG z2-|XcCN=nNFP)9m|M%ov$>u%y;lc*@F!YLV`3&2;i08(zya?A5Xx^0{Y%Dfq(}mjg zhitUt|1PS&)f#?3oyBVWZS?MjuB$xu9%HC25!<66%NljmAJ)}i_#1|9^vjuYA?z(- zJ(P@P^zTl88-727-ZSWF>e@zP@ezH;;B8`4Hww=_;uFxA>lf$Jd5hSFoa+F?{^rgb zYI_0gbM^icoBl_%-$_nem^#6+CSJbI`|TnWOC@85wh)_# z7gfIt4fm(nDYlld_GE{cr}}R6H2i4Gm=Dy5a&6Gxperpcsi3Vc~J6Ex*>Jy?u*8Ps(Azyuq{(}9BdcO&R zX9S!lh}}1Qa0Y#w@Yztf#3h0)ynCAsqU&QAH*$Wi?MSj0lJ|&xBla1?6Ic?qhB-#? zZPL2VH~d_Gfv!KrVsHIa9V@!i_n_a39>))Z$yy!#qk=(oM$ItAaAuH9l&@6vVgeF)1BBBjrU8a>Tb>z%Dry-9^S7^j_fjIC$1V^MLIeahpQNZRqP=zX!&_ zWdBbrV)FF4_+fbV;wyIN`gb9>%dW8Z=hxQuZ_9N#oKCM`4Al_8rHsm$IXWwwdIFxyTFT zhrBq-wm-kXlN?IMh47aAZ=R7H!j1!s2WuK5Zs#lgH@Ts~e~XeaMl3gG$HC6YE&H=O z$Y>T=N5;3}Bp9E-FJF?y&hJ-~Lk+l2-?HYPk7w7LwiCr`f3;A|vgLT@^mO0j z`gZI)+qMCGBiYswHuWkRhIUe2^{gxv$7nuW6XAUu%@Fp%8js=E#^wko!7azaI%%GX z+Z!VC!2e$5X!j`BL5qolZ8Q<+b;uo^l z(pvUj-8=di&c>g8uB75;l(8pp|s+DO>-WFu7iC%7JQ^{=47guXzV?Kcl zPiGQqirH@P{vi+dS0@795HxC0csDeq zsC*uuHFdlVdv>(diNhy+_<#78lXD<>ztgiieS8{y9%4xU7UDx@HUO`8>kG9poy~@c zaCSv^zWoSzPuRWs-}h?m>uqw~(`GNpo4;MxSCiJkF1Y%!VO`_a3C`t167qLFKHnFn zFX;J|o-hs%tgq(vV)K*%HF!RURc@pc z*s%$_KP3C0I&*6B7vtF;Z9jCMh;ujmav|hJ^qTt674`@4=_}ch_D?tXjYltQsq7t$ z?>Kxr)znAZrOxGZ{uH^DPdU;T`%Zsgoghw-qKm(g{6VcbhndHf(*FOc&O9n;v`T6|WD`2y{?Yafnx zUp`gu;vLn?L3Q3SCcBQ#K`-jjN*df$I$&F`i0 zeMI)beC7FQ^$n^=>Q;@(eZ}D>?OWh!LC+`{d%(Jt?N+vohhb~_&bIH&uD$GMv!|)H z7x?@uW7RbLa78WY2zJY}khA5R_8nj{ZdUWjko(%=XUVzNzK`n*`Oik)i=MuBF0a>O zmu~^&YugVJ?_MxoiZbSX_=*K6?_aZXVxo}=dwj4>-nRI%{A$q^F zp9kN4d?4ov{XV(W*tv(;e}!%w*;nCt#_jwnrB^4|Y$(KYtaT(l{O+ z3#)vK$q(xo`9l7h;Jlgr3VOXWoTsjJp-(@~X5(RZLQeVz-KRQ!R1SRy_vU2pX4?m? zKAiWe6GJrHkb51vJ?lMt;wv%AwkLC-c>N3GJi6LC{}KHper`_37TOo%+e@9h9FBYG z8*5`v`<%s^320cm|*D;QFnOzlGcQRb0V8`_{}AtW$N+ z-ck*0to;vjRQVhJJ0qF}2W+L-#l6M)&pPi!J7-^UKbw}TF?<%@|0%YqS??9sPsx8? zKJ3OmbCY}%wZDOmkfY1cOd``9B5|)$Os-Y$n&qLc%ZaoQpF`k2L`;X{Uq%-k$&2K5 zgyCxE53%KSxsSdaroWGsN8j-k{mCHw|409Wbc~V%_4LX4d=lG!LjMan?a;mm`yhMo zn}>I5LO$0yUrQVwq^B#L&ycq!xo5hjZf4_b=ej0t zY3LjK!|{u@$#920JXfB{_2P5-!f$gH!SKfaW9hEruBf&?fR6%#2%?}^prc5r*dhkc zVFbIe+cB}PiH$?IG$Q4wq@p6Ii0~W-5f!^T#_o=**LuJE@cuEMnb~{AZ^d4FPnf9f)i(t24d=hdDxSBY>t_GF_TBKx z^P(x-*4V|Hct+UP=FUX zIXjT|0{&DS&1d$2!8ehw?&Rkm#Nbo@gCX)< zB(eUFBYu-l<*Rb;GQ8J#Z}BI5=FU74<2UJXe=a+nKh%Th-OB23L~KN+I$T~U7VblY z=WGSt$yB*9kqx8RXG}zG@mm*U-n$Fy|I&Sh^b>N}R}8JNg?~d1FXP)8#?eW}vKkbw z5p!`%X0b`Wm9S;TOKwai8*1N%6HKQHFl+T25H@=;$ z-&~qBB6EATtxqmoVf~c8WBd=H_XOKpWM9BXAHZnt%h!Ny8NP&Fdy`?@g=Yb&e9Jx( zzZ)vGdp^;7j(68@t)E^*&J)fjk|oEJFW`R*)_HW!L31~mayNgKPi`{~&LV3uA6`iI z?sP4}lW2RL{+%kd>)d2L`=9YO)qe(g)-aiC>S8Wip4E4i_Kvn^;F;xIZs$v3)}B3N z|AAcaOut;^{CK(|HiofryYsAC`-WN8)m+<}Z5N31HvG~DR(2Gv&={wgoR6Q>wh0{k z9j+fU*E?k=K4(u!X9`PNz}=Nhb-7?$On%X~zV_|FVn6YiXsq1Ty_PTOw)(oGxzqlC z;=hjl8Wry|m~*>nH*S(va_}|da0BgPmCMt_53vmxo)6!S&j2tBaCL?L8|ijHfuvS!zi-9Nkmwv(NfFA7?)kj^DMP3d>D& z8F$ebxO>spRqTzM;_gcAzCzkX+jRCe;HzD2v$bdB&2-$VF3NTzv!NWmna|!MvnAaJ z!pHYf3vEy6e;@Yd?0_#jui_mV_K+1{!?)rXFy*uL!LJi$8*3m!v76@+N0*S0dy7k-qAL?D%NC8_(`+Ah&xdg;jCsBJL;HWoovRkQ*HK)Jr)RzA31~}m!usTN6NjbfTJY0LWSbkx zPvu@WwD*%GM+##so{Yx)QM5tRsapGHXx7p32l(MkPUGXQXqw5jbJ1M@uel@d2U9(r z!MC5#`(>RvTB&_wC;Vqa@($Vt#_HE-8uS>>FMlcj7muEP84(G>Sk?xZ(` zV`F$rwy8(yx$rEeLw(EoR$QBCLtnOpUyi1I(Jz9pg}U~fzH$6ZO=h>(>N4Lk4 zH7SCBUa-lH;&HT|=@vujUBmu7vi3)R7z}%nxfNY}627~dvM>G~&AV(hZsO(a4LQip zJW($fYTE?;7&!k+|1DxXo&TnwV|Q+STzan}oo_pfU5)VZOMDI4SHXU@8XElHlHP?d z42EAWrhZo+Kgn0WI=_nC@L##ZVFa-OhSwd;Vf?Iv%E<(Y;@1+}gbJ8%@>L zgdHQ$o{MLTFox*f8s3g@40UYH7`_9Qe+BoUFs~4ob?A^Y`Qc(`3};Wkc`A&zYF|!A z6WfDg_ps~c*Wi1R9P!K5uA+hVb@6n^YrRl5!ZX!*?)(XTbJ4D4eYS?<+sXY5)+5dN zFeh!~NmsJvb$YtZcnPuL+#=GLbi=6wdRhqMVB&^0# zb_NVh@qMTUOe0sEvdy(^#~w8yH$J1qbjgS0XtF1Z`A6udv#}lB-|+|Aqx1RfF}z|{ z`+wA(jQI$@wsd}|?|#0h!ZDVdb=CHVt%E~-Z%0lT$6u+f2RiOd<}UO$t5{2t>-Sj6 z%%A53B<7*+?-f%9* zi}U&DI5Oo@Sa)R`i{WAH8Ki9q?6c4`#=lQp?HVmSx5~n`Kr8;+2Ik|*+JIdfqK#}5 z^oO|5F&_NJHGGdX@1$)qIZx10hjtoFz5`IsC1arNaJEdTxKD1Z4))CG7yfvbfA*pG zzhd!*4PUr6%^naZ@7QEp;4xoBH;^6HQPbIR8+vig)Pzi~h2QVQ=W3tm_%SpgPvmpR z-RKzicJ{4!uTnd^qxrD@0n46f)ZeT^w{acTg_-B^$z*yTW4ruLzan>l^KQmc zKQrFHt@z097+J6J&2gtol42{{MpZGMT|8}w-Mk7bU{1)Ev&EkN7IgZQjR z*7bo#{)kt8qT|Le&ZhG*d~&joFOhjJc}1JGX!ajISR&r=mJ{ik!!~nWxNgl}*Ju1> z=D+aXZaUZ)c#FS4%*+5-O% z=wH&`h|HtVwB!T!gzKVcM>xiiMQ3>TsdxnKyLiY;%?IhZ>^P%)?H&EHtFa7AaxWR{ z;<=0MYm(8QjIYqQuDA#8n2ljApBoR+!D>^*esG9|<1uuY|HAtc`I}^oweN|qjxE3A ziP?D~+5DQQlLf5d-Gt~C?SJ8WfFEaR6WcJC#pf7Pw^gmB=;xDYD{>-pig%2|vx2B4 zIlbVPx6uLc#&o!!8mnpLj{Mm>4!D!%lqgxhI6&0=&1h~_`E+`@?E?KzQ56| zAm=3KbJ47V=|Q=$0bOz-8-V9c{A)S>%vxMub_xvt)BY3QkSl6;ejcCRM(<*nf2sIy zR=#Zj!@=YYsdLYm%?sFk8onp^Cg6Hb%+;&xFnrbzWm9bz^T#pTuBKygo%z+Z!;$oy z3#%L}>*Y^#bdBtd=kSat;?p#99_F^!`Dz(F>Tz-*xt>X6e4P(OHw2cW*f@*5^Wl(p znfuu37x=sVKi>Xi{9#Yq>9sBhefRw;TxfgVG<^`8E1hb+vcM%YE2*6W*U;ex03d9XCVM zMEh_wFOlPZQhJH@5pe7d&tme=gCSg>!B7_H!t?%@?T66+bHy`JH0ngOG5^ejOI?h| z`aOYlM%)UowMNm|TJ>di-$BMW>)0?q?&;W=EUg2wtI>*Sz9wwn@>?IWuC<-T-;McU zvc9fjJs+-6U)}%Dt<~}|`qh`>c=sq?Fy}PyZf=HE42xaplb6|4`1mw~tr%h4??9H= zCY!PE1bF|n`DR)42HLQ$Gw$*x_z#7#CA+p_W60rs#O@0i^d}SeYC1nXYCfCf8C$sL zv8cZGoVm7s_zCZQaE=oPIh1W%>;pak33w0}3Z?a+V8vC{9 zCGGi0&g8GN>${5I@i~7ApLIyQ7aT3Mbw?{EnK6@0tkm9R55M2a=b~%MCi8jJ!5*e! zIiIy-*ED#=Fw}}@C;VZ~X@TY%So_n_2aaae|Bq`=^lxDOf2(hf%fIAQczdAhX8RU~ zd+B}v%@lp|vi4p;N$xxBX->{!-zD8eJGtq<>}W~%mv~0QE>_V!+UJU?<77u`&zHqq z9)|n$(F5jT*lN!V`_R>1jL&vHLY%}b-i97I65i`6jP3FlzVBk+tWx`)Upd)+ZbdHA z;n`v|iM}c3#SH>KY=5ggQ^>domd)he#`La9e=B@ySaP`dsGIq^@HT+EC!WvA6Z2@k zybiUcFZxI2%m8>g%jMB@?C$)ey4Bw*zELi(hwn8y!rarz81Y{XNycBF2mhfxmd_u; zzbU!_?sv6-LwyYI4yCzR{tM$4bZwv>I8NNl&j!LFuj6N7HU7){>D~zMU2F~Wqqv6W z2(^1t*XdscPj@zH&(9^VHQX)LpXTO|Q`sq|d5?;FeSDrQiP9U=7p2%P0*kx>mX93ATxE<%C>DgJ^ z#d!LWB@d#<$l%lXC+F5lsX7+!rKG#FiT{f>@IOrc%V^u+9ZLRv?77gs3d3LYI*;4H z993OQh&%hjJHYWiY+Re~Uqr74mz%;gQXa1|=Ul=+C+k}X+b*zuMdu9X_mXvLz28yM zeK~AD;TvQuzbZ#Q!2@5sg#4TNt{1GAIlmUqS?Jeyeib<%;S2b8vi_JRH?Kz16!u58 zU1zLY%LkqD1U2#ucJXC0TYVhDZ~bBYn9nXHi*Hi%MTEbc%AOPP+~Rna{zKS5i$5pY zrogzf`uCl_5olb)76-8F4fV#lEa_z1mLE?it6ux{d^Ls*VV%&pE-F8F-VeT~?2n{Z z4u$a&&A0W|Z)_&Ua3SBbj%s8B{*vqQO|}mDR(7lDO9#LOYq}@<{x%+)RLsllF|O0k z;M@!5PuO7|i0KQ@f6Axf<@<2|saOU7Sn@`}Hqf>XJ;6rnk!WkWze3v?&3*J9={&^t zb+Ljc{HCj%N8VkYyDU>P26wN0>nJ-Jo*T5kCJtg$yXQF-+cd{e%mE58EHM)b?`gdg%7y088QLlu@~=1TU3JdNKnCN_fUSTZ}JI}WCKu%Aii zTXa7y7O5Eh>>B|$xQF~I3~lJ(uRM{Ho>Pb44dv(aTO@~<%dffmuE&2JT?aZ&?Kgzw z5jrl0xfvb*H6GQU)8Faunq~eG&Sbp7s&Q}EL#`OSF6UAzL&*! zakcil-^jh~WG;KQ(sv`D%wWZm$|gLswwckFpyn|d1RK(;d+#&Ld@tp$DJ7Bw>d|Dk7NKDh_|1hSq% zH^7`^d}e#1d0D=UgtrQ3Yx=K%XD5ERgKoK&*Ten1_5E}B+QMkO#2eD*|Kq~?E4xrk zI`B!OW}@IHPX#=IO%nvv6r9Q7({$~RqX#$7BwqW)+G!!#Wx z&zr(KkJ%`)k2D^p=sQ$=x6?Mes;02jc+W0k;||&vs{cK;|6cKbLi+X>W5d zwa8tQk27}B8S*ZIJKVN$%+pT1F(Z9JIIST)c=I)Kv5@R~O-1$rF2v|20 zi+jqjFCL4?o1veK>{q$aoy@Oo2lK_J)=1OEkPZ1!e9D*6 zoBZq9NZK5hkfZOgO)iIb0V89*e1aUcA;dad#}-4y>~T3b6x})X*5Y*DMdt1Byr<2a zRNe%q*hK5wzpou{))<{NS@{jTRrY*BmisJ8JI9OoxPPVgn}R6J$MeXz%lRblXCKF> zYIN#-$tYYKeE~~|tMx%S4))RHzs1kSRCqpCv{M(2?|8iSk>q?X_h5+FU-}kMc``rW z%@$+3Fh7U2VcgJp7cyFQ_pUa53B2CbioUD3CuaMTFJk!lDZ7o_)9d}0vE%moLcSad z^HO~G;op<8DjA)f6gH97`C)U z%YVfjI+~EXzj!o#>8ID~08e+s}=|6R@CD=QV?Bn&HTJb+oyT>gcSm7P3g4^OyLJ&-2~k*bPp$=kzL>ep?+xM2 zmwFb6cW<@pHu~?x*P~kdKdW&6JvEo6eeoQ`2KiJR&Ic2m&+lIQzC?Bi|4xSCVLI0m zBkw$B=a7339sRWRvQ6bvc9yeXN#%ok9?9Tp?fas6H@MIiV_}fHDgQ_F(2gPVm%19} z=xn%tKywNGjrHG0rZJkH4J+R#+KNYDeTpACSo=&wtA57I(60^WwXjs_IUU{LN)2m% zn&VmQ?8Rqco^6h%3IA*dn|#UlVi&*X{2lT*4d1H!0S?!N@y}s?q7SC>O+097_b-O? z%XG&R@a|QueP=MdS6EIW^Ax$&PTwSUk0P(HadV!0*qT4Dqo23m!N0S<`_#2{`Qg<1+V42R zv$*iwIoggtmIgj}?t#~HyYTLObW^4Fe`jIsRIGr#5gB9nQ|(Bt7b5d@(wq+Yly-pa zHhm494|1+nMRG3V=V*}q`?j8Z)Q+ro$(lpH`#NEc4r{sOD(&Xqq!h#B#o`F^@0Dls z$b7i2_D#9yLB4TK9R0v1<00plqFZ<0JfmYDdGLgN%S!E=#$k-az1b9eGZCJE3AnHI~gq(Z1~5-5B@}y=rs3HeAMFd0w4&Z1gT0=>+FOc$_$^lY znt9WFod^GgYoc%X@L2SV>6^^|!^oN_FX73@@_}3k*WJ-EWWCE5SCPM|zDwBnEL+XL z>6dIj%l;}@FLg~~{a=K!HA4KGvthDly{@bBJMg@zeP_pQ`1w=1)RerRoZJPTHORh{ zt+(1+?-ni5^J}s#9|t`zz}kS0_t3n=2RrC{0N*vP2l*;LyuS8*pYT3fq-K>1>G@8K z*pkp$&c?qHx)$u)oQz50v5$N>gKy+aA|}z}ug7CH-{Y8#>p#nwY6gWxIArU zY#zaX1Ie1q4tR?Y<9qmR8e4BA<30YG0Bgk7HOc>m9M2-7|2e-z##y(gB@lScUOkyFOaG@0A;GrF;(0jnbgkI8PeWr}jl( zsH=B79!ut3b+v2%^aHw&B**nbCZE#`#_i<76>L-=lJWX3z_S5aL*Oumvp)RrFRZ@( zRNm_R5^Fu}k@+R*!Joawna{Hm@bX*PUk+@+H*M(p5Y{Ige~X^ZQvJyWkbgGZ*RbU) zIu}%ofr@Ja=W1lsLhak1j4&p5hHU}*CiU(&x}H9k{2u6x!SX=I>Q)#}*$jL)Yx_(r z-iLc@?Q8oj@bo(G3Fuox>^DYt3tzv@ZqFCem9VJ|wQI&zd)59|Evlza{Y&^MJm(Md zV%Ep;4eVQ=os-zSJ^icb&gIoq?P8k4QgpJl(tkAEk^WcsWEW|SHW}V=fLVf}tzAT3G@$UDC`;hc(f^IkcJJ36u z+?jCPZH^X)P#-dDx>5}a^Kx+;yLJ`xyTyR7;=}Qn>!LUDiC1<$*$3KBX4@wG7vj1t z9aG?1SMGjB*RgWtc5yLR7T?jMR+UfNwm{dJ&ChG^Zhx}2Huh8TcGPwgz4yc2TP^#% zQhOgK`GP#TlAS7N*k7DpHD+z-EU$-@@R_ z_SVksX#XX(`-)L#{@O-+s2`r2gnQ)SetuZv#W(X&7xCx=Tc^4xk?F z+nW3?r}F*q?Z+ps4bw}|^J_HS-k8hwwKv`h^HS6qrm&vFQ>txA=Zf$3vbSFQ`LG3i z6O4tSRsZwBF7+zi+3}-nzY~vZu2>x{JJEGDjOs;nBb?^oYu35_z+1xl zm9Y?fIuhS*cphY}UmZ;NGU>su?^J8wvJJjSy0F_lf$%?oaqDHZ`Wm+ zeMx(IHei!Eqxhb$yXu=t&z<$YJHF5bz%L{X8oA_7tKd- zvA5_zx3L;`Lo*PrgX(K*uf$v%?j1(Y(c^hh_9d*-VIF9IMEBbNJ%;=DDc?n(qGeY$ zuUh-hy;98bL6zG5s`N%W=D~1)KKDuzzDXbE*M;J8JlXA?kAR1)Xg1u3>kDySB)=WU z)>ru`?JMZsosP$i`E_6wi||aUScGp2Jez6Tl%D1l_x#`$;={)^cki8AL4~pYR?HPgo5`+{Nmkw$|L5}SCG-o_gtP7MH#Y7iPk-^YetBJN$cB&$ z_)_iJT`=6J4TjS7TXqQ@eaL=5pYfgWQFavCarLWX)`iYJo&UPz zlzZvb@`aA_M(cp1;hIbSf&A4D?K=1;@Tppvvn71THhNJWzo3nu;^k!BTV;#54rcE# zK9MI`KYVhr7)bt8c;=A5f5q?T$d$|G&W^=CIf2aA$!^Wo737X}{!Lx&o279b-1Yt! zy`CInI}PJ`64~3sxQn*6@O9)*^GIQf=NTjV!+JU7TGGXy-f(X;3vuk|_*U)Lo3r}D z{yu-yv-w9@7wT(IZ;CFwFK`%q>Xbbc+ z$?pk+wse2T=B3>HTAqWx9jt4kTi`vA?&Q3J=3esOC+{Wk{)Vh(>~pWWG)9t!s2Svlgc}*DD z9?_Y<&*zbTwJMR**(=&Q*VpdF$LG>>2K|@Wx|-kUE#b(6eFgoU=o%_s@+IrR7PyOf z@U%eJ#PJw{*$s2TR ztNj=@bkIHz-rK8ehrNmh*7V?t>vJ|-L+*?2ONX^P-N|TJ{-Wap$0P7~SGiV`%%S1G zA46R)&V+9S{^RwJcm8{Q?c1{D#bm7Xp2$Pa?AwY?@k!>-0D6z1V+UCFC3iVoaHOyD z@eh2}fV_|8T63`@Gww{U*cIwPxg#0P&~8Sic*pW3_PhF!LxuHDwvWC8tUvnc--Fzc zr`O~(&72LDjBSL5lfzoKsln?8Z_ zN51M>$KUWiE+;l8<3X67LA&;&o|~b+5d8!=UcmD@d@mSh>PEPRE2?tiAUsR?^-z2( zVS9+KPxzBR@~&{Zt|%hDS%_|#7&JwbSsUy|7C%Rq*q)VFpR-{TI!4g>BpHv(_ZRul zJQD7Ar}x9)xnx+Ahj-iKkmG7?(b4hR@E(CDgJ&c1+R(oVJZtdlef+VGw&!6UL&hlW zY|lT0|8?=6O2(mVTrMUXFRT4NHr!WBzSygFZ6E$;Fz37cOL`~KISt(+`tIpo``^L* zYy2b7f652zvGqCie>XZh*LjB)T@$=7)6=}_e`4h1-}wEWCLPSy3;151B;#y+n~k<# z6YnkcweR;Q>$2$+?T64Ck@HTqcHLbzMx*A3-(?kh@X=_twP*A0e6>ECpK$&^_T9$S>&(Z_OLgoBdc!+n&*3>;Oh%Boh3z%x@6oq4`ZtX; zF-UgQ_J@7QId;UW*tM57u}fbPyBTPICu0Gh)Ztks$1?bSg=qnrx#muFFU-dYKV@5r z!L@9)PRiDRZKB-i*S&U49Nr;H&HY73V{|)x{tq#2NyZk5cNx{Zh<~;x`yDiw!21q6 z)+YNdwyDe6_ugS_52I^=Vw6~nQ?vLjnOF6l0Xnxr+te5q-z=w}f8zVm9%64yM0zLWqCWEpTs`>m``7FU-2#bv1nh?HsAglHu6a>Ps2Tq(%3FHl0WQ7|G+;Oro+g4 zrds>XeVG5kbCXchl9}RrEZ>NEIhmZNVeADfA0}Io$LFQ|ink=I0^?QovGGq<@n9Hp z`qn37dcEt*`r7Xci+WhLV8grG1D+}TCI6Cx@$PKD$oW?YQ&>-Udjif z(Vn5N7rf&g_pG=cVOOx>HntrL&n>WQVBZ>lsMB98tG%BXe?ZnMx<9G+Ef#toXWymO zC>Fb-1#CaTBo^5dWQDpjirzWwRJ&8_nB*vO$I-E|{@LhucAVnpgUB3H9_@IE{i(2R z7yL!WNP2GP`yKdAJ{RL*Uq}B6`v=kdL%v!TuH&OW<;;G|JTrkg%tPO^FR!nCw>Q}x zZ&z}{9QUvOMfywr+ni7MAf5rcF_}zdhq0QxP*?lTQ@FPg?P62=!+nS3UNU>*ITY6Y z?bo5(wN~Da%w725Ix;@SYfMFZ!bEPg37r4(1)r3j6_!_`Co>a=NS;SK;yD!Vhwz_9 zkGU(%=V6^)ZfD&#keqA9^Z~xOR*sCsYixwIVs;kn`_i|SZC|{@wOxz%zxML5IK0kW z!*;Yu7%Lqd^M9y&A-1(OueDg}-O9KLtgn$XAB{0rUM9}7jd41%+xc+1vyJolFv60wg(qMnt2nH}KJtB^BHIe)udF}(pICM-zg_8jJmbiH zQcMQg2$xBA-qtm!iJ>P_+p?Ay@cSxI;X8`fRX*K9mdTc{iC&UeP6MufFxs4Zzj7}~SJ z99SFzcYnGXnQQnaovCer^K~3=jjm^u*SxELPV$n(8-gvAj(+}muA7r&PKiz;%-7Bu3|3EUn z;gdEnj@7n}<2i6Q)Ba-p>hEc}22ams&u4r_PjR32#%LSx!vMDTkvn7YoT$AGe++=- zNV<%N()fs9a|}mV*QN{f1^dG|U5cj{eWUd8Z`p<&`@p_~x5|C`r7-|<$+{&t+>|%V|#QFU1W#fz$72zQDeh>;fN2j z6?Djj@SZ}p)VrG@Uz*T82H*KG9}Cm|?DuV)^d542YaDhY)?fKy;x~)_x7b!8 z`xm_3(Hsuzm3$?qYX8Y_32Z%K{mZt6KCw@?=BGQnf3yToYrKDu@t)jL2Xk>O-*A6) z3i+qf+l<}Q$P=%;nf>c%PU5Q!?_T`X1ztH{%E$1YO|~wcf!1ILp_S*^-p0_4`o%qU z-Cw&u+1GmHCiFev@P0>lPb6JbUwfVy-dV}Jup`vy`{@j0;%+t@=g~0!*ptmq*4N%u zD&=V2o9r9af|Kbn#>+kGy)OfU=TGU2(`)jo`#CTtl| zseQYm_*~mH^jwBFrk~8(vy&6>t2@Osc+Oy-+{z-)iTEYkk{vtJt^R~-)@&_!zQlJ5 zObeY~z`oz=SK~NA+eGr^V>U|L)%34VXBYZr({~SC!}&ka|MxQA3aIl8m_P0!uY>lb zXysk@typ?C5uPz;D_xt{)zy9*hn^t6HDyt>+N zcgs)Q+vDqy^YIF_8{s_>wq~}c*n1#(-_vt8yN<%YwstbY{ipm|v{g3k3-9Y{O?Ut4 zQ^!w>=)0V}ZPA4s91ce=1_S81Pum1`@Lk5osds0?HD-FX_-u&wU^M33WC5QugR|?*#S$mHhe?)aSRM{ zC0h@+7qzoJ|D2pj;{FzYAEv##{vrGv`nJ~gAYJdV=@Wh&14Bo6+sc=gXm^3{PVGg- zJJe$0-dSe;iXWkejC@z^ufuZ{UFu`}8`(V^tF^^)zWbGIwYawHT&@Pyw2g=b&+hTeCWp=~M|E4AnR)z5X0T#a3y=ZDGH zhHShJ=J9pjYe#oGJGZipgXJ6ayRlOZ&YF>Vf%Z4>ZpU7^mRzm9Bc9994b--rjaQN- z$HP67;#_gyukc(WIUmlu98Vx;qA~I(IqG=)EEzwrtEav&-hkISoZm^3%&fm#Xa9GQv#($X4(%hI8$MQq|MPK%S zXR_mUVB_DYIr@(H#J!L=DY^L-VH_CC!;GEw{IgPR{X#toV}HL&?Yjf@3OuRDHQu42|7%DtXh$=?Oq4n||R zIF1h%sG~=tYs1be9C9mM%VvM54Q$9Cqkqe~)z9$8cCUSRF}s|cMlimLZVD{B$_4(5 z(3cw-J8DI`6CF!nUTFU+8}ESi5a(yR@3$!)*WzhQc2(+p>x7(b#AO^AKf`?t%w-9UZ zhQ#P<*O}{)<(WWuew0ms!dRhnM_(fc0uJ59V9(iMQnE&-I~?{#N{3`hG}~Up8YGe_aKU3W5~<@$K>n zZ9hA{jofwMhBxlS-|BDnfxchiJR4sZb{!-S)w^=5dhfE3(Oy3p;d&yyxz2B}=zg?X zyFZ`3FNa@86Ry!#xF%>!#*^e;udOr8Kf%t%u+A#NScW&*NBbLmvJ1Jl!4c-x?a^&d zCckCj|Df+?%N#tTD%Q?u7inLiMx6xLaPjGcUVX`0lkqP{j@^bC9_IpLSz!7@vC>pX@81C+AXh)~Vro zJK0>{fiS_4{YH;^T6ljVH6O>%%gTH7UGvF&dt6%H ziaY2tuH(;LXFLMS@nSX@O~}>9(40e-7#D5C>|AyP8~845&aZ9J|Ly!Vvaca)Q+|_| zVQ!1>Hx}uOFJ;?FY&!^z`)sw}MmNG^4vhIUH~wQ={tH_N!KY3|+nV2U_;1iR3?Hnu zHPL>~#VJY9-i5B>+;|M@jB+Ji#znZ-6-~5VDVG=8hi4!gkReAi>)W&k+2m!$Lm}^q zb@)&|Mg@BYpr3+oru{b+?`4sfz&e8d5#(PEvuoq>8Ry4V06s`ccF#+G@kWKZq>>`$;=EKjanKWV}528CLO&PKTfW6LHIof#P!V zey9I$YjUxUo)N!(Fj{Y=^Ni6zr>^Dnmf{-LX1Vi}pVDoOK{n*4RBG#+ViEs&XFJ)s z>YZ(JOL>79^r2&Ou{=xv_G;}m#{SWK zIS$5pZNJd@giXGNbwjb7Z|vh!$l9095A)5LWYqELFZy1mGt_4FI$KMBXFhlqZ$I+x zfOi31*TXnNjz7y5<0cyGSPcr#0?TpiX)liLY@P5tPY#<(af^)M>_oaZa6VK_SK%GZ zUrWqeT`RRUP&}2KBgn@eC-m;AeI9IU;%P|65*EXN3Eh*%R*7>_z8+@ED6_Q~UeW&(C3e z#Q6xeyanf}?Ai_8doV3w+W`6plX;q$45`-Mw~sfKCu^b;!}tRG{`|5D-@VB<+S5(s zF8Nug@#m4>m>(P2t5MO${5z@6dwl3mChrUFXKD97Z7iT8BNjLr*BnV?H#3TH^;%&Syj*D`H#=Sy_jM#oyKxL%J|RZ z;UWC9x13tc)^U#agquI}>GmD?p%tu;)4e-9Pw|0yDCg5+iui1b=4o=fv77(mfpA!R zCu^Xsn)lz4@5WI%1l=IMT_XRU;4^hUCO;mwdQF&zn&cjQcxGOXg}J|Rdl(G+le3V_ zZOLd-UH$*;&*D8FPQD4_DcpBXj)FmLi}^j^j>c%e7@n@ne8Y-A#V3um?+?#EY-oqa z+9?^%=Go+nb2P<%CvC^^#h;EZf`gp=2fUlZtfoaLka;*;R>Jx||DNFZO0?FwDO-zK z^d7*cYF54m|BiIth;3`b_Rwm5@lgG*irLBhsJ`S`#kbHLA0tlNEUD#NzMgTv4Y{rt z!t(SJ zkv?nQP_IM1E!mJ9tp+V3^CB4L;5ClI^;^79+sHca9gy>?{c`;$8h8EaoeAIeeEl?A z?w6Na()+3QDqDWn{-zw=pT57)eL?2aWS+x!A@;r1uV>_JbFus%*=kcV01iG&?j_?g zbaFa8Gb`Aa53cYPS;k;(jb_am?Lg0qWXk!{y^N4^c^DhFlf`%W4D*_`T)5X8s~zR| zI=O~sYjeL1I&H2x4`jWhZ`0i!tZzep?tpto_6s33j5o5Ka#)v72ba(hZ{Yo!k3xJpl9Aa@kUNX;h37D1wT1Dy9eVyt4|cwS z-kfd2wSNJxe9s#>{@SrRm9Hf8J2qYlM_+VDlDDmM<2u>~e>Z-dOV9gs90^M|+jH_| zYweHl{ny<*-?u*l?u9m3${BRuZ0tTqcgWR|{y>o?bPnW>20WO zF21uWHC*A@f7}7id&T5LI{Wa+i+p_wSvP6_+ZZwL<-5|~L0+tfKavm2_-s(6_KsI- z>=wt$&3XDCT1}JftN%(k#5BC)Ro=i?&E#2F|4&t`I+N3tFD~aB>y`LrF+7Nj;OBwj zxRd@<>fE2kr^c4`>~JqX9>QlaY)1uO+8$)fS7>*Ewy1U{*b$=Sk#^qHi6|7K6#Pe73^bg zymy`ZaQOHxUW@FIb6cUiUfixF>k2V@OO6fHc96EE_(qX`51XddxzEBzaVz+vyo#@$ zQ%mkPCN5rDyVsk%iDn&R;uT}-c|LlKzC+;J7^dIxUda9@jniZ8`L-O)_TypMg1+H$ z;8p$<&*TeorqL^R%l7!?WD@3#Q?;E6zwuw(f$lZB2H=fhzK!kSzPWj{tS28|z9m|D z6*uKWcBE7BY(U;-{4$134>@-)Gdwp5btmGVasUjmx%Y18yNH8*?H;`xEbrBKF3j`f zMobR-%0c$G@MBkdHM&@d?^QObANiwjSRbar4`-=mm+=9d+1=XzhsHgoQtqU$*lwd| zX0`Uekg0qv{$h{upZteTxs|qrG^{`_okz<{56K( z$7vf;b?={@YD0ROeGl@@f3>yba&kUr=h|u$tkH{nBd*0Y#>b7?H-#aCaV2|N$dNgC zZ=_=}K7HZ8gwh4oDEpMH`^w7~?2U==OgY~hu1)Y?ipP8ut1l70()*JcU&g!tzh7U1 z>kK;nrn@^?>REIk+9&Ysh0i^PbTM0x_x^WR!e- zKtDgHyNTmy{k`G&T5hNZd5rD=wzj}CkAFkX|GA zjK%mFHdoZ9p8U1Ky5=#w#z46j9da$3#NJ8lkf-Gf^tG*sE5Ed1kNgVn#l>CWGG1%< zE8GVO_iD=<>EWxaBfc;Be-D1Wi!FoTw9YE}YwLyYT)39O@IP_ik38e4?8IM}<8R5X zA#}c_)@?=ZR&4w4vf8%?iUas;q3i4i`2J1&hw?)Sdw>2}^zNF9n6!7u~1zV^mv6y!g}=Bv@LC%>0X zPaFU0Mf{*X@4H9M#P&C}W^+8V&>2JFeZzDLKmLq_~r_D!rcEDd4*>vav<#o zll(3DI^I~nbyjjYT4N-6g3V{}FMEo^wI8d0%S!EcS<&8byudH8g}RVh?}c~l!*y!y z-r!Vxo9W*V&NE=U1=bn*?&kAz(VwPmAAV{2Xq2vC*US39h2v6os^8@#e7)Hc@R6JD zuWcxvFVLB1L;fW4AlU;>wLJR(j`{M2{k8k7YHP{9820Q~a>Og{r;nY{d4TEreic2Z_3}^=H`9S8YlUQ{Cl3`kI=aOiZ3I#HO!mi z3(uTC;opbopSf)Hb>(dIJ@{yy>gwOToxzW(lWMohRWPLdG5N4`v&Gh5NgydXW8yzMtdkjfKhNKI8aZv1zMspsh2T zJkLn^A=;5&o08WG%_ENGa`=vP`mS6&8ttuYHIIjDi16EqsHwPC(KN3_>Dz3&$+$DG z=4xhmo}AxEj=EnqpnIX?hvnk4{BC|J`7XR$nm$2qC-@t=_Pm^&tL51YnAEOv62Cnz zZ`IyRo<`TA9c4W*g)c*$?FrMfFuX_i7JNC2?RQvL)$#ec74x#b3&oQC$$9L!U)y`y z3VQ#m%~(l}W7|3~ZOX@cbB?$x*~7JuA?I6ukz>ia`u{Yx$qdgd%H3i3hi}9$euJ-#vFt~7 zusy118!tc4s?@&uQOb=lzQX%zwYBnmSRNAJ+biBjvZ?tAnZwGi%!Ee{ zMtoj64s|PPq0QPkyBK`~G>dKKtUT7Pb`_)HY)@u)+fnd0hN&4$@;O{@COgW*`RFEy z$LIY29-1wjAImpQDtv`zSM2c7}w zj)n0;IF5z+Yvc4TI-d3%mCy2xwTW#}4{KYwd$2qWxE|rRh%H~zHy8gq?5QKWs~la4 zzZYyl&Mp3X_*wS1(Z33P1HRfr&2~R1XKT0*7w&VVL&*F?-uws61GYi(Q2vB_Q>if( zHRP8+$)3X29q@%Z(MvvD0OJ7T%9t(#?QFlFX^MX&yie2Ln_Txa@<-{MhOZNPHN19R zBWJRUZT^Qb)T8j-x$+!(zJcuz_h`)}VJ#4zyC=8ud7-|3%OA#ZejZ=`Qs?<9ei-7W zYJ<6@4E5qZa`vqlhx8qWrV8If=#9hjId%AU{yH4K(XhRN_bvU#b@)C+ypaCm={Nwt zwMel@TbOgZ%C)16!FSMhhUrf9-p@$>XI-&~o*meJs;wWsfzE#>+jt4rPJ{h6wlyk zuBHxwX*QnV$NubkjGY@=pP4J7aklf>V@yOJ$Omx>^F^^6e%B4fOmh3u(O+Ajoxtuc z+P0!+p)o6OYIECT_{_IiuuBaL>&9X*pA3g(Z}B{yY_^x%v%z=iYTuZc<+z`|tMJWG z+pM#byV3l_uJ!e8$L{;^&*g(I-Tfaj>~mrHQoO`DGoF*p>G)R+#<6J+yccM@6Q+6g zVJU@A^WG|3D+txrSCc3TA$jIug{*h`775hZ?nbp#LlOXcQ`D@SN;|3 zd=-zUd$2g|fcG#uw&iQ}ExdPIE=RW*{-^O6!_h2xS7mowemueX@p!~L-lpn)9J+Jr zJSV14T*A5~ZA?Z5{UA83L(-}GUV=s4OO7|bjO}y@eLeBt?D$*ppGcQ)Bo=&@TRY|A z8;AK--h{P9BJSZCe|XOzK8f6yVLpsMb|i!Evq{cJ)2lBz8n#!fuFKSnLfb21^Ef|D zMzgE)o5(qfPPvgRx9cZH?*3HYK0!;k}7?j=H=Z zU14ne!nP;rF_x1nU{dqrcKqQQEItE$LvlB+xc)Il_rtpbU%T!}V>DM(te0T2#tF|I zBkO?j4L%*DeI6QlUA|(wQ5+tWifbRnLt$!zMl zpX~#>2CSA5-XjXn(nH-YE`~!6M!orCh}e!s^SJYdWcqecd@4J}qm#?|w&aBP$dPo0 z`ZQOcniub;e;v3(J%1YwyQ5BgX3IPW&2EIle4eS-(ZO<~b*1+GnxcJTG9s$oX^4`XK5MApSM?HcJ z#~btES!gbTWo%vTf8@fwhiHq6_wihduI2a_vL@^QO8;Kk(I>-gFUpq(VYr9S=Ch|W z9U&eI(H;$NLBD*BL)?SRp6IT#cHpb*H@s`fBk$~$d>fu8hB-992>*ZgUj2KVz4f=n z`xn`TxV|pNt_vf&OW4CZ#W~F3`XMv6WA}uTo6YB^>%W|g9>&)+Saz$ZV`z?Y{1yzy z#b$!cn**8 zRV;=72s!*UpS-7S6@Bs|e5;`_ZlVP+vL!t4DvaZ3q;qzba;ymVxQ7}qx6^Zeoiz+u zaz6Ua81Ki%{rP2g^b7c^uN=Ht+h_Qu!eY+J2WUT;wc%`9UY>U>u z*iKD#-J2Z|u<`#g{FlJ8slA$!?uF*0s%Jd>Wed+_OElqoE#;f!-7Yqpk@XII9qG6X zj+0^g9;VTbpMigneIv0y3#K3C`8@Q-Yql7UwQS?~?sPocquq&ae$5Bce}Ut@9dE&& z@5JIL`tIV3$Mwx}zLox8`S%TaPe7+0g!?+#68hR}+Y!chV4exfmi+w``PTmN$;No5 zzrXky*Wp=NIuPwRasI}bX~iEmup3`tE=iX2;}dlKQxR)69Eq;Az4})^LdLz0bMiM+ zC**FiA^w!y8Dv=N7aPHJElleeV{$S4<}%!~P1bcTZqf00n)AU%{4Yo1W^!U6->;HO zgV^~SY!{+g!DlfH>#_Ayb@ovEP}5q#(1}lW^=`eGB^}6Gmt14DT*UUJ^6N1=HzfNs zdUu9(DEeO7PK5C_TXXn^lRZu?G1rxYVP;pj-cGvk!yMS=)6eJmt=bNtW1juKa9Ynr zKiSla>4Bz1cs;SXWyTevQ6h$0Lr{(LS4wb?^;$e6Hixc;10~I{UstbE&*Frn2x3e5&tH z@wFC>W|0qH@=`Z>UG=RB<3wE#_j==cF+Y!vx%MmNbv;?nll^^t?SB^Ie&qO#PO-0f zQ~sqNleY<-{80{*8{!fCpH0L!iajI3I*6W-^Y7KGvufpA_9OqFMy*JW(KnW#FNDcj zrFapqF`C`St}a!-F@QJZ6MyIY8HM_FWxaV?Tt?wFuJc35JO$r<=yO}h>n8I5tE%6a zid(2DM^`-)XNR0Bt|Zf3m%WIuHw?Rw>o{sFr_`sS0h`V3aYLBG*f@xcar!Soe-xYU zhV3^xyhD)wLGEq(H=yfoHh;tCmyy2&=70Eg8+={JnS@>rWgpo#Gp;{FPj9gU{?Teg zLf_`-)R??8n)T33u6kz8)|>hFdhJu-oL#N`Phpwy^{40>I{$`V*YIH;%Nnsq-W2Wl zW3FvCG6wR+L}TtXwDs@>ANso>qn2eM4`B#v zpRxkifn?v~HyDS(KadXhfRZ`zPlD6<3hT(Uo*Y}ju6%cXQ#->uiSa7?R_r`hdpq=N zz+v4Sp23FS_J%b_c|Kn2>gX!E_Heu(o)^`dlAKZKFQxY}eUt0tzWy&@|A7xqA|uzo zoqeReIUHlid`Q1Bn)G3Jcuub^F{jqn)ch9rXX9Y=>In45k=q~c>-FEmr><2p&-;sd z^W5+BT?0!GG@ZylO?=eHw6%K+htqkWzM16TC^jEDz7}t5bo8fBk{#yo7W$sAIv1D4 zcm}iSSo+wO?4vd{A~V(gBpt?5)Wvx(co*SW0DlH&~+a@UGT4u z4)$=*w%iORd`Y+J>i0*%GAI zeK`2Dd=jRCbjYFdY?y}F-s0yfy8p2KdD{T}C$iBxD*T6Pev50E2gUeRI$ovgMm&S) z87j9ftE+vhH2gPJdb$2K=v%>Eq5n)Y^WokK<`(#?Fcf5;gYFpqod<(B6%Tus`!d=v zCgCYsvg;Z=KaydL*RCTUSdA+hP0m=pJ<5J48OQV4uk?Lj-s^{UXLJXV`I`O<9S552 z$q9W8>*N`nN2oi!;9TUM#<%E#EOH}xlhBv+g0myP-k`S0o8(>k20v;ok5Bxgqs8QV zHrz{=abH|raouG7w~KaTIXMAM!WLsAoyJ#kB3!Q)Z5;nBH(#P}U46H9t36LHH^aY} z%?;Ev-$F>PWzR(C>RfaSTh7Ao*<7+8eIv~mdl{$g*fW%_R<;$6*H90_)|}twcBzfU z7~lB>awi#Y@56U4+io$AN7i{)6ULLoY`V7J;CmL{?cjfmo`3P3#*Qxf zwybxZtbYdCJ^0|by4tsCO0_6*Z!0s7vWJbksbZy(-=3P3VmK^1~do)A{9d`LzsgwLAS+ExQQsax$CHEq9aoY;~Nr zXKQa5n(+farhY3L&w}GUZR^uHj9kwIYQI(5hpaX6-$~~%{c26Jl#Uf_YmIjbf4u_V z@s6!!qNeN~!Uqe;_-TtjT{0_(Xah#8U!xpYt@{FGkwf?_` zJYzMy3zZDA4Y6GA! z$B5|H?#`j5L{dP&p%hV31VoX08C&e`80_x)na_J4o-hQ!Sbe*>oWMtL)`pvO&e~AnD$m{hx@DIOjK5k9WiSw)&~YmgCs7 zP>yvm4uWlJZt`B8Z{qMp$ZPo&iCeY_92b#meUNNH_Go#)A4LJrcJQ=zT<2Qe*v-v7 zQDZb`khi;iSA23K|H~ZkfIQ>hWFngXgPFbIoq=eW+Vda!ThS$CpH1g;wZ6T_m(Qvb zZ;JK4@@f$JfpEPd)b+U!L5a0ZE?QikVr}*Vn^t3xMA?GIl3}wEc*N%=~HbhA(DonQK>*;?ZP$q^%{Ld>p>VQnZ0_wZ0wb zJ_c4f7VZaUo1y#0_O9c>Xq&<@0Il^*c$O5av+*0X)%P!pHEh{|&k}7rp_@hL^Xv^g zZREu6eEXa{hB^Pu@nyEVVLFs-`IcTJ<|E-yqV+X;yT_~ zQcF@}znX7blk+XwPJI43{=3cTL&!X;$J%#T-&J!i(EoN#^&UiNEmRm!>Erl@X;(Ya z;A4J|7x0I5Vqpys?u8U1#EU;t;~xt?sLGvbH% zVmWdPUtL7Ti7<Yy^DOaZI)t6~{WaMvK2P_Lj*3*phIcb~ztR z(04N%#3TKg-HXWVyu$j=o{y8@mpOd+3m$9Xu65Oq{^H+AO z_}|OkKj|#=xpx?H-A&QzcP+wwhd4&FEi5Uzi`la)JEyUs2ODnGzMovW7WS#uTYdjO z?{YEkg=RXeq+N$cGi(O)ARLt+SH~@& zud~(MukgDElpc5p*UK=;k8sVCUMWrq z9^)w%_pru~{#WteRDAR#T|M}a-wN|YcsD%!_APwVDZCRF{b$<~rh)v>kZ;t!WM-}B ztmIr2?1t$JeSDaf5Zs*4dj*Y8$ zGjB8jwKHx5Z#y#F*Nl$QHs9R!4P3{nYYW%% zhjn1SiFo&rQ{TBR3g>&O0ei@e|0>nr4TtBr@eF*M!?J>o_4w!tbgscl`(hFwE#hCk z3eN}fhuD8SJm-qvJ1`DKH`VwXCC)+q_0|=8<9pI}89w#1kTWst*$Fk(XSn53c6v^p z1)kpI9)fl%x%?2Gv6QV~Ib7f8e7hOiI{Q<5RG;eB2LQ@)NQqz_kY-?Wk>Y^V7Q4e~;34B%W9Bw8wK3 zTlgi)(A~vvXH=^1gT=weZ)%?_Z#Q6bs4dnR<*Bf!llee08sS%)5@R@BmrV!R|82Xa z;yW?si3c3-P5zte-r+FI&FBW029fcI>-?eowS4F-#NWHk#;N zvE9*mU%uLl?~K#upLlk{KD(J=P>XzL|UFA|I6(A@?{_zs|Xp!}BH``IAx%lmBV zSbC@X6)|QUS&mnQIE^> z=@Qd&jat)+&j#?z&uo?_Wo!L&$(&24@s=KHdT5vfM0IGsy>XeoVqClL9iFe{VwGRr zW9=GpQ#x)Tw+3GyINoAQPkuNR&dK)Mq8&)aNp;o#`$$`&>%bRx^XoKytzoF3`;$$z zu)Qemn~--iJFe0932ct@GvJ$pXB->r*!BqeL*P1yp80a@c)WFD<61vF15f+$V~MXI zV>@=8s{iwl6YRL$@trpByM*iUd^P>=cQ+@p#Xa|gkFt?`CZ16kckkI+!Y{|l#m31w zY*fFpE#RnV>+k$p^iQ&L722hI1atN&Y`2MZ(^XNpA6)FLUv5_KIjTX~Y&M+Y9G>u8 zE!h@NbG7#`e*BJ%!RkRf&xPemG@4B_`D7g2!};JD{6F@n-VX@xnj{;My_md5wI5*| z_o-u}<2AMJmy07mg?sBc|K+b3qsCG?l|FjHGl@8?TP~nya8334vAnak`t62zbM|eE z{&jjs(enhFjrnRCd#}VB?&a(uroC(*)2BwpAEA{eQDf)t*;c@N2)_UH(HZ9TJcmb4 z=j&*@*VuZ`e6y2wIhgrQS#mEPIU3&e2>WoIkPISIeM?%f;UVn@qUlbr`73GDz4~7X z#Zt6Q`9jP~`4Zm6j6*!xT^yl(7F#FR!i*PPxh0wA_i#Ow)Ysn`|M~Fmtd=aH^J($B z4BdL#W{Tl_`eDpRv0rU3o+bN!{3ke9t4qEJ*9w{XU-Ty1`yO#~?XS}(-o?volpBe0 z6`rf7$I*E^JnBX?QNMgk)U5nu=cmwhD!kqF53h6IhCE|4w+_kL@aIbX87#Ne`VVXJ zjkB-@$mL1-f!Z+0vD%VfNY4|urBp-h~l3&kT>G$g5wm%+YAbv}Js3YMW&2(%{^<9EUtP;OL$gS(rm&E2> zd2+9H-C}w>^T$d0Z=|mm`)=a9y3>%G;^lxo!i06^3UY3W!z6%_~%nt{_aiYGrYO3$R zrz6A=wrp3t+rV@o+283mM&sSk?1*=_ifbRZThnvbMN|ix{x30wXq(lvx)H; zp9xDRa+>IS0-pNpoXv+@z<&a|r|^a`xfOjQ@g7R%6f$Gym#F2Ji~E**us7cJ#*p^% zW3il%wCY(;w>nK#HIH7i`phX0!izc7!1258=Zb4l4?Tax#$P0U`7GOeVzfTL<#PFd zWOT0ae=_EVr}4`1XcXV=hi6Ce4C8YXm|8owZj0fL&p)NtWv0gunLmF0r^L-C+IDp8w*)2b!JAxiE&#zSPXXk%tAEx@WTCs#@>*id%(jV=ly@*nnSJ%Y&Wie-yp~ zZAX0cBnRt%6khXdxUZACUz`m_zfPTd-Ol&G(-mD0bmtpa(<}bVTmMD)*${t!19CrxAd+{?@GK=D(W*`zqr0RgZyUV zB)9V8=~zrxOSbfqzuPuL<# zM%Lf_#Yd?+UiPt7JkK5p$0P6rKYYYLay;L=w)*XXWNSEfAa_%C&>6;LHpcpJKW%T3 z_bh*(<@i$kHDa<}rTROt>iZtu>G>P~OYluc%eMSAIJc>**2D4^ePijlPy5&8oX#fo zGQ2BOy;o=-_oZ{Dn%SV%w^78uAK&qB{5^lpgm)4CCvB_Hid(pjh~DJ)#%$P<-nYrR z0sYf-h)uYE7}ux&I=ln;M@=fa;y*-;53~)H(+k)^Z#0B|-G56yBf~S?;w>@Qh^#O9 z?bemmZ(k?dp}n0Q8^g6e{ciB>Q9Z9ZJ_YF&G7>ybkp{>cFmr zwrBN)c(FS=vc-WlNw@hcCg@%s}PKO|>7+(~8ay?uF8{Z7cX=-t~X+w;R1bZpC>;kPsGUtsU1 ze6`4W*IJ@{h;KG0dm`Qq;D)UTHE;G`wTHXmuLptu_ z<3ssQtjfP?syPzwheu(q?PfEdWzV}GItb1?|L6!BrIzLzUu{@0kBP5(l&%_Ck+seU)0jM>qeo@M;ki=UdH zsX;%Iy!L2cAghK>-)TzRBM$f7^N4>=hu^*UXdF8a=bsJO?0P7FNqarlqCb*xEx))o zma28pF0S{?75Or>-d)Obd}HYH%sSkIFW-lwi@x9|zAgD6kI?^S{X3lO@o0B*z17gz zK8xJfU>i=xQ~bH(TAbm(1d>pTo3gJN-mBUF8sGiJ7dyCD0e5QbMF+w+EVNq(huYr~ zefx0T2J=+3Vp1#N*n4o7Sq1) zv%9#Jj9c9AJcV7Cuwxe4?ev}OzRGNU^rd69wZ$8BzYFUo&L3p&I{XsGcXR$|!C!67 zQ+t!?n@I^@a0D)Sv{Wa{M^m zs~m4kj=uC!wmvK$d$8vhe)@>9HBtT}TgV9agTs3ODSzbmk<*eK`5lQ*z#sE>G}Hbcameb-ZRWZE!QI{1 znTL04bY1Z8OGiDt=8b3++|TV}9%IkGm9=wF8?voMii7z()Wf~WDADqBc#fERMiA!h z@O$G#?vs$9pE3wt`Yc7fNL=S zodECVuz%)wG5U4+Onkz7am7Tq)`j)7I67%xyCTk>rqwEUKS zV;jyl)-I_Uo1SdD0MFKS)obk1yk1;S-ar`7=eyU~FYm+JG**KO<00RrA~)0r@hT_6 zo#6@jzPa-bJ-p9poZLtL#q_trJB|(kUc8h(*ye6+B<2jN? zd02zZX77>KK3l*yuj1LCbqQbQ>!X>#zfbA^Q7yg}p0~*}&Xe)>$B-}XnK2T}ubgkg zyJaEX$>p%P_nTkc-8d0{IO3&jm<9WP#zei~XS%EfLOhC_=(rkBKQ@jhe>J)0;PA|? z*%{d}PPl*5fyM9iBf$4ftg=n~yOb_M&eH z87(TFm(caIc!XT|aAo!X($cYTKLlF`JVWVwlV9GbUHko!`?bl@s5!mE@n1=17`I(R zn;h*A_ir`T`(#B!{#p*BoDA!&DCEmQXysyVeOB;sbdzIisAM>MjP)q2g%70bU9!y= z0Za8h??e23KYZ*-*ii)kbPqAc6YyG-q?f`R##SO{y2u5w$hz?dKV*OKEqjZB{e~}w zlKZ)g{Zev6IaZxH+dPj9{w>+DQC8=!ez+s)*h zFE#~R&t>O+XQf$)y?3_D?&xQS zcC^=s*E-Gz>%Rns2P;*~;oeo=p6pX$?qS=M-(bwbx|+YM@3g9C;XT{%zG}XR40Ck( zgmutF^TG@4aBUO^|36i;_S?)K)42s7Uax(B{e8>>WTtKDK8LK+>^CQSTee(Jp4jI7 z#dT*mAFSn9v>|`iz&Mf4zhRWeai|-UoYR}u!*>HahQQeXZZVJeBm52_`Ho(>TCh3H zgYnsDcZWfKNB?QRo~&ANTA%zH=X_T*CU<=?c$myD;EU{cc7CAi{3Yb{fqNObTcH=L zf=%K6V!D(1#INBU?-bT(27O!0TeP`YCDXMHLcdjA^}8eK#_&EWo;%v!C$k}bwI$5U zA-Bp49PdjOe-ycdtf;Z&3*XI1>xEwnTPLLd9|3V z1r_gOiO&J_j)36`wAQoP3bucQ-dvlJkr^vlU%b0(H=l?6j$|MYusWg*?bY| zc-o2X`7mr`JU*-6cnr_VlIHl>o9qeuo9tZ-H#|uvakYjhe#I+aQZ{D$qCEotDfXRf z;U=SkFO1nR-u|V3I6n^8e+iry^W_U@j%4S3$m!9 z)Y~!YUlVcqOaF&^<-W*TvVu7M^#JmF-=r{{KMAkD2pu|E@TL-)_^sE_si_ zbvP``^#AU7Ihu|zontL>jq|JFs-U}(e6=vVLsx9zxC8#}Dz4x8S=1#s8t}qvkcJJz3I#M!j)@KfkH!`O*fpsFALT(=d*AZ-Z#C{T9&v>#I z;rUF?x_40?h1a;wAED2?;%QetP!o#R#Pd{mLk^v%tqGkcqGfw{MjM`~rl-RF3|;1w z{BN?qhJ6z_VJ^?Jztn!uI%_Rsp^Nk9_~KK)lfRyvAIvc=;TmXbSaDw)zx)c{e@|SS zr1ivjGQD@xI|uC*bbKl{e~={y!g?hMdAAJ=J@D&~r=bseDq z<@iM7U;^8NUv5SBJ{dQWb-nW&jEV8=aSt(5^OK1G-{G6LypJfa3iTvj0LRreYu`0l zg*W))EV*!^T-t>`*Z0{eFsTpap=y6icBt_=eBu6R*_4gF$h5Wz&l;mq=-1)Tu`r2m zq!#9n(e*pKPlx?geQXZT2$HdIT2EB(zaNiJ3^KN)4bjQN>0} zJSI23;Tv?>FgW(pE(Y;!@IOfIbh7S&xw-faWn+lfL*&8|{zovrlRsWTbE|x5%#Wkd zEG0v{!u3nM3t3_9)zfiAub3nQ_+<*eT!rUEK0ijAF&-Ta1Kic;MW>7BWv~s^Ua)OA zyQ3P6PT(g;rg!ZNT#_kJ&VloY&#M**VxGfvX0d*kD_g18macwLw~dV1U5XT zpUyB&^WX8BBa+G5o1v|v>mInSh3g;p0{%1p%?WY14u&s1Kz~8bcW|*cy9}TFN?wKO zF~0a1?h($t>l5bG{42+I)%cwSp1b(<8vM)X`w|9qqAT(hPYgfqgSRIimB!fxWHr^_Tzt=geJhx( zb;}{P1GJr?P6U4)jAta-3t`+2FaC5GpKK{V%?;TX74a0S+3cA^=2F+I?!CpQqWiSY z|LoG=o%}6eKFBkquf^g}JZ)k8KYn|j|K7pB8~Ts*_2Szw2L8YkV)71*hd7_-_h2i7?8$WE(mzlt&?MC7dtg`@r@UJLGPBAYCo^ncV#FihC+*&Rd>CFJj9~ypO^i zu(T(?85xVoerAPlBcQ!Ve}C<>fhN-o3#(qKEQS#`yQ^TzPFd_D^BB2V>jCv{WSXp^zMxBZ`+Y_SY)B)xOFDmG zOAWgR8VkN7lsv$`BizeM;GL)K7kDnkKN_af;P1gt4d}kf`6qNm#>Gl9SJ1_-GaL4D_?}>k7vM#lWQ9QWf z{XF(O!4EH@{h6HW$T-&+H7?5aom(Fj?;9VZ<-qB1e@FI4WE&&lzD)WcIlqt-%b)d( zoq71-Pwu7*)<6^1fpN$$xe^)k<NNufr-t5$_I zX3>>RWBBWM`_93iW+j7Q1cx6ZvGejk9h1-t&nLuO(A4Qsmm4tu`N z-S3Y##BXhui(Obh$N$z?ud?fXIxe>LB718&7RLCOaQ?!l524$O{7{q6)P93nd?WiK z?IHFdN90kyLjPQw`7d=3D;`5fZ@NQ1cE=~TqQ2zp;k*g{fNeW*oX6K}2=^;v<0U!- zMs|cXM>5Cpf8;%j_XM&Q;@bemDda7t>uXph>pKkJ$=YE`eb773<%lW(!f4oDs z*r&gW-Epu@Bxic1`mTMl8#>Ph!gpWt_4scd+)vT}3T#u&hkx+3+{w3~vuF3}HF%I2 z?xPpS;Q5aZ<0?Ea3)gSORp_h}q7U@FUa9^zFBa=aJj1tSiXZs2mhRG?ZP9R8R*J*6 z)@iP{i&?e?#`g-ctc7yelZ9;jkPYEF{yDb3P2Xx*=lGxJy~TBR@+OfzfZh%HbFT68 zGJib(kaxOa-I$JMwccgMD_6>aXyr#XlCJsshH94!(Je6dWP8xrRLz;d_kGM8YxIvJ zcO1RV$fGa)n9iN+s_XCaaaam{oA7lPv`hK4PFu!ri^OCBeT!?V<1DNZiqGi&m5$M5 zY)4;zWASS3#!lkCWA+Y=P4%Bh)_yQuZeNeiqsje0de-%PbQ}3$UaPLjye}WtyhTpl zP;=5^$Kstl4+DS2VJzJg_#FFfQuQ~*#%@#}j!%@{U4(yZ&JnwUfPfp;vdJU7R1SzY{$VY3~pJaI_2f`HPyh zb-6>O`pvc6`vgTt_8NnQ91iQfus)8}+(L}i3U%Z@#e}E2qG88=p)k>lbT`W@K5rg?9s^PE`9#a4Xx{Dal^Ov*3O-o+L{s0`yo8Lo75Als9c0v!CuW&^%n#Jp8Z94YXH=@+ zohawkR__yr8d$c3A=2I&uKF1Jv6Zz`}@~rbxVuR=c66rIFl2z9nYzAUxK{xuoo~*gm)Dgd$G4M zOijp$$mZkBnmx6a49`}wC+X0a9YNfeRJ_+v(hI_=tY?J!})_>bv`NCqrsHyOhUb9Oi{o9WKMzAI?u3(9C@T-sUY&H(2|5^3s2y#y0 zf8#pt3;zPLBD6bIs^1vM*MnbOimqnEX86M#vkK1-WPT(cpAm;J#@>f-q32E&{H@74 zNBa`GOme1tsr*Ao3;Xc7eTg-Sj&_Tk-4KW5^}n|9KVpC!n~!gdR=}{ z(4+5c+g=s-e%Vn|=f8N-l3PB)4|CC6MP_gQy^ije;o`%*vo-F~@K2Ge#!EiHxqM99 z*uwfP#Oyg^Zg=*rgMM^Pb=?`ByAS}iduPZgvgwaQ?rekhSo?2ltN$-l{9fZ7cH_>sAJa8( zn`5(Y$i7+aP%9!b<11>tqfO^Dep3&M;joXU=MEUVk(I%8B)-Sl+Cg8abDi`he03~+ zc=A?c+)e%taNG#bY5ct|8IQqnjyPRN4!KdN4KI*)J$o0h=>WEj*Y*e=>#XcUGUY^= zM-o0N%_$KqRX?4tt&L4RC@XSn6#V2TTj9Tz@8-d#FIVr%divV4Wiy!S=;HhIY(Cqf z!e%vVQ}}1;laED9v=zAdFsvuSZ!XI)w{${poJH`adv`Y<^J4?{9DwH&etRFb!|1+N zp3415U5M)N>`rcbaymMfpRxFcwRLhXzOLx*=NoJJaBnxeO8*-EsL!q^VBZg}=V2kQ za6MH0p2zq68~DW{4s%K~v0HB65C2};JCWa=T|2Q?JPLr^tr2XjWPKZG(Z%hsm>D z`EWd*QLD^Pe7YPSaf%tY#_TnyeX|TLnW4yg?Zw}91#(OQAzhRPd!NzzH zS&h-GW~=*r)prOUq;H76b@;{eN|PybLO*=`h!xwTFh;jD|F9wa?mKHM@2vBy_a|3`F-*t2iW)@jG&Nus zbjQMX8NVFmp6Jc&y{6(n(D=@AbdSF4=$uZc_IUoP>TeXnwP5y(`DX|F5Ae{R9)zBs z!`u||B!3IuFz)#;dqw+-O7)p)^}f#bXwJ5sisv{!TwPavj+xy}$2qVpbN(*BY=HM2 z<6s-OZ?~O7#(K7q^odvXeoKA!W#nj29)<)KQvKd> z9LpOqOpdlatG$;0#>xXZ9)3rYon`yjF|2XPcVp-nK-Vpm>US2417X{ou8GF;V32z=^LbuBapZ*$ngyglFXN$h;gamaxtJ>18^dkp{GjYfP^@hp4kGdD+b z;r-irH@d~E#2?nyvD}H*#j^<;KNOc2)TYLGt|r6$8^0xo_GFtiN4VFM?#7l2>F!46 zi*%psydK%J*#0iu!|f;yLXm1KsS*M533tJ+)JKa>w98iG=Y!5;a53Rh#FaV z6wTRno3_93zrxRtpp&~1nbrFVE5)>p92EO}5FgQ*$+!3swZ8_I1JSQS`;&ZX$tF1y z$*E#St?x(5{b6*eC2>8mc^ltoI;PaFo&Oq<>G?vw1pSq@{xcrWP&U+u)7((LMfNXv zYSHy(#|yS&%t6`{IT7v|6?~Duh29t|cSlEGw2(iqVDr1M?~YcDi65v`zoi=I=t3^4 z3E7?K;V+(kcYILN=l<(kIbJ7p!@;s?n===dPI?>g_u{x0QW3&@FP5Eh><5TwXJ61IA zU8XIx$#AHGo)^EsUN@Z*=Ty~HlMvh~oOCq8@{@-*E7jwkKkA%AMXFA5wbuZmV;Q5h1daczH-&1Q`i`lnq_Wnch zhI?SW=-Gq*8Z>jrokGr*P)Og>y@C z@g*JL9}n9z#sD9OF;c$8k1z2}Gh4v=Ke77U_9dJ7ESG=fRs7}~ZN>BCoU6`!B~QZn z<8(HHZ$o2aE53Y)KJ})!9B+beEW9Vzu6;-BGv^-}pVsx6yiLzu;T{kEKiReq-p1mw z9KOq7IE)QV$XN~BKXBHkqam7w#&U1{b@~s7_gVbS_--@D&uQ#Nb?*|K?mLs({ zuW{W6@42=$4^^LA#{%LTxVPSJKG5?KgViIbe8}oDJvW4Ca>|KWyKIt=5F;_WDDt?to<>AN3?>X{~RI z@Y9EU+Je4@^8X1mp>C~V&-G{?M`NDK-iQA*=jOWTSjTw7`;rC!maQw*_lnX*_^vg- zeZ-b;91l>>`@yY71@R}9rbODe!j8t3Z0*d@0I#qg7+mp@eWNc zeLY6EbGPSMmCNS_Zn?~li9LT{f$hqyS6rXN3o-y^||x>7yEDI+6?;4 zPg%yV@9>Qp8;5JmL1b=5ek~uK09P0%`?(@wd}jZ7>&r>23GS?`3Q`=X+H#h zV?3Qs_8X2HINm}H-T=mB+CuyeC);m(i@7j9Esno>4*ws!I-n2VS)T}_x{-U{67B&+ ze3GfXQFA!I?(O(tk@E-To@=D= zJ)m&!Hm`wYT{5;NL!OiqV1Jd)j6KFhd?(EEDw(OKooFxa*%9bZQ*#bLdzs@s)ZO3s zv=156&^*R(d>nq~9ec)=J_Vb+PD0%|7rpq!eP9T5C3>|aw_XkJ#>TzL|DNod<==1^ zjuMB~>VNQ$F_~D`h50J0A?I%X{!=`%mEIwwXFYm`!aG`QZDGy}*Fsrad{4@kE%+(wQ0YX(~mC2LZ}+S74s?P_!Sx4yx3)*#lEO~_x@@fdvx ztbO2HMc;mWcpm+Sk$pKHHb?)l{X4d;!>+UC_b6kvzxJkR#W8%RFnwG5mD;3p4xbL7U4c&>BaK|KGjR;`EOAUfy3ES9A@7WcHj$vHok@-Kha zp1sxkE8A-iHSY~N9)|NYct~dp`LIz9H;!4HofF+7I8Rcy@#JHpl#w z{NuO-+zZr4VQJ8|lAKjhPF}J?v7$ldEg0>*eg7hrAogj#hj%hkrifhft4>=7X14iY2-$#H+b z>Z-pTDGRu+7QaW~KO2ql7~d}*AK7*$Z#kPbhi7Ab_rtobJ^z*qV39M~EHqQaygff` zOvaA2ez(AeZ}o3TmT?sQ54~rL$%E{*9xKMNN1aJ$!8jT(JHvbT;rHqJt7JT2Kaia5 z@Ux+i7x@SLehS*T>TpvrdjZc1ZLgu31jAk0Qrn3zO(3g2zU$EcN7lO5kf)My9+_vr zuqT_t_!pCq7tv1QXFR2K_-b zw2$DQo#5(@PrUNca&#!(+4#gcylWQTg(zphJP=PedI!VsJe;lZu0-1me}kIp_ZLfc zm7nVG4)fLMw?a3K&lAYZ%G2$%Z|(RF^gV4~SYuRRKa)K7N{Z9%fAfqo`1npSy^hRD zaCg;iUdg)Aw<-DivTZE>|Ka^n-xcIe&=+!t+(=%BI#bH|JlJyx`;DQfk?*nIVJvQ1 zajoavmfczFd(O7s>3G%7rME|w!fNQc+34@-N$w>nQv(eIr&sx$x zvgdj>7w8-DlXYsCXQF@Q=nU94sB_|51T-;XH04_X|EkNol)@*{fC zL^reJShP>bmv{LD{xYR&H<%u*Tl+uai}=OZ&RstiL$t5Qe<$fXk-rauV=fHVJISHW z*VK8I`H-C9N9(uJdOv#6~DsfFkghZVrR#-WNbpV`6H=? z^B;0grX$EO7SbtfYCzUX{nOS>=JNXgT zHu1f%)phr-9eWzl^P3pnWZ#PJUF6tZXolh!=j42T`IY`#$X?98dmT4~bsnCk_NUv= zgsldq#%kKWWN%HUxiOYE@fLiyGn^~wdL90QVO4jc!|4mPBEW;CL&anxemEX> z_srwX$Te28Pt=!RY;EzaQ&;`HVfuBg-*3xnXZLY`G5Xt@^=5WXf+zUo zBk`%&AA_IYV!FfHFzoXo+Rc^WKbDGKbgky^i{#|lFdQrn>Pz~MZM-pdF8Y|P-_gIs zrZ9)j=iAq8+rhrtehT>`#daE=miA}Rqs}Ko$eqdd8SwVkX6+TeQJvMVcyEiG$MOA3 z=K@<8V{h87vGHrD!^uE7U<{UB=+&32gT-fJH4tAXHnbsA-bOd02|3e|o{;0}VthDX zihXgkczG6|t;d(Y>fh3wyuN*h3V)N+*zxvc^k(<%&Nre*EeSc99aiI6gX3_$GJ@|f z!()6!{q@~|ZX%wW#dHk)YC`J1MSM?9_4+JoN!9>72f%WK{P~|}jvXD}u+lxX8gm4` z(fgRQ`RQkEC%|ESkgJ_ZJ#9wk(-`KZ$C8O*w3@|5FX=i-qklfghmQ&)(^;{x_HwEv;T|2Ncnmz#`j@WYmiNpfYk>UByoR4mw; zne(&VVK$Ga=I#7*GS9#(r&4t!+)vMTblx0I#r|G$R?CNeWKSa3ypVjt@2A4V4@tp} zA&y<6q-t8eC0{SCsq&_?nxN8VTm`UP0Q&KGe@`VL6vx`&?bl zH};&OWP{u(>yv$w{nzCFhu=Ns(m0G$?UVVmqgszQVq2&UZm76NDFzFS*SYLH-1#>8 z+oI?1{8M@O8r}EXUePa~3K-KX$b1RzV{5ASV3P;bk>R!Of1&@`=Dm&REBHpUM|*WG z@H2Uzz;F;h_M&@V`_t*V4$ZCXnXPTSdU~k&{9pLn^3efm=>2T&%NDsEy+Ky+6b1>;d{QX8}I{ErXIdOfPYJ1LBrqBp*PBi!d{fc{ssvuoS~M1L1~|H|iO zaLe^_H}<`&?P>V5Wh3~aIeR{(e?E+B)Uj~^E4kZfUq9&Qo1677hWQNi#z+3IG5Wd~ z%lWW&C?Aw>=kxU>e(U4ddn5S-bMDi4n!wM;*&c8`Nls4~4j`8=vlZGtSC8Fi%1>bP z0PUO8x0M{_vp8V7HTcMW5xGO{Zzs>(nH%5b1-2>VG=b$uHhm1Y^W<&&JLs3&`BQ4m z^KhLmM&0o4Nk&KhctSp$OSWhD)o01G*ztmx?1ASN{oToqZPp-R49CV_aReFt^@&9_ zhHS~shW8xpj>G%j@wNKclT8x$aDNZZ{NWzn>4onv`qZX0V&`YtBRTvXc{gaEF8_?L z=u`gv1h2fw8{%I^$0lh06vxYrhf1BiT;=y9Xl9}rh-WIjYEyMRJl1i-@9vf5JHx*N zxjCK3IUdYUzwn(r4>hnz)EfJEFErE1y_hX?YN~Tn;kkFzmK}4+pI52=?^oW~eSFV@ zl5L!C%LciTssEw2rvva?Pi0H#T1o#9wyki!h@DG}p^R zT*4YJ=aA?aRmgVVy{)+zk2XN+pW6BjeE$qYv65Q`&c~JCqvGJ zbzwA}9P7mF3VeHs3yjg>bZx-aot@tXTL*Jv_-`Edkjlm6Hr02K{WIi!0iWj~*;p8B z_~3gvKZlMN*inyOwpE|K$&vCR_6=qCEAnIr-FM(W4fYwfkc;G1*MD7&=Roro|1@RG zIQrC={5AFTA#%Gr|Br7kAY1O13(4FB&Mx$;A^AP@T*~LC;$OzjgdG$4$F)#A-{w5L zM;!1M_sO|bT!!FznJq9!SKD^Qw~JiZhpran%8Nu!glCl@=L>Z*y!RO1LrdP*_6F?h z!P>|8I26xZw8nh4skX-U3$*Qk=UX^FHNRh`{VL~jDEW_FY%GWJQ5$rP$>Yy*XE}GQ z_BHGy*Pp0w`6Tp@^4rhyZz)WEqnX{}_%AW|2<8LmGLKb%$1qTC469WC zpD(=Ini${32!2>Xhu`F7$MNBKdLOfeXRIf|_dC7f7sFBN57+m_d_FtFd~zo}E9q~m z{ae0oz{VE*_6`ZXeCy;YF46D$u z57WUgUMDW{B|0AOGurxDQ-!h7)i$1ATo>i!hqY$-J!7UG=6jH@K8J5%7~ zBVd_r{4^l*Pqw|!4%dG1DDtj%K8pOK$hcL#-4?d3==`|GI)Od%Gkp~9Ft#qSy-apT z?en^?y&m|+aVaj{$az>k^s{e7#)jtKOS@IC(UUjX#}Cm>{M-aBo5ODp!+qD}8`w6% zvnf5^+X&z44Qrdi9G0Ifk4M0K8XL$fFCyb;blS>ke9DipF`ew?{0}-RZ2Ac z^&b0S&ZoljGTptxS>0RU>r%evTPuBXcJ9@ou8XbW5OtF|lXSh}v3)?XM72|koJm0SLoJEZL zICedj-iTIQ!@DWz5VYHq|6E;^T*k&ud^pDOA+~kpbsN48<7B9N8Kc;5{;vKe;yLy{ zMaFRc8`8b{&S-KJEWgov1ik&y)@M&=xwDe~9^}o}_XpfZ>pM-}{)O%(=dX*0xP)hJ zr8zu46pr^C^LbIl}u;;hXy(e8S)J0JkL%ZqU)p>~ZFgij^o6yT|Yq4cde`b zRxi1P@72|q?r_bRH>c|X`>=*nx8i5%Tf(+><~Y}M@e(p;!1$H8%z$lGjd$A7)YwMw z&xv)OwRz8O5uIvIp}th_E<0ABT?bE?1CHdUBjl8EP`xME49#kr7#Cz^8{$15 z&lB+9Wqh3Kyb+o5J$*#`{?6;*dyEg}lkp83ms;bQJF;K-_f)c$)BO^A=jiL8#)oI* zr;6X=y6W?UBEc^g3$-bFzq0l}2M@(3HxfA#o?oZxRB{JAEBO`X{3FNL!q}T%ZswO8 zZIANb8n#appE0)A=szCK-+Un_s?XBQF5ADd&_Y@}=szgqud=f9Hm;=>cYm;zKEe~_D{EJR@{4cseY+J?79m)FxPg_`K(c2Ag zq$VWjTFEtbmOU!f_dqlCC7BKnKbH0M^M5>roQ95{g6W(Z>r{Ggfpa36J@vOGbDn(* zd-)P-av0ySwOt&c+n2nUTx-#y8#!BxRZ-&|B-iGnE7kAZl^2rzd!_oFqIhgw^&PI{ zWAX-~U&XGKa*l0j2Yzp+ZZ6UHA-l*(pVW3HJ(KDE;UTwh=nMCG>ceo7czsC6-P*RS zxQ^qG+hE+${J<~y+4Rm|RsHs5$ctcmcy}&6%U-TWt%6N>_kc}o;+@&FKY#IGu@AZ( z$nbtenvnCZ_`D`w=AGgndD+z*ekW}5Gx{ChjqHA&AJnTU(EX1cEy$IJ@#k{WJW&2fuQ8v`#3PPL13vBqhZsil*?AzkQ|z~u7n9YA z2g%tP-(KW|vGzT?mZCoc|E_943)shzBj2){D%E@5#b7wkhPh*%b)+`&%m;hcu??P& zozH;(Ts76W&sOqRXE>jzF>c^*Om<(}CglDFhke?{Sni4M3H$aioT>j+`D|?E-iZif zzGy}E4RT}-o$XxKe!%6v?gp8+<>(qCSLoi4*=yj&uAfT;I|CyYad$`~IV| zEjl@p{)bPDa=r=cg=h)8`7XU|MfH0GQK+pA#cTjaLyEny!Ffyh)v|w-@v4qQZ#bVTKfB3^9?l!FsT~Yx((fytFY(@w@ygUy#%Cwrr`dfqXJ{qWX@n;h!U%H-RDK zl$_2c!Bq0YS9J1!w7IsqY&pVyeX;Ano_q28)>f!v@h9Y(=VQ5;y z1I$O$mD+!#-I&jtk!2o;S37>YuKFJ~=}5BngFEPcMXWa_uZEAFfblx*r;)eSN^31P z-z`4#@V}48SkJnWUCXy$$W63y7kYP+zeDK#oUcBmM_tY3N`5)|$N70zI)1V?y#xL= zb-rWjx%Zdo7rS0Q75!#)Yv+&&_ABYU65m!m_`vuuuF^h^2dwpDx(6A?Q@qT$mP46w zl&=qiwMVoLS=Jx%j`W>s?71Hu%f0dkF(0e_Xc%^f@mF=Pr`Vfw!u%BTZQ0Z_zh1Dd zmsIDzq&~fkw8NDBA3O)}i#$lKqEB9y>(XVej$JF4UBt6F{~bfuX!tMI7v4=$5Ayr) z&gSZ?jUXAlKw&FcKY07jy8bLd=Y$?e(1OZ`j89# z$U2?fE7@{3-^jOg*MNr%xe-m)f3w)R4vLd|ImW%l$*&NP0)S$EVA06T;wnNc}^?zLBzP_5&pWHjybR7)h z5Pq|n40CUYuGk!w9agEn%NRF>)4C&HkIb#uHF0^ApUxlW>VFMJV?5r{{xjqG=(_4X z$uPIXjbR#rcL6^6mi-LJ6#n=|zFY;%E4I_{Eh973G4o1(FTT-qy}*Wx;XGISk=mxg zDn>=c@fZAiH(xH`t0(L~uy0|`FeYO$N}D=r4WT{0s3 z`}kr@x)4z$zBmqqdFdnoiFcH0JYgueA6~|F6zp<{vRHkEd%SdySo#&(k}^BkL;Z-hKtEA?V{woJ$SJJ~UgS5tF#0O>9H0%nygVA)89N*2w=S>HA3k4{$7n zPY!0^qB$KszW9DT74ka5b2ob?pxK%1o!Ima|EwWr8*Lw>fhqW+c*r^5qfqx8w@4jJafhZI0tfu!MSItY+`C%UUeiy`nagIf_g%uin!=mh1z``w8C- za2kI}BN#&sYE0LUmFhP~!#frsufp@5@+@?_@b}5iVJc&}z_#=hylc=K8|jZ^%%|%n z7~R`U4x)b$8TS}()<5A{brE8^5Wjd9Z;R)K_7ljYJJg86IykzEEt{&-|AS@2ihBf( z6E+>R(r+2)P+zhpwvnsU13qklUS7mY(EeiVd{l8y5nUI0_&(wLu%3DsDh?e9qrw$ACzZ-d#m1x)L+cc!-aurJ3y z!5nw1x%wH{N5EAdj(&U|XyHlR^N)TZv$1_!I=a!n*!uP!dRyXu!SO9Hzr;qhqxw6N z5$+3xcn-ohnVlEcRR4=Lto8CR*LD}DZhXIo{-a>q8O?7taVQ@opRGv`twc zp-rw8Q_!BNP0S?q0hXVsV(VMe9;Nb zK(bF{+n3_G%K2Eb&GY%bF!EKofXs+aam|*C{iSSf%!gu{Z%?lK^ z@6F=_@Vj;h?+=B0#OY0Fe-^K4eDtSyZ3+7_dASho&MT|;%aQ`F*T}vkU}3`!{AYa> zb%9HL$nIdvW#~8KhuQW$>)d0u-=9tQ(*L`dy+uz4bpMFeyZC$KYm8r9qn5VIv`;l> zEY%mu!QhueVVwXc{-~m@j&FKfn_bUdIaqyOQJ*g3t27sc^<=chy7k{cN4N9b*iQOt zKNODcXx4G=IwGG9%ZGSB=A-M#3NrSq_u<#`*f$!_ZhZIz86Wavs{JFfYuWcZdjCxn z=D+-2_;-UP-yJ~Y9cfJGqg*HgxyIHw}%sF3i`_ z3Hk=giRW1=V(DND-t z({LqA*0OJ7yOy|-eV-zgqLoO?*b-TzMBneXvCEcSwrfI`YhSMY@_U}?_s2YD=FEF} zy_fSoXU@!gKI7SP4Za&~Q`y^JuI$D3Z`iOM8$QAREI+a%{#M-7+4u;&OVLjvZ!5ZC zO^uh?+UV9azv*GGCWYVaD10v;Pk=Mz_WdxRD-VH9?uC2h%sXQFBXpilHr@FmK7G)( zC7K7}YpKopO!ff&CUnn$?RNIFC!2*v&LlhX7rIzJR`0CBnKUDFC%TTs-%GsjZ}ea7 z?30J#`BOQAFQ?)C3HH8ltfNhigy*2?k@C6|x?au?v%Ti}AhGz+dzJcQ_5!T1=dZGd zAFKKOF|}3y7j`w;R{b%v!~ft{tk~e5atR7$ZhE!`k2ZbM80vi!#W&p1-=< z&xYl6ed2mP&B^aV&Lw=YKFnup?@fk&nKrc#^Synv9ZJVobkFnEO!BtpgRyK-ugbO6 zKYcDd4~tHOBlMG<(1$#GMO~OmXTY)nnc=;!@%-{Q+2i5ZhJJpEZa{Y>8Aq$dFUpxU z`RQ)HiRs>&Eg^@GMtcGI{FW_8bA^4@Sgn!8`boAu8-~`oFQ<2hdf!3dy~**z?EF$YjE)`7x$TlOWKYJ53{t@=+Ae8<-Co08G3`jK1?&jO;0 z@WB_3%inkhf0^Y5)AI^{Zd-jojxI2FNnha+1 zx2~P*cmf=U($$yU$2WLB#-`u+hdt$C_OPZAyYCdMb;+FL`dr(?^#7rLeWCs6n%u^F z85z64`Mu-Vb@qmL;lh1Fv>m_jMS1|;D|Rs-ckLH+LtwbcwS8+*G>adrD0b5Vc0PMVp10OM5%x!dZ{Qz__cnBQJJv^2K8x=~zfg?M7lRx4 zd!Bgy0++fS?$g5jFT8JD8jqqLa2`nJtoo|9$Cu-o>-uE;r^C6LYoGDU1nujhZwk+C zbpH##J{FH|FmHD}N$l@Ib1yyC6tnqwy1K5m$MP{5;{3=*s&|L8wtTS;oPUtjfev|6 zF5%PF*|HNG*q-iXdj?;7`%}eXEBwdUuL;i$_v{h zHV5zHzIGznoy2%(&GSWc9q5}Nhr~8MPON9paUJ>Hoy)!C3w{dm4r_vwYf*L+dH3_r z5%hXyQmQwlKAz2G8(Xrr=#44i-Zc-tyo7wV==hI9(dF8k; zSB4?vw=u+rZl2BaMJK-d5&kdgtKVXcm&&v6@IB7QlgO28(c7+fMZb(allbW}*z|#@ z9p9WprZ^?1@ym^l^~GY}Mq?6t)Q+?XSz?zrvgyC*X2bm`n#E+R0ae_(l6fWl-=p7v zu8-_5V&_}1=`V?~uZ;0tz>o4OJbO$wzueLJ7cm$Ud{Fk8KY6yEQQ)P`gO_ZMnM zp|$|&ZeLJ@tJszgJ%pZ*J@J>vd|CL z;GczbzU_D&d2|e(UFGQr{+nyAWemyZ*IUcrv-9ZgY<@9-u3zQXuCN)u!!!C&tK)~r zJPVE37lXC&eONyW^Zzi14exeF-_Xa#WH)WvlXmz9xz-!Ku`88h>1h66i$3)>8j7|z zELXZ7`lecu8%M&ooB4I*HG|i;KxwF9JA^hl@;h5U;s3+g+l8&K`POSbEF;iAKyO>} z?-YxZYt?rv`B!LffIZ0A5`NgC!_b@~9^#i;voG(rwba(j`A#rS=hH9wvM-(bMyg+h zd-pKT#p0COCv+9dVLw)UCX+dlpI=3H0!$y^ePP#C>;1k>iWZU=>Vom9pq-libA)?RmmqPqH!0vG&A&2icF{ovdv;yj#$7i1WY1O0MN-61g1d zbNOs_TE9>F(y3O&yYNeIdfLF;R$P7&mt&nDP1j&;%h@(V`*wUL=hJui=4!SMCjTGq z0mUsEPu_-fdN(5J<(Mxc{VN^EANBU^$i|3IPyF&atn-C?sIVrK^t4{|G@f(Fe~BF* z(Vx(7{K>n@1M`gNYR_Xj()%J?)uG~Va&tTvupvVKZ?vPx^A1Uv8^x=;{%?BShlRWf zV`20Z{crOr9bug*Jew#dk>%ah@Lo{Jz3_aXdiR5$t9g5%4S8_|x|d;@LZA1Q!Z;Wm z&-VX{b!R^QjURV|{jC1pk>QtnYu;xP$NM~worEuOZfpzVTc{hk`j(^1+uQVw^WT<7?rsN#v{C)T`+m>YMx8eJ)1coqn zh4;3iANcJU@_r+CA9h|SpDxDxm^ciD&3$V81^N-N%lr5?cKysJ|8dMu1w6U&IzEYB zI^#FUYEResaJ@(VR@TMm+g}xQx^_BS8~7^ZBj4vk=t%4@<;&a1XomJa{QiF-Gv;L7 z`La)cF@x`z6n9){W!%``6UX@58QucJApan-viBj~sa z{>#MlZy2`Kz6ZH>Bm{`2VXOwM=xd{?1{ppAEieI_5@$d?cE z(K=-ApoSf|>Ns5t?`SjyzwvW14AyO|8})}t49gDMo`>Nf=X1or3tD+lTqVByp*;j< z*vjVm;k*Xl-}H}?&9vQ!uDS6{-j@6qayq#ekNy(AyGrK3Ay@JU{)6e!o-V@k2)akn zErM%2Ix)=DxA;l>``9ylNfe%Ag?pInOqgEhhd0~{EQIq_J~{=am*6d7)%T(g8@;a} z{zK$nH~bsJPG=aCqN~ZA0mB42n>ikd&b+L6Se%;Du>h`~Vl{%yb?2{W=N9`xstBb|CFwHJbT{tru;eCwXMZ*a-IMCBj0!* zi)YjUjqx!WMR&ws2ho4IdO41+E!a|L+Y$e5_8YTnod)j))~fd~lWXk1hv&Jv>X}mc zE<5-kc@?&&<>pkj{|qDSVLh~XlP#mjdfoBSwoqTpQ(|+N`~&%7o|e%S=yP_4wd<@c z+<)o=o3mq*cH?KY&bI?S>%;vB{UL|%u2tWbhPBtC7aI0dzZ=nyA2&2V<;xUZIr80&6>eLkDMq=rVC%4nPX=4@Z=rFQ>#iL(__3A9t*AeJ?kb7}M zRfmeDFiaAUWBDbALmw*sVEe}WHII*%;5!-ZG3@>Xh6m8i!ZQf2rv1%-VBH_zIcz)t z&kFt+XTPAn`d#Iy6`BEZLXKqS=h^vUGTav4+wIHm%h?=qWiE`Tk=+;XA+C#K`V+a{ z@5!ufg)zSLd^_EneX-;5@;v0?rFb4>&-Jj~#eO!VY)n6fdlR-F;My6+oXLDP5$&$_ z*TC8t-QKph$Xmd+@6dl{(~q)u>GcjpdJB2m(zR6l->?mHypT+>C>>XI##o!k<6>hr z+-CnNy2~7Isej1T@_jOPCw~e(^p)N4{j=toF50m5cKi?R+iQOU9sV+mNqxw6UoZv0Uwq z?!z~MyubOqB|E%(oo&bmFY)Ev2G6eeEcj@tHEX$7(3>BKW_GRmUCm-`=kll5a{X>a~*#qP{DQ0(?&$M!IvXdXI; zo^Ne(v-}hW^}JeRG~T6O(bpYjaR~3P#i3u5S8aTq41jGVo%fJ+6@5o(o2u-2F}(tbBD4cx|xkt{Ne}2M6JpH#;4yT-aCjMbUeXz`B})*;$p}B z4e^%9r%T z57;(`oxRxR{<92nK6OnV$LHG5vfXVxaw{|!vPrz-+48zQI~IsVz~0=o#kNA*1$Au1 zbHDqEv3#zcMNgA`G8^{5zcK%IfSsT67JQ2~I)km#oNt4_pW65jxpb-g+gnVhk+G*3 z9?RGL$-PpYVs9oEsahMJGZg)5)q8KT_1i?h4|B&9zH)PY=~i;^#ZNf@1J;n+C-KQN z_I*M3<@`c#_BB~k$e)T%T*9-u^kQuv)4#c6TiH!}Py6G^JdfVRfmZ!mLe|;r8cL7n z^kHp0Ur&tghAY84r52?zIpO>+n2uA+w!l-525)wW@Z+LGg z+t_+k$k#4pw1A-(-tXbx0Hzb^{)-RSpuahqUGZ%XpO{6j!#WC&aVmUI6rN2amy?&0 z;U1)T2wzk9*qDn0h^rPYe=k71VeNr}w zj>qtJ6gPDymh0t-^7laW->X?+eC}pEd0gJi)3&uZPb6m}G2e_0Ay@R3*gT}*@5r-| z@UBbsys)_(*pBSIVC`mm(R}nr`p41nnp$|7Slz&;bJ-|A^2cFc7lv2tw}gKq^kQ1@ zYdIF*cly{FFds$lld!1QC40-~_~SU|>$-LwnUPqIvKP~sPa-~wo55r)FIjH?x*E;z z)w;$V=*}b08h40gw5j7Q*nf=cux=1du$L3Dnw;`Q;$AGs$RBWiq}u@UmyEsOY0kbEVA!!{t=G019V^(whA^&`&0M=t-}-^vq2#TlU2V-q zv1=!}^9;WYB6D?kM)R?_rUU5f1aEh=t?|sYS+_2`y8ceXs=iQDuU5*59ki{0!97%X z_b9if9oA0s>Ew+;JB+NC(W>#`+l}-aJ`wAo*~6dt68h)S7w#>d5XW=aXpD{JZ8?(t;U2Uj z8t?O!E7%hJdIOA`SSNhg`OorYt~kAGKZI}oD?WFi-;dreVIB(S2yOo&^8v@~OZA7e z1se4_xt6}?*ggTa-Cci=?D2Kg`;Xz7em2{6bvJ23b`#eR!21i_592lGi`-8{FOuDj z-520J1>LB+>RrmR8GNnSu%>bC&YJ%XkavU8Y@&Z}%_mD?WKXDl`440dMSmfk>+|!u zT4>F9c$(QW4rB~yjuUOXLw>Z%+ zTor?m&*46?eAcyR=@X;sUUm^oXv!t79ZA+aK2dARo3-EV+?=uq_2Oo-`tex@^4tr> zv;EGOd&clgvzlX$V1G~kFve%6vg1H@{tPQWC+*la3a$_%bN{j=qbr|<+7j+H+{+ZZ zSmVj`oMKx9Q)e=txAm6y z_3%!FXOo)up~w)A!nY~;sTh;YX$ZAREkM?b~kEe4XeGicPu>Ac1&slQjW%PUN6UV{O&-Dg5zCWAfmN2mLcjE(7w!FIe&)UPRcN?SXz)EB}!W%{m-@3UXD52n+#!u%%} z*Qkd&)U1D$9mH=JHB|qDTJA|tXxo$@E)lm!@r|X^y?k8H-*d>joy!aUXcQD-y=VUU~hoT*xJ>+B;G2T#r z8%f8SaH!8=U9Z^Nejqtw5(Vrpvu_`|H$dCb93-XtPFN4Kuh*Y*m^UZ$b~Mu*t2No?hkh#lw*0UGJuBJmo-66?`nhoZPVPYC`}ue$lJy9= zTcG`$|2k>=os6;ae|7Rtbv{d6COzgGc|6aO72+y))9H=XcbDZljy+dQhodK}Xl0JM z2D?9ZJ;bsv8~CGWO4p<8drtdr+K1{tAFyBCGhA`r{!4k4=4ZQuW zKiPM6{xdz^XDBbPGv>hLo;1w)^DsWLGZ{jDz(1c%wXh8NriMk!?Z@+<{uRHsxO!(k ze_#GJkg+dZ8;cTn{<4JB+W>*$TEl?a!@M^SadhKRh!_uR^!GO`lKZ z=o^=4yAigF*l;-ij&weYytnvoSGwseTJwjsuksoFX-yc%YTFFGv8vq9z8Sm4Kg`XN zm*qlt^yV~4n}+HgzGzE6dC#@`;r6^R3i)uA>!Ge}sEyA{eX3w@JP!Vs$e+m;GQxAA z@I6QZZyt_&iG73XSL0KMJdn43${zKqfGZ7k#Qjat9L?rzKisv|gIwq2#_N-*j}*7y z9cF7?^UfaL8E8JV-XuS(HF@~5!+TB1t#k}z=Qn64k#(2YG_k40*lx$!OzZO zDSiFfR)>Fz{h~(qZshevD^K!{a%g&^_W&BJb-=8>-0sQ0gYkdFAAz=`da(h$YX*Al z=hNF?zP=Af8`ssUf~PN)VuI3uv&L&&ga3NqtKki z-t}E`FOf`atkxd0Bjts4y7GSw)(XiTRWtsBT^}l?ZZ?{#m)`$)D=gYy7w zOU?CK(<|SiAK7#~J)bmGYw7uqV*6%eRjZ>N@l3)W{FdV@=~36iZ=Hwur5CKSqdXe+ z%jm1a_dWkdaEx<*=9za`gNg5VzBZcI$l8pbx&--Tjo_1KVSP$$`msq(ET2Uy2a~(m z+J{d4tN6ZVc@{oCD$ZxaD`?FnvYlODriS=GyHa0G)Q*y_M7@hM*rvj?HvjCzXTR6U zHM-lP8w~qPsE~fM8 zSG6yr??JbIk-kT6Gg!VL!@MLu5$(&)m%zP}T^G`^qZ*^XB@6kb9?wU0)&KoQ z6B?`EH;UTRb0OP1YacF;CevX|%ha&=FTVQ*MzttBF9_pcdb~Ad{V>c&^C4{g8m`sp z6z}3MdwH9#plg_#F%FJv>DkYIbA9Z7^Ze)4gzXnsYZT#|s!$iAtzEyEj*j>T^QUnm z8_?f8jURi`J6AkM+ZLc7YMV&MTKq6T+gf~~@8ui9p`ND+o8?$J#{N=rXY4J<*ZDfkW6O`pI7<#Kb*&$I{VF^gk2;9W&)Sb*$7gb8Pd?d>En!Zg z&!kOkd*U&U20M~SzFY{0aVtAm9N`HywzR%lETH2vvM%IjdgH9IdIp_s&(}@JAIYD0 znYV0&C(LV}g3Gl~E7P@%RS${xcQ7|)`{B;JitAx`Zsx+DUNU<9xL9o5W;eGMl42U;7y6z10@uM!62!3G!nin>(PrO)l|S_??Vm z!Gbcl0xv*79_F`U4wtTpw*@;3Hm_-aGrl$0@lP?FMcxW{XV(0VfY=$Y!?TP~ z(<6PdcpA^2j>Rh92A-Ht{FX%0!CdYza+}eyB_8|iTE`v9=?mvn*X|+bc=`|07V7sS zeDQUy`i+R_Rr?-dcr46fSg2ja$X%;7{PJUTa~rE~#^OK841H<}{je2hv+ehWRdd2H z7g4jqJ%4@#jE(x=&g3}{wJ|@N&eLGKP)x5T=Uu#^Z#*jo!S}|SY%v*|kRh(oyL8-x zcOc$N>Q?>FQi#@CorOy=W_oIfajP2qf}W_}6VGW$#A&lm82i}x!u#)2wlVXoW3b@-#B&hXs4Y)Rhj_BX1t z6Y1l-@GLmm8{Ysr@8!cQ(8|yFF14>qqxS~L_>#>Rka-?iC!pEV{vJBzU_6q&W62!L z=loEv>5Sx6-VVk)VcrCeTU^Ii%G3ODJZs=l%cGCjGo4TL%V;Ry}`tnqN+(uMfHIXR}^>D=vi`$~T73x>m@$0O{IcQpC5%1rjzkl%o=om6{+rhrg=gQ{E8-Svaln2RtZGO}SG==pZ_ACEYwl6= z$H?s`Zm^cqV1zT-jUVJdxyCBLg!f-E_x9zFa14d#6j-f=rufSD4b9@b%C(5U*>6WwA_e%TWJ&?S` z_`}?79^0QnYa9*lx`gkX!gK04ya5qx@#JUtElwb~!3ts2wbrS~56=h{E4twAgniQ7ATtG4AZ$7}NAU^?Y!x-aa; z#n@VDu5TwX?CL}@gwOq6Vty7Zp}v_L7Qr^ZL6)x+tJB~L?H~N=KM)`n`s{b`|sxL2g;q-$hi%k zIWWwGX|8Ptat5OLqt03i{hlx7%k{~B%f~5nevM{1zVl#Oll`Olejn%N<;CatI^*e2 zUmMr2&~Dtyk0mRDlGS$V>FWuWzvXT==H5=_{N2-n^b4-X>puRPTJ4 zM}~Ff@LVXrf#21Q@Q!K0w&EuKOSC=CmQCn-LA+=44L?`U*ghuz34HQ9IzTM?k@GMg zw5FpAoKy5|{W`4K#_kh~i^%K^_vhp-V!xPF->5F9FC)LZoVs4y)3CpY_eJ#jZ8VzP zrfgdbH(Ak}Hnkv{E5@(N6Ez^0YsH25tWSn}nBc#BJLAzEFw3jxQGV)3#`C+XOR$}S zcM$v`4~D?k5=?--U7$viXU5FD4w!M|X=nJrD&;NC9nOnxu2 z`|;H%7_NosAoOjV!ALxju+(BjLN* zoUappu?+VmVLdxNi|$ck6UJNhKlz!A2gyF$b-x=H?g5ML+U0+?0~{^nkp7de&JHX3t06@gvv$GzK3VRUlCArjPoRC1%vtzW=ezFo zPBb5K9}@B)+;2n&@N`1-w}{En4eZt7stbK zELwf9m`BIf?7Rc+I(YQwqQACrF#K1}sb4W$lco04@OAYqgLm%2yFB^hd_O|JGp`DB z>%2K%1zDTIbZ%p{_7Yz%R#!P+3C~3F+Xm15j`hu=6`e1!W4Rn}LGMUY3;Gh@=H&LVe9zx=-Pji9G)b(@ zdmZ`F&c77r;e0Yb@YCx!+s^qZ^j?iG)TqZAs{a+JzB3CxQ-`X2xmQ2kpRIGqYemi? zbZkt;BaGFtu_W&zZ$|L_6u8yLXdjz#A=K;82cl*0UXK1&w6AElmJr{kZ5ueAuT|@z z;kjrukpK0k>@V2PrsroiPLl_GRlbDo12P`7^))9sMC`1?Ci+gO%i-Q7e-|D5!yKV{ z1|~P7X?$_Ny48-H*5n<8HstRO?0Fo9*1q4q8jkzm{{;UD!RO-Dm#y2v+s1jQQ>(ka z1D?eV)%V$X&aSVtbtLx;GWS5=8kRw5^_6I-ym+foU1Dz&HmU#7Lv_|e-CIA7?iTIS z>5u3>7S6eJ>m&I+o`KA@KZ{H?w;b>K=4$mlV$hYm8{zo_hA_^V=Y@HEygs{*aP2a3 zz7?A8g6+u0vv-^Mo3^#OdO=0|%wUz=Pp32P_C8OHOq$c1A`Ou7d z*qzsr+n0`a<$52_97DeULMDF~YisATbO;$EU4I_-3&O<1n_0^o~ zC-Fjgz8J6jpX7JAfCL~p*tc~=@PES2Vd!%*y4T3A zdC!8J(Q>qBqkQGp_O9KlttGl}51>y)@+!=!vbW^Am=t%i_Y>DcZTH?sdb75!Q5}T*M(g2%bqcu15 iQ=F@hNe4QcibXegYOtR~o-reyF23?LTSqS3-}rxjk{^cv literal 0 HcmV?d00001 From f4c2a63a5e298c6d2c486b66da2a689e437f925c Mon Sep 17 00:00:00 2001 From: RVC-Boss <129054828+RVC-Boss@users.noreply.github.com> Date: Sun, 14 May 2023 16:26:33 +0800 Subject: [PATCH 13/14] Add files via upload --- i18n/en_US.json | 21 ++++++++++++--------- i18n/zh_CN.json | 22 ++++++++++++---------- i18n/zh_HK.json | 23 +++++++++++++---------- i18n/zh_SG.json | 25 ++++++++++++++----------- i18n/zh_TW.json | 25 ++++++++++++++----------- 5 files changed, 65 insertions(+), 51 deletions(-) diff --git a/i18n/en_US.json b/i18n/en_US.json index 8a41ab0..eafbd1f 100644 --- a/i18n/en_US.json +++ b/i18n/en_US.json @@ -10,6 +10,7 @@ "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.
如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录使用需遵守的协议-LICENSE.txt.": "This software is open source under the MIT license, the author does not have any control over the software, and those who use the software and spread the sounds exported by the software are solely responsible.
If you do not agree with this clause, you cannot use or quote any codes and files in the software package. See root directory Agreement-LICENSE.txt for details.", "模型推理": "Model inference", "推理音色": "Inferencing timbre", + "刷新音色列表": "Refresh timbre list", "刷新音色列表和索引路径": "Refresh timbre list and index path", "卸载音色省显存": "Unload timbre to save GPU memory", "请选择说话人id": "Please select a speaker id", @@ -17,14 +18,13 @@ "变调(整数, 半音数量, 升八度12降八度-12)": "transpose(integer, number of semitones, octave sharp 12 octave flat -12)", "输入待处理音频文件路径(默认是正确格式示例)": "Enter the path of the audio file to be processed (the default is the correct format example)", "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比": "Select the algorithm for pitch extraction. Use 'pm' to speed up for singing voices, or use 'harvest' for better low-pitched voices, but it is extremely slow.", - ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音": ">=3:using median filter for f0. The number is median filter radius.", + "特征检索库文件路径": "Feature search database file path", + "特征文件路径": "Feature file path", "特征检索库文件路径,为空则使用下拉的选择结果": "Feature file path. If null, use dropdown result.", "自动检测index路径,下拉式选择(dropdown)": "Auto detect index path in logs directory. Dropdown.", - "特征文件路径": "Feature file path", "检索特征占比": "Search feature ratio", - "后处理重采样至最终采样率,0为不进行重采样": "Post resample the audio to the final sample rate. Default: don't use post resample.", - "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络": "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络", "F0曲线文件, 可选, 一行一个音高, 代替默认F0及升降调": "F0 curve file, optional, one pitch per line, instead of the default F0 and ups and downs", + ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音": ">=3:using median filter for f0. The number is median filter radius.", "转换": "Convert", "输出信息": "Export message", "输出音频(右下角三个点,点了可以下载)": "Export audio (three dots in the lower right corner, click to download)", @@ -43,8 +43,6 @@ "输入实验名": "Input experiment name", "目标采样率": "Target sample rate", "模型是否带音高指导(唱歌一定要, 语音可以不要)": "Does the model have pitch guidance (singing must, voice can not.)", - "版本(目前仅40k支持了v2)": "版本(目前仅40k支持了v2)", - "提取音高和处理数据使用的CPU进程数": "Number of CPU threads to use for pitch extraction and dataset processing", "step2a: 自动遍历训练文件夹下所有可解码成音频的文件并进行切片归一化, 在实验目录下生成2个wav文件夹; 暂时只支持单人训练. ": "step2a: Automatically traverse all files that can be decoded into audio in the training folder and perform slice normalization, and generate 2 wav folders in the experiment directory; only single-person training is supported for the time being. ", "输入训练文件夹路径": "Input training folder path", "请指定说话人id": "Please specify speaker ID", @@ -52,6 +50,8 @@ "step2b: 使用CPU提取音高(如果模型带音高), 使用GPU提取特征(选择卡号)": "step2b: Use CPU to extract pitch (if the model has pitch), use GPU to extract features (select card number)", "以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2": "Enter the card numbers used separated by -, for example 0-1-2 use card 0 and card 1 and card 2", "显卡信息": "GPU information", + "提取音高使用的CPU进程数": "Number of CPU threads to use for pitch extraction", + "提取音高和处理数据使用的CPU进程数": "Number of CPU threads to use for pitch extraction and dataset processing", "选择音高提取算法:输入歌声可用pm提速,高质量语音但CPU差可用dio提速,harvest质量更好但慢": "Select pitch extraction algorithm: Use 'pm' for faster processing of singing voice, 'dio' for high-quality speech but slower processing, and 'harvest' for the best quality but slowest processing.", "特征提取": "Feature extraction", "step3: 填写训练设置, 开始训练模型和索引": "step3: Fill in the training settings, start training the model and index", @@ -61,7 +61,6 @@ "是否仅保存最新的ckpt文件以节省硬盘空间": "Whether to save only the latest ckpt file to save disk space", "否": "no", "是否缓存所有训练集至显存. 10min以下小数据可缓存以加速训练, 大数据缓存会炸显存也加不了多少速": "Whether to cache all training sets to video memory. Small data under 10 minutes can be cached to speed up training, and large data cache will blow up video memory and not increase the speed much", - "是否在每次保存时间点将最终小模型保存至weights文件夹": "是否在每次保存时间点将最终小模型保存至weights文件夹", "加载预训练底模G路径": "Load pre-trained base model G path.", "加载预训练底模D路径": "Load pre-trained base model D path.", "训练模型": "Train model.", @@ -75,7 +74,6 @@ "模型是否带音高指导": "Whether the model has pitch guidance.", "要置入的模型信息": "Model information to be placed.", "保存的模型名不带后缀": "Saved model name without extension.", - "模型版本型号": "模型版本型号", "融合": "Fusion.", "修改模型信息(仅支持weights文件夹下提取的小模型文件)": "Modify model information (only small model files extracted from the weights folder are supported)", "模型路径": "Model path", @@ -93,7 +91,6 @@ "Onnx输出路径": "Onnx Export Path", "MoeVS模型": "MoeVS Model", "导出Onnx模型": "Export Onnx Model", - "常见问题解答": "FAQ (Frequently Asked Questions)", "招募音高曲线前端编辑器": "Recruit front-end editors for pitch curves", "加开发群联系我xxxxx": "Add development group to contact me xxxxx", "点击查看交流、问题反馈群号": "Click to view the communication and problem feedback group number", @@ -118,5 +115,11 @@ "性能设置": "performance settings", "开始音频转换": "start audio conversion", "停止音频转换": "stop audio conversion", + "常见问题解答": "FAQ (Frequently Asked Questions)", + "后处理重采样至最终采样率,0为不进行重采样": "Post resample the audio to the final sample rate. Default: don't use post resample.", + "版本(目前仅40k支持了v2)": "model architecture version (Now v2 version only supports 40k sample rate for testing)", + "是否在每次保存时间点将最终小模型保存至weights文件夹": "Save extracted small model to weights dir when every 'save frequency'", + "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络": "Use volume envelope of input to mix or replace the volume envelope of output, the closer the rate is to 1, the more output envelope is used. Default 1 (don't mix input envelope)", + "模型版本型号": "model architecture version", "推理时间(ms):": "Infer Time(ms):" } diff --git a/i18n/zh_CN.json b/i18n/zh_CN.json index e5e8062..70f89fc 100644 --- a/i18n/zh_CN.json +++ b/i18n/zh_CN.json @@ -10,20 +10,18 @@ "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.
如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录使用需遵守的协议-LICENSE.txt.": "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.
如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录使用需遵守的协议-LICENSE.txt.", "模型推理": "模型推理", "推理音色": "推理音色", - "刷新音色列表和索引路径": "刷新音色列表和索引路径", + "刷新音色列表": "刷新音色列表", "卸载音色省显存": "卸载音色省显存", "请选择说话人id": "请选择说话人id", "男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ", "变调(整数, 半音数量, 升八度12降八度-12)": "变调(整数, 半音数量, 升八度12降八度-12)", "输入待处理音频文件路径(默认是正确格式示例)": "输入待处理音频文件路径(默认是正确格式示例)", "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比": "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比", - ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音": ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音", + "特征检索库文件路径": "特征检索库文件路径", "特征检索库文件路径,为空则使用下拉的选择结果": "特征检索库文件路径,为空则使用下拉的选择结果", - "自动检测index路径,下拉式选择(dropdown)": "自动检测index路径,下拉式选择(dropdown)", + ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音": ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音", "特征文件路径": "特征文件路径", "检索特征占比": "检索特征占比", - "后处理重采样至最终采样率,0为不进行重采样": "后处理重采样至最终采样率,0为不进行重采样", - "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络": "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络", "F0曲线文件, 可选, 一行一个音高, 代替默认F0及升降调": "F0曲线文件, 可选, 一行一个音高, 代替默认F0及升降调", "转换": "转换", "输出信息": "输出信息", @@ -43,8 +41,6 @@ "输入实验名": "输入实验名", "目标采样率": "目标采样率", "模型是否带音高指导(唱歌一定要, 语音可以不要)": "模型是否带音高指导(唱歌一定要, 语音可以不要)", - "版本(目前仅40k支持了v2)": "版本(目前仅40k支持了v2)", - "提取音高和处理数据使用的CPU进程数": "提取音高和处理数据使用的CPU进程数", "step2a: 自动遍历训练文件夹下所有可解码成音频的文件并进行切片归一化, 在实验目录下生成2个wav文件夹; 暂时只支持单人训练. ": "step2a: 自动遍历训练文件夹下所有可解码成音频的文件并进行切片归一化, 在实验目录下生成2个wav文件夹; 暂时只支持单人训练. ", "输入训练文件夹路径": "输入训练文件夹路径", "请指定说话人id": "请指定说话人id", @@ -52,6 +48,10 @@ "step2b: 使用CPU提取音高(如果模型带音高), 使用GPU提取特征(选择卡号)": "step2b: 使用CPU提取音高(如果模型带音高), 使用GPU提取特征(选择卡号)", "以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2": "以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2", "显卡信息": "显卡信息", + "提取音高使用的CPU进程数": "提取音高使用的CPU进程数", + "提取音高和处理数据使用的CPU进程数": "提取音高和处理数据使用的CPU进程数", + "刷新音色列表和索引路径": "刷新音色列表和索引路径", + "常见问题解答": "常见问题解答", "选择音高提取算法:输入歌声可用pm提速,高质量语音但CPU差可用dio提速,harvest质量更好但慢": "选择音高提取算法:输入歌声可用pm提速,高质量语音但CPU差可用dio提速,harvest质量更好但慢", "特征提取": "特征提取", "step3: 填写训练设置, 开始训练模型和索引": "step3: 填写训练设置, 开始训练模型和索引", @@ -61,7 +61,6 @@ "是否仅保存最新的ckpt文件以节省硬盘空间": "是否仅保存最新的ckpt文件以节省硬盘空间", "否": "否", "是否缓存所有训练集至显存. 10min以下小数据可缓存以加速训练, 大数据缓存会炸显存也加不了多少速": "是否缓存所有训练集至显存. 10min以下小数据可缓存以加速训练, 大数据缓存会炸显存也加不了多少速", - "是否在每次保存时间点将最终小模型保存至weights文件夹": "是否在每次保存时间点将最终小模型保存至weights文件夹", "加载预训练底模G路径": "加载预训练底模G路径", "加载预训练底模D路径": "加载预训练底模D路径", "训练模型": "训练模型", @@ -75,7 +74,6 @@ "模型是否带音高指导": "模型是否带音高指导", "要置入的模型信息": "要置入的模型信息", "保存的模型名不带后缀": "保存的模型名不带后缀", - "模型版本型号": "模型版本型号", "融合": "融合", "修改模型信息(仅支持weights文件夹下提取的小模型文件)": "修改模型信息(仅支持weights文件夹下提取的小模型文件)", "模型路径": "模型路径", @@ -93,7 +91,6 @@ "Onnx输出路径": "Onnx输出路径", "MoeVS模型": "MoeVS模型", "导出Onnx模型": "导出Onnx模型", - "常见问题解答": "常见问题解答", "招募音高曲线前端编辑器": "招募音高曲线前端编辑器", "加开发群联系我xxxxx": "加开发群联系我xxxxx", "点击查看交流、问题反馈群号": "点击查看交流、问题反馈群号", @@ -118,5 +115,10 @@ "性能设置": "性能设置", "开始音频转换": "开始音频转换", "停止音频转换": "停止音频转换", + "版本(目前仅40k支持了v2)": "版本(目前仅40k支持了v2)", + "是否在每次保存时间点将最终小模型保存至weights文件夹": "是否在每次保存时间点将最终小模型保存至weights文件夹", + "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络": "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络", + "模型版本型号": "模型版本型号", + "后处理重采样至最终采样率": "后处理重采样至最终采样率,0为不进行重采样", "推理时间(ms):": "推理时间(ms):" } diff --git a/i18n/zh_HK.json b/i18n/zh_HK.json index 0ec1528..2d00590 100644 --- a/i18n/zh_HK.json +++ b/i18n/zh_HK.json @@ -10,21 +10,21 @@ "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.
如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录使用需遵守的协议-LICENSE.txt.": "本軟體以MIT協議開源,作者不對軟體具備任何控制力,使用軟體者、傳播軟體導出的聲音者自負全責。
如不認可該條款,則不能使用或引用軟體包內任何程式碼和檔案。詳見根目錄使用需遵守的協議-LICENSE.txt。", "模型推理": "模型推理", "推理音色": "推理音色", - "刷新音色列表和索引路径": "刷新音色列表和索引路徑", + "刷新音色列表": "重新整理音色列表", + "刷新音色列表和索引路径":"刷新音色列表和索引路徑", "卸载音色省显存": "卸載音色節省 VRAM", "请选择说话人id": "請選擇說話人ID", "男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "男性轉女性推薦+12key,女性轉男性推薦-12key,如果音域爆炸導致音色失真也可以自己調整到合適音域。", "变调(整数, 半音数量, 升八度12降八度-12)": "變調(整數、半音數量、升八度12降八度-12)", "输入待处理音频文件路径(默认是正确格式示例)": "輸入待處理音頻檔案路徑(預設是正確格式示例)", "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比": "選擇音高提取演算法,輸入歌聲可用 pm 提速,harvest 低音好但巨慢無比", - ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音": ">=3則使用對harvest音高識別的結果使用中值濾波,數值為濾波半徑,使用可以削弱啞音", - "特征检索库文件路径,为空则使用下拉的选择结果": "特徵檢索庫檔路徑,為空則使用下拉的選擇結果", + "特征检索库文件路径": "特徵檢索庫檔案路徑", "自动检测index路径,下拉式选择(dropdown)": "自動檢測index路徑,下拉式選擇(dropdown)", + "特征检索库文件路径,为空则使用下拉的选择结果": "特徵檢索庫檔路徑,為空則使用下拉的選擇結果", "特征文件路径": "特徵檔案路徑", "检索特征占比": "檢索特徵佔比", - "后处理重采样至最终采样率,0为不进行重采样": "後處理重採樣至最終採樣率,0為不進行重採樣", - "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络": "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络", "F0曲线文件, 可选, 一行一个音高, 代替默认F0及升降调": "F0曲線檔案,可選,一行一個音高,代替預設的F0及升降調", + ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音":">=3則使用對harvest音高識別的結果使用中值濾波,數值為濾波半徑,使用可以削弱啞音", "转换": "轉換", "输出信息": "輸出訊息", "输出音频(右下角三个点,点了可以下载)": "輸出音頻(右下角三個點,點了可以下載)", @@ -43,8 +43,6 @@ "输入实验名": "輸入實驗名稱", "目标采样率": "目標取樣率", "模型是否带音高指导(唱歌一定要, 语音可以不要)": "模型是否帶音高指導(唱歌一定要,語音可以不要)", - "版本(目前仅40k支持了v2)": "版本(目前仅40k支持了v2)", - "提取音高和处理数据使用的CPU进程数": "提取音高和處理數據使用的CPU進程數", "step2a: 自动遍历训练文件夹下所有可解码成音频的文件并进行切片归一化, 在实验目录下生成2个wav文件夹; 暂时只支持单人训练. ": "step2a:自動遍歷訓練資料夾下所有可解碼成音頻的檔案並進行切片歸一化,在實驗目錄下生成2個wav資料夾;暫時只支援單人訓練。", "输入训练文件夹路径": "輸入訓練檔案夾路徑", "请指定说话人id": "請指定說話人id", @@ -52,6 +50,8 @@ "step2b: 使用CPU提取音高(如果模型带音高), 使用GPU提取特征(选择卡号)": "步驟2b: 使用CPU提取音高(如果模型帶音高), 使用GPU提取特徵(選擇卡號)", "以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2": "以-分隔輸入使用的卡號, 例如 0-1-2 使用卡0和卡1和卡2", "显卡信息": "顯示卡資訊", + "提取音高使用的CPU进程数": "提取音高使用的CPU進程數", + "提取音高和处理数据使用的CPU进程数": "提取音高和處理數據使用的CPU進程數", "选择音高提取算法:输入歌声可用pm提速,高质量语音但CPU差可用dio提速,harvest质量更好但慢": "選擇音高提取算法:輸入歌聲可用pm提速,高品質語音但CPU差可用dio提速,harvest品質更好但較慢", "特征提取": "特徵提取", "step3: 填写训练设置, 开始训练模型和索引": "步驟3: 填寫訓練設定, 開始訓練模型和索引", @@ -61,7 +61,6 @@ "是否仅保存最新的ckpt文件以节省硬盘空间": "是否僅保存最新的ckpt檔案以節省硬碟空間", "否": "否", "是否缓存所有训练集至显存. 10min以下小数据可缓存以加速训练, 大数据缓存会炸显存也加不了多少速": "是否緩存所有訓練集至 VRAM。小於10分鐘的小數據可緩存以加速訓練,大數據緩存會爆 VRAM 也加不了多少速度", - "是否在每次保存时间点将最终小模型保存至weights文件夹": "是否在每次保存时间点将最终小模型保存至weights文件夹", "加载预训练底模G路径": "加載預訓練底模G路徑", "加载预训练底模D路径": "加載預訓練底模D路徑", "训练模型": "訓練模型", @@ -75,7 +74,6 @@ "模型是否带音高指导": "模型是否帶音高指導", "要置入的模型信息": "要置入的模型資訊", "保存的模型名不带后缀": "儲存的模型名不帶副檔名", - "模型版本型号": "模型版本型号", "融合": "融合", "修改模型信息(仅支持weights文件夹下提取的小模型文件)": "修改模型資訊(僅支援weights資料夾下提取的小模型檔案)", "模型路径": "模型路徑", @@ -93,7 +91,6 @@ "Onnx输出路径": "Onnx输出路径", "MoeVS模型": "MoeSS模型", "导出Onnx模型": "导出Onnx模型", - "常见问题解答": "常見問題解答", "招募音高曲线前端编辑器": "招募音高曲線前端編輯器", "加开发群联系我xxxxx": "加開發群聯繫我xxxxx", "点击查看交流、问题反馈群号": "點擊查看交流、問題反饋群號", @@ -118,5 +115,11 @@ "性能设置": "效能設定", "开始音频转换": "開始音訊轉換", "停止音频转换": "停止音訊轉換", + "常见问题解答": "常見問題解答", + "后处理重采样至最终采样率,0为不进行重采样": "後處理重採樣至最終採樣率,0為不進行重採樣", + "版本(目前仅40k支持了v2)": "版本(目前僅40k支持了v2)", + "是否在每次保存时间点将最终小模型保存至weights文件夹": "是否在每次保存時間點將最終小模型保存至weights檔夾", + "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络": "輸入源音量包絡替換輸出音量包絡融合比例,越靠近1越使用輸出包絡", + "模型版本型号": "模型版本型號", "推理时间(ms):": "推理時間(ms):" } diff --git a/i18n/zh_SG.json b/i18n/zh_SG.json index 0ec1528..a90a110 100644 --- a/i18n/zh_SG.json +++ b/i18n/zh_SG.json @@ -10,21 +10,21 @@ "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.
如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录使用需遵守的协议-LICENSE.txt.": "本軟體以MIT協議開源,作者不對軟體具備任何控制力,使用軟體者、傳播軟體導出的聲音者自負全責。
如不認可該條款,則不能使用或引用軟體包內任何程式碼和檔案。詳見根目錄使用需遵守的協議-LICENSE.txt。", "模型推理": "模型推理", "推理音色": "推理音色", - "刷新音色列表和索引路径": "刷新音色列表和索引路徑", + "刷新音色列表": "重新整理音色列表", + "刷新音色列表和索引路径":"刷新音色列表和索引路徑", "卸载音色省显存": "卸載音色節省 VRAM", "请选择说话人id": "請選擇說話人ID", "男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "男性轉女性推薦+12key,女性轉男性推薦-12key,如果音域爆炸導致音色失真也可以自己調整到合適音域。", "变调(整数, 半音数量, 升八度12降八度-12)": "變調(整數、半音數量、升八度12降八度-12)", "输入待处理音频文件路径(默认是正确格式示例)": "輸入待處理音頻檔案路徑(預設是正確格式示例)", "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比": "選擇音高提取演算法,輸入歌聲可用 pm 提速,harvest 低音好但巨慢無比", - ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音": ">=3則使用對harvest音高識別的結果使用中值濾波,數值為濾波半徑,使用可以削弱啞音", - "特征检索库文件路径,为空则使用下拉的选择结果": "特徵檢索庫檔路徑,為空則使用下拉的選擇結果", - "自动检测index路径,下拉式选择(dropdown)": "自動檢測index路徑,下拉式選擇(dropdown)", + "特征检索库文件路径": "特徵檢索庫檔案路徑", "特征文件路径": "特徵檔案路徑", + "自动检测index路径,下拉式选择(dropdown)": "自動檢測index路徑,下拉式選擇(dropdown)", + "特征检索库文件路径,为空则使用下拉的选择结果": "特徵檢索庫檔路徑,為空則使用下拉的選擇結果", "检索特征占比": "檢索特徵佔比", - "后处理重采样至最终采样率,0为不进行重采样": "後處理重採樣至最終採樣率,0為不進行重採樣", - "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络": "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络", "F0曲线文件, 可选, 一行一个音高, 代替默认F0及升降调": "F0曲線檔案,可選,一行一個音高,代替預設的F0及升降調", + ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音":">=3則使用對harvest音高識別的結果使用中值濾波,數值為濾波半徑,使用可以削弱啞音", "转换": "轉換", "输出信息": "輸出訊息", "输出音频(右下角三个点,点了可以下载)": "輸出音頻(右下角三個點,點了可以下載)", @@ -43,8 +43,6 @@ "输入实验名": "輸入實驗名稱", "目标采样率": "目標取樣率", "模型是否带音高指导(唱歌一定要, 语音可以不要)": "模型是否帶音高指導(唱歌一定要,語音可以不要)", - "版本(目前仅40k支持了v2)": "版本(目前仅40k支持了v2)", - "提取音高和处理数据使用的CPU进程数": "提取音高和處理數據使用的CPU進程數", "step2a: 自动遍历训练文件夹下所有可解码成音频的文件并进行切片归一化, 在实验目录下生成2个wav文件夹; 暂时只支持单人训练. ": "step2a:自動遍歷訓練資料夾下所有可解碼成音頻的檔案並進行切片歸一化,在實驗目錄下生成2個wav資料夾;暫時只支援單人訓練。", "输入训练文件夹路径": "輸入訓練檔案夾路徑", "请指定说话人id": "請指定說話人id", @@ -52,6 +50,8 @@ "step2b: 使用CPU提取音高(如果模型带音高), 使用GPU提取特征(选择卡号)": "步驟2b: 使用CPU提取音高(如果模型帶音高), 使用GPU提取特徵(選擇卡號)", "以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2": "以-分隔輸入使用的卡號, 例如 0-1-2 使用卡0和卡1和卡2", "显卡信息": "顯示卡資訊", + "提取音高使用的CPU进程数": "提取音高使用的CPU進程數", + "提取音高和处理数据使用的CPU进程数": "提取音高和處理數據使用的CPU進程數", "选择音高提取算法:输入歌声可用pm提速,高质量语音但CPU差可用dio提速,harvest质量更好但慢": "選擇音高提取算法:輸入歌聲可用pm提速,高品質語音但CPU差可用dio提速,harvest品質更好但較慢", "特征提取": "特徵提取", "step3: 填写训练设置, 开始训练模型和索引": "步驟3: 填寫訓練設定, 開始訓練模型和索引", @@ -61,7 +61,6 @@ "是否仅保存最新的ckpt文件以节省硬盘空间": "是否僅保存最新的ckpt檔案以節省硬碟空間", "否": "否", "是否缓存所有训练集至显存. 10min以下小数据可缓存以加速训练, 大数据缓存会炸显存也加不了多少速": "是否緩存所有訓練集至 VRAM。小於10分鐘的小數據可緩存以加速訓練,大數據緩存會爆 VRAM 也加不了多少速度", - "是否在每次保存时间点将最终小模型保存至weights文件夹": "是否在每次保存时间点将最终小模型保存至weights文件夹", "加载预训练底模G路径": "加載預訓練底模G路徑", "加载预训练底模D路径": "加載預訓練底模D路徑", "训练模型": "訓練模型", @@ -75,7 +74,6 @@ "模型是否带音高指导": "模型是否帶音高指導", "要置入的模型信息": "要置入的模型資訊", "保存的模型名不带后缀": "儲存的模型名不帶副檔名", - "模型版本型号": "模型版本型号", "融合": "融合", "修改模型信息(仅支持weights文件夹下提取的小模型文件)": "修改模型資訊(僅支援weights資料夾下提取的小模型檔案)", "模型路径": "模型路徑", @@ -93,7 +91,6 @@ "Onnx输出路径": "Onnx输出路径", "MoeVS模型": "MoeSS模型", "导出Onnx模型": "导出Onnx模型", - "常见问题解答": "常見問題解答", "招募音高曲线前端编辑器": "招募音高曲線前端編輯器", "加开发群联系我xxxxx": "加開發群聯繫我xxxxx", "点击查看交流、问题反馈群号": "點擊查看交流、問題反饋群號", @@ -118,5 +115,11 @@ "性能设置": "效能設定", "开始音频转换": "開始音訊轉換", "停止音频转换": "停止音訊轉換", + "常见问题解答": "常見問題解答", + "后处理重采样至最终采样率,0为不进行重采样": "後處理重採樣至最終採樣率,0為不進行重採樣", + "版本(目前仅40k支持了v2)": "版本(目前僅40k支持了v2)", + "是否在每次保存时间点将最终小模型保存至weights文件夹": "是否在每次保存時間點將最終小模型保存至weights檔夾", + "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络": "輸入源音量包絡替換輸出音量包絡融合比例,越靠近1越使用輸出包絡", + "模型版本型号": "模型版本型號", "推理时间(ms):": "推理時間(ms):" } diff --git a/i18n/zh_TW.json b/i18n/zh_TW.json index 0ec1528..a90a110 100644 --- a/i18n/zh_TW.json +++ b/i18n/zh_TW.json @@ -10,21 +10,21 @@ "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.
如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录使用需遵守的协议-LICENSE.txt.": "本軟體以MIT協議開源,作者不對軟體具備任何控制力,使用軟體者、傳播軟體導出的聲音者自負全責。
如不認可該條款,則不能使用或引用軟體包內任何程式碼和檔案。詳見根目錄使用需遵守的協議-LICENSE.txt。", "模型推理": "模型推理", "推理音色": "推理音色", - "刷新音色列表和索引路径": "刷新音色列表和索引路徑", + "刷新音色列表": "重新整理音色列表", + "刷新音色列表和索引路径":"刷新音色列表和索引路徑", "卸载音色省显存": "卸載音色節省 VRAM", "请选择说话人id": "請選擇說話人ID", "男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "男性轉女性推薦+12key,女性轉男性推薦-12key,如果音域爆炸導致音色失真也可以自己調整到合適音域。", "变调(整数, 半音数量, 升八度12降八度-12)": "變調(整數、半音數量、升八度12降八度-12)", "输入待处理音频文件路径(默认是正确格式示例)": "輸入待處理音頻檔案路徑(預設是正確格式示例)", "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比": "選擇音高提取演算法,輸入歌聲可用 pm 提速,harvest 低音好但巨慢無比", - ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音": ">=3則使用對harvest音高識別的結果使用中值濾波,數值為濾波半徑,使用可以削弱啞音", - "特征检索库文件路径,为空则使用下拉的选择结果": "特徵檢索庫檔路徑,為空則使用下拉的選擇結果", - "自动检测index路径,下拉式选择(dropdown)": "自動檢測index路徑,下拉式選擇(dropdown)", + "特征检索库文件路径": "特徵檢索庫檔案路徑", "特征文件路径": "特徵檔案路徑", + "自动检测index路径,下拉式选择(dropdown)": "自動檢測index路徑,下拉式選擇(dropdown)", + "特征检索库文件路径,为空则使用下拉的选择结果": "特徵檢索庫檔路徑,為空則使用下拉的選擇結果", "检索特征占比": "檢索特徵佔比", - "后处理重采样至最终采样率,0为不进行重采样": "後處理重採樣至最終採樣率,0為不進行重採樣", - "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络": "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络", "F0曲线文件, 可选, 一行一个音高, 代替默认F0及升降调": "F0曲線檔案,可選,一行一個音高,代替預設的F0及升降調", + ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音":">=3則使用對harvest音高識別的結果使用中值濾波,數值為濾波半徑,使用可以削弱啞音", "转换": "轉換", "输出信息": "輸出訊息", "输出音频(右下角三个点,点了可以下载)": "輸出音頻(右下角三個點,點了可以下載)", @@ -43,8 +43,6 @@ "输入实验名": "輸入實驗名稱", "目标采样率": "目標取樣率", "模型是否带音高指导(唱歌一定要, 语音可以不要)": "模型是否帶音高指導(唱歌一定要,語音可以不要)", - "版本(目前仅40k支持了v2)": "版本(目前仅40k支持了v2)", - "提取音高和处理数据使用的CPU进程数": "提取音高和處理數據使用的CPU進程數", "step2a: 自动遍历训练文件夹下所有可解码成音频的文件并进行切片归一化, 在实验目录下生成2个wav文件夹; 暂时只支持单人训练. ": "step2a:自動遍歷訓練資料夾下所有可解碼成音頻的檔案並進行切片歸一化,在實驗目錄下生成2個wav資料夾;暫時只支援單人訓練。", "输入训练文件夹路径": "輸入訓練檔案夾路徑", "请指定说话人id": "請指定說話人id", @@ -52,6 +50,8 @@ "step2b: 使用CPU提取音高(如果模型带音高), 使用GPU提取特征(选择卡号)": "步驟2b: 使用CPU提取音高(如果模型帶音高), 使用GPU提取特徵(選擇卡號)", "以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2": "以-分隔輸入使用的卡號, 例如 0-1-2 使用卡0和卡1和卡2", "显卡信息": "顯示卡資訊", + "提取音高使用的CPU进程数": "提取音高使用的CPU進程數", + "提取音高和处理数据使用的CPU进程数": "提取音高和處理數據使用的CPU進程數", "选择音高提取算法:输入歌声可用pm提速,高质量语音但CPU差可用dio提速,harvest质量更好但慢": "選擇音高提取算法:輸入歌聲可用pm提速,高品質語音但CPU差可用dio提速,harvest品質更好但較慢", "特征提取": "特徵提取", "step3: 填写训练设置, 开始训练模型和索引": "步驟3: 填寫訓練設定, 開始訓練模型和索引", @@ -61,7 +61,6 @@ "是否仅保存最新的ckpt文件以节省硬盘空间": "是否僅保存最新的ckpt檔案以節省硬碟空間", "否": "否", "是否缓存所有训练集至显存. 10min以下小数据可缓存以加速训练, 大数据缓存会炸显存也加不了多少速": "是否緩存所有訓練集至 VRAM。小於10分鐘的小數據可緩存以加速訓練,大數據緩存會爆 VRAM 也加不了多少速度", - "是否在每次保存时间点将最终小模型保存至weights文件夹": "是否在每次保存时间点将最终小模型保存至weights文件夹", "加载预训练底模G路径": "加載預訓練底模G路徑", "加载预训练底模D路径": "加載預訓練底模D路徑", "训练模型": "訓練模型", @@ -75,7 +74,6 @@ "模型是否带音高指导": "模型是否帶音高指導", "要置入的模型信息": "要置入的模型資訊", "保存的模型名不带后缀": "儲存的模型名不帶副檔名", - "模型版本型号": "模型版本型号", "融合": "融合", "修改模型信息(仅支持weights文件夹下提取的小模型文件)": "修改模型資訊(僅支援weights資料夾下提取的小模型檔案)", "模型路径": "模型路徑", @@ -93,7 +91,6 @@ "Onnx输出路径": "Onnx输出路径", "MoeVS模型": "MoeSS模型", "导出Onnx模型": "导出Onnx模型", - "常见问题解答": "常見問題解答", "招募音高曲线前端编辑器": "招募音高曲線前端編輯器", "加开发群联系我xxxxx": "加開發群聯繫我xxxxx", "点击查看交流、问题反馈群号": "點擊查看交流、問題反饋群號", @@ -118,5 +115,11 @@ "性能设置": "效能設定", "开始音频转换": "開始音訊轉換", "停止音频转换": "停止音訊轉換", + "常见问题解答": "常見問題解答", + "后处理重采样至最终采样率,0为不进行重采样": "後處理重採樣至最終採樣率,0為不進行重採樣", + "版本(目前仅40k支持了v2)": "版本(目前僅40k支持了v2)", + "是否在每次保存时间点将最终小模型保存至weights文件夹": "是否在每次保存時間點將最終小模型保存至weights檔夾", + "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络": "輸入源音量包絡替換輸出音量包絡融合比例,越靠近1越使用輸出包絡", + "模型版本型号": "模型版本型號", "推理时间(ms):": "推理時間(ms):" } From 137447bdc9ef80661349cff4ba17ba51b8335010 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 14 May 2023 08:30:20 +0000 Subject: [PATCH 14/14] =?UTF-8?q?=F0=9F=8E=A8=20=E5=90=8C=E6=AD=A5=20local?= =?UTF-8?q?e=20(#283)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- i18n/en_US.json | 21 +++++++++------------ i18n/zh_CN.json | 22 ++++++++++------------ i18n/zh_HK.json | 23 ++++++++++------------- i18n/zh_SG.json | 25 +++++++++++-------------- i18n/zh_TW.json | 25 +++++++++++-------------- 5 files changed, 51 insertions(+), 65 deletions(-) diff --git a/i18n/en_US.json b/i18n/en_US.json index eafbd1f..081e6df 100644 --- a/i18n/en_US.json +++ b/i18n/en_US.json @@ -10,7 +10,6 @@ "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.
如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录使用需遵守的协议-LICENSE.txt.": "This software is open source under the MIT license, the author does not have any control over the software, and those who use the software and spread the sounds exported by the software are solely responsible.
If you do not agree with this clause, you cannot use or quote any codes and files in the software package. See root directory Agreement-LICENSE.txt for details.", "模型推理": "Model inference", "推理音色": "Inferencing timbre", - "刷新音色列表": "Refresh timbre list", "刷新音色列表和索引路径": "Refresh timbre list and index path", "卸载音色省显存": "Unload timbre to save GPU memory", "请选择说话人id": "Please select a speaker id", @@ -18,13 +17,14 @@ "变调(整数, 半音数量, 升八度12降八度-12)": "transpose(integer, number of semitones, octave sharp 12 octave flat -12)", "输入待处理音频文件路径(默认是正确格式示例)": "Enter the path of the audio file to be processed (the default is the correct format example)", "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比": "Select the algorithm for pitch extraction. Use 'pm' to speed up for singing voices, or use 'harvest' for better low-pitched voices, but it is extremely slow.", - "特征检索库文件路径": "Feature search database file path", - "特征文件路径": "Feature file path", + ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音": ">=3:using median filter for f0. The number is median filter radius.", "特征检索库文件路径,为空则使用下拉的选择结果": "Feature file path. If null, use dropdown result.", "自动检测index路径,下拉式选择(dropdown)": "Auto detect index path in logs directory. Dropdown.", + "特征文件路径": "Feature file path", "检索特征占比": "Search feature ratio", + "后处理重采样至最终采样率,0为不进行重采样": "Post resample the audio to the final sample rate. Default: don't use post resample.", + "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络": "Use volume envelope of input to mix or replace the volume envelope of output, the closer the rate is to 1, the more output envelope is used. Default 1 (don't mix input envelope)", "F0曲线文件, 可选, 一行一个音高, 代替默认F0及升降调": "F0 curve file, optional, one pitch per line, instead of the default F0 and ups and downs", - ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音": ">=3:using median filter for f0. The number is median filter radius.", "转换": "Convert", "输出信息": "Export message", "输出音频(右下角三个点,点了可以下载)": "Export audio (three dots in the lower right corner, click to download)", @@ -43,6 +43,8 @@ "输入实验名": "Input experiment name", "目标采样率": "Target sample rate", "模型是否带音高指导(唱歌一定要, 语音可以不要)": "Does the model have pitch guidance (singing must, voice can not.)", + "版本(目前仅40k支持了v2)": "model architecture version (Now v2 version only supports 40k sample rate for testing)", + "提取音高和处理数据使用的CPU进程数": "Number of CPU threads to use for pitch extraction and dataset processing", "step2a: 自动遍历训练文件夹下所有可解码成音频的文件并进行切片归一化, 在实验目录下生成2个wav文件夹; 暂时只支持单人训练. ": "step2a: Automatically traverse all files that can be decoded into audio in the training folder and perform slice normalization, and generate 2 wav folders in the experiment directory; only single-person training is supported for the time being. ", "输入训练文件夹路径": "Input training folder path", "请指定说话人id": "Please specify speaker ID", @@ -50,8 +52,6 @@ "step2b: 使用CPU提取音高(如果模型带音高), 使用GPU提取特征(选择卡号)": "step2b: Use CPU to extract pitch (if the model has pitch), use GPU to extract features (select card number)", "以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2": "Enter the card numbers used separated by -, for example 0-1-2 use card 0 and card 1 and card 2", "显卡信息": "GPU information", - "提取音高使用的CPU进程数": "Number of CPU threads to use for pitch extraction", - "提取音高和处理数据使用的CPU进程数": "Number of CPU threads to use for pitch extraction and dataset processing", "选择音高提取算法:输入歌声可用pm提速,高质量语音但CPU差可用dio提速,harvest质量更好但慢": "Select pitch extraction algorithm: Use 'pm' for faster processing of singing voice, 'dio' for high-quality speech but slower processing, and 'harvest' for the best quality but slowest processing.", "特征提取": "Feature extraction", "step3: 填写训练设置, 开始训练模型和索引": "step3: Fill in the training settings, start training the model and index", @@ -61,6 +61,7 @@ "是否仅保存最新的ckpt文件以节省硬盘空间": "Whether to save only the latest ckpt file to save disk space", "否": "no", "是否缓存所有训练集至显存. 10min以下小数据可缓存以加速训练, 大数据缓存会炸显存也加不了多少速": "Whether to cache all training sets to video memory. Small data under 10 minutes can be cached to speed up training, and large data cache will blow up video memory and not increase the speed much", + "是否在每次保存时间点将最终小模型保存至weights文件夹": "Save extracted small model to weights dir when every 'save frequency'", "加载预训练底模G路径": "Load pre-trained base model G path.", "加载预训练底模D路径": "Load pre-trained base model D path.", "训练模型": "Train model.", @@ -74,6 +75,7 @@ "模型是否带音高指导": "Whether the model has pitch guidance.", "要置入的模型信息": "Model information to be placed.", "保存的模型名不带后缀": "Saved model name without extension.", + "模型版本型号": "model architecture version", "融合": "Fusion.", "修改模型信息(仅支持weights文件夹下提取的小模型文件)": "Modify model information (only small model files extracted from the weights folder are supported)", "模型路径": "Model path", @@ -91,6 +93,7 @@ "Onnx输出路径": "Onnx Export Path", "MoeVS模型": "MoeVS Model", "导出Onnx模型": "Export Onnx Model", + "常见问题解答": "FAQ (Frequently Asked Questions)", "招募音高曲线前端编辑器": "Recruit front-end editors for pitch curves", "加开发群联系我xxxxx": "Add development group to contact me xxxxx", "点击查看交流、问题反馈群号": "Click to view the communication and problem feedback group number", @@ -115,11 +118,5 @@ "性能设置": "performance settings", "开始音频转换": "start audio conversion", "停止音频转换": "stop audio conversion", - "常见问题解答": "FAQ (Frequently Asked Questions)", - "后处理重采样至最终采样率,0为不进行重采样": "Post resample the audio to the final sample rate. Default: don't use post resample.", - "版本(目前仅40k支持了v2)": "model architecture version (Now v2 version only supports 40k sample rate for testing)", - "是否在每次保存时间点将最终小模型保存至weights文件夹": "Save extracted small model to weights dir when every 'save frequency'", - "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络": "Use volume envelope of input to mix or replace the volume envelope of output, the closer the rate is to 1, the more output envelope is used. Default 1 (don't mix input envelope)", - "模型版本型号": "model architecture version", "推理时间(ms):": "Infer Time(ms):" } diff --git a/i18n/zh_CN.json b/i18n/zh_CN.json index 70f89fc..e5e8062 100644 --- a/i18n/zh_CN.json +++ b/i18n/zh_CN.json @@ -10,18 +10,20 @@ "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.
如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录使用需遵守的协议-LICENSE.txt.": "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.
如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录使用需遵守的协议-LICENSE.txt.", "模型推理": "模型推理", "推理音色": "推理音色", - "刷新音色列表": "刷新音色列表", + "刷新音色列表和索引路径": "刷新音色列表和索引路径", "卸载音色省显存": "卸载音色省显存", "请选择说话人id": "请选择说话人id", "男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ", "变调(整数, 半音数量, 升八度12降八度-12)": "变调(整数, 半音数量, 升八度12降八度-12)", "输入待处理音频文件路径(默认是正确格式示例)": "输入待处理音频文件路径(默认是正确格式示例)", "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比": "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比", - "特征检索库文件路径": "特征检索库文件路径", - "特征检索库文件路径,为空则使用下拉的选择结果": "特征检索库文件路径,为空则使用下拉的选择结果", ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音": ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音", + "特征检索库文件路径,为空则使用下拉的选择结果": "特征检索库文件路径,为空则使用下拉的选择结果", + "自动检测index路径,下拉式选择(dropdown)": "自动检测index路径,下拉式选择(dropdown)", "特征文件路径": "特征文件路径", "检索特征占比": "检索特征占比", + "后处理重采样至最终采样率,0为不进行重采样": "后处理重采样至最终采样率,0为不进行重采样", + "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络": "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络", "F0曲线文件, 可选, 一行一个音高, 代替默认F0及升降调": "F0曲线文件, 可选, 一行一个音高, 代替默认F0及升降调", "转换": "转换", "输出信息": "输出信息", @@ -41,6 +43,8 @@ "输入实验名": "输入实验名", "目标采样率": "目标采样率", "模型是否带音高指导(唱歌一定要, 语音可以不要)": "模型是否带音高指导(唱歌一定要, 语音可以不要)", + "版本(目前仅40k支持了v2)": "版本(目前仅40k支持了v2)", + "提取音高和处理数据使用的CPU进程数": "提取音高和处理数据使用的CPU进程数", "step2a: 自动遍历训练文件夹下所有可解码成音频的文件并进行切片归一化, 在实验目录下生成2个wav文件夹; 暂时只支持单人训练. ": "step2a: 自动遍历训练文件夹下所有可解码成音频的文件并进行切片归一化, 在实验目录下生成2个wav文件夹; 暂时只支持单人训练. ", "输入训练文件夹路径": "输入训练文件夹路径", "请指定说话人id": "请指定说话人id", @@ -48,10 +52,6 @@ "step2b: 使用CPU提取音高(如果模型带音高), 使用GPU提取特征(选择卡号)": "step2b: 使用CPU提取音高(如果模型带音高), 使用GPU提取特征(选择卡号)", "以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2": "以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2", "显卡信息": "显卡信息", - "提取音高使用的CPU进程数": "提取音高使用的CPU进程数", - "提取音高和处理数据使用的CPU进程数": "提取音高和处理数据使用的CPU进程数", - "刷新音色列表和索引路径": "刷新音色列表和索引路径", - "常见问题解答": "常见问题解答", "选择音高提取算法:输入歌声可用pm提速,高质量语音但CPU差可用dio提速,harvest质量更好但慢": "选择音高提取算法:输入歌声可用pm提速,高质量语音但CPU差可用dio提速,harvest质量更好但慢", "特征提取": "特征提取", "step3: 填写训练设置, 开始训练模型和索引": "step3: 填写训练设置, 开始训练模型和索引", @@ -61,6 +61,7 @@ "是否仅保存最新的ckpt文件以节省硬盘空间": "是否仅保存最新的ckpt文件以节省硬盘空间", "否": "否", "是否缓存所有训练集至显存. 10min以下小数据可缓存以加速训练, 大数据缓存会炸显存也加不了多少速": "是否缓存所有训练集至显存. 10min以下小数据可缓存以加速训练, 大数据缓存会炸显存也加不了多少速", + "是否在每次保存时间点将最终小模型保存至weights文件夹": "是否在每次保存时间点将最终小模型保存至weights文件夹", "加载预训练底模G路径": "加载预训练底模G路径", "加载预训练底模D路径": "加载预训练底模D路径", "训练模型": "训练模型", @@ -74,6 +75,7 @@ "模型是否带音高指导": "模型是否带音高指导", "要置入的模型信息": "要置入的模型信息", "保存的模型名不带后缀": "保存的模型名不带后缀", + "模型版本型号": "模型版本型号", "融合": "融合", "修改模型信息(仅支持weights文件夹下提取的小模型文件)": "修改模型信息(仅支持weights文件夹下提取的小模型文件)", "模型路径": "模型路径", @@ -91,6 +93,7 @@ "Onnx输出路径": "Onnx输出路径", "MoeVS模型": "MoeVS模型", "导出Onnx模型": "导出Onnx模型", + "常见问题解答": "常见问题解答", "招募音高曲线前端编辑器": "招募音高曲线前端编辑器", "加开发群联系我xxxxx": "加开发群联系我xxxxx", "点击查看交流、问题反馈群号": "点击查看交流、问题反馈群号", @@ -115,10 +118,5 @@ "性能设置": "性能设置", "开始音频转换": "开始音频转换", "停止音频转换": "停止音频转换", - "版本(目前仅40k支持了v2)": "版本(目前仅40k支持了v2)", - "是否在每次保存时间点将最终小模型保存至weights文件夹": "是否在每次保存时间点将最终小模型保存至weights文件夹", - "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络": "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络", - "模型版本型号": "模型版本型号", - "后处理重采样至最终采样率": "后处理重采样至最终采样率,0为不进行重采样", "推理时间(ms):": "推理时间(ms):" } diff --git a/i18n/zh_HK.json b/i18n/zh_HK.json index 2d00590..2a9413c 100644 --- a/i18n/zh_HK.json +++ b/i18n/zh_HK.json @@ -10,21 +10,21 @@ "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.
如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录使用需遵守的协议-LICENSE.txt.": "本軟體以MIT協議開源,作者不對軟體具備任何控制力,使用軟體者、傳播軟體導出的聲音者自負全責。
如不認可該條款,則不能使用或引用軟體包內任何程式碼和檔案。詳見根目錄使用需遵守的協議-LICENSE.txt。", "模型推理": "模型推理", "推理音色": "推理音色", - "刷新音色列表": "重新整理音色列表", - "刷新音色列表和索引路径":"刷新音色列表和索引路徑", + "刷新音色列表和索引路径": "刷新音色列表和索引路徑", "卸载音色省显存": "卸載音色節省 VRAM", "请选择说话人id": "請選擇說話人ID", "男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "男性轉女性推薦+12key,女性轉男性推薦-12key,如果音域爆炸導致音色失真也可以自己調整到合適音域。", "变调(整数, 半音数量, 升八度12降八度-12)": "變調(整數、半音數量、升八度12降八度-12)", "输入待处理音频文件路径(默认是正确格式示例)": "輸入待處理音頻檔案路徑(預設是正確格式示例)", "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比": "選擇音高提取演算法,輸入歌聲可用 pm 提速,harvest 低音好但巨慢無比", - "特征检索库文件路径": "特徵檢索庫檔案路徑", - "自动检测index路径,下拉式选择(dropdown)": "自動檢測index路徑,下拉式選擇(dropdown)", + ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音": ">=3則使用對harvest音高識別的結果使用中值濾波,數值為濾波半徑,使用可以削弱啞音", "特征检索库文件路径,为空则使用下拉的选择结果": "特徵檢索庫檔路徑,為空則使用下拉的選擇結果", + "自动检测index路径,下拉式选择(dropdown)": "自動檢測index路徑,下拉式選擇(dropdown)", "特征文件路径": "特徵檔案路徑", "检索特征占比": "檢索特徵佔比", + "后处理重采样至最终采样率,0为不进行重采样": "後處理重採樣至最終採樣率,0為不進行重採樣", + "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络": "輸入源音量包絡替換輸出音量包絡融合比例,越靠近1越使用輸出包絡", "F0曲线文件, 可选, 一行一个音高, 代替默认F0及升降调": "F0曲線檔案,可選,一行一個音高,代替預設的F0及升降調", - ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音":">=3則使用對harvest音高識別的結果使用中值濾波,數值為濾波半徑,使用可以削弱啞音", "转换": "轉換", "输出信息": "輸出訊息", "输出音频(右下角三个点,点了可以下载)": "輸出音頻(右下角三個點,點了可以下載)", @@ -43,6 +43,8 @@ "输入实验名": "輸入實驗名稱", "目标采样率": "目標取樣率", "模型是否带音高指导(唱歌一定要, 语音可以不要)": "模型是否帶音高指導(唱歌一定要,語音可以不要)", + "版本(目前仅40k支持了v2)": "版本(目前僅40k支持了v2)", + "提取音高和处理数据使用的CPU进程数": "提取音高和處理數據使用的CPU進程數", "step2a: 自动遍历训练文件夹下所有可解码成音频的文件并进行切片归一化, 在实验目录下生成2个wav文件夹; 暂时只支持单人训练. ": "step2a:自動遍歷訓練資料夾下所有可解碼成音頻的檔案並進行切片歸一化,在實驗目錄下生成2個wav資料夾;暫時只支援單人訓練。", "输入训练文件夹路径": "輸入訓練檔案夾路徑", "请指定说话人id": "請指定說話人id", @@ -50,8 +52,6 @@ "step2b: 使用CPU提取音高(如果模型带音高), 使用GPU提取特征(选择卡号)": "步驟2b: 使用CPU提取音高(如果模型帶音高), 使用GPU提取特徵(選擇卡號)", "以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2": "以-分隔輸入使用的卡號, 例如 0-1-2 使用卡0和卡1和卡2", "显卡信息": "顯示卡資訊", - "提取音高使用的CPU进程数": "提取音高使用的CPU進程數", - "提取音高和处理数据使用的CPU进程数": "提取音高和處理數據使用的CPU進程數", "选择音高提取算法:输入歌声可用pm提速,高质量语音但CPU差可用dio提速,harvest质量更好但慢": "選擇音高提取算法:輸入歌聲可用pm提速,高品質語音但CPU差可用dio提速,harvest品質更好但較慢", "特征提取": "特徵提取", "step3: 填写训练设置, 开始训练模型和索引": "步驟3: 填寫訓練設定, 開始訓練模型和索引", @@ -61,6 +61,7 @@ "是否仅保存最新的ckpt文件以节省硬盘空间": "是否僅保存最新的ckpt檔案以節省硬碟空間", "否": "否", "是否缓存所有训练集至显存. 10min以下小数据可缓存以加速训练, 大数据缓存会炸显存也加不了多少速": "是否緩存所有訓練集至 VRAM。小於10分鐘的小數據可緩存以加速訓練,大數據緩存會爆 VRAM 也加不了多少速度", + "是否在每次保存时间点将最终小模型保存至weights文件夹": "是否在每次保存時間點將最終小模型保存至weights檔夾", "加载预训练底模G路径": "加載預訓練底模G路徑", "加载预训练底模D路径": "加載預訓練底模D路徑", "训练模型": "訓練模型", @@ -74,6 +75,7 @@ "模型是否带音高指导": "模型是否帶音高指導", "要置入的模型信息": "要置入的模型資訊", "保存的模型名不带后缀": "儲存的模型名不帶副檔名", + "模型版本型号": "模型版本型號", "融合": "融合", "修改模型信息(仅支持weights文件夹下提取的小模型文件)": "修改模型資訊(僅支援weights資料夾下提取的小模型檔案)", "模型路径": "模型路徑", @@ -91,6 +93,7 @@ "Onnx输出路径": "Onnx输出路径", "MoeVS模型": "MoeSS模型", "导出Onnx模型": "导出Onnx模型", + "常见问题解答": "常見問題解答", "招募音高曲线前端编辑器": "招募音高曲線前端編輯器", "加开发群联系我xxxxx": "加開發群聯繫我xxxxx", "点击查看交流、问题反馈群号": "點擊查看交流、問題反饋群號", @@ -115,11 +118,5 @@ "性能设置": "效能設定", "开始音频转换": "開始音訊轉換", "停止音频转换": "停止音訊轉換", - "常见问题解答": "常見問題解答", - "后处理重采样至最终采样率,0为不进行重采样": "後處理重採樣至最終採樣率,0為不進行重採樣", - "版本(目前仅40k支持了v2)": "版本(目前僅40k支持了v2)", - "是否在每次保存时间点将最终小模型保存至weights文件夹": "是否在每次保存時間點將最終小模型保存至weights檔夾", - "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络": "輸入源音量包絡替換輸出音量包絡融合比例,越靠近1越使用輸出包絡", - "模型版本型号": "模型版本型號", "推理时间(ms):": "推理時間(ms):" } diff --git a/i18n/zh_SG.json b/i18n/zh_SG.json index a90a110..2a9413c 100644 --- a/i18n/zh_SG.json +++ b/i18n/zh_SG.json @@ -10,21 +10,21 @@ "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.
如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录使用需遵守的协议-LICENSE.txt.": "本軟體以MIT協議開源,作者不對軟體具備任何控制力,使用軟體者、傳播軟體導出的聲音者自負全責。
如不認可該條款,則不能使用或引用軟體包內任何程式碼和檔案。詳見根目錄使用需遵守的協議-LICENSE.txt。", "模型推理": "模型推理", "推理音色": "推理音色", - "刷新音色列表": "重新整理音色列表", - "刷新音色列表和索引路径":"刷新音色列表和索引路徑", + "刷新音色列表和索引路径": "刷新音色列表和索引路徑", "卸载音色省显存": "卸載音色節省 VRAM", "请选择说话人id": "請選擇說話人ID", "男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "男性轉女性推薦+12key,女性轉男性推薦-12key,如果音域爆炸導致音色失真也可以自己調整到合適音域。", "变调(整数, 半音数量, 升八度12降八度-12)": "變調(整數、半音數量、升八度12降八度-12)", "输入待处理音频文件路径(默认是正确格式示例)": "輸入待處理音頻檔案路徑(預設是正確格式示例)", "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比": "選擇音高提取演算法,輸入歌聲可用 pm 提速,harvest 低音好但巨慢無比", - "特征检索库文件路径": "特徵檢索庫檔案路徑", - "特征文件路径": "特徵檔案路徑", - "自动检测index路径,下拉式选择(dropdown)": "自動檢測index路徑,下拉式選擇(dropdown)", + ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音": ">=3則使用對harvest音高識別的結果使用中值濾波,數值為濾波半徑,使用可以削弱啞音", "特征检索库文件路径,为空则使用下拉的选择结果": "特徵檢索庫檔路徑,為空則使用下拉的選擇結果", + "自动检测index路径,下拉式选择(dropdown)": "自動檢測index路徑,下拉式選擇(dropdown)", + "特征文件路径": "特徵檔案路徑", "检索特征占比": "檢索特徵佔比", + "后处理重采样至最终采样率,0为不进行重采样": "後處理重採樣至最終採樣率,0為不進行重採樣", + "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络": "輸入源音量包絡替換輸出音量包絡融合比例,越靠近1越使用輸出包絡", "F0曲线文件, 可选, 一行一个音高, 代替默认F0及升降调": "F0曲線檔案,可選,一行一個音高,代替預設的F0及升降調", - ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音":">=3則使用對harvest音高識別的結果使用中值濾波,數值為濾波半徑,使用可以削弱啞音", "转换": "轉換", "输出信息": "輸出訊息", "输出音频(右下角三个点,点了可以下载)": "輸出音頻(右下角三個點,點了可以下載)", @@ -43,6 +43,8 @@ "输入实验名": "輸入實驗名稱", "目标采样率": "目標取樣率", "模型是否带音高指导(唱歌一定要, 语音可以不要)": "模型是否帶音高指導(唱歌一定要,語音可以不要)", + "版本(目前仅40k支持了v2)": "版本(目前僅40k支持了v2)", + "提取音高和处理数据使用的CPU进程数": "提取音高和處理數據使用的CPU進程數", "step2a: 自动遍历训练文件夹下所有可解码成音频的文件并进行切片归一化, 在实验目录下生成2个wav文件夹; 暂时只支持单人训练. ": "step2a:自動遍歷訓練資料夾下所有可解碼成音頻的檔案並進行切片歸一化,在實驗目錄下生成2個wav資料夾;暫時只支援單人訓練。", "输入训练文件夹路径": "輸入訓練檔案夾路徑", "请指定说话人id": "請指定說話人id", @@ -50,8 +52,6 @@ "step2b: 使用CPU提取音高(如果模型带音高), 使用GPU提取特征(选择卡号)": "步驟2b: 使用CPU提取音高(如果模型帶音高), 使用GPU提取特徵(選擇卡號)", "以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2": "以-分隔輸入使用的卡號, 例如 0-1-2 使用卡0和卡1和卡2", "显卡信息": "顯示卡資訊", - "提取音高使用的CPU进程数": "提取音高使用的CPU進程數", - "提取音高和处理数据使用的CPU进程数": "提取音高和處理數據使用的CPU進程數", "选择音高提取算法:输入歌声可用pm提速,高质量语音但CPU差可用dio提速,harvest质量更好但慢": "選擇音高提取算法:輸入歌聲可用pm提速,高品質語音但CPU差可用dio提速,harvest品質更好但較慢", "特征提取": "特徵提取", "step3: 填写训练设置, 开始训练模型和索引": "步驟3: 填寫訓練設定, 開始訓練模型和索引", @@ -61,6 +61,7 @@ "是否仅保存最新的ckpt文件以节省硬盘空间": "是否僅保存最新的ckpt檔案以節省硬碟空間", "否": "否", "是否缓存所有训练集至显存. 10min以下小数据可缓存以加速训练, 大数据缓存会炸显存也加不了多少速": "是否緩存所有訓練集至 VRAM。小於10分鐘的小數據可緩存以加速訓練,大數據緩存會爆 VRAM 也加不了多少速度", + "是否在每次保存时间点将最终小模型保存至weights文件夹": "是否在每次保存時間點將最終小模型保存至weights檔夾", "加载预训练底模G路径": "加載預訓練底模G路徑", "加载预训练底模D路径": "加載預訓練底模D路徑", "训练模型": "訓練模型", @@ -74,6 +75,7 @@ "模型是否带音高指导": "模型是否帶音高指導", "要置入的模型信息": "要置入的模型資訊", "保存的模型名不带后缀": "儲存的模型名不帶副檔名", + "模型版本型号": "模型版本型號", "融合": "融合", "修改模型信息(仅支持weights文件夹下提取的小模型文件)": "修改模型資訊(僅支援weights資料夾下提取的小模型檔案)", "模型路径": "模型路徑", @@ -91,6 +93,7 @@ "Onnx输出路径": "Onnx输出路径", "MoeVS模型": "MoeSS模型", "导出Onnx模型": "导出Onnx模型", + "常见问题解答": "常見問題解答", "招募音高曲线前端编辑器": "招募音高曲線前端編輯器", "加开发群联系我xxxxx": "加開發群聯繫我xxxxx", "点击查看交流、问题反馈群号": "點擊查看交流、問題反饋群號", @@ -115,11 +118,5 @@ "性能设置": "效能設定", "开始音频转换": "開始音訊轉換", "停止音频转换": "停止音訊轉換", - "常见问题解答": "常見問題解答", - "后处理重采样至最终采样率,0为不进行重采样": "後處理重採樣至最終採樣率,0為不進行重採樣", - "版本(目前仅40k支持了v2)": "版本(目前僅40k支持了v2)", - "是否在每次保存时间点将最终小模型保存至weights文件夹": "是否在每次保存時間點將最終小模型保存至weights檔夾", - "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络": "輸入源音量包絡替換輸出音量包絡融合比例,越靠近1越使用輸出包絡", - "模型版本型号": "模型版本型號", "推理时间(ms):": "推理時間(ms):" } diff --git a/i18n/zh_TW.json b/i18n/zh_TW.json index a90a110..2a9413c 100644 --- a/i18n/zh_TW.json +++ b/i18n/zh_TW.json @@ -10,21 +10,21 @@ "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责.
如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录使用需遵守的协议-LICENSE.txt.": "本軟體以MIT協議開源,作者不對軟體具備任何控制力,使用軟體者、傳播軟體導出的聲音者自負全責。
如不認可該條款,則不能使用或引用軟體包內任何程式碼和檔案。詳見根目錄使用需遵守的協議-LICENSE.txt。", "模型推理": "模型推理", "推理音色": "推理音色", - "刷新音色列表": "重新整理音色列表", - "刷新音色列表和索引路径":"刷新音色列表和索引路徑", + "刷新音色列表和索引路径": "刷新音色列表和索引路徑", "卸载音色省显存": "卸載音色節省 VRAM", "请选择说话人id": "請選擇說話人ID", "男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "男性轉女性推薦+12key,女性轉男性推薦-12key,如果音域爆炸導致音色失真也可以自己調整到合適音域。", "变调(整数, 半音数量, 升八度12降八度-12)": "變調(整數、半音數量、升八度12降八度-12)", "输入待处理音频文件路径(默认是正确格式示例)": "輸入待處理音頻檔案路徑(預設是正確格式示例)", "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比": "選擇音高提取演算法,輸入歌聲可用 pm 提速,harvest 低音好但巨慢無比", - "特征检索库文件路径": "特徵檢索庫檔案路徑", - "特征文件路径": "特徵檔案路徑", - "自动检测index路径,下拉式选择(dropdown)": "自動檢測index路徑,下拉式選擇(dropdown)", + ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音": ">=3則使用對harvest音高識別的結果使用中值濾波,數值為濾波半徑,使用可以削弱啞音", "特征检索库文件路径,为空则使用下拉的选择结果": "特徵檢索庫檔路徑,為空則使用下拉的選擇結果", + "自动检测index路径,下拉式选择(dropdown)": "自動檢測index路徑,下拉式選擇(dropdown)", + "特征文件路径": "特徵檔案路徑", "检索特征占比": "檢索特徵佔比", + "后处理重采样至最终采样率,0为不进行重采样": "後處理重採樣至最終採樣率,0為不進行重採樣", + "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络": "輸入源音量包絡替換輸出音量包絡融合比例,越靠近1越使用輸出包絡", "F0曲线文件, 可选, 一行一个音高, 代替默认F0及升降调": "F0曲線檔案,可選,一行一個音高,代替預設的F0及升降調", - ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音":">=3則使用對harvest音高識別的結果使用中值濾波,數值為濾波半徑,使用可以削弱啞音", "转换": "轉換", "输出信息": "輸出訊息", "输出音频(右下角三个点,点了可以下载)": "輸出音頻(右下角三個點,點了可以下載)", @@ -43,6 +43,8 @@ "输入实验名": "輸入實驗名稱", "目标采样率": "目標取樣率", "模型是否带音高指导(唱歌一定要, 语音可以不要)": "模型是否帶音高指導(唱歌一定要,語音可以不要)", + "版本(目前仅40k支持了v2)": "版本(目前僅40k支持了v2)", + "提取音高和处理数据使用的CPU进程数": "提取音高和處理數據使用的CPU進程數", "step2a: 自动遍历训练文件夹下所有可解码成音频的文件并进行切片归一化, 在实验目录下生成2个wav文件夹; 暂时只支持单人训练. ": "step2a:自動遍歷訓練資料夾下所有可解碼成音頻的檔案並進行切片歸一化,在實驗目錄下生成2個wav資料夾;暫時只支援單人訓練。", "输入训练文件夹路径": "輸入訓練檔案夾路徑", "请指定说话人id": "請指定說話人id", @@ -50,8 +52,6 @@ "step2b: 使用CPU提取音高(如果模型带音高), 使用GPU提取特征(选择卡号)": "步驟2b: 使用CPU提取音高(如果模型帶音高), 使用GPU提取特徵(選擇卡號)", "以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2": "以-分隔輸入使用的卡號, 例如 0-1-2 使用卡0和卡1和卡2", "显卡信息": "顯示卡資訊", - "提取音高使用的CPU进程数": "提取音高使用的CPU進程數", - "提取音高和处理数据使用的CPU进程数": "提取音高和處理數據使用的CPU進程數", "选择音高提取算法:输入歌声可用pm提速,高质量语音但CPU差可用dio提速,harvest质量更好但慢": "選擇音高提取算法:輸入歌聲可用pm提速,高品質語音但CPU差可用dio提速,harvest品質更好但較慢", "特征提取": "特徵提取", "step3: 填写训练设置, 开始训练模型和索引": "步驟3: 填寫訓練設定, 開始訓練模型和索引", @@ -61,6 +61,7 @@ "是否仅保存最新的ckpt文件以节省硬盘空间": "是否僅保存最新的ckpt檔案以節省硬碟空間", "否": "否", "是否缓存所有训练集至显存. 10min以下小数据可缓存以加速训练, 大数据缓存会炸显存也加不了多少速": "是否緩存所有訓練集至 VRAM。小於10分鐘的小數據可緩存以加速訓練,大數據緩存會爆 VRAM 也加不了多少速度", + "是否在每次保存时间点将最终小模型保存至weights文件夹": "是否在每次保存時間點將最終小模型保存至weights檔夾", "加载预训练底模G路径": "加載預訓練底模G路徑", "加载预训练底模D路径": "加載預訓練底模D路徑", "训练模型": "訓練模型", @@ -74,6 +75,7 @@ "模型是否带音高指导": "模型是否帶音高指導", "要置入的模型信息": "要置入的模型資訊", "保存的模型名不带后缀": "儲存的模型名不帶副檔名", + "模型版本型号": "模型版本型號", "融合": "融合", "修改模型信息(仅支持weights文件夹下提取的小模型文件)": "修改模型資訊(僅支援weights資料夾下提取的小模型檔案)", "模型路径": "模型路徑", @@ -91,6 +93,7 @@ "Onnx输出路径": "Onnx输出路径", "MoeVS模型": "MoeSS模型", "导出Onnx模型": "导出Onnx模型", + "常见问题解答": "常見問題解答", "招募音高曲线前端编辑器": "招募音高曲線前端編輯器", "加开发群联系我xxxxx": "加開發群聯繫我xxxxx", "点击查看交流、问题反馈群号": "點擊查看交流、問題反饋群號", @@ -115,11 +118,5 @@ "性能设置": "效能設定", "开始音频转换": "開始音訊轉換", "停止音频转换": "停止音訊轉換", - "常见问题解答": "常見問題解答", - "后处理重采样至最终采样率,0为不进行重采样": "後處理重採樣至最終採樣率,0為不進行重採樣", - "版本(目前仅40k支持了v2)": "版本(目前僅40k支持了v2)", - "是否在每次保存时间点将最终小模型保存至weights文件夹": "是否在每次保存時間點將最終小模型保存至weights檔夾", - "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络": "輸入源音量包絡替換輸出音量包絡融合比例,越靠近1越使用輸出包絡", - "模型版本型号": "模型版本型號", "推理时间(ms):": "推理時間(ms):" }