{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "s_qNSzzyaCbD" }, "source": [ "##### Copyright 2019 The TensorFlow Authors." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "cellView": "form", "execution": { "iopub.execute_input": "2022-12-14T21:59:05.480367Z", "iopub.status.busy": "2022-12-14T21:59:05.479800Z", "iopub.status.idle": "2022-12-14T21:59:05.484306Z", "shell.execute_reply": "2022-12-14T21:59:05.483593Z" }, "id": "jmjh290raIky" }, "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", "# You may obtain a copy of the License at\n", "#\n", "# https://www.apache.org/licenses/LICENSE-2.0\n", "#\n", "# Unless required by applicable law or agreed to in writing, software\n", "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", "# See the License for the specific language governing permissions and\n", "# limitations under the License." ] }, { "cell_type": "markdown", "metadata": { "id": "J0Qjg6vuaHNt" }, "source": [ "# 어텐션을 사용한 인공 신경망 기계 번역" ] }, { "cell_type": "markdown", "metadata": { "id": "AOpGoE2T-YXS" }, "source": [ "\n", " \n", " \n", " \n", " \n", "
\n", " \n", " \n", " TensorFlow.org에서 보기\n", " \n", " \n", " \n", " 구글 코랩(Colab)에서 실행하기\n", " \n", " \n", " \n", " 깃허브(GitHub) 소스 보기\n", " \n", " 노트북(notebook) 다운로드\n", "
" ] }, { "cell_type": "markdown", "metadata": { "id": "CiwtNgENbx2g" }, "source": [ "이 노트북은 스페인어를 영어로 변역하기 위해 시퀀스-투-시퀀스 (seq2seq) 모델을 훈련시킵니다. 또한 이 노트북은 시퀀스-투-시퀀스 모델의 사전적인 지식을 요구하는 심화된 예제입니다.\n", "\n", "이 노트북에서 신경망 기계 번역 모델을 훈련하면 *\"¿todavia estan en casa?\"*와 같은 스페인 문장을 입력했을 때 *\"are you still at home?\"*처럼 영어로 번역된 문장을 얻을 수 있을 것입니다\n", "\n", "번역의 질은 간단한 예제로는 타당하지만 시각화된 어텐션 플롯은 아마 더 흥미로울 것입니다. 아래의 플롯은 모델을 훈련하는 동안에 입력 문장의 각 단어가 갖고 있는 모델 어텐션을 시각화하여 보여준 것입니다:\n", "\n", "\"spanish-english\n", "\n", "노트: 이 예제를 단일 P100 GPU에서 실행하기 위해서는 약 10분 정도 걸립니다." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:59:05.487777Z", "iopub.status.busy": "2022-12-14T21:59:05.487521Z", "iopub.status.idle": "2022-12-14T21:59:08.196433Z", "shell.execute_reply": "2022-12-14T21:59:08.195673Z" }, "id": "tnxXKDjq3jEL" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2022-12-14 21:59:06.512527: W tensorflow/compiler/xla/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libnvinfer.so.7'; dlerror: libnvinfer.so.7: cannot open shared object file: No such file or directory\n", "2022-12-14 21:59:06.512647: W tensorflow/compiler/xla/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libnvinfer_plugin.so.7'; dlerror: libnvinfer_plugin.so.7: cannot open shared object file: No such file or directory\n", "2022-12-14 21:59:06.512658: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Cannot dlopen some TensorRT libraries. If you would like to use Nvidia GPU with TensorRT, please make sure the missing libraries mentioned above are installed properly.\n" ] } ], "source": [ "import tensorflow as tf\n", "\n", "import matplotlib.pyplot as plt\n", "import matplotlib.ticker as ticker\n", "from sklearn.model_selection import train_test_split\n", "\n", "import unicodedata\n", "import re\n", "import numpy as np\n", "import os\n", "import io\n", "import time" ] }, { "cell_type": "markdown", "metadata": { "id": "wfodePkj3jEa" }, "source": [ "## 데이터셋 다운로드하고 준비하기\n", "\n", "http://www.manythings.org/anki/ 에서 제공한 언어 데이터셋을 사용할 것입니다. 이 데이터셋은 언어 번역의 쌍이 다음과 같은 형식으로 포함되어 있습니다:\n", "\n", "```\n", "May I borrow this book?\t¿Puedo tomar prestado este libro?\n", "```\n", "\n", "다양한 언어가 이용가능하지만 이 예제에서는 영어-스페인 데이터셋을 사용할 것입니다. 편의를 위해서 이 데이터셋의 복사본을 Google Cloud에서 호스팅 했지만 직접 다운로드해야 합니다. 데이터셋을 다운로드한 후에 데이터를 준비하고자 다음의 단계를 수행합니다.\n", "\n", "1. 각 문장에 *start*와 *end* 토큰을 추가합니다.\n", "2. 특정 문자를 제거함으로써 문장을 정리합니다.\n", "3. 단어 인덱스와 아이디(ID) 인덱스를 생성합니다. (단어 → 아이디(ID), 아이디(ID) → 단어로 매핑된 딕셔너리).\n", "4. 각 문장을 입력층의 최대 길이만큼 패딩(padding)을 수행합니다." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:59:08.201322Z", "iopub.status.busy": "2022-12-14T21:59:08.200483Z", "iopub.status.idle": "2022-12-14T21:59:08.300720Z", "shell.execute_reply": "2022-12-14T21:59:08.300005Z" }, "id": "kRVATYOgJs1b" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Downloading data from http://storage.googleapis.com/download.tensorflow.org/data/spa-eng.zip\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\r", " 8192/2638744 [..............................] - ETA: 0s" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "2638744/2638744 [==============================] - 0s 0us/step\n" ] } ], "source": [ "# 파일을 다운로드합니다.\n", "path_to_zip = tf.keras.utils.get_file(\n", " 'spa-eng.zip', origin='http://storage.googleapis.com/download.tensorflow.org/data/spa-eng.zip',\n", " extract=True)\n", "\n", "path_to_file = os.path.dirname(path_to_zip)+\"/spa-eng/spa.txt\"" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:59:08.305080Z", "iopub.status.busy": "2022-12-14T21:59:08.304323Z", "iopub.status.idle": "2022-12-14T21:59:08.309940Z", "shell.execute_reply": "2022-12-14T21:59:08.309263Z" }, "id": "rd0jw-eC3jEh" }, "outputs": [], "source": [ "# 유니코드 파일을 아스키 코드 파일로 변환합니다.\n", "def unicode_to_ascii(s):\n", " return ''.join(c for c in unicodedata.normalize('NFD', s)\n", " if unicodedata.category(c) != 'Mn')\n", "\n", "\n", "def preprocess_sentence(w):\n", " w = unicode_to_ascii(w.lower().strip())\n", "\n", " # 단어와 단어 뒤에 오는 구두점(.)사이에 공백을 생성합니다.\n", " # 예시: \"he is a boy.\" => \"he is a boy .\"\n", " # 참고:- https://stackoverflow.com/questions/3645931/python-padding-punctuation-with-white-spaces-keeping-punctuation\n", " w = re.sub(r\"([?.!,¿])\", r\" \\1 \", w)\n", " w = re.sub(r'[\" \"]+', \" \", w)\n", "\n", " # (a-z, A-Z, \".\", \"?\", \"!\", \",\")을 제외한 모든 것을 공백으로 대체합니다.\n", " w = re.sub(r\"[^a-zA-Z?.!,¿]+\", \" \", w)\n", "\n", " w = w.strip()\n", "\n", " # 모델이 예측을 시작하거나 중단할 때를 알게 하기 위해서\n", " # 문장에 start와 end 토큰을 추가합니다.\n", " w = ' ' + w + ' '\n", " return w" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:59:08.313481Z", "iopub.status.busy": "2022-12-14T21:59:08.313023Z", "iopub.status.idle": "2022-12-14T21:59:08.317509Z", "shell.execute_reply": "2022-12-14T21:59:08.316877Z" }, "id": "opI2GzOt479E" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " may i borrow this book ? \n", "b' \\xc2\\xbf puedo tomar prestado este libro ? '\n" ] } ], "source": [ "en_sentence = u\"May I borrow this book?\"\n", "sp_sentence = u\"¿Puedo tomar prestado este libro?\"\n", "print(preprocess_sentence(en_sentence))\n", "print(preprocess_sentence(sp_sentence).encode('utf-8'))" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:59:08.321228Z", "iopub.status.busy": "2022-12-14T21:59:08.320645Z", "iopub.status.idle": "2022-12-14T21:59:08.325028Z", "shell.execute_reply": "2022-12-14T21:59:08.324350Z" }, "id": "OHn4Dct23jEm" }, "outputs": [], "source": [ "# 1. 문장에 있는 억양을 제거합니다.\n", "# 2. 불필요한 문자를 제거하여 문장을 정리합니다.\n", "# 3. 다음과 같은 형식으로 문장의 쌍을 반환합니다: [영어, 스페인어]\n", "def create_dataset(path, num_examples):\n", " lines = io.open(path, encoding='UTF-8').read().strip().split('\\n')\n", "\n", " word_pairs = [[preprocess_sentence(w) for w in l.split('\\t')] for l in lines[:num_examples]]\n", "\n", " return zip(*word_pairs)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:59:08.328244Z", "iopub.status.busy": "2022-12-14T21:59:08.327819Z", "iopub.status.idle": "2022-12-14T21:59:12.508973Z", "shell.execute_reply": "2022-12-14T21:59:12.508250Z" }, "id": "cTbSbBz55QtF" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " if you want to sound like a native speaker , you must be willing to practice saying the same sentence over and over in the same way that banjo players practice the same phrase over and over until they can play it correctly and at the desired tempo . \n", " si quieres sonar como un hablante nativo , debes estar dispuesto a practicar diciendo la misma frase una y otra vez de la misma manera en que un musico de banjo practica el mismo fraseo una y otra vez hasta que lo puedan tocar correctamente y en el tiempo esperado . \n" ] } ], "source": [ "en, sp = create_dataset(path_to_file, None)\n", "print(en[-1])\n", "print(sp[-1])" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:59:12.512905Z", "iopub.status.busy": "2022-12-14T21:59:12.512113Z", "iopub.status.idle": "2022-12-14T21:59:12.516572Z", "shell.execute_reply": "2022-12-14T21:59:12.515955Z" }, "id": "bIOn8RCNDJXG" }, "outputs": [], "source": [ "def tokenize(lang):\n", " lang_tokenizer = tf.keras.preprocessing.text.Tokenizer(\n", " filters='')\n", " lang_tokenizer.fit_on_texts(lang)\n", "\n", " tensor = lang_tokenizer.texts_to_sequences(lang)\n", "\n", " tensor = tf.keras.preprocessing.sequence.pad_sequences(tensor,\n", " padding='post')\n", "\n", " return tensor, lang_tokenizer" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:59:12.519861Z", "iopub.status.busy": "2022-12-14T21:59:12.519292Z", "iopub.status.idle": "2022-12-14T21:59:12.522993Z", "shell.execute_reply": "2022-12-14T21:59:12.522407Z" }, "id": "eAY9k49G3jE_" }, "outputs": [], "source": [ "def load_dataset(path, num_examples=None):\n", " # 전처리된 타겟 문장과 입력 문장 쌍을 생성합니다.\n", " targ_lang, inp_lang = create_dataset(path, num_examples)\n", "\n", " input_tensor, inp_lang_tokenizer = tokenize(inp_lang)\n", " target_tensor, targ_lang_tokenizer = tokenize(targ_lang)\n", "\n", " return input_tensor, target_tensor, inp_lang_tokenizer, targ_lang_tokenizer" ] }, { "cell_type": "markdown", "metadata": { "id": "GOi42V79Ydlr" }, "source": [ "### 더 빠른 실행을 위해 데이터셋의 크기 제한하기(선택)\n", "\n", "10만개 이상의 문장이 있는 완전한 데이터셋을 훈련하는 것은 오랜 시간이 걸립니다. 훈련 속도를 높이기 위해서 데이터셋의 크기를 3만개의 문장으로 제한합니다. (물론, 번역의 질은 데이터가 적어질수록 저하됩니다):" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:59:12.526537Z", "iopub.status.busy": "2022-12-14T21:59:12.525818Z", "iopub.status.idle": "2022-12-14T21:59:14.210393Z", "shell.execute_reply": "2022-12-14T21:59:14.209408Z" }, "id": "cnxC7q-j3jFD" }, "outputs": [], "source": [ "# 언어 데이터셋을 아래의 크기로 제한하여 훈련과 검증을 수행합니다.\n", "num_examples = 30000\n", "input_tensor, target_tensor, inp_lang, targ_lang = load_dataset(path_to_file, num_examples)\n", "\n", "# 타겟 텐서와 입력 텐서의 최대 길이를 계산합니다.\n", "max_length_targ, max_length_inp = target_tensor.shape[1], input_tensor.shape[1]" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:59:14.214788Z", "iopub.status.busy": "2022-12-14T21:59:14.214216Z", "iopub.status.idle": "2022-12-14T21:59:14.225039Z", "shell.execute_reply": "2022-12-14T21:59:14.224340Z" }, "id": "4QILQkOs3jFG" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "24000 24000 6000 6000\n" ] } ], "source": [ "# 훈련 집합과 검증 집합을 80대 20으로 분리합니다.\n", "input_tensor_train, input_tensor_val, target_tensor_train, target_tensor_val = train_test_split(input_tensor, target_tensor, test_size=0.2)\n", "\n", "# 훈련 집합과 검증 집합의 데이터 크기를 출력합니다.\n", "print(len(input_tensor_train), len(target_tensor_train), len(input_tensor_val), len(target_tensor_val))" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:59:14.228573Z", "iopub.status.busy": "2022-12-14T21:59:14.227991Z", "iopub.status.idle": "2022-12-14T21:59:14.231726Z", "shell.execute_reply": "2022-12-14T21:59:14.231127Z" }, "id": "lJPmLZGMeD5q" }, "outputs": [], "source": [ "def convert(lang, tensor):\n", " for t in tensor:\n", " if t!=0:\n", " print (\"%d ----> %s\" % (t, lang.index_word[t]))" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:59:14.235049Z", "iopub.status.busy": "2022-12-14T21:59:14.234486Z", "iopub.status.idle": "2022-12-14T21:59:14.238745Z", "shell.execute_reply": "2022-12-14T21:59:14.238090Z" }, "id": "VXukARTDd7MT" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Input Language; index to word mapping\n", "1 ----> \n", "55 ----> fue\n", "36 ----> muy\n", "1109 ----> emocionante\n", "3 ----> .\n", "2 ----> \n", "\n", "Target Language; index to word mapping\n", "1 ----> \n", "10 ----> it\n", "26 ----> was\n", "9 ----> a\n", "3456 ----> thrill\n", "3 ----> .\n", "2 ----> \n" ] } ], "source": [ "print (\"Input Language; index to word mapping\")\n", "convert(inp_lang, input_tensor_train[0])\n", "print ()\n", "print (\"Target Language; index to word mapping\")\n", "convert(targ_lang, target_tensor_train[0])" ] }, { "cell_type": "markdown", "metadata": { "id": "rgCLkfv5uO3d" }, "source": [ "### tf.data 데이터셋 생성하기" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:59:14.242339Z", "iopub.status.busy": "2022-12-14T21:59:14.241813Z", "iopub.status.idle": "2022-12-14T21:59:17.841579Z", "shell.execute_reply": "2022-12-14T21:59:17.840783Z" }, "id": "TqHsArVZ3jFS" }, "outputs": [], "source": [ "BUFFER_SIZE = len(input_tensor_train)\n", "BATCH_SIZE = 64\n", "steps_per_epoch = len(input_tensor_train)//BATCH_SIZE\n", "embedding_dim = 256\n", "units = 1024\n", "vocab_inp_size = len(inp_lang.word_index)+1\n", "vocab_tar_size = len(targ_lang.word_index)+1\n", "\n", "dataset = tf.data.Dataset.from_tensor_slices((input_tensor_train, target_tensor_train)).shuffle(BUFFER_SIZE)\n", "dataset = dataset.batch(BATCH_SIZE, drop_remainder=True)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:59:17.845596Z", "iopub.status.busy": "2022-12-14T21:59:17.844968Z", "iopub.status.idle": "2022-12-14T21:59:17.904988Z", "shell.execute_reply": "2022-12-14T21:59:17.904233Z" }, "id": "qc6-NK1GtWQt" }, "outputs": [ { "data": { "text/plain": [ "(TensorShape([64, 16]), TensorShape([64, 11]))" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "example_input_batch, example_target_batch = next(iter(dataset))\n", "example_input_batch.shape, example_target_batch.shape" ] }, { "cell_type": "markdown", "metadata": { "id": "TNfHIF71ulLu" }, "source": [ "## 인코더 모델과 디코더 모델 쓰기\n", "\n", "어텐션(attention)을 가진 인코더-디코더 모델을 수행합니다. 어텐션(attention)은 TensorFlow [Neural Machine Translation (seq2seq) tutorial](https://github.com/tensorflow/nmt)에서 읽을 수 있습니다. 이 예제는 더 최신의 API 집합을 사용합니다. 이 노트북은 seq2seq 튜토리얼로부터 [어텐션 방정식](https://github.com/tensorflow/nmt#background-on-the-attention-mechanism)을 수행합니다. 아래의 다이어그램은 각각의 입력 단어가 어텐션 메커니즘에 의해 가중치가 할당된 모습입니다. 이러한 어텐션 메커니즘은 디코더가 문장에서 다음 단어를 예측하기 위해 사용됩니다. 아래의 그림과 공식은 [Luong's paper](https://arxiv.org/abs/1508.04025v5)에서 나온 어텐션 메커니즘의 예시입니다. \n", "\n", "\"attention\n", "\n", "입력은 *(batch_size, max_length, hidden_size)*의 형태로 이루어진 인코더 결과와 *(batch_size, hidden_size)*쌍으로 이루어진 인코더 은닉 상태(hidden state)를 제공하는 인코더 모델을 통해 입력됩니다.\n", "\n", "아래의 공식은 위에서 사용한 방정식을 나타낸 것이다:\n", "\n", "\"attention\n", "\"attention\n", "\n", "이 튜토리얼은 인코더를 위해 [Bahdanau 어텐션](https://arxiv.org/pdf/1409.0473.pdf)을 사용합니다. 단순화된 형태로 쓰기 전에 표기법을 아래와 같이 정의합니다:\n", "\n", "* FC = 완전 연결(Dense)층\n", "* EO = 인코더 결과\n", "* H = 은닉 상태(hidden state)\n", "* X = 디코더에 대한 입력\n", "\n", "그리고 다음은 슈도코드입니다:\n", "\n", "* `스코어(score)는 FC(tanh(FC(EO) + FC(H)))`로 계산합니다.\n", "* `어텐션 가중치는 softmax(score, axis = 1)`로 계산합니다. 기본적으로 소프트맥스는 마지막 축을 적용하지만 스코어(score)의 형태가 *(batch_size, max_length, hidden_size)*이기 때문에 *첫번째 축*을 적용합니다. `Max_length`은 입력의 길이입니다. 각각의 입력에 가중치를 할당하려고 시도하기 때문에 소프트맥스는 그 축을 적용할 수 있습니다.\n", "* `컨텍스트 벡터(context vector)는 sum(어텐션 가중치 * EO, axis = 1)`로 계산합니다. 위와 같은 이유로 첫번째 축을 선택합니다.\n", "* `임베딩 결과(embedding output)`는 디코더 X에 대한 입력이 임베딩층을 통과한 결과입니다.\n", "* `병합된 벡터(merged vector)는 concat(임베딩 결과, 컨텍스트 백터(context vector))`와 같습니다.\n", "* 그런 다음 병합된 벡터는 GRU에 주어집니다.\n", "\n", "매 단계마다 모든 벡터의 형태는 코드내 주석에 명시되어 있습니다:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:59:17.908745Z", "iopub.status.busy": "2022-12-14T21:59:17.908188Z", "iopub.status.idle": "2022-12-14T21:59:17.913945Z", "shell.execute_reply": "2022-12-14T21:59:17.913296Z" }, "id": "nZ2rI24i3jFg" }, "outputs": [], "source": [ "class Encoder(tf.keras.Model):\n", " def __init__(self, vocab_size, embedding_dim, enc_units, batch_sz):\n", " super(Encoder, self).__init__()\n", " self.batch_sz = batch_sz\n", " self.enc_units = enc_units\n", " self.embedding = tf.keras.layers.Embedding(vocab_size, embedding_dim)\n", " self.gru = tf.keras.layers.GRU(self.enc_units,\n", " return_sequences=True,\n", " return_state=True,\n", " recurrent_initializer='glorot_uniform')\n", "\n", " def call(self, x, hidden):\n", " x = self.embedding(x)\n", " output, state = self.gru(x, initial_state = hidden)\n", " return output, state\n", "\n", " def initialize_hidden_state(self):\n", " return tf.zeros((self.batch_sz, self.enc_units))" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:59:17.917522Z", "iopub.status.busy": "2022-12-14T21:59:17.916868Z", "iopub.status.idle": "2022-12-14T21:59:18.564555Z", "shell.execute_reply": "2022-12-14T21:59:18.563810Z" }, "id": "60gSVh05Jl6l" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Encoder output shape: (batch size, sequence length, units) (64, 16, 1024)\n", "Encoder Hidden state shape: (batch size, units) (64, 1024)\n" ] } ], "source": [ "encoder = Encoder(vocab_inp_size, embedding_dim, units, BATCH_SIZE)\n", "\n", "# 샘플 입력\n", "sample_hidden = encoder.initialize_hidden_state()\n", "sample_output, sample_hidden = encoder(example_input_batch, sample_hidden)\n", "print ('Encoder output shape: (batch size, sequence length, units) {}'.format(sample_output.shape))\n", "print ('Encoder Hidden state shape: (batch size, units) {}'.format(sample_hidden.shape))" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:59:18.568479Z", "iopub.status.busy": "2022-12-14T21:59:18.567915Z", "iopub.status.idle": "2022-12-14T21:59:18.573848Z", "shell.execute_reply": "2022-12-14T21:59:18.573158Z" }, "id": "umohpBN2OM94" }, "outputs": [], "source": [ "class BahdanauAttention(tf.keras.layers.Layer):\n", " def __init__(self, units):\n", " super(BahdanauAttention, self).__init__()\n", " self.W1 = tf.keras.layers.Dense(units)\n", " self.W2 = tf.keras.layers.Dense(units)\n", " self.V = tf.keras.layers.Dense(1)\n", "\n", " def call(self, query, values):\n", " # 쿼리 은닉 상태(query hidden state)는 (batch_size, hidden size)쌍으로 이루어져 있습니다.\n", " # query_with_time_axis은 (batch_size, 1, hidden size)쌍으로 이루어져 있습니다.\n", " # values는 (batch_size, max_len, hidden size)쌍으로 이루어져 있습니다.\n", " # 스코어(score)계산을 위해 덧셈을 수행하고자 시간 축을 확장하여 아래의 과정을 수행합니다.\n", " query_with_time_axis = tf.expand_dims(query, 1)\n", "\n", " # score는 (batch_size, max_length, 1)쌍으로 이루어져 있습니다.\n", " # score를 self.V에 적용하기 때문에 마지막 축에 1을 얻습니다.\n", " # self.V에 적용하기 전에 텐서는 (batch_size, max_length, units)쌍으로 이루어져 있습니다.\n", " score = self.V(tf.nn.tanh(\n", " self.W1(query_with_time_axis) + self.W2(values)))\n", "\n", " # attention_weights는 (batch_size, max_length, 1)쌍으로 이루어져 있습니다. \n", " attention_weights = tf.nn.softmax(score, axis=1)\n", "\n", " # 덧셈이후 컨텍스트 벡터(context_vector)는 (batch_size, hidden_size)쌍으로 이루어져 있습니다.\n", " context_vector = attention_weights * values\n", " context_vector = tf.reduce_sum(context_vector, axis=1)\n", "\n", " return context_vector, attention_weights" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:59:18.577286Z", "iopub.status.busy": "2022-12-14T21:59:18.576773Z", "iopub.status.idle": "2022-12-14T21:59:18.623218Z", "shell.execute_reply": "2022-12-14T21:59:18.622490Z" }, "id": "k534zTHiDjQU" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Attention result shape: (batch size, units) (64, 1024)\n", "Attention weights shape: (batch_size, sequence_length, 1) (64, 16, 1)\n" ] } ], "source": [ "attention_layer = BahdanauAttention(10)\n", "attention_result, attention_weights = attention_layer(sample_hidden, sample_output)\n", "\n", "print(\"Attention result shape: (batch size, units) {}\".format(attention_result.shape))\n", "print(\"Attention weights shape: (batch_size, sequence_length, 1) {}\".format(attention_weights.shape))" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:59:18.627060Z", "iopub.status.busy": "2022-12-14T21:59:18.626447Z", "iopub.status.idle": "2022-12-14T21:59:18.632850Z", "shell.execute_reply": "2022-12-14T21:59:18.632221Z" }, "id": "yJ_B3mhW3jFk" }, "outputs": [], "source": [ "class Decoder(tf.keras.Model):\n", " def __init__(self, vocab_size, embedding_dim, dec_units, batch_sz):\n", " super(Decoder, self).__init__()\n", " self.batch_sz = batch_sz\n", " self.dec_units = dec_units\n", " self.embedding = tf.keras.layers.Embedding(vocab_size, embedding_dim)\n", " self.gru = tf.keras.layers.GRU(self.dec_units,\n", " return_sequences=True,\n", " return_state=True,\n", " recurrent_initializer='glorot_uniform')\n", " self.fc = tf.keras.layers.Dense(vocab_size)\n", "\n", " # 어텐션을 사용합니다.\n", " self.attention = BahdanauAttention(self.dec_units)\n", "\n", " def call(self, x, hidden, enc_output):\n", " # enc_output는 (batch_size, max_length, hidden_size)쌍으로 이루어져 있습니다.\n", " context_vector, attention_weights = self.attention(hidden, enc_output)\n", "\n", " # 임베딩층을 통과한 후 x는 (batch_size, 1, embedding_dim)쌍으로 이루어져 있습니다.\n", " x = self.embedding(x)\n", "\n", " # 컨텍스트 벡터와 임베딩 결과를 결합한 이후 x의 형태는 (batch_size, 1, embedding_dim + hidden_size)쌍으로 이루어져 있습니다.\n", " x = tf.concat([tf.expand_dims(context_vector, 1), x], axis=-1)\n", "\n", " # 위에서 결합된 벡터를 GRU에 전달합니다.\n", " output, state = self.gru(x)\n", "\n", " # output은 (batch_size * 1, hidden_size)쌍으로 이루어져 있습니다.\n", " output = tf.reshape(output, (-1, output.shape[2]))\n", "\n", " # output은 (batch_size, vocab)쌍으로 이루어져 있습니다.\n", " x = self.fc(output)\n", "\n", " return x, state, attention_weights" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:59:18.636240Z", "iopub.status.busy": "2022-12-14T21:59:18.635755Z", "iopub.status.idle": "2022-12-14T21:59:18.707353Z", "shell.execute_reply": "2022-12-14T21:59:18.706636Z" }, "id": "P5UY8wko3jFp" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Decoder output shape: (batch_size, vocab size) (64, 4935)\n" ] } ], "source": [ "decoder = Decoder(vocab_tar_size, embedding_dim, units, BATCH_SIZE)\n", "\n", "sample_decoder_output, _, _ = decoder(tf.random.uniform((BATCH_SIZE, 1)),\n", " sample_hidden, sample_output)\n", "\n", "print ('Decoder output shape: (batch_size, vocab size) {}'.format(sample_decoder_output.shape))" ] }, { "cell_type": "markdown", "metadata": { "id": "_ch_71VbIRfK" }, "source": [ "## 최적화 함수와 손실 함수 정의하기" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:59:18.711141Z", "iopub.status.busy": "2022-12-14T21:59:18.710604Z", "iopub.status.idle": "2022-12-14T21:59:18.718327Z", "shell.execute_reply": "2022-12-14T21:59:18.717671Z" }, "id": "WmTHr5iV3jFr" }, "outputs": [], "source": [ "optimizer = tf.keras.optimizers.Adam()\n", "loss_object = tf.keras.losses.SparseCategoricalCrossentropy(\n", " from_logits=True, reduction='none')\n", "\n", "def loss_function(real, pred):\n", " mask = tf.math.logical_not(tf.math.equal(real, 0))\n", " loss_ = loss_object(real, pred)\n", "\n", " mask = tf.cast(mask, dtype=loss_.dtype)\n", " loss_ *= mask\n", "\n", " return tf.reduce_mean(loss_)" ] }, { "cell_type": "markdown", "metadata": { "id": "DMVWzzsfNl4e" }, "source": [ "## 체크포인트 (객체 기반 저장)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:59:18.721814Z", "iopub.status.busy": "2022-12-14T21:59:18.721315Z", "iopub.status.idle": "2022-12-14T21:59:18.725146Z", "shell.execute_reply": "2022-12-14T21:59:18.724510Z" }, "id": "Zj8bXQTgNwrF" }, "outputs": [], "source": [ "checkpoint_dir = './training_checkpoints'\n", "checkpoint_prefix = os.path.join(checkpoint_dir, \"ckpt\")\n", "checkpoint = tf.train.Checkpoint(optimizer=optimizer,\n", " encoder=encoder,\n", " decoder=decoder)" ] }, { "cell_type": "markdown", "metadata": { "id": "hpObfY22IddU" }, "source": [ "## 언어 모델 훈련하기\n", "\n", "1. *인코더 결과*와 *인코더 은닉 상태(hidden state)*를 반환하는 *인코더*를 통해서 *입력*을 전달합니다.\n", "2. 인코더 결과, 인코더 은닉 상태(hidden state), 디코더 입력 (*start 토큰*)을 디코더에 전달합니다.\n", "3. 전달 받은 값을 통해 디코더는 *예측 값*과 *디코더 은닉 상태(hidden state)*를 반환합니다.\n", "4. 그 다음에 디코더 은닉 상태(hidden state)가 다시 모델에 전달되고 예측 값을 사용하여 손실을 계산합니다.\n", "5. 디코더에 대한 다음 입력을 결정하기 위해서 *교사 강요(teacher forcing)*를 사용합니다.\n", "6. *교사 강요(teacher forcing)*는 *타겟 단어*가 디코더에 *다음 입력*으로 전달하기 위한 기술입니다.\n", "7. 마지막 단계는 그레디언트(gradients)를 계산하여 이를 옵티마이저(optimizer)와 역전파(backpropagate)에 적용합니다." ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:59:18.728715Z", "iopub.status.busy": "2022-12-14T21:59:18.728109Z", "iopub.status.idle": "2022-12-14T21:59:18.733963Z", "shell.execute_reply": "2022-12-14T21:59:18.733388Z" }, "id": "sC9ArXSsVfqn" }, "outputs": [], "source": [ "@tf.function\n", "def train_step(inp, targ, enc_hidden):\n", " loss = 0\n", "\n", " with tf.GradientTape() as tape:\n", " enc_output, enc_hidden = encoder(inp, enc_hidden)\n", "\n", " dec_hidden = enc_hidden\n", "\n", " dec_input = tf.expand_dims([targ_lang.word_index['']] * BATCH_SIZE, 1)\n", "\n", " # 교사 강요(teacher forcing) - 다음 입력으로 타겟을 피딩(feeding)합니다.\n", " for t in range(1, targ.shape[1]):\n", " # enc_output를 디코더에 전달합니다.\n", " predictions, dec_hidden, _ = decoder(dec_input, dec_hidden, enc_output)\n", "\n", " loss += loss_function(targ[:, t], predictions)\n", "\n", " # 교사 강요(teacher forcing)를 사용합니다.\n", " dec_input = tf.expand_dims(targ[:, t], 1)\n", "\n", " batch_loss = (loss / int(targ.shape[1]))\n", "\n", " variables = encoder.trainable_variables + decoder.trainable_variables\n", "\n", " gradients = tape.gradient(loss, variables)\n", "\n", " optimizer.apply_gradients(zip(gradients, variables))\n", "\n", " return batch_loss" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T21:59:18.737209Z", "iopub.status.busy": "2022-12-14T21:59:18.736730Z", "iopub.status.idle": "2022-12-14T22:02:57.007919Z", "shell.execute_reply": "2022-12-14T22:02:57.006887Z" }, "id": "ddefjBMa3jF0" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1 Batch 0 Loss 4.6384\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1 Batch 100 Loss 2.2454\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1 Batch 200 Loss 1.8700\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1 Batch 300 Loss 1.7020\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1 Loss 2.0448\n", "Time taken for 1 epoch 41.00983476638794 sec\n", "\n", "Epoch 2 Batch 0 Loss 1.5696\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 2 Batch 100 Loss 1.5537\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 2 Batch 200 Loss 1.2780\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 2 Batch 300 Loss 1.3496\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 2 Loss 1.4002\n", "Time taken for 1 epoch 20.720845222473145 sec\n", "\n", "Epoch 3 Batch 0 Loss 1.0209\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 3 Batch 100 Loss 1.0567\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 3 Batch 200 Loss 1.0503\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 3 Batch 300 Loss 0.8947\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 3 Loss 0.9942\n", "Time taken for 1 epoch 19.372259855270386 sec\n", "\n", "Epoch 4 Batch 0 Loss 0.7986\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 4 Batch 100 Loss 0.7268\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 4 Batch 200 Loss 0.6399\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 4 Batch 300 Loss 0.6871\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 4 Loss 0.6838\n", "Time taken for 1 epoch 19.9867901802063 sec\n", "\n", "Epoch 5 Batch 0 Loss 0.4628\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 5 Batch 100 Loss 0.4687\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 5 Batch 200 Loss 0.3977\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 5 Batch 300 Loss 0.4665\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 5 Loss 0.4678\n", "Time taken for 1 epoch 19.2256863117218 sec\n", "\n", "Epoch 6 Batch 0 Loss 0.3484\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 6 Batch 100 Loss 0.2885\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 6 Batch 200 Loss 0.3137\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 6 Batch 300 Loss 0.3120\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 6 Loss 0.3227\n", "Time taken for 1 epoch 19.75136137008667 sec\n", "\n", "Epoch 7 Batch 0 Loss 0.1817\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 7 Batch 100 Loss 0.2055\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 7 Batch 200 Loss 0.2512\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 7 Batch 300 Loss 0.2247\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 7 Loss 0.2308\n", "Time taken for 1 epoch 19.50251841545105 sec\n", "\n", "Epoch 8 Batch 0 Loss 0.2012\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 8 Batch 100 Loss 0.1823\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 8 Batch 200 Loss 0.1650\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 8 Batch 300 Loss 0.1826\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 8 Loss 0.1707\n", "Time taken for 1 epoch 19.76228904724121 sec\n", "\n", "Epoch 9 Batch 0 Loss 0.0914\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 9 Batch 100 Loss 0.1267\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 9 Batch 200 Loss 0.1182\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 9 Batch 300 Loss 0.1137\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 9 Loss 0.1323\n", "Time taken for 1 epoch 19.25247097015381 sec\n", "\n", "Epoch 10 Batch 0 Loss 0.0983\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 10 Batch 100 Loss 0.1091\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 10 Batch 200 Loss 0.1033\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 10 Batch 300 Loss 0.0770\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 10 Loss 0.1063\n", "Time taken for 1 epoch 19.68044877052307 sec\n", "\n" ] } ], "source": [ "EPOCHS = 10\n", "\n", "for epoch in range(EPOCHS):\n", " start = time.time()\n", "\n", " enc_hidden = encoder.initialize_hidden_state()\n", " total_loss = 0\n", "\n", " for (batch, (inp, targ)) in enumerate(dataset.take(steps_per_epoch)):\n", " batch_loss = train_step(inp, targ, enc_hidden)\n", " total_loss += batch_loss\n", "\n", " if batch % 100 == 0:\n", " print('Epoch {} Batch {} Loss {:.4f}'.format(epoch + 1,\n", " batch,\n", " batch_loss.numpy()))\n", " # 에포크가 2번 실행될때마다 모델 저장 (체크포인트)\n", " if (epoch + 1) % 2 == 0:\n", " checkpoint.save(file_prefix = checkpoint_prefix)\n", "\n", " print('Epoch {} Loss {:.4f}'.format(epoch + 1,\n", " total_loss / steps_per_epoch))\n", " print('Time taken for 1 epoch {} sec\\n'.format(time.time() - start))" ] }, { "cell_type": "markdown", "metadata": { "id": "mU3Ce8M6I3rz" }, "source": [ "## 훈련된 모델로 번역하기\n", "\n", "* 평가 함수는 여기서 *교사 강요(teacher forcing)*를 사용하기 못하는 것을 제외하고는 훈련 루프와 비슷합니다. 각 마지막 시점(time step)에서 이전 디코더 인코더의 결과와 은닉 상태(hidden state)를 가진 예측 값을 디코더에 입력합니다.\n", "* 모델이 *end 토큰을 예측할 때 예측하는 것을 중지합니다. *.\n", "* 그리고 *매 마지막 시점(time step)에 대한 어텐션 가중치*를 저장합니다.\n", "\n", "노트: 인코더 결과는 하나의 입력에 대해 단 한 번만 계산됩니다." ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T22:02:57.012085Z", "iopub.status.busy": "2022-12-14T22:02:57.011504Z", "iopub.status.idle": "2022-12-14T22:02:57.019231Z", "shell.execute_reply": "2022-12-14T22:02:57.018339Z" }, "id": "EbQpyYs13jF_" }, "outputs": [], "source": [ "def evaluate(sentence):\n", " attention_plot = np.zeros((max_length_targ, max_length_inp))\n", "\n", " sentence = preprocess_sentence(sentence)\n", "\n", " inputs = [inp_lang.word_index[i] for i in sentence.split(' ')]\n", " inputs = tf.keras.preprocessing.sequence.pad_sequences([inputs],\n", " maxlen=max_length_inp,\n", " padding='post')\n", " inputs = tf.convert_to_tensor(inputs)\n", "\n", " result = ''\n", "\n", " hidden = [tf.zeros((1, units))]\n", " enc_out, enc_hidden = encoder(inputs, hidden)\n", "\n", " dec_hidden = enc_hidden\n", " dec_input = tf.expand_dims([targ_lang.word_index['']], 0)\n", "\n", " for t in range(max_length_targ):\n", " predictions, dec_hidden, attention_weights = decoder(dec_input,\n", " dec_hidden,\n", " enc_out)\n", "\n", " # 나중에 어텐션 가중치를 시각화하기 위해 어텐션 가중치를 저장합니다.\n", " attention_weights = tf.reshape(attention_weights, (-1, ))\n", " attention_plot[t] = attention_weights.numpy()\n", "\n", " predicted_id = tf.argmax(predictions[0]).numpy()\n", "\n", " result += targ_lang.index_word[predicted_id] + ' '\n", "\n", " if targ_lang.index_word[predicted_id] == '':\n", " return result, sentence, attention_plot\n", "\n", " # 예측된 ID를 모델에 다시 피드합니다.\n", " dec_input = tf.expand_dims([predicted_id], 0)\n", "\n", " return result, sentence, attention_plot" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T22:02:57.022508Z", "iopub.status.busy": "2022-12-14T22:02:57.022204Z", "iopub.status.idle": "2022-12-14T22:02:57.027918Z", "shell.execute_reply": "2022-12-14T22:02:57.027002Z" }, "id": "s5hQWlbN3jGF" }, "outputs": [], "source": [ "# 어텐션 가중치를 그리기 위한 함수입니다.\n", "def plot_attention(attention, sentence, predicted_sentence):\n", " fig = plt.figure(figsize=(10,10))\n", " ax = fig.add_subplot(1, 1, 1)\n", " ax.matshow(attention, cmap='viridis')\n", "\n", " fontdict = {'fontsize': 14}\n", "\n", " ax.set_xticklabels([''] + sentence, fontdict=fontdict, rotation=90)\n", " ax.set_yticklabels([''] + predicted_sentence, fontdict=fontdict)\n", "\n", " ax.xaxis.set_major_locator(ticker.MultipleLocator(1))\n", " ax.yaxis.set_major_locator(ticker.MultipleLocator(1))\n", "\n", " plt.show()" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T22:02:57.031235Z", "iopub.status.busy": "2022-12-14T22:02:57.030653Z", "iopub.status.idle": "2022-12-14T22:02:57.035412Z", "shell.execute_reply": "2022-12-14T22:02:57.034527Z" }, "id": "sl9zUHzg3jGI" }, "outputs": [], "source": [ "def translate(sentence):\n", " result, sentence, attention_plot = evaluate(sentence)\n", "\n", " print('Input: %s' % (sentence))\n", " print('Predicted translation: {}'.format(result))\n", "\n", " attention_plot = attention_plot[:len(result.split(' ')), :len(sentence.split(' '))]\n", " plot_attention(attention_plot, sentence.split(' '), result.split(' '))" ] }, { "cell_type": "markdown", "metadata": { "id": "n250XbnjOaqP" }, "source": [ "## 마지막 체크포인트(checkpoint)를 복원하고 테스트하기" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T22:02:57.038877Z", "iopub.status.busy": "2022-12-14T22:02:57.038345Z", "iopub.status.idle": "2022-12-14T22:02:57.286582Z", "shell.execute_reply": "2022-12-14T22:02:57.285630Z" }, "id": "UJpT9D5_OgP6" }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# checkpoint_dir내에 있는 최근 체크포인트(checkpoint)를 복원합니다.\n", "checkpoint.restore(tf.train.latest_checkpoint(checkpoint_dir))" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T22:02:57.290614Z", "iopub.status.busy": "2022-12-14T22:02:57.289988Z", "iopub.status.idle": "2022-12-14T22:02:57.681852Z", "shell.execute_reply": "2022-12-14T22:02:57.680817Z" }, "id": "WrAM0FDomq3E" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Input: hace mucho frio aqui . \n", "Predicted translation: it s very cold here . \n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/tmpfs/tmp/ipykernel_690249/2919660472.py:9: UserWarning: FixedFormatter should only be used together with FixedLocator\n", " ax.set_xticklabels([''] + sentence, fontdict=fontdict, rotation=90)\n", "/tmpfs/tmp/ipykernel_690249/2919660472.py:10: UserWarning: FixedFormatter should only be used together with FixedLocator\n", " ax.set_yticklabels([''] + predicted_sentence, fontdict=fontdict)\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAwQAAANyCAYAAADcgAw+AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABKyklEQVR4nO3deZiVdd348c8ZloFUBtllxy0zN3BBcwNCcQVcwhVRy6VySSwNc0HTMHMNq6cwRVARk0dcENRMQZTVlHLBjSUUAZWcQYhxYM7vj37M0zQMojJz43xfr+uaS8993+ecz5wRPO+5l5PL5/P5AAAAklSQ9QAAAEB2BAEAACRMEAAAQMIEAQAAJEwQAABAwgQBAAAkTBAAAEDCBAEAACRMEAAAQMIEAQAAJEwQAABAwgQBAAAkTBAAAEDCBAEAACRMEPCZVqxYEatXr856DAAAaoAgYIPeeOONaNq0aey5555ZjwIAQA0QBGzQ6NGjI5/Px9y5c2P27NlZjwMAwCYmCNige+65J3bYYYcoKCiI0aNHZz0OAACbmCCgWpMnT45FixbFD37wg+jdu3fcf//9sXbt2qzHAgBgExIEVGvUqFFRr169OPnkk+Pkk0+ODz/8MCZOnJj1WAAAbEK5fD6fz3oINj+rV6+O1q1bx/777x+PP/54rFy5Mlq3bh1HHnlkjB07NuvxAADYROwhYL3Gjx8fK1asiFNPPTUiIrbYYovo27dvPProo1FcXJzxdAAAbCqCgPUaNWpUbLXVVnHMMcdULDv11FNj9erV8ac//SnDyQAA2JQEAVUsXbo0nnrqqejfv380bty4YnmfPn2iZcuWMWrUqAynAwCoHY8++mjMmjUr6zFqnCCgivvuuy/Ky8srDhdap169ejFgwIB4/vnnY/78+RlNBwBQ86ZMmRL9+vWLo48+us5fZVEQUMXo0aNjm222id69e1dZd8opp0Q+n4977rkng8mg9tx7771xyCGHRMuWLaOwsDBatmwZhx56aNx3331ZjwZALVh3RMQHH3xQ56+y6CpDVPLKK6/EbrvtFoMHD44bb7xxvdtsv/32UVBQEG+++WYtTwc1b+3atTFgwIAYP3585PP5aNSoUbRu3TqWLl0aq1evjlwuF/37948//elPUVDgdyoAddHq1aujTZs20a1bt5g9e3Ycfvjhdfoqi/5vRiVdunSJ+fPnxzXXXFPtNtOnT4+nnnqqFqeC2vPrX/86Hnroodh///3j+eefj1WrVsX8+fNj1apV8cILL8QBBxwQ48ePj+HDh2c9KgA15OGHH44VK1bE2WefHcccc0w8+uijUVJSkvVYNcYeAoD/sMcee8Tq1avj73//ezRo0KDK+rKysthtt92isLAwXn755dofEIAad9RRR8XUqVNj6dKlMXny5DjssMNixIgR8d3vfjfr0WqEPQRUMWXKlPjHP/6xwW0WLVoUU6ZMqaWJoPa8+eab0bdv3/XGQEREgwYN4uijj3bIHEAdtWzZsnjyySfjmGOOicLCwujdu3e0adOmTl9lURBQRc+ePWPkyJEb3GbUqFHRs2fP2hkIalHDhg1j5cqVG9xm5cqV0bBhw1qaCIDaNGbMmFi7dm0MHDgwIiIKCgrihBNOiKlTp8aCBQuyHa6GCAKq2JijyMrLyyOXy9XCNFC7unbtGg888EAsXrx4vevff//9eOCBB6Jbt261PBkAtWHUqFHRtm3b6NWrV8WygQMH1umrLAoCvpC33norioqKsh4DNrnBgwfHRx99FHvttVfcdNNNMXv27Fi0aFHMnj07brzxxthzzz1j+fLlMXjw4KxHBWATe+211+Kll16Kk046qdLybt26xde//vUYPXp0RpPVrPpZD8Dm4cwzz6x0e/z48evdLbZ27dqK8wcOP/zwWpoOas/RRx8dN954Y/z0pz+NSy65pNK6fD4f9evXjxtvvDGOOuqojCYEoKaMGjUqcrlclQ9njYg4+eSTY+jQoTFjxozo3r17BtPVHFcZIiKi0vXUc7ncBg8byuVysffee8c999wT22+/fW2MB7Vu3rx5ce+998bLL78cJSUl0aRJk+jatWucfPLJse2222Y9HgCbWD6fj44dO0azZs1izpw5VdbPnz8/tttuu/jBD34Qt99+ewYT1hx7CIiIf/9HHvHvPwzbbrtt/OhHP4oLL7ywynb16tWLrbfeOrbYYovaHhFq1bbbbhtXXHFF1mMAUEtmz54d9evXj3POOWe967t06RJHHXVUzJgxI/L5fJ06l9IeAqq4++67o2vXrrHbbrtlPQoAADVMEFBFQUFBnHTSSXHvvfdmPQpkZubMmTFr1qz4+OOPY+3atVXW53I5exAAqBMcMkQVRUVF0aFDh6zHgEwsX748+vfvH88///xnnksjCACoCwQBVey9997rPZkGUjB48OCYOnVq9OjRIwYNGhTt27eP+vX9VQlQF02ZMuUL3/eggw7ahJNkyyFDVDFt2rTo0aNHjBgxIk477bSsx4Fa1aJFi9h+++1j2rRpdeqEMQCqKigo+MJ/16/vcNKvKr/2ooqnnnoqevToEWeccUYMHz489t5772jdunWVPzAOmaAu+te//hUHHXSQGABIwJVXXlnl7/vp06fHE088ETvssEPsv//+0bp161i6dGm88MIL8eabb0afPn1i3333zWjimmEPAVX852cSbEgul6tTdQwREfvvv3+0a9cuHnjggaxHAaCWPffcc3HIIYfE7bffHt/97ncrxUI+n48RI0bEhRdeGE899VQccMABGU66aQkCqpg8efJGb3vwwQfX4CRQ+5588sno27dvPPvss3XuN0AAbFiPHj2iefPmMW7cuGq3OfbYY+Of//xnPPPMM7U4Wc1yyBBVeJO/eXjooYdizJgxMXfu3Fi1alW8/fbbERExd+7ceOSRR+KUU06Jdu3aZTzlV9+oUaOqLDvyyCPj4IMPjlNOOSW6desWTZo0We99nWMDULe8+OKL6/1g1v/0jW98I37961/X0kS1wx4C2MyUl5fHSSedFA8++GBERDRu3Dj+9a9/VRyetXTp0mjfvn1cc801MWTIkCxHrRPWd0LZf/+1uL71DpkDqHuaN28e++67b0yYMKHabY444oiYMWNGfPTRR7U4Wc2yh4ANWrRoUSxevDhKS0vXu74uXXJrc3HLLbfEn/70pzj33HPj+uuvj5tvvjl+/vOfV6xv3bp1HHjggTFhwgRBsAncddddWY8AwGbi0EMPjQceeCCuv/76GDx4cDRs2LBi3aeffho33XRTPPHEE3HCCSdkOOWmZw8B6/Xoo4/GT37yk3jrrbc2uJ3fkG56u+66a3zta1+LGTNmRETE1VdfHddcc02l1/rss8+OCRMmxHvvvZfVmABQ57z77rux7777xvvvvx+tWrWKvfbaK1q1ahXLli2L2bNnx7Jly6Jt27Yxbdq0aN++fdbjbjIbdzkZkvLss8/GMcccE5988kmcd955kc/n46CDDoqzzz47dt5558jn83HkkUfGlVdemfWoddLbb78dBx544Aa3ad68eZ3aVQkAm4P27dvH7NmzY+DAgVFcXBwTJkyIu+66KyZMmBDFxcUxcODAmDVrVp2KgQiHDLEe119/fWy55Zbx4osvRuvWrWP48OHRs2fPigAYNmxYXHvttXHNNddkPGnd1Lhx4yguLt7gNgsXLoymTZvWzkCJeeyxx+LOO++M22+/Pdq2bVtl/eLFi+O8886Ls846Kw4//PAMJoRN5x//+EdERLRr1y7q1atXcXtjdOzYsabGgky1adMmRo4cGSNGjIg33ngjiouLo6ioKHbcccdKhxDVJYKAKmbNmhX9+/eP1q1bVywrLy+v+PchQ4bEhAkT4sorr4xHHnkkixHrtK5du8YTTzwRq1evjkaNGlVZv3z58pg0aZLzN2rIb37zm1i8ePF6YyAiom3btjF//vz4zW9+Iwj4yuvcuXPkcrl4/fXXY8cdd6y4/VlyuVysWbOmFiaE7DRo0CB22WWXrMeoFYKAKlatWlXpcpaFhYVRUlJSaZt9993XyZg15IILLohjjjkmjjvuuPj9739fad0777wTZ555ZhQXF8cFF1yQ0YR125w5c+Koo47a4Dbdu3ePxx57rJYmgppz2mmnRS6Xi6Kiokq3gbQIAqpo06ZNfPDBBxW327VrF6+++mqlbT766CMnFNeQfv36xaWXXhq//OUvo1OnTrHFFltERESrVq3io48+inw+H1dccUX06tUr40nrpuXLl0erVq02uE2LFi3iww8/rKWJoOaMHDlyg7chRX/+85/j5ptvjlmzZsXHH39c6SiJderaXjJBQBW77757vPLKKxW3e/bsGXfffXeMGTMm+vbtG1OnTo0HHngg9txzzwynrNuGDRsWvXr1ittvvz1mzJgRq1evjvLy8jjssMPiggsuiD59+mQ9Yp3VsmXLeOONNza4zRtvvBHNmjWrpYkAqC3jxo2LE044IcrLy6NTp06x0047Rf36df/tssuOUsWdd94Z5513Xrz++uvRqVOnmD9/fuy5556VTnStX79+PPXUU45jp8455ZRTYty4cTFz5szYbbfdqqyfM2dO7LPPPnHsscfGmDFjMpgQgJqy++67x7x58+Lhhx9Oak+8IGCjvPPOO3HzzTfHvHnzolOnTnHuuefGHnvskfVYsMn97W9/i3322ScaNmwYP/7xj+OQQw6Jdu3axXvvvRdPPvlk3HTTTVFWVhYzZsxYbzDAV9nGvgHK5XLx9NNP1/A0UPsaNWoUAwcOjBEjRmQ9Sq0SBLCZcdnL7I0bNy4GDRoU//rXvyotz+fzseWWW8aoUaOif//+2QwHNaigYMMfT5TL5SKfz0cul3MeGXVSu3bt4vjjj4/bbrst61FqlSCgijPPPDP69+8fffv2rXabxx57LP73f/837rzzzlqcLA2HH354LF68OObMmVPtNl27do127dq50k0NWrZsWYwcOTJmzZoVxcXF0bRp09hnn31i0KBB0bJly6zHq/Oef/75ePnll6OkpCSaNGkSe+yxR+y///5Zj5WskpKS+Otf/xqXXXZZtG/fPsaMGRP16tXLeizY5C688ML485//HHPmzEni3IF1BAFVFBQUxNChQzf4ScTXXXddXHnllX5DVAPatm0bRx11VPzhD3+odptzzz03HnvssXj33XdrcTKoeS+88EKcccYZ8fbbb0dEVPw2OiJihx12iLvuuiv222+/LEdM2ooVK2LXXXeNM88806fVUyetXLkyDj300GjTpk3ccsstyXwAXzrpwya1evXqpMq5NrnsJal69dVX49BDD41Vq1bFIYccEj179oxtttkmlixZEs8880w8+eST0adPn5g+fXrsvPPOWY+bpK222ioOP/zwuOuuuwQBddKuu+4aZWVlMX369Bg/fnw0bdq04nM6/lMul4t33nkngwlrhnd0rFd1H0yTz+dj0aJFMXHixGo/yZUvx2UvszVq1KiN3va0006rwUnSc80118Snn34ajz/+eBx22GGV1l166aUxadKk6Nu3b1xzzTVx//33ZzQlBQUF8f7772c9BtSI8vLyqF+/fqU9A+s7mKauHWDjkCEi4t9/wa+LgP/cRV+dfD4fl156aQwbNqw2xkuKy15m6z//LFTHSZU1o3Xr1vHtb3877rvvvmq3Ofnkk+Ppp5+OpUuX1uJkrDNv3rzYd999o1mzZjF37tysxwE2EXsIiIiIgw46qOJN0JQpU6Jjx47RuXPnKtvVq1cvmjVrFr169YqzzjqrlqdMw6WXXhrjxo2LAw44oNrLXhYUFMSQIUOyHrVOuuuuu9a7vLi4OP7617/GfffdF3379o2jjz66lier+4qLi6NLly4b3KZLly6VPhOFTevMM89c7/I1a9bEe++9F1OnTo2ysrK45pprankyoCbZQ0AVG3NSMTXLZS83X9OmTYtevXrFY489Ft/+9rezHqdO2XbbbaNLly4bvL597969Y968eTFv3rxanCwdn3XZ0a9//etx8cUXx/e+971amgiy89prr8XcuXNj5cqVMXDgwKzHqVGCADZTLnu5+TrhhBPi3Xffjeeffz7rUeqUH/3oRzF8+PC47LLL4mc/+1k0atSoYt3q1atj2LBhce2118YFF1wQt9xyS4aT1l0LFy5c7/KCgoJo2rRpbLXVVrU8EdS+WbNmxVlnnRV///vfK5atO0R0ypQpcdhhh8X999+/wcuzf9UIAtarvLy8ym+Kpk2bFo899lg0atQozjjjjGjfvn1G00G2Lrnkkvjtb38bn3zySdaj1CkfffRRdO/ePebPnx/NmzePffbZJ1q3bh1Lly6NWbNmxQcffBDbbrttzJw500n1QI149dVXY999942CgoI466yzYu7cuTFx4sSKIMjn89GpU6c4+OCDY/To0RlPu+lseN8gSbrooovia1/7Wnz88ccVyx588ME48MADY9iwYXHVVVdFt27dXAOfJOXz+ZgyZUo0btw461HqnObNm8f06dNj0KBB8cknn8Tjjz8ed911Vzz++OOxYsWKOOOMM2L69OliAKgxV111VUREvPjii3HjjTfG3nvvXWl9LpeL/fbbL2bNmpXFeDXGScVU8cwzz0SvXr2iadOmFcuuvPLKKCoqittuuy2WLFkSQ4YMiRtvvDFuvfXWzOas61avXh2zZs2KxYsXR2lp6Xq3cdnLTW/KlCnrXb7upMpRo0bFrFmzvPY1pEWLFnHnnXfG73//+5g7d27FJxXvtNNO0aBBg6zHq/O+6MnCuVwurrjiik08DdS+yZMnx3HHHRfbb799tdt07NgxJk2aVItT1TxBQBWLFi2Kgw8+uOL2/PnzY+7cuXHVVVfFqaeeGhERzz33XJ37w7A5+c1vfhNXXHFFtVdTWXfZS29KN70ePXps8LKj+Xw+9t9//7j55ptrcar0NGjQIHbdddesx0jO0KFDK/33/59HFVe3fN06QUBdsGLFis/8cNB//etfde6y04KAKlauXBlbbLFFxe3JkydHLpeLww8/vGLZzjvvvMErgfDF/e///m+cf/75seuuu8YVV1wRF198cfTv3z+6d+8eU6ZMiYkTJ8Zxxx0XRx11VNaj1klXXnnleoOgoKAgtt5669h7772je/fuGUwGNe+ZZ56Jm266KZ588skYOHBgHHjggRXncUyZMiXuueee6NOnTwwePDjrUaFGdOjQodLJxOvz17/+Nbbbbrtamqh2CAKqaNu2baVPyp00aVJsueWWseeee1YsKykpicLCwizGq/NuvfXWaNWqVUybNi2+9rWvxcUXXxx77LFHXHrppXHppZfGfffdF4MGDYof/vCHWY9aJw0dOjTrEZLRq1evyOVycffdd0f79u2jV69eG3W/XC7nFxI15K233opnn302XnzxxfjmN79Zad1pp50WF154YXzrW9+Kfv36VfuZBfBVdtRRR8Wvf/3r+POf/xy9e/eusv6BBx6I6dOn17k9Yq4yRBVnnHFGjBkzJm688cZo1KhR/OAHP4j+/fvHAw88ULHNYYcdFu+//37MmTMnw0nrpqZNm8aAAQPiD3/4Q0T8+zfTV1xxRVx99dUV2/Tp0yfKysriL3/5S1Zj1nlr166Nd999NxYvXhxlZWXr3eaggw6q5anqlnWfCv3666/Hjjvu+JnXwF/Hp0TXnF133TX222+/ir9/1uess86K6dOnf+ZvUeGr6IMPPohu3brF0qVLY9CgQbFkyZJ4/PHHY/jw4TFt2rQYM2ZMdOzYMV566aUoKirKetxNxh4CqvjZz34W48ePjwsvvDDy+XxsscUWlX5rumLFipgyZUqcfvrpmc1Yl5WVlVX6nIHGjRtXuuJTRMTuu+++wf9h88WVl5fHL37xi7jtttti+fLlG9zWm9Ivp7y8fIO3qX1vv/32Zx6O2Lx583jnnXdqaSKoXS1btozJkyfHwIED449//GPF8vPOOy8iIrp37x5jxoypUzEQIQhYj+233z5ee+21GDduXEREHH300dGpU6eK9W+99Vacc845cfLJJ2c1Yp3Wtm3beP/99ytud+rUKV566aVK2yxcuDDq1/fHtyYMGTIkfvWrX0WrVq3ijDPOiG222cZrTTJatmwZEydOjF/84hfrPZemvLw8Jk6cGC1atMhgOqgd2267bTz//PPx8ssvx/Tp02P58uXRpEmT6N69e5XLkNYVDhmCzczJJ58cr732Wrz88ssRETF48OC47bbb4tprr42+ffvG1KlT47zzzovevXvHxIkTsx22DmrTpk1svfXWMWvWrNhyyy2zHicp9erVixNPPDHuvfferEdJ1k9/+tO44YYb4ogjjojrrrsudt9994p1L7/8cvzsZz+LSZMmxSWXXBLDhg3LcFJgUxIEVLJ48eKYPXt2dOvWrdpPIp41a1YsWbIkjjrqqA1enpEv5qGHHorLLrssJk6cGJ07d44PPvgg9tprr4oPgsvn81FUVBRTpkxxWcYasOWWW8a5554bN954Y9ajJGfrrbeOc845J66//vqsR0nW6tWr4+ijj46nn346crlcbLHFFtGyZcv44IMPYuXKlZHP56N3797xyCOPRKNGjbIeFzaplN8DCQIqeffdd6NTp05xxhlnxB133FFl/dq1a6Ndu3bRsWPHmDlzZgYTpumf//xn3HHHHTFv3rzo1KlTDBw4MNq1a5f1WHXSt771rejcuXPcd999WY+SnD59+kRBQYE9XxnL5/Nx9913x6hRo+Jvf/tbFBcXR1FRUey+++4xcODAGDRoUJ16IwTrpPweSBBQRa9eveKll16KJUuWVLm06KRJk+KII46I2267Lc4///yMJoSaM2HChPjOd74TU6dOjW7dumU9TlKmTZsWPXr0iBEjRvjQPSATqb4HcqYcVZx22mkxefLkePTRR+P444+vtO7ee++NBg0aOKG4hn366acxfvz4mDVrVnz88cfrvZpNLperdAUENo0jjzwyRo4cGYcffnj07ds3dt9992jSpMl6t/WmddN66qmnokePHnHGGWfE8OHDY++9947WrVtX+W20T8WtHWvXro0PP/wwSktL17u+Y8eOtTwR1LxU3wPZQ0AVn3zySbRp0ya+/e1vx8MPP1yxfNWqVdG6devo2bNnPPLIIxlOWLctXLgwDjnkkHjnnXdiQ388XYu9ZpSWlsb3vve9uO+++ype//9+Q5rP573+NcDnEGweXnzxxbjssstiypQp8emnn653m1wuF2vWrKnlyaDmpfoeyB4Cqthyyy2jX79+MW7cuFi+fHk0a9YsIiIefvjhWLVqld+K1rCLLroo3n777Rg4cGCceeaZ0b59e5e9rEWDBw+Oe++9N3bbbbc4/vjjXXa0Bj3yyCOx0047xY477hgREc8880zGE/Hyyy/HgQceGPXr149DDz00Hn300dh9992jTZs28de//jU++OCD6NGjR6VLUUNdkux7oDysx8SJE/O5XC7/29/+tmLZEUcckd96663zpaWlGU5W9xUVFeV79+6d9RjJatmyZX6vvfbKl5WVZT1KnVdQUJC/+uqrK2536dIlf9ttt2U4Eccee2y+cePG+ddeey2fz+fzuVyu4me0atWq/Pe///18y5Yt8/Pnz89wSqhZKb4H2rj9syTn0EMPjTZt2sTo0aMjIuLDDz+Mp556Kr7zne9Ew4YNM56ubisvL4+uXbtmPUayVq9eHT179rRXoBY0aNAgysrKKm4vWLCgyqdyU7umTp0affv2jW984xsVy/L//9C5xo0bx+233x5t27aNyy67LKsRocal+B5IELBeBQUFcdJJJ8WMGTNi3rx5MXbs2Fi7dm0MHDgw69HqvO7du8frr7+e9RjJ2nPPPePtt9/OeowkdOzYMaZOnVrpfACXs8xWcXFxbLvtthW3GzRoEJ988knF7YKCgujRo0c8/fTTWYwHtSLF90CCgGqddtppkc/n45577ol77rknOnfuHAcccEDWY9V5119/ffzlL3+JBx98MOtRkvSLX/wiJk2aFI899ljWo9R5J598ckyePDmaNWtW8Sb0lltuiW233XaDX9ttt13Gk9ddrVq1in/+858Vt9u0aRNvvfVWpW1Wr14dq1atqu3RoFal9h7IPnGqtfvuu8euu+4av/vd72LZsmVx+eWXZz1SnXTNNddUWdazZ8844YQT4uCDD45u3bqt97KXLr1YM9Zd+rJfv37Rq1evai876vX/8i6//PJo1KhRTJgwIRYvXhy5XC7y+fwGr64VEZ+5ni9u5513jjfeeKPi9v777x/jx4+PadOmxX777Revv/56PPDAA7HTTjtlOGXa1q5dG++9915EuPRrTUrtPZDLjrJBN954Y1xyySWRy+XizTff9Ju5GrCxl1r8by69WDNc+jI7BQUFMXTo0LjyyiuzHiVZw4cPj4suuigWLVoU22yzTcyZMyf23Xff+PTTT6NZs2bxz3/+M8rLy2PcuHFxzDHHZD1ukt544434xje+EQUFBS79WsNSeg8kCNig999/P771rW/FbrvtVul6vGw6kydP/sL3PfjggzfhJER8vp+H13/Tuvrqq6Nnz55x0EEHZT1KssrKymL58uWx9dZbV5w8+cILL8R1110X8+bNi06dOsX5558fRx55ZMaTpmvevHnRq1evyOVyMX/+/KzHqdNSeg8kCAAAIGFOKgYAgIQJAgAASJggYINKS0tj6NChUVpamvUoSfL6Z8/PIFte/2x5/bPl9c9eKj8D5xCwQSUlJVFUVBTFxcXrvfQiNcvrnz0/g2x5/bPl9c+W1z97qfwM7CEAAICECQIAAEiYTyquYeXl5bF48eLYaqutIpfLZT3O51ZSUlLpn9Qur3/2/Ayy5fXPltc/W17/7H3Vfwb5fD5WrFgRbdu23eAHbzqHoIa9++670aFDh6zHAAAgUYsWLYr27dtXu94eghq21VZbRUTEAXFE1I8GGU8DAFC7cvW93czKmnxZPLf2kYr3o9XxE6ph6w4Tqh8Non5OEAAAacnlvN3M2mcdtu6kYgAASJggAACAhAkCAABImCAAAICECQIAAEiYIAAAgIQJAgAASJggAACAhAkCAABImCAAAICECQIAAEiYIAAAgIQJAgAASJggAACAhAkCAABImCAAAICECQIAAEiYIAAAgIQJAgAASJggAACAhAkCAABImCAAAICECQIAAEiYIAAAgIQJAgAASJggAACAhAkCAABImCAAAICECQIAAEiYIAAAgIQJAgAASJggAACAhAkCAABImCAAAICECQIAAEiYIAAAgIQJAgAASJggAACAhAmC/7JgwYLI5XJx+umnZz0KAADUOEGwEXr06BG5XC7rMQAAYJOrn/UAm5t27drF66+/HkVFRVmPAgAANU4Q/JcGDRrETjvtlPUYAABQKxwy9F/++xyCXC4XkydPrvj3dV/OMQAAoC6wh+AzXHXVVTFy5MhYuHBhXHXVVRXL99hjj+yGAgCATUQQfIahQ4fGs88+GwsXLoyhQ4d+5valpaVRWlpacbukpKQGpwMAgC/HIUOb2LBhw6KoqKjiq0OHDlmPBAAA1RIEm9iQIUOiuLi44mvRokVZjwQAANVyyNAmVlhYGIWFhVmPAQAAG8UeAgAASJgg2Aj16tWLiIi1a9dmPAkAAGxagmAjNGvWLCLC+QAAANQ5ziHYCL169YoHH3wwjjvuuDj88MOjUaNGsfvuu8fRRx+d9WgAAPClCIKNcNZZZ8WCBQvi/vvvj1/+8pexZs2aGDRokCAAAOArL5fP5/NZD1GXlZSURFFRUfSIflE/1yDrcQAAalWuvt8/Z2VNviyeWTMuiouLo0mTJtVu5xwCAABImCAAAICECQIAAEiYIAAAgIQJAgAASJggAACAhAkCAABImCAAAICECQIAAEiYIAAAgIQJAgAASJggAACAhAkCAABImCAAAICECQIAAEiYIAAAgIQJAgAASJggAACAhAkCAABImCAAAICECQIAAEiYIAAAgIQJAgAASJggAACAhAkCAABImCAAAICECQIAAEiYIAAAgIQJAgAASJggAACAhAkCAABImCAAAICECQIAAEiYIAAAgIQJAgAASJggAACAhAkCAABImCAAAICECQIAAEhY/awHSEX99m2jfkFh1mMkqf24j7IeIWmz7toj6xGSt834+VmPkLT8ylVZj5C08lVe/6zl16zJeoRk5fMb99rbQwAAAAkTBAAAkDBBAAAACRMEAACQMEEAAAAJEwQAAJAwQQAAAAkTBAAAkDBBAAAACRMEAACQMEEAAAAJEwQAAJAwQQAAAAkTBAAAkDBBAAAACRMEAACQMEEAAAAJEwQAAJAwQQAAAAkTBAAAkDBBAAAACRMEAACQMEEAAAAJEwQAAJAwQQAAAAkTBAAAkDBBAAAACRMEAACQMEEAAAAJEwQAAJAwQQAAAAkTBAAAkDBBAAAACRMEAACQMEEAAAAJEwQAAJAwQQAAAAkTBAAAkDBBAAAACRMEAACQMEEAAAAJEwQAAJAwQQAAAAkTBAAAkDBBAAAACRMEGzBu3Lg4+OCDo1WrVtGoUaNo27Zt9O7dO8aNG5f1aAAAsEnUz3qAzdXvfve7+MEPfhDbbLNNHHPMMdG8efNYsmRJzJw5Mx566KE47rjjsh4RAAC+NEFQjTvuuCMaNmwYL7/8crRq1arSuo8++qja+5WWlkZpaWnF7ZKSkhqbEQAAviyHDG1AgwYNokGDBlWWN2/evNr7DBs2LIqKiiq+OnToUJMjAgDAlyIIqnHiiSfGypUrY5dddomf/OQn8fjjj2/Ub/uHDBkSxcXFFV+LFi2qhWkBAOCLEQTV+PGPfxx//OMfo23btnHTTTfFkUceGc2bN4/+/fvH/Pnzq71fYWFhNGnSpNIXAABsrgRBNXK5XJx55pkxa9as+OCDD+Khhx6KY489Nh5++OE46qijYu3atVmPCAAAX5og2Ajr9gyMHTs2evXqFa+99lq8/fbbWY8FAABfmiCoxrPPPhv5fL7SsrKysli+fHlERDRq1CiLsQAAYJNy2dFq9O/fP5o0aRL77rtvdOrUKcrKyuKpp56K1157LY4//vjo1KlT1iMCAMCXJgiqMWzYsJg0aVLMnDkzHn300dhiiy1iu+22i9/97nfx3e9+N+vxAABgkxAE1fj+978f3//+97MeAwAAapRzCAAAIGGCAAAAEiYIAAAgYYIAAAASJggAACBhggAAABImCAAAIGGCAAAAEiYIAAAgYYIAAAASJggAACBhggAAABImCAAAIGGCAAAAEiYIAAAgYYIAAAASJggAACBhggAAABImCAAAIGGCAAAAEiYIAAAgYYIAAAASJggAACBhggAAABImCAAAIGGCAAAAEiYIAAAgYYIAAAASJggAACBhggAAABImCAAAIGGCAAAAEiYIAAAgYYIAAAASJggAACBhggAAABImCAAAIGGCAAAAElY/6wFSkS9sGPl6DbMeI0kLzts+6xGStvftL2c9QvIWvLRD1iMkrf6CpVmPkLTcp59mPULy8mvXZj1CwnIR+c/eyh4CAABImCAAAICECQIAAEiYIAAAgIQJAgAASJggAACAhAkCAABImCAAAICECQIAAEiYIAAAgIQJAgAASJggAACAhAkCAABImCAAAICECQIAAEiYIAAAgIQJAgAASJggAACAhAkCAABImCAAAICECQIAAEiYIAAAgIQJAgAASJggAACAhAkCAABImCAAAICECQIAAEiYIAAAgIQJAgAASJggAACAhAkCAABImCAAAICECQIAAEiYIAAAgIQJAgAASJggAACAhAkCAABImCAAAICECQIAAEiYIAAAgIQJAgAASJggAACAhAkCAABImCAAAICECQIAAEjYZhkEzz33XORyuTjzzDPXu37ZsmXRoEGD2H///SuWrVixIq666qr45je/GY0bN46mTZtGnz59YurUqVXu36NHj8jlcrF69eq4/PLLY7vttosGDRrE0KFD49RTT41cLhczZ85c73NfeeWVkcvlYsyYMZvmmwUAgAxtlkFwwAEHROfOnWPcuHGxevXqKuvHjBkTa9asiYEDB0ZExPLly2O//faLa665Jrbeeus499xz47jjjosXX3wxevbsGePHj1/v8xx33HExcuTI6NmzZ1x44YXRpUuXOOeccyIi4o477qiy/dq1a+Ouu+6K5s2bx7HHHrvpvmEAAMhI/awHWJ9cLhennnpqXHvttfHII4/EgAEDKq0fPXp0NGzYsGL5+eefH6+++mqMGDEivve971VsN2zYsNhrr73i7LPPjsMOOywaNWpU6XEWL14cf/vb36JZs2aVlu+8885x//33xy233BJbbLFFxfJJkybFu+++Gz/60Y+isLBwvbOXlpZG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4+yzz47DDjssttpqq2qfq6SkJM4///zYYostYtasWbHjjjtGRMR1110XvXv3jvfffz86deq0wXlLS0ujtLS00mMCAMDmarM/ZOj3v/99lJeXx7XXXlvlkp+5XC7atm0bERF33313NGjQIK6//vqKGIiI6Nq1awwaNCg+/vjjGD9+/Aafa/z48VFSUhJnnnlmRQxERDRo0CCuu+66jZp32LBhUVRUVPHVoUOHjftGAQAgA5t9EMycOTMiIg499NBqtykpKYl58+bF9ttvH+3bt6+yvmfPnhER8fLLL2/wuebMmRMREQceeGCVdfvtt1/Ur//ZO1SGDBkSxcXFFV+LFi36zPsAAEBWNvtDhoqLiyOXy8U222xT7TbrDstp3br1etevu+9nHb5TXFwcERGtWrWqsq5evXrRvHnzz5y3sLAwCgsLP3M7AADYHGz2ewiaNm1a6VyB9WnSpElERCxdunS965csWVJpu+oUFRVFRMSyZcuqrFu7dm189NFHGzUzAAB8VWz2QbDPPvtERMSTTz5Z7TZNmjSJbbfdNt5+++147733qqx/9tlnIyJijz322OBz7b777hER8dxzz1VZN23atFizZs1GTg0AAF8Nm30QnHvuuVGvXr24/PLLY+HChZXW5fP5WLx4cUREDBo0KMrKymLIkCGRz+crtvnb3/4WI0eOjKKioujfv/8Gn6tfv37RpEmTuPPOO+PNN9+sWF5WVhaXX375pvumAABgM7HZn0Ow6667xq233hoXXHBBfPOb34z+/ftHp06dYsmSJTFlypQ48sgj49Zbb41LLrkkJkyYEKNHj47XX389vv3tb8eyZcti7NixsWbNmhgxYsQGLzka8e9Dhn7961/H6aefHnvvvXeceOKJUVRUFI899lg0btx4g+cxAADAV9FmHwQREeedd17ssssucdNNN8XEiRPjk08+iVatWkX37t1jwIABERHRqFGj+Mtf/hK//OUvY+zYsXHLLbfE1772tTj44IPjsssuiwMOOGCjnmvQoEFRVFQU1157bdx9991RVFQUffv2jRtuuCG6du1ak98mAADUulz+P4+vYZMrKSmJoqKi6Fn/uKifa5D1OEnKO/cjU7mu38x6hOR1+J8FWY+QtL8P3zXrEZLWbPr6LzhC7Vn79vysR0jWmnxZPBsPR3Fx8QYvrrPZn0MAAADUHEEAAAAJEwQAAJAwQQAAAAkTBAAAkDBBAAAACRMEAACQMEEAAAAJEwQAAJAwQQAAAAkTBAAAkDBBAAAACRMEAACQMEEAAAAJEwQAAJAwQQAAAAkTBAAAkDBBAAAACRMEAACQMEEAAAAJEwQAAJAwQQAAAAkTBAAAkDBBAAAACRMEAACQMEEAAAAJEwQAAJAwQQAAAAkTBAAAkDBBAAAACRMEAACQMEEAAAAJEwQAAJAwQQAAAAkTBAAAkDBBAAAACRMEAACQMEEAAAAJEwQAAJCw+lkPkIr8mjWRz+WyHgNqXf6lV7MeIXnvnv2NrEdIWq+RL2Q9QtImjDog6xGSt83wRVmPkKxcPh+x5rO3s4cAAAASJggAACBhggAAABImCAAAIGGCAAAAEiYIAAAgYYIAAAASJggAACBhggAAABImCAAAIGGCAAAAEiYIAAAgYYIAAAASJggAACBhggAAABImCAAAIGGCAAAAEiYIAAAgYYIAAAASJggAACBhggAAABImCAAAIGGCAAAAEiYIAAAgYYIAAAASJggAACBhggAAABImCAAAIGGCAAAAEiYIAAAgYYIAAAASJggAACBhggAAABImCAAAIGGCAAAAEiYIAAAgYYIAAAASJggAACBhggAAABImCAAAIGGbZRA8++yzkcvlYujQoVmPAgAAddpmGQQAAEDtEAQAAJAwQQAAAAnb7INg9uzZccghh8RWW20VRUVFccwxx8SCBQuqbDd//vz43ve+Fx07dozCwsLYZptt4vTTT4+FCxdW2TaXy0WPHj3ivffei9NOOy3atGkTBQUF8eyzz1ZsM2XKlDj66KOjRYsWUVhYGDvssENcfvnlsWrVqhr8bgEAoHbVz3qADZk1a1bccMMN0bNnzzjnnHPipZdeivHjx8ff//73eOWVV6JRo0YRETFjxozo06dPrFy5Mo466qjYYYcdYsGCBXHvvffGxIkTY9q0abHttttWeuyPPvoo9ttvv2jWrFmceOKJsXr16mjSpElERPzud7+LH/7wh9G0adM4+uijo1WrVjF79uy47rrr4plnnolnnnkmGjZsWOuvBwAAbGqbdRA8/vjjcf/998cJJ5xQsey0006L0aNHx/jx4+PEE0+MsrKyOPHEE6O8vDxmzpwZXbt2rdh26tSp0aNHj7jwwgvj0UcfrfTYr7zySpxxxhkxYsSIqFevXsXy1157LS644ILYbbfd4umnn47mzZtXrLv++utjyJAhMXz48Lj44ovXO3NpaWmUlpZW3C4pKfnSrwMAANSUzfqQoYMOOqhSDEREnHnmmRHx770HERGPPfZYLFiwIH7yk59UioGIiAMOOCD69esXjz/+eJU35g0bNowbbrihUgxERPz+97+PNWvWxPDhwyvFQETEJZdcEi1btowxY8ZUO/OwYcOiqKio4qtDhw6f75sGAIBatFnvIdhzzz2rLGvfvn1ERHz88ccRETF9+vSIiHjjjTfW+7kFS5YsifLy8njzzTdjr732qljepUuXaNGiRZXt1z3eE088EU8//XSV9Q0aNIi5c+dWO/OQIUNi8ODBFbdLSkpEAQAAm63NOgjWHdP/n+rX//fIa9eujYiI5cuXR0TEvffeu8HHWrlyZaXbrVu3Xu926x7vuuuu+3zD/n+FhYVRWFj4he4LAAC1bbM+ZGhjrIuGRx99NPL5fLVfBx98cKX75XK5DT5eSUnJBh8PAADqgq98EHTv3j0iIqZNm7ZJH2/doUMAAFCXfeWDoF+/ftGxY8e4+eabY8qUKVXWl5WVxdSpUzf68X7wgx9E/fr14/zzz49//OMfVdZ//PHH8dJLL32pmQEAYHOxWZ9DsDEKCwvjwQcfjMMPPzwOPvjg6NWrV+y6666Ry+Vi4cKF8dxzz0Xz5s03eCLwf9pll13it7/9bXz/+9+Pr3/963HEEUfEdtttFytWrIh58+bF5MmT4/TTT4//+Z//qeHvDAAAat5XPggiIvbee++YM2dO/OpXv4rHH388nn/++SgsLIx27dpF//7946STTvpcj3fWWWfFHnvsUbHX4dFHH42ioqLo2LFjXHTRRTFo0KAa+k4AAKB25fLOkK1RJSUlUVRUFD2iX9TPNch6HCBBBbt/I+sRktZ15KtZj5C0CaMOyHqE5G0zfGbWIyRrTb4snlkzLoqLi9d79c51vvLnEAAAAF+cIAAAgIQJAgAASJggAACAhAkCAABImCAAAICECQIAAEiYIAAAgIQJAgAASJggAACAhAkCAABImCAAAICECQIAAEiYIAAAgIQJAgAASJggAACAhAkCAABImCAAAICECQIAAEiYIAAAgIQJAgAASJggAACAhAkCAABImCAAAICECQIAAEiYIAAAgIQJAgAASJggAACAhAkCAABImCAAAICECQIAAEiYIAAAgIQJAgAASJggAACAhAkCAABImCAAAICECQIAAEiYIAAAgIQJAgAASFj9rAcA6rhcLusJkpd/9a2sR0jay9/ZLusRkjZnym+zHiF5h84YlPUIySpfszpixmdvZw8BAAAkTBAAAEDCBAEAACRMEAAAQMIEAQAAJEwQAABAwgQBAAAkTBAAAEDCBAEAACRMEAAAQMIEAQAAJEwQAABAwgQBAAAkTBAAAEDCBAEAACRMEAAAQMIEAQAAJEwQAABAwgQBAAAkTBAAAEDCBAEAACRMEAAAQMIEAQAAJEwQAABAwgQBAAAkTBAAAEDCBAEAACRMEAAAQMIEAQAAJEwQAABAwgQBAAAkTBAAAEDCBAEAACRMEAAAQMIEAQAAJEwQAABAwgQBAAAkTBAAAEDCBAEAACRMEAAAQMIEAQAAJEwQAABAwgQBAAAkTBAAAEDCBAEAACRMEAAAQMIEAQAAJKx+1gPUNaWlpVFaWlpxu6SkJMNpAABgw+wh2MSGDRsWRUVFFV8dOnTIeiQAAKiWINjEhgwZEsXFxRVfixYtynokAAColkOGNrHCwsIoLCzMegwAANgo9hAAAEDCBAEAACRMEHwO77zzTsydOzfKysqyHgUAADYJQfA5fPvb345vfOMb8d5772U9CgAAbBKCAAAAEuYqQ5/DggULsh4BAAA2KXsIAAAgYYIAAAASJggAACBhggAAABImCAAAIGGCAAAAEiYIAAAgYYIAAAASJggAACBhggAAABImCAAAIGGCAAAAEiYIAAAgYYIAAAASJggAACBhggAAABImCAAAIGGCAAAAEiYIAAAgYYIAAAASJggAACBhggAAABImCAAAIGGCAAAAEiYIAAAgYYIAAAASJggAACBhggAAABImCAAAIGGCAAAAEiYIAAAgYYIAAAASJggAACBhggAAABImCAAAIGGCAAAAEiYIAAAgYYIAAAASVj/rAYA6Lp/PeoLk5deuzXqEpJUvWpz1CEnrMv7srEdI3jd/sSjrEZKVW/lpxBGfvZ09BAAAkDBBAAAACRMEAACQMEEAAAAJEwQAAJAwQQAAAAkTBAAAkDBBAAAACRMEAACQMEEAAAAJEwQAAJAwQQAAAAkTBAAAkDBBAAAACRMEAACQMEEAAAAJEwQAAJAwQQAAAAkTBAAAkDBBAAAACRMEAACQMEEAAAAJEwQAAJAwQQAAAAkTBAAAkDBBAAAACRMEAACQMEEAAAAJEwQAAJAwQQAAAAkTBAAAkDBBAAAACRMEAACQMEEAAAAJEwQAAJAwQQAAAAkTBAAAkDBBAAAACRMEAACQMEEAAAAJEwQAAJCwZIJg6NChkcvl4tlnn816FAAA2GwkEwQAAEBVggAAABJWo0GwaNGieO+992ryKb60mTNnRnl5edZjAABAJjZ5EKxYsSJGjhwZvXr1ik6dOsWsWbMqrV+2bFlcdNFFsf3220dhYWG0aNEijjvuuHjllVeqPFbnzp2jc+fO8cknn8SFF14Ybdu2jcLCwthtt93iwQcfXO/zL1q0KE466aRo1qxZbLnllnHwwQfHlClTqp13wIAB0bFjx7j00kvj1Vdf/XLfPAAAfMVskiBYu3ZtTJo0KU455ZRo06ZNnHHGGfHiiy/GoEGDolu3bhXbvfPOO7HnnnvGrbfeGtttt12cf/75ccQRR8SkSZNi3333jRkzZlR57LKysjj00EPjySefjOOOOy5OPfXUeOedd2LAgAHx5JNPVtr2/fffj/322y/uv//+2GeffeKCCy6IZs2axSGHHBLTp09f7+w//vGPY+utt44bbrghdtlll+jWrVvceuutsXTp0k3x0gAAwGYtl8/n81/0znPmzIlRo0bFfffdF0uWLIkGDRrEoYceGgMHDoy+fftG48aNK22///77x4wZM2LChAnRp0+fiuVvvvlm7LXXXtG5c+f429/+VrG8c+fOsXDhwujXr1888MAD0bBhw4iIePrpp6N3797Rp0+fmDRpUsX2p59+etx9991x7bXXxs9+9rOK5X/4wx/inHPOiYiIZ555Jnr06FHle3n55ZfjnnvuiTFjxsTixYujfv36Fd9Lv379qnwv1SktLY3S0tKK2yUlJdGhQ4foEf2ifq7BRj0GwCaVy2U9QdJy////XWTjjVt2z3qE5H1z50VZj5CsspWfxp+P+H0UFxdHkyZNqt3ucwfB4sWL47777otRo0bF3//+94iI6N69e5x66qlx4oknRosWLdZ7v5deeim6desWZ555Zvzxj3+ssv7iiy+Om2++Of7+97/HLrvsEhH/FwTz5s2LLl26VNq+c+fOsWLFivjoo48iIuLTTz+NoqKiaNKkSSxcuDAaNWpUsW15eXnstNNO8dZbb1UbBP+57V/+8pcY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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "translate(u'hace mucho frio aqui.')" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T22:02:57.685605Z", "iopub.status.busy": "2022-12-14T22:02:57.685275Z", "iopub.status.idle": "2022-12-14T22:02:57.990492Z", "shell.execute_reply": "2022-12-14T22:02:57.989762Z" }, "id": "zSx2iM36EZQZ" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Input: esta es mi vida . \n", "Predicted translation: this is my life . \n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/tmpfs/tmp/ipykernel_690249/2919660472.py:9: UserWarning: FixedFormatter should only be used together with FixedLocator\n", " ax.set_xticklabels([''] + sentence, fontdict=fontdict, rotation=90)\n", "/tmpfs/tmp/ipykernel_690249/2919660472.py:10: UserWarning: FixedFormatter should only be used together with FixedLocator\n", " ax.set_yticklabels([''] + predicted_sentence, fontdict=fontdict)\n" ] }, { "data": { "image/png": "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+GFccsklce+998bAgQMTp1y3nFNGnY0fPz7OOOOMeOWVV1a5ngt9AADwSW+88Ubstdde8dZbb8Vmm20Wu+22W2y22WYxd+7ceOKJJ2Lu3LnRqVOnmDRpUnTu3Dl73HVClFEnDz30UOy3337RoUOHOOKII+LKK6+MXr16xbbbbhuPPPJIPPfcc3HooYfGrrvuGuecc072uAAArIdmz54dP/jBD+Lmm2+ORYsW1Sxv2bJlHHXUUXHRRRdFhw4dEidct0QZdXLggQfG5MmT46WXXor27dtHSUlJVFRUxNlnnx0RERdeeGGcf/758eijj8ZOO+2UOywArKY33ngjHnzwwZUelu/7N2HtWLx4cbz00ksxf/78KC8vj2222aZJnUu2jCijTtq2bRv9+vWLUaNGRcRH31t29tlnR0VFRc06X/nKV6JNmzbxl7/8JWdIVrBgwYL45S9/Gffff/8qP3BMmzYtYTqAXGeccUZcfvnlyx12XywWa747admfHZYPrC2uvkidvP/++7H55pvX3C8tLY3Kysrl1tlrr73i0UcfXdejsRJvv/127LLLLvHDH/4wnnzyyXjppZfi3//+d8yZMydmzJgRM2bMiA8//DCqq6uzRwVY566++uq45JJLok+fPnHrrbdGsViM4447LsaOHRsnnXRSNG/ePAYMGBB/+9vfskcFGjFRRp106NAh3n777Zr7m2++eTz33HPLrfPOO+/4beJ6pKKiIqZNmxbXX399/Pvf/46IiNNOOy0WLlwYU6ZMiT322CO6d+++wnYEaAp+97vfRffu3ePuu++Oww8/PCIiunfvHgMHDoxf/epX8de//jX+/Oc/L/dvH/DZ3X///XHwwQdHu3btokWLFtGsWbMVbs2bN50LxTedd8oaseOOO8Y///nPmvt9+vSJ6667LsaOHRuHHXZYPPLII3HzzTfHrrvumjglH3fXXXfFvvvuG4MGDVrhsd133z3uvvvu+OIXvxjnnntu/PSnP02YECDPiy++GIMHD46Skv/8nnrJkiU1f+7Vq1cccsghcfHFF8eRRx6ZMSI0OrfddlsMHDgwqquro1u3brHttts2qQCrTdN+99TZYYcdFt/+9rfjtddei27dusX//M//xG233bbcB/7mzZvH+eefnzglH/fWW2/FgAEDau43a9YsPvjgg5r7m2yySRx00EFx8803izKgSWrdunXNnzfaaKN45513lnv885//fNx///3reCpovM4777zYcMMN4/bbb4++fftmj7NecPgidXL88cfH+++/H926dYuIiC222CIef/zxOOmkk2L//fePE044IaZMmeKLo9cj5eXlsXjx4pr7m2yySbzxxhvLrVNWVhZz5sxZ16MBpNt8882X+//EHj16xJQpU5Zb55///GdstNFG63o0aLReeumlOProowXZx9hTxmfWo0eP+NWvfpU9Biux5ZZbxowZM2ru77zzznHffffFO++8E23bto0PPvggxo8fH127ds0bEiDJ3nvvHQ8//HDN/f79+8f5558fJ554Ys1h+XfffXccccQRiVNC49K2bdv43Oc+lz3GesWeMurk+OOP/9RL3d9xxx1x/PHHr6OJ+DT7779/PPDAA/H+++9HRMSJJ54Yc+fOjR133DEGDBgQ22+/fUybNi2GDh2aOyhAgsGDB0ePHj3itddei4iPLo+/0047xdVXXx2HHXZY/PSnP41u3brFz3/+8+RJofE48sgj4/7771/u/M2mzveUUSef/LLo2vzkJz+Js88+2xUY1xNvvfVWTJw4Mfbdd9/YdNNNIyLikksuifPPPz/mz58fG264YQwfPjwuuuiiaNasWfK0APkWL14ct99+e0ybNi26desW/fr1c/girEELFy6M/fffPzp06BCXXnqpo3VClFFHqxNlZ511VvzsZz+r9QuKWX8sXbo0/vWvf8Vmm21W8wWpAABr25ZbbhmLFy+OWbNmRcRHF9spLy9fYb1CoRDTpk1b1+OlcPgidbayD/DFYjFef/31uPvuu6NTp07reCpWZuLEifH666+vsLxZs2bRvn37KBQKMXPmzJg4cWLCdABAU1NdXR3NmzePrl27RteuXaOsrCyKxeIKt+rq6uxR1xl7yvhUJSUlNSFWLBY/da9KsViM73//+3HhhReui/H4FM2aNYtzzjnHIacAEfU+57lQKMQ111yzhqcB+IirL/KpevbsWRNiEydOjK5du0b37t1XWK9Zs2bRpk2b6Nu3b5xwwgnreEpWZnV+71JdXe0QRqBJGDVqVK3LC4VCrf9/uWy5KAPWJlHGp3rooYdq/lxSUhLDhg1b5V4XGp5XXnml1mO5ARqb6dOnL3e/uro6RowYEZMnT44RI0bEPvvsE+3bt485c+bExIkT44orrogvfelLcemllyZNDI3b888/Hy+++GIsXLgwBg8enD1OGocvQiP08cNzRo0aFTvttFPstNNOK6y3dOnSmvPJDjrooBg/fvw6nBIg30UXXRSXXnppPP3009GxY8cVHn/zzTdj5513ju9973tx5plnJkwIjdPjjz8eJ5xwQjz77LM1y5adRjFx4sQ48MAD449//GMcdthhWSOuU6KMOquuro6SkuWvETNp0qS44447omXLljFs2LDo3Llz0nRExHLbZ2WH5Hz88d133z3GjBkTW2211boYD2C9sfXWW8eBBx4YV1555UrX+fa3vx333ntvvPLKK+twMmi8nnvuudhrr72ipKQkTjjhhHjxxRfj7rvvromyYrEY3bp1i169esXo0aOTp103HL5InZx22mlx1VVXxezZs6N169YREXHrrbfG0UcfXXOFnCuvvDKeeuopYZZo2eE5xWIxttxyyzj11FNjxIgRK6zXrFmz2GSTTXz/DtBkvfHGG9GyZctVrtOyZct444031tFE0Pidc845ERHx5JNPxlZbbRXnnntu3H333TWPFwqF+NKXvhSPP/541ojrnCijTh588MHo27dvTZBFRJx99tlRXl4el19+ecyePTtGjhwZF198cVx22WVpczZ13bp1q/nztddeGzvttNNyy4A147zzzotCoRAnn3xytGnTJs4777zVel6hUIizzjprLU/H6ujcuXP8+c9/jh//+Me1xtn7778ff/7zn/2iEdagCRMmxBFHHLHKI3S6du0a99xzzzqcKpcoo05mzpwZvXr1qrk/ffr0ePHFF+Occ86JQYMGRUTEww8/3KT+Eq3vjjvuuFqXF4vF+N///d9o2bJldOnSZR1PRX3ZbuuXioqKKBQKMXDgwGjTpk1UVFSs1vNE2frjm9/8ZowcOTL23nvvOPvss+MrX/lKtG3bNt555514+OGH47zzzosZM2b4mhdYgxYsWBCbbbbZKtf54IMPmtRX9Ygy6mThwoXLHeo2YcKEKBQKcdBBB9Us+8IXvhAPPPBAxnjU4k9/+lOMGzcuLr/88thkk00iImLGjBnRr1+/eP755yMiYsCAAXHDDTdEs2bNMkflY2y3huHBBx+MiI9+o/vx+zQcZ5xxRrz88stx7bXXxte//vWI+Oi83GWH5BeLxRg2bFicccYZmWNCo9KlS5flLvBRm6eeeip69OixjibKJ8qok06dOsVLL71Uc/+ee+6JjTfeOHbdddeaZZWVlVFaWpoxHrW46qqrYs6cOTUf7CM+Ojfwueeei759+8Y777wTt9xyS+y7776+X249Yrs1DB8/cqC2+6z/SkpK4pprrokhQ4bEddddF//4xz9i/vz5UV5eHjvuuGMMHjw4evfunT0mNCqHHnpoXHHFFXH//ffHfvvtt8LjN998c0yePLlJHVHg6ovUybBhw2Ls2LFx8cUXR8uWLWP48OHxta99LW6++eaadQ488MB466234plnnkmclGU233zzOOigg+L3v/99RHx0yEDbtm3jiCOOiLFjx8bixYtj5513jlatWsWkSZOSp2UZ261hW7p0abzxxhsxa9asWLx4ca3r9OzZcx1PBbB+ePvtt2OXXXaJOXPmxHHHHRezZ8+Ou+66K6688sqYNGlSjB07Nrp27RpTp05tMt+jak8ZdfLDH/4wxo0bFyNGjIhisRgbbbTRcudQLFiwICZOnBhDhw5Nm5HlzZs3Lzp06FBz/5FHHoklS5bEMcccExERLVq0iK9+9atxww03ZI1ILWy3hqm6ujouuOCCuPzyy2PevHmrXLcpnSsB8HHt2rWLCRMmxODBg+Oaa66pWf7tb387IiL23HPPGDt2bJMJsghRRh1ttdVW8fzzz8dtt90WERH9+vVb7qp+r7zySpx44onxjW98I2tEPqGsrCzeeeedmvsPPvhglJSUxD777FOzrEWLFrFw4cKM8VgJ261hGjlyZPz85z+PzTbbLIYNGxYdO3aM5s39U7s+ef311yPio73RzZo1q7m/OpadOwh8dltuuWU8+uij8fTTT8fkyZNj3rx5UVZWFnvuuWfsvvvu2eOtcw5fhEauV69eMW3atHjmmWeiWbNmsf3228fmm28eU6ZMqVln4MCB8fjjj8err76aOCkfZ7s1TB06dIhNNtkkHn/88dh4442zx6EWJSUlUSgU4oUXXohtttmm5v6nKRQKsWTJknUwIdAU+fUdq23WrFnxxBNPxC677LLS72t5/PHHY/bs2XHooYeu1j9yrH3f+c53YsCAAdG5c+eaPSvnn3/+cutMnjw5dtlll6QJqY3t1jC99957MWjQIEG2HhsyZEgUCoWaw6KW3QfWDZ8nayfKWG3V1dVx+OGHx7Bhw2ouPvBxS5cujX79+kXXrl2jX79+CRNSmyOOOCJ+9atfxe9///soFApx9NFHL3fO34QJE6KysjIOPPDAvCFZge3WMO2www4xa9as7DFYhVGjRq3yPrB2+TxZO4cvUid9+/aNqVOnxuzZs1e47P0999wTBx98cFx++eVxyimnJE0IkOfOO++MAQMGxCOPPGIvZgOxzz77xJAhQ2LAgAHRunXr7HGgSfB5ckUl2QPQsAwZMiQqKytj/PjxKzx2ww03RIsWLVzkYz20ZMmSuPTSS2OPPfaIsrKy5S488PTTT8fw4cPj5ZdfTpyQ2thuDc8hhxwSo0aNioMOOihOOOGE+OUvfxnXX399rTfWD5MnT46TTjopOnbsGEceeWTcfvvtK/0aA2DN8HlyRfaUUSfvvfdedOjQIfbdd9+4/fbba5a///770b59++jTp0/85S9/SZyQT/rggw9i//33j0cffTTatWsXLVq0iLfeeqvmctzz58+PDh06xHe/+90Vzlkij+3WMFVVVcU3v/nNuPHGG2PZP6+fPB+iWCxGoVBwSfz1xNtvvx033nhjjB49Op566qkoFAqxySabxMCBA+PYY4+NL3/5y9kjQqPj8+SK7CmjTjbeeOPo379/3Hvvvct9B8/tt98e77//fgwZMiRxOmpzwQUXxKOPPhoXXXRRzJ49O775zW8u93h5eXn06tUr7r333qQJqY3t1jCdfvrpccMNN8QXv/jFOO+88+Lqq6+OP/zhD8vdrr322vjDH/6QPSr/p127djFixIh44okn4vnnn48f/OAH0apVq7jqqqtin332ia222irOPffc+N///d/sUaHR8HlyRfaUUWfLjvX91a9+Fd/61rci4qNDdiZNmhSzZ8+ODTbYIHlCPm6bbbaJLl26xAMPPBAREeeee26cd955y/2Wfvjw4XHbbbfFnDlzssbkE2y3hmmzzTaLbt26xaRJk3w/WQM3YcKEGDNmTNx6661RWVnpkviwhvk8uTx7yqiz/fffPzp06BCjR4+OiIh//etfcd9998WAAQOa3F+ghuD111+P3XbbbZXrtGrVKubPn7+OJmJ12G4N06JFi6JPnz6CrBHo1atXjBw5Mk466aRo3rx5+B02rFk+Ty7PvxrUWUlJSRxzzDFx2WWXxauvvhp33313LF26NAYPHpw9GrVo1apVzJ07d5XrTJs2Ldq1a7eOJmJ12G4N06677uowtwZu3rx5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u2106tQp/vjHP0ZpaWl07tw5CoVCnHLKKWvk548ePTp++9vfRs+ePaNHjx5RVlYWzz//fNx1113Rpk2bGDZs2Bp5HQAAgAYZZc2aNYs//elP8f3vfz/Gjh0bCxYsiIiIQYMGrZGff8wxx8SiRYvi0Ucfjb///e9RVVUVnTt3jm9961txxhlnRNeuXdfI6wAAABSKxWIxe4jGrLKyMsrLy6N39I/mhRbZ4wAA0BAVCtkTUEdLiovjoeK4mD9//qdekb1BnlMGAADQWIgyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgETNswdoKpp9vkc0a1aaPQZ1UGzRLHsE6uHQPz6aPQL1cOeXt8wegXpYWvle9gjUR7E6ewLqo1jMnoC6qsM2s6cMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEomy/zNjxowoFAoxdOjQ7FEAAIAmRJQBAAAkap49wPpi8803jxdeeCHKy8uzRwEAAJoQUfZ/WrRoEdtuu232GAAAQBPj8MX/U9s5ZW+99VaMGDEitt5669hwww2jdevWsd1228VJJ50U8+fPzxsWAABoNOwpW4n3338/9t5775gxY0bsv//+cfjhh8eHH34Y06dPj9GjR8f3vvc9hzoCAACfmShbiQceeCCmT58ep556alx66aXLPfbee+9FixYtan1eVVVVVFVV1dyvrKxcq3MCAAANm8MXP8WGG264wrKNN944SktLa13/wgsvjPLy8ppbly5d1vaIAABAAybKVqJnz57RsWPHuOiii+KQQw6Jq666Kp5//vkoFourfN7IkSNj/vz5NbeZM2euo4kBAICGSJStRHl5eUyePDmGDBkSkydPjuHDh8d//dd/Rbdu3eLXv/71Sp9XWloaZWVly90AAABWRpStQteuXWPUqFHx9ttvx9SpU+OnP/1pVFdXx8knnxxjx47NHg8AAGgERNlqKCkpiZ122inOPPPMmhj7y1/+kjwVAADQGIiylXjuuedizpw5Kyxftqxly5breiQAAKARckn8lbjvvvvijDPOiL333ju22WabaNu2bbz66qvxl7/8JVq2bBknn3xy9ogAAEAjIMpW4oADDogZM2bExIkT409/+lO89957sfnmm8fAgQPjzDPPjC984QvZIwIAAI2AKPs/3bt3X+5y99ttt11cdtlleQMBAABNgnPKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgETNswdoKpa+MiMKhRbZY1AXxersCaiH8cf2zB6Beij587+zR6AeCqd3zh6Bemj27wXZI1APS9+cnT0CdVQoFiIWr9669pQBAAAkEmUAAACJRBkAAEAiUQYAAJBIlAEAACQSZQAAAIlEGQAAQCJRBgAAkEiUAQAAJBJlAAAAiUQZAABAIlEGAACQSJQBAAAkEmUAAACJRBkAAEAiUQYAAJBIlAEAACQSZQAAAIlEGQAAQCJRBgAAkEiUAQAAJBJlAAAAiUQZAABAIlEGAACQSJQBAAAkEmUAAACJRBkAAEAiUQYAAJBIlAEAACQSZQAAAIlEGQAAQCJRBgAAkEiUAQAAJBJlAAAAiUQZAABAIlEGAACQSJQBAAAkEmUAAACJRBkAAEAiUQYAAJBIlAEAACQSZQAAAIlEGQAAQCJRBgAAkEiUAQAAJBJlAAAAiUQZAABAIlEGAACQSJQBAAAkEmUAAACJRBkAAECiRhVlDz30UBQKhaioqIjHHnss+vTpE61atYp27drF8OHD44MPPoiIiDvvvDO+9KUvxUYbbRTt27ePM888M5YsWRIREb///e+jUCjEz372s1pf429/+1sUCoU48cQT19n7AgAAGq9GFWXLTJkyJfbdd98oLy+PE088Mbp27RpXXXVVnHDCCXHTTTfFkUceGd26dYsTTzwxWrduHT//+c/jggsuiIiIY445JsrKyuKaa66p9WdfffXVERFxwgknrLP3AwAANF6FYrFYzB5iTXnooYeiT58+ERExbty46N+/f0RELF68OHbbbbd49tlno23btnHXXXfF7rvvHhERCxYsiK222iqWLFkSs2fPjhYtWsTw4cPjqquuioceeih69epV8/PnzZsXnTp1iu222y6mTp1a6wxVVVVRVVVVc7+ysjK6dOkSvUu+Hs0LLdbWW2dtKFZnT0A9FHb6QvYI1EPJL/6dPQL1UH36JtkjUA/N/r0gewTqYembs7NHoI6WFBfHg4tvifnz50dZWdkq122Ue8r69OlTE2QRES1atIgjjzwyisVi9OvXrybIIiJatWoVhx56aMybNy/eeOONiIg46aSTIuKjQxk/bvTo0VFVVbXKvWQXXnhhlJeX19y6dOmyJt8aAADQyDTKKNtpp51WWNaxY8dPfWzWrFkREbHDDjvEXnvtFbfeemu8++67Netdc8018bnPfS6OPfbYlb72yJEjY/78+TW3mTNn1v+NAAAAjV6jjLLadg82b978Ux9bvHhxzbITTzwxFi1aFGPGjImIj85Te/bZZ2PAgAFRXl6+0tcuLS2NsrKy5W4AAAAr0yijbE0YOHBgtG7duuYQxmX/dYEPAABgTRJlK7HhhhvGkCFD4plnnokHH3wwbrrppthuu+1i7733zh4NAABoRETZKiz7LrJBgwbFggUL7CUDAADWOFG2Cl/4whdin332iVmzZkVpaWkMGTIkeyQAAKCREWWf4rjjjouIiMMPPzzatm2bPA0AANDYNM8eYE3q3bt3rOy7sIcOHRpDhw6t9bGKioqoqKio9bFlXxLt0EUAAGBtsKdsFd5+++247rrr4vOf/3z06dMnexwAAKARalR7ytaUO++8M5566qm49dZb47333ouKioooFArZYwEAAI2QKKvFLbfcEtddd1106tQpLrjggjj66KOzRwIAABopUVaLUaNGxahRo7LHAAAAmgDnlAEAACQSZQAAAIlEGQAAQCJRBgAAkEiUAQAAJBJlAAAAiUQZAABAIlEGAACQSJQBAAAkEmUAAACJRBkAAEAiUQYAAJBIlAEAACQSZQAAAIlEGQAAQCJRBgAAkEiUAQAAJBJlAAAAiUQZAABAIlEGAACQSJQBAAAkEmUAAACJRBkAAEAiUQYAAJBIlAEAACQSZQAAAIlEGQAAQCJRBgAAkEiUAQAAJBJlAAAAiUQZAABAIlEGAACQSJQBAAAkEmUAAACJRBkAAEAiUQYAAJBIlAEAACQSZQAAAIlEGQAAQCJRBgAAkEiUAQAAJBJlAAAAiZpnD9BkVC+NKGhgWNuKU5/LHoF6KB7UMnsE6qFqfIvsEaiHORM7Z49APXS9cFb2CNRVsXq1V1UJAAAAiUQZAABAIlEGAACQSJQBAAAkEmUAAACJRBkAAEAiUQYAAJBIlAEAACQSZQAAAIlEGQAAQCJRBgAAkEiUAQAAJBJlAAAAiUQZAABAIlEGAACQSJQBAAAkEmUAAACJRBkAAEAiUQYAAJBIlAEAACQSZQAAAIlEGQAAQCJRBgAAkEiUAQAAJBJlAAAAiUQZAABAIlEGAACQSJQBAAAkEmUAAACJRBkAAEAiUQYAAJBIlAEAACQSZQAAAIlEGQAAQCJRBgAAkEiUAQAAJBJlAAAAiUQZAABAIlEGAACQSJQBAAAkEmUAAACJRBkAAEAiUQYAAJBIlAEAACQSZQAAAIlEGQAAQCJRBgAAkKhRRdmMGTOiUCjE0KFDa5YNHTo0CoVCzJgxY7l1Fy9eHBUVFbH11ltHaWlpFAqFGDdu3DqdFwAAoHn2AFkuueSSOPfcc6Nnz55x1FFHRYsWLWLbbbfNHgsAAGhiGn2UXXjhhfGDH/wgNt988+WW33HHHbHxxhvHfffdFxtssEHSdAAAQFPX6KOsY8eO0bFjxxWWz5o1K9q2bSvIAACAVI3qnLLafPKcsoqKiigUCjF9+vR47bXXolAoRKFQiO7duy/3vIkTJ0a/fv1i0003jdLS0th6663jRz/6Ubz//vvr/k0AAACNVqPfU/ZJvXv3joiIyy67LCIiTj311IiIaN26dc06V111VZx88snRunXr6NevX2y22WbxxBNPxE9+8pN48MEH48EHH7SHDQAAWCOaZJT17t07Ro0aFREf7Tn7uOeffz6+853vxA477BAPPPBAtG3btuaxiy66KEaOHBlXXnllfPe7363151dVVUVVVVXN/crKyjX+HgAAgMaj0R++WFe//e1vY8mSJXHllVcuF2QREWeeeWa0a9cuxo4du9LnX3jhhVFeXl5z69Kly9oeGQAAaMCa3J6yTzN58uSIiLj33nvjgQceWOHxFi1axIsvvrjS548cOTJOP/30mvuVlZXCDAAAWClR9gnz5s2LiIif/OQn9Xp+aWlplJaWrsmRAACARszhi59QVlYWER/t4SoWiyu9AQAArAmi7BP23HPPiPjPYYwAAABrkyj7hOHDh0fz5s3jlFNOiddff32Fx999992YOnVqwmQAAEBj5JyyT9h+++3j17/+dXzrW9+Kz3/+83HwwQdHjx49YsGCBfHqq6/GhAkTYujQofGb3/wme1QAAKAREGW1OOGEE2KnnXaKX/ziFzFx4sQYP358lJeXR9euXeO0006L4447LntEAACgkSgUXbViraqsrIzy8vLoHf2jeaFF9jgA66WSli2zR6AeFo1vnz0C9TBn4ubZI1APXS/8e/YI1NGS4uJ4cMltMX/+/JqLCa6Mc8oAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARM2zBwCA6kWLskegHlp+fV72CNTD8y/dnj0C9XDwH7+ePQJ1VLK0KmLaaq67dkcBAABgVUQZAABAIlEGAACQSJQBAAAkEmUAAACJRBkAAEAiUQYAAJBIlAEAACQSZQAAAIlEGQAAQCJRBgAAkEiUAQAAJBJlAAAAiUQZAABAIlEGAACQSJQBAAAkEmUAAACJRBkAAEAiUQYAAJBIlAEAACQSZQAAAIlEGQAAQCJRBgAAkEiUAQAAJBJlAAAAiUQZAABAIlEGAACQSJQBAAAkEmUAAACJRBkAAEAiUQYAAJBIlAEAACQSZQAAAIlEGQAAQCJRBgAAkEiUAQAAJBJlAAAAiUQZAABAIlEGAACQSJQBAAAkEmUAAACJRBkAAEAiUQYAAJBIlAEAACQSZQAAAIlEGQAAQCJRBgAAkEiUAQAAJBJlAAAAiUQZAABAIlEGAACQSJQBAAAkEmUAAACJmmcP0NhUVVVFVVVVzf3KysrEaQAAgPWdPWVr2IUXXhjl5eU1ty5dumSPBAAArMdE2Ro2cuTImD9/fs1t5syZ2SMBAADrMYcvrmGlpaVRWlqaPQYAANBA2FMGAACQSJQBAAAkEmV1MG3atHjxxRdj8eLF2aMAAACNhCirg3333Te22267ePPNN7NHAQAAGglRBgAAkMjVF+tgxowZ2SMAAACNjD1lAAAAiUQZAABAIlEGAACQSJQBAAAkEmUAAACJRBkAAEAiUQYAAJBIlAEAACQSZQAAAIlEGQAAQCJRBgAAkEiUAQAAJBJlAAAAiUQZAABAIlEGAACQSJQBAAAkEmUAAACJRBkAAEAiUQYAAJBIlAEAACQSZQAAAIlEGQAAQCJRBgAAkEiUAQAAJBJlAAAAiUQZAABAIlEGAACQSJQBAAAkEmUAAACJRBkAAEAiUQYAAJBIlAEAACQSZQAAAIlEGQAAQCJRBgAAkEiUAQAAJBJlAAAAiUQZAABAIlEGAACQSJQBAAAkEmUAAACJRBkAAEAiUQYAAJBIlAEAACQSZQAAAIlEGQAAQKLm2QMAAA1TcVFV9gjUwx7/863sEaiHDr+fnj0CdVRc+GHEQau3rj1lAAAAiUQZAABAIlEGAACQSJQBAAAkEmUAAACJRBkAAEAiUQYAAJBIlAEAACQSZQAAAIlEGQAAQCJRBgAAkEiUAQAAJBJlAAAAiUQZAABAIlEGAACQSJQBAAAkEmUAAACJRBkAAEAiUQYAAJBIlAEAACQSZQAAAIlEGQAAQCJRBgAAkEiUAQAAJBJlAAAAiUQZAABAIlEGAACQSJQBAAAkEmUAAACJRBkAAEAiUQYAAJBIlAEAACQSZQAAAIlEGQAAQCJRBgAAkEiUAQAAJBJlAAAAiUQZAABAIlEGAACQSJQBAAAkEmUAAACJRBkAAEAiUQYAAJBIlAEAACQSZQAAAIlEGQAAQCJRBgAAkKjJRFlFRUUUCoV46KGHskcBAACo0WSiDAAAYH0kygAAABKt1SibOXNmvPnmm2vzJT6zv//971FdXZ09BgAA0ESt8ShbsGBBjBo1Kvr27RvdunWLxx9/fLnH586dG6eddlpstdVWUVpaGptuumkcccQR8c9//nOFn9W9e/fo3r17vPfeezFixIjo1KlTlJaWxg477BC33nprra8/c+bMOOaYY6JNmzax8cYbR69evWLixIkrnfeoo46Krl27xve///147rnnPtubBwAAqKM1EmVLly6Ne+65J4499tjo0KFDDBs2LJ588sk47rjjYpdddqlZb9q0abHrrrvGZZddFj169IhTTjklDj744Ljnnntir732iilTpqzwsxcvXhz7779//PWvf40jjjgiBg0aFNOmTYujjjoq/vrXvy637ltvvRVf+tKX4o9//GPsscce8Z3vfCfatGkTX/3qV2Py5Mm1zv69730vNtlkk/jZz34W22+/feyyyy5x2WWXxZw5c9bE/zQAAACrVCgWi8X6PvmZZ56J66+/Pm688caYPXt2tGjRIvbff/8YPHhwHHbYYbHhhhsut/7ee+8dU6ZMiTvvvDMOOOCAmuUvv/xy7LbbbtG9e/f4xz/+UbO8e/fu8dprr0X//v3j5ptvjg022CAiIh544IHYb7/94oADDoh77rmnZv2hQ4fGddddF+eff3788Ic/rFn+u9/9Lk488cSIiHjwwQejd+/eK7yXp59+OsaMGRNjx46NWbNmRfPmzWveS//+/Vd4LytTVVUVVVVVNfcrKyujS5cu0Tv6R/NCi9X6GQDQEBRabJA9AvUw79hds0egHjoMm549AnW0eOGH8deDfhfz58+PsrKyVa5b5yibNWtW3HjjjXH99dfHs88+GxERe+65ZwwaNCiOPvro2HTTTWt93tSpU2OXXXaJ448/Pq655poVHv/ud78bv/jFL+LZZ5+N7bffPiL+E2WvvvpqbLHFFsut371791iwYEG88847ERHx4YcfRnl5eZSVlcVrr70WLVu2rFm3uro6tt1223jllVdWGmUfX/dvf/tbjB49Ov785z/HggULoqysLI488sgYMmRI9OzZMwqFwkqfX1FREeeee+4Ky0UZAI2NKGuYRFnDJMoanrpEWfO6/vC99947ZsyYEZtttlmcc845MWjQoNhqq60+9XnLDh+cM2dOVFRUrPD4iy++WPPfZVEWEdG6desVgiwionPnzjFp0qSa+y+99FIsWrQo+vbtu1yQRUSUlJTE3nvvHa+88sqnzllSUhL77bdf7LfffvGb3/wmxo0bF7/73e/iD3/4Q/zhD3+IcePGRf/+/Vf6/JEjR8bpp59ec3/ZnjIAAIDa1DnKtt9++5gxY0bMnTs37rnnnth0001j4MCB0a5du1U+b968eRERceedd8add9650vUWLly43P3y8vJa12vevPlyV02cP39+RERsttlmta7fvn37Vc73SUuXLo2HH3447rnnnnjiiSciImLTTTeNDh06rPJ5paWlUVpaWqfXAgAAmq46X+hj/Pjx8fLLL8ePfvSjmDNnTpxyyinRqVOnOPjgg+PGG29cIaqWWbbL7sorr4xisbjS23HHHVevN7Is3ubOnVvr46t74Y4nn3wyTjvttOjcuXMccMABcdNNN8WBBx4Yt99+e8yaNSv23HPPes0HAABQm3pdfXHrrbeOH//4x/Hqq6/GhAkTYujQofHYY4/FscceG+3bt49BgwbF3XffHUuWLKl5zrKY+fghh2vSNttsEy1btownnngiFi1atNxj1dXV8dhjj630ua+++mr8+Mc/jm233TZ22223mqtD/va3v43Zs2fHLbfcEocddli0aOGcMAAAYM36TJfELxQK0bNnz7j66qtj9uzZcdNNN0Xv3r3jpptuioMPPjg233zzmsvc77HHHrHnnnvG2LFj46abblrhZ1VXV8eECRPqPUtpaWkcddRRMXfu3LjkkkuWe+z3v/99vPzyy7U+77DDDosePXrE2WefHUuXLo2KioqYNm1aPPLII/Hf//3f0bp163rPBAAA8GnqfE7ZyrRs2TKOOuqoOOqoo+Ltt9+OG2+8MUaPHh2zZ8+uWWfs2LHRp0+fOProo+Oyyy6LXXbZJTbccMN4/fXXY9KkSfH222+vsJerLi666KJ44IEH4kc/+lE88sgjsfPOO8cLL7wQd911V813nX3Sm2++GSeddFIMHjw4vvzlL9f7tQEAAOpjjUXZx7Vr1y5GjBgRI0aMiKVLl9Ys32KLLWLq1Knxi1/8IsaNGxfXXnttNGvWLDp27Bg9e/aMI4888jO9bseOHeOxxx6LM888M+69996YOHFi7LrrrnHffffF3/72t1qj7O9//3s0a9bsM70uAABAfX2mL4/m01VWVkZ5ebnvKQOg0fE9ZQ2T7ylrmHxPWcNTl+8p+0znlAEAAPDZiDIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARM2zBwAAGqbi4g+zR6AeNhk1KXsE6qFqVPYE1NWS4uLVXteeMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARM2zB2hsqqqqoqqqquZ+ZWVl4jQAAMD6zp6yNezCCy+M8vLymluXLl2yRwIAANZjhWKxWMweojGpbU9Zly5donf0j+aFFomTAQAA68qS4uJ4KG6P+fPnR1lZ2SrXdfjiGlZaWhqlpaXZYwAAAA2EwxcBAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACCRKAMAAEgkygAAABKJMgAAgESiDAAAIJEoAwAASCTKAAAAEokyAACARKIMAAAgkSgDAABIJMoAAAASiTIAAIBEogwAACBR8+wBGrtisRgREUticUQxeRgAAGCdWBKLI+I/PbAqomwtW7BgQUREPBJ3JU8CAACsawsWLIjy8vJVrlMork66UW/V1dUxa9asaNWqVRQKhexx1qjKysro0qVLzJw5M8rKyrLHYTXZbg2T7dYw2W4Nk+3WMNluDVNj3m7FYjEWLFgQnTp1ipKSVZ81Zk/ZWlZSUhKdO3fOHmOtKisra3R/iZoC261hst0aJtutYbLdGibbrWFqrNvt0/aQLeNCHwAAAIlEGQAAQCJRRr2VlpbGOeecE6WlpdmjUAe2W8NkuzVMtlvDZLs1TLZbw2S7fcSFPgAAABLZUwYAAJBIlAEAACQSZQAAAIlEGQAAQCJRBgAAkEiUAQAAJBJlAAAAiUQZAABAov8PnYz/N+dJB5MAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "translate(u'esta es mi vida.')" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T22:02:57.994346Z", "iopub.status.busy": "2022-12-14T22:02:57.993619Z", "iopub.status.idle": "2022-12-14T22:02:58.330362Z", "shell.execute_reply": "2022-12-14T22:02:58.329692Z" }, "id": "A3LLCx3ZE0Ls" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Input: ¿ todavia estan en casa ? \n", "Predicted translation: are you still at home ? \n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/tmpfs/tmp/ipykernel_690249/2919660472.py:9: UserWarning: FixedFormatter should only be used together with FixedLocator\n", " ax.set_xticklabels([''] + sentence, fontdict=fontdict, rotation=90)\n", "/tmpfs/tmp/ipykernel_690249/2919660472.py:10: UserWarning: FixedFormatter should only be used together with FixedLocator\n", " ax.set_yticklabels([''] + predicted_sentence, fontdict=fontdict)\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA2UAAANyCAYAAADipWNwAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABUDElEQVR4nO3deZzVdd3//+cMILjACMiqCGIWmisu4JKCIpaZ+564ZppX5ZJ9uywXNL2wPZcuu7KM1NwtlBTXBNxQcCE1t1CURAS3GQJlPb8/vDm/pkE0Y+YtM/f77XZuej7nM2de5zOg5zGf5VRVKpVKAAAAKKK69AAAAACtmSgDAAAoSJQBAAAUJMoAAAAKEmUAAAAFiTIAAICCRBkAAEBBogwAAKAgUQYAAFCQKAMAAChIlAEAABQkygAAAAoSZQAAAAWJMgAAgIJEGR9q7ty5effdd0uPAQAALZIoY7meffbZrLnmmtlyyy1LjwIAAC2SKGO5rrjiilQqlTzzzDOZMmVK6XEAAKDFEWUs15VXXpkNNtgg1dXVueKKK0qPAwAALY4o4wNNmDAhM2bMyAknnJBhw4blmmuuyZIlS0qPBU1qxowZOe6447L++utn1VVXTZs2bRrd2rZtW3pMAKAF8c6CD3T55ZenTZs2OfTQQ9OlS5fccccdGTduXPbYY4/So0GTeOGFFzJo0KC89dZb+exnP5sFCxakb9++6dChQ1544YUsWrQom222WdZcc83SowIALYg9ZSzTu+++mxtuuCHDhg1Lt27dsu+++2bVVVd1CCMt2tlnn53a2trcfffdmTp1apLkqKOOytNPP53p06dnzz33zLx583LDDTcUnhQAaElEGcs0ZsyYzJ07N4cddliSZPXVV8+ee+6ZsWPHpra2tvB00DTuuuuu7L777tlpp53ql1UqlSRJr169cu211yZJvvvd7xaZDwBomUQZy3T55ZenY8eO2WeffeqXHXbYYXn33Xdz/fXXF5wMms7rr7+eAQMG1N9v27Zt5s+fX3+/ffv22XXXXfOnP/2pxHgAQAslymjktddey5133pm99947q666av3y3XbbLd26dcvll19ecDpoOmuttVbmzZvX4P706dMbrNO2bdu8/fbbzTsYALRSY8eOzeTJk0uP0eREGY1cddVVWbp0af2hi+9r06ZNDjzwwNx///158cUXC00HTWeDDTbItGnT6u9vs802uf322/PCCy8kSebMmZMbbrgh66+/fqkRAaDVmDhxYvbaa6986UtfavFXABdlNHLFFVekV69eGTZsWKPHvvzlL6dSqeTKK68sMBk0rS984Qu555576veEnXTSSZk7d2423XTTbL311vn0pz+dWbNm5Rvf+EbZQQGgFXj/6Kw5c+Zk3LhxhadpWqKMBp588sk8/vjjOfjgg1NVVdXo8cGDB6d///6uwkiL9LWvfS3jx49PmzZtkiRDhgzJNddck759++bJJ59Mjx49cuGFF+bYY48tPCkAtGzvXwl8yJAhWX311Vv8e8+qyvuXFoMk8+bNy+uvv55u3bpltdVWW+Y6r7/+eubNm5e+ffs283QAALQG1157bQ499ND8/ve/z7hx43L99ddn1qxZ6dSpU+nRmoQ9ZTSw+uqrp2/fvh8YZMl7Fz8QZAAANJUrrrii/krgX/7yl1v8FcBFGY1MnDgxL7/88nLXmTFjRiZOnNhMEwEA0FrMnj07d9xxR/bZZ5+0b98+w4YNS8+ePVv0FcBFGY0MHTo0o0ePXu46l19+eYYOHdo8A0ETqa6uTtu2bfPcc8/V32/Tps2H3tq2bVt4cgBoua6++uosWbIkI0aMSPLe/58POuig3HfffY0+qqal8M6CRj7KaYZLly5d5oVAYGWy4447pqqqqv5w3ffvAwDlXH755endu3d23nnn+mUjRozIBRdckCuvvDKnn356wemahijjY3n++edTU1NTegz4j4wfP3659wGA5vXXv/41jz32WE499dQGywcOHJjPfOYzueKKK0QZLdfRRx/d4P6YMWOWuXt4yZIl9eeTfeELX2im6QAAaA0uv/zyVFVV5bDDDmv02KGHHpqRI0fmoYceyqBBgwpM13RcEp8k7x2r+76qqqrlHsJYVVWVrbfeOldeeWU+9alPNcd40CxGjBiRww8/PMOGDXMYIwA0s0qlknXXXTddunTJ1KlTGz3+4osvZv31188JJ5yQiy++uMCETceeMpK894c8ee8vQ//+/XPSSSflxBNPbLRemzZt0rlz56y++urNPSI0ud///ve56qqr0rNnzxxyyCE57LDDsvnmm5ceCwBahSlTpqRt27Y57rjjlvn4euutlz322CMPPfRQKpVKi/oFqj1lNPK73/0uW2yxRTbddNPSo0Czeuyxx3L55ZfnmmuuyWuvvZaqqqpstNFGOfzww3PooYdm7bXXLj0iANACiTIaqa6uziGHHJLf//73pUeBIpYuXZrbb789V155ZW666abMnz8/1dXVGTJkSEaMGJH99tsva6yxRukxW7TFixfn2Wefzdtvv50lS5Ysc50dd9yxmacCgKYhymikc+fOOe6443L++eeXHgWKmzdvXm644YZceeWVueeee1KpVLLqqqvmH//4R+nRWqRKpZIzzzwzF110UebOnbvcdT8o1gBgZSPKaGT48OFp06ZNxo0bV3oU+MT4xz/+kQsvvDBnn312Fi9eLAiayDnnnJORI0dmzTXXzF577ZV11lnnAz+s+6yzzmrm6QBY0SZOnPixv7YlHTEhymjkwQcfzJAhQ3LppZfm8MMPLz0OFPOvhzG+8847qaqqyi677JLbb7+99HgtUr9+/VJVVZUpU6aka9eupccBoIlVV1d/7At2tKRfkLr6Io3ceeedGTJkSI466qhcdNFF2XrrrdOjR49Gf2GqqqpyxhlnFJoSms6UKVNy5ZVX5pprrsmcOXNSqVSyySabZMSIETn00EPTu3fv0iO2WLNmzcrXvvY1QQbQSpx55pmN3mNOmjQpt99+ezbYYINsv/326dGjR1577bU88MADee6557Lbbrtl8ODBhSZuGvaU0cg/f2bZ8lRVVbWo31DAueeem9///vd57rnnUqlU0qtXrxx66KEZMWKEq5E2kw033DDbbbddfvOb35QeBYAC7r333uy66665+OKLc8wxxzQItkqlkksvvTQnnnhi7rzzzuywww4FJ12xRBmNTJgw4SOvu9NOOzXhJNC8qqurs/rqq2efffbJiBEjsssuu3zkX1KwYlx44YU577zz8sQTT6R79+6lxwGgmQ0ZMiRdu3bNjTfe+IHr7Lvvvnnrrbdyzz33NONkTcvhizQitGitLr/88uy7775ZbbXVSo/Sau2111659957s9122+XMM8/MwIED06lTp2Wuu+666zbzdAA0tUceeSQnnnjictfZcMMNc+GFFzbTRM3DnjIAPjHeP+G7Uqks98TvqqqqLF68uBknA6A5dO3aNYMHD84tt9zygevsvvvueeihh/LGG28042RNy54ylmvGjBmZOXNmFixYsMzHW9KlSOGfLVmyJK+//voH/tm3l6ZpHH744R/7KlwArPyGDx+e6667Lueff35OOeWUrLLKKvWPLVy4MD/5yU9y++2356CDDio45YpnTxnLNHbs2Hz729/O888/v9z1XOiDluaRRx7Jd7/73UycODELFy5c5jr20gBNZe7cubn44otz1113feAvRauqqjJt2rQC00HT+/vf/57Bgwfn1VdfTffu3bPVVlule/fumT17dqZMmZLZs2end+/eefDBB7POOuuUHneFsaeMRsaPH5999tknPXv2zNe//vVcdNFF2WmnnTJgwIDcd999eeqpp7LHHntkyy23LD0qrFCPP/54Pve5z6Vt27YZPnx4xo4dm8022yw9e/bMo48+mjlz5mTIkCHp27dv6VGBFmjOnDnZbrvtMm3atHTq1Cl1dXWpqanJwoUL88477yRJevfunXbt2hWeFJrOOuuskylTpuS///u/c9111zU4jLFDhw4ZMWJEzj///PTs2bPglCuey4rRyPnnn5811lgjjzzySC644IIkydChQ3PJJZfkiSeeyHnnnZe77747e+21V+FJYcX6/ve/nyR56KGHctNNNyVJ9tlnn4wbNy7Tp0/P8ccfnyeffDJnnXVWyTGBFmrkyJGZNm1aLr/88rz11ltJkpNPPjnz5s3LQw89lG222Sb9+vXLU089VXhSaFo9e/bM6NGjU1tbm7/85S+5995785e//CVvv/12Ro8e3eKCLBFlLMPkyZOz9957p0ePHvXLli5dWv/vp512WrbYYouceeaZJcaDJnPfffdlzz33zIYbbli/7P0jvFddddVcfPHF6d27d7773e+WGrFVmDt3bkaNGpVddtklG264Yfr379/otv7665ceE1a4W2+9NbvssksOO+ywRudWbr311vW/IDr77LMLTQjNq127dtl4442z/fbbZ+ONN25wfllLI8poZP78+Vl77bXr77dv3z51dXUN1hk8eHDuv//+5h4NmlRtbW369+9ff79du3b5xz/+UX+/uro6Q4YMyd13311ivFZhzpw5GThwYL73ve/lkUceybPPPpu33norr732WqZPn57p06dn4cKFDX5RBC3Fq6++mi222KL+fps2beoPW0ySzp075wtf+EKuu+66EuMBTUiU0UjPnj0zZ86c+vtrr712o0Ml3njjDRf5oMXp3r17/SFDyXt/F/71Yjfvvvtu5s+f39yjtRoO36I1q6mpyaJFi+rvd+7cOX//+98brNOpU6e89tprzT0aNKu77roru+++e7p165Z27dqlTZs2jW5t27asS2O0rFfDCrHZZpvlySefrL8/dOjQ/O53v8vVV1+dPffcM/fdd1+uu+46F/qgxdloo43y7LPP1t/ffvvtM2bMmDz44IPZdttt8/TTT+e6667LgAEDCk7Zsv3z4Vv/6v3DtzbZZJOcffbZ+cEPflBgQmg6/fv3z/Tp0+vvb7HFFrnzzjvzxhtvpGvXrnnnnXcyduxYH8lBi3bjjTfmoIMOytKlS9O3b98MGDCgxQXYsthTRiN77rlnHn/88bz00ktJku9+97tZY401cthhh6VTp07Zfffds3jx4px77rmFJ4UV64tf/GImTpyYV199NUnyne98J5VKJTvssEO6deuWTTbZJG+//bZzypqQw7dozYYPH5677767fm/8cccdl9mzZ2ezzTbLAQcckI033jjTpk3LkUceWXZQaELnnHNOVl111dx111158cUXc++99+aee+5Z5q0lEWU0cvTRR2f+/Pn1l/1eb731Mnny5Bx//PEZPnx4jj322Dz00EM+OJoW5/jjj88rr7ySrl27Jnlvr/Hdd9+dz3/+81lrrbUybNiwjB07Nvvss0/hSVsuh2/Rmh1//PG59NJL66Ns3333zY9+9KPMmzcvN954Y2bNmpVTTjkl3/72twtPCk3n2WefzcEHH5ydd9659CjNyodHA/CJse2226Znz5754x//mCTZbbfdMnXq1Dz11FP1h29tttlmqa6uzjPPPFN4WmgeS5Ysyeuvv57u3bs3uiojtDRrr7129t9///qPZWot7CmjkaOPPjo333zzctf505/+lKOPPrqZJgJaC4dvQWNt2rRJjx49BBmtwv7775+77rorixcvLj1Ks7KnjEaqq6szcuTI5X4O2XnnnZczzzzTFRhZqU2cOPFjf63Dd5vGq6++mokTJ2aXXXbJWmutlST5yU9+knPPPTe1tbVZddVVc8IJJ+T8889PmzZtCk8LK9aMGTPy/PPPZ/DgwVlttdWSvPc5oT/60Y9y8803p0OHDjnllFPyxS9+sfCk0HTmzZuX4cOHp2fPnvnZz37Wai5sI8po5KNE2RlnnJEf/vCHWbBgQTNOBitWdXX1x/7Ns19INC+Hb9EaHHnkkRk7dmxmzZqVdu3aJUm+//3v56yzzqpfp02bNnnggQey9dZblxoTmlT//v2zaNGizJw5M0my5pprpqamptF6VVVVmTZtWnOP12Ra/vUl+Vg+6E1PpVLJjBkzMm7cuPTu3buZp4IV68wzz2z0Z33SpEm5/fbbs8EGG2T77bdPjx498tprr+WBBx7Ic889l9122y2DBw8uNHHLN3HixPTr16/Rb0bfP3wreW9vwosvvmhvJS3O/fffn2HDhtUHWaVSycUXX5wBAwbkjjvuyKxZszJs2LD86Ec/cgVSWqylS5embdu2Df4/sKx9SC1tv5I9ZSRpuMegUql86G+iK5VKvvOd72TUqFHNMR40i3vvvTe77rprLr744hxzzDEN/h5UKpVceumlOfHEE3PnnXdmhx12KDhpy9WmTZucddZZDp+mVaqpqclxxx2XH/7wh0mSxx57LFtuuWV+8Ytf5Gtf+1qS9/amTZgwIS+++GLJUYEVzJ4ykrx3fsz7b0AnTpyYddddN/369Wu0Xps2bdKlS5fsvPPOOfbYY5t5SmhaZ5xxRr74xS/mK1/5SqPHqqqq8tWvfjW33XZbzjjjjBb3+SifFB/l94RLly51CCMt0tKlS7N06dL6++PHj09VVVWDS4OvvfbamTVrVonxgCYkykjy3n/431ddXZ2jjjpqub+phpbokUceyYknnrjcdTbccMNceOGFzTQRy/L8888v8/wCWNmtu+66efjhh+vvjxkzJr169cpnPvOZ+mWzZs3KmmuuWWA6aH5//etf88wzz2TevHkZMWJE6XGalCijkX/+LR20Jqusskoee+yx5a7z2GOPZZVVVmmmiVqHf/14jTFjxmT69OmN1luyZElmzJiRiRMn5gtf+EIzTQfNZ7/99st5552X/fffPx06dMh9992Xr3/96w3W+etf/5r+/fsXmhCax+TJk3PsscfmiSeeqF/2fpRNnDgxn//853PNNddkzz33LDXiCuecMpZp6dKlqa5u+DF2Dz74YP70pz+lQ4cOOeqoo7LOOusUmg6axiGHHJLrrrsu5513Xk455ZQG8bVw4cL85Cc/yemnn56DDjooV111VcFJW5Z//m9NVVXVcg9hrKqqytZbb50rr7wyn/rUp5pjPGg2dXV1GT58eP3esk033TT33HNPOnfunCR56aWX0r9///z3f/93zjvvvJKjQpN56qmnMnjw4FRXV+fYY4/NM888k3HjxtWfR1ypVNK3b9/stNNOueKKKwpPu+KIMho5+eSTc8kllzQ4ROKGG27IwQcfXL8Xba211sqjjz4qzGhR/v73v2fw4MF59dVX071792y11Vbp3r17Zs+enSlTpmT27Nnp3bt3HnzwQX/2V6CXXnopyXv/o+3fv39OOumkZR5G2qZNm3Tu3Dmrr756c48IzerJJ59M8t7h0v/8eXwvvfRSHn/88Wy11VZZe+21S40HTWr//ffP7bffnsceeyyf+tSncvbZZ+ecc85pcHGngw46KFOnTs0zzzxTcNIVy+GLNHLPPfdk5513bnDM+plnnpmamppccMEFmTVrVk477bT8+Mc/zs9//vNic8KKts4662TKlCn57//+71x33XW55ZZb6h/r0KFDRowYkfPPPz89e/YsOGXL07dv3/p//+1vf5vNN9+8wTKa18KFCzNmzJhMnjw5b7/99jKvcllVVZXf/OY3BaZrHTbeeONlLu/bt6+/G7R4EyZMyH777bfcoyHWXXfd3Hbbbc04VdMTZTQyY8aM7LTTTvX3X3zxxTzzzDM566yzcthhhyV579LhLe0vAyRJz549M3r06Fx66aV59tlnU1tbm5qamnz60592LlkzOOKII5a5vFKp5G9/+1s6dOiQPn36NPNUrcdLL72UXXfdNdOmTfvQw0hFGdAU5s6dm+7duy93nXfeeafFfSyKKKORefPmNTg8aMKECamqqmpwYv1GG22Uu+++u8R40CzatWv3gb+tpun84Q9/yJgxY3LBBRfUn0czffr0fOlLX8pf//rXJMkBBxyQ3//+9w0O62LFOPnkk/O3v/0tI0aMyNFHH5111lknbdt6q9Cc5s6dm4svvjh33XVXZs6cmQULFjRap6qqKtOmTSswHTS9Pn36NLjAx7I8+uijWX/99Ztpoubhv7Q00rt37zz77LP192+77basscYa2XLLLeuX1dXVpX379iXGg2Zx//335/HHH09dXV06deqUzTffPNtvv33psVq8Sy65JK+99lp9kCXvhcJTTz2VnXfeOW+88Uauv/767LLLLj4rsQn8+c9/zi677JLf/e53pUdplebMmZPtttsu06ZNS6dOnVJXV5eamposXLgw77zzTpL3/h/drl27wpNC09ljjz1y4YUX5q677sqwYcMaPX7ddddl0qRJOeOMMwpM13REGY3stNNOufrqq3PxxRenQ4cO+cMf/pC99967wW+lp02b5kIHtEgPPPBAjjrqqPztb39L8t5hc+9/UPEGG2yQ3/72t9l2221Ljtii/fWvf22wV37u3Lm55ZZbctBBB+Xqq6/OokWLssUWW+Syyy4TZU1g6dKl2WKLLUqP0WqNHDky06ZNy+WXX54vf/nLadOmTU4++eSceeaZmTx5cr7xjW+kbdu2ueOOO0qPCk3mu9/9bm644YbsvvvuOeKII+o/LP1///d/8+CDD+bqq69Ov379csoppxSedMUSZTTyve99L2PGjMmJJ56YSqWS1VdfPSNHjqx/fO7cuZk4cWKOPPLIYjNCU3jqqacyfPjwzJ8/P7vuumuGDh2aXr16ZdasWbnnnntyxx13ZLfddsukSZOy0UYblR63RXrzzTcbXEjlvvvuy+LFi3PIIYckee+w0l133TW///3vS43Yog0aNChPP/106TFarVtvvTW77LJL/fnb/2zrrbfOuHHjsskmm+Tss8/OD37wgwITQtPr1q1bJkyYkBEjRjQ4d/X9z+wbNGhQrr766tTU1JQasUmIMhr51Kc+lb/+9a+58cYbkyRf+tKXGlzt6fnnn89xxx2XQw89tNSI0CTOOeecLFy4MLfeems+//nPN3jsO9/5Tm677bbsueeeOeecc3LNNdcUmrJl69SpU9544436+/fcc0+qq6vzuc99rn5Zu3btMm/evBLjtXjnn39+dtxxx9xwww3Zf//9S4/T6rz66qs54IAD6u+3adOm/rDFJOncuXO+8IUv5LrrrhNltGj9+/evP41g0qRJefPNN9OpU6cMGjQoW2+9denxmoQoY5l69epV/xuJfzVw4MAMHDiwmSeCpjd+/Pjsv//+jYLsfZ///Oez//77u8hNExowYEDGjh2bc889N23atMlVV12VLbfcssE5Zi+99FJ69OhRcMqW65ZbbsnQoUNz0EEHZaeddsrAgQPTqVOnRutVVVW1uPM5PglqamqyaNGi+vudO3fO3//+9wbrdOrUKa+99lpzjwZFbL755tl8881Lj9EsRBkNzJw5M1OmTMnAgQM/8JyxyZMnZ9asWdljjz3qz7WBlqC2tjbrrbfectdZb731Ultb20wTtT7f/OY3c8ABB2Sdddap3yN27rnnNlhn0qRJfjHURP75UPXx48dn/Pjxy1xPlDWN/v37Z/r06fX3t9hii9x5551544030rVr17zzzjsZO3Zs1l133XJDQhNqze9DRRkNLF26NPvss0+OOuqo/PrXv270+JIlS/KlL30p6667br70pS8VmBCaTu/evTNp0qTlrvPQQw+ld+/ezTRR67PffvvlF7/4RX7961+nqqoqBx98cIPzVydMmJC6uroP3JvJf+aee+4pPUKrNnz48PzsZz/L/Pnzs9pqq+W4447L/vvvn8022yzbbrttHn300UyfPj3nnXde6VGhSbTq96EV+BdDhw6trLnmmpV333230WPjxo2rVFVVVS688MICk0HTOvHEEyvV1dWV008/vfLOO+80eOydd96pnHnmmZXq6urKSSedVGhCoCWbOXNm5ZprrqnMmTOnftmPf/zjypprrlmpqqqqrLbaapVTTz21snjx4oJTQtNqre9DqyqVSqV0GPLJMnr06BxzzDG59tprG53oPWLEiFx33XWZOXNmunbtWmhCaBpvvPFGBg0alBdffDFdu3bNNttskx49euS1117L5MmTM2fOnPTv3z8PP/xwunTpUnrcFmvx4sW56KKLcvXVV+eZZ57J/Pnzs3jx4iTJ448/nl/96lc56aST8ulPf7rwpC2T7f/Js2TJkrz++uvp3r17izpcC5altb4PrS49AJ88+++/f1ZdddVcccUVDZbPnz8/Y8aMyW677dbi/iJAknTt2jWTJk3KEUcckX/84x+59dZb89vf/ja33npr5s6dm6OOOiqTJk0SZE3onXfeydChQ/Otb30rL730Ujp16pR//t3heuutl9/+9re5/PLLC07Zcr2//U899VTbv4D7778/p5xySv3nMr2vTZs26dGjR2bNmpVTTjnlQw+zhpVZa30fKspoZI011shee+2V22+/PW+++Wb98ptuuinz58/P4YcfXnA6/tkxxxyT7t275/nnny89Sovw8ssvZ5VVVslll12W2traTJ06Nffee2+mTp2a2tra/OY3v0n79u3z8ssvlx61xfqf//mf3H///Tn//PMza9asfOUrX2nweE1NTXbaaafcfvvthSZs2d7f/qNGjbL9C/jpT3+asWPHNvisvn/Wq1ev/OlPf8rPfvazZp6s5bv44ovTr1+/rL766tl3333zyiuvlB6p1Wqt70NFGcs0YsSILFy4MNdee239siuvvDI1NTXZc889C07GPzv99NPz9ttv54ILLig9Souw3nrr1W/Ldu3aZZNNNsn222+fTTbZJO3atUuSXHjhhR96hUY+vmuvvTZDhw7N//t//y9VVVXLPFSrf//+wriJ2P5lTZ48OTvssMNy19lxxx3tKVvBbrjhhnzzm9/MjBkzsvrqq2fMmDHZdttt87e//a30aK1Wa3wfKspYpuHDh6dnz571u45ff/313HnnnTnggAOyyiqrFJ6u5TrhhBPyX//1X5kzZ04ef/zxnHDCCTnppJNywQUX5K233mq0/nrrree31itQpVLJh51m6zTcpvXyyy9nq622Wu46HTt29LEETcT2L2v27NlZe+21l7tOz549M3v27GaaqHX48Y9/nJqamjz55JOZPXt2xowZkzfffDO77LKLMCukNb4PFWUsU3V1dQ455JA89NBDeeGFF3LttddmyZIlGTFiROnRWrRf/vKX+eUvf5m33nor06ZNyy9/+ctceOGFOfnkk7PRRhtl8uTJjb6mX79+mTFjRoFpW6e///3v6dixY+kxWqyOHTt+6BvOadOmpVu3bs00Ueti+5e15pprfuheyJdeeilrrLFGM03UOjz99NM56KCDsuGGGyZJ9txzz/zxj3/MnDlzMnDgwBxwwAE5+uijM27cuMyaNStHH310jjnmmMJTt2yt8X2ozynjAx1++OH52c9+liuvvDLjxo1Lv379PvSwCv4z739G0LrrrpsuXbrknnvuycKFC3PfffflBz/4QXbZZZeMHTs2O+20U/3XPPbYY+nRo0epkVd655xzToP7H/RhuUuWLMmMGTNyzTXXZPDgwc0wWes0ePDgjB07Nm+//XbWXHPNRo/PmDEjt956a/bZZ5/mH64VsP3LGjx4cP74xz9mxowZ6dOnT6PHX3755YwZMyY777xzgelarkql0ujP+6677ppbbrklhx56aG688cYkyYABA9K/f/+MHj06VVVV+c1vflNg2taj1b0PLXc1flYGm266aaVnz56V6urqyplnnll6nFbt7rvvrqy++uqVVVddtXLuuedWbr311srRRx9dqa6urhxxxBGlx1tpVVVV1d+qq6sb3F/Wbe211648/PDDpcdusSZMmFCprq6uDBw4sHLfffdVTj/99Ep1dXVl3rx5lbvuuquy4YYbVtq1a1eZMmVK6VFbJNu/rPe3f58+fSq/+93vKjNnzqxUKu99ftno0aMr66yzTqVNmzaVCRMmFJ60ZRk0aFBl6NChy3xs0aJFlSeeeKIyadKkysyZMyvz58+vjB8/vjJ+/PhmnrJ1ak3vQ31OGcv14x//uP6E7+eeey7rr79+6ZFatYceeih77bVX5syZk+S93+717NkzU6ZMSe/evQtPt3KaMGFCkve25c4775wjjzwyRxxxRKP12rRpky5dumTAgAGprnbkd1O65JJLcuKJJ2bJkiWNHmvTpk3+93//t9FVAVlxbP+yLrjggnzrW9+qP3+1qqqq/t+rq6vz85//PP/1X/9VcsQW5wc/+EG+973vZerUqfnsZz9behz+SWt6HyrKWK5XX3012223XTbddNPcdNNNpcchyVtvvZVLL70006ZNy/rrr5+jjz46a621VumxWoSzzz47Q4cOzY477lh6lFbv6aefzi9/+cs89NBDefPNN9OpU6cMGjQoJ5xwgjdNzcD2L+svf/lLfvnLX2by5Mmpra3NmmuumW222SbHH398Nt5449LjtTi1tbU5++yzM3jw4Bx44IGlx+GftKb3oaIMAACgIMfgAAAAFCTKAAAAChJlLNeCBQsycuTILFiwoPQorZLtX56fQVm2f1m2f1m2f3l+BmW1pu3vnDKWq66uLjU1NamtrU2nTp1Kj9Pq2P7l+RmUZfuXZfuXZfuX52dQVmva/vaUAQAAFCTKAAAACmpbeoCWbunSpZk5c2Y6duyYqqqq0uP82+rq6hr8k+Zl+5fnZ1CW7V+W7V+W7V+en0FZK/v2r1QqmTt3bnr37p3q6uXvC3NOWRP7+9//nj59+pQeAwAAKGDGjBlZZ511lruOPWVNrGPHjkmSHbJ72qZd4WkAoHWpardK6RFatcriRaVHgGIWVxblvtxS3wPLI8qa2PuHLLZNu7StEmUA0Jyq/L+3qMrKd+YGrFiVfKRTmFzoAwAAoCBRBgAAUJAoAwAAKEiUAQAAFCTKAAAAChJlAAAABYkyAACAgkQZAABAQaIMAACgIFEGAABQkCgDAAAoSJQBAAAUJMoAAAAKEmUAAAAFiTIAAICCRBkAAEBBogwAAKAgUQYAAFCQKAMAAChIlAEAABQkygAAAAoSZQAAAAWJMgAAgIJEGQAAQEGiDAAAoCBRBgAAUJAoAwAAKEiUAQAAFCTKAAAAChJlAAAABYkyAACAgkQZAABAQaIMAACgIFEGAABQkCgDAAAoSJQBAAAUJMoAAAAKEmUAAAAFiTIAAICCRBkAAEBBogwAAKAgUQYAAFBQi4iyhQsX5qKLLspuu+2WPn36pH379unevXv23XffPPbYYw3WHT16dKqqqjJ69OiMHTs222+/fTp27Jh+/fo1eL6f/vSnGThwYFZfffV07Ngxn/vc53LzzTc38ysDAABauhYRZW+++WZOOumkLFiwILvvvntOPvnkDBkyJLfeemu22267TJ48udHXXH/99dl3333TvXv3nHDCCfnCF76QJFmwYEF22223fOtb30qlUskxxxyTww47LC+99FL22muvXHzxxc398gAAgBasbekBVoTOnTvn5Zdfztprr91g+VNPPZXBgwfnu9/9bu68884Gj9122225/fbbM2zYsAbLzznnnIwfPz5nnHFGzj777FRVVSVJ5s6dm5133jnf+ta3su+++6Z3797LnGXBggVZsGBB/f26uroV8RIBAIAWqkXsKWvfvn2jIEuSz372sxk6dGgmTpyYRYsWNXhsr732ahRkS5cuzSWXXJL111+/QZAlSceOHXPmmWdm4cKF+cMf/vCBs4waNSo1NTX1tz59+vyHrw4AAGjJWsSesiR5/PHH88Mf/jD33XdfZs2a1SjCXn/99fTq1av+/jbbbNPoOZ599tm89dZb6d27d84+++xGj8+ZMydJ8swzz3zgHKeddlpOOeWU+vt1dXXCDAAA+EAtIsoeeOCB7LzzzkmS4cOHZ4MNNsgaa6yRqqqqjBkzJlOnTm1wSGGS9OjRo9HzvPnmm0neO+zxqaee+sDvN2/evA98rH379mnfvv3HeRkAAEAr1CKi7LzzzsuCBQty7733Zocddmjw2KRJkzJ16tRGX/PPhya+r1OnTkmS/fbbLzfccEPTDAsAAPBPWsQ5ZdOmTUuXLl0aBdn8+fPz6KOPfuTn2XDDDdOpU6dMmTKl0eGPAAAATaFFRFnfvn3z1ltvNTjkcMmSJTn11FPrzwP7KNq2bZuvfe1reemll3LqqacuM8yefPLJzJ49e4XMDQAA0CIOX/zGN76RO+64IzvssEMOPPDAdOjQIePHj88rr7ySIUOGZPz48R/5uc4+++w8+uijufDCC3PLLbdkxx13TPfu3fPKK6/kiSeeyNSpU/Pggw+me/fuTfeCAACAVqNF7CnbY489csMNN6R///658sorc9VVV2XAgAF5+OGH07dv33/rudq3b59x48bl//7v/9KzZ8/ceOON+fnPf56JEyemV69eueSSS7LJJps00SsBAABam6pKpVIpPURLVldXl5qamgzJXmlb1a70OADQqlS1W6X0CK1aZbFz9Gm9FlcWZXxlTGpra+svKPhBWsSeMgAAgJWVKAMAAChIlAEAABQkygAAAAoSZQAAAAWJMgAAgIJEGQAAQEGiDAAAoCBRBgAAUJAoAwAAKEiUAQAAFCTKAAAAChJlAAAABYkyAACAgkQZAABAQaIMAACgIFEGAABQkCgDAAAoSJQBAAAUJMoAAAAKEmUAAAAFiTIAAICCRBkAAEBBogwAAKAgUQYAAFCQKAMAAChIlAEAABQkygAAAAoSZQAAAAWJMgAAgIJEGQAAQEGiDAAAoCBRBgAAUJAoAwAAKEiUAQAAFCTKAAAAChJlAAAABYkyAACAgkQZAABAQW1LD9BatOnSOW2qVyk9Rqu0tLau9AitWvUG65UeodV7c2DX0iO0al1uf770CK3a0vV6lx6hVWtTO7/0CK3ewrVrSo/Qai1Z/G4yccxHWteeMgAAgIJEGQAAQEGiDAAAoCBRBgAAUJAoAwAAKEiUAQAAFCTKAAAAChJlAAAABYkyAACAgkQZAABAQaIMAACgIFEGAABQkCgDAAAoSJQBAAAUJMoAAAAKEmUAAAAFiTIAAICCRBkAAEBBogwAAKAgUQYAAFCQKAMAAChIlAEAABQkygAAAAoSZQAAAAWJMgAAgIJEGQAAQEGiDAAAoCBRBgAAUJAoAwAAKEiUAQAAFCTKAAAAChJlAAAABYkyAACAgkQZAABAQaIMAACgIFEGAABQkCgDAAAoSJQBAAAUJMoAAAAKEmUAAAAFiTIAAICCRBkAAEBBogwAAKAgUQYAAFCQKAMAAChopYuyu+66K1VVVTnhhBOW+fi0adNSXV2d3XbbrX7ZSy+9lGOOOSZrr712Vllllayzzjo55phj8vLLLzf6+n79+qVfv37LfO4hQ4akqqpqhbwOAACAZCWMsl122SXrr79+rrrqqsyfP7/R47/+9a9TqVRy7LHHJkmee+65bL311rnsssuy5ZZb5lvf+la22GKLXHbZZdlqq63y3HPPNfdLAAAAqLfSRVlVVVW++tWvpra2Ntdff32DxxYvXpzf/e536d69e/baa68kyfHHH585c+bk//7v/3LzzTdn1KhRGTt2bH7xi19kzpw5+drXvrZC51uwYEHq6uoa3AAAAD7IShdlSXLUUUdllVVWya9//esGy2+55Za8+uqrOeKII9KuXbu8/PLLueeee7LRRhvV7zl73/HHH58BAwbkz3/+c2bMmLHCZhs1alRqamrqb3369Flhzw0AALQ8K2WUdevWLfvuu2/uu+++PPPMM/XL34+0r3zlK0mSxx9/PEmy0047NToXrLq6OjvuuGOD9VaE0047LbW1tfW3FRl8AABAy7NSRlmSHHfccUn+/xCbOXNmxo0bl5122imf/vSnk6T+0MEePXos8zl69erVYL0VoX379unUqVODGwAAwAdZaaNsyJAhGTBgQC6//PIsXLgwv/3tb7NkyZIGhym+H0SvvfbaMp9j1qxZDdZL3tuDtnjx4mWuX1tbu6LGBwAASLISR1mSfPWrX82cOXMyZsyYXHbZZencuXP222+/+sc333zzJMnEiRNTqVQafG2lUsnEiRMbrJcknTt3zuzZsxuF2bx58/L88883zQsBAABarZU6yo444oh06NAhJ598cl544YWMGDEiHTp0qH983XXXzdChQ/PUU0/lsssua/C1v/rVr/L0009n5513bnAxjq233jqLFi3K73//+/pllUolp512WubNm9f0LwoAAGhVqir/ugtpJXP44YfniiuuSJI88cQT2XjjjRs8/uyzz2aHHXbIG2+8kT333DMbbbRRnnrqqdx8883p1q1b7rvvvvpz0JLkySefzJZbbpmlS5fmoIMOSrdu3XLvvffm7bffzhprrJGpU6c22uu2PHV1dampqckuXY5M2+pVVsyL5t+ytNbHEpRUvcF6pUdo9d4c2LX0CK1al9sdZVHS0vV6lx6hVauubfyZsjSvhWvXlB6h1Vq8+N3cO/Gc1NbWfuh1JlbqPWXJe3vLkmTw4MGNgixJPvOZz2TKlCk58sgj8/DDD+dHP/pRJk+enKOOOiqTJ09uEGRJsvHGG+e2227LlltumRtuuCFXXHFFNtpoozzwwANZc801m+MlAQAArUjb0gP8px577LEkafQ5ZP+sb9++jQ5fXJ6hQ4dm0qRJjZaPHz/+354PAABgeVbqPWXvvvtuLr744nTu3DkHH3xw6XEAAAD+bSvlnrL77rsvEyZMyO23356XXnopo0aNymqrrVZ6LAAAgH/bShll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AAAABYkyAACAgkQZAABAQaIMAACgIFEGAABQkCgDAAAoSJQBAAAUJMoAAAAKEmUAAAAFiTIAAICCRBkAAEBBogwAAKAgUQYAAFCQKAMAAChIlAEAABQkyj7E6NGjU1VVldGjR5ceBQAAaIFEGQAAQEGiDAAAoKBWGWULFy7MRRddlN122y19+vRJ+/bt07179+y777557LHH6tc78sgjc9RRRyVJjjrqqFRVVdXfAAAAVoS2pQco4c0338xJJ52Uz33uc9l9993TuXPnvPDCC7n55pszbty4TJw4MVtvvXX23nvvvP3227npppuy1157ZfPNNy89OgAA0MK0yijr3LlzXn755ay99toNlj/11FMZPHhwvvvd7+bOO+9sEGV77713jjzyyA997gULFmTBggX19+vq6lb0+AAAQAvSKg9fbN++faMgS5LPfvazGTp0aCZOnJhFixZ9rOceNWpUampq6m99+vT5T8cFAABasFYZZUny+OOP59BDD826666bVVZZpf5csbFjx2bhwoV5/fXXP9bznnbaaamtra2/zZgxYwVPDgAAtCSt8vDFBx54IDvvvHOSZPjw4dlggw2yxhprpKqqKmPGjMnUqVMbHIL472jfvn3at2+/IscFAABasFYZZeedd14WLFiQe++9NzvssEODxyZNmpSpU6cWmgwAAGhtWuXhi9OmTUuXLl0aBdn8+fPz6KOPNljWpk2bJMmSJUuabT4AAKD1aJVR1rdv37z11lt56qmn6pctWbIkp556aubMmdNg3S5duiSJc8MAAIAm0SoPX/zGN76RO+64IzvssEMOPPDAdOjQIePHj88rr7ySIUOGZPz48fXrbrvttll11VXz85//PG+99Va6deuWJDn99NMLTQ8AALQkrXJP2R577JEbbrgh/fv3z5VXXpmrrroqAwYMyMMPP5y+ffs2WLdLly654YYb8ulPfzqXXnppzjjjjJxxxhmFJgcAAFqaqkqlUik9REtWV1eXmpqaDKneN22r2pUep1Wqqq4qPUKrVl3TqfQIrd6SN98qPUKrNu3Hg0qP0Kr97ZBflh6hVftC/8GlR2j1lr77bukRWq3FlUUZn5tSW1ubTp2W/36oVe4pAwAA+KQQZQAAAAWJMgAAgIJEGQAAQEGiDAAAoCBRBgAAUJAoAwAAKEiUAQAAFCTKAAAAChJlAAAABYkyAACAgkQZAABAQaIMAACgIFEGAABQkCgDAAAoSJQBAAAUJMoAAAAKEmUAAAAFiTIAAICCRBkAAEBBogwAAKAgUQYAAFCQKAMAAChIlAEAABQkygAAAAoSZQAAAAWJMgAAgIJEGQAAQEGiDAAAoCBRBgAAUJAoAwAAKEiUAQAAFCTKAAAAChJlAAAABYkyAACAgkQZAABAQaIMAACgIFEGAABQkCgDAAAoqG3pAVqNytIkS0tP0SpVr7de6RFataXT/156BCqV0hO0ap++7K3SI7Rqiw5eUnqEVu31Q7coPUKrt9ZVj5UeodWqrlQn737EdZt2FAAAAJZHlAEAABQkygAAAAoSZQAAAAWJMgAAgIJEGQAAQEGiDAAAoCBRBgAAUJAoAwAAKEiUAQAAFCTKAAAAChJlAAAABYkyAACAgkQZAABAQaIMAACgIFEGAABQkCgDAAAoSJQBAAAUJMoAAAAKEmUAAAAFiTIAAICCRBkAAEBBogwAAKAgUQYAAFCQKAMAAChIlAEAABQkygAAAAoSZQAAAAWJMgAAgIJEGQAAQEGiDAAAoCBRBgAAUJAoAwAAKEiUAQAAFCTKAAAAChJlAAAABYkyAACAgkQZAABAQaIMAACgIFEGAABQULNF2fjx41NVVZWRI0c217cEAAD4xLOnDAAAoCBRBgAAUJAoAwAAKKhIlE2ZMiW77rprOnbsmJqamuyzzz6ZPn16o/Xuv//+fPGLX0yXLl3SoUOHDBgwIGeddVbmz5/faN2qqqoMGTIkr7zySg499NCstdZa6dixY774xS/mhRdeSJI8/fTT2XvvvdOlS5d07Ngx+++/f1577bVlzviXv/wlBx98cHr16pVVVlklffv2zTe+8Y288cYbK3RbAAAArVuzR9nkyZOz4447ZpVVVslxxx2XrbbaKmPGjMmwYcPy7rvv1q93/fXXZ6eddsr48eOz995756STTspqq62Wc845JzvvvHODdd/31ltvZYcddsiLL76YI444IkOGDMmtt96aXXfdNU8++WS22267/OMf/8jRRx+drbbaKjfeeGMOOeSQRs9z8803Z5tttsnNN9+cIUOG5KSTTsomm2ySiy++ONtuu23eeuutJt1GAABA69G2ub/hrbfemmuuuSYHHXRQ/bLDDz88V1xxRcaMGZODDz44dXV1OfbYY9O2bds8+OCD2XTTTZMk//M//5NDDz001157bX70ox/ljDPOaPDcf/nLX3LyySfnpz/9af2yE044IZdcckk+97nPZeTIkTnxxBOTJJVKJXvssUduvfXWPProoxk4cGCS5I033siIESOy1lpr5f7770/fvn3rn+uaa67JIYcckjPPPDMXXXTRMl/fggULsmDBgvr7dXV1/+EWAwAAWrJm31O24447NgiyJDn66KOTvLcXLUluuumm1NbW5uijj64PsiSprq7OD3/4w7Rt2zajR49u9NxrrLFGzj333AbL3t8T1rVr13zzm9+sX15VVZWDDz44STJ16tT65Zdffnnq6uoyatSoBkGWJAcffHAGDhyYa6655gNf36hRo1JTU1N/69OnzweuCwAA0Ox7yrbccstGy9ZZZ50kydtvv50keeyxx5IkQ4YMabTuuuuum/79++e5557L3Llz07Fjx/rHNthgg6y22moN1u/Vq1eSZNNNN01VVdUyH5s5c2b9skmTJiVJHnrooUybNq3R93/33Xfz+uuv5/XXX89aa63V6PHTTjstp5xySv39uro6YQYAAHygZo+yTp06NR6i7XtjLFmyJMn/f8hfjx49lvkcvXr1ynPPPZe6uroGUba8517eY4sWLapf9uabbyZJfvGLXyz3dcybN2+ZUda+ffu0b99+uV8LAADwvk/kJfHfD6gPujLirFmzGqzXFN/7iSeeSKVS+cDbvx7aCAAA8HF8IqNsiy22SJKMHz++0WMzZszItGnT0r9//wZ7yVaUQYMGJUkefPDBFf7cAAAA/+oTGWV77bVXampq8tvf/jZPPfVU/fJKpZLvfOc7Wbx4cY488sgm+d5HHXVUOnbsmO9973sNvvf75s+fX3/eGQAAwH+q2c8p+yg6deqUSy+9NIccckgGDRqUgw46KN26dctdd92VRx55JNtss02+/e1vN8n37tatW66++uoccMAB2WyzzfL5z38+AwYMyIIFCzJ9+vRMmDAh2223XW677bYm+f4AAEDr8omMsiQ54IAD0rNnz4waNSp/+MMfMn/+/PTr1y9nnHFGvvOd76RDhw5N9r2/+MUv5rHHHsuPfvSj3HXXXbnzzjuz+uqrZ5111slRRx2Vww47rMm+NwAA0Lo0W5QNGTIklUplmY/169dvmY997nOfy+c+97mP9Pz/7nN/2Eyf+cxn8utf//ojfW8AAICP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hw/PHXfckf322y+HHXZYpk2blgMPPDB33HFHg3VfffXVbLvttrnmmmuyzTbb5Jvf/Ga6dOmSXXfdNZMmTVrm7Keeemo6d+6cH/7wh9l4440zcODA/PznP89rr722IjYNAADAcrX9T7546tSpufzyy3PVVVdl1qxZadeuXYYPH54RI0Zkzz33zKqrrtpg/cMPPzyvvvpqbrvttuy22271y08//fRstdVWOfbYY/OXv/ylwdfMnDkzW2+9dcaPH59VVlklSXLooYdm2LBh+elPf5rhw4fXr3vaaafllVdeybnnnpvvfe979ct/9atf5bjjjlvma/j617+er3/963n88cdz5ZVX5uqrr87JJ5+cb3/72/WvZa+99mr0Wj7IggULsmDBgvr7dXV1H+nrAACA1unf3lM2c+bM/PjHP86mm26azTffPD/96U/Tt2/fXHTRRZk5c2b+9Kc/5aCDDmoUMY899lgeeOCBHHHEEQ2CLEk+/elP59hjj80TTzyxzMMYf/azn9UHWZLssssujQ6NXLhwYa699tp079493/rWtxp8/Ve+8pVssMEGy31dm2++eX784x9nxowZufPOO3PooYfm3nvvzSGHHJKePXvmmGOOyYQJE1KpVJb7PKNGjUpNTU39rU+fPstdHwAAaN3+7T1l22+/faZPn57u3bvnrLPOymGHHZZPfepTH/p17x8++Nprr2XkyJGNHn/mmWfq/7nxxhvXL19zzTWz3nrrNVp/nXXWyYMPPlh//9lnn827776bnXfeOR06dGiwbnV1dbbffvs8//zzHzpndXV1hg0blmHDhuWXv/xlxowZk1/96le57LLLctlll2XMmDHZa6+9PvDrTzvttJxyyin19+vq6oQZAADwgf7tKNt4440zffr0zJ49O7fddlvWWmutHHTQQenWrdtyv+7NN99Mktxyyy255ZZbPnC9efPmNbhfU1OzzPXatm3b4KqJtbW1SZLu3bsvc/0ePXosd75/tWTJktx777257bbbMmXKlCTJWmutlZ49ey7369q3b5/27dv/W98LAABovf7twxfHjh2b5557Lqeffnpee+21fOMb30jv3r2z++6756qrrmoUVe/r1KlTkuSiiy5KpVL5wNsRRxzxsV7I+/E2e/bsZT7+US/c8cgjj+Tkk0/OOuusk9122y3XXnttPv/5z+emm27KzJkzM2jQoI81HwAAwLJ8rKsvbrDBBvn+97+fF154IRMmTMiRRx6ZBx54IF/+8pfTo0ePHHbYYRk3blwWL15c/zXvx8w/H3K4In36059Ohw4dMmXKlLz77rsNHlu6dGkeeOCBD/zaF154Id///vczYMCAbLXVVvVXh/y///u/zJo1K9dff3323HPPtGvXrklmBwAAWq//6JL4VVVV2XHHHXPppZdm1qxZufbaazNkyJBce+212X333bP22mvXX+Z+m222yaBBg3L11Vfn2muvbfRcS5cuzYQJEz72LO3bt8+BBx6Y2bNn5yc/+UmDx37961/nueeeW+bX7bnnnll//fVz5plnZsmSJRk5cmSmTZuW++67L1/96lez5pprfuyZAAAAPsx/dEn8f9ahQ4cceOCBOfDAAzNnzpxcddVVueKKKzJr1qz6da6++uoMHTo0Bx98cH7+859n4MCBWXXVVfPyyy/nwQcfzJw5cxrt5fp3nH/++bn77rtz+umn57777ssWW2yRp59+Orfeemv9Z539q1deeSXHH398RowYke222+5jf28AAICPY4VF2T/r1q1bTjzxxJx44olZsmRJ/fL11lsvjz32WH76059mzJgx+e1vf5s2bdqkV69e2XHHHbP//vv/R9+3V69eeeCBB/L//t//y+23356JEydmyy23zJ133pk///nPy4yyhx9+OG3atPmPvi8AAMDHVVX5sA/e4j9SV1eXmpqaDMleaVvlnLQSqjffqPQIrVrlyWUfOkzzqfzT+b0UUO0XfyW9epILdJX0wxN+U3qEVu+C/fcrPUKrtXjJgvz5Lz9IbW1t/UUPP8h/dE4ZAAAA/xlRBgAAUJAoAwAAKEiUAQAAFCTKAAAAChJlAAAABYkyAACAgkQZAABAQaIMAACgIFEGAABQkCgDAAAoSJQBAAAUJMoAAAAKEmUAAAAFiTIAAICCRBkAAEBBogwAAKAgUQYAAFCQKAMAAChIlAEAABQkygAAAAoSZQAAAAWJMgAAgIJEGQAAQEGiDAAAoCBRBgAAUJAoAwAAKEiUAQAAFCTKAAAAChJlAAAABYkyAACAgkQZAABAQaIMAACgIFEGAABQkCgDAAAoSJQBAAAUJMoAAAAKEmUAAAAFiTIAAICCqiqVSqX0EC1ZXV1dampqMiR7pW1Vu9LjAAAAzWBxZVHG56bU1tamU6dOy13XnjIAAICCRBkAAEBBogwAAKAgUQYAAFCQKAMAAChIlAEAABQkygAAAAoSZQAAAAWJMgAAgIJEGQAAQEGiDAAAoCBRBgAAUJAoAwAAKEiUAQAAFCTKAAAAChJlAAAABYkyAACAgkQZAABAQaIMAACgIFEGAABQkCgDAAAoSJQBAAAUJMoAAAAKEmUAAAAFiTIAAICCRBkAAEBBogwAAKAgUQYAAFCQKAMAAChIlAEAABQkygAAAAoSZQAAAAWJMgAAgIJEGQAAQEGiDAAAoCBRBgAAUJAoAwAAKEiUAQAAFCTKAAAAChJlAAAABYkyAACAgkQZAABAQaIMAACgIFEGAABQkCgDAAAoSJQBAAAU1Lb0AC3NggULsmDBgvr7dXV1BacBAAA+6ewpW8FGjRqVmpqa+lufPn1KjwQAAHyCVVUqlUrpIVqSZe0p69OnT4Zkr7StaldwMgAAoLksrizK+NyU2tradOrUabnrOnxxBWvfvn3at29fegwAAGAl4fBFAACAgkQZAABAQaIMAACgIFEGAABQkCgDAAAoSJQBAAAUJMoAAAAKEmUAAAAFiTIAAICCRBkAAEBBogwAAKAgUQYAAFCQKAMAAChIlAEAABQkygAAAAoSZQAAAAWJMgAAgIJEGQAAQEGiDAAAoCBRBgAAUJAoAwAAKEiUAQAAFCTKAAAAChJlAAAABYkyAACAgkQZAABAQaIMAACgIFEGAABQkCgDAAAoSJQBAAAUJMoAAAAKEmUAAAAFiTIAAICCRBkAAEBBogwAAKAgUQYAAFCQKAMAAChIlAEAABQkygAAAAoSZQAAAAWJMgAAgIJEGQAAQEGiDAAAoCBRBgAAUFDb0gO0dJVKJUmyOIuSSuFhAACAZrE4i5L8/z2wPKKsic2dOzdJcl9uLTwJAADQ3ObOnZuamprlrlNV+Sjpxse2dOnSzJw5Mx07dkxVVVXpcf5tdXV16dOnT2bMmJFOnTqVHqfVsf3L8zMoy/Yvy/Yvy/Yvz8+grJV9+1cqlcydOze9e/dOdfXyzxqzp6yJVVdXZ5111ik9xn+sU6dOK+VfhpbC9i/Pz6As278s278s2788P4OyVubt/2F7yN7nQh8AAAAFiTIAAICCRBnL1b59+5x11llp37596VFaJdu/PD+Dsmz/smz/smz/8vwMympN29+FPgAAAAqypwwAAKAgUQYAAFCQKAMAAChIlAEAABQkygAAAAoSZQAAAAWJMgAAgIJEGQAAQEH/H6hB5uy7dl+cAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "translate(u'¿todavia estan en casa?')" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "execution": { "iopub.execute_input": "2022-12-14T22:02:58.334458Z", "iopub.status.busy": "2022-12-14T22:02:58.333858Z", "iopub.status.idle": "2022-12-14T22:02:58.631428Z", "shell.execute_reply": "2022-12-14T22:02:58.630700Z" }, "id": "DUQVLVqUE1YW" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Input: trata de averiguarlo . \n", "Predicted translation: try to figure it out . \n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/tmpfs/tmp/ipykernel_690249/2919660472.py:9: UserWarning: FixedFormatter should only be used together with FixedLocator\n", " ax.set_xticklabels([''] + sentence, fontdict=fontdict, rotation=90)\n", "/tmpfs/tmp/ipykernel_690249/2919660472.py:10: UserWarning: FixedFormatter should only be used together with FixedLocator\n", " ax.set_yticklabels([''] + predicted_sentence, fontdict=fontdict)\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAqQAAAOTCAYAAABpThEIAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABJhUlEQVR4nO3deXiU9bn4/3sSMChKBGWRRVCxVY+KuFTcEHABN9xxRRFr7Tm/otVT22OrENQWbdVatfYctcqiIlhUahUsLoAbFBTUuqFsgggoaoJQIiTz+8OLfE0TcEvywZnX67rmqjPPMzN3Bm3ePNtkstlsNgAAIJGC1AMAAJDfBCkAAEkJUgAAkhKkAAAkJUgBAEhKkAIAkJQgBQAgKUEKAEBSghQAgKQEKQAASQlSAACSEqQAACQlSAEASEqQArDJuffee+OII46Ili1bRlFRUbRs2TKOPPLIuO+++1KPBtSDTDabzaYeAgAiIioqKqJfv37x8MMPRzabjSZNmkTr1q1j2bJlsWbNmshkMnHCCSfEAw88EAUFtqlArvBfMwCbjJtvvjkeeuihOOigg+K5556L1atXx/z582P16tXx/PPPx8EHHxwPP/xw3HLLLalHBeqQLaQAbDL22muvWLNmTbz66qvRuHHjGsvXrl0be+65ZxQVFcXs2bMbfkCgXthCCsAmY86cOdG3b99aYzQionHjxnHcccfFnDlzGngyoD4JUgA2GZtttlmsWrVqo+usWrUqNttsswaaCGgIghSATUbXrl1j7NixsWTJklqXv//++zF27NjYe++9G3gyoD4JUgA2GZdeemmsWLEi9t1337jhhhti5syZsWjRopg5c2Zcf/31sc8++8RHH30Ul156aepRgTrkpCYANik33nhj/M///E9UVFRUezybzUajRo3iuuuui0suuSTRdEB9EKQAbHLmzZsX9957b8yePTvKysqiWbNm0bVr1zjzzDNjxx13TD0eUMcEKQAASTmGFACApBqlHgCA/DV16tRv/Nzu3bvX4SRASnbZA5BMQUFBZDKZb/Tcfz/pCfjusoUUgGQGDx78jYMUyB22kAIAkJSTmgDYZFx11VUxatSo1GMADUyQArDJuOaaa+LVV19NPQbQwAQpAJuM7bffPj755JPUYwANTJACsMk4/fTTY+LEiVFaWpp6FKABOakJgE1GeXl5nHzyyfH+++/HVVddFfvtt1+0atUq9VhAPROkAGwyCgsLIyIim81u9HJQmUwm1q1b11BjAfXMdUgB2GQccsghrksKecgWUgAAknJSEwAASQlSAACScgwpAJuUioqKGDt2bDzxxBOxZMmSKC8vr7FOJpOJJ598MsF0QH0QpABsMlatWhVHHnlkTJs2repM+y+e6rD+vhOfILfYZQ/AJuOaa66JF154IYYOHRoffvhhZLPZKCkpiffffz/GjBkTO+64Y5x66qm1bjUFvrsEKQCbjAcffDC6desWV1xxRbRo0aLq8datW8epp54aTz/9dDzxxBPxu9/9LuGUQF0TpABsMt59993o1q1b1f2CgoJqW0Pbt28fxxxzTIwYMSLFeEA9EaQAbDKaNm0aBQX/71dTcXFxvP/++9XWadOmTbz77rsNPRpQjwQpAJuMjh07VovN3XffPZ566qmqraTZbDaefPLJ2G677VKNCNQDQQrAJuOwww6Lp59+uup76s8999x4991344ADDojLLrssDj744Jg9e3acfPLJiScF6pKvDuVLrVy5Mho3bhxNmjRJPQqQ495+++148MEH45xzzqnaCjpo0KC47bbbqi7/dPLJJ8eIESNiiy22SDkqUIcEKRv11ltvxW677Ra77LJLvPbaa6nHAfLUBx98EPPmzYuOHTtGmzZtUo8D1DEXxmejRo0aFdlsNt58882YOXNm7LvvvqlHAvJQy5Yto2XLlqnHAOqJY0jZqHvuuSd23nnnKCgoiFGjRqUeBwDIQXbZs0FTpkyJXr16xY033hgTJ06Ml156KZYsWRKFhYWpRwNy1I477viV1stkMjF37tx6ngZoKLaQskEjR46MwsLCOPPMM+PMM8+MDz/8MCZMmJB6LCCHVVZWRjabrXH75JNPYsGCBbFgwYIoLy+PysrK1KMCdcgWUmq1Zs2aaN26dRx00EHx2GOPxapVq6J169ZxzDHHxJgxY1KPB+ShBQsWxKWXXhrLli2LSZMmOcsecogtpNTq4YcfjpUrV8bZZ58dEZ9/e0rfvn3jkUceidLS0sTTAfmoU6dOMWbMmPj444/jV7/6VepxgDokSKnVyJEjY6uttooTTzyx6rGzzz471qxZEw888EDCyYB81rhx4zjiiCNi7NixqUcB6pAgpYb1u8NOOOGE2Hzzzase7927d7Rs2TJGjhyZcDog361evTo++uij1GNAg3jkkUdixowZqceod4KUGu67776orKys2l2/XmFhYfTr1y+ee+65mD9/fqLpgHz2zDPPxOjRo+P73/9+6lGg3k2dOjWOP/74OO6446KioiL1OPXKSU3UsPfee8fy5ctj0aJFkclkqi2bNm1aHHjggTF06NC48sorE00I5KpevXrV+vi6devivffeiwULFkRExAMPPBAnnXRSA04GDe+HP/xh3HXXXZHJZGL8+PFx7LHHph6p3ghSqvnnP/8Ze+65Z1x66aVx/fXX17pO586do6CgIObMmdPA0wG5rqCg9h13mUwmmjdvHvvtt19ceumlccQRRzTwZNCw1qxZE23atIm99947Zs6cGUcddVROX+XGV4dSzQ477BDz58/f6Ff0TZs2LVatWtWAUwH5wvVF4XPjx4+PlStXxo9+9KPo0KFDPPDAA1FWVhbNmjVLPVq9cAwp1TRt2jQ6duy40ev7bbvtttGxY8cGnAoA8suoUaOqrnZz1lln5fxVbgQpNUydOjXefffdja6zaNGimDp1agNNBAD5Y/ny5fH3v/89TjzxxCgqKorDDz882rRpk9NXubHLnhp69uwZQ4YMicGDB29wnZEjR8bgwYNz/qw/oGENHDjwS9cpKCiIZs2axfe///049thjo127dg0wGTSc0aNHR0VFRfTv3z8iPv93/rTTToubb745FixYEJ06dUo7YD0QpNTwVc5zq6ysrHEGPsC3NXz48Kr/b6nt/4symUy1xwcNGhSDBw+OK664osFmhPo2cuTIaNu2bbWrTvTv3z/+8Ic/xD333JOT/77bZc838vbbb0dxcXHqMYAcM3fu3Dj22GOjVatW8Zvf/CamTJkSb775ZkyZMiV+85vfROvWraNv374xffr0uP3226Nt27YxZMiQnD77mPzy+uuvx6xZs+KMM86o9vjee+8d3//+92PUqFGJJqtftpASETV3kz388MNV1/v7ooqKiqrjR4866qgGmg7IF2PGjInp06fHyy+/HK1bt656/Hvf+14ccsghMWDAgNhrr73i6aefjp///Odx1FFHxW677Ra33XZbnHbaaQknh7oxcuTIyGQyNb6cJiLizDPPjJKSkpg+fXrsv//+CaarP65DSkRUv/bfv+8S+3eZTCb222+/uOeee6Jz584NMR6QJ3beeec46qij4uabb97gOoMGDYqJEyfG22+/HRERZ511Vjz66KPxySefNNCUUD+y2Wxsv/320aJFi3j55ZdrLJ8/f37stNNO8V//9V9x6623Jpiw/thCSkRE1VeBZrPZ2HHHHeOnP/1pXHzxxTXWKywsjObNm0fTpk0bekQgDyxevDiKioo2uk6TJk1i8eLFVfe33377WLNmTX2PBvVu5syZ0ahRo7jwwgtrXb7DDjvEscceG9OnT49sNptT53LYQkoNI0aMiK5du8aee+6ZehQgz3Tu3DkymUy8+uqr0aRJkxrL16xZE3vssUdks9l45513IiLi/PPPj8ceeyzef//9hh4XqCNOaqKG8847L6677rrUYwB56Pzzz4+5c+fGwQcfHH/9619jxYoVERGxYsWK+Otf/xoHH3xwzJs3r9px788880x06dIl1chAHbDLnhqKi4ujQ4cOqccA8tDPf/7zeOONN+Kee+6JE088MSI+P8Z9/VeKZrPZOPPMM+N//ud/IiJi2bJlccwxx0SfPn2SzQx8e3bZU8ORRx4ZhYWFMWHChNSjAHnqqaeeilGjRsUrr7xS9f3dXbp0ibPOOisOO+yw1ONBnfk233rYvXv3OpwkLUFKDS+88EL06NEj7rjjjjjnnHNSjwMAOaugoOAbn5yUS9+WaJc9NUyaNCl69OgR5513Xtxyyy2x3377RevWrWv8B5PJZOLKK69MNCUAfPcNHjy4xu/XadOmxeOPPx4777xzHHTQQdG6detYtmxZPP/88zFnzpzo3bt3dOvWLdHE9cMWUmr44jVJNyaTyeTU386Ahvfuu+9GRES7du2isLCw6v5Xsf3229fXWJDMM888E0cccUTceuutcf7551eL1Ww2G3fccUdcfPHFMWnSpDj44IMTTlq3BCk1TJky5Suve+ihh9bjJPlpzZo1MWPGjFiyZEmUl5fXuo5DKcgV63dXvvHGG/G9733vK+++zGQysW7dugaYEBpWjx49Yptttolx48ZtcJ2TTjopPv7443j66acbcLL6ZZc9NYjMdP74xz/GlVdeGaWlpbUuX38hZEFKrjjnnHMik8lEcXFxtfuQr1588cVav5jmi3bdddeNfpvZd5EghU3Egw8+GIMGDYo99tgjrrzyyvjv//7vOOGEE2L//fePqVOnxoQJE+Lkk0+OY489NvWoUGeGDx++0fuQbzbbbLOYNWvWRteZNWtWbLbZZg00UcOwy56NWrRo0UZ3HefSJSdS6969e8yZMyfmzZsXW2yxRRQUFERJSUkMHjw4IiLuu+++OPfcc6tOOoNcNHLkyGjdunX07t079SiQxBlnnBFjx46NX//613HppZdWC8/PPvssbrjhhrjiiivitNNOi/vuuy/hpHVLkFKrRx55JC677LJ4++23N7qek5rqztZbbx39+vWL22+/PSI+P7buyiuvjKFDh1at07t371i7dm089dRTqcaEetW4ceP4yU9+Er///e9TjwJJLF68OLp16xbvv/9+tGrVKvbdd99o1apVLF++PGbOnBnLly+Ptm3bxgsvvBDt27dPPW6d8dWh1DB58uQ48cQT49NPP42f/OQnkc1mo3v37vGjH/0odtttt8hms3HMMcdUbbmjbqxduzZatmxZdX/zzTePTz75pNo6Xbp0iZdeeqmBJ4OGs9122zlZibzWvn37mDlzZvTv3z9KS0vj0UcfjbvvvjseffTRKC0tjf79+8eMGTNyKkYjBCm1uPbaa2PLLbeMF198Mf7whz9ERETPnj3jT3/6U7z66qvx61//Op588sk4/vjjE0+aW9q2bRvvv/9+1f2OHTvWOI5o4cKF0aiRQ7/JXX379o1JkyZt8DAhyAdt2rSJ4cOHR2lpabzyyivxzDPPxCuvvBKffPJJDB8+PNq0aZN6xDonSKlhxowZccIJJ0Tr1q2rHlv/PdIREZdffnl07drVFtI6tt9++1Xb+tmnT5947rnnYtiwYfHaa6/F//3f/8WDDz4Y++23X8IpoX79+te/jqZNm8ZJJ50Ur732WupxIKnGjRvH7rvvHgcddFDsvvvuOXci0xcJUmpYvXp1tGvXrup+UVFRlJWVVVunW7du8dxzzzX0aDnt1FNPjfLy8liwYEFEfB7+7du3jyuuuCL23HPP+M///M/Ycsst47e//W3aQaEede3aNZYuXRoTJ06MPffcM5o2bRo77LBD7LjjjtVuO+20U+pRgTpk3x81tGnTJj744IOq++3atauxpWLFihVOaKpjJ554Ypx44olV91u2bBmzZ8+OO++8M+bNmxcdO3aM/v37V/vLAuSaysrK2GyzzWp8C9O/n3/rfFxy2RNPPBE33nhjzJgxIz755JNqeynXy7UvhxCk1NClS5f45z//WXW/Z8+eMWLEiBg9enT07ds3nn322Rg7dmzss88+CafMD82bN4/LLrss9RjQYNbvIYB8NW7cuDjttNOisrIyOnbsGLvssktenDvgsk/UcNddd8VPfvKTeOONN6Jjx44xf/782Geffap9e1CjRo1i0qRJrkNah3r16hUDBgzY6Lcw3XPPPXHXXXe57BNAjurSpUvMmzcvxo8fH7169Uo9ToNxDCk1DBw4MFavXh0dO3aMiIgddtghZsyYET/+8Y/jyCOPjAsuuCCmT58uRuvY5MmTv3Tr0MKFC2PKlCkNMxAk9vrrr8eDDz4Yo0aNSj0KNJi33norTj/99LyK0Qi77PmKdtppp/jjH/+Yeoy8t2rVqmjcuHHqMaBezZgxIy644IJ49dVXqx7r379/RERMnTo1+vTpE/fff3/07ds31YhQb7bZZpvYYostUo/R4GwhpYaBAwfGX//6142u87e//S0GDhzYQBPlrnfffbfqFhHxySefVHts/W3+/PkxderUGDduXHTq1Cnt0FCPXnvttejVq1fMnz8/LrnkkjjqqKOqLT/kkENi2223jQceeCDRhFC/TjnllHjiiSdy6oSlr0KQUsPw4cNj9uzZG13n5ZdfjhEjRjTMQDmsU6dOscMOO8QOO+wQmUwm/vCHP1Td/+Ktc+fO0bNnz3j77bfjggsuSD021JshQ4ZERMSLL74Y119/fY3r7mYymTjggANixowZKcaDeveb3/wmtt566zjttNOqNlbkA7vs+UbWrFmTF2f91bdzzjknMplMZLPZGDlyZHTp0iX22muvGusVFhZGixYtolevXtGnT5+GHxQayJQpU+Lkk0+Ozp07b3Cd7bffPiZOnNiAU0HD2WOPPWLt2rUxbdq0ePjhh2PrrbeO4uLiGutlMpmYO3duggnrh6KgVplMptbHs9lsLFq0KCZMmBBt27Zt4Klyz/Dhw6v+ecqUKXHeeefFRRddlG4gSGzlypXRqlWrja7zr3/9y3WQyVmVlZXRqFGjatfire2CSLl2kSRBSkREFBQUVIvQkpKSKCkp2eD62Ww2fvGLXzTAZPlj/vz5qUeA5Dp06FDtZKbavPTSS76piZyVr9fiFaRERET37t2rgnTq1Kmx/fbb13ryzBd3HTuWEahrxx57bNx8883xxBNPxOGHH15j+dixY2PatGlx5ZVXJpgOqC8ujE8NBQUFUVJSEoMHD049St5ZuXJl3HrrrfHEE0/EkiVLory8vMY6uXbcEHzRBx98EHvvvXcsW7Yszj333Fi6dGk89thjccstt8QLL7wQo0ePju233z5mzZpV63F1kEtef/31ePPNN2PVqlVVlz7LVYIUNhEffPBBHHjggTF37txo1qxZlJWVRXFxcXz22Wfxr3/9KyIi2rZtG40bN7Z7n5w2b9686N+/f7zwwgs1lu2///4xevRolz8jp9V2Ld71x03n6rV4BSm1qqysjIKC6lcFe+GFF+Jvf/tbNGnSJM4777xo3759ouly0//3//1/8ac//SlGjhwZZ511VhQWFlZtqZ4xY0YMGjQoGjVqFH//+9/z8qLJ5J/Zs2fHtGnT4qOPPopmzZrF/vvvX+MyUJBrXnvttejWrVsUFBTEBRdcEG+++WZMmDChKkiz2Wx07NgxDj300Jz6FjNBSg2XXHJJ/OlPf4qlS5fG1ltvHRERf/nLX+L000+PysrKiIjYdttt46WXXhKldWj99UYnTZoUETUPnfj4449jjz32iLPOOiuuu+66lKPmhXzaVQZsOk455ZR4/PHHY9asWdG5c+cYOnRoXHXVVdWuLHHaaafFyy+/HG+++WbCSeuWC+NTw9NPPx29evWqitGIiMGDB0dxcXGMHDkyfvvb38bHH38c119/fbohc9D7778fXbt2rbpfWFhYtas+IqJ58+Zx1FFHxdixY1OMlzdmzJgRe+21V+yxxx5x6qmnxoABA6qWTZ06NbbYYosv/SYzvrn+/fvHpEmTcu6SNvBVfdVr8b7//vsNOFX9E6TUsGjRoth5552r7s+fPz/efPPNuOiii+Lss8+On/3sZ3H00Ue7MHUdKy4ujrVr11bdb968eSxevLjaOs2aNYtly5Y19Gh5w9dWpnfvvfdGnz59on379vGzn/3sS781DnJNvl6LV5BSw6pVq6Jp06ZV96dMmRKZTKbaL+fddtutRizx7ey4447Vrj/XtWvXmDRpUqxYsSIiPv8/oEceeaTaxZKpW762Mr0XX3wxLrrooqisrIwbb7wx9tlnn9hjjz3id7/7Xbz33nupx4N6l6/X4hWk1NC2bdt46623qu5PnDgxttxyy9hnn32qHisrK4uioqIU4+WsI488Mp588slYvXp1RERceOGFsXz58ujSpUuceuqpsfvuu8fcuXOr7UKmbuXrrrJNSdeuXeP3v/99vPfee/Hoo4/G6aefHvPnz49f/OIX0bFjxzj88MNjxIgR8emnn6YeFerFscceG3//+9/jiSeeqHX5+mvxnnDCCQ07WD0TpNRw6KGHxqOPPhq33npr3HnnnfHggw9G7969o7CwsGqduXPnOqGpjv34xz+OO+64oypITzrppPjd734Xq1atinHjxsXSpUvj0ksvjcsuuyzxpLkrX3eVbYoKCgriqKOOinvvvTeWLVsWd999d/Ts2TMmT54cAwcOjDZt2qQeEerFL3/5y2jbtm0cffTRccEFF8TMmTMjIuK2226L/v37x5lnnhmdOnWKSy+9NPGkdctZ9tTwzjvvxH777RdlZWWRzWajadOmMX369Nhtt90i4vNf2q1bt44BAwbEbbfdlnja3FdRUREffvhhtGrVqtrXu1L3dt555+jcuXNMmDAhIqLWs1sPPPDAWLVqVbz88supxsxbn376adx8880xdOjQWLdunb8YkLPy8Vq8vjqUGjp37hyvv/56jBs3LiIijjvuuOjYsWPV8rfffjsuvPDCOPPMM1ONmJMGDhwYe+yxR1xyySXVHi8sLIzWrVsnmiq/+NrKTU9lZWU8/vjjcc8998T48ePjX//6V2QymVr/fCBX7LjjjvHcc8/l1bV4bSGFTUSTJk3ikksuiWHDhqUeJW/52spNx8yZM+Oee+6J+++/Pz744IPIZrOxxx57VO2ybNu2beoRgTokSKlmyZIlMXPmzNh77703eIzojBkzYunSpXHsscfahVyH/uM//iP222+/GD58eOpR8lo+7irblFxzzTVx7733xpw5cyKbzcZ2220XZ555ZvTv3z/23HPP1ONBvcrn38GClGoWL14cHTt2jPPOOy/uvPPOGssrKiqiXbt2sf3228c//vGPBBPmrhtuuCGuvfbamD17drRr1y71OHkvn3aVbUoKCgqiadOmceKJJ0b//v3jsMMOq/E1xpCr8vl3sCClhl69esWsWbNi6dKlNS7tNHHixDj66KPjD3/4QwwaNCjRhLlpwYIF8ZOf/CReffXV+PnPfx777bdftG7duta/AbsWKbnqnnvuiZNOOim22GKL1KNAEvn6O1iQUsPw4cPj/PPPjzFjxsQpp5xSbVn//v1j7NixsWTJkthmm20STZibCgoKIpPJRDab3ehumEwmE+vWrWvAyXLXwIEDv9HzMplM/PnPf67jafh3668wUV5eXutyfzEjF+Xr72BBSg2ffvpptGnTJg477LAYP3581eOrV6+O1q1bR8+ePX2Xdz0YMGDAVz4e6O67767nafLDhnYFr/+LwYYez2QyLjlUj1588cX45S9/GVOnTo3PPvus1nX8xYxcla+/g132iRq23HLLOP7442PcuHHx0UcfRYsWLSIiYvz48bF69eo455xzEk+Ym6666qrYeuuto1mzZhtcp6ysLD755JOGGyrHzZ8/v9r9ysrKuPjii2PatGlx8cUXxyGHHBKtW7eOZcuWxdSpU+Pmm2+OAw44IH7/+98nmjj3zZ49Ow455JBo1KhRHHnkkfHII49Ely5dok2bNvHSSy/FBx98ED169Kh2KTrIJXn7OzgLtZgwYUI2k8lkb7vttqrHjj766Gzz5s2z5eXlCSfLXQUFBdmrrrpqo+tcc8012cLCwgaaKP8MGzYs26pVq+ySJUtqXb548eJsy5Yts9ddd10DT5Y/TjrppOzmm2+eff3117PZbDabyWSyQ4cOzWaz2ezq1auz//mf/5lt2bJldv78+QmnhPqVj7+DnbpIrY488sho06ZNjBo1KiIiPvzww5g0aVKceuqpsdlmmyWeLjdls9ladxN/3XX45v785z9Hv379Yrvttqt1ebt27aJfv35xxx13NPBk+ePZZ5+Nvn37xq677lr12Pp/5zfffPO49dZbo23btvHLX/4y1YhQ7/Lxd7AgpVYFBQVxxhlnxPTp02PevHkxZsyYqKioiP79+6ceLa8tXrw4ttpqq9Rj5KzFixdHkyZNNrpOkyZNYvHixQ00Uf4pLS2NHXfcsep+48aN49NPP626X1BQED169Ignn3wyxXjQIPLxd7BjSNmgc845J37/+9/HPffcExMmTIhOnTrFwQcfnHqsnHLVVVdVuz958uRa16uoqIhFixbF/fffH926dWuAyfJT+/bt46GHHoqrr7661jBdvXp1PPTQQxu8YDXfXqtWreLjjz+uut+mTZt4++23q62zZs2aWL16dUOPBg0q734HJz1ggE3ennvumW3Tpk22oKAgO3jw4NTj5JxMJlN1KygoqHa/tlu7du2y//jHP1KPnbOuvfbabCaTye69997Zhx9+OPvhhx9ms9ls9sMPP8w+9NBD2a5du2YLCgocQ1qPevfune3Zs2fV/TPOOCO7+eabZ59//vls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LaQ9evSIiIibbropIiJ++tOfRkTE1ltvvcHnvPzyy3HIIYfEqlWr4qSTToqdd945Zs6cGQcffHB06dKlzmZ75513olu3brHHHnvEgAEDYsWKFVVbcC+//PK49tpro127dnHSSSdFcXFxPPPMM3HZZZfF9OnT44EHHqizOQAA8l29B2mPHj2qtlCWlJRULfvi1sgv+slPfhIrV66Me++9N84888yqxwcPHhxXX311nc323HPPxeDBg2Po0KHVHp80aVJce+210bt37xg3blw0bdo0IiKy2Wz813/9V/zv//5vjBs3Lk4++eRaX7e8vDzKy8ur7peVldXZzAAAuWiTug7pwoUL49lnn40uXbpUi9GIiF/84hfRvHnzOnuvNm3axK9+9asaj996660REXH77bdXxWhERCaTiWuvvTYymUyMHj16g687bNiwKC4urrp16NChzmYGAMhFDXJS01f18ssvR0TEQQcdVGNZ06ZNY6+99oqnn366Tt6rS5cu1U6yWm/atGnRtGnTuOuuu2p93uabbx5vvvnmBl/38ssvj0svvbTqfllZmSgFANiITSpI1+/ebtWqVa3LW7duXWfvtaHX+uijj2LdunU1duV/0apVqza4rKioKIqKir71fAAA+WKTCtJmzZpFRMTy5ctrXb5s2bIajxUUfH7Uwbp162osKy0t3eB7ZTKZDc6QyWTiww8//NJ5AQD49japY0jXn0X//PPP11i2evXqql36X7T+uNL33nuvxrJZs2Z97Rn233//WLFiRbz99ttf+7kAAHx9m1SQduzYMQ466KCYPXt2jBkzptqy3/3ud/HRRx/VeM5+++0XEREjR46MysrKqsdfeOGFuPfee7/2DBdddFFERAwcODBWrFhRY/nSpUvjjTfe+NqvCwBA7TapXfYREbfcckt07949zjrrrBg3blx07tw5XnrppZg2bVp07949pk6dWrWbPiKiW7ducdBBB8VTTz0VBxxwQHTv3j0WLlwY48ePj+OOOy4eeuihr/X+ffr0iSuvvDKuvvrq6Ny5c/Tp0yc6duwYK1asiHfeeSeeeeaZuOaaa2LXXXet6x8dACAvbVJbSCMiunbtGs8880wcfvjhMWHChLj11lujoKAgnn322apjTNf/73rjx4+Pc845J95555344x//GIsWLYpHHnkk+vbt+41muOqqq2LSpElxyCGHxJNPPhk33nhj/O1vf4vy8vIoKSmJs84661v/nAAAfC6TzWazqYf4KioqKmKnnXaKf/3rX7We3LSpKisri+Li4ujZ+NRolGmcepy8VNB089Qj0Lpl6gnyWtkfKr98JepN0e/q7hrafDONnp6deoS8tS67NiZXPhilpaU1Nih+0Sa3hXTdunW1nuF+7bXXxsKFC+OEE05o+KEAAKg3m9wxpJ9++mm0a9cujjjiiPje974Xa9eujenTp8eMGTNiu+22q/b1owAAfPdtckG6xRZbxPnnnx9PPfVUTJ06NdasWRPbbbddXHjhhXHllVfGdtttl3pEAADq0CYXpJtttlncdtttqccAAKCBbHLHkAIAkF8EKQAASQlSAACSEqQAACQlSAEASEqQAgCQlCAFACApQQoAQFKCFACApAQpAABJCVIAAJISpAAAJCVIAQBISpACAJCUIAUAIClBCgBAUoIUAICkBCkAAEkJUgAAkhKkAAAkJUgBAEhKkAIAkJQgBQAgKUEKAEBSghQAgKQEKQAASQlSAACSEqQAACQlSAEASEqQAgCQlCAFACApQQoAQFKCFACApAQpAABJCVIAAJJqlHqAfJFdtzaymdRT5KfKVaknoHDVv1KPkNca39Q29Qh5bfMrF6ceIe9VTGuSeoS8VZAtiPgKv4dtIQUAIClBCgBAUoIUAICkBCkAAEkJUgAAkhKkAAAkJUgBAEhKkAIAkJQgBQAgKUEKAEBSghQAgKQEKQAASQlSAACSEqQAACQlSAEASEqQAgCQlCAFACApQQoAQFKCFACApAQpAABJCVIAAJISpAAAJCVIAQBISpACAJCUIAUAIClBCgBAUoIUAICkBCkAAEkJUgAAkhKkAAAkJUgBAEhKkAIAkJQgBQAgKUEKAEBSghQAgKQEKQAASQlSAACSEqQAACQlSAEASEqQAgCQlCD9NwsWLIhMJhMDBgxIPQoAQF4QpF9Bjx49IpPJpB4DACAnNUo9wKamXbt28cYbb0RxcXHqUQAA8oIg/TeNGzeOXXbZJfUYAAB5wy77f/Pvx5BmMpmYMmVK1T+vvznGFACgbthC+iWGDBkSw4cPj4ULF8aQIUOqHt9rr73SDQUAkEME6ZcoKSmJyZMnx8KFC6OkpORL1y8vL4/y8vKq+2VlZfU4HQDAd59d9nVs2LBhUVxcXHXr0KFD6pEAADZpgrSOXX755VFaWlp1W7RoUeqRAAA2aXbZ17GioqIoKipKPQYAwHeGLaQAACQlSL+CwsLCiIioqKhIPAkAQO4RpF9BixYtIiIcDwoAUA8cQ/oV9OrVK/7yl7/EySefHEcddVQ0adIkunTpEscdd1zq0QAAvvME6VdwwQUXxIIFC+L++++P6667LtatWxfnnnuuIAUAqAOC9N906tQpstlstccaNWoU1113XVx33XWJpgIAyF2OIQUAIClBCgBAUoIUAICkBCkAAEkJUgAAkhKkAAAkJUgBAEhKkAIAkJQgBQAgKUEKAEBSghQAgKQEKQAASQlSAACSEqQAACQlSAEASEqQAgCQlCAFACApQQoAQFKCFACApAQpAABJCVIAAJISpAAAJCVIAQBISpACAJCUIAUAIClBCgBAUoIUAICkBCkAAEkJUgAAkhKkAAAkJUgBAEhKkAIAkJQgBQAgKUEKAEBSghQAgKQEKQAASQlSAACSEqQAACQlSAEASKpR6gHyRjYbEdnUU+SlbEVF6hHyXuWHK1KPkNc2f7dp6hHyWrstPkk9Qt5btH371CPkrUxFecRbX76eLaQAACQlSAEASEqQAgCQlCAFACApQQoAQFKCFACApAQpAABJCVIAAJISpAAAJCVIAQBISpACAJCUIAUAIClBCgBAUoIUAICkBCkAAEkJUgAAkhKkAAAkJUgBAEhKkAIAkJQgBQAgKUEKAEBSghQAgKQEKQAASQlSAACSEqQAACQlSAEASEqQAgCQlCAFACApQQoAQFKCFACApAQpAABJCVIAAJISpAAAJCVIAQBISpACAJCUIAUAIClBCgBAUoIUAICkBCkAAEkJUgAAkhKkAAAkJUi/gkwmEz169Eg9BgBAThKkAAAkJUgBAEgqp4L07rvvjv333z+23HLL2HLLLWP//feP4cOHV1tn+PDhkclkajweETF58uTIZDJRUlJS7X5ExJQpUyKTyVTdans+AABfX6PUA9SViy66KG655ZZo165dnH/++RERMW7cuDjvvPNi1qxZ8Yc//OFrv2anTp1iyJAhMXTo0OjYsWMMGDCgatlee+1VR5MDAOS3nAjSqVOnxi233BK77rprvPDCC1FcXBwRESUlJdGtW7e4+eab45RTTolDDjnka71up06doqSkJIYOHVr1z1+mvLw8ysvLq+6XlZV9rfcE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olOnTvHpp5/GxRdfHG3bto2ioqLYc8894y9/+Uut779o0aI444wzokWLFrHlllvGoYceGlOnTt3gvP369Yvtt98+fvGLX8Rrr7327X54AAC+tjoJ0oqKipg4cWKcddZZ0aZNmzjvvPPixRdfjHPPPTf23nvvqvXmzp0b++yzT9x0002x0047xaBBg+Loo4+OiRMnRrdu3WL69Ok1Xnvt2rVx5JFHxt///vc4+eST4+yzz465c+dGv3794u9//3u1dd9///044IAD4v77748f/OAHcdFFF0WLFi3iiCOOiGnTptU6+89+9rNo3rx5/Pa3v43dd9899t5777jpppti2bJldfHRAADwJTLZbDb7TZ/88ssvx8iRI+O+++6LpUuXRuPGjePII4+M/v37R9++fWPzzTevtv5BBx0U06dPj0cffTR69+5d9ficOXNi3333jU6dOsUrr7xS9XinTp1i4cKFcfzxx8fYsWNjs802i4iIJ598Mg4//PDo3bt3TJw4sWr9AQMGxIgRI+Kaa66JX/3qV1WP33777XHhhRdGRMTTTz8dPXr0qPGzzJ49O+65554YPXp0LFmyJBo1alT1sxx//PE1fpYNKS8vj/Ly8qr7ZWVl0aFDh+gRx0ejTOOv9BoA5I7C1q1Sj5D3Hpv19y9fiXpRtrIymn9vXpSWlkazZs02uN7XDtIlS5bEfffdFyNHjoxXX301IiL233//OPvss+P000+PbbfdttbnzZo1K/bee+8YOHBg/PnPf66x/L//+7/jxhtvjFdffTV23333iPh/QTpv3rzYYYcdqq3fqVOnWLlyZaxYsSIiIj777LMoLi6OZs2axcKFC6NJkyZV61ZWVsYuu+wSb7/99gaD9IvrPvXUUzFq1Kh46KGHYuXKldGsWbM45ZRT4pxzzonu3btHJpPZ4PNLSkpi6NChNR4XpAD5SZCmJ0jT+apB2ujrvvBBBx0UCxYsiFatWsWQIUPi7LPPjs6dO3/p89bvMl+2bFmUlJTUWP7mm29W/e/6II2I2HrrrWvEaERE+/bt44UXXqi6/9Zbb8WaNWuiV69e1WI0IqKgoCAOOuigePvtt790zoKCgjj88MPj8MMPj//93/+Nhx9+OG6//fa466674q677oqHH344jj/++A0+//LLL49LL7206v76LaQAANTuawfp7rvvHgsWLIjly5fHxIkTY9ttt43TTjstWrZsudHnffTRRxER8eijj8ajjz66wfVWrVpV7X5xcXGt6zVq1Kja2fGlpaUREdGqVe1/E23duvVG5/t3FRUV8cwzz8TEiRNj5syZERGx7bbbRps2bTb6vKKioigqKvpa7wUAkM++9klNjzzySMyZMyeuuOKKWLZsWQwaNCjatm0bRx99dNx33301gnK99Ztpb7nllshmsxu8nXvuud/oB1kfrsuXL691+Vc9SenFF1+MSy65JNq3bx+9e/eOMWPGRJ8+fWL8+PGxZMmS2H///b/RfAAA1O4bnWW/8847x9VXXx3z5s2LKVOmxIABA+L555+Ps846K1q3bh1nn312TJgwIdatW1f1nPUh98Xd7HXpe9/7XjRp0iRmzpwZa9asqbassrIynn/++Q0+d968eXH11VfHLrvsEvvuu2/VVQD+7//+L5YuXRoPPPBA9O3bNxo3dgwoAEBd+1aXfcpkMtG9e/e44447YunSpTFmzJjo0aNHjBkzJo4++uho165d1aWcfvCDH8T+++8fo0ePjjFjxtR4rcrKypgyZco3nqWoqCj69esXy5cvjxtuuKHasjvvvDPmzJlT6/P69u0bO+20UwwePDgqKiqipKQk5s6dG88++2z86Ec/iq233vobzwQAwJf72seQbkiTJk2iX79+0a9fv/jggw/ivvvui1GjRsXSpUur1hk9enT07NkzTj/99Ljpppti7733js033zzefffdeOGFF+KDDz6osXXz67j22mvjySefjCuuuCKeffbZ6Nq1a7zxxhvx2GOPVV3L9N+999578eMf/zj69+8fBx544Dd+bwAAvpk6C9IvatmyZVx88cVx8cUXR0VFRdXjO+ywQ8yaNStuvPHGePjhh+Puu++OwsLC2G677aJ79+5xyimnfKv33W677eL555+Pn//85/H444/H1KlTY5999olJkybFU089VWuQ/uMf/4jCwsJv9b4AAHxz3+rC+Hy5srKyKC4udh1SgDzlOqTpuQ5pOl/1OqR1/l32AADwdQhSAACSEqQAACQlSAEASEqQAgCQlCAFACApQQoAQFKCFACApAQpAABJCVIAAJISpAAAJCVIAQBISpACAJCUIAUAIClBCgBAUoIUAICkBCkAAEkJUgAAkhKkAAAkJUgBAEhKkAIAkJQgBQAgKUEKAEBSghQAgKQEKQAASQlSAACSEqQAACQlSAEASEqQAgCQlCAFACApQQoAQFKCFACApAQpAABJCVIAAJISpAAAJCVIAQBISpACAJCUIAUAIClBCgBAUo1SDwAAuaxi2fLUI+S93m33Sj1C3lqXXRsR8750PVtIAQBISpACAJCUIAUAIClBCgBAUoIUAICkBCkAAEkJUgAAkhKkAAAkJUgBAEhKkAIAkJQgBQAgKUEKAEBSghQAgKQEKQAASQlSAACSEqQAACQlSAEASEqQAgCQlCAFACApQQoAQFKCFACApAQpAABJCVIAAJISpAAAJCVIAQBISpACAJCUIAUAIClBCgBAUoIUAICkBCkAAEkJUgAAkhKkAAAkJUgBAEhKkAIAkJQgBQAgKUEKAEBSghQAgKQEKQAASQlSAACSEqQAACQlSAEASEqQAgCQlCAFACApQQoAQFKCFACApAQpAABJNUo9QK4pLy+P8vLyqvtlZWUJpwEA2PTZQlrHhg0bFsXFxVW3Dh06pB4JAGCTlslms9nUQ+SS2raQdujQIXrE8dEo0zjhZAAADWtddm1MjvFRWloazZo12+B6dtnXsaKioigqKko9BgDAd4Zd9gAAJCVIAQBISpACAJCUIAUAIClBCgBAUoIUAICkBCkAAEkJUgAAkhKkAAAkJUgBAEhKkAIAkJQgBQAgKUEKAEBSghQAgKQEKQAASQlSAACSEqQAACQlSAEASEqQAgCQlCAFACApQQoAQFKCFACApAQpAABJCVIAAJISpAAAJCVIAQBISpACAJCUIAUAIClBCgBAUoIUAICkBCkAAEkJUgAAkhKkAAAkJUgBAEhKkAIAkJQgBQAgKUEKAEBSghQAgKQEKQAASQlSAACSEqQAACQlSAEASEqQAgCQlCAFACCpRqkHyHXZbDYiItbF2ohs4mEAABrQulgbEf+vhzZEkNazlStXRkTEs/FY4kkAANJYuXJlFBcXb3B5Jvtlycq3UllZGUuWLImtttoqMplM6nG+trKysujQoUMsWrQomjVrlnqcvOPzT8+fQVo+/7R8/mnlwuefzWZj5cqV0bZt2ygo2PCRoraQ1rOCgoJo37596jG+tWbNmn1n/2PIBT7/9PwZpOXzT8vnn9Z3/fPf2JbR9ZzUBABAUoIUAICkBCkbVVRUFEOGDImioqLUo+Qln396/gzS8vmn5fNPK58+fyc1AQCQlC2kAAAkJUgBAEhKkAIAkJQgBQAgKUEKAEBSghQAgKQEKQAASQlSAACS+v8BCdU/GTv/1mcAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# 잘못된 번역\n", "translate(u'trata de averiguarlo.')" ] }, { "cell_type": "markdown", "metadata": { "id": "RTe5P5ioMJwN" }, "source": [ "## 다음 단계\n", "\n", "* 앞서 영어-스페인어 데이터셋을 이용해 모델을 훈련하였습니다. 이제 영어-프랑스어, 영어-한국어 등의 [댜양한 다른 언어 데이터셋](http://www.manythings.org/anki/)을 활용하여 모델을 훈련시켜 보십시오.\n", "* 또한 이 예제에서는 데이터셋을 제한하여 모델을 만들어 보았습니다. 이제 더 많은 데이터셋 혹은 더 많은 에포크(epochs)를 적용하여 모델을 훈련해보십시오.\n" ] } ], "metadata": { "accelerator": "GPU", "colab": { "collapsed_sections": [], "name": "nmt_with_attention.ipynb", "toc_visible": true }, "kernelspec": { "display_name": "Python 3", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.16" } }, "nbformat": 4, "nbformat_minor": 0 }