Repository: milaan9/Clustering_Algorithms_from_Scratch Branch: main Commit: 2dcef05b087a Files: 60 Total size: 15.5 MB Directory structure: gitextract_1u4gek_a/ ├── 01_MATLAB/ │ ├── Clustering.m │ ├── README.md │ ├── data/ │ │ ├── toy_clustering.mat │ │ └── toy_subspace_clustering.mat │ ├── lib/ │ │ ├── DBSCAN.m │ │ ├── Entropy_Weighting_Subspace_Kmeans.m │ │ ├── Gaussian_Mixture.m │ │ ├── ISODATA.m │ │ ├── Kmeans.m │ │ ├── Kmeanspp.m │ │ ├── LVQ.m │ │ ├── Mean_Shift.m │ │ └── Subspace_Kmeans.m │ └── tool/ │ ├── GenerateDataset.m │ └── PlotData.m ├── 02_Python/ │ ├── A_Star.py │ ├── Collaborative_Filtering.py │ ├── DBSCAN.py │ ├── Decision_Trees.py │ ├── Dimensionality_Reduction/ │ │ └── Dimensionality_Reduction.ipynb │ ├── Discrete_Cosine_Transform_(DCT)/ │ │ └── Discrete_Cosine_Transform.ipynb │ ├── FP_Growth.py │ ├── Genetic_Algorithm.py │ ├── K-Means_Implementation/ │ │ ├── Iris.csv │ │ ├── K-Means_Clustering_on_Iris_Dataset.ipynb │ │ ├── Links.txt │ │ └── README.md │ ├── K_Means.py │ ├── K_Nearest_Neighbours.py │ ├── K_Nearest_Neighbours_In_Parallel.py │ ├── Linear_Regression.py │ ├── Logistic_Regression.py │ ├── MSCRED/ │ │ ├── cnn_lstm/ │ │ │ ├── Untitled.ipynb │ │ │ ├── __init__.py │ │ │ ├── convlstm-update.py │ │ │ ├── convlstm.ipynb │ │ │ ├── convlstm.py │ │ │ ├── evaluation.ipynb │ │ │ ├── evalution.py │ │ │ ├── generation_signature_matrice.ipynb │ │ │ ├── generation_signature_matrice.py │ │ │ ├── report.txt │ │ │ └── utils.py │ │ └── data/ │ │ └── synthetic_data_with_anomaly-s-1.csv │ ├── Mean_Shift.py │ ├── Naive_Bayes.py │ ├── README.md │ ├── Random_Forest_Classifier.py │ ├── Support_Vector_Machine.py │ └── data/ │ ├── chronic_kidney_disease.csv │ ├── concentric_circles.csv │ ├── cron_jobs_schedule.csv │ ├── graph.in │ ├── ipl.csv │ ├── iris.csv │ ├── logistic_regression_data.txt │ ├── titanic-subset.csv │ └── titanic.csv ├── LICENSE └── README.md ================================================ FILE CONTENTS ================================================ ================================================ FILE: 01_MATLAB/Clustering.m ================================================ function [centroid, result] = Clustering(data, method, varargin) % Currently, following clustering algorithms are supported: % 1. Kmeans % 2. Kmeans++ % 3. ISODATA (Iterative Self-Organizing Data Analysis) % 4. Mean Shift % 5. DBSCAN (Density-Based Spatial Clustering of Application with Noise) % 6. Gaussian Mixture Model /* Numerical instability problem not completely solved*/ % 7. LVQ (Learning Vector Quantization) addpath('.\lib'); addpath('.\tool'); % Validate input parameters if((strcmp(method,'kmeans') || strcmp(method,'kmeans++')) && (size(varargin,2) ~= 2)) error('The value of K should be predefined when using k-means and k-means++.'); elseif((strcmp(method,'isodata') || strcmp(method,'ISODATA')) && (size(varargin,2) < 5)) error('Not enough input arguments for ISODATA. Please use help for more information.'); elseif((strcmp(method,'mean_shift') || strcmp(method,'Mean_Shift')) && (size(varargin,2) ~= 1)) error('Invalid number of input arguments for mean shift.'); elseif((strcmp(method,'dbscan') || strcmp(method,'DBSCAN')) && (size(varargin, 2) ~= 2)) error('Invalid number of input arguments for dbscan.'); elseif((strcmp(method,'GMM') || strcmp(method,'gmm')) && (size(varargin, 2) ~= 2)) error('Invalid number of input arguments for Gaussian Mixture Model'); elseif((strcmp(method,'LVQ') || strcmp(method,'lvq')) && (size(varargin, 2) ~= 5)) error('Invalid number of input arguments for Learning Vector Quantization'); end % Method entries % Kmeans if(strcmp(method,'kmeans')) k = varargin{1,1}; iteration = varargin{1,2}; [centroid, result] = Kmeans(data, k, iteration); PlotData(data, result, centroid); % Kmeans++ elseif(strcmp(method,'kmeans++') || strcmp(method,'kmeanspp')) k = varargin{1,1}; iteration = varargin{1,2}; [centroid, result] = Kmeanspp(data, k, iteration); PlotData(data, result, centroid); % ISODATA elseif(strcmp(method,'ISODATA') || strcmp(method,'isodata')) desired_k = varargin{1,1}; % desired number of classes iteration = varargin{1,2}; % maximum iteration time minimum_n = varargin{1,3}; % minimum number of samples in one class maximum_variance = varargin{1,4}; % maximum allowed variance of samples in one class minimum_d = varargin{1,5}; % minimum distance between two classes [centroid, result] = ISODATA(data, iteration, desired_k, minimum_n, maximum_variance, minimum_d); PlotData(data, result, centroid); % Mean Shift elseif(strcmp(method,'mean_shift') || strcmp(method,'Mean_Shift')) thr = varargin{1,1}; % distance threshold [centroid, result] = Mean_Shift(data, thr); PlotData(data, result, centroid); % DBSCAN elseif(strcmp(method,'dbscan') || strcmp(method,'DBSCAN')) epsilon = varargin{1,1}; % distance threshold for finding neighbors minPts = varargin{1,2}; % minimum required number of neighbor points for adding one core object centroid = nan; % DBSCAN will not calculate centroid result = DBSCAN(data, epsilon, minPts); PlotData(data, result); % Gaussian Mixture Model elseif(strcmp(method,'GMM') || strcmp(method,'gmm')) k = varargin{1,1}; % the number of Guassian components iter = varargin{1,2}; % maximum number of iterations [result, ~, centroid, ~] = Gaussian_Mixture(data, k, iter); PlotData(data, result, centroid); % Learning Vector Quantization elseif(strcmp(method,'LVQ') || strcmp(method,'lvq')) q = varargin{1,1}; % the number of prototypes neta = varargin{1,2}; % learning rate x = varargin{1,3}; % training data y = varargin{1,4}; % label of x iter = varargin{1,5}; % maximum number of iterations [centroid, result] = LVQ(data, q, neta, x, y, iter); PlotData(data, result, centroid); else error('NotImplementedError!'); end end ================================================ FILE: 01_MATLAB/README.md ================================================

Last Commit

# Clustering Algorithms with MATLAB ## 1. Clustering Algorithms - **K-means** - **K-means** algorithm performs the division of data points into 'K' clusters that share similarities and are dissimilar to the objects belonging to another cluster where, each data point belongs to the cluster with the nearest mean (cluster centers or cluster centroids), serving as a prototype of the cluster. The term 'K' is a number. You need to tell the system how many clusters you need to create. For example, K = 2 refers to two clusters. - **K-means++** - Generally speaking, **K-means++** algorithm is similar to **K-means**; - Unlike classic K-means randomly choosing initial centroids, a better initialization procedure is integrated into **K-means++**, where observations far from existing centroids have higher probabilities of being chosen as the next centroid. - The initializeation procedure can be achieved using Fitness Proportionate Selection. - **ISODATA (Iterative Self-Organizing Data Analysis)** - To be brief, **ISODATA** introduces two additional operations: Splitting and Merging; - When the number of observations within one class is less than one pre-defined threshold, **ISODATA** merges two classes with minimum between-class distance; - When the within-class variance of one class exceeds one pre-defined threshold, **ISODATA** splits this class into two different sub-classes. - **Mean Shift** - For each point *x*, find neighbors, calculate mean vector *m*, update *x = m*, until *x == m*; - Non-parametric model, no need to specify the number of classes; - No structure priori. - **DBSCAN (Density-Based Spatial Clustering of Application with Noise)** - Starting with pre-selected core objects, DBSCAN extends each cluster based on the connectivity between data points; - DBSCAN takes noisy data into consideration, hence robust to outliers; - Choosing good parameters can be hard without prior knowledge; - **Gaussian Mixture Model (GMM)** - **LVQ (Learning Vector Quantization)** ## 2. Subspace Clustering Algorithms - **Subspace K-means** - This algorithm directly extends **K-means** to Subspace Clustering through multiplying each dimension *dj* by one weight *mj* (s.t. sum(*mj*)=1, *j*=1,2,...,*p*); - It can be efficiently sovled in an Expectation-Maximization (EM) fashion. In each E-step, it updates weights, centroids using Lagrange Multiplier; - This rough algorithm suffers from the problem on its favor of using just a few dimensions when clustering sparse data; - **Entropy-Weighting Subspace K-means** - Generally speaking, this algorithm is similar to **Subspace K-means**; - In addition, it introduces one regularization item related to weight entropy into the objective function, in order to mitigate the aforementioned problem in **Subspace K-means**. - Apart from its succinctness and efficiency, it works well on a broad range of real-world datasets. ================================================ FILE: 01_MATLAB/lib/DBSCAN.m ================================================ function label = DBSCAN(data, eps, minPts) % label = DBSCAN(data, epsilon, minPts) % Main part of DBSCAN (Density-Based Spatial Clustering of Application with % Noise)clustering algorithm. % ---- % Args: % data: data to be clustered (n * p) % eps: distance threshold for finding neighbors % minPts: minimum required number of neighbor observations for one core object % ---- % Returns: % label: corresponding class for each observation % Initialization core_object = []; count = 1; k = 1; % label index vmask = ones(size(data, 1), 1); % variable used to record whether one observation has been visited (1: not visited, 0: visited) label = zeros(size(data, 1), 1); % pre-allocate result % Find core objects for i = 1:size(data, 1) x = data(i, :); % current observation of interests [~, neighbors] = Find_Neighbor(data, x, eps); % Check if the number of observations in neighbors of x is larger than minPts if((size(neighbors,1)-1) >= minPts) % Add the index of x to the set of core object core_object(count, 1) = i; count = count + 1; end end fprintf('---- DBSCAN finds a total number of %i core objects ----\n', size(core_object, 1)); while(~isempty(core_object)) % Construct one queue for further use queue = []; qcount = 1; % Update core_object, observations have been visited should be deleted tcount = 1; list = []; for i = 1:size(core_object, 1) if(vmask(core_object(i, 1),1) == 0) list(tcount ,1) = i; tcount = tcount + 1; end end core_object(list,:) = []; if(isempty(core_object)) break; end % Randomly choose one core object index = core_object(randi(size(core_object, 1)), 1); queue(qcount, 1) = index; % add the selected core object to the queue qcount = qcount + 1; vmask(index, 1) = 0; % update vmask label(index, 1) = k; % assign result core_object(core_object == index, :) = []; % remove the selected core object from the set while(~isempty(queue)) pivot = queue(1, 1); queue(1, :) = []; % remove the first element in queue qcount = qcount - 1; % Find neighbors for current observation of interests [tindex, tneighbors] = Find_Neighbor(data, data(pivot, :), eps); if(size(tneighbors, 1) >= minPts) for i = 1 : size(tindex, 1) % If one neighbor has not been visited, add it to the queue if(vmask(tindex(i, 1),1) == 1) queue(qcount, 1) = tindex(i, 1); qcount = qcount + 1; vmask(tindex(i, 1),1) = 0; % update vmask label(tindex(i, 1),1) = k; % assign result end end end end fprintf('---- Finish finding observations for class %i ----\n', k); k = k + 1; % next class end end function d = Eculidean_Distance(x1, x2) % Calculate eculidean distance between x1 and x2. % % Args: % x1: observation 1 % x2: observation 2 % % Returns: % d: Eculidean distance between x1 and x2 d = sqrt((x1 - x2) * (x1 - x2)'); end function [index, neighbors] = Find_Neighbor(data, x, eps) % Find neighbors for x, where neighbors are defined to be observations in data % with eculidean distance from x smaller than epsilon. % % Args: % data: dataset % x: current observation of interests % eps: pre-defined distance threshold % % Returns: % index: the index of these neighbors in data % neighbors: neighbor set of x neighbors = []; % pre-allocate neighbor result count = 1; for i = 1 : size(data,1) d = Eculidean_Distance(data(i,:), x); if(d <= eps) index(count, 1) = i; neighbors(count,:) = data(i,:); count = count + 1; end end end ================================================ FILE: 01_MATLAB/lib/Entropy_Weighting_Subspace_Kmeans.m ================================================ function [centroid, dimension_weight, class] = Entropy_Weighting_Subspace_Kmeans(data, iteration, K, beta, lambda, verbose) % Pre-allocate weights centroid = zeros(K,size(data,2)); % centroid for each class class = zeros(size(data,1),1); % classification result for each observation dimension_weight = ones(K,size(data,2)); % weights for each dimension in each class % Initialization n = size(data,1); J = 0; % used to record objective function value % First round centroid = data(unidrnd(n,K,1),:); % randomly choose K initial centroids dimension_weight = 1/size(data,2) * dimension_weight; % initialize weights for each dimension using uniform distribution % Partially optimization for i = 1:iteration J0 = J; % body part class = classify(centroid,dimension_weight,data); centroid = centroid_update(centroid,data,class); [dimension_weight,J] = dimension_weight_update(K,centroid,class,dimension_weight,data,beta,lambda); % whether display intermediate information if(verbose == 1) disp(['Objective Function(J) Value: ',num2str(J)]); end % early stop condition if(abs(J-J0)<1e-9) fprintf('*** Clustering terminates after %i iterations ***\n',i); break; end end end % Details on the scheme of updating dimension weights function [alpha,J] = dimension_weight_update(K,m,c,alpha,data,beta) % Under writting... end function [result] = classify(m,alpha,data) result = zeros(size(data,1),1); % Construct temporary matrix for efficiently computing dimention-weighted distance matrix = zeros(size(m,1),size(data,2)); for i = 1:size(result,1) for j = 1:size(m,1) matrix(j,:) = (m(j,:)-data(i,:)) .* (m(j,:)-data(i,:)); end temp = sum(alpha .* matrix,2); % To avoid more than one class having the minimum distance. t_index = find(temp == min(temp)); result(i,1) = t_index(1,1); end end function [m] = centroid_update(m,data,c) for i = 1:size(m,1) if(~isempty(data(c==i,:))) m(i,:) = mean(data(c==i,:),1); else continue; end end end ================================================ FILE: 01_MATLAB/lib/Gaussian_Mixture.m ================================================ function [label, alpha, miu, sigma] = Gaussian_Mixture(data, k, iter) % function [label, alpha, miu, sigma] = Gaussian_Mixture(data, k) % Use gaussian mixture model (GMM) to conduct data clustering. GMM uses % probability model to characterize prototypes for each class. % ---- % Args: % data: data to be clustered (n * p) % k: the number of guassian components (scalar) % iter: maximum number of iterations (scalar) % ---- % Returns: % label: corresponding class for each observation (n * 1) % alpha: mixing coefficient for each gaussian component (k * 1) && (sum(alpha) == 1) % miu: mean value for each gaussian component (k * p) % sigma: coefficient matrix for each gaussian component (cell: k * n * n) % Initialization alpha = ones(k, 1) / k; miu = data(randperm(size(data,1),k)',:); for i = 1 : k sigma{i, 1} = rand * eye(size(data, 2)); end label = zeros(size(data, 1), 1); p = Posteriori(data, k, alpha, miu, sigma); % calculate posteriori probability for i = 1 : iter % M-Step for j = 1 : k sump = sum(p(:, j)); % Update parameters tmiu = zeros(1, size(data, 2)); for num = 1 : size(data, 1) tmiu = tmiu + p(num, j) * data(num, :); end miu(j, :) = tmiu / sump; tsigma = zeros(size(data, 2)); for num = 1 : size(data, 1) tsigma = tsigma + p(num, j) * (data(num, :) - miu(j, :))' * (data(num, :) - miu(j, :)); end sigma{j, 1} = tsigma / sump; alpha(j, 1) = sump / size(data, 1); % mixing coefficient end % E-Step p = Posteriori(data, k, alpha, miu, sigma); end [~, label] = max(p,[], 2); % classification end function p = Posteriori(data, k, alpha, miu, sigma) % function p = Posteriori(data, alpha, miu, sigma) % Calculate posteriori probability for each observation and each class. The % output p is of the size n * p, the entry (i,j) represents the probability % that observation i belongs to class j. % ---- % Args: % data, k, alpha, miu, sigma: same to the function Gaussian_Mixture % ---- % Returns: % p: posteriori probability for each observation and each class (n * k) % Pre-allocate result p = zeros(size(data, 1), k); for i = 1 : size(data, 1) sump = 0; % normalizing factor for j = 1 : k tx = data(i, :) - miu(k, :); % x - miu sigma{j,1} = sigma{j,1} + 1e-6*eye(size(data,2)); % for numerical stability inv_sigma = inv(sigma{j, 1}); upper = -0.5 * tx * inv_sigma * tx'; p(i, j) = alpha(j, 1) * exp(upper) / sqrt((2*pi)^(size(data,2))*abs(det(sigma{j,1}))); sump = sump + p(i, j); end p(i, :) = p(i, :) / sump; end end ================================================ FILE: 01_MATLAB/lib/ISODATA.m ================================================ function [centroid, result] = ISODATA(data, iteration, desired_k, minimum_n, maximum_variance, minimum_d) % Pre-allocate result centroid = data(randperm(size(data,1),desired_k)', :); distance_matrix = zeros(size(data,1), desired_k); result = zeros(size(data,1),1); for i = 1 : iteration previous_centroid = centroid; for j = 1 : size(distance_matrix,1) for k = 1 : size(distance_matrix,2) distance_matrix(j,k) = sqrt(sum((data(j,:)-centroid(k,:)) .^ 2)); end end [~,result] = min(distance_matrix,[],2); % Whether the number of points in each class is smaller than minimum_n for j = 1 : size(centroid, 1) if(isempty(find(result == j,1)) || (size(find(result == j),1) < minimum_n)) % One class with number of points in it less than minimum_n % should be deleted, along with records in the distance_matrix centroid(j,:) = []; distance_matrix(:,j) = []; % Re-assign each point to its closet neighbor class [~,result] = min(distance_matrix,[],2); % Recalculate centroids for k = 1:size(centroid,1) centroid(k,:) = mean(data(result(:,1) == k,:)); end end end % Check if combining and splitting are needed % Case 1: too few classes if(size(centroid,1) <= (desired_k/2)) % Split [centroid] = ISODATA_split(data, centroid, result, minimum_n, maximum_variance); % Case 2: too many classes elseif(size(centroid,1) > (2*desired_k)) % Combine [centroid] = ISODATA_combine(centroid, result, minimum_d); end if(previous_centroid == centroid) fprintf('Clustering over after %i iterations...\n', i); break; end end end % Splitting function [centroid] = ISODATA_split(data, centroid, current_result, minimum_n, maximum_variance) [centroid_x, centroid_y] = size(centroid); variance_matrix = zeros(centroid_x, centroid_y); % pre-allocate the variance matrix for i = 1 : centroid_x for j = 1 : centroid_y variance_matrix(i,j) = var(data(current_result == i,j)); end end class_variance = max(variance_matrix,[],2); % find the greatest one-dimension variance per class for i = 1 : centroid_x if((class_variance(i,1) > maximum_variance) && size(find(current_result == i),1) > (2*minimum_n)) % The current class should be splitted into two different classes centroid(i,:) = centroid(i,:) + sqrt(maximum_variance); centroid(end+1,:) = centroid(i,:) - sqrt(maximum_variance); % add one new class to centroid set end end end % Combining function [centroid] = ISODATA_combine(centroid, current_result, minimum_d) centroid_x = size(centroid,1); class_distance_matrix = zeros(centroid_x, centroid_x); % Calculate distances between two different classes for i = 1 : x for j = 1 : x if(i ~= j) class_distance_matrix(i,j) = sqrt(sum((centroid(i,:)-centroid(j,:)) .^ 2)); end end end % Combining two classes for i = 1 : x for j = 1 : x if((i ~= j) && (class_distance_matrix(i,j) < minimum_d)) n1 = size(find(current_result == i),1); n2 = size(find(current_result == j),1); centroid(i,:) = (1/(n1+n2)) * (n1 * centroid(i,:) + n2 * centroid(j,:)); centroid(j,:) = []; break; % the number of combining operation is limited to 1 within each iteration end end end end ================================================ FILE: 01_MATLAB/lib/Kmeans.m ================================================ function [centroid, class] = Kmeans(data, k, iteration) % Main part of Kmeans clustering algorithm. % % Args: % data: data to be clustered (n * p) % k: the number of classes % iteration: maximum number of iterations % % Returns: % centroid: clustering centroids for all classes % class: corresponding class for all samples % Choose k initial centroids randomly centroid = data(randperm(size(data,1),k)', :); % Record distances between samples and centroids distance_matrix = zeros(size(data,1), k); % Pre-allocate result class = zeros(size(data,1),1); for i = 1:iteration previous_result = class; % for early termination % Calculate eculidean distance between each sample and each centroid for j = 1:size(distance_matrix,1) for k = 1:size(distance_matrix,2) distance_matrix(j,k) = sqrt((data(j,:)-centroid(k,:)) * (data(j,:)-centroid(k,:))'); end end % Assign each sample to the nearest controid [~,class] = min(distance_matrix,[],2); % Recalculate centroids for j = 1:k centroid(j,:) = mean(data(class(:,1) == j,:)); end % Display fprintf('---- %ith iteration completed ----\n',i); % If classified results on all points do not change after an iteration, % the clustering process will quit immediately. if(class == previous_result) fprintf('**** Clustering over after %i iterations ****\n',i); break; end end end ================================================ FILE: 01_MATLAB/lib/Kmeanspp.m ================================================ function [centroid, class] = Kmeanspp(data, k, iteration) % Main part of Kmeans clustering algorithm. % % Args: % data: data to be clustered (n * p) % k: the number of classes % iteration: maximum number of iterations % % Returns: % centroid: clustering centroids for all classes % class: corresponding class for all samples % Choose the first inital centroid randomly centroid = data(randperm(size(data,1),1)',:); % Select remaining initial centroids (a total number of k-1) for i = 2:k distance_matrix = zeros(size(data,1),i-1); for j = 1:size(distance_matrix,1) for p = 1:size(distance_matrix,2) distance_matrix(j,p) = sum((data(j,:)-centroid(p,:)) .^ 2); end end % Choose next centroid according to distances between points and % previous cluster centroids. index = Roulettemethod(distance_matrix); centroid(i,:) = data(index,:); clear distance_matrix; end % Following steps are same to kmeans class = zeros(size(data,1),1); distance_matrix = zeros(size(data,1), k); for i = 1:iteration previous_result = class; % for early termination % Calculate eculidean distance between each sample and each centroid for j = 1:size(distance_matrix,1) for k = 1:size(distance_matrix,2) distance_matrix(j,k) = sqrt((data(j,:)-centroid(k,:)) * (data(j,:)-centroid(k,:))'); end end % Assign each sample to the nearest controid [~,class] = min(distance_matrix,[],2); % Recalculate centroids for j = 1:k centroid(j,:) = mean(data(class(:,1) == j,:)); end % Display fprintf('---- %ith iteration completed---- \n',i); % If classified results on all points do not change after an iteration, % the clustering process will quit immediately. if(class == previous_result) fprintf('**** Clustering over after %i iterations ****\n',i); break; end end end function [index] = Roulettemethod(distance_matrix) % Find shortest distance between one sample and its closest cluster centroid [min_distance,~] = min(distance_matrix,[],2); % Normalize for further operations min_distance = min_distance ./ sum(min_distance); % Construct roulette according to min_distance temp_roulette = zeros(size(distance_matrix,1),1); for i = 1:size(distance_matrix,1) temp_roulette(i,1) = sum(min_distance(1:i,:)); end % Generate a random number for selection temp_rand = rand(); % Find the corresponding index for i = 1:size(temp_roulette,1) if((i == 1) && temp_roulette(i,1) > temp_rand) index = 1; elseif((temp_roulette(i,1) > temp_rand) && (temp_roulette(i-1,1) < temp_rand)) index = i; end end end ================================================ FILE: 01_MATLAB/lib/LVQ.m ================================================ function [centroid, label] = LVQ(data, q, neta, x, y, iter) % function [centroid, label] = LVQ(data, q, x, y) % Unlike Kmeans, LVQ (Learning Vector Quantization) use labelled data % to help clustering.After using LVQ, the feature space is split into % a voronoi mesh. % ---- % Args: % data: data to be clustered (n * p) % q: the number of prototypes (scalar) % neta: learning rate % x: training data (? * p, '?' is the size of training data) % y: label of training data (? * 1) % iter: maximum number of iterations (scalar) % ---- % centroid: clustering centroids (q * p) % label: corresponding class for each observation (n * 1) % Initialization centroid = x(randperm(size(x,1),q)', :); % randomly select q observations as initial prototypes label = zeros(size(data, 1), 1); for i = 1 : iter s = randperm(size(x,1),1); % ramdomly select one training sample tx = x(s, :); % Calculate the distance between tx and all prototypes distance = zeros(q, 1); for j = 1 : q distance(j, 1) = Eculidean_Distance(tx, centroid(j, :)); end [~, index] = min(distance); % find the index of the nearest prototype % Update the prototype if(index == y(s, 1)) centroid(index, :) = centroid(index, :) + neta * (tx - centroid(index, :)); else centroid(index, :) = centroid(index, :) - neta * (tx - centroid(index, :)); end end % Classification for i = 1 : size(data, 1) tx = data(i, :); distance = zeros(q, 1); for j = 1 : q distance(j, 1) = Eculidean_Distance(tx, centroid(j, :)); end [~, index] = min(distance); % find the index of the nearest prototype label(i, 1) = index; end end function d = Eculidean_Distance(x1, x2) % Calculate eculidean distance between x1 and x2. % % Args: % x1: observation 1 % x2: observation 2 % % Returns: % d: Eculidean distance between x1 and x2 d = sqrt((x1 - x2) * (x1 - x2)'); end ================================================ FILE: 01_MATLAB/lib/Mean_Shift.m ================================================ function [centroid, result] = Mean_Shift(data, thr) % Main part of mean shift clustering algorithm. % % Args: % data: data to be clustered (n * p) % thr: distance threshold used to find neighbors % % Returns: % centroids: clustering centroids for all classes % result: corresponding class for each data point % % Comment: % Note that there is no need to specify the number of classes in mean % shift. In this function , I first record the destination point after % shifting for each data point. Data points with same destination point % are considered to be in the same class. destination = zeros(size(data)); % variable used to record destination points result = zeros(size(data,1),1); % pre-allocate classifying result % Conduct shift for each data point for i = 1 : size(data,1) x = data(i, :); % current point of interests mv_new = x; mv_old = x * 10; while(Eculidean_Distance(mv_new, mv_old) ~= 0) mv_old = mv_new; neighbors = Find_Neighbor(data, x, thr); mv_new = Mean_Vector(neighbors, x, thr, '0/1'); % other weighting mechanisms are under writing end destination(i, :) = mv_new; % display fprintf('Shifting for %ith point finishes\n', i); end centroid = unique(destination, 'rows'); % Calssification for i = 1 : size(centroid,1) mask = destination == centroid(i,:); % logical index mask = mask(:,1); result(mask, 1) = i; end % Display fprintf('Clustering over, a total number of %i classes\n', size(centroid,1)); end function d = Eculidean_Distance(x1, x2) % Calculate eculidean distance between x1 and x2. % % Args: % x1: point1 % x2: point2 % % Returns: % d: Eculidean distance between x1 and x2 d = sqrt((x1 - x2) * (x1 - x2)'); end function mv = Mean_Vector(neighbors, x, thr, method) % Use neighbor set to calculate the mean vector for x. % % Args: % neighbors: neighbor set of x % x: current point of interests % thr: distance threshold. In this case, also standrad deviation of Gaussean kernal % method: weighting mechanism ('0/1' or 'Gaussian') % % Returns: % mv: mean vector of x flag = 1; % method index % Check designated weighting machanism if(strcmp(method, '0/1')) flag = 0; elseif(strcmp(method, 'Gaussian') || strcmp(method, 'gaussian')) flag = 1; else fprintf('Unknown method, use default Gaussian weighting mechanism\n') end mv = zeros(1, size(x,2)); % pre-allocate result % Calculate mean vector if(flag == 0) mv = mean(neighbors, 1); elseif(flag == 1) denominator = 0; for i = 1 : size(neighbors,1) weight = exp(-(Eculidean_Distance(neighbors(i,:), x)^2) / (2*thr^2)); denominator = denominator + weight; mv = mv + weight * neighbors(i, :); end mv = mv / denominator; end end function neighbors = Find_Neighbor(data, x, thr) % Find neighbors for x, where neighbors are defined to be points in data % with eculidean distance from x smaller than thr. % % Args: % data: all data points % x: current point of interests % thr: pre-defined distance threshold % % Returns: % neighbors: neighbor set of x neighbors = []; % pre-allocate neighbor result count = 1; for i = 1 : size(data,1) d = Eculidean_Distance(data(i,:), x); if(d <= thr) neighbors(count,:) = data(i,:); count = count + 1; end end end ================================================ FILE: 01_MATLAB/lib/Subspace_Kmeans.m ================================================ function [centroid, dimension_weight, class] = Subspace_Kmeans(data, iteration, K, beta, verbose) % Pre-allocate weights centroid = zeros(K,size(data,2)); % centroid for each class class = zeros(size(data,1),1); % classification result for each observation dimension_weight = ones(K,size(data,2)); % weights for each dimension in each class % Initialization n = size(data,1); J = 0; % used to record objective function value % First round centroid = data(unidrnd(n,K,1),:); % randomly choose K initial centroids dimension_weight = 1/size(data,2) * dimension_weight; % initialize weights for each dimension using uniform distribution % Partially optimization for i = 1:iteration J0 = J; % body part class = classify(centroid,dimension_weight,data); centroid = centroid_update(centroid,data,class); [dimension_weight,J] = dimension_weight_update(K,centroid,class,dimension_weight,data,beta); % whether display intermediate information if(verbose == 1) disp(['Objective Function(J) Value: ',num2str(J)]); end % early stop condition if(abs(J-J0)<1e-9) fprintf('*** Clustering terminates after %i iterations ***\n',i); break; end end end % Details on the scheme of updating dimension weights function [alpha,J] = dimension_weight_update(K,m,c,alpha,data,beta) all_matrix = zeros(size(data,1),size(data,2)); for i = 1:size(data,1) all_matrix(i,:) = (m(c(i,1),:)-data(i,:)) .* (m(c(i,1),:)-data(i,:)); end J = 0; for i = 1:K class_matrix = all_matrix(c==i,:); % pick out data in all_matrix that corresponds to class i t_sum = sum(class_matrix,1) + 1e-9; % adding a small positive constant to make weights computatable J = J + (alpha(i,:).^beta) * t_sum'; if(size(class_matrix,1)>0) for j = 1:size(alpha,2) % variables used to avoid redundant calculation tt_numerator = t_sum(1,j); t_denominator = sum(tt_numerator./t_sum,2); alpha(i,j) = 1/((t_denominator+1e-9)^(1/(beta-1))); end else continue; end end % Normalize for i = 1:size(alpha,1) alpha(i,:) = alpha(i,:)./(sum(alpha(i,:),2)); end end function [result] = classify(m,alpha,data) result = zeros(size(data,1),1); % Construct temporary matrix for efficiently computing dimention-weighted distance matrix = zeros(size(m,1),size(data,2)); for i = 1:size(result,1) for j = 1:size(m,1) matrix(j,:) = (m(j,:)-data(i,:)) .* (m(j,:)-data(i,:)); end temp = sum(alpha .* matrix,2); % To avoid more than one class having the minimum distance. t_index = find(temp == min(temp)); result(i,1) = t_index(1,1); end end function [m] = centroid_update(m,data,c) for i = 1:size(m,1) if(~isempty(data(c==i,:))) m(i,:) = mean(data(c==i,:),1); else continue; end end end ================================================ FILE: 01_MATLAB/tool/GenerateDataset.m ================================================ function dataset = GenerateDataset(n, p, k, pd, varargin) % dataset = GenerateDataset(n, p, k, pd, varargin) % Generate synthetic dataset for further use. % ---- % Args: % n: the number of samples in each class (scalar) % p: the number of features (scalar) % k: the number of classes (scalar) % pd: probability distribution of generated data (string) % varargin: parameters on p % ---- % Returns: % dataset: generated dataset % Pre-allocate dataset to avoid memory overflow dataset = zeros(n * k, p); % Generate dataset from gaussian distribution if((strcmp(pd, 'Gaussian')) || strcmp(pd, 'gaussian')) % Get parameters on gaussian distribution mu = varargin{1, 1}; % (k * p) sigma = varargin{1, 2}; % (k * p) for i = 1 : k dataset(n*(i-1)+1:n*i, :) = mvnrnd(mu(i,:), sigma(i,:), n); end end % Random permutation dataset = dataset(randperm(size(dataset, 1)), :); end ================================================ FILE: 01_MATLAB/tool/PlotData.m ================================================ function PlotData(data, label, varargin) % PlotData(data, label, varargin) % Plot data, with different classes correspond to different colors. % ---- % Args: % data: original data (n * p) % label: clustering result (n * 1), '-1' in label corresponds to noisy data % varargin{1,1}: clustering centroid (k * p), k the number of classes % varargin{1,...}: other parameters % ---- % Returns: isc = 0; % whether plot centroid k = max(label); % the number of classes p = size(data ,2); % the number of features if(~isempty(varargin)) isc = 1; centroid = varargin{1, 1}; end if((p > 3) || (p < 1)) error('Unable to plot data exceeds 3-deminsion'); end % Data if(p == 2) for i = 1 : k scatter(data(label==i,1), data(label==i,2), 'filled', 'DisplayName', strcat('Class-',num2str(i))); hold on; end elseif(p == 3) for i = 1 : k scatter3(data(label==i,1), data(label==i,2), data(label==i,3), 'filled', 'DisplayName', strcat('Class-',num2str(i))); hold on; end end % Centroid if(isc == 1) if(p == 2) scatter(centroid(:,1), centroid(:,2), 150, 'd', 'filled', 'DisplayName', 'Centroid'); elseif(p == 3) scatter3(centroid(:,1), centroid(:,2), centroid(:,3), 150, 'd', 'filled', 'DisplayName', 'Centroid'); end end % Legend if(k < 10) legend('show'); end % Others grid on; end ================================================ FILE: 02_Python/A_Star.py ================================================ #!/usr/bin/env python3 #================================================================================================================ #---------------------------------------------------------------------------------------------------------------- # A STAR #---------------------------------------------------------------------------------------------------------------- #================================================================================================================ import sys import queue # each Node in the Graph class Node: def __init__(self, key, i, j): # Utility to easily check for presence in openList/ClosedList self.__key = key # Priority by which it is inserted to OpenList self.__priority = 0.0 # Distance Travelled till current node self.__distFromStart = 0 # set of neighbor nodes self.__neighbors = set() # node from which this was visited self.__parent = None self.__traversable = False # required for calculating heuristic # also used as key in graph.nodes self.__pos = (i, j) def addNeighbor(self, node): self.__neighbors.add(node) def setTraversability(self, isTraversable): self.__traversable = isTraversable def isTraversable(self): return self.__traversable def getKey(self): return self.__key def getPos(self): return self.__pos def setPriority(self, newPriority): self.__priority = newPriority def getPriority(self): return self.__priority def setParent(self, parent): self.__parent = parent def getParent(self): return self.__parent; def getDistFromStart(self): return self.__distFromStart def setDistFromStart(self, distFromStart): self.__distFromStart = distFromStart def getNeighbors(self): return self.__neighbors def setKey(self, key): self.__key = key # Requred by queue.PriorityQueue's use of heapq for comparing two nodes def __lt__(self, node): return self.__priority < node.getPriority() class Graph: def __init__(self): self.__nodes = dict() def addNode(self, node): self.__nodes[node.getPos()] = node def getNode(self, pos): return self.__nodes.get(pos, None) # Add an edge from node1 to node2 def addEdge(self, node1, node2): if not (node1 in self.__nodes and node2 in self.__nodes): node1.addNeighbor(node2) class Map2D: def __init__(self, filePath): self.__graph = Graph() self.__startNode = None self.__endNode = None with open(filePath) as inFile: lines = inFile.readlines() self.__dims = (len(lines), len(lines[0])-1) # add Nodes to graph for i in range(len(lines)): nodeLine = list() for j in range(len(lines[i])): #each character is a node char = lines[i][j] if "\n" == char: continue node = Node(char,i,j) # "#" for non traversable nodes if "#" == char: node.setTraversability(False) else: node.setTraversability(True) if "S" == char: self.__startNode = node elif "E" == char: self.__endNode = node self.__graph.addNode(node) if self.__startNode == None or self.__endNode == None: sys.exit("No start or no end in map") # for each node, for each neighbor, add edge between neighbor and node for i in range(self.__dims[0]): for j in range(self.__dims[1]): currentNode = self.__graph.getNode((i,j)) if self.__isValid(i+1,j): self.__graph.addEdge(currentNode,self.__graph.getNode((i+1,j))) if self.__isValid(i-1,j): self.__graph.addEdge(currentNode,self.__graph.getNode((i-1,j))) if self.__isValid(i,j+1): self.__graph.addEdge(currentNode,self.__graph.getNode((i,j+1))) if self.__isValid(i,j-1): self.__graph.addEdge(currentNode,self.__graph.getNode((i,j-1))) def printMap(self): if None == self.__dims: print("ERROR: map not initialized") return for i in range(self.__dims[0]): for j in range(self.__dims[1]): print(self.__graph.getNode((i,j)).getKey(), end="") print() def __isValid(self, i, j): node = self.__graph.getNode((i,j)) # if i,j are valid indices and the node is traversable if node != None and node.isTraversable(): return True return False def getStart(self): return self.__startNode def getEnd(self): return self.__endNode class AStar: def __init__(self, inMap): # holds list of nodes from which the next node is chosen self.__openList = queue.PriorityQueue() # put start node in openList start = inMap.getStart() start.setDistFromStart(0) start.setPriority(self.__heuristic(start, inMap.getEnd())) start.setParent(None) self.__openList.put((start.getPriority(),start)) self.__map = inMap # list of visited nodes self.__closedList = dict() # setting this to return 0, will comvert this to Dijkistra's Algorithm # manhattan distance def __heuristic(self, node, targetNode): i1,j1 = node.getPos() i2,j2 = targetNode.getPos() return abs(i1-i2)+abs(j1-j2) def findPath(self): while True: # OL is empty implies, no route, stop if self.__openList.empty(): print("No route!") return # get highest priority element from OL priority, currentNode = self.__openList.get() # if we reached end node, follow parents to get path if currentNode == self.__map.getEnd(): # follow parents till startNode while currentNode != self.__map.getStart(): # set "*" for visual output currentNode.setKey("*") currentNode = currentNode.getParent() currentNode.setKey("*") return # unweighted graph should add 1, otherwise replace 1 with edge weight newLevel = currentNode.getDistFromStart() + 1 # add neighbors to OL for neighbor in currentNode.getNeighbors(): # if it has already been visited if self.__closedList.get(neighbor.getPos(), None) != None: continue # if it is in OL but the new path is longer than the already existing one if "O" == neighbor.getKey() and newLevel >= neighbor.getDistFromStart(): continue # add neighbor to OL neighbor.setKey("O") neighbor.setParent(currentNode) neighbor.setDistFromStart(newLevel) neighbor.setPriority(neighbor.getDistFromStart() + self.__heuristic(neighbor,self.__map.getEnd())) self.__openList.put((neighbor.getPriority(), neighbor)) # mark node as visited self.__closedList[currentNode.getPos()] = True currentNode.setKey("C") # un-comment following 2 lines to see how algorithm works # self.__map.printMap() # input() def getMap(self): return self.__map if "__main__" == __name__: inpMap = Map2D("./data/graph.in") print("Initial Map:") inpMap.printMap() aStar = AStar(inpMap) aStar.findPath() print("Map with route(*), unvisited nodes(-/O/#), visited nodes(C)") aStar.getMap().printMap() ================================================ FILE: 02_Python/Collaborative_Filtering.py ================================================ from math import sqrt data = { "Manish": { "Interstellar": 4, "The Dark Knight": 5, "Wanted": 3, "Sucker Punch": 2, "Inception": 5, "The Conjuring": 3, "21 Jump Street": 4, "The Prestige": 5 }, "Madhu": { "Interstellar": 5, "The Dark Knight": 5, "Wanted": 1, "Devil": 3, "The Conjuring": 1, "21 Jump Street": 4, "Men in Black": 2 }, "Mansukh": { "Hot Tub Time Machine": 1, "Inception": 5, "Revenant": 3, "Avengers 1": 4, "Iron Man 2": 3, "Batman v Superman": 5, "Wanted": 4, }, "Imran": { "Inception": 5, }, "Kumar": { "Hot Tub Time Machine": 1, "Avengers 1": 4, "Avengers 2": 3, "The Departed": 5, "Interstellar": 4, "Fight Club": 5, "Vampires Suck": 1, "Twilight": 1 }, "Tori": { "Notebook": 5, "The Terminal": 4, "Twilight": 5, "Inception": 2, "The Dark Knight": 1, "Hot Tub Time Machine": 2, "The Vow": 4 }, "Jatin": { "Inception":5, "The Conjuring":4 }, "Latha": { "Twilight": 1 } } itemNames = [ "Interstellar", "The Dark Knight", "Wanted", "Sucker Punch", "Inception", "The Conjuring", "21 Jump Street", "The Prestige", "Devil", "Men in Black", "Hot Tub Time Machine", "Revenant", "Avengers 1", "Iron Man 2", "Batman v Superman", "Avengers 2", "The Departed", "Fight Club", "Vampires Suck", "Twilight", "Notebook", "The Terminal", "The Vow", "Focus" ] MAXrating = 5 MINrating = 1 def compute_similarity(item1,item2,userRatings): averages = {} for (key,ratings) in userRatings.items(): averages[key] = (float(sum(ratings.values()))/len(ratings.values())) num = 0 dem1 = 0 dem2 = 0 for (user,ratings) in userRatings.items(): if item1 in ratings and item2 in ratings: avg = averages[user] num += (ratings[item1] - avg) * (ratings[item2] - avg) dem1 += (ratings[item1] - avg) ** 2 dem2 += (ratings[item2] - avg) ** 2 if dem1*dem2 == 0: return 0 return num / (sqrt(dem1 * dem2)) def build_similarity_matrix(userRatings): similarity_matrix = {} for i in range(0,len(itemNames)): band = {} for j in range(0,len(itemNames)): if itemNames[i] != itemNames[j]: band[itemNames[j]] = compute_similarity(itemNames[i],itemNames[j],data) similarity_matrix[itemNames[i]] = band return similarity_matrix def normalize(rating): num = 2 * (rating - MINrating) - (MAXrating - MINrating) den = (MAXrating - MINrating) return num / den def denormalize(rating): return (((rating + 1) * (MAXrating - MINrating))/2 ) + MINrating def prediction(username,item): num = 0 den = 0 for band,rating in data[username].items(): num += sm[item][band] * normalize(rating) den += abs(sm[item][band]) if den == 0: return 0 return denormalize(num/den) def recommendation(username,userRatings): recommend = [] for item in itemNames: if item not in userRatings[username].keys(): if prediction(username,item) >= 3.5: recommend.append(item) return recommend sm = build_similarity_matrix(data) # for k,i in sm.items(): # print(k , i) print("Recommendation for Jatin: ") print(recommendation("Jatin",data)) print("Recommendation for Latha: ") print(recommendation("Latha",data)) ================================================ FILE: 02_Python/DBSCAN.py ================================================ # ================================================================================================================ # ---------------------------------------------------------------------------------------------------------------- # DBSCAN # ---------------------------------------------------------------------------------------------------------------- # ================================================================================================================ import numpy as np from sklearn import datasets from sklearn.preprocessing import StandardScaler from itertools import cycle, islice import matplotlib.pyplot as plt import queue import pandas as pd class CustomDBSCAN(): def __init__(self): self.core = -1 self.border = -2 # Find all neighbour points at epsilon distance def neighbour_points(self, data, pointId, epsilon): points = [] for i in range(len(data)): # Euclidian distance if np.linalg.norm([a_i - b_i for a_i, b_i in zip(data[i], data[pointId])]) <= epsilon: points.append(i) return points # Fit the data into the DBSCAN model def fit(self, data, Eps, MinPt): # initialize all points as outliers point_label = [0] * len(data) point_count = [] # initilize list for core/border points core = [] border = [] # Find the neighbours of each individual point for i in range(len(data)): point_count.append(self.neighbour_points(data, i, Eps)) # Find all the core points, border points and outliers for i in range(len(point_count)): if (len(point_count[i]) >= MinPt): point_label[i] = self.core core.append(i) else: border.append(i) for i in border: for j in point_count[i]: if j in core: point_label[i] = self.border break # Assign points to a cluster cluster = 1 # Here we use a queue to find all the neighbourhood points of a core point and find the indirectly reachable points # We are essentially performing Breadth First search of all points which are within Epsilon distance for each other for i in range(len(point_label)): q = queue.Queue() if (point_label[i] == self.core): point_label[i] = cluster for x in point_count[i]: if(point_label[x] == self.core): q.put(x) point_label[x] = cluster elif(point_label[x] == self.border): point_label[x] = cluster while not q.empty(): neighbors = point_count[q.get()] for y in neighbors: if (point_label[y] == self.core): point_label[y] = cluster q.put(y) if (point_label[y] == self.border): point_label[y] = cluster cluster += 1 # Move on to the next cluster return point_label, cluster # Visualize the clusters def visualize(self, data, cluster, numberOfClusters): N = len(data) colors = np.array(list(islice(cycle(['#FE4A49', '#2AB7CA']), 3))) for i in range(numberOfClusters): if (i == 0): # Plot all outliers point as black color = '#000000' else: color = colors[i % len(colors)] x, y = [], [] for j in range(N): if cluster[j] == i: x.append(data[j, 0]) y.append(data[j, 1]) plt.scatter(x, y, c=color, alpha=1, marker='.') plt.show() def main(): # Reading from the data file df = pd.read_csv("./data/concentric_circles.csv") dataset = df.astype(float).values.tolist() # normalize dataset X = StandardScaler().fit_transform(dataset) custom_DBSCAN = CustomDBSCAN() point_labels, clusters = custom_DBSCAN.fit(X, 0.25, 4) print(point_labels, clusters) custom_DBSCAN.visualize(X, point_labels, clusters) if __name__ == "__main__": main() ================================================ FILE: 02_Python/Decision_Trees.py ================================================ # ================================================================================================================ # ---------------------------------------------------------------------------------------------------------------- # DECISION TREES # ---------------------------------------------------------------------------------------------------------------- # ================================================================================================================ from math import log import pandas as pd import random class CustomDecisionTree(): def __init__(self): pass def majorityCnt(self, classList): classCount = {} for vote in classList: if vote not in classCount.keys(): classCount[vote] = 0 classCount[vote] += 1 sortedClassCount = sorted(classCount.items(), reverse=True) return sortedClassCount[0][0] # for calculting entropy def calcShannonEnt(self, dataSet): numEntries = len(dataSet) labelCounts = {} for featVec in dataSet: currentLabel = featVec[-1] if currentLabel not in labelCounts.keys(): labelCounts[currentLabel] = 0 labelCounts[currentLabel] += 1 shannonEnt = 0.0 for key in labelCounts: prob = float(labelCounts[key])/numEntries shannonEnt -= prob * log(prob, 2) return shannonEnt def splitDataSet(self, dataSet, axis, value): retDataSet = [] for featVec in dataSet: if featVec[axis] == value: reducedFeatVec = featVec[:axis] reducedFeatVec.extend(featVec[axis+1:]) retDataSet.append(reducedFeatVec) return retDataSet # choosing the best feature to split def chooseBestFeatureToSplit(self, dataSet, labels): numFeatures = len(dataSet[0]) - 1 baseEntropy = self.calcShannonEnt(dataSet) bestInfoGain = -1 bestFeature = 0 for i in range(numFeatures): featList = [example[i] for example in dataSet] uniqueVals = set(featList) newEntropy = 0.0 for value in uniqueVals: subDataSet = self.splitDataSet(dataSet, i, value) prob = len(subDataSet)/float(len(dataSet)) newEntropy += prob * self.calcShannonEnt(subDataSet) infoGain = baseEntropy - newEntropy print(infoGain, bestInfoGain) if (infoGain > bestInfoGain): bestInfoGain = infoGain bestFeature = i print("the best feature to split is", labels[bestFeature]) return bestFeature # function to build tree recursively def createTree(self, dataSet, labels): classList = [example[-1] for example in dataSet] if len(classList) is 0: return if classList.count(classList[0]) == len(classList): return classList[0] if len(dataSet[0]) == 1: return self.majorityCnt(classList) featureVectorList = [row[:len(row)-1] for row in dataSet] bestFeat = self.chooseBestFeatureToSplit(featureVectorList, labels) bestFeatLabel = labels[bestFeat] myTree = {bestFeatLabel: {}} del(labels[bestFeat]) featValues = [example[bestFeat] for example in dataSet] uniqueVals = set(featValues) for value in uniqueVals: subLabels = labels[:] myTree[bestFeatLabel][value] = self.createTree( self.splitDataSet(dataSet, bestFeat, value), subLabels) return myTree def main(): df = pd.read_csv("./data/test.csv") # Reading from the data file # Sex param df.replace('male', 0, inplace=True) df.replace('female', 1, inplace=True) # Embarked param df.replace('S', 0, inplace=True) df.replace('C', 1, inplace=True) df.replace('Q', 2, inplace=True) df['embarked'] = df['embarked'].fillna(1) dataset = df.astype(float).values.tolist() labels = ['pclass', 'sex', 'embarked', 'survived'] # Shuffle the dataset random.shuffle(dataset) # import random for this custom_DTree = CustomDecisionTree() print(custom_DTree.createTree(dataset, labels)) if __name__ == "__main__": main() ================================================ FILE: 02_Python/Dimensionality_Reduction/Dimensionality_Reduction.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "All the IPython Notebooks in **Clustering Algorithms** lecture series by **[Dr. Milaan Parmar](https://www.linkedin.com/in/milaanparmar/)** are available @ **[GitHub](https://github.com/milaan9/Clustering_Algorithms)**\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Dimensionality Reduction" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "ExecuteTime": { "end_time": "2021-09-18T15:40:28.921358Z", "start_time": "2021-09-18T15:40:21.087390Z" }, "colab": { "base_uri": "https://localhost:8080/", "height": 104 }, "colab_type": "code", "executionInfo": { "elapsed": 5681, "status": "ok", "timestamp": 1546259198259, "user": { "displayName": "Bob Li", "photoUrl": "", "userId": "13034580972517925389" }, "user_tz": -480 }, "id": "cb9XEtCKNnh-", "outputId": "04b24b82-bb55-4e98-b09f-5a32cf27fa3a" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: sklearn in c:\\programdata\\anaconda3\\lib\\site-packages (0.0)\n", "Requirement already satisfied: scikit-learn in c:\\programdata\\anaconda3\\lib\\site-packages (from sklearn) (0.24.1)\n", "Requirement already satisfied: joblib>=0.11 in c:\\programdata\\anaconda3\\lib\\site-packages (from scikit-learn->sklearn) (1.0.1)\n", "Requirement already satisfied: scipy>=0.19.1 in c:\\programdata\\anaconda3\\lib\\site-packages (from scikit-learn->sklearn) (1.6.2)\n", "Requirement already satisfied: numpy>=1.13.3 in c:\\programdata\\anaconda3\\lib\\site-packages (from scikit-learn->sklearn) (1.20.1)\n", "Requirement already satisfied: threadpoolctl>=2.0.0 in c:\\programdata\\anaconda3\\lib\\site-packages (from scikit-learn->sklearn) (2.1.0)\n" ] } ], "source": [ "!pip install sklearn" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "ExecuteTime": { "end_time": "2021-09-18T15:40:29.264130Z", "start_time": "2021-09-18T15:40:28.924289Z" }, "colab": {}, "colab_type": "code", "id": "yr45GEzAOtq6" }, "outputs": [], "source": [ "import numpy as np\n", "import os\n", "\n", "# making random output stable\n", "np.random.seed(42)\n", "m = 60\n", "w1, w2 = 0.1, 0.3\n", "noise = 0.1\n", "\n", "# Create an array of the given shape \n", "# and populate it with random samples from a uniform distribution over [0, 1).\n", "angles = np.random.rand(m) * 3 * np.pi / 2 - 0.5\n", "# print('angles: {}\\nsize of dataset: {}'.format(angles, angles.shape))\n", "\n", "X = np.empty((m, 3))\n", "# print(X)\n", "X[:, 0] = np.cos(angles) + np.sin(angles)/2 + noise * np.random.randn(m) / 2\n", "X[:, 1] = np.sin(angles) * 0.7 + noise * np.random.randn(m) / 2\n", "X[:, 2] = X[:, 0] * w1 + X[:, 1] * w2 + noise * np.random.randn(m)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "ehCixfYWYgBc" }, "source": [ "## PCA using Scikit-Learn\n", "With Scikit-Learn, PCA is really trivial. It even takes care of mean centering for you, which has been perfectly packaged and easy to incorporate" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "ExecuteTime": { "end_time": "2021-09-18T15:40:31.663542Z", "start_time": "2021-09-18T15:40:29.269502Z" }, "colab": {}, "colab_type": "code", "id": "d6tMz_zjY_Jz" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "pca = PCA(n_components = 0.99)\n", "\n", "First 5 Projection Points:\n", "[[ 0.690074 0.36150744]\n", " [-1.39636097 -0.34497714]\n", " [-1.00728461 0.35025708]\n", " [-0.2736333 0.50516373]\n", " [ 0.91324535 -0.26290852]]\n", "\n", "\n", "Principal Components:\n", "[[-0.95250178 -0.24902446 -0.17529172]\n", " [ 0.29267159 -0.9076305 -0.30091563]]\n", "\n", "\n", "Explained Variance Ratio:\n", "[0.85406025 0.13622918]\n", "\n" ] } ], "source": [ "from sklearn.decomposition import PCA\n", "\n", "pca = PCA(n_components = 0.99)\n", "\n", "# you have to call 'fit' with appropriate arguments before using transrom method.\n", "# a = pca.fit(X)\n", "# b = pca.transform(X)\n", "# or simply use fit_transform()\n", "\n", "# 2-D\n", "X_decorrelated_DR = pca.fit_transform(X)\n", "X_decorrelated_DR[:] = X_decorrelated_DR[:]*(-1) \n", "\n", "# reconstruct dataset from X_decorrelated_DR\n", "X_reconstructed = pca.inverse_transform(X_decorrelated_DR)\n", "\n", "print(\"pca = PCA(n_components = 0.99)\\n\")\n", "print(\"First 5 Projection Points:\\n{}\\n\\n\".format(X_decorrelated_DR[:5]))\n", "print(\"Principal Components:\\n{}\\n\\n\".format(pca.components_))\n", "print(\"Explained Variance Ratio:\\n{}\\n\".format(pca.explained_variance_ratio_))\n", "# print('reconstructed dataset:\\n{}\\n'.format(X_reconstructed))" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "YPJErcHIfeWp" }, "source": [ "***We can visibly tell that we can reduce our dimensions from 3 to 2 while preserving 99% of the variance***" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "ExecuteTime": { "end_time": "2021-09-18T15:40:31.711397Z", "start_time": "2021-09-18T15:40:31.674284Z" }, "colab": { "base_uri": "https://localhost:8080/", "height": 252 }, "colab_type": "code", "executionInfo": { "elapsed": 684, "status": "ok", "timestamp": 1546322325444, "user": { "displayName": "Bob Li", "photoUrl": "", "userId": "13034580972517925389" }, "user_tz": -480 }, "id": "_jJIoUzlf6oa", "outputId": "45ed6c46-eb02-4d40-e324-eee30b51620f" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "pca = PCA(n_components = 0.999)\n", "\n", "First 5 Projection Points:\n", "[[-0.690074 -0.36150744 0.05176509]\n", " [ 1.39636097 0.34497714 0.04887253]\n", " [ 1.00728461 -0.35025708 0.04753837]\n", " [ 0.2736333 -0.50516373 0.13786693]\n", " [-0.91324535 0.26290852 -0.03027986]]\n", "\n", "\n", "Principal Components:\n", "[[-0.95250178 -0.24902446 -0.17529172]\n", " [ 0.29267159 -0.9076305 -0.30091563]\n", " [-0.08416476 -0.33792558 0.93740205]]\n", "\n", "\n", "Explained Variance Ratio:\n", "[0.85406025 0.13622918 0.00971057]\n", "\n" ] } ], "source": [ "# preserving 99.9% of the variance\n", "pca = PCA(n_components = 0.999)\n", "\n", "# 3-D\n", "X_decorrelated = pca.fit_transform(X)\n", "\n", "print(\"pca = PCA(n_components = 0.999)\\n\")\n", "print(\"First 5 Projection Points:\\n{}\\n\\n\".format(X_decorrelated[:5]))\n", "print(\"Principal Components:\\n{}\\n\\n\".format(pca.components_))\n", "print(\"Explained Variance Ratio:\\n{}\\n\".format(pca.explained_variance_ratio_))" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "ExecuteTime": { "end_time": "2021-09-18T15:40:32.577605Z", "start_time": "2021-09-18T15:40:31.721159Z" }, "colab": {}, "colab_type": "code", "id": "zmUyRlSPmse_" }, "outputs": [], "source": [ "from matplotlib.patches import FancyArrowPatch\n", "from mpl_toolkits.mplot3d import proj3d\n", "\n", "class Arrow3D(FancyArrowPatch):\n", " def __init__(self, xs, ys, zs, *args, **kwargs):\n", " FancyArrowPatch.__init__(self, (0,0), (0,0), *args, **kwargs)\n", " self._verts3d = xs, ys, zs\n", "\n", " def draw(self, renderer):\n", " xs3d, ys3d, zs3d = self._verts3d\n", " xs, ys, zs = proj3d.proj_transform(xs3d, ys3d, zs3d, renderer.M)\n", " self.set_positions((xs[0],ys[0]),(xs[1],ys[1]))\n", " FancyArrowPatch.draw(self, renderer)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "ExecuteTime": { "end_time": "2021-09-18T15:40:32.659633Z", "start_time": "2021-09-18T15:40:32.609343Z" }, "colab": { "base_uri": "https://localhost:8080/", "height": 454 }, "colab_type": "code", "executionInfo": { "elapsed": 694, "status": "ok", "timestamp": 1546328037918, "user": { "displayName": "Bob Li", "photoUrl": "", "userId": "13034580972517925389" }, "user_tz": -480 }, "id": "tQT8YSDxA1f8", "outputId": "3a43b0ba-0cb8-47e1-b019-2db84631fc6b" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Principal Components:\n", "[[-0.95250178 -0.24902446 -0.17529172]\n", " [ 0.29267159 -0.9076305 -0.30091563]\n", " [-0.08416476 -0.33792558 0.93740205]]\n", "\n", "\n", "Z value of the hyperplane:\n", "[[-0.63025233 -0.59433828 -0.55842423 -0.52251018 -0.48659612 -0.45068207\n", " -0.41476802 -0.37885397 -0.34293992 -0.30702587]\n", " [-0.52611031 -0.49019626 -0.45428221 -0.41836815 -0.3824541 -0.34654005\n", " -0.310626 -0.27471195 -0.2387979 -0.20288384]\n", " [-0.42196829 -0.38605424 -0.35014018 -0.31422613 -0.27831208 -0.24239803\n", " -0.20648398 -0.17056993 -0.13465587 -0.09874182]\n", " [-0.31782626 -0.28191221 -0.24599816 -0.21008411 -0.17417006 -0.13825601\n", " -0.10234196 -0.0664279 -0.03051385 0.0054002 ]\n", " [-0.21368424 -0.17777019 -0.14185614 -0.10594209 -0.07002804 -0.03411399\n", " 0.00180007 0.03771412 0.07362817 0.10954222]\n", " [-0.10954222 -0.07362817 -0.03771412 -0.00180007 0.03411399 0.07002804\n", " 0.10594209 0.14185614 0.17777019 0.21368424]\n", " [-0.0054002 0.03051385 0.0664279 0.10234196 0.13825601 0.17417006\n", " 0.21008411 0.24599816 0.28191221 0.31782626]\n", " [ 0.09874182 0.13465587 0.17056993 0.20648398 0.24239803 0.27831208\n", " 0.31422613 0.35014018 0.38605424 0.42196829]\n", " [ 0.20288384 0.2387979 0.27471195 0.310626 0.34654005 0.3824541\n", " 0.41836815 0.45428221 0.49019626 0.52611031]\n", " [ 0.30702587 0.34293992 0.37885397 0.41476802 0.45068207 0.48659612\n", " 0.52251018 0.55842423 0.59433828 0.63025233]]\n", "\n" ] } ], "source": [ "axes = [-1.8, 1.8, -1.3, 1.3, -1.0, 1.0]\n", "\n", "x1s = np.linspace(axes[0], axes[1], 10)\n", "x2s = np.linspace(axes[2], axes[3], 10)\n", "x1, x2 = np.meshgrid(x1s, x2s)\n", "# principal components (orthogonal vectors that decide the hyperplane)\n", "C = pca.components_\n", "print(\"Principal Components:\\n{}\\n\\n\".format(C))\n", "# normal-vector of the hyperplane\n", "normal_vector = np.cross(C[0,:], C[1,:])\n", "\n", "# calculate z-value of the dataset\n", "z = np.empty((10, 10))\n", "for i in range(0,10):\n", " for j in range(0,10):\n", " z[i, j] = -(normal_vector[0]*x1[i, j]+normal_vector[1]*x2[i ,j])/normal_vector[2]\n", "\n", "print(\"Z value of the hyperplane:\\n{}\\n\".format(z))" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "ExecuteTime": { "end_time": "2021-09-18T15:40:34.718707Z", "start_time": "2021-09-18T15:40:32.664516Z" }, "colab": { "base_uri": "https://localhost:8080/", "height": 357 }, "colab_type": "code", "executionInfo": { "elapsed": 1767, "status": "ok", "timestamp": 1546330698940, "user": { "displayName": "Bob Li", "photoUrl": "", "userId": "13034580972517925389" }, "user_tz": -480 }, "id": "9BqcncFeKY7o", "outputId": "f72323ec-0f97-4219-c00a-c892e3b55912", "scrolled": true }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAFUCAYAAAA0z8dlAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAADr6UlEQVR4nOz9eXgc6XXmif4iIvcFmdhXggB3kCyyFrJKS1mbLalUpdbiHrVkte1uW1Jfe+x7Peq1bs9Mz3Tr8TPVPXfat+e23ZalctvuGUtju23LoypR1lYlW5ZcOwkSAAGS2IHElvueEfHdPxJfMDORCWQCSRaLyrcePigkMiMjMiPeON8573mPIoSghRZaaKGFtz7UN3sHWmihhRZaaA5ahN5CCy20cJ+gRegttNBCC/cJWoTeQgsttHCfoEXoLbTQQgv3CVqE3kILLbRwn8C2x99bmsYWWmihhXIob/YO1EIrQm+hhRZauE/QIvQWWmihhfsELUJvoYUWWrhP0CL0FlpooYX7BC1Cb6GFFlq4T9Ai9BZaaKGF+wQtQm+hhRZauE/QIvQWWmihhfsELUJvoYUWWrhP0CL0FlpooYX7BC1Cb6GFFlq4T9Ai9BZaaKGF+wQtQm+hhRZauE/QIvQWWmihhfsELUJvoYUWWrhP0CL0FlpooYX7BC1Cb6GFFlq4T9Ai9BZaaKGF+wQtQm+hhRZauE/QIvQWWmihhfsELUJvoYUWWrhP0CL0FlpooYX7BC1Cb6GFFlq4T9Ai9Bb2hGEYZLNZdF1HCPFm704LLbRQA7Y3ewdauHchhEDXdQqFAtlsFlUt3v9tNpv1T9M0FEV5k/e0hRZaAFD2iLha4diPKUzTpFAoYJomAPl8HlVVEUJY/yRsNht2ux2bzYaqqi2Cb+F+xz17grcIvYUyCCEwDINCoQCAoijcvHmTSCRCe3s77e3t+Hw+i7QrCV5RFDRNaxF8C/cz7tkTukXoLVgQQlAoFDAMA0VRyOVyjI+P09bWRnd3N/F4nEgkQjKZxO12WwTv9Xp3JfjSFE2L4Fu4D3DPnsAtQm8BKKZY8vk8QggURWFzc5Pp6WlOnTpFe3u7lXKBImlnMhkikQiRSIRUKoXH47EI3uPx7CD4XC7H8vIyR44caRF8C2913LMnbKso+mMOWfjUdd0i1uvXr5NKpbh48SIOh8PKo0soioLH48Hj8TA4OIgQgnQ6TSQS4datW6TTabxer0XwbrcbRVFIp9MoikKhUChL6cgcvKZpLYJvoYUDoBWh/xhDCEE+n8c0TYtwx8fH6evr4/DhwxaxygJpvUQrhCCVSlkRfCaTwePxkE6nOXfuHG63u+y5pTcMRVGs/HuL4Fu4R3HPnpAtQv8xhSx8yhTL6uoqc3NznDlzhkAgUPbcRgm9EkIIwuEwMzMzuN1ucrkcfr+fYDBIe3s7Lper7LmmaVo5eFVVsdvtVgSvKEqL4Ft4s3HPnoAtQv8xQ2WKxTAMJiYmEEJw5swZbLadWbiDEjoUZY+Tk5OcP38e0zRJJpNWBJ/P52lra7MI3ul0lu2vJHhFUVBVtSxF0yL4Ft4E3LMnXCuH/mMEwzBIJBI4nU4URSGRSHD16lUOHz7MwMDAHSfG0qi7ra2NtrY2Dh8+jGmaloJmdXWVQqFAIBCgvb2dYDCIw+Eoe30+nyefz1vbqszBt9DCjytahP5jAKktz+fzvP7667ztbW9jfn6e1dVVzp07h8/nq2sbd4rwVVUlGAwSDAaB4o1HEvzS0hKGYZQRvN1ut/YJsI7rzJkzLYJv4ccaLUK/z1GaYlFVFdM0eeONN3C73Tz22GN1E95ByVxRlLp9YDRNsxQyUCT4WCxGJBJhYWEBIUQZwdtsNnK5nNXJWhnBVxZZW2jhfkWL0O9jVGrLI5EI6XSaEydO0NPTU/d23uwctaZpdHR00NHRAYCu6xbBz83NAZDL5QiHwwQCAasOUKqBz+VyQIvgW7i/0SL0+xCl7fuSjG/cuEEkEsHj8TRE5s1CIxH6XrDZbHR2dtLZ2QkUCf7ll18mHA4zOzuLoihWgTUQCKBpGrCT4IUQZekZm832pt+8WmjhIGgR+n2GSm15LpfjypUrdHR0cPHiRX74wx++2bvYdMiu0+PHjwNQKBSIRqNsbm5y8+ZNNE2rSfCmaZLNZq1tlfrQtJwkW3iroUXo9xEqUywbGxvMzMwwNjZmpSt+HGC32+nu7qa7uxsoFk2j0Sjr6+vcuHEDm81GMBiko6MDv9/fIvgW7hu0CP0+QKW2XAjB1NQU2WzWat9/s9HMlEujcDgc9PT0WKmmXC5nSSSvX7+Ow+Eoc5KsJPhQKEQikeDQoUMtgm/hnkaL0N/iqEyxpFIpxsfHGRgYYGxsrEU4VeB0Ounr66Ovrw+AbDZLJBJheXnZ0umXErwkdqkSymQy1ufaIvgW7iW0CP0tDDlNSGJ5eZmFhQXOnj1LW1tb094nHo+ztLRkacWlDrxR3Kvj61wuF/39/fT39wNYTpILCwskk0mrYJpKpfB6vWUqmkqCb01zauHNRIvQ34Ko1r5/7do1VFXl0Ucfrdq+v9/3WVxcZHl5mUOHDhGPxy0duCwyBoNBK0WxG95KxOZ2u3G73QwMDCCEYHl5ma2tLebm5qpaBZcSfKW6qDXNqYW7iRahv8VQOhpOURTi8TjXrl1jZGSEgYGBpr1PoVDg2rVr2O12Ll68iGEYVg5a13Wi0SjhcJhbt25ZKpKOjg7a2truK223oig4nU7a2toYHR2tyyq4kuDlcO1Sq+AWwbdwJ9Ai9LcIqo2Gm5ubY21tjQcffBCPx9O094rFYly7do3R0VH6+/ut95aw2Wx0dXXR1dUF3FaRrK2tMT09XVZk9Pv9loHWvZpy2QultgeKouD1evF6vQwNDZVZBd+4cYNMJoPP5ysj+NLtSIKX22oN+2ihmWgR+lsAlaPh8vk8V69exev18uijjzYtIhZCMD8/TygUaugmUakikUXGpaUlEomENa7OMIw76glzp7DbjUhRFHw+Hz6fj0OHDiGEsJwkp6en97QK1nWdlZUVAHp6eloE38KB0CL0exyV2vJwOMzU1BQnTpywdNaNohqpFgoFrl69itPpPPBNorTIWDquLp/P89JLL1kpio6ODlwu11uCtOrdR0VR8Pv9+P1+hoeHy6yCp6amqloFS5+d1jSnFg6KFqHfo5DR27Vr1zh16hQAMzMzxGIxHnnkkbJIrxHI1EcpMUSjUa5du8bRo0ctKV+zUDqubmVlhQsXLlgpipmZGbLZLH6/30pRlHqh3ys4yKqimlVwIpEgHA5bVsGapuHz+ejq6irrGZArs1KCb01zamE3tAj9HkSptlyOcBsfH6erq4sLFy4c6CIuzWULIaw8/EMPPdTUPPxu71+aopAEF4lEmJiYKPNCb29v37dE8l6FqqoEAgFrKpRhGNy4cYNcLsfVq1drWgXD7fOimtGY9KFpEfyPN1qEfo9ByhFlVKjrOq+//jqnT5+27GQPAkno+Xye8fHxpufhG0UpwY2MjGCapuWkuLi4aFnldnR0lDkp3k3cyby/pmm4XC6CwSC9vb11WQWX7pckeEnmrXF9P95oEfo9gmrt+5OTkxQKBS5evFimljgIpI3u9PQ0x48ff1OcF3eDqqplXuilVrnSSVH+va2trS4N/EFxpwu5pduvxyq41GisVCIJrWlOP+5oEfo9gEpteTKZ5OrVqwwODpJKpZraKJTNZrl58yYPP/xw024SdxKVVrmFQoFIJFJmtCUVNLI9/62G3W4Y1ayCZQ/AXlbBUCT4eDzO1tYWhw4dahH8fY4Wob+JqKYtX1paYnFxkQceeAC/38/6+jqmaR74vfL5PFeuXEEIwfnz598SZF4Ndru9qtFWoVDglVdeweVyWRG81+ttSmR9NyP0vVDZA1CPVbBhGKTT6dY0px8DtAj9TUKltlwqWmw2G4899pgVaUlDqIMgHA4zOTnJiRMnWFxcvK/yqtJoa3FxkQsXLlga+Pn5eZLJ5I4uznvx2A9yw6jHKtjtdltBQ61hH9Ai+PsBLUJ/E1CpLZedmdVkgwfpsBRCcOvWLba2tiyp49LSUlMi/nsRiqLs8GEp7eLMZrNlXZz1Sj+FEHeU3Jq5AqhmFby0tEQsFuOVV17Z1Sq4kuClk2RrmtNbBy1Cv4uoLHwqisLs7CwbGxs1ZYP7jdDlpKJAIMCFCxcsQtrvDeKteDFX6+KUEknZ5FOqIHmzfOPvZErH6XQSDAYBOHr06J5WwfI8KR32IfevZRV876NF6HcJlb7lUjbo9/u5ePFizQhwPwS8tbXF1NQUJ0+etHKtB9ne/QJFUXY0+cTjccumwDCMMhfJUgXJvZJDP+j297IKljYNsgZRjeAlWgR/76FF6HcBsvApL6zNzU2mp6erEm4lGonQhRDcuHGDaDRas5t0P4Sey+WYnZ210hX3wgSkZkBVVcvjfXR0FMMwiEajlkRQKkh0Xcfn892x/bjTKZ3d1D+VKSpJ8LWsgmsR/NbWVpmdcIvg3xy0CP0OojLFAjA9PU0ikeDChQt1tbnXS+jZbJbx8XGCweCu3aSNErqM9oeGhkin0ywvL2OaptXsU68f+lsBmqbtkEhGo1EWFhbY2tpibW3N8qDx+/1NI2G5artTqFfOWWrTMDg4WJdVsNzu+vo6Ho+nrJmpFcHffbQI/Q6hUlueyWS4cuUKvb29PPLIIw2ZPe1FwJubm1y/fp1Tp05ZZHSQ7UF5QfXhhx+2fEMqI9nZ2VmrGajZRPdmQypI0uk0TqeTjo4OIpEIKysrVfPP+yWsezWls5dVsCwyB4NBCoWCZUEg37M1zenuo0XoTUY1bXkoFGJ2dpbTp09bBap6sVuEbpomN27cIB6PNzXil/l9n89nRftSuww7I9l8Pl82dFmSXzO14G82FEXB4XDQ29tLb28vsDP/XJmeqPe47zShN6vhajer4GQyyeXLl8ucJF0uV1mKptY0J03TWgTfJLQIvYmoNhpucnISwzC4ePHivoymVFWtGlFns1muXLlCZ2dnUyN+aZJVaguwV0Rfi+jm5ubKlulvVblkLcKtzD9XpidqDbqod/vN3P87sWoqtQre2Njg3Llz1ndfyyq4kuDlsA9ojetrBlqE3iSYpsnGxgaxWIzh4WGSySTj4+MMDw8zODi475NTUZQdRLixscH09DRjY2OW50cj26tG0KXDLQ5qC1BNCx4Oh8lms7z00ku0tbVZ+ff7pcBaLT1ROeiira3NIvhKm9w7HaHfaVMz0zTRNG1Pq+BaMtHWNKfmoEXoB0TpUtIwDFKplDVY+dy5cwdWR5SmSEzTZGZmhmQyycWLF/dFhtUIXQ63cLlcVZ0X5YW0H+IpXaavra3xyCOPlEkFTdNseOD03cZ+j7ty0IUkt+Xl5TKbXNktfKdwp1U0EpXvUWkVXOqkKWWiu1kF67pelrrUdR2v14vdbm8RfA20CP0AqNSWCyHY2NgA4NFHH20KOcntyqJqd3c3Dz/88IEi/lJCl12qR44c2XW4RbP065VSQekmWDpw+l4rsDYjgi4lN1lYluQWj8cZHx+3ovdm39jutIqmXlQ6aTZqFXzlyhXOnz9vkXkrgt+JFqHvE5Xt+9FolImJCdxuN6dPn27a+6iqSjQatYqqB/VEl8QshLBWEufPn8fr9TZpjxtDpZtgZYH1Tpht3QsotclNJBKcOHGCdDq948YmbYIPcmO7WxF6o9jLKlhRlDKCF0JYFgStaU7V0SL0BlGtfV/K+06fPs3y8nLT3ss0TdbW1sjn8zz66KNNyTerqoqu61y5cgVN05q2kmgWqhVYw+Gw1egiC41yHundwN0oWtrt9jIXRXljC4VCTE9Pl3mw+P3+hvbnXonQ98JeVsHpdJpbt27tsAqG2sM+ftymObUIvQFUplhyuVxZM082m22akiOdTnPlyhVcLhc9PT1NKx7m83mWlpY4fvw4AwMDTdnmnYTb7WZwcNBqdJGFxuvXr5PL5awI7q1sZ1DthlF5Y5MeLEtLSyQSCatFv6OjY0+J5N3wib8Tn3+lVbAsqO9mFVy6P9XG9d3v05xahF4nKgs0GxsbzMzMlDXzNMPqFiAUCnHz5k3OnDlDOp22TsqDYnl5mbW1NYaHh98SZF6JaoXGeDxOOBwmk8nwyiuv3JEC673Q+FPqwVLaoj87O1u2cqkmkbzT+3+3oCjKnlbBpauYasM+ZD/Fr/3ar/F7v/d798XnUooWoe+BaqPhpqamSKfTO5QmByV0wzCsyPPRRx/FbreTyWQOHP1IPbxpmgwPD9fVgPRWQGmBdWtriwcffNBaoss8tGxwulcKrNXQKOFWa9GX0lApkfT7/Ra53ekI/c1K6VSzCi6tv+xmFfzGG2/c9f29G2gR+i6obN9Pp9OMj4/T19fHqVOndpzEByH0VCrFlStXGBgYYGxszNr2QW8ScrtDQ0MMDQ1ZaoL7EZVL9Hw+Tzgctlr1ZYG1njRFKe6FCH03lEpDSyWSskkskUhgmiY9PT075IHNwN0outZz05DDTqRaq5pV8ObmpjXoZK/t/eIv/iJf//rX6enp4erVqzv+rhQ38B+AJ4E08A+FEK9t/+2J7b9pwJeFEM80fND7QIvQq6CyfV9VVZaXl5mfn+fMmTOWrrYS+yXf1dVVZmdnq267VqdoI9s9e/YsbW1twI+Xfa7D4bAu8FppChnB360Cay0084ZRKpEcGRlhfHzcUtPIG3q1QdP7xd3I0e/nPapZBc/NzfHFL36Rubk5Pv7xj/Pe976X973vfZw9e3bH6//hP/yH/Oqv/io///M/X+stPgQc3/73GPCfgMcURdGA3wTeDywBLyuK8hdCiImGDmAfaBF6BSpHwxmGYd2dH3300V1P/kbJ0jAMpqamKBQKNa0BqnWK7gXTNJmamiKXy+3Y7kEIPZ/Pk0wmcTgcOJ3Ot1SXZ7U0hSywVg67aG9v39Hk8lbPtba3t1vEVm3QtDzuQCDQMHHKLtE7CcMwDvwebrebj370o/zkT/4kP/3TP82/+3f/ju9973t85Stf4dd//dd3PP9d73oXc3Nzu23yo8AfiOIF9SNFUYKKovQDI8ANIcQtAEVRvrr93Bah301Uasvj8TjXrl3j8OHDDA4O7vn6Ri56aQ0wODjIoUOHar620ahfqmP6+vrKUjel+9joDSKXyzExMcHq6ip2u92SzamqahG70+ks+3evk321AqvUQC8uLlpRbEdHx1tG9lcLlftfbdB0JBJhfX2dmZkZ7Ha7lZoqnWJUC4Zh3JMRei3I1dnx48c5fvz4QTY1CCyW/L60/Vi1xx87yBvVixahU11bPj8/z+rq6h1pullZWWFubq4sFVILjUTU8oI8c+ZMTVdHqUOvFzIPK6fXRKNRlpaWsNlslm9HteHLqqruIPpUKkU+n78nyb6yi1FGsZubm2xsbJBIJOju7r7nC6zVsBcZ2u32qsVFmXveq7nrbqRcmhGhS0hCbwKq3eXFLo/fcfzYE3qltrxQKDA+Po7H4+Gxxx5r6olqGAYTExOYprln+kaingi9EY+XeiN0ada1trbGiRMnmJubs/KuUEy/xONxQqEQ6XQaj8eD3+8nEAjgcDisaTalI8uWl5e5du0amqbhcDiw2+24XK6yKN/hcNwT0XBpFGuaJt3d3RQKhbICq8y/N1JgfTPQaMqotLhYbYpR5ZCLu5VDbxahS6vjJmAJOFTy+xCwAjhqPH7H8WNN6DIqlyd8OBxmamqqzDq2WZAplkOHDjXkvrhXUTSbzXL58uW6PV7qifh1XWd8fByn08nDDz/M9evXd7zG4XBYhCeEIJvNEovFmJubo1Ao4PP5rAi+8kKUgw8ymQzxeHzH/pUSvMvluifI3m6309nZuYPkpFVuqUzwzS6wVuIghFtLIlk65MLhcCCEIJfL3TFJbDPTOk2M0P8C+NXtHPljQEwIsaooygZwXFGUUWAZ+BTw6Wa84V74sSR0IQSxWAzDMKx0yl6zOA+CpaUlFhYWeOCBB/D7/Q29dreIWk4qasRGdy9CTyQSjI+PMzo6Sn9/P7Ozs2XDLWptU1rmSsJLJpPEYjFCoRAAbW1tVqF5t/eXN4fSyL70fSrTOA6HA5fLdUeVO5URbq0CqwwIZIFVWgQ3WybYKJpZ1C2VSB46dAjTNFlZWWF9fZ3Jycmy4nIz7ZHfjJTLz/zMz/DCCy+wubnJ0NAQ//pf/2sKhQK//Mu//EtCiN8GnqcoWbxBUbb4CwBCCF1RlF8FvklRtvi7QohrTdn5PfBjR+hSWy5dETVNs2Rdu83i3A90XWdioljYrjfFUolqKZfSYdD1TiqS2I1QZW5f2v5ubW0RiUQa3ufSgiMUP4dEIsHm5iZXr17F4XBY0bvL5WpID57L5azO2VJb35mZGXw+n0XwlcXag3yvexFi6fFKH/BKF8FSFcmb4Z1zp1Y2qqricrkIBoMcOXKkqkVuaffufiWSzS6K1lMX+8pXvlL18V/6pV/6bYBtdcuvVHuOEOJ5ioR/V/FjQ+iV2nJN0wiHwywuLjbFxVBCRtSpVIrx8fG6FTK7ba+UgHO5HFeuXNlzGHS924PbMkdpAmaz2cjlciwuLtbYSmOw2Wx0dHSwurrK2NiYlX9fWVkhk8ng9Xqt/Huj0WzlZ5PL5UgkEmXPkZF9tTTOQcm+GnYrsN68edNqUZcWwW91lJJtNYtcOX9WOijW8l/ZDc2M0JPJZLNSLvccfiwIvVJbbpomq6urZDIZHnvssaaqLhRFYXFxkZWVlaYPuAiHw0xOTnLy5ElLcraf7ZWSYOnwailzFEIwNzd3x0bGOZ1Oy5NDjm6Lx+PcunULwzCsaLfUj6PacdS7f6WRfTWyt9vtVYlekv1BUxaVMkGpIllaWiKZTJLNZllaWnpLFFirYbfouXL+bKFQqHpz20s9dI+qXO453PeEXqktl5GzXPI3k8x1XSedThONRps64MI0TW7dusXm5uaBc/ylOXk5yq5yhbKyskIqlTrwvktI8q1GVIpye3Rbf3+/1bYej8dZXV1FURTru5KSuf1o6WtBqpwKhcIOsodi8XdhYcEinlLC328KoFJF8tJLLwFw69YtMplMmUXwW8F3p5F0iN1uLzPYkjc3qR5yOp1l/ivynGnmGL10Ot100cO9gvuW0Ktpy5eXl1lYWODs2bNlefRmIB6Pc/XqVZxOJydPnmxaNCHzz4FAgAsXLhw4jyjJ8MaNG0QikR05+EQiwdra2kF3e8f71YvKsWWSaDc2Npifn8fhcBAMBvH7/U1Ll+wW7efzecv4Kp1Ol/1ttzROvd+TbNCSXjtCiDIfFl3XyzpY7/Rs0P3gINFzpf+KVA8tLCxY8sL29nYymUzTxAqpVKpZssV7Dvfe2dEEVGrLDcOw9M8yRxyJRJoS5VVO/pmenm5a9BiNRrl27Rp2u52TJ082ZZu6rrOxscHAwMCOHLyu63u1Ot912O12a6qNTJ1Fo1EWFxfJ5/N4PB4CgcC+P/ODWiFIO4RSqKqKzWar2kFbSfaV7126Ijl8+DCGYVgWwQsLCwD7ykHfSZim2TQlT+WA8XQ6TSQSIRwOs7W1xebm5oHloalU6r6oXVTDfUfosvBZ2b4vZXgSmqZhGMaB3qtQKFiEK1MszfBEl009oVCIhx56qGlWn7FYjMnJSbxeLydOnNjx9/n5eato3AzUUujsN6qW3aeyq1FqouPxOPl8nsnJSXw+H4FAoK6W9dJ92uvv9e6zvEHUInvAytk7nU7sdjvJZJJMJlM1si8dRQfVc9ClFsFvRv79Tnm5lKbj0uk03d3d2Gy2MnloW1ub9fnUmz5t5dDfAqiWYpmbm2NtbY0HH3xwxxJLVdUDEbocrlx5ozgooRcKBSt18+ijjzZFqiVXESsrK5w6dapqSmVjY4NYLFZzG/tR09ypomrpe0hNdDQa5cSJEyQSCWKxGEtLS2iaZkW71YqNzRpIUom9bhByFmYymbQK9FNTU8Btspfyy9IoX9O0qjnocDhsFVhLJxlVDrq4U7hbrf82m22HPDQej1s2BYZh1JWeahH6PY5K3/J8Ps/4+Dh+v78mKWqatq+LuTR6rubzchCSkHn4I0eOWDnFg0Kmm1RV5eLFi6TT6R2Ek81m95yF2qzIb7/pjXo+VzmSTPrYFAoFYrEY6+vrpFIp3G53mf69EZVMPce/n+++ctulg48rt1lK9qUpnJ6eHmuSkUxR3Lx50yqwFgqFO9rF+Wa1/pcOOBkdHcUwDEsDPz8/D1BV/18voV+6dIlf+7VfwzAMPvvZz/L000+X/V1RlH8G/P3tX23AGNAthAgrijIHJAAD0IUQFw5w+HXjLU3oldpyRVHY2tri+vXrnDhxwopiqmE/KZd6ouf9XtRLS0ssLS011QxMDrc4dOgQQ0NDwM6csbxB1ZN2qBe18tIHSbXs5yZZOnhZdqDG43Hm5+fRdR2v10tbWxt+v3/PYmM9lgr7DRBqbbtym5VkXwqbzVZG8oODgzgcDmvIw50ssN6tCH2v95ATqmTXtK7rRCIRKz21tLTE3/7t35JOp/e8uRmGwa/8yq/wrW99i6GhIS5evMhHPvIRTp8+bT1HCPG/Av8rgKIofwf4vBAiXLKZ9wohNvd1wPvEW5bQq42Gm56eJh6P19U92ShJyALl0aNHd42eG92urutlBdtm5SJDoRC3bt3a4ehYqUNfWloqkyhKcinVXwsh6ib0ZqcxmjWQo9SeoL+/H8MwSCaTlsEYYDU3lcrl7jSaNe1HXguVclNd11lZWeH8+fNlDWNTU1M4nU46Ozvp6OjYlw+6xL3qtmiz2crSU6Ojo0SjUb797W/z5JNPMjAwwE/+5E/yK7/yKzvSUy+99BLHjh3jyJEjAHzqU5/ia1/7WhmhV+BngOqtpXcRb0lCr9SWZzIZxsfH6e7urrt7st4IXTbZrK2t8dBDD+0pd2qE0KRvykG7SUthmibT09PWzNNK9UEpQcZisR3STfm30p/pdJrp6WmEELS1tREIBKoO4d0rSt0vOTfTp6VUEy/zsYODgzvUJHa73TrWvb7Pg9zEah1bs26M8macSqXKjt3n86HrOsvLy9y4cYNcLofH47EKzp2dnXUrV+7ViUWV6Orq4hd+4Rd49tlnee2111heXuaFF16oWkxdXl7m0KHbholDQ0P87d/+bdXtKoriAZ4AfrXkYQH8paIoAviiEOJ3DrTzdeItReilKRap3w2FQty8eXNXD/BqqIf0ZS7e4/HUXaCs90KUI+32Y9hVC9lslitXrtDV1cXJkydrNvLImoPMM+6GjY0NVldXOXbsGDabjUwmQywWY2Wl6AYqc9Iyqi39jA5KSHeiaFmLQCvVJPl83jrOZDLJ/Pw8wWBwRzPaQYu/1VIuzTzu0ptt5bGXFhmhmNJZW1vjxo0bllZbRriBQMBK57hcrrJ0zVuF0EuhqirDw8M1x8s1mDL8O8APKtIt7xRCrCiK0gN8S1GUKSHE9w+423viLUPoldpy0zSZnJxE13UeffTRpjvaybxjo1a6exVbDcNgcnISwzD2bdhVDdIW4NSpU1abdTXIC1vmkWvBNE3m5ubQdZ0zZ85Y+y5VJYODg1bTk1RZ2Gw2AoEAbW1tVtNPaQqn1O/jTka9zdimw+GwyGxqaore3l5SqZT1mfh8PitFcxCiqUbozVyRlBLhXtutVnOQq0ip+S8tKrvdbmw2G+vr63R1dWEYhiXFvBNoRhqs3gL30NBQmZfR0tISAwMDtZ7+KSrSLUKIle2f64qi/BnwKNAidNiZYin1Fh8aGmpqvlMIwezsLBsbGzz88MMNS792k0PKIqXsCmzWCTo3N8f6+npdtgCycLwbCeXzeaanp+no6KC/v99qzqpEqclUKQEsLS1ZS3jZ1Wmz2azlvyRVeXOpJJxGcvb14qCRtBzg0dfXh2maJJNJkslkmT1w6UqlXlQSTLNvZKV1kEZQWnOQmv9Kzx3peb+2tkZbW5sVnGiaVnM04ZttJSyx13d08eJFZmZmmJ2dZXBwkK9+9av84R/+YbXtBIB3Az9b8pgXUIUQie3//wDwb5p6ADVwTxO69JlOpVIEg0HL+Gp5ebmpqQqJfD7PlStX8Pv9XLx4cV+RVy1Cr1WkrBfVIgupunG5XHXvbyaTYX19vaYCKB6PMzs7y8jIiNV+Xy9cLhcul8sy3ZJNP5L0pPZafpeSZCoJrDTXW2qRW/rzzYSUy7W1tTEwMGCtVLa2tlhYWGjYHlj+/U6lmJoROFR67kDxXInH42QyGWZmZspuaoZh7LBKAKw5tNX+3Q2ylwZ9e8Fms/Ef/+N/5IMf/CCGYfCLv/iLnDlzht/+7d8u9UMH+Djwl0KI0mp0L/Bn2+9jA/5QCHGp2cdSdb/vxpvsBzLFEo/H2djYwOfzWV7azVSDSMiUxV5yx72gqmqZtExa0+ZyuapFynpQzfFPLoUb0aybpllToiiEYHV1lXA4zNjYWN1dd7tJFGV6ZmBgAMMwuH79OtFolJWVlZqkVxpJ14rUS5+72/P22sd6sVdapNQxELBWKsvLy2SzWUse2dbWtuP7r5SQ3gk0O78tP095TPF4nGPHjllDPmRRWaakSmfOlk6rqoQcTVjN075ZSKfTdcuCn3zySZ588smyx37pl37J8kMHEEL8HvB7pc8RQtwCzh90X/eDe5LQdV0v8y1Pp9O89NJLe0oG9wPTNJmdnWVra6sp04pKo6x0Os2VK1fo6+uzrGkPsk15YUqTsUbteaX/SWUUaBiG1UZ++vTpugmgkYhSdjkODQ1ht9vJ5XLE43GWl5et9Iw05drrZl0tWi8l+VKivxMdq3sdd+VKpZo9sNS/y328UzWDeiPSg8Jut+8oKpfOnJVNXbVM1WRaT5J9adey2B5g4vf7a44mrBf1Drd4q+KeIvRKbTkUUxWxWIy3ve1tTXdIUxSFV155xRoW0YxIRl6Y6+vrzMzMNKy+qbVNqfCRBdWLFy82VFCNRCJsbW3tuJDkcrmvr2/X4m+1C/AgBFTpiZ5KpUgkEkxPTwP714SXRuulkXlpvn4/+vpqK4h6X1fLHnh5ednap0Qi0XQv9NJjbxbqvfFUmzkbj8fLTNVqrVoqIdNvtSJ7mcapzNm7XK4d276f2/7hHiL0yvb9XC5nSQYDgUDTyXxra4tkMskDDzzQ9Kh/c3OTeDzOxYsXm+K3rihFH/epqSkGBgY4dOhQQxdpPp+3nPpKXycnNh09evSuneS1Uigy9yqbfko14fsdWVf6fpX5+sr9uFv5+kp74EgkwsbGBuvr61YHozzWg9gDS+Kt5UN/kG02itICa29vb9kN/NatW5imaamGqg012UuyWCuNc+TIkR11oGQy2YrQ7yQq2/dVVbUGL5w6dQq/38/ly5eb+n5yHmcwGGy48LcbstksMzMzaJrGww8/3LQLqVAoMD4+zgMPPNBwtC9VMKWFWiGE5Td9+vTphvP6d7obtFITXis94/f7a+57o/u4V76+lFCa1b0KxVSF2+3m0KFDZUqhSnvg3Y61EqXH3kz9dq1j3o+CplL+KoeKr66uAuWqof0cQ61ru5VyuYMQonw0nBCCqakpUqmU1b5vGMaBbW4lstks4+PjVorl8uXLTdv25uYm169f59ChQyQSiaZJEm/cuEEmk+GRRx7Z180nFAqVWbhKoyZgX3n9g5D5bkS4GylUS8/E43HW19cRQuD3+zEMw0qlNDNvLmWWexVn95Ovr3x+Nalg5bHWYw9cbfVxUNxJZ0pVVS0CB8r6GxYWFqw0mczF73U8mqZZ3kWVaKVc7hCqte/L2ZalXY7NOpEk4ZY23uzXcbEUpRH/hQsXyOVyu9rQ1gspoQwEAnR0dOxL1VOqk4biyXzjxg1sNhvDw8MNb+9O6MMb/X6rqWekEmpiYgK73W5p3xtNz+z1vpXHXpma2S1fD9U7Z3eTFVY71kQiQTQaLbMHLlWSVH6ezUi57PYdHUQWWWu7laqhSCTC2trajgKrTEtVYnBwsOZqpkXoTUZl4VNVVVZWVpibm+PMmTM7otCDnoxy3FosFtth2nXQIRe5XI4rV65YEb+iKFYd4CCQRmBSQnnlypWGidQwDObm5qzXra+vEwqFOHHiBDMzM/vaL03TDkTolaTYjJu1TM+srq5y+vRpawBEI+mZRvd7L+yWry8NVEpXFPWglj2wJDrZ/FRKdM3Qoe917PvZfiOrGZvNhtfrLUtLxeNxFhYWdqSl2tvbd+2UbqVcmojK9n2p2jBNs6lt8BLS26Szs7OqaddBCKWWbv2gRk0LCwusrq6WGYHtZ5vyZK9s4d+vfl9V1TL1UTNwJ6L90gEQtdIzjahnmq3hlgQrA4lSWWE1fX3pz0pUa9WPxWLWd+/z+RBCHEiKu9e518yiaz3vUavAKldp0lCrvb2dYDC4g1NaEXqTIKNyeUInEgmuXr3K8PAwg4ODTT8pZGF1bGzM8keuxH4idFFiDVBNt75fQpc2ujabbYcRWKPb3NraIhKJkM/nmZmZobOz02rh3w+J1mr9Pwji8Tjf+c53+MAHPtCUiKlaOqhWeqZe9Uwzi5+77Xc9BF6Zr698nqZpFtH19fVZXdarq6vW0OlG7QnqiaL3M36u0fN5t/co/Y77+/vp7u4mGo0SiUSYm5uzuno7Ojrwer2kUqmyCWO1UMdwi/cAXwNmtx/6UyHEv9n+2xPAfwA04MtCiGfqPtgD4o4TemWKRVEUFhYWWFlZabgxph6YpsnMzAzJZHJP2WCjJ5Z0X/T5fDVb7fdD6MlkkitXrtS00W2EWKTftWzhHx0dpa2trYzwKpf69cj04vE46XSaQCCwbymmPI5cLsc3v/lNyzPmoYce2tf2qm17N+xHPdPsukHl+VFvSqResi/N1/v9flKpFHa7nUAgUFZodDgc1mrlILWGRiP0/RSs6xlu4XK56O3tRVEUOjs7rbRLPp+3hor/wi/8Ak6nk0ceeYQHHniAs2fPVt1uPcMttvFXQogPVxyfBvwm8H5gCXhZUZS/EEJMNHTQ+8RdidDll17qPdJI+748Cfb6UmVhtbu7uy7ZYCMRusxr7+W+2GihdXV1ldnZ2V29aeq9ScjVw9LS0q4t/Ls11VTmdIUQLC8vEw6HaWtrY3Z2dke3YyNpCcMw+Pa3v83SUpDr149x6VKAhx6y8aEPmYyN7V89sx9UqmfS6bQ1sq40PdMsQq9GZs3IcUPtfL0Qwmqpl0RnmqZ1M1tZWSGTyViNPoFAALvdXvc5dzesc2WBeTfU6s0oHSr+yiuv8Gu/9mu0t7fzzDPPMD4+zpe//GUee+yxstfsY7hFKR4Fbohi+z+KonwV+ChwfxC6LHxubm4yOTnJsWPH6O3tbWgbknh3+1JlZ+bp06etCGwv1DMoWojbM0TrHXBRz03CNE2uX79ONpvd0+Ol3gh9cXGRN954o+EW/lJURvIzMzPYbDbGxsYwTZPBwUGr21EOYy4dBrFXtPfDH/6QmzddvPLKI9jtOTyeFCsrGZ591sdnPlPYN6kfFKUdnaXWwJFIhFwuV2Y+1Uz1zEEJfS8FivxX+RxpTyDz0PJmVumkWK3RZ7/7v990pGEYu14fXV1dda/0TdPkE5/4BG9729usHphKNDDc4u2KolwGVoB/KoS4BgwCiyXPWQIeq/biO4G7EqHfvHlz33a0cJvQq32pkhgzmUzDnZmaptWc0Qj1zRCtRD0ndzab5fLly/T09HDq1Kk9X1PPhRAKhfjud7+7Zwt/vZBNUr29vfT09FhabLkfsqtvaGjI8u1YWVnZYUZVWpSam5tjY2ODqam3Y7fncDrzAOTzW3R0eLl0ycbYWL6h/bxT+uhSRUkymWR4eLgsot3NcKvR/dwvodeb46523lamcKrl36UXi6Io1orM6/WW7W8jEfp+Vzq7vYfdbt/Np3wHSouiiqJUFWLsltYqwWvAYSFEUlGUJ4E/B44D1b7Mu2YRelcIvbOzk8OHD+97aaZpWtVhDOl0mvHx8bqJsdp2s9ls1b/F43GuXr3K6OhoXUWUerG1tcXU1NSuxdpKVM4BrcTKygrf+c53OHr0aFMKjNFolIWFBUZHR600UHoyTfjrYfSQjr3fTuCJAO6x4s251LcjPZFm64+22FraYi24hvJ2hcCDAcuUyev1kkj48fszCKEAReWTpuVYXW1MjbEXmedyOSYnJzl//vyBo8hq6Zl4PM7NmzfLGn78fn/V4uqd0HHXg0a3L4+/cpJRIpFgY2OjrJgs01HNnORVDbsR+tDQUENF2XpULvUMtxBCxEv+/3lFUX5LUZQuihH5oZKnDlGM4O8K7gqhB4PBA0VRNpttx9Jov6PnSlHtJBNCsLS0xNLSEufPn2+aZlUIwa1bt9ja2qpriHUpahGCbGqamJjgxIkTDemsq13oQhQtdKPRKKdOnbJWO+mJNOtfWkfxKNi6begxnY1nN+j+TLdF6gCZyQybv7uJ6lPxHfJhpAyMbxuoHSqbvZt4PB5OnjzJ2FiAWCyIqqZJpdIUCnn0mQ3epygs/LMMjgFH2Q2j1meyV8Q3PT3N1atXyWQyvO1tb9uT2Hb7nCufV2q4Vdrws7i42FAKql5CrEQjdZV6Cb3WZ2q32+no6LAGmcj8++LiIul0GlVVrYJy5Qq5dMLYflGL0AOBQMPXfjqd3pPQ6xluoShKH7AmhBCKojwKqMAWEAWOK4oyCixTnGb06YZ28gC4K4R+0AiktHhZ6i9+0NFzlUVRXdeZmJhAVdWmeq4XCgWuXLmCz+fbl6tjtYtXdpIahrGv6UeVF7q00LXb7TssASLPR9B8GopHAQU0X/FziV2KlZFu7FIM1adaf5c/+QGM/OMRhBAEg0He854kf/iHfpxOB52dLnybOg+Gtxg6oWLvtmPEDDaf3aT7s914ThdrFvUQbeXfpqamgGKqJxAI1FvUahiVDT+l80iz2eyuzoL7idAbIchGbxj1NBHJ/HtPTw+RSIRYLEY+n+fGjRtWdF9aMK/WQNWIeqiabFHTtLI8d72oJ0LfbbgFFD3Rgf8G+GVFUXQgA3xKFA9IVxTlV4FvUpQt/u52bv2u4E0356oHknhTqRTj4+P09/cfyF9copQo95IO7hcydXP06NGGi8ESlZFTPB63RvCFw+GGo5/Kzy2bzTI9PU1fX59VJCtFfiWPrcuGKEkFal6Nwmp5/aGwWsDWXX5K2bw28qu38+IOh4PHH/fS2anyjW+4WFoSXIguEBzIgGGQeENDySkoDoXN/3OToS/c9uSo7LKUqEYMS0tLZc07ly9fxu/31ySBRnLcs7OzDAwM1FxlyXmkvb291uSeaukZ2fhzJ1Mu9coK95sSEULgdDrp7++vag9st9utAms1e+C99PW1jmFgYGBfwVw+n69rdVxruIWEEOI/Av+x2muFEM8Dzze8c03AW4bQNzc3iUQiVe0BDrJdwzAs64Fmj7VbWlpicXHxwKmbUuVM6XCLpaWlqhdheiJN5PkI+ZU8jgEH7U+2W5EulF880WiU+fl5jh49SltbW9XtOQYc6FG9GKFvw0gZ2PvLLyh7vx09pt+OzOXzBuzW+0qMjd2WKS7+cxPsbrJTWYQm0G065KDwWoHVH67SdaELu91OeiJN/FKc/Eoe+0B5Hl9GgJOTGt/4hsaVK+04nY9x4sQ0PT0bGIbBX//1X/OBD3xgR2t4I2RWKBT48z+f4eZNGw7HCIcOaTzxhF5VnSPJulZ6Rt50fD4fbre7LvXMflwk60k1NatgWWoPrKqqlZ5ZX18nlUrhcrmsWoPL5dqzB0KuRux2u3UcXq+Xrq6ufe3v/Y57PuViGAYbGxsIIfY9wm03yAi3mdYDQgjGx8cRQjQldaOqKvl8nmvXrqHrOhcvXmR1dbWq2X96Ik3oSyE0r1bMd0d1Ql8K0fe5PovU5UUSCoWIRqOMjY3hdDprEkX7k+2EfieEntMxnAYu4cJMmgQ+WX5jDTwRYOPZ4ndl89kwUyZG0qDjk7sXf+39dpIvJVHsCppdw4YNUzERdkH6O2lutt9E3BKof6KiplTQIbeUI3M9Q9+v9eEecyOEYOK5DJO/m+CBQpZ+srzhdvHKKxe5cOFlBgejlq+PbJWX2IvMSv/+ox8leOWVi9jtWZzOOdbWhnj2WdcOyWUt4i1Nz0xOqvzZn2XY2HDQ0ZHl4sU5zpyhZnpmP7noRhuXGsVuBUshBHa73dK/S3uC0kEXXq/XIvhaihOpsJLHUstJcS/c6dXQvYB7OkJPJpPWkItgMNhUMpfpG5vNxrlz55r2RafTadLpNIcOHWp4EEUtFAoFFhcXOXz4MIcPH7Z8K6oh8nwEzauh+bfz2Ns/I89HyqL0mzdv4nQ6GRsb2zPH6jntoedzPbz2H19DXVAZfniYzk92Vi1aKm6F8MthHHYHvnO+ssJprUgw8ESA+PfiKJ7thiddIAoC10kXxOHoqaMs/pdFMlsZdLtezEzmQV/VWfs/1hj59RGYhc3/vIEXG1Elh6sA745n+Ot2jVDoAh//eJy+vj7cbre1D6V53dIOy93wjW9oOBxpHI5iGikSWcDl6uHSpYAluayHeCcnVZ591o6mFejtBV0P8MILQQYG4rhc4arpmf0EBnvJCg8q+zRNsyoRV9tuNR+WUnkkYOXfS+2BDcOwjr23t3df0ufK/bhfcc8SukyDnD17lmQyaXl4NwOhUIhbt25x6tQpbt261bQvWDY3eTweBgYGDrzdxMsJFr+8SPilMM6ck3h3nOkHpgm/M4zzZDEPWJleyUxncI6W5whVr0p+pUg22WyWVCrFoUOHLDlmPRd1ri/H7NuKthU9b+/BPVp+UWUmM2w8u0FOzREfimPTbXjS9U2Zco+5cZ93k7uRw8yaaF4N+1E7ir2oqslMZsi8ksE0TFRNtXL5AkHmcoZr165h/sAkWlCx+VVIKqheJzZF5XHNxvcYYHR0pwNfLeKtJHlVVa2b0fIyln4eIJNxs7qqMjMjAAcf/KDBmTN7E+SlSzZ8PoGimKiqRrFOJ3jxRT+f/7xzR3pmeXm5zC63keamvVQ2B4HsRK18v3puElLf7vf7GRwctLx2ZDrKZrPR1tZm2Ya4XK4DTRerx0LgrY57LuVSOjdTpkEymUxTzKEquzMPKqcq3W6pf8zly5cPvN34S3Fm/t8z5LN5bOHi15TP5lkSS6TH0/R9rnhiV6ZXCusFVJeKY/C2fMxMmTgGHEQiERYWFvB4PFYeud7P4NVXX7We98YbbzAyMlL2vUqFSyQSQVEUdLtOUk/ivOQsi9BroevTXWw8u4HqUxEOAVkwkybOR52sP7teXHYrApHfJiAHKCiIrGBUGWU2MovqEWQzBZxOB6qqoasKjkSe/oeKr8lMZohdilFYLWDvsxM51c6l635WVxX6+wVPPKEzOppmfn4er9drLe3lcl/XdTyeKJmME4cjTzbrZmOjGyFM3O400aiX3/1dB5/5TI6xsd2JcmVFIRDIoesC+bF4vbC6evszkumZ9vZ2hBBl6pl6m5t2K4o2oymrmW6LlV47smFNGtedOHGC1dVVOjo69uUgeb87LcI9FqHLFMvQ0FCZFO+gvuVA2QAN2YRUq/W3EUhP9I6ODss/5qAXiq7rTP1/p1A9Kq4tF7pTx9RMIkaE+Hoc5xEnkecjADvSK45DDnILObQ2jVguRpujDTNtYv6kSWw1xunTp605jvVeiOFwuGxQRi6XY25ujtHRUeuxwmoBw2+Qz+WtCDqcDeNZKo/Sa0WE7jE33Z/pJnYpxuIbi+gBnfO/fJ74pTg2nw1bh43CeuF2H14B0MAWsBH/ZhylS+GIW2Fq3gGYoJiYKZ0NoXH27DyrP4Tcn+Sw+W3Yum1El0yWvreBdlylo8fF0lKWf/tvszz44I/o7l7n+PHjO3K1oVCI48enePXViyiKIBptAwwURcXvj5LNZvH7u7l0ycGZM/kyaV4ikeD111/n4sWLuN1uHI4NVlcFXV1u5EGlUtDfX/75TE6qfOMbdkIh6O938MQTLsbGdjY3Sblg5TSjWimXZgYzB3EG3Q2yYW19fZ3HH3+czs5OwuEwU1NT5PN5a/hLe3t7XfWv+32eKNxDhL68vMz8/HxVpclBCb2Wz8tBI4tIJMLExAQnT54sq7of5KSW8kn3lhv/ET+xyRiKUyGn59hiCyNtoHk1K4VSKRN0DDgwcyamxyQ2HUM/rON6vwv3iJtTh0+VpQ/qvahfeeWVsufpus7rr79eFqXb++2Eb4QxhYmyTVBaXiOiRhhltOp2K+Eec+M65eK7X/kuQgjcOTddq11o3RrOY04KmwUQIIwi6Wl+DdcpV1E++W7wfs/g1OE8i5s29Dj4bXDkF9s5/E5B6N+HyJGDAjjSDm6sOhGKzsD8Et9OaxRJ1cbU1DF6ezetcWiZyQz8ISzmFwkrYY4N5Dj9cyn+7/8bVlbcuFxp2tpiuFxZYrEsLpeT1VV/2eelKArr6+ssLS0RCoU4e/Ys/f3rZDI/RTqdxemEZBKSSYVPfvK2FLSYZ3fi8xl0d0MsBs8+a7cKsLupZ2S6otm2x5UoLTQ26yZRCTlSTtM0fD4fw8PDmKZJLBYjHA4zPz+Poii0t7fT0dFBW1tb1ZtYK0JvEnYjTtnMA9RUmthstqqt/3uhESvdRiANu9bW1qr60+xntF3i5QQLv7NA7HqMjjMdKO0KRtxA82vkk3lWjBUMDDSPhpEycAw4UFDQozqqXy2mHxAYKQPPCQ9LP7HEjf4bqKrK+x543w79db03nUgkwvLy8o7HM5lMWZTuep+L3Cs5NLuG6TBR8ypqQWV+YJ7DW4fp7Oys6wYqUzamaTI5Ocmj/kdxppzY2m3Yu+wYcYNCroDQBPH2OIPaIPYuO4xC95FuHJdi+Gx57A/ZCTzRZaV77HE77j43AkFuM0dwM4fDzCOAHo+TNY+Gw5EnkSiSgc/nIzOZIfS/h1DWFbJk8Tq8PBB/AP10lne84yUM4x1ksy5cLp1ioyBEowVGRnaOqtvc3MQ0i2MXX3vtNc6eHeK979X5kz8x2NpyMzSk8qlP6Zw+DfJruXTJjs9nIDlI5tmred7Uam4qFApMTEyUpWd2UzQ1irvhttjd3b0jT6+qall6plAoEIlECIVCTE9P43Q6rehd+s/UG6HX4YX+94F/sf1rEvhlIcTl7b/NAQnAAHQhxIUDHXyDeFMj9EQiwfj4OMPDw7tKkfYToZdOK6rHSrde6LrO1atXcTgcu3qiN7K/8ZfiTD89je7S6RrrQsQFueUcKMXId/byLFkzi02zofUXCb3708UpSaEvhRAIlsPLBJ1BXLjo+GQH029MW5H4jRs3GB4etpb/jeyfoiiMjo4Sj8etWoZUHJU2aMSCMZYfWaZzuhNHwkHenyf+WBz7IXtVeWUtrK6uWvtpmibX2q7xwOwDAGgjGvqkjmmapHpSmJis3Fxh7F+MESZcLK7WsAuQGnlFV9Bv6LhtKqZpRwHeETb4oaIwr7rw++OYponb7Wbri1voqzqYYBomIi7QN3US/zkBT8Ejj4R46aWH8PttBIN28nk7qZTCE0/sNHwLh8M7jjOR+L/55CePMzw8bLl4Sp5VFIWVFYWeHnneFj8Tr1eU5dlrQTY3bWxsMDY2RiaTIRaLMTs7i67rVdMz+4HsRD2Iln03+P3+uoI5u91u2eRCMeAIh8PMzc2RSqV47rnnrHTobqjTC30WeLcQIqIoyoeA36HcUfG9QojNBg+1KXhTCL3UL6WeIReNEnq1gdDNgLwBjYyM7Orw1kjKJZ/PM/kbkyimgmvFRWI6gebTsPXZsAVtxD1xlq8u47a5ySgZss4sp37xlCVB7PtcH5tf38SYNggFQjz03z7EZGayLH+7uLjI2toaPT09llSvVLK324XocDjo6Ojg7NmzrK2tsbW1xYkTJ6zJP9lslmAwyMDAAEO/NsTs7Cw/+tGPUBSFj33sYzsior0u+sXFRSu/L4Qg3hlnyjHF+fR5EisJku3J4mesqxheg/Vz69y8enPPtv7AEwE2n90ku5wFG3g8gmQMom1ubHaFs0mDG24n585dwTRNVldX0ca1Io9mAA0Uh4IoCHzrPj7+8MfxjHl4/HGVb3zDRihULKx+6lPVLYDj8XjZ76ZpWoqOw4cP73i+oigMDBjMz8fp6/NaK9dinn3naLzdzjdFUfB4PJb6SqZnpP2xTM/sZ9jFnYzQVVVlcHBwX0PX3W43g4ODDA4OWlr2P/iDP+AHP/gBFy5c4PHHH+fnfu7neOSRR8peV48XuhDib0pe8iOKBlz3BO46ocuKtaZpdTfd1EvoQghu3rxJJBJp2ABrLzTSTVovocdiMa5evYp73o0ZMjGcBopHwcgZ6NM6yqDCzC/NcN173dqmqqocGzpmbcNz2oPhNpjtKw6eiM5GyefzZZ+X7JL82Mc+ZhGDYRg7yFVemPJxOd3m2LFjeDwe1tbWUFW1rFFEFubkUIjZ2VlrGy+88AIf+tCH6r7gTdMkEomU7YPNZmPLv0XsPTH09+rcmrhV5YVY9gq1vhv3mJuuz3Sx9K+WQIDTp8KgnUjMTiop6NVMfvVXbYRCaQoFO2fPnmXGNoOe0BGKwMQsLqIVUFSF+KU4njEPY2Mmx4+nrQJ78Zzbaa0gvw8ZJQ4NDfHggw9W7SeQKacjR6a5fLmXQKAoa0ylbufZ65FbVvt+5TkkuznhtppkdXWVdDqN1+u1Ivi9ej/k9u5EdN7f34+maQduzFMUhbe//e2srKxw8uRJ/sk/+Sf84Ac/qGqd3YAXusRngG+U/C6Av1QURQBfFEL8zoF2vkHc1Ry69DXZK8KtRD2EnsvlGB8fJxAIVB0IvRt26yCTZmD5fL7ubtJ6CH1paYnFv1yk+5VuIte3FSudGqpDRXEo6Dmd5fAy09PT1n7Iny+88AIf/vCHLaKUU4SgWFSt/Kw0TSMWizE/P8/o6GjN5XHp1JuVlRVisRhnzpzB4XBUNViSOmJZmCsUCrzxxhvW32OxGD/4wQ947LHH6qpfRCIRSyvscDhQFIXz58/T2dlJMBjkhz/84a6vf+6553jyySetgmYpFEXBPebG/w6/ZU/gBoIYGEkDW8BG39vbMIyPWNG0a8xF8m+SKFqRhIVRbHrKuDJEX4ny7f/j2wBsbPQwPX2CeNzP8eOCT37SWxaly25kVVUZGBjgoYcewuv1cvXqVaanpzl27KO8+KKD1VWFvj7Bhz5koKoTKMp1Pv/5w3z3u4olrfzkJ2sPAdmtjV6SbunNVX7fpfbHQggrPSOHXew2nepOEDmAx+Ohu7ubbDbbNJO8VCqF1+vF4/Hw/ve/v+pzqh1PLW5QFOW9FAn98ZKH3ymEWFEUpQf4lqIoU0KI7x945+vEXSF0IYrT7JeXl/fla7IXOYfDYSYnJzlx4gTd3d0NbVveLKoRdanUsREzsN0IPfZSjJn/fYbCVAF71E62N4upm5AHM2tSCBSw++1sGVtknJmqy81YLMa1a9d44IEHME2TpaUl62+SzPv6+qyGjCNHjuBwOKymjN3ynbI93mazcerUKetYZAqnWpelJIutra2y/LzcNzm/UlGKAwWqeYZD0WZZEnKhUODrX/86R48etZ67Vy5e13Wee+45PvzhD5dF6qXfh7QngKLk00gZhG6FSLwnQXYuy8DAgFVo6/p0F5krGYy0gTAEiqqgelUIQt5TLEqur3fz6qsXsNtz+HwpCoWuohLl1BrOvwqjR3RMr8ng2UFGPj2C1+tlfX2d119/HcMwCIU6efFFO6a5xvBwF4mEnd/8zRynT4f4+Z9/Hz6fnfPn6xv6MTmpcumSrUxXL1H5/ZWiMv0mSa+a2ZamaQQCAdra2nC73Xck5aIoitVl3cztp1KpPe126/FC397Hc8CXgQ8JIbbk40KIle2f64qi/BnFkXR7EvrI0889Aihzzzz1ysjTz2nAg0AemJ975qn4ri8uwV1LuUi/lGbdbeH2DM2DTEOqRb4yD9/ISLs9t/nXm8z8v2bQkhrqlkrBKFBYK6DaVXCDmTcxIyYbYoPU0RQFf6Eq8UnZ4KFDh1hYWKi6D4lEggceeICtrS1rHJ3cp1qEnsvluH79et1TjyoJYmFhwVrGlu734uIiP/3TP83s7CzJZJKJiQkcDodFDLJJxGazWUM/ZmYcfP/7b+eHP7RZBliV3cLr691MT59gc7OLQsGO06lz/LjJAw/4OHuWqsdaqncvrBaw99vJfSDHMsuEfhhCCEF7ezsjIyMMDQ3R/Y+6Cf1OCE3VUP0qWpeGU3GyfnwdgOnpExwyUjyYzNJhqmRji8RMyL6eQg2A6lchDd3f72YqM0X0TJT19W4mJy+SSLSRTHppb8/hdCZYWsrQ1dVFJhMlFnsXPl/9q0xpJeDzCbq7hSVxfO97PZw9u/uKcTeiL232KW1uCoVCZLNZcrkc4XC4qdYc3d3dVpG4tO3/oJAd0ruhTi/0YeBPgZ8TQkyXPO4FVCFEYvv/PwD8m93eb+Tp5+zAx4D/5/bvvw+sA/890At8Z+Tp535l7pmn6mqVv2spl9HR0aYuz/L5PFevXsXj8dRUm9SDynROM/Lw1Qh9a2uL6//6OvYNOzafjYIogA6YIGzbKR87FESBFWMFLa0ROhuqWeE3DINvfvObtLe3W2508rler5fOzk7sdjv5fH7H/lQj9Hg8zuzsLEeOHKnbcbJyG2tra0BxCZ/P5zl27Bh9fX10dnaiqiputxuv10t7ezvZbJZYLGaZNMmcrd/v5/p1G88+a0dV22lv14nFNJ591s7Roz78/qJapBgZXySTsROLdSCESiajsrFh8nu/R5lZVuV+Vqph7Ft2Fv5ywToPtra2iEajvPrqq1y4cAF+CfxTfusGEHgiQMdQB8899xz+TRfvTiXIqwpG0IPXgNHNOHlFQdcK5JPb/i6qQu94L5MdKq+++jB2ew6vN8nmZifr64KODideb45QaJWBgV4iERdQv93FpUs2TBNmZ1VSqWLXaWen4Ec/6uapp/YnUayWwrHb7ZY1sDShM02TW7duoeu6JY1sdHi4hLTilWh2hL5XdqBOL/R/BXQCv7UduEh5Yi/wZ9uP2YA/FEJc2mO3jgD/BPjPwAWKlrz/CPgFiiPt/ifg88AzI08/p8w989SuJHrXIvRmypqi0SjXrl3b18DpSpSmCPL5POPj4/j9/obz8JXbLM1Hz83NsfbiGrbXipOXREZg5s0ioSsg8gL7oJ30Wpp1ZR3d0Llx8gZpZxqV2x1/Em63G5vNRm9vL4ODg3R3d9PR0cHNmzfp6+uzKvKrq6vk8/mqJkmlF+va2polb9st112aYqkW8b3vfe/DbrdjmiZ/+qd/yuDgYFlEJCNB0zQtWZ0c6SZNmlZWVvjKVw5js7no6vKjabbt1njB1aujvPOdSwwNDfGjH42iqjYSiS5stuIoO4D5eY0zZwwuXbJx5oxeV3G6o6MDp9NJOp22HpOdl4cPH2ZOzNH3oZ3pqp/4iZ9A+WqSrKKCy7ZtNwAYJqpSPJ+sY7cJ7Fk709Mnyuapulw5CgU78Xg7Xu8qAMvLUY4ds7HX5VmaYrl+XQEU3G6BywW5HMzNqfj99fnpNIJSB0RFUejt7aW3txfTNEkmk5Y9gfSekemZeq6noaGhMgJvZoRez7QiqMsL/bPAZytfJ4S4BZyvZ19KyHkIcM8989QXR55+bhZ4Yu6Zp/7L9tMmtyP4/w54hmKzw67FxHumU7QemKbJ4uIiq6urPPTQQ9ay7CCQTUBScXL8+PEDD1mWNwmpWVdnVDzPekhlUyDAzJm3x8Zudz6aBZOwPcxqxyr5YJ5kVxKn3cnHP/5xkskkly5d4qmnnuLFF1+kt7eXBx98cMfxp1Kpspy7w+GoaWomL8rZ2VlM0+TMmTMNqVGqQUY/V68Kvv/9t/NXf9XHiROOmn7hEpqmlZk0pdN22tpypNPp7fqGA7vdjs12mL/7d3twOp189asFMhkboKJpYJoCTYN8XrC5qWCz7e2cKKEoCsePH+fq1aslUXofKyvv56//2obbPczP/Iy64xgGBwc5Gpji+roTv82JAPQC6KqKHYNSDYWiKxRcBbLZTjo7DVKpAkJAMBhjfb2HXM6BEJDPOygUHHg836NQeE/NNEZpisVuh0RCwTCKPzVNweEQ2GwKuVzznQVr3dBVVbUIHIrNPjI9I9UzbW1tBINBq2ZVGuS1t7fvKGhXm1a0X9xjnaIyCvEDMpKwUZRBMvL0c+65Z57KUDS5qNu45i1jPaaqKm+88QapVIqLFy82hczldldWVpiYmOChhx46MJnLbWYyGV566SV6enpw/Neiv4riVMCk6gzw2GaMef88aLB1olhjKRQKvPDCC3R2duJ2u5mfn0fTNLq6uqoefzAYJBqNWr+7XK6qhK4oitWh63a7OXbs2J5kPjGh8F/+yyDPPnue3/gNB5OT1Z8/Oanye7/nQtO68HjiVi53crJ280nlY4ODCqbpsi5+l8tBImHQ1lZMC62urjI8bCOZVLHZFEyzuC+6Dg4HxONFrXYjkLpjgEhkkFdfvcDWlkFXl0kqZds+Bm3nvj4Y4IFjCi6XRjYDDie4hhxomoJX8xZz7wUVzdBYe2CNgQGB39/L6OgonZ0duFwZgsEILleWVMqH253jp37qBn/3757aVVEl3RoLBYXJSXnzUjAMBV2HXE4hmWy+VWwlme+26rbb7XR1dXHkyBHOnDlDb2+vNaru2rVrLCwsEIvFrJRhtebCZjokJpPJe4nQ5QdXAGQh7DXg3wFskznACYo59bpwV1Mu+0U8HieZTHL8+PGqTRj7hWEYhMNh3G53Uwu2UtN74cIF/H4/q6+uorpVVJdKfqG41BZCFE2sFDBUg3V9HcNpsHZ+jVRPytrWxsYGsVgMm81GOp1mYGCgptojGAwSiUQsS1O73V6V0AuFAuvr6xw7dqyu6U8TEwpf/rIKuOjoSO3wFCmFJJr2dh+rq6FtYi22q3/ykzu3XS3ae+IJnWeftQMCr1chl7NjGA4+/Wk7R48eJR6Pc+FCiO99b4BCwcAw1G19t4LLJdA0Gx/6UKbsnNsr3ef1egkGgyQSCTKZ9zIy4thutTdxu01stqIX+thY+Yo3+ESQwrMbdIzmLdWMmdRwvruD1F+lcEVc0A7LZ5bZGt7i3al1Ut/KEzRy5HwOXixoJDXBE0+8zPve18Pg4CDZrM+S+MrxbaWOiuFwmGvXnBw54mdmRqVQyKEoHoQwARUhQAgFn8+g2arC/aZNS5ubqqlnBgcHWV5epqOjA5/PZ313zS6K3kOELiP014DYdkQeAkIyHTPy9HN9QA8g8/B7fvj3dMql6D+9zOLiIsFgsKljp1KpFFeuXMHj8XDo0KGmnDTSOyYSidDf37+juKi6VFSvipm6TWC5QI4Nc4O4iKO79TIyVxSF97znPSwuLuJ2u1FVFb/fz+Zm9a5iqfKRg4llPru0sLSxsWHtX72j/J5/XsHrVfB4XCiKXP1V9xRZXVXo7hZEIk4WFzsIhVQ8nmLLeiVqmTmNjZl85jOFMgnebf11cQLO4KBKd7fK6qpA0wSmWUy7GIbJP/gHcU6etCFEuWa+9Ge1gt873vEOVFXlC19w0t1dtLU1zeJzPB4IhXYGJdVUM4FPbo/GK8myHhfHmX1hFv4ccsN5FjftiLjBewsZAj/n4LFPPm7tm8/nY21tjdnZWd773veSTCa5efMm2WyWjY0NotEoAwNPsrWVIxq1YbOZKIpUpYDDoaDrxZuQy1WM3JuBZjopljY3ScMt2cgmI+mOjg7y+fy+rHKrod4c+p3EyNPP9QPG3DNPrY88/Zw298xTq8Bq6XNk4XOb4P95yeN7fvj3LKHLlICiKDz66KNcu3atac5xa2tr3Lx5k7Nnz7KxsdGUkzSfz3P58mXa29s5duxYmXeH7xEfib9JIBRBxp7BgaNopGU3SIkUMT1GtiuLI3G7ICkvnitXrvC+972PWCxGPB5neHjY6sashKIoBINBYrGYVYSSUbrT6WRhYYFcLkdfX19D4/ZWVookXRqcVXp3S/T3CxYXFebnVex2Ly4XpNOQTqvcvOmy5IR7oThztLb++tIlG8eOweHDCktLRVMst9vGyEiehx9e5tq1pDW/MhAIWMXe3RpHpDy1r08Qj2OZYimKQjotaqZxdvOQKX0Pzxse9HYdt08lOFB0pYws6wRXjbLVRCQS4cqVK0DxXJWptMXFRYaHhzly5Ahzcwu88sopcjkn4MQ0FYQoplt0XWCzQXu7yeBgFjjYhB+5/5XXSTNGuqmqyvDwcNmgaVkkL7VtTiaTdHR0EAwG9x183SMR+i8Cp4G/P/fMU8bI08/Z5p55ypKy1aNk2Q33JKFLX/RDhw5ZeTWbzXZgQjdNk+npadLptDWfNBwOH3i7sqAqG5tkx6PEwD8ZYHZllsJGAaEXhyCrpkrBVmBVWSXdlcbUTAzv7dfY7XbOnTvHqVPFXKrL5WJ1dRW/308ymay5Lx0dHYTDYauJyOl0kkqlmJ2dxe/3c+LEiTJv83owMKAQjZqUpu2reXdDMV3yP/6PDhRF4HbbKBSKy//Dh01efNHP2bPbXiwHjPbkSkBRBO3tgkgkTjDYycaGg5GREcT2/EppSCU7HqU0slo6Rv780IdkygdcLoVMRkNVNT75yfoafGqhsFqw7I5VRcUUJriLo/QkDMPg+9//vnX+vPzyy1Ye+YknniAQCPDVr45z+fJh2tsTbG1BJuPh9mq8uJJ3uSAUUnn88TTNIPRqaAah9/X17ZAGl04yklJIVVUJh8PcunXL6leoTM/sBcMwmj6TeB8IA58aefq5ZeDpuWee0keefs5GMWoX26mWESA598xTDRt83XM59FqeKQf1RJfui11dXZw8ebJMgneQ7S4uLrK0tFSmuqkkK/9FP6P/2ygz/78ZUq+lMGwGjriDefc8SS2JVtCw5W2sn7td+8jlcoyOjlqRtMPhIJvNWvK6avpcRVEIBAKWHwoUbwzT09OcOnXKatppREKqKApPPmnwpS+pmKbY4SlSibExk54eQTKpkE4XI/mjR02CQcHSkt1qPz/oqqi/v9g8IwMuIRRSKdOKohXl9vzKvr6+MjOsxcXFqo1Npcfwmc8U+MY3bKysFHPRn/pUzqoX1JO+qQbp+Gjz2YpkDpAB+/Btknn99dfL5JOlXbcvvvgiNpuNH/zgHG63jt2eIpl04XIZJBIauq5gsxnbrxMcOZJldtZ9YOKt9X0dVCPudrv3FCHImaXt7e2W0Z5sZqpMz0j5aTXcKYuCfeCLFPPi/xywjTz93D+TEfp2zvxx4N9TlCn+1sjTz6n1pFok7pkI3TAMpqamKBQKVT1TDkLo0hqgmvuipmlVTXrq2d/JycmqHbDVLgD/RT8LP73A5NgkAMqMgva6ZlnNrp27XQyVdqSZTMZaIkqyTiaLqYRUKlW1Aai9vZ1bt25Zx10oFOjp6bHIXG6rnhNcPu/0afjEJ8J87WsGCws+BgfhE59QGBur/rrjxwWxmKB0dZtMQnd38XNuxsVVWjj1eCCT0cjnq99koPiZlvqFV06fl34lMhocGzM5fbpALpdjfn6J48ePW9vajcAr/W5KuzADTwRYf3YdhaKFQG41B7cgk8sQ+o0QxqMGMwszNc/zVKp4fiQSbfT0CLJZBXCjaTlU1YPNZiC71NNphd5enVDIxrVr1/B4PJajYiNR6m7nSqU3TKOoZ4h6taJoZXomlUoRDoeZmJhA13WCwWDN9EyzVT+NYu6Zp8yRp5/7AsVR558H0iNPP/dHwNsoNhQ9DKwBk/vZ/j1B6Ol0msuXL1uNKNU+9P0QumzqWV9f55FHHqlaXNE0jWw229B2M5kMly9fZmBgoOr+1opoZJt+oVBg07eJeLz8QtE0jZGRETweDwsLCyQSibJCcCAQIB6P4/f7SaVStLW1lXmcm6Zp5Vtl9NLR0bFj/+qdLCOft7i4SHt7iv/pfzpMJlO0XU0kEkxP26wctdPptN6nXKVyO6L/2MeK6ZZmEHp54VTD5yvw6U/XNq6qhMvlwuVy0dPTgxDCspOVDTHBYJC2trYdBL0Xdmuj95z20PvZXuLfiJO5nilOYOoF16gLPaqz/FvLuB5xke3PWt9ntXPe748Tjbrx+ewoSgZdtyOEsd1gpVAoFFcuhYKLvr4UZ86cqWq4Va8feq3v6yCSwu7u7ro8nfZSuSiKgs/nswqrhmEQjUaJRCJWemZra6tuW5C9hlts38T+d+BJivrxfyiEeG17X54A/gNFsv6yEOKZyu2PPP2cfe6ZpwrAvxp5+rku4FeAjwLdQAj4H4D/NPfMUxGorxBaijc95RIKhbh16xZnzpzZVXXRKKEXCgWuXr2Ky+Xa1Rqg0eX/1tYWU1NTu3q8VNumaZqkUimEEESj0aoXSdGsKcSFCxdYWFggEomUze1sa2sjEong8xVlbTJPLo9NuhRC8aYzNjZGLBbbIV2sJ0JXVZVCocCNGzdwuVycPHmyrLUbikvf0ijX5/MRCAQ4ebKNz3yGHSqVzs4CQjTPy2dszNzuBs0zMbHA2Njunui1oChK2XFJO9mVlRXS6aI1biQSwe/3N1RMLoWMZp0nnfSc6iH0GyG0Po1EPoGqqCh+BU+Hh9PR0zh/2ommafzgBz+ouq1jx6b44Q/fweamj2xWRddd2GxiO98vEEJhYMAklYKPfCSOovTskAxWpp/k8Zf6oe91bew3Qnc4HHW7rTaa1tE0zbJ3huI5+q1vfYsvfvGLzM/P8+lPf5r3v//9vP/979+he69nuMU3vvENKLbkH6c41OI/AY8piqIBvwm8H1gCXlYU5S+EEBPytdsFz8J2jvwTwLspFjjOAH8FfEwS+X7xpkXopmly/fp1MpmMVaDcDY2kRuQgitHR0TJfiFrbrddrfXZ2ls3NzT09XqpdCNLnJB6P73ocqVQKwzCsPGEp2traWFpaIhgMlhVGZVSYzWaZnp6mra3NGrvldDopFAplQ4P3ijhluqfUqKvaDcDpdJa175dGuTabjU9/+nb0rqoqq6vNd+a7E7lRp9Np2clmMhkWFhZIp9OEQiEr9dXW1obH49m3TbNVIC1Q9FoXkE1nUeYVPL/lYbWwivOQE6PX2LENAFW1UUw3OVAUMAwIBosSRa/X5NAhweOPJ+nr29mHUJl+kjfm5eVlcrkcXq/XOsbdouNGBo2XorK9fzccVIfudDr58Ic/zDvf+U5+9md/lqeffpq//Mu/5Itf/CJf+MIXyp5bz3CLr33tawB/IIpfxI8URQkqitIPjAA3ttv/URTlqxQjb4vQtwue/yPw88BR4K+Bfwu8A/gI8CmKN4h9400hdGlL29PTw6lTp+o6KepNjSwvL7OwsFDXJCSoL0LXdZ3x8XFcLhcXLlzY82Ssts1sNks+n7fyoLvhhz/8IYqisLW1VfZ4W1sb8XicoaEha86nfK9oNMr8/DxHjx4lk8kQjUYZGhqyVC7VzLkqB1rIn/F4nFu3bjVk1FUZ5VZG735/cXByM6euN1MXXWub0vJXTr8pFArWQI9UKoXH47HIb7egpHK7skAqsTW3hWvehUCQvJ7EbtgZWhhi6Z1LZb0JADdujDE0pNHX50FVQQiDZBICAfj8528TeCyWJ5HY+9qqvDEnk0kSiYSlhpLHJ4MEif0URYPBYN39D/t9j2pIJpP4/X7OnTvHuXPnqj6nnuEW29fdYslDS8Dg9r/Kx0vH0kn8Pyh2hv4PwItzzzwVGnn6uf8LsAO/OfL0c2Lumad+u8HDs3DXUy4bGxtMT083bEu7VyQti6q6rnPx4sW6l8Z7bTeZTHLlypW6on2JakQjR7Z5PB6cTieRSITDhw8zPz9vPUd203V3d5PJZNjc3LQ05LKpKBaL4ff7SSQSKIqCYRisrq4SDoctc6329vYy58PKSF/mxquR4cbGBmtra5w+fRqn01kzJ7wXSklCURQrco/H40Qikaq590ZQbx2gUVQea6VCxG63l01skrnpmzdvIoSwbmqlcjpVVUldTRH75u3mI+dJJ/nv5sGARCYBE2Azbeg2nVyhOE/WmXTSe7mXW++/ZZ2nRRfNYTo7FVT19nfj9Rb7BSq9zRslQ3lj9vv9DAwMoOs68XicjY0N5ubmcLvdVnG1UfWMpmm7zg6uhmZ1itajQa9nuEWNa0FQvXur2pM/CczNPfPUMsB2c1Fu5OnnfpmiMchvjTz9XAH43f3o0e+qH/r09DTxeJyLFy/WNcGmFLsRbzqd5sqVK/T39zM8PNzQSbabbFHm9+sZO1e5zUqycblcfOITn7A6/eLxOKqqWsc1NDRENpslEAiQyWTo7OwkmUwSiUTo6+uzmoQcDgeqqpJIJDAMg5s3b6JpmuV5DsUoaGpqCigSa6nrn0TliSmLn7lcbod/ujwmeWE1QvJyO21tbWSzWStlUWqdK3PvUmHyZqFRR9DKdnbDMIjH42xtbTE/P281NjlDTqK/H0X1qdi6begxnfx38zje6WD9+XWcC05UU8XQiuehLWdDd+kYNgPPhhwebfL2t7+dra0tdH2R5eVhEgmVdFpYVrmHDpUPsZCEu1+ZJVCm+S7V9s/NzZHL5bDZbFaQsdd3Nzg4uC8deDOUKel0ek//p3qGW2zfkEpN1YeAFcBR4/EyzD3z1A/gdgPR3DNPGduP57dJXQW+BPwZRc16Q7hrV4+u6zgcDh555JGGyRxqE/rGxgavv/46p06d4vDhww1/+dJtsRQyv7+yssLFixcbInPYeQKura0RjUaZm5tDVVXOnTtnrSBGRkbQNA1FUcjlcuTzeTY2Nmhvb7eaKeQ2JTHm83kKhYJl9XvkyJGyi0l2iwohqjouVu6frutcv34dTdM4fvx41QtTRvTSNrV0W6qqWlLLeiIaaZ17/Phxa6WWSCSYmppienqatbU1stlsTcK5EzMsd9tmveeUHAYxMjLCmTNnrAHFy3+8TMpIkUlkSF5OkrmaIToT5daf3yKtpYn3xxE2gVAEqCAQaPnyqNTr9fLGG28ghOCDHxxift5DOl1sIEqlYGZG5eTJ8uujdNi2dNcsnT4lj630O9zrc5C6/hMnTjAwMIDL5SIejzM1NcX169cJhUJkMpkd2/D5fE0d2N4o6jHmKh1ukc/n+epXv8pHPvKRsuds//7zShFvA2JCiFXgZeC4oiijiqI4KObD/6LyPUaefk6B2+39pZh75il97pmnPgP8V247MDaEuxahO51ORkZG9v16TdPKhj0IIbhx4waxWGxfEX/pdktvFLKFv6Ojg4ceeujA0UE6nWZmZoaZmRkOHTpk6cF7e3sJhUKcP3+elZUVotEomUwG0zTxeDzYbDZ0XbeahOR+BAIBNjY2rMhJKl1K4XA4cDqdvPJKhr/8y04mJh5jYkLlyScFp0+Lskg0nU5z48YNhoeH9xzPVQ27Rev1RNvVFCa7Re93Im8OtaPVg5hReb1e3G43uWwO4RZkp7KYqolQBQoK/mU/QhMItWjUpppqsUCqgGqoaLpGsq9Y/E4mk2iaxsrKCs8/H8Vud5FIqCQSEAwKjh83uX5d48knb5/L9eSfS6P1yqlWpT9rRfWS4OH2d7eyskImk7GKq4FAYM9JQXca9RB6PcMttn3SbwE3KJLuLwAIIXRFUX4V+CZF2eLvCiGuVb5HnWmUv7ff9v97QodeD0pb//P5PFeuXCEQCPDII480rQtODs7Yz2zSajBNk5dffpnZ2VmOHz9etuQbGRlhcXHRKhClUil6enrY3Nykr6+PTCZDPp+3jLjkfmqaxvLyspXDrYVkcoRnn7XT1eXk5Ml2olGFL31J4XOfMxkcVCwp3sLCAidOnNjX+L7dUC3HXZpTlqi8IVQOvqhUzpR2dzarSaTRVEu9kNu099tJvpREdajY7MVLTitoGBgYBQOhCBRDQREK8j9TNcn5c6ydL9ZCNE3btjl+gNXVIF4v+HyCdBqiUZVsVrC4KHjiiXLf9kZVOJX/X/m5lBbUpaunfKzyu0ulUsTjcQzD4OrVq1bq5s1IrdUzrQj2Hm6xfay/Uu21QojngecPtqd1k35V3FVCP8iFIyPpZpOujPyrtfAfBEIIXnjhBdbW1jhz5syOws7AwACKolAoFKwxcbJxyOVysbGxYTUJyaWzzO/JSTC7ebpMTR3Fbs/i97sAO1Jl+fzzCv/oHykkk0lSqWLTyX611ftFtQi7spgnUTkwIRqNsrS0tCN63y/q0Vrv58ZROZg6/r04imc7/aELzLSJ4lJQUyqKqmDaTEzDLObS7QaJwQSxt8X4iU/8BJ2dndY+/MZvuHA6IR5X0PXiUAtNE+Ry4PGU2xo3Mhyi3pWP/G5k01NpiqYy5dbW1kZXVxenTp2yVpuhUIjp6WncbrdF8LWCiWbeZO8Fp8W7gbdMhK6qKul0mqmpqaaRLhRPzGw2SzQabZonej6fZ319HU3TOHHiRFVCcLvdOBwOFhYW6OjoYHNzE13XrVXI+vo6Q0NDlutcLBajp6eHsbExLl26ZP2tFmIxHy5XDAhaj0klxPLyMoVCgfPnz2Oz2epOYdRLbruRw26pjd1yt1JT39vbWzV6z2azrK2tNRy934nIvPL43WNu3Ofd5G7kMLMmmldDdakYWQNDNcADtrwNQxiYikliMMHik4s8+OCDhEIhkskkXq+XeDzOK68Mkc360XXbtrUvFAoKpglHjpjY7bdtjev9vvarGJI+KxLVvkPZSW232+np6bF6GtLpNOFwmOnpaXK5XFm7vtxmM+eJJpPJpgSA9zreEoSu67pln3vx4sWmGd7LFn5N0zh79mxTlvDxeJzXXnuNSCTCgw8+uOtze3t7WV1dZWRkxJI1ylWIYRj4fD40TWN8fNwatuzxeCy/cylNrIahIYVbt0xKi/SJhInTGcHtdm+PdKufzOvFncxxl5KFXNHIvP+VK1dQFKVq9F6LFOpZMe4nQq+2za5Pd7Hx7AaqT0XzaiRfTWLGTAxPMeViuAyEJkADVVetwvzp06eZnZ0lFArh8/nI50ex203s9hzRqB0o2uYahmBpSWFoCFZXb+/HnUxt7LX9rq6uqlGxrC94vV4OHTpk9VGEw2FmZ2et+pC0XmgGUqlUWdf1/Yq7msjaz5eTTCZ5+eWX6erqwu12N43MNzc3ee211zh16hQOh6MpJ87Kygrj4+MEg8G6lBgjIyOk02m6uros+Vdvby+bm5v09vaSTCbJ5/OWdl1eQDLFkEgkam77ox/VSKUUEoni8IdIRGdtLcXHP263tOHNJt47lYuG6vrwUuWGqqr09PRw4sQJzpw5Q0dHB8lkkuvXr1vKmVL1RSNKmUZlsNW2Kwdh2AI29A2dqC+K4TSKSmUBoiBQhUremyfvz1sSyPHxcYaGhnjyyScZHR1FVTPkcgWE0LHZTIQARQGbrTgY+to1Fafzdlpkr30/iGJotwjabrfX3d6vqiodHR0cO3aMixcvcvr0aRwOB4uLiyQSCSYmJgiFQlXlt/Wi3hz6Wx33dIReqQMvbcLZL4QQ3Lp1i62trT1b+OuF1NhnMhkOHz7M+vq69V67XVClTRb5fN7y1FhdXUVVVStSl+kWeeEFAgF0XSeZTNZ8j3PnNH7iJ66RSHSysqLi9cb4lV/x8vDDDstT5k5gt+3u5ybSaMQv31/6aUPxs41Go6ysrJDL5fD5fASDwQMZU+1nX+UgjNdee43rE9fpnOpk4LUB1JyK4TTIerMIVbB1Yov29nZOnDhBNptlYmKCl19+GYD+/k66unwkk07SaQVVBVU10TRBoaBjmkV1lLzh7Xb+HfQGvFuEPjQ0tO/gS7optrW1MTs7y9DQEOFwmKtXr2KaJu3t7XR0dBAIBOpegbRy6G8i5HIzm83W5fNSL2QLv9vtrquFvx6UyhwHBwe5ceMGqqpis9msC6rWReNwOKzBFTJSMgwDIQQ2m418Pk8gEGBra4uTJ0+WEXoqlUJVVXK5XM0RXWNjJsHgG3i9Xo4fP27lJqtp7/dCJpNhdnYWt9ttkWEpWdyJVEuzVhEOh6Msf5tMJq3iqs1ms3xNZNdqLXXOXhBCMDmplpmSPXEyTvv1qNUhGj8bZ2JtAu+6F++ml7wnX1S8OAxygRyO9zg4fKLYQSxJvKuri3PnzhEMBhkY0PnqV/P4fHEcDj9er5NMRsXlUvB6bfT05EkkDK5dm7BIXY4jrLXP+0WtFUBpKuwgkEVdWRgfGRmxiqvr6+vMzMzgcrms4upudbV7ZFrRHcddV7nshWw2y+XLl2v6vOxXdbBXC/9+tls6qaijo4PJycmyXG9p23I1FYcQgu7ubkKhEH19fZbSRtM0bDYbyWSSoaEhFhYW0HXdIhpp0uXz+UgkElUJ3TAMTNMkmUyWSTv3cxOTPjHDw8MUCgVruEDpiLd6brp3MiVTL6SFQmn0HovFmJ+f35F7l5I8+W+v1cfEhMLX/kOeM7EQj6YzuF7PY/y5TsSuYOvUSCVSxF6J0TnaSftsO4bdINuRRc2raAWNrZNbZMwMTBVXGLKgGIvF+NGPfoTL5SIYDPLBDw7yxhuHCIWcOBwKZ86YtLcX9y2ZtDM4aOfMmTPMzs5imuYOy1y/37+vm3olqqVcNE1rmua8Wtu/zWazpJGAVVy9ceOG1Wnd0dFBe3t7WcG2RehvAqQ17djYWNlABolSLXYj2KuFX0oiG5HvSROwBx98EK/Xa3WXle5rpa63GiEcOXKEF198keHhYTRNI5PJ0NPTQygUorOzE4fDgcNRTJNI75tAIMDExITl6VJZvc/lcly/fp3u7m6i0WjZjWqvVUMlQqEQm5ubjG1PsxBC0N7ebrWBR6NRbt26ZXWxBgKBHSZO+8HdIv+9dO8Oh8PK1ddqo5f//uYP8zwWCqFp4E3lsBcMFMAsCPSQjrFuoLar9I73kmnPYDqLhCp/dl7vZKF7Aa/Xi8/ns4ZujI2N7TD/+vjHYXKywLPP2rHbi/NeSydJye7Prq4uvF5vzYlN0k9nP6gWBA0MDDRtRV2Pj4u0XhgaGsI0TWKxGOFwmPn5eVRVxW63E41G62osKkU4HOaTn/wkc3NzjIyM8Ed/9Ec7vKcURTkE/AHQR9GH5XeEEP9h+2//M/A5YGP76f9yW6d+R3FPELoQt61paw2igNvEWy+hV5shWg2NpAtkOiiXy1kmYFtbW2Vj3xrZpmwPTyaT2Gw2nE4ngUCAW7ducfjwYUuaKPPlgOWF0tfXt0O6GI/HmZ2d5ciRIxQKBebm5nbsUz2pDNM0mZubwzAMyz60UCiUmXo5nU4GBgbKfEykiZPH47GGRDSqc79TZL7Xd1LatZpMJq1UWCwWY+L5CRyvONCiGu5DboIfClqDoYUQbG5u4rtSIG8TdKcMHIViN6jlz6SCIhTcMTdCEaR6yx0UTYeJM+nkgx/8oHWDrvU5lKZ13G6BYShsbGD5zsvGotIcd6llrpQAx+NxFhYWqk5sqgeVEbrX6y0byHJQNCpbVFWV9vZ2i3jz+Tzj4+P85m/+Jm+88Qaf//zneeqpp/jABz6wZ8H2mWee4Sd/8id5+umneeaZZ3jmmWf4t//231Y+TQf+iRDiNUVR/MCriqJ8S9z2QP8NIcT/p+4DaALe9JSL9CTxeDx75rVlO3w9bf65XI4rV67U1cJfrye63GZnZ6eVDsrlcmWGPhL1kJIkTRmFyyW/bHaSBdJ8Pk8ikbBOcKfTaeXfS5Uu6+vrrK2tWa6LhmFYr6tcYu+2b7quMz09TSAQsMZ8ybx+aURqmqbl7a4oCsFg0Ire0+k0sVjMklY2I6daCvXqVbQ33sB48EGMM2f2fH4j+fiNjQ2+973vYRgGTzzxBOasifo9FdNpUmgrEF4Is/kbm2R+MkOsI8bW1hZer5ee/ClcSQOXXrIygyKxmwIVFWFsDwnPq1ZkDqDmVXK+HGtra3R3d++4+UgSn55W2NhQGR426e8X21E5VjNRKap9x/Jz2Gtik4zed9P0l94wFEVpenv/QZ0WpXfUV7/6Vd71rnfxL/7Fv+C73/0un/vc5/jzP//zXVcSX/va13jhhRcA+Af/4B/wnve8Zwehi6KHy+r2/ycURZmkaKM7wZuENzVCj8fjXL16lSNHjlT1JKlEvcQru0lPnjxZV8Swm+OiRGm+XEZQcmVRjSj2igZlWqSvr4++vj7W1tbw+XxkMhnLq0U2FblcLstsqzSPPjvr4Tvf6eS//lcbPl+cd7wjzwc/eLasLdvn8xGLxcqWi7vd3DKZDDMzMwwNDdHe3m6ZOZXmkuWxSx27fI78DIUQuN1uPB4PAwMDZR7iuVyObDZrRe+VF2w9Kxv16lVc//gfQ6GA3W4n++//PTRJbz07O8uPfvQja0J8LBaj8EIBNMiZOTLRTNHSGCfGDwySI0kGbw7iWnPhyuURhorJbT1wMUYvahOFUvRtKXgLaHmNXM7FZtKPlrfj1Qp4PuVheLiNRCJBoVBA1/Vt4zQbf/InnbhcGcJhF0I4mJ9Xcbtl7vx2M1Ep6o1wa/npLC8vk81md9QVJAzDsM6H3t7epttHNLOxSAjBI488woULF/jn//yf7/n8tbU1q9bW399vKddqQVGUEeAhoNRA/VcVRfl54BWKkfyBphHVgzeN0JeWllhcXOT8+fN160P3InQhBIuLi6ysrPDwww/XfYLtVSCS+fLKDlU5oqwadosIS9Mifr+f0dFR/uqv/orjx49z8+ZNotEogUCA1dVVfD4fTqeTtbW1smOPxYb49rcH8XgM7PYwqZSLb37zMMPDJqdPCyt66ujoIBqNWjWJ3XLo0hb12LFjuN1u64KtdlHJm4Y0zAIsYq/0Wpf7oaoqmUyGtrY2otEooVDIahAKBAJ4PB6MQgEzHMbc2sIIRzC2Nov/vxXG2NpCpFL0nnsACgUU00QUCqivvw6PPGK9X2YyQ+zSbe/x4IeCuE65av498EQA1ykXV/7iCvFvxhmNjWLaivu/8dwGji0HRp+Bo8dBR0cH+UKezfVN3Ctu+rf6MewGWkHDtOnYDQcGlQbZxfSLqZhk2jNkujPMdBk4XuujwygQd+m87Haz+E0Pj2z+kP7+MJqmoWkaqqry3e8+ihBJNE2QzXrweEyEULhxQ8HlUkililr0Sh+Xyhx3vWnAyrpCMpkkHo+XTWwKBALWys/lctUVkDWKRutatVBrNfpTP/VT1hCPUvz6r/96Q9tXFMVH0SHxvxNCxLcf/k/AFyieCl8A/jfgFxva8D5w1wndMAwmJycxTbPhVvvdCN0wDCYmiiudRrtJa23XNE2mpqbI5/M7hmYkEoldOzWrNWwIIVhbW2NjY8NKiwAcPnyYF198EZ/Ph91ux+Vy4fP5CIVCVvORpmll+fIrV4ax2bLbcjUvTqeLRKLo1VLqqNje3k4kEtnRZSmJWqZPSvdLRt7V7HChdjpJErv87Cuj90I+j5lI4Mjl6NwK0xkJk19fJxdaI7K5QSwWR0mnUQNtaF1daF1dqB0d2AaHcJw/j9rZia2zE2N8HGw2hK6D3Y750EPWPmQmM1ZHpq3bhhEzWP/yOt2f6cY95t7xdz2ms/7ldRZ6FnBccaDaVYQq8IWKBbTcQA6nx4m2pWG2mazF1zANEy2voRZUDJ+B6TSLhO4yMQsGqlBABdMAdTtWNzSDVG/K0pm/PP0g+oAXr9fEbi+OkQumVa5ffzvz8ykiERdeb4wHHpgnlWqjt1fF43HT1uagUADTVNjagq4uE00rLlBKfVzk+VaqbtqPqkVRFEsVVDqxSdrkzs7Ocv78eQqFwr4dT2vBMIym9IlIVJ7L3/72t2s+V3Zx9/f3s7q6Sk9PT61t2imS+f8phPhT+bgQYq3kOV8Cvn6wva8Pd5XQM5kMr7zyCkNDQwwNDTWshKhFvHLAxeDg4L62W+1kz+VyXL58me7ubsbGxsq2qet6WbGxnm2apmmlZ86cOVMW9cooRzYSORwObDYbuVyOrq4uS9sej8et12xuOoF1AoEhbLZiLlB6tUjIpfTs7OyO/TNyOSJ/+IdofX1sHD5MoVDg9OnTZW561bBb7t3M5TAjEfTNTczNLYytLYxw8WdhbR0zHMZpt5Po6kTt6ETtaEft6sI/egR7dxciGCRtsxHfHoFmt9urKjGif/ND9M9+FnehcDuHPjkJQOxSrNhe7yveVFSfikAQuxTDPeZm6+tb5JQcmXSG1GYKm81Gu7Md7994yXQUlSeeVQ+GbXvYRNiGdkwjO5lFn9ExBowimeeLJlqmo/gdG3YDRVfQPTr2jJ28Jw8CFKNI7gVvgVwgx9aJLVI9KRKvttHXBx6Pj7a2AIoCkYjClSsqjzxiMDQEyWQv168fIRDIkUzmSKc3UNUtEolucjkHNlvxO9J1lVOnTOx2hUuX7Jw+nd/RWNSsInPpxKZr165ZAYBs+uno6KCzs7OugRd7oZkpl0bxkY98hN///d/n6aef5vd///f56Ec/uuM5SvHDfRaYFEL8+4q/9W/n2AE+Dly94zvNm1AUPX36dEMzBUtRjdA3Nze5fv06Z86c2XfhrXK7Ml9eKwc/Pz+/58Dq0ig2n88zPT1NR0cH/f39VW843d3dbG1tWYVGKTeUI8B0Xbfy6KurqwSDLtbWbBaZQ1G2NjBQfuFubPTwJ3+i8vWvawwMCJ58UnDUfpPAb3+RZDJJ4egR7P/oH3H48OGq8jx5LKZpIuJxzM1NCpubRbLeJm1zaxN9cwuRyaB1tG9H0l2onZ3Yjxwle/w4UUVh9KGHcG7naUsHZsB2NAn4VZW2YNAqOMdiMRYWFigUCsVIEShMT6P9t79MQaqhSsjKGr4MqIqKKUySRpLMeIYf/NcfMHR5iIKvYH03LqcLb5cXU5h0n+gmm8uSX82j24u6f7WgklJSaCMa2ryGPWkn35Zn69wWndOd2PN2Av0BUoUUjlAxQnV0O3CqTgrxAsmhJCsPrJDoTBTVQklIL6YJBlPEYm5SqU02NjZxOu3MzfXj8diR6jq/HxTFhmHYyGR8+HwdDAwIFhdNJidVnE5wuWBoyKC9vShdXF29fd7JOkdp4bKZzV+apnHy5Ek0TWNkZIRCoUAkErFGDXq9Xovg9xNpN2v8nOzCbgRPP/00f+/v/T2effZZhoeH+eM//mOgmGYdHBx8XgjxJPBO4OeAcUVR3th+qZQn/jtFUR6kmHKZozhL9I7jrhK62+0+UE6slHhlC384HD5wC39pNC1z+7UcHTc2NojFYnVvM5lMcvPmTUZGRmreyFRVZWRkhL/5m7+hu7vb8kD3eDxW3lLTNKLRKDdv3kRRFH7u5/r4whc2iMcFPl8xj5pKwac/fdur5OpVwVe+0obf7yYYhGhY8Fv/c4hP8BWOacVo35FM0j84iJ5KbZPz7Xy1ubWFLnPY4Qiqx4PW2YHa2YXW2Ym9qxPnqZNonZ1onZ0obW0oFV7n8/Pz6LrOiYqpSpXTcWSHbGkR1m4v+s709PRgmiabr26y9eVJjK1PEf5f5ml7oo2uC11l55Qcvmz32TFF8TstRAskHAkymQw5Xw4tqyGcAhTweD0YKQNbuw0lpxQL08EMZq54Y80oGVKJVLE9/5DB4k8s3vaD0VT6XupDzaoMnBwgrIRhHWydNtzH3QSeCOAec7O5ucn4+Di9vb08/PDDGIbBuXMKX/6yHZsti9drEImY5HIaIyNpdN253dRUXHVtbCh85jOFbamiytGjCu3txVRLqbQ6lSpKFyVKaxqlqKWlbxTd3d1lhFvpqJhKpQiHw0xMTKDrutWyL6WTe2E/PSfVIN0qG0FnZyff+c53djw+MDDANpkjhPhrqs8SRQjxc/vY1QPjTZctNgJJ6FLq6PV6eeSRRw68LNM0jUKhwMTEBIVCoWZuP5PJyKnfe0J2+K2srHDy5Mma2noZNcnCaCAQIBwOE9yOUtfX1+nt7WVra8s6Mfv6+picVHG7BePjoGkKY2Mmn/tccSKRvJk8/7yK1wt+vx19fQN1chJnwcELyuMc6yzOHBWhNVY/+znQddTOjmLuepugHWNjuLo6sXV1oXV0oNQZ5ShKcXj1zMwMPp9v19GAktRLLVNLZZHy9+xUluxXsyhrKTxnj2AabpJfSRKNReFwMQpb/bNVkj9Kom/oqA4V53Entk4bAWcA30/7WA4ts3Vii/5Xi+oF02ESWY6QJYvj3Q7EZYFTOLEP2cley2LDhm3AhpYt5svXz61bxHfixAl6enqYdk/TudaJuWXSfbbbIvFSdHV18d73vtf6XdM0HngAfvZnE1y6ZCMeDzA6KmhrMzEMjVQquW1Na0fXnfT1aYyNmWUqlslJlWeftQPFmaKlTUXVPt9SlEbwld9b6U/5fVRDW1vbrqtURSneHH0+H8PDwxiGQSQSYXNzkxs3blgt+52dnTXFC9Jv/aBotKnorYx7orGoXmiaRiKR4OWXX65b6lgPTNNkYWGBQ4cO7ciXlz5nbm6u7iEA0WiUQqHA2bNna0YZpe8j8+jZbBZVVXG73ei6Ti6Xw+v1sra2ZhkTTU6qfOlLKl6vk8OHs5imm1TqdhOLvFBXVhS6u4u/565eBWHiQWdNL+0sFXT9r/8OLRBompFTNptlZmaGvr4+K2VVqVmuRSqVF7Ak9eRfJsFMotgLmIaHwnIBEuD8ipPuf9rN3N/OEf2LKNhAbVMx0yaZaxk8D3jo+aUe3GNugpEg3/nOd1hVVum83okz6aT/bD/ZR7Js+baIF+J4rnjwZX04DjtwOpx48h4Mv8H8wDzp7nQxL64o3Lp1i9lZNzPr7+VbcR8DA4InntDpG6s/pXH8eJ6BgQhDQ07LB+bZZ124XE78fkEsphOLmbzjHbNMT+etTlyXy8XYmFkStSs7mooa/c5Kv4ta+vVSwj906BBbW1t1b1vTNLq6uqzzoZYfent7u3W9NCvl8uPS9g9vMUKPxWKEQiEuXrzYtC8oGo2ysLBAd3f3rn7Jy8vLZDKZPbcnm3JUVd2xJK1EZU6zs7PTuhFA8URUFMXqQtU0jXA4zPPPD+H1Ql9feX7/+ecVzp69vc2BAUE0quD3K3je826SS8ukl6L05tYw7TbUgo5is4Ou70rmjSgkkskkt27dYnR0tMxmoZLESwt2ldYEleoMVVXR13VEbA2lbZDcdA4EGDkDfUkn9K9DaHkNm9uG6iruq+k0IQvptTSRQASRFgSDQT784Q/zne98h8WeRXp6enjs/Y/d3vm3F29GGxsbrK+vs7ixSCQSwev14nK4SIfTlsZ+dPTD/M7vqJhmHFVdY3Y2yH/6T35++ZcVxsbqI1F5k5OfSzlJq/T32/nZn9UZGxuxtOGlfu/9/QF+7deqd3Y2u9u2NC0zODiI3W4/0Iq7smW/0g+9s7PTmuR1UKTT6aYNxLnX8ZZIuch2+3g8Tk9PT9PIXObLZZt8LcRiMTY2Nmr+XUIOXJYnaS6Xq/ncagWqkZERy4QpHo+TSCQQQlhdpEIIwuEwKyuHqBy+4vXC6qqGad4+jiefFHzpS8q2bDBG3tmJOXqIj//9EdSFMPr3/wrb+jprN28S3G4EqrU6qQfhcJjl5WVOnDhRM8UkUUpk1Zb+lfvh6FJJjsdQOoqWw2aqOLLNUA3y6Tz2lJ2UJ4XICyurabPZUKLFoRfT09MUCgWr2co0TY4ePbpjv1wuF4cOHbK6HtfW1ohEIsV8eiZDKpXCMAy++tUk3d09tLV5KBTyJBJJNjfX+a3fyvGLv7jB6Ojovor0lakV6/iraMOlJbDNZiuL3g+a2twNHo/H2odmvY/sU5C9EtlslnA4TDqd5o033rAMtzo6OvZVg2ulXO4hSPlgV1cXJ0+erDuHvRtM02RychJd13n00UfZ2tqqSb6FQqEuH/ZwOMzS0hLHjh3D4/EQDodrEmGt6GlkZIQf/OAHBINBVlZWCAaDGIZBKBSivb2dcDjMxsZGSeR9+7WplEJ/f/n7nT4t+Pmfz/BHf5QmlWpjeNjGE08UGBtzoDz8MZSPf5zs1hZxXbcmtfv9fquLs7JwWQtCCEKhENFo1JKx7YZ6osfKvzv7Zkl7uzBSCmbOQBEKqqKSt+cRNoFAYM/ZyTtuk6GRLmrEp6end2xfWg8XFUPBmkSoaRodHR309PRw9uxZpqamCAaDvPhiAOkfZ7c7tot9sLqqI8Q63/3ud3E4HIyMjDAyMtJUQinVhgM7onfpy9JsPxyZapE1kjslKXS5XAwMDLC8vMxDDz1kdUwvLCxY5N/Z2bnDwrkWWoR+B9HIUjASiTAxMcGpU6fo7OwkmUzW1fq/G6Q9b29vr1Ws261hSebNa+l5hRAsLS2RSBRlaZLM9rPkdTgcOJ1OEokENpuN3t5eNjY2yGQyxOOH+Na3HmZ9vRu7XUUIOHZM0N9f9PJIpxU+/enyY4jH46jqLP/yXx7B51MwjCLZlV6Irs5OXEBPby+maZJIJCyvcOnI197eXlNFZJom8/PzmKbJyZMn67rI90M04sa36fr5/4bNP9EoLBVQXSrCJXBoDnKpHKbTxJazoeU1DJuBUlDQTI3VB1arbq+7u5tjx45ZLe5y8EXl2LpK+aZ0nTx61EEsVq4ySadheNjGww8/zEMPPcTGxgazs7N84xvfoK2tjdHRUYaHh3G5XFYa6+ZNF1/9quO2f/oT+g5Plr1QGr2bpkkqlSIajZLNZpmenm5a9N7d3W2lLpqlQNkLpX71R44cIZ/PW+SeTCbx+/1W9F5LmphOp38sphXBPRqh12rhr9fLpRYqbxAStXLEa2trVce8yZSAVHI4nc4dxdRa29wtHx2Pxy1TLUVRsNlszM35eOWVCywtDVIoFLXJLldR0XDjBmSzghMnFP7+39c5ffo2Ua6vrxMKhTh16hR2u93a5l65ctnIoygKmUyGaDTK7Owsuq5bgwtkZKTrOjdu3MDv9zMwMFAXWeznRleYX8CIx+j8O2exn8iy+N8voutFJYsmNBS7QswfQxEK9qwde9ZOwVVg9YFVwmPhbdfDIuR7ywa0zs5Ourq6qqYx5AqpGnE98YS+q8pEURRLwnfx4kVWV1eZnZ3ljTfeoKuri5GREVZW2vmjP+qgowO6uwWx2M5uz0Zhs9ms6D2RSDAyMrLnTaseyClCEncyQt8NDofD8j+SpmKl04yqNTY1WhStxzoXQFGUOSABGIAuhLiw/XgH8H8BIxQ16H/vbvi4wD1I6IZhcO3aNVRV3dHCL10I94PFxUWWl5ererxUu1Gk02lWVlaqbksIQSaTYXp6mv7+fmtGZ2kUX424dyPzUqfEV199lVCoixdfPMaNG22ADV1XUBSTbNaOyyXw+wWKAidOwD/9p7c/EyEECwsLZLNZTp8+XWaZW290ZjXdbHt09PX1WQ1O6+vrzM7O4nQ6yWQyDA4O1j1Nfb/t5+kXX8DzrnehaBq2ozb0D+loz2soWQXVr+Ib8GEkDWZOzZDqKbelpca9Y3p6munpaU6fPs3hw4dRVdWS2cmmpng8ztbWFoZhkMvlrOEQxUh9b5VJ6XEPDg4yODiIrussLS0xOzvLH/+xht3uxOcLAjLar260VQ+q1WWalXsfGhoqI/A3s4tTotRUrFZj08svv8z6+nrVekkt1GmdK/FeIcRmxWNPA98RQjyjKMrT27//i30dZIO4p1Iu6XSay5cvMzQ0VNWKcz8RummaTExMYJpmTY+Xam36c3NzNfdTmlgdPXrUuvNXNmfI45REKv9WefwyZVEoFDhz5gz5fJ4/+IMor7/+KLmcC0UxMU0VXS8OAgaTZFKho6O4xF9dvX0RyhWDx+Ph+PHj1vYbIXP5eVQeu5zE3tHRQSKR4ObNm7S1tVkeMHJZ7Ha7a77XfshcFApk/uZv6Po3/4ZUKlVs0vrUCNrjGrHnY+ghHVufjWMfOsbq4iqptXJCl01bt27dsh4bHBwkm82STqeZnp5mfHycU6dOcfTo0WIhVVFwOp1WCgOwrBnkcIhgMMjRowE+//nGOhDtdruVV/+zPxO0t5cHKMXi9sGLjbWkh9Vy73tF7+3t7ZYTo8S9QOiVqGxsSiaT/Omf/inPP/88uVyOyclJnnjiCd75znfu2ohYj3XuHvgo8J7t//994AXuV0KvhY2NDaanpzl79uyuHZWNkILMl/f19TE8PFyTaCpvFDLCrYRsuw+Hw2XmWrvtqyT6yn2XKYuZmRkrvwpw65ab11+/iKoq246wCoZR3G9dt2GaAtNU0HWB06nQ31/cb2nH29/fT1dX1w7b23qxV0pka2uL1dVVTp06ZSlZ5BDmpaUlstksbW1tBINBa9RZPduthewrr2IfPkzS4WDx1i2OHz9eXGGdBu/p8rzoT538KWZmZnj55Zet95JSz+PHjzMzM4Pb7bZcHqVfjqIUlTDXrl3j1KlTHD9+HLvdbpmKSX9wuewuTUUZhmFFufUW6ST6+gzicduu3Z71otq1sde+1BO9d3Z2Mjg4uOO1d5rQD1rQlTevf/Wv/hW6rvP444/jdDr50z/9Uzo7Ozl//nzN1zZgnSuAv1QURQBfFEL8zvbjvdLHRQixqihKdWevO4A3ndCFENy8eZNIJMLFixd3JclGLhaZL681zq4UpYQeiUQIh8M7nlMsYN1EVVUrlbEbSgms2sWWSqUsiaPcP0VReP55DdO0YbcXsNtVcjlz26pE2d4Pga5DIqFx6JDOk08W84il2m95LI1ecLtdREIIVlZWSCQSnDp1qkzJUjqEudqos46ODtra2vZlz5B+8QX0hx8itLzMyZMny86PypuEzWZjbGyMra0tZmdnURSFD3zgA2SzWV599VW8Xi9ve9vb6OjoYHp6mqmpKTRNI5vNks1mcblchEIhpqamOH78OIODg0QiEY4cOVKW6pORYF9fn3W8kUhkzzmrlefBu96V4I//uINkkl27PfdCtfOrtJBfD2pF7/l8ntdff51AIEBnZ6fV+HM3CL1ZsshUKkV3dzfvete7+PCHPww0zTr3nUKIlW3C/paiKFNCiO83Zaf3iTcl5SLR7BZ+2J8nurwg8vk8CwsLO/6ez+etGZ31dqfuNu5NXvzHjx8va3gokqagrU2QTJr4fIJMRqUYCKgUxxYWo/RCweRjHxN0d68zO7vaUPFzt32uRurSKVJRFE6cOLHr91Q66gxuR7NyULGMdOuZO6pvbJC7eYvE3/k7nDp1qixdtttq7W1vexuhUIhgMGh1Jg4ODjI7O8tLL72Ez+fj4Ycf5oEHHmB+fp7JyUmr+L2+vo7D4WBpaYnJyUkr9zoz4+TSJY2VFYW+PoMPfKDA2FjByuMGAoGiRUE2SywWs5w1S6P3yv09dizHpz4V50c/6twzD78bqn1nByVEh8PBkSNHOHbsGKZZnNUpb5Q2m826rppJvKVoVpcoVC+KNsM6Vwixsv1zXVGUPwMeBb4PrCnbbouKovQDu0/HaCLetAg9kUgwPj7e1BZ+6bUuhGjIE10WW+UMzVLIYRSjo6M78oi7oRqRy5RNJBLh9OnTVUdgDQwINjc1Njfd5PPCSreAiaIIvN4C7e02kknB17+eR9MyfPCDZ633OwiZVyNImRYKBoP09fU1tG0hBB6PB7fbTX9/v+UYGQqFLClZMBgkEAjs0K6bpsnK176Geu4cJ7ZtfSv/Xgs2m42nnnqq7PtXFIUjR45w+PBhbty4wfe+9z26u7t58MEHeeqpp9jc3GRqasoaLhyLxVAUhddfz/Obvxlnfd1PWxscOwbJpMYf/IHGL/xCnlOnDMtYDIpqkN7e3rJC8traGrOzs/h8PisdJaPcU6d03v72xgugErW+t1Krhf1uV9axKmd1ZrNZ5ufniUQivPzyyzui92agmbLIRlUudVrnegFVFEfPeYEPAP9m+89/AfwD4Jntn1876DHUizeF0FdWVpibm+PcuXNNE/xns1neeOMNBgYGrOaHeqEoCuFweEc0Xyr9azRdIC8meaGbpsmtW7csLXOti+3UKfjOd+w4nTl0/fYgM7tdoCgmhYKdTMbA5crj8ehcvTrCBz+ol0XmpS310uRqr8+jGilIT5bBwcE901a1PoPKlIj00pZufJFIhNXVVTRNsyJ7u93Ojelp2l5/g65/9k937Hs9+fhaKzNp+Xr06FGmpqb45je/yeDgIA8++CCPP/44vb29LC8vs76+zvp6F3/916eJx9twOHTSaYMrV+ycPg0+n51vftPBAw/oVSc1SUJtb2+nq6sLwzCsOavXr1+3vqfSIc7ydaU/d0O1oEGi0ZRLJfr6+mqe8y6Xy2rGOnTo0I7oXX7HtTqP60EzZZGNEvpu1rmf/exnef755wF6gT/bPj4b8IdCiEvbm3gG+CNFUT4DLACfaMqB1IG7TuiLi4usra3x6KOP7quNV57EpV92OBxmcnKyrnx5NSSTSba2tqzij1S56LrO2bNn93ViyYHWcNsPvbOzc88od2oKjh83WV2F9XWBywW6Doah4HCAEAbxuMlDDwm6uz2sru5UslSSwl6eKdUIMpFIWGPy9nvT3Y2UFOW2G9+hQ4fI5XJEo1Hm5+eJx+N0bGyg+n3YhofLXrdf6WMlbDYbZ8+e5cSJE1y7do2vf/3rtLe3c/ToUd797ndjmiZf+EKe4WEHExMakMXlsmEYcP16jtHRdSKRHqBIyhMTxfpHKAR9fYIPfrDAyZNFspervso5q3Nzc5YDYeXczsqb8l6fZyUOkgpxu9010wwSknCrRe9bW1vcunWLTCaz7+i92SmXUl+hvbCbde42mSOEuAVUrawKIbaAn9zXzh4Qd53QBwYGag55qAeygCmjv4WFBUKhEI888sie/iHVYBhG2fShQqHAzMwMgUCA0dHRA+cHZfFzNz/0UqysKPT3Q1+fyve+l6OjQ6VQUFhfV9B1FbvdxOlU6OuzE48XyaPeG041z5TSApck+c3NTUKhECdPntxXIbPSdKoeOJ1O/H4/a2trnDhxgtxf/RW5Bx/k6tWrVkQYDAabPubM4XBw7tw5Sw3zyiuvEI/HOXPmDMmkn64uCAYVslkbppnDMHKAC1U1yOcXuHRpErf7Al/7Wh8+H3R1QTyu8J//s5PPfEbj9OnbgzxKb0TSXVPqqJPJJLFYzFqtyCYup9O5o1u19P9rRekHSbnUs8KtVRR1uVyW5r5a7r3e6L2ZKZdMJtP0Adb3Ku46oZdGrvtBKaFPTEygKAoXL17c98k7Pz9PPl/MYUryHR4ertoZVi9kFKnrOjdv3uTEiRN1n1DSp6VQ0DAMO2trRf15W5tAiDwOhx2PB+LxoiriZ37mYNFq6cAQIQTLy8skk0lOnz5tRYr1pm0kGiVzwJpMdPz4cRy6TnZyiqFf+iUOeTxWYfXmzZsYhmGRez2F1b2Qz+e5cePG/7+9Mw9vozzX/j1avMi2bMn7GjteEzuOE2IKpECgrAFiB0iaUAqUUtIe1vN9lENLS6GlbCf0cBq+lkILgbaQkg1C4oSthCUsAYLtOPG+79ot29ql+f5w3mEkaxlJI8tO5nddXMG2PHo1lu5551nuB7m5uaiursbU1BSamprwxhtvICbmCkxNKZGXB7S3iyCVxoGiYmG3WzE+bsbmzQ4UFxfjf//XApnMgsTEmQ3Ftw1CUlRW2piBz+Qck1078c5xOp3M3UpeXh5TYTI4OMh4s5CmJjIP1lvfA/vfUMv+0tPTObXJu1wurzkgNuHs3vnuRJ0Lm4L5QFSrXEJBLBZjenoanZ2dIcXL2Wi1WhgMBgAISXy9QSwBBgdn2tOrq6uDCi2tXUvjD3+gMDYmgkwmxuSkCFYrDZHICaXSDoslBomJLiQn09i82eXW7h8MnrtoEuOXSCQoLy+fJRqBwjbs1x+smKjVaoyPjzNliVOHDiFuxQqITgmLTCZDYmIicnJy4HA4YDAY3BKrpPEl2BCe2WxGd3c38vPzmbunxMRErF69+pSNcQ8aGhzIyJChrCwJfX0ULBYRampiUVcXD5OpBd98o4LDUQeRKA7NzRRMJgoyGY28PGBkxLeLZE9PDyPUpN6dIJFIkJaWxtSHT05OMuZbpKnJswzUMyxDdtDehN7X3ycmJgY5OTmczl0oO+hgdu98hVz8vd7TkajXoQcLsQZYtmxZWLtoq9WKwcFBpszR4XBg2bJlAXcd/mD7m8TFxSE2NjZokVm6lEZGBjAxQcNuF0Eut4KixHC5xLDZRPjlLyewcmVs2LsXtvCSMJNSqQxYceQtbBPq7pB9R7BkyRJmF2s+fBjyH7pP8CJhBSJ2bP8V0u7NNnIKFH4jvu3FxcVed6QpKSm48cYVKC424l//msDwsAnl5XHYuDEBVVUAkABgDTQaDd55ZxrHjkmRnByLuDgaVitw4oQI1dWzu5rJ+4NUDbFfHxEftriT+nBSYWWz2aDX65nRfsQd07OpyfOC7e/vRn7u2d7vj3Dr0L3t3nU6HbN7l0qliI2N5U3YI1FaOR9ZMIJO0zSTMFuyZElYYk7TNHp7e2Gz2dDZ2YmEhATEx8eHLZJWqxVtbW3IyspCRkYGp9mj3rBYgJoaB4zGCchkCaeScS6MjoqRnDyElpaZW3WFQuHWjckVtpibzWamwSnUc8oWC19hAM+wDUk8e9a223t6QFutiDnlaui5Xs/XwW6GsVgsMBgM6Ovrg91ud+tYZf9t9Xo9hoaGOOUIzj1XjnPPlWNsbAzHjn2B7m475PIVmJwswMGDEoyNZcFgmOnqJZpBUSLMNA+6Y7fb0dHRgczMzFnDx9nrk0gkbuP3PHfvGRkZyDzljmk0Ghn3wdjYWCb2Huii6rlzJeWjXOG7sYhY5ubk5DBNfFNTUzh27FhYlTNn0u4cWCCCzjbsysnJCfuKPTIyAq1Wy5TkpaamMn4voR6bDINevHhxUBl1b6Sn2zE8PI2srCRIpRK4XDPx8vx8MUpLSxmbW71ez3RjKhQKTklD9ht8YmIC/f39PnepweBNdH1V27hcLsbywPOOwHT4Q8guvJAZNh1MVQvbTMzpdDJi19/fj/j4eMY9UavVcvJtZ5OVlYUrr7wSQ0NDOHCgH198oUR+fgrS0oCODgpi8UwXr9ksgkzmwuLFMzt1gtVqRWdnJ/Ly8jgNviAVJMC3u3cAbvkniqLcBJw0NXV3d8Nut0MikTBzaP2JoFgsRl5eHudzQdYUqU5RkUiEuLi4U1OZsmft3oOpnLFarSEVSyxU5n0M3Ww2o6mpCbm5ucjPz2cSY6FiNBrR3t6O/v5+lJSUMEIWTjmcWq3G2NhYQH8XLmi1WixdqsfoaBksFkAkmhHz6WkKmzd/29JP2suBmXOk1+vR1dUFmqaZbkxvuxlyG07i1hUVFWGvOZhdEBE29rxR4FQ5qtUK2xdfQP7kE8z3Q/2biMVi5paepmmYTCYMDAxgenqa8XPxdY58QVEzAx6mpgqRk+NiPFjkchrT00BsLLB8uQsAjampmYoX4Nu7oMLCwpAu9uxEKKlK8ty90zTt1tRE8kNqtRp9fX2QyWTMe8bzQkZGygVDpFv/2cf33L0HUzlDLmhnCvN6h67VatHW1oalS5cy4YBwPNHtdjuOHDkCrVaLyspKZi6iN/MsLpDh0jabDZWVlV7f4FzrgUk82Wg0Yu3aUpSU0DhwABgbo5CVBWze7PCZAI2Pj0d8fDxT3zwxMcFMICJhB1Lf7HK5MDQ0BJPJxMStw4VrVQsZ0VdYWDir65amaZi/+AKS0hKITokw+3yGUm3DRq1WIzY2FuXl5SAzLMk5SkxMZBKrXM7H2BiFtLRvH5eXR6OtTYTJSRFcLgdMphlPlk2bHEysnkyyCgXPc+tt9+7Z1ES6dLOzs2fO7alKoc7OTgDfhlgyMjLcZgNwJdKC7it2Hij27rl7D3ZaERcvdIqiyjHjd05YDOAhmqafoSjqYQA/AUBmVv6SpumGIF56WMxLQSfx8vHx8Vn15aEKutPpxDvvvAOz2YyKigq3umvA3XvFWyWHJ2QYdHJyMjP5yBMiQlxqeru6uiCVSlFRUQGKolBebkdFRfBt/FKplEkaehplxcbGwmazISEhAWVlZbwkirhWtZCyRH/CZjr8IRIvvxwAmIsPIdhqG4LT6URPTw/i4+ORm5vLHJd9jojL4NDQEKRSacDEalbWTNko0QmlEigooKHTOaHRzPx80yYHcnMN6O0d4DRj1R/+LphEVIn4kXJZvV4PhULBhGji4uKQnZ3NXPSJJQF5fGpqalAzO+dyh+4Pf7v3N954A3a7nfPnEODmhU7TdDuAGgCgKEoMYBjAXtZD/oem6a3cXy1/zLuQi9PpREtLCyQSidf6crFY7Hf4sjfMZjMOHz4MsViMxYsXe32MSCRiPDm8fXjYrdlmsxnt7e0B69XJRcLfG5N0kaalpTGJrnA8WTyfn4iTw+FAa2srYmJiYDKZcPLkSaSkpEChUPj1MA8EFzFnNyr5Cu84RkfhGBlB7MoVAAKHWgJV29A0zVTvKBQKJlbvbegIae4BZidW2VOayN9x7Von/vpXCQAaMtmML71EIsIvf2lj7qJ0Oh0GB0f8vmYuBFsGStM0enp6kJKSwvi5kx08ETUyJ7WqqgqZmZkwGo3QaDQYGBiAWCzmlICM1g7dH56797S0NLz44os4fvw4ampqcN555+FHP/oRzj77bJ/HCMEL/XsAummaDjx4eA6Iyg7d15uUDLjIz8/3maQJdoeu0+nQ2NiIhIQEv7degcIGRAiIU2JJSYnXUjHPKg9/wsTuIpXL5cxj+RBzNiSGm5+fzyTk7HY7syu1Wq2zhkNzIZDYsMsSPS13PTF9+CFk310NsJqZgoWdhCWxeuIPz8Zf2MYzsToxMQGNRsPEoVNSUlBWloLbbgPT6p+dTWHTpm/FXKVSQaPRBHzNXF8PV8hdI/E4BzArNEPEnSTSSekjycdYrVZOzT+RHkHHR7liUVERLrroIlAUhaeeegqffvppwHMahBc6YROA1zy+dydFUTcB+ArA/6XnaPwcMI9CLiReXllZ6bcKIBhBHxgYwPDwMJRKZcAdH9mh+4Km3Z0SY2JivO7m2d4o/j7MOp0OQ0NDKCsrY+ptI/EBIaGO4uJit1CHVCp1GyxMQjMDAwOIj4+HQqHw6ulNCJRz8FWW6A3a4YD544+R+otfzgq1hAK5gC1atAhyuXxWjoRr2IbsZJVKJWiaZoYvt7e3AwA2b559h0PGn5WXl4ctSMF03NrtdmbAibeYuOf5X7x4MTO/lvwHzJRFZmVleQ1hxMTEMLv3+RJyCQQx5pJKpbjwwgsB8OaFDoqiYgCsA/AL1rf/DOB3mPG8/h2ApwHcGtLiQyDqgk7TNPr6+qBWq7Fq1aqAdcFcBN3l+nbsXE5ODrRabcB1+PvweDolkjphX6+HfRyyVrbQDw8PQ6/XM0nJSH04xsfHodVqA972s0MzpCLEYDCgo6MDFEUxoRn23El/ohvs8GhrUxPE6emQ5OWGLebEVMwzVu/L74SNt7ANO3bPbs8ndzgjIyMwmUxISkqC3W6HSCQKeAHjClcxJ2E7riWRaWlpTIiJvJfJzp28X4l7p+ekJq1Wi46ODmaoSlpaGlJSUnh///LVUBQpL/RTXAngGE3T4+Qb7P+nKOoFAPtDXXsoRFXQSbxcKpVi1apVnN4UgbxgrFYrGhsbkZmZiZSUFLdZkv7wtUP3dEoMZgfp6ZTndDrR3d0NsViMJacaZ8jukT2yLtxwC+l+tdlsQe8UKYpCQkICEhISkJuby4yXGxwcZEIzSqXSLabMhpwvz7JEf5gOf4j4Cy8MOdRC0Ov1GD412Yi9MQjmuP46K9nHkkgkyMzMRHp6OjPL1W6fmTTU0dHB9AVE2tyMWBwXFBRwagySSCSz2vvZiVWpVMoIO3nPkv8n1gB5eXk4evQoUlNTodFo0NXVhfj4eGb3Hspr9oQvQQ+2bJGLFzqLzfAIt1CnBluc+nI9gJZg1xwOUYuhT09PB4yXe8PfDn1iYgItLS2oqKiAXC5Ha2sr5+N6+wB5c0oMRnDYt/nklphcGNgleOxYu7ddYjCleuSiERcXh+Li4rAvDuzxck6nk7EaZseUU1JSIJFIYDKZ0N3dzVlcAMCh18PW1gblnXeEJea+4tZ82e16a5IiO3jiy0KEklgBs6c0eWvP9wXXTYPZbEZnZ2dQFsf5+fkBhdJbWaTT6WTWRD5/CoWC8bY3mUzQarU4efIkHA4HlEolUlNTg8rJsOEz5OJt4LwvOHqhg6IoGYBLAWzxOMRTFEXVYCbk0ufl5xElKoKuVqvR1tbmdyC0L3wJ+sjICPr7+7FixQrIZDJ0dXUF5eooEoncHq/VajE8POxm1hXsDpKIiclkQmdnJxYtWoTk5GS3nbi3C4mvDstAMV9iZZCeno7MzEze256JrSsxlDKZTNDr9Whra2OqSoqKioL6m1o++QRxZ9fOdOWEAAlhmUwmr3cjfIi5NyiK8lpFA7j3BRAzMZVKhd7e3lkXQW9wWfP09DS6u7uD6vIlF5Zg8FYWSUpg2bH3uLg45OXloaCggCmbHBsbQ3t7OxISEpjdO9eKH88+hFAxm81B7dC5eKGfWp8JwKxkBU3TP/T83lwSFUG3WCyc4uXe8BR0mqbR3t4Os9mM2tpaSCQSjI+Pw2g0Bn1cu93OhCump6exdOlS5kMXSjiAjDLT6/XMtHrPAc7BlqSxYe/mSdMOuWjwLeaeYQB2aCYuLg6jo6PIysqCSqXC0NAQ5HI5FAqFz9AMOabp8IdI+WlomxiSf6FpGqWlpbN2v+GGcHxBURQzZ9ZbaIl9QRaJRExiFQBzEezo6ABN00xohiRWuayZNCuR9xQX2CPlwmF4eBg6nQ7Lly9n1srevTscDqb0kbhFkru6lpYW0DTN7N6TkpIibpoVbGPRQicqgl5QUBBytydb0O12O5qampCSkoKamhpQFAWTyYSRkZGgj0udckrs6OhAXFwc0+BDfhasMJCqCLvdziRSPQc48yE4NE0zMW52IpBr4w1XvIUBaJrGyMgIJicn3bxRiI+KZ7mf567U1t4OkUgEaUlJ0OshoSWZTIbc3FyvFgeR2J3TNM2IObsMlCsymYxZM/E9Hx4ehsVicTNc83URJFVLwTYr5eTkhOUkCoCZI7p8+XK39bF370Tc2QlWcuEvLCyE3W5nKrwmJyeRlJSEtLQ0KBSKsNfnjWDHzy10ol7lEizkgzs1NYXm5mYUFxcjMzMTwLelcqGIpNPphEqlwqJFiwKO3wqEy+VCb28vHA4HsrOzmUoCtpjzJThjY2PQ6XRM7NjXaw83Nu+5VnKuAcyq6vD0USHlfm1tbczPUlJSYDl8GHEXXhD0hYZceFNTU5m/faD18gWpbw/Vl4VNTEwMUzpK0zSMRiPT5xAbG8tUF5ESWXbSN5hmpYSEBKYuPVR6e3sxOTmJ6upqnxcbz9g7W9jZIUZ2SHBycpJpahKJRG4zZ/lAEPQFgN1uR3NzM5YtW+b2oRoYGIDFYgn6eEajEYODg5DL5bPEPNhdNLFIVSgUTEjJW+dnuIJD0zTjiU1ix1wafdj/+orNe/6OZ5w/mLJEz3I/kjDsa2+H/OiXcFxwAejJSc4JQyKoOTk5PufHRirUQuLW4fiy+IJtuEbTNNOx2tXVBafTiZiYGFgsFsYALpiLcrihlu7ubphMpqDm6/rzmyEiT94bcrkcixcvhs1mYxLuJpMJbW1tzO491IoXUlJ6phC1KpdQoGka3d3dsNlsOO+889xu0fR6PXQ6XdDHVKlUGB8fR1FR0ax69WCFgcSxya042W0ZDAamUUcsFoc0oo0Nma6UkJDA+MiEI2Lefo/8jUioheywQilLZEMcAeUnTsJUVYW4rCyo1WomYUjOk7eEITm/RUVFPj+kkRLzUEMdXPBcM0VRTGI1OzsbY2NjGB8fR0JCAlpbW5GQkMCYa7FzPAR2iC0rKyvkCVzk82axWFBVVRXy59ZbYpWEZtiJVbFYjMzMTGRmZuLrr79GZmYm09QklUrdLAm4Mj09LbgtzkccDgeOHz/OTE5ni7nNZsPAwEBQx3O5XOjv74fdbkdlZSUsFktYu2biTV5SUsIkP+VyOZYtW4bp6Wno9XqMjo5CKpUyzRqhJIW92c9GQsCIILAbo8jINnYHZihQFIXpwx8gcf16xHl0YpLz5Dl9yFfDkLd1841OpwvoRRMqgdY7NjYGg8GAqqoqZqIT+zyJxWLmPLGFm6IoxsYg1HV1dnbC4XCgsrKS1+RloLJIh8PB3LF4ziPt6uqCxWJBSkoKUlNTkZKS4nf3PjU1JezQ5xvE42XRokXIycnBZ599xggOqXQIJslKYrByuRyFhYWMYRFb0LnGuGmanhXH9kx+kpBDQUEBY2NKapRJnJSLLzepbvC0nw13x+/rdbHXQ4ZhEEH13FGSfwM1R9E0DfvgIJw6PWKXLXM7BjlP+fn5biZZFosFTqcTRUVFfnebkdidq1QqaLValJWVheXL4gt/f7vh4WFMT0+75Sg8zxMJYREbZ7YnT15eXkhCTNM0Ojo64HK5sGTJkohWonju3h0OB9rb25GWlgan08mUEkulUmRnZyM3NxdOpxMGgwFarZbpuSC7d8+7J4vFIgy4iDTBvEGIxwu7Zp10dUokEmZYMFcBJrfteXl5bjFYT68PLsciiUHyxiff84yXA9/uxNjmT6RGme1d7qvKgYxN87zlj1SIgS00xC3R1zAMf7F5zxZ6kUg00xl6wQWg/AgkOU8URUGj0SA3N5c5B94GQ0fiPJAKnvLy8ohYM/haM7vTt6SkxO9zkxBWZmYmnE4nJicnYTAYMDEx4TZ/levdIE3TaGtrg0gkcqv0mgtcLhdaW1shl8tRVFTkd/dOmpoAME1NbW1tsNvtzAYpNTWVScRyYefOnXj44YfR2tqKo0ePYtWqVV4fR1HUFQD+F4AYwF9pmn7i1PeVmPFJL8RMU9FGeg6NuYB5vEMnSb/x8fFZNetkF2yxWDA2NjZrt+j5QSH/T2LapaWls27b2X7oXCBNJexhv/5sb73txNgfOGKQRUamsePJGo2G8X7x3CVGqs6aiDARtVCcA9lCzhzXbof10yNI/e1vmQunt/PFbhiqqKiAWCx2q2smF0KJRMJU1PAVDmELanl5OS/H9PYcvr7f398PmqaD7vQl4Ze0tDQsWbIEFosFGo0Gx48fh8vlYmrDfdV/0zSNkydPIiYmBiUlJXMu5idOnEBCQgKKiooAcI+9x8bGMhPNnE4n9Ho9Dh48iKeffhpOpxPbt2/H2rVrfVZEEaqqqrBnzx5s2eK7L+LUc/4/zHSJDgH4kqKofTRNnwTwAID3aZp+gqKoB059/V9hnJagmZeCzp4h6ssT3WazMW98Np4iQhgZGWFikd7K+9iCHmh3zt7lKxQKtzCDtw8Bl92jp0HW9PQ0dDod41iYk5PD3JUEc9xgIccjOQaapnkxmyLHNX/1FUS5eRCfEmdvu3lS9ikSiWY1DFHUt4OhSWhmYmICPT09cDgcTNw10BxNX5DnFovFKAmhPp4rvjqEe3p6IJVKkZ+fH7Kg5ubmQiKRMKEZUv+t0WjQ39+PqakpyOVypKenM0MtaJrGiRMneLOMCAby3AkJCT7nFQDcLAlII9cPf/hD3HDDDVi9ejXUajU2bdqEvLw8/P3vf/d5/CWsweS+OHr0KAB00TTdAwAURe0AUAfg5Kl/15x66MsADuNMEHR/bxaLxYKmpiZkZ2ejoKDA62PEYjEzgCAQbKdE9qQisg4iIuw3ij8MBgP6+/t9dn56I1jRJQktk8mErKwspKamzoq7k3gh3x88kUgEu90elFtiINS//CUkiUmIv/wyTB8+DNmaC2c9hlyInU4nurq6kJiYyDQM+YvNx8fHIy4uDpmZmXA4HJiYmGDCcImJiUw1CJeyN2/NSpG8A2Ljcs1MuieTlUI953K53Gs5J4lBk5F0ExMTTHWRRCJhQhWRvIh5g6ZptLS0BBRzT/zt3tn/LxaLcf/99+P+++8PygrEF8PDwwAwyPrWEIDvnPr/TPqUMRdN06MURYXX0BIC82qHrtfrcfLkSSxZssRnjTEwY5Fqs9lmzaX0xNMp0Vtc2zM0w95le8aGx8bGoNFofHZ+eiMUUbBYLOjq6nKrZPGMuw8NDQWMuwcLRVGwWq1hlSV6xWSGpX8A1q4u0FYrbFnZiCkuhuTUIAECSYilp6cz/QDsv1GgLlv2wGASmiHNOFKp1K8DosPhmOXLEsnqITbErZEdvgsFiqI41ZxTFMXcDbpcLjQ2NjIbiM8//xxKpTJitrhsyM5cJpMFJebe8NbU9PLLL8NsNjOPkUgkfr3QAzgrMmv29u1Q180380bQh4aGMDg4iJUrV/qtZLBarVCpVAHF3JtTYiA8E3gEdiVNZWWlW0OHPzEPpRuUVLL4qrUmseRAcfdQ4t2huCVyOS6Vkgyo1aBPjQ40//vfML//PhLXrUPShusBfHsRy83N9TvWj32RZYu6Z6UNACY0Q46v1+vd7nJSUlKQkJDAXEh4vYj5wLOailxIUlNTw+5Qzs7ODiqP4HK50NzcjNTUVCxatAjAzMVFp9NhfHycMdYieR4+SzaJmMfHx6O4uJi34wIzn7udO3di9+7daGxsdPuZPy90LpxyhmVfNfMAEK+RceqUfS5FUdkAAo474puoC7rL5UJbWxtsNhvOPvtsv7fGNE2jt7c3YJzbm1OiP/wJL3sYNLldJbE6Iui+QgLBirlWq8Xo6Kjf5hV2yMhb3N1gMLjVcXOtd5+amuJU5x0sIpEIYqUSbsExmgaVkID41ecB4NYw5ImvxLevShsSmsnOzmbucsbGxjA1NQWHw4GsrCzGqiASZaAETzFvb29HZmZm2BeS+Pj4oC4ITqcTzc3NSEtLc9vVkw0DOwGt0WjQ1NQEAExilWtnrzciKeYAsGfPHrz44otoaGjgvamotrYWAEopiirCzHDoTQBuOPXjfQBuBvDEqX/f5PXJOUAFeONG7FbCarXCZrOhqakJqampKCoqCvgGGRoagkqlwsjICDNCzW2x9LdOiaWlpZx2qWwxb25uRnV1NfMz4jfNNfkJYFbIhosw0PTMeDuj0YiSkhKf6w4mfEPquPV6fcB6d51Oh5GREZSWlvIynMBzvcbXXsP0/gMz35SIIVYooPzNbyBRKGA0Gpn6dq4djf7q3LmuCwAz7DszMxNWqxVGoxGxsbFMYpXvJiL234+EAwPdkXClvLyc84XY6XSiqakJGRkZQc0iIK35arUa09PTSE5OZhKrXFvzIy3m+/fvxzPPPIMDBw4EfV737t2Lu+66C2q1mjH8e/vtt715oV8F4BnMlC2+SNP07099PxXA6wAKAAwA2EDTdPDt62EQNUHXaDRobm5GWVkZJ+OgyclJdHZ2ApiJZVMU5VaGRJJpcXFxKCgo4PSB94yVE38YiqIwMTGBvr4+ZsdKxDzUmCJ7Pexzzja5Kiws9Gs1G6qIkR2pXq93i7snJiYyVsP+LiShwF7v1KFDmPzHPwBKBEl+PpS//AXEiYnMHUmwFxI+kpUktEX+vuRCbDabGRsJl8sVVOOXP9gbB5Kn4Cu0lZGRgdzcXE6PdTgcTNGB5+SiYCDzRtVqNXQ6HWM0lpaW5vPCTMoiY2NjI1JJ8/bbb+OJJ55AQ0OD17mqPDJ3JUBBEpWQC03T6OrqQk1NDadbIofDwYgeMHsYhdVqZWKgwdx2eoZuyIdOo9FArVbPSn5yEXN/zSKekItQcnIyM8XIF+GEAbzVu2u1WnR2dkIikQS1S+OKWzVRXBxAA9KKMih//nOIYmMxNjYGvV4fdH07H2JO7IbZoS0yISc2NnZWAppUzSQlJSE5ORlyuTxosyjyPiMj4/hwawRmHBuzPZLLvnA4HGhsbERubi7n3/EFae5hzxtVq9VobW2FzWZDamoq0tLSkJyczLwXIinm77//Ph577LG5EPN5TdR26DabjfMHs7u7GxMTE8zXWq0WZrMZeXl5MBqN6O3txeLFi4P6gHiLm5NbQYfDwbzpuCQ/CcHsokkS0NM10LOKgwgNnzFdUlVBBMpgMMBgMAQdd/eFp+jaenpgfH0nUu/7v4BYjKGhIVgsFhQXFwd1xxNuqAVwz1OwQyqBEtgulwuTk5PQ6/WYnJxEfHw8k78gTpe+IOeD5AqCmTIUiOLi4oAFAsBMI1xjYyMKCgoCNtiEi8PhgE6ng0ajwcTEBBITE2GxWCCXy1FWVsa7mH/00Ud48MEHceDAgbCqhIJg3u7QoybodrudU9JQrVZjcHDQ7XvkQxUXF4fx8fGgTZO87fKcTieOHTuG9PR0pv49GDH3dVxvEKMpLrMg2WEeX1U4wUBit9nZ2bN2MsHE3f2t19dj2U07xCVyLhkfH4dOp+OcX/EFTdNM1YxeP9PZnZKSAqVSycSxyd+JXIxDmTIUCIVCgcLCwoCPs9lsaGxsRGFhYdiVNMFCKmnINDCKopCWlob09PSQm7/YHDlyBPfffz/279/POezEA4Kge8JF0EnSyvNxJL4dHx8f0OvCG57Ca7FY0NHRAYqiUFxcjNjY2IDJz0DH9AXxRSkpKeFkGuTvuJ5x+UA7WLPZjK6uLhQUFDCVMb7wFXcPVO/ua73krkAulyM7OzvoD3K4oRZiYVBSUjIrXBLuse12O3OXQ84VMciSSCSMsVlpaSnjZR4uYrHYbUSiL2w2G7755hssXrw47CEXweItzGKz2ZiQpslkQkpKCtLT00PyPD969Cjuvfde7Nu3z2cTYoQQBN2TQILucrmYWaFsHA4HWltbQdM0k8AMBs9baxKyKS4uxujoKDIzM92SZHxB0zPeJFNTU5wTkKEIjbeQDUVRMBqNTJI3MTExqJJKEncnd0a+Rsr5Wi8Z+pGRkRGSqIQTaqFpGgMDA7Db7Vi8ePGsixHfo+rIuTIYDJicnIRIJILNZkNZWZlbmMVXkpwrBQUFAWPFVqsVjY2NKCkpmfO4Mk3TaG1thVQq9ekL43K5YDAYoFarodfrERsbyyRWA212jh07hjvuuANvvPEG4/0yhwiC7kkgQR8YGIBGo3H7HolBpqenY3JyEmVlZUE9p+eHlwy3KC8vh0QigUajwcjICOLi4qBUKv1OZmcTSHiJ/YBEIkFBQUFEu++8odVqMT4+jtLS0rDnNrLr3bnE3UkSMJT5m4RQd9DRDPFQ1IxL5PDwMBSnyjMBMOeKDIX2/B3yL/ti7ElSUlLAFn2LxYLGxkaUlZX57bqOBFzE3BvT09PQaDTQaDRwOBxuiVX2MZqbm3H77bdj9+7dKC0tjdTL8Icg6J44HA6fHuYTExPo7u52+x7bKVEikaC7u5uTmQ4bdgy6v78fNpttVvITmAlN6HQ6GAwGt/mY3gQr0A7PW0t5MGsNB8/6ds9pSeHuEoFv4+4GgwEOh8Mt7k46T7nkCnwR6nkgviwJCQk+/Wj4OMfeoGkaWq0WKpXKzUedhGb0ej2TJCShmUBhLPb/V1RU+E1am81mNDU1oby8nJca92AIVcw9cTgc0Gq10Gg0MBqNMJlM6OvrQ2VlJe699168/vrrqKio4Hn1nBEE3RNfgm6329Ha2sqUJRJR0uv1KCsrg1QqZTrsKisrOT8fEV4Sy5XJZEy5nr/kp2eiUKFQQKlUckpskd0paUwKdq3hQOwKXC4XioqKGK+LQMf1bKHnEu4gwsiOu09PT8PhcKCgoABpaWkh3ZWEGmohF1GlUumzooPvUAsblUrFJF99xYXZoRmj0Yj4+HjGa8bfXWF2drbfjQER84qKipDviEKFLzH3dtyOjg4888wzOHToEAoLC7Fx40ZcffXVEama4YAg6J74EnQioCaTCdPT02htbQVFUYwoATMfhpaWFreuTn+QDy+pV8/JyUFqaiqnzk82ZIel0+lgtVqZnbu3bD2JWfNZosYVUt+ekJAQlnMfgQg22d0H8o0nid+srCxMTU3BaDT6jLvzjd1uR3t7u9cqnrnA846IC6SkUa/XY2JiAtQp8ywSmiHEx8ejvLzc57knk70qKys5lTLyCU3PDMYQi8WzLI/5oKurCzfeeCNeeeUVZGZmoqGhAZ999hleeOEFQdBZRE3Q2eOlvEESOiRJYjabYTKZYDabYbFYZrXp+4JpP2fVq5OkYLCVLGxommY6CknTCZmiQ2ZQBtsByYePiM1mQ2dnp1sCMlL+JOTcsUspyQxMduI32Lg7OXaw6+Uar49EqIWmaQwNDcFqtXpNvgaDzWZj7nTIWDmFQoFVq1b5DF1NT0+jubkZVVVVcz5DM9Ji3t/fj02bNuFvf/ubzylCc4wg6J74E3Sj0Yjjx4+jvLzcq2mRy+XCBx98gGXLlrmJvLfXQlEUxsfH3Yb8crG99YenILCbTrRaLShqxsZUoVDMaRckKUv0FLRIxYrZxyU+Ouyxab5CNoHq3UMJtZCEeaB4faTEvL+/HwB4T746nU4YjUZQ1IxHfmJiItP1SxLcU1NTOH78OJYtWxZyriJUIi3mQ0ND2LhxI5577jmcc845vB47DARB98SXoI+NjaGnpwfLly/3G6r49NNPcd555zFfu1wuZhfPFvm+vj6YzWamKzHYZiFPfImN0+lkhgWkpaVBr9fDYDBAKpVCqVRCoVD4rTAJV2h8hXgiJeZs2FU83gTN82t2yMZbvbtSqURiYiLnXa6nL4sv+Og09XZMUknD1UMoWKRSKZYuXQqKojA5OQm1Wg2tVguxWIykpCSo1WrONhp8QsRcJBJFJJY9OjqK66+/Hv/7v/+LCy64gNdjh4kg6J64XC63iUPE38VoNKK6ujpgeZ2noHvicDjQ3NwMsViM7OxsmEwmTE1NwWq1hiVw3gSSzBdVKpWzElbE7Emv14OiKCbuzq6zDVdofJlcRULACOxEaFdXF+RyedBmT54hG5fLhampKeh0Os5xd+LLUlpaGrB2me+LG3vKUCT8cAiLFy/2auKl0Whw8uRJyGQyOBwOKJVKpKenM/4pkYSmabS3t4OiqIiI+fj4OK677jps3boVF198Ma/H5gFB0D1hC7rD4cDx48chk8k4vzk+/fRTnHvuuV4fazab0djYiEWLFiE7O5uZYEIea7FYmF08+ZdLxYO3yghfYQ5v2Gw2RtzZJX6h7qw8yxI9RS/SoRbSMMSHnzeBxPpJ3J3c6XiLu5MLWXl5ecANAN/ngiSe5XI5cnNzI1Yxk5KS4rVxZmJiAq2trVi+fDkzClGn00GtVmNiYgJJSUlIS0tDampq2L0HnkRazNVqNa677jr8/ve/x+WXX87rsXlCEHRPiKAT8S0oKAjKi+Hzzz9HbW3trEoCg8GAEydOYOnSpUhJSYHT6eSU/PQm8r7q5AmkpTuUShYSaiAVPSTU4Gsiuyckbut0Ot0qgAiRDrXw0TAUDORiqNPpmGHZDoeDk1sj33cqXMoi+UAkEmHp0qWzBFmv16O9vZ0Rc09IEYBGo2FCM2RoRbg+MpEWc51Oh2uvvRYPPfQQrr76al6PzSOCoM86ME1jfHwcJ0+eRGVlZdCi8OWXX2L58uVuplwjIyPo7+9HTU0N4uLimBh9qLefNpuNEXez2YypqSlG5FUqFdRqNePPEQpEaNij5KamppCQkAClUunTpjVQWWKkQy2Tk5Po6ekJq2HI23G5XIBINcnExATi4uLcvFN8+czweXHznDIUyQtnfn7+rDsfnU6Hjo4O5j3OBYvFArVaDY1GA5vN5haaCeZ9EmkxNxgMuO6663D//fdj/fr1vB6bZwRB98RkMuHLL78M6o3J5ptvvmGmtJD4++TkJJYtW8ZL8tMXNpsNLS0t0Ov1KCgogNVqdcsFBIM3MSDOfDqdjhEttg0BF1+USImMSCSCTqfjHLPmCtcLkDdfFs8GnYSEBKZBh4wJ5OtckBp3YnkcyeakxMTEWW3tWq2WmSMQqr2x0+lkpg4ZjUYkJSUhPT0dqampfu90iJgD8FsLHypGoxHXX3897r77bmzcuJHXY0cAQdBnHZimYbVaQ35jNDc3o6ioCDKZDMePH0d8fDxKS0vdGl/4ftM5nU60tLRAJpO5dcI5HA636hqTyQSbzeb3WFyEhqZpNxsCYOaCQrovQz1uqJCGIS4x62DgsmYuviye9e5isZipMIqJifFbShkIq9XKdP0Sp8pINrQsWbLE7YKp0WjQ3d2NFStW8DYaj4RmSNWMVCplrG3ZoRnSqUnTdETEfGpqChs2bMDtt9+OH/zgB7weO0IIgu4N66kp8KFw4sQJpKeno6enB3l5eUxiKlJibrVa0dzcjJycHE6xfqfTOUvkw3m9k5OT6O7uhkKhgMlkCtqGIFy8NQzxARcxJyGmxMREn74s3rDZbNDpdF7r3T095v11v5J8waJFi5gOzEheOLOystwmCqlUKvT19aGmpob3OadszGYzY21rt9sZc6yxsTEAkdmZm0wmbNy4ET/84Q/xox/9iNdjRxBB0L0RjsA1NTXBYDCguro6qORnKExNTaGlpQWlpaVhtZO7XK5ZIm+xWAL+nreyRLYNgc1mQ3JyMlJTU8OefekJnx2Q3o4daK2hJiA9Bddbvbs3YyzPUkpvDUuRFPO4uDhUVFQw52V8fBwDAwOoqanhvVrFH8Qcq7u7GzabjUmqpqamBu1b7guLxYJNmzbh+uuvx+23387LMecIQdC9EcwYOjZjY2NobW1FSUkJ8vLywk5++oPM3qyqqopIFx67IYr9LzAjeGNjY5iYmPC7M3Y6nZicnIRGo5llQxDOOSENQzExMcjPz59zz4xQfVkCWR14xt191buThqWysjLmLohchCIl6Gzf9NHRUQwPD6Ompiai/jfeIGEWl8uF8vJyJjSj0+kglUoZgQ81j2K1WnHjjTfiyiuvxB133BH2e+vWW2/F/v37kZGRgZaWFq+v55577kFDQwNkMhm2b9+OlStXhvp0gqB7I1hBp2mamS8ql8shk8mQkZERkV05MNN2PDo6OquaJtKQnWFzczNMJhNycnI4N0SxbQiIWCkUCiQnJwclCqRhKDk5OeyBwt4IJIpzVRbpy2dGKpViZGRkVvLX05qAS8iGK2lpacjPzwcwU7FF3nvREPPOzk44nU63uwUCGQitVqsZ3/L09HTI5XJO58Bms+Hmm2/GhRdeiP/8z//k5bP70UcfITExETfddJNXQW9oaMC2bdvQ0NCAL774Avfccw+++OKLUJ9OEHRvBCPoJCEZExOD8vJyDA0NYXx8HAUFBUzFAV+Q3YnVakVlZSVvt5hccTqdOH78OJKSkrB48WKfDVEmk4kREm/n0bM5h6sNAZk76jnAmi8ChVq4+rJEAovFgtHRUWg0GsTFxTGdvSTuHuj9SjYXwSZfJRIJli5dCrFYjOHhYYyNjaGmpmbO33uBxNwTEppRq9WYnJxEcnIy0tPToVQqva7dbrfjxz/+Mc466yw88MADvG7E+vr6cPXVV3sV9C1btmDNmjXYvHkzgJl8wOHDh0PdrMxbQZ/bS78HXG9dLRYLmpqakJOTg7y8PLhcLmRlZSEuLg5qtZqZVZmRkeHzjcQVtphGw2vZZrOhqakJubm5s1rp4+LiZt3iWq3WWSJPauUpikJiYiISExORn5/P2BCQ+anebAjIzrigoMBruzkf+BNGrr4s3uDDVdJsNmN6eho1NTWgKAoGgwGjo6NM81eggRRs50n2Lp79c2/k5+dDLBZjcHAQGo1mQYg5MHMhyszMRGZmJmiaZkbKdXd3MyPlUlNTER8fD4fDgZ/+9KdYtmwZ72IeiOHhYebuBwDy8vIwPDwckbvPaBJVQecCcV6sqKiAUqlkkp8ikQipqalITU0FTdOYmJiASqViGm4yMjKQlpYW1O0qseXNy8sL2peED6anp3H8+PGgkq+xsbGIjY11G6DBbogiIu9wOBAfH4/4+Hjk5OQwnZd9fX2MDUFcXByGh4exePFiyOXyiDs0ekJ8WcrKykKKzYYr5hqNBuPj427dp8TZkKzPYDBgYGAgKH93X2siu/mkpCSkpKRgYGAAOp0Oy5cvn/MxhaSXw+FwYMmSJSGJLXuTAMzcaanVarz44ovYvn07lEolSktL8etf/3rON0re/gZzvYa5YF4L+vj4OLq7u1FTU8MYEAGzk58URTEfLtKYo1Kp0N/fj5iYGGRmZiI9Pd1vmGFychItLS2oqKiY87FdwIxYtLa28uJnHRMTg5iYGLfYs91un1VhQ86Nw+HAyMgI+vr6IJVKodfrQdM0ZxsCrvgTW1LJU1FREXI1RzhiPj4+Dp1Ox8yX9Qb7PUYGUrS1tXHyd/e1XoqasVru6+vDxMQEqquroybmdrs9ZDH3hkwmw6JFi/Czn/0MJ0+eZEbvrVixApdccgmefvppXp6HC3l5eRgcHGS+HhoaisqmLdJEPeTiDZqm0dPTA71ej9raWohEIjgcDk7JT7LjSUpKQnFxMaanp6FSqfDNN99ALBYjIyMDGRkZbh88cotYXV095xakwIyY9PX1YcWKFbx1X3oilUqRnJzsFkYhDVF9fX0AgNraWtD0zOAOjUaDvr6+gDYEweBrB03ElIsvizfCDbWMjo5iYmICZWVls16jt2NTFIWEhAQkJCQgLy+P8Xfv7e2dNVc10Ps1JycHg4ODmJqaYrqc55JIiTnB5XLh/vvvR2JiIv72t78xn+XW1lZenycQ69atw7PPPotNmzbhiy++iFiyP9pENSnqbQyd0+nEiRMnIJFIUF5eDsD/zM9gINl5lUoFmqaRkZEBh8MBvV6P6urqOa1kIfT390Or1WLZsmVzWmcMfGvwRV6/WCx2a4gymUxQqVSMo2NsbKybDUEw+LI5GBkZwdTUVFAj2zwJtQWfpmkMDw+7+eWHe2xvpmu+4u4ymQxisRgWiwWVlZVRCUNEWsx/9atfwWKx4E9/+lNEL1abN2/G4cOHodFokJmZiUceeYSx5PjpT38KmqZx55134tChQ5DJZHjppZfCmX40b2M180rQydi57Oxs5OfnM0OdiScHn1gsFrS0tMBkMjHJm4yMjDmrqiCVNHa7HUuXLo3Kzqyjo4OJmfp7fpfLhenpaWg0GqaUk915GSjM4K3aI5BbZKQhvjAOh8OtkohPAg2ClkqloCiKGV4xl5ASYJvNFhExp2kajzzyCNRqNf7617/OeYI3wgiC7g22oE9OTqK5uXlW8jMSNebEfz05ORlFRUVwOBzQaDRQqVQwm81IS0tDRkYG7zFkAinBTExMjJiY+IMM2ZbJZCguLg7p+U0mEwYGBjA8PIzp6WnIZDIkJCR4DRl57s5Jw5JUKg17yk8oTT40TaOvrw8URfkdGcdnAxE77m4wGJCUlITc3FxUVVXNiXWD51q6u7thtVojcjGhaRqPP/44+vv7sX379tNNzAFB0L1DxtCR6pTly5dDJpNFVMxJJUt+fr7XGJrT6WTEfWpqimk5D9Zq1BekLJGrJwzfOBwONDU1IT09HQUFBbwc02azMRUipJkpISEBYrEYVqvV7S6M7csS7usPJdRCLiaxsbHIy8vz+TeNlJMiTc8MJSG+MBqNxq05J1KbCPbzR1rMn376aZw4cQL//Oc/57wpao4QBN0bpBuR1N1G0vYWmCmBPHHiBJYsWcKp+9DlckGr1UKlUsFoNCIlJQUZGRlQKBQhhQhCKUvkE6vViqamJixatChigxmIPatKpcLk5CQTP46NjcXU1BQaGxuRkJDA24SjYHC5XG4+8nMNTc/MHy0uLsby5cuZ97jdbmeac6ampqBQKJCenh7y+8zf80dazLdt24ajR4/iX//615znhOYQQdC9MTw8zNT9AvwlP72hUqnQ09OD6urqoBtWyNoMBgNUKhX0ej2SkpKQmZnJuZGJz7LEUCAXk7Kysoh0f3rD5XJBr9czHiA2mw05OTlYvHgxk3z11hDFhWDDIU6nE52dnUhJSZk19zXcY3OBiGlmZibOP/98n+9x9jnT6/VMTwUfo+S6u7thsVgiJubPP/88/v3vf2P37t1RKTCYQwRB94bT6WTa/yMl5iT5ptVqOQ2f5npM0sik1WoDNjKRssTly5dHrCzRHxMTEzh58mTULiZkzGBubi4TnomNjWWGdJAPv6+GKE9CqTzp6OhgDKX8EQkxJ2GexMREXHbZZZxjyuyeinBHyXV3d8NsNkekmoamabz00ks4cOAA9u7dG5X3+BwjCLo3pqen3dqkI1E21dbWBpqmA1ZyhAr7Q6fRaGY1Mg0MDECtVvN2MQkWjUbD5CfmOvkGzLTyHz9+HEuXLnWrgZ+enmYMniiKYqqMPNforSEqmAlRwTg2RmJoBTvMs3r16rCa1sgoOU9TrEBx90iKOQC88sor2LVrF956662ovMeigCDo3ti6dSteffVVXHHFFVi/fj2vomu323H8+HEolUq/lQx8QxqZ1Go1rFYrYmJiUF1dHZU3+sjICIaHh+fcLZJA7gyWLVvmtxzUarUy/QF2u52pMkpMTPT6d+M6IYqYjJEpQ4Hge3fucrkYn6Hy8nIUFxfzdmyucfdIi/mOHTvwyiuv4MCBA1FpyosSgqD7wmAw4K233sKePXvQ29uLSy+9FPX19WH5WZjNZjQ3N6OwsDCiU9l9QcoSiZmWWq1mGpm87UL5hpTlkQEg0SgbIz7ywd4Z2O12ZmrO9PQ0lEolMjIykJKS4leQPCdE6fV6HD9+3G3KkD/4FnN2zD47OxtLly6N2EXVW9w9PT0dk5OTsNlsERPzPXv24Pnnn8eBAweiEsqLIoKgc2FychIHDhzA7t270d7ejosvvhj19fVYtWoVZ3Enu0LPW/y5wldZInsX6nA43HahfELTM8N8nU5nxMJMgRgfH0d/f3/YI9OcTid0Oh3UajXjgc/FUXN6eprpaZBKpQEnRPEdaiFirlAokJmZidzcXGRkZPB2fH+QEGB7ezumpqaYIdChxN398dZbb+GPf/wjDhw4EFG/+nmKIOjBYjabcejQIezatQvNzc244IILUF9fj3POOcfnh5kkH6MV4iBDKUpKSvyW5ZFdKN+NTMQ2IZyGoXAhPvV8D2ZgW7NqtVpmuElaWppbboKYrPlKANM0PWtClMVi4a3mnIzMI8OWZTIZY2ExV/T09GB6ehpVVVXMRoLMCSXrCue9dujQITz11FM4cOAAL+W3hw4dwj333AOn04nbbrsNDzzwgNvPDx8+jLq6OhQVFQEArr32Wjz00ENhP28YCIIeDlarFe+++y527tyJr7/+Gueddx7Wr1+P1atXQyKRwOVyobGxEQBQXV0dlWaGUMsS+WpkstvtaG5uRkZGhpvv81xBwjxGoxFVVVURDfOQXaharYZGo4FEImHGoXV3d2PZsmVBxXNpmvY6PCTYEAyppiEXGgCoqKiY080FW8w93z981Lu///77+O1vf4uGhoaAFUNccDqdKCsrw7vvvou8vDzU1tbitddew9KlS5nHHD58GFu3bsX+/fvDfj6eEASdL2w2Gz744APs2rULn376KVatWoXh4WGUlJRg69atUQkxqFQq9Pb2hn1nEGojExkAEq2cQTC+MJHAbDajr68Po6OjTAlpRkZG2Ek6XxOivOFwONDe3o6srCxm15qZmTmnFq29vb2YmppCZWVlwL+Br7i75x0Pm48++ggPPvggDhw4ELCWnyufffYZHn74Ybz99tsAgMcffxwA8Itf/IJ5jCDo3FlwfbkxMTG4/PLLcfnll0OtVuOKK66AXC7Hxx9/jJ/97Geor6/HRRddNGe1sKQsceXKlWGXJYpEIibeyW5k6ujo8NnIxI4XR8PH3eVy4eTJk4iJiYmKyRQwcw6MRiNWr14NiqKg0WjQ2dkJi8WC1NRUZGRkcJ53yYbrhCir1Yq2tja3kX0xMTG8iR4Xent7MTk5iaqqKk4XVM8BMaT0lthMe8bdjxw5gl/84he8ijngfZKQt1mfn332GZYvX46cnBxs3boVlZWVvK3hdGLBCTrBbrdj3bp1ePjhh3HNNdfA6XTiyJEj2L17Nx5++GFUVlairq4Ol156aUidoYFguyWuWLGC912pSCSCUqmEUqn0OZFJKpWio6MjYFlgpCDj+lJSUlBYWDjnzw/M5E0GBgbcLqg5OTnIyclhwlmDg4OMDUE41g3A7AlRNpsNX375Jc4991wkJCQwIp+fnz9ndyrBirknnjMESL17c3Mz7r33XlRVVeHLL7/Ee++9x/sdB5dJQitXrkR/fz8SExPR0NCA+vp6dHZ28rqO04UFF3JhYzAYvGbYXS4Xjh49il27duHdd99FSUkJ6uvrcfnll/MifKQsMSEhYc6Tj2Q31dvbC7VazZTFBZrIxDd2ux1NTU3IyspCXl7enD0vm5GREYyOjnJKwHqGGEj1R1paWsjxfmL3XFJSEhVvHiB8MQ/Ehx9+iIceegi5ubno7e3F+eefj/vuu4+3CziXkIsnhYWF+Oqrr6LiB3SKeRtyWdCCzgWSMN25cycOHTqE/Px81NXVYe3atSGVNZKyxOzs7KgJ2fDwMCNkNpuNaWTyNZGJb+bC5CsQZJhyKHX2NE3DaDQySVVvNgSBsFgsaGxsnFNvHE/YSehIiHlTUxO2bNmC3bt3o7S0FHa7HR9//DGWLFnC27Qfh8OBsrIyvP/++8jNzUVtbS1effVVt5DK2NgYMjMzQVEUjh49iuuvvx79/f3RnAkqCPp8gKZptLS0YOfOnUyWvq6uDldffTWnDyXXssRIQdz6jEYjli1bNkvIvE1k4ruRyWw2o6mpKWqOkQDczgEfQsbVhoBAxLy8vDwqeQsg8mJ+8uRJ3HrrrXj99dcZ87xI0dDQgHvvvRdOpxO33norHnzwQTz33HMAZqYNPfvss/jzn/8MiUSC+Ph4/OEPf8B5550X0TUFQBD0+QZN02hra8OuXbuwf/9+yOVyRtzT09NnXf1Jw1JlZSWnzsNIrZemaVRUVAT8EEeikcmXL8tcQUamEfvXSAiZ1Wpl7ni82RCQC1pFRUXUGmoiLeZtbW245ZZb8Oqrr6Kqqor3458GCII+nyHWprt27cK+ffsQGxuLa665BnV1dcjKysKuXbugUCiwevXqqDQshTvhiI9GJlJnH61B2qQDllzQ5uJ229OGQC6XQ6/Xo6qq6rQV866uLtx44434+9//juXLl/N+/NMEQdAXCsRud8+ePdi7dy8MBgMA4IUXXsCyZcvmPG7Hd/IxlEamUH1Z+IKmaaY0sqSkJCqx08nJSTQ2NiIpKQlmsxnJyclIT0/n7IfPB/39/TAYDLyFmjzp6+vD5s2b8be//S2cAcpnAoKgLzRcLhfuu+8+9Pf347vf/S727dsHi8WCq6++mmlDjrSwkIahoqKiiHiBcGlkGhsbw8DAQNi+LOGssaWlBUlJSUzr91xDQk2kC9jThoBLU064RFrMBwcHsXHjRvzlL3/BOeecw/vxTzMEQV9oHDx4EJ988gkeffRRxolPpVJh79692LNnDwwGA9auXYu6ujqUlZXxLu5ERLiOywsXbxOZRCIRTCYTampqomKn4HQ60dzcjNTUVN7mnwYL8YbxVevvOYSC2BAQKwI+iLSYj4yMYMOGDfjjH/+I888/n/fjn4YIgn66odVq8cYbb2DPnj0YGxvDFVdcgfr6el5a30m8OloNQ2QwiF6vh0gkCjiRKRKQYdZZWVlRmf8JfDuDNpi8gWelEclXhJp3iLSYj42N4frrr8fWrVtx8cUX83780xRB0E9nDAYD9u3bhz179qC/v5/xdK+urg76Q0h8YaI1rs7Tl4WiKK8TmdLS0iIWgrHb7WhsbER+fv6cts+zmZiYYJLAoXYa22w2phzSYrEwTodcbQgGBgag1+sjJuZqtRrXXnstHn/8cVx22WW8H/80RhD0MwWj0YgDBw5gz5496OjoYDzdzzrrrIAfyqGhIYyNjWH58uVRGVdHfFliY2N9Jh/ZE5ki0chEui8XL17Mi5tfKBgMBrS1tfGaBCbJaLVajcnJyYBOhwMDA9DpdCFtCrig1Wpx3XXX4Te/+Q2uuuoq3o9/miMI+pmIyWTCwYMHsXv3bhw/fhwXXngh6uvr8Z3vfMetMoKmafT09GBqairi1rO+IPFqhULBua2b70am+dB9qdfr0d7ejpqamojdIQWyIYi0mBsMBlx77bV44IEHUF9fz/vxzwAEQT/TsVgsjKf7sWPHsHr1aqxfvx6rVq3Cf/3Xf+HGG2/E2WefHZWSPFIamZ2dHXK8mlgQhNrIRLpwo9mwo9Vq0dXVhZqamohaJ7DxtCEg05MidUExGo247rrrcO+992LDhg28H/8MQRB0gW+x2Wz497//jR07duDQoUNYvnw5fvazn2HNmjVzXhpIfFkKCwt5K40MtpHJsywwGmg0GnR3d2PFihVRKc8EZsIsKpUKSqUSWq0WFEUxHjN8hH6mpqawYcMGbNmyBTfccAMPKw48bYimadxzzz1oaGiATCbD9u3bsXLlSl6eO4oIgh4sO3fuxMMPP4zW1lYcPXrUZ6NDYWEhkpKSIBaLIZFI8NVXX83xSkNDp9Ph2muvxY033oiioiLs2rULH3/8MVauXIm6ujpcfPHFEd8lkjb2SIY4AjUyEUuFaHWgAjPJwd7e3qjV2gPfmo2xh6MTG1tfNgTBYDKZsHHjRtx000245ZZbeFkzl2lDDQ0N2LZtGxoaGvDFF1/gnnvu8ep3vsAQBD1YWltbIRKJsGXLFmzdutWvoEfZSjMk3nrrLYhEIreElNPpxCeffILdu3fjgw8+QFVVFerq6nDJJZfw7ukeDV8Wl8sFnU6H8fFxGI1GxMfHY2pqCitWrIiamBM/9ZqamqgkogHvYu6Jpw1Bamoq0tPTkZKSElDczWYzNm/ejOuvvx633347b+vmYn27ZcsWrFmzBps3bwYAlJeX4/Dhw7y5NUaJeSvo83bAxZIlS6K9hIhyzTXXzPqeWCzGhRdeiAsvvBAulwtffPEFdu3ahcceewylpaVYv349LrvssrBr06PlyyISiZCWloa0tDRoNBq0t7cjJSUFzc3NSEpKQkZGBlJTU+csKTw2NobBwcF5L+YAIJVKkZ2djezsbDidTuh0OoyMjKCtrc2vDYHVasUPf/hD1NXV4Sc/+Qmva+cybcjbY4aHhxe6oM9b5q2gc4WiKFx22WWgKApbtmzhdQcSTUQiEc4991yce+65cLlc+Oabb7Bz505s3boVixYtQl1dHa688sqgd9cajQZdXV1YsWJFVOrcgZla+76+PtTW1iImJoZJDKpUKvT09EAmk0W8kWl0dBTDw8NYsWJFVLpgAe5i7gl7RByxIWBPsyLTh+RyOW655RZceuml+I//+A/eE+5cpg1xeYwAf0RV0C+55BKMjY3N+v7vf/971NXVcTrGkSNHkJOTA5VKhUsvvRQVFRW44IIL+F5qVBGJRDjrrLNw1lln4bHHHmM83a+++mpkZmairq4OV111VcA4OPFlWblyZdRixWwhJbtiiqKQnJyM5ORklJSUMI1M/f39EWlkGh4extjYGFasWBGVElFgpueADOgIpzSRoigoFAooFArGhuDIkSP41a9+BbvdjqqqKnz/+9+PiIjm5eVhcHCQ+XpoaGjWiDoujxHgj3kbQyesWbPGbwydzcMPP4zExETcd999c7Cy6EPTNFpbWxlP95SUFKxbtw7XXHMN0tLS3D7Eg4ODUKlUnMa1RYqhoSFmDVyFlO9GplDWwDdDQ0NQq9UhTVvigsPhwO23346cnBwUFBRg3759sNvteOutt3gtCeUybejAgQN49tlnmaTo3XffjaNHj/K2higxb28xFrSgT09Pw+VyISkpCdPT07j00kvx0EMP4YorrojCSqMLGf6we/du7Nu3D3FxcbjmmmtwzTXX4I9//COqqqpwww03zNngYk/6+voYT5JQRcxisTC17qE0Mg0MDECr1UZMSLkQ6QuK0+nEHXfcgfz8fMZYDpipsVcqlbzv1ANNG6JpGnfeeScOHToEmUyGl156KWhrXlKbP4+YV4thM28Ffe/evbjrrruYQcg1NTV4++23MTIygttuuw0NDQ3o6enB+vXrAczsFm644QY8+OCD0VryvIF4uu/cuRPbtm2DUqnEpk2bcO211yI3N3fOh1r39PTAZDKhsrKStwtKsI1MfX19mJiYiJgvChciLeYulwv33nsvFAoFnnzyyai9znBxumiIRfNWMwFB0OcXXGvcAzVNzGfsdjt+/OMfIzs7G3fddRczsMNqtTKe7oWFhREVd2L05XQ6GaOvSBCokam3txeTk5MRm/LDhbkQ85///OeQSqV45plnTgsxf/GTXqgmrSjNSMQ5xanITZn74So+EAR9PsGlxp1L08R8Znh4GG+88QbuuOMO5nvE033Pnj3Ys2cPJiYmcNVVV6Gurg6lpaW8Ci6J70skEt6P7Q/PRibScBbNmPnw8DDGx8cjKuYPPvggrFYr/vSnPy0oMe/TTCMrOQ5xUjFcLhqiU2J+7Z+OQJkQC6mYwpTVgZr8FNz9vVJIRNR8CL9EfQG+OCMFneAvPs+laWKho9FoGE93lUrl5ukezofG5XLhxIkTkMlkIc1A5QOaptHZ2YnJyUnExcX5nMgUaeZCzB955BFotVq88MILUbtohcJbTSN4+p12vHnnd5Ec/20fwH/+qxGTFgf+evPM5/LVLwbw0pFevHXXdxEnnRevb94K+oKvQ48UXJomFjppaWm47bbbcNttt0Gv1+Ott97C7373OwwMDODSSy/F+vXrg445O51OHD9+HAqFAosWLYrg6n1DxNzhcGDlypWgKMptIlNHR8ecNDJFWsxpmsbjjz+OsbExbN++fcGIOUlyftmng1hEISn2Wxnq105jwmzH/72sjPne+hW5ePFIL4YNZhSlJjC7eIHZnLaCHm6N+5nWEKFQKHDTTTfhpptuYjzdn376aXR2duJ73/se6uvrsXLlSr/i7nA40NzcjIyMDF4GWocCTdNob28HALc7DZFIBKVSCaVSOSeNTCMjIxEX86effhrd3d34xz/+sWDEHABoGqAoQJkQA4vdhUmrg9mhL0pNwJ0XlyA7+dt4OUXNvF6DyQZR+kzSe1BnQr6SXzuM04HTVtDfe++9sH7/TG6IkMvl2Lx5MzZv3gyTyYSGhgb86U9/wokTJ7BmzRrU19fj7LPPdhMRMmUoLy8vam3dXOP2kW5kGhkZYQaVRErMt23bhqamJuzYsSNqfQWhQnbYMRIRjBY7nC73zdPKAgWAmddJfiSLkSAtcab34PcHTqJfa8KfbzxrvlfDzDkLJ3syx9TW1qKzsxO9vb2w2WzYsWMH1q1bF+1lzTkymQzXX389duzYgS+//BKXXnoptm/fjnPPPRf/5//8H3z00UcYGBjATTfdhIKCgqiK+cmTJyGVSoNKwlIUhaSkJBQXF+M73/kOysrKmKlJX3/9NQYHB2G1WjmvY2RkBKOjoxEV87/85S/49NNP8dprr0XNgyYUvurT4YM2FYb0JgBATnI8JCIKVocTAODyEHaKokD0WkQByfFSPP1OO/Y3j+LJ66oFMffCGZkU5VLjDnhvmhCYwWaz4f3338fLL7+Md999F5dccgluvPFGXHDBBXMuMpFKwno2MqWnpyMzM9NnIxMR85qamoiJ+YsvvoiGhgbs3bs3al48oTCgNeHCrR8AANITY3HWIgXipGJ82KHG/7thJc4tTmUeS6pdSKydpmn84K9fwGJ3Ykhvxv67vosMeRwcThck4qjsSeftleSMFPRIo9Pp8P3vfx99fX0oLCzE66+/DoVCMetxC9XLndDT04PrrrsOzzzzDOx2O3bt2oVPPvkEZ511Furq6nDRRRdF3NPd5XKhpaUFSUlJKCoqitjzBGpkirSYA8Arr7zCdALzNet0LvmoQw2jxY5dXw+hVzMN9aQVZrsTZxcqUZGVhDUVGViSJUdW8rcXKpqmYbI5cckfPoTd6cKBu89Hpjwu2s1HgqCfSdx///1QKpV44IEH8MQTT0Cv1+PJJ5+c9biF6uVOePHFF1FTU+M2gYZ4uu/atQsffPABli1bhvr6elxyySW8i5DL5cLx48eRnJzMeQ4qH3g2MsXFxcFqteKss86KWDz7tddewz/+8Q/s378/at7xoeLZum9zuCCigD8d7sb/vNeB6txkdKunMW1zIDUhBtnJ8bjne6W4ZGkm8zuHWkaxLC8FuSnx0RZzQBD0Mwu2if/o6CjWrFnDVF6wWeiCHgiXy4XPP/8cu3btwnvvvYeysjLG0z1cUSJDrVNTU1FQUMDTioNneHgYAwMDSEhIwPT0NJRKJTIyMjgNnuDK7t278cILL+DAgQO8j+ib67tJmqZB0zOJ0a/6dLjj1WN4/NplWJ6XgjcbR9AyMoF+rQk7bj8HUi/hlHkg5oAg6GcWKSkpMBgMzNcKhQJ6vX7W44qKiqBQKE47L3dvuFwuHDt2DDt37sTbb7+NwsJCxtNdLpcHdSyn04mmpqaolkcCM1bAIyMjTJiFTGRSqVSYmJjgpZFp37592LZtGw4cOBCR4dnRvJtsHjKg7v8dwT9v+w7OK/72uGRHH8UYeSDmraAvrHqneYS/OneunAle7gSRSIRVq1Zh1apVePzxx3H8+HHs3LkTV111FbKyshhPd2+7QzZOpxONjY3IyspCbm7uHK1+NmxfdxIzZ09k4qOR6eDBg3jmmWfQ0NAQETEHgDfffBOHDx8GANx8881Ys2aNV0GPBGQH7nLN/hlN0/NVzOc1wg49AnANubA507zcCZ6e7gqFAuvWrcPVV1+N9PR0t8c6HA40NjYiNzc3qiPMiJjX1NRwipmzG5m0Wi2nRqb33nsPjz76KBoaGiIakovm3eS40YLvPvlvbN2wHHU10bs4h4CwQz+TWLduHV5++WU88MADePnll712pnp6ub/zzjt46KGHorDa6EJRFJYuXYqHHnoIv/71r9HV1YVdu3Zh06ZNiI+Px7p167Bu3TpIJBI89thjuP/++5GVlRW19QYr5kDwjUwffvghHnnkEd7EfL7eTcrjpHC4aEyY7WEdR+BbhB16BNBqtdi4cSMGBgZQUFCAnTt3QqlUCl7uQUDTNPr6+rB7927s3LkTQ0NDuPrqq3HfffchJycnKjYMY2NjGBoaCkrMA0EmMrW2tuLJJ59EbW0tPvroI7zzzjtz0pkczbvJLtUk7nz1G7xy69nIkC+cmnrM4x26IOgLiED+7DRN45577kFDQwNkMhm2b9/uVlK4ENFqtbjmmmvwk5/8BEajEXv37oXNZsM111yDuro6LFq0aE7EPRJi7smbb76Jp556CjKZDCKRCHV1dbj55ptnhZ745Oc//zlSU1OZpKhOp8NTTz3l9phITgYz25yIjxHP5wSoNwRBFwgPLv7sDQ0N2LZtGzO/8Z577lnwDpGPPvooVq1axYgHTdMYHx9nPN0nJycZT/eSkpKIiPtciPnXX3+NO++8E2+++SYKCwuhUqmwb98+XHLJJRGtsRfuJkNCEHSB8ODiz75lyxasWbMGmzdvBuB+O326olarGU93tVqNtWvXYt26dbxNSBofH8fAwABWrFgRMTFvamrCli1bsGfPHpSUlETkOQR4Zd4K+oK5xznT8ebPPjw8HPRjTjfS09Pxk5/8BAcPHsS7776L4uJi/Pa3v8X555+PRx55BM3NzXB5q4vjwFyI+YkTJ7Blyxbs3LlTEHOBsBGqXBYIXPzZzzQPd08UCgVuvvlm3HzzzTAajdi/fz/++7//G93d3Yyn+4oVKzg1+cyFmLe1teHHP/4xXnvtNZSXl0fkOQTOLARBXyBw8Wc/kz3cPZHL5bjhhhtwww03YGpqCgcPHsSzzz6LkydP4qKLLkJ9fT1qa2u9NvnMhZh3dnbilltuwd///ndUVlZG5DkEzjyEGPoCweFwoKysDO+//z5yc3NRW1uLV1991U0MDhw4gGeffZZJit599904evRoFFc9/zCbzXjnnXewa9cufPPNNzj//PNRX1+Pc889FxKJBAcPHkRKSgpqa2sjJuZ9fX3YtGkTXnrpJZx11lkReQ6BiDJvb3sFQV9AePNnf+655wAAP/3pT0HTNO68804cOnQIMpkML730ktcB2AIzWK1WvP/++9i1axeOHj2K4uJidHZ2oqGhARkZGRF5zsHBQWzcuBHPP/88vvOd70TkOQQijiDoAguDQLXuhw8fRl1dHeM9fu21154WHa47d+7EI488gnPOOQeff/45Vq1ahbq6OqxZs4Y3T/eRkRFs2LAB27Ztw3e/+11ejikQFeatoAsxdAEGp9OJO+64w63Wfd26dW617gBw/vnnY//+/VFaJf98+eWX+OMf/4gjR44gOTkZDoeD8XT/9a9/jerqatTX1+N73/teyJ7uY2Nj2LhxI/7whz8IYi4QMQRBF2A4evQoSkpKsHjxYgDApk2b8Oabb84S9NONlStXoqGhgfEal0gkWLNmDdasWQOn08l4uj/66KMoLy9HfX19UJ7uKpUKGzZswBNPPIGLLrooki9F4AxHqEOfZ0xbHZi0RMesiGsd+2effYbly5fjyiuvxIkTJ+ZyiRFBLBb7HBwhFouxevVq/M///A8aGxtx//33o6mpCZdeeil+8IMf4PXXX4fRaPR5bK1Wiw0bNuB3v/sdLrvsski9BAEBAIKgzxtILuO91nFUP/IO/v5ZX9TWwMazjn3lypXo7+9HU1MT7rrrLtTX18/R6qKPSCRCbW0tnnrqKRw7dgy/+c1v0NnZibVr12Ljxo345z//6WZFazAYsGHDBvzqV7/C2rVro7dwgTMGQdDnCUQ4V5ekITUhFn1aEwDA4ZzpcrTYnTCYbBFdA5c6drlczgxGXrt2LTNf80xDJBKhpqYGv//97/H111/jySefxMjICOrq6rB+/Xo899xzWL9+Pe677z6v9skCApFAEPR5RmpCDBJjxfiqf2bIgEQsQtOgAXe99g1W/O5dPP1OOyx2Z0Seu7a2Fp2dnejt7YXNZsOOHTuwbt06t8eMjY0xO/mjR4/C5XIhNTU1IutZKFAUhcrKSvzmN7/B0aNHsW3bNrS3t2PNmjW4/vrrI/KcO3fuRGVlJUQikd/5nocOHUJ5eTlKSkrwxBNPRGQtAvMHISk6j3C5ZoTy7CIlPunUoH1sEnuODeGfXwxAmRCDp66rxndL0xAn5TbCLFgkEgmeffZZXH755Uyte2VlpVut+65du/DnP/8ZEokE8fHx2LFjxxllLxAIiqJQVlaGv/zlLxF9nqqqKuzZswdbtmzx+RiuVUsCpw9CHfo8gQzGBYD/ebcDf/moG7ESMWIkIly7Mhe3ri5C5qkhAOzHCpzZrFmzBlu3bvXaQMbFoVMgJObth08IucwTKIqC0WLHjqMDePmzPlgdLtQWKvHaT87BL65c4lXMnS6a2dUvFG699VZkZGSgqqrK689pmsbdd9+NkpISVFdX49ixY3O8wtOHM9F980xHEPR5gNNF41DLKG5+8SgeeeskFqclIFseh9LMRJRkJLqJNkVRTHJULKIgEs3bzYJXbrnlFhw6dMjnzw8ePIjOzk50dnbi+eefx89+9rM5XN384pJLLkFVVdWs/958801Ov3+mu2+eiQgx9Chic7jwVb8Oz33Yg4871TirQIG/3rwKS7Pl+P7zn6FHPTXrdyZMdrzwcQ8+7daiJD0RP7lgMcoyvddQz0cuuOAC9PX1+fz5m2++iZtuugkUReGcc86BwWDA6OjoaT2kwxfvvfdeWL8vuG+eeQiCHkXGJix4cG8LLHYnnvl+DepqcpmfJcdL0amagsFkQ4oshvm+zenC6uI0yGIk2P5pHxQJMfjl2iWnTVzdV5jgTBT0cGFXLeXm5mLHjh149dVXo70sgQgihFyiSEGqDB/ctwbv/OcFqKvJhZMVWllRoMD4hGVWSCU9KRbnlaRhaY4cpRmJWFM2M0DYf2574SCECbixd+9e5OXl4bPPPsNVV12Fyy+/HMCMARhpYmJXLS1ZsgQbN24UvNdPc4QdehRxumiIKCApTgqapiFmiXdljhwmuxOHjo9hY22+2+/ZnS60j02CpoHaIiUALLhYui+EMAE31q9fzwxuZpOTk4OGhgbm67Vr1wpdqmcQwg49iohFFLP7ZO9CaZpGXU0uPv/F93DBqR24y0Uzu9exCQvaRo1YmiOHVCxacJUu/li3bh1eeeUV0DSNzz//HMnJyUK4RUCAI8IOfR5CURRcLpopVQRmduAuFw2KAno00xgxWLB+ZV4UVxkamzdvxuHDh6HRaJCXl4dHHnkEdvuMGdlPf/pTrF27Fg0NDSgpKWGGdAgICHBDaCxagDz/UTfea1Vh+49qIYsRrsneuPXWW7F//35kZGSgpaVl1s9P10EdAnPCvI1vCmqwQGgbM+Lzbi3ylTL0qKdxdqESshgJnC732LvADLfccgvuvPNO3HTTTT4fc7oN6hAQEAR9gaCUxeD4sBGPHWyD3elC7SIl+jTTKEzjNmThTCNQvbuAwOmIkBRdIGTI4/D0xuXoePRK7P2P1chMjsM9/2qEatIS7aUtWE63QR0CAsIOfYFA0zScLhoSsQg1+SnYtnlFtJe0oCGDOhITE9HQ0ID6+np0dnZGe1kCAmEh7NAXCBRFQSKe+XO5XDQz+EIgNIRBHQKnI4KgL0BEom/FXSA0hEEdAqcjQshF4LQkUL27MKhD4HREqEMXEBAQCI55e+UX7tsFBAQEThMChVzm7ZVIQEBAQMAdYYcuICAgcJogCLqAgIDAaYIg6AICAgKnCYKgCwgICJwmCIIuICAgcJogCLqAgIDAacL/B/Ih4IZVzSwqAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import matplotlib\n", "import matplotlib.pyplot as plt\n", "from mpl_toolkits.mplot3d import Axes3D\n", "\n", "# setup parameters of the coordinates\n", "fig = plt.figure(figsize=(10, 6))\n", "ax = fig.add_subplot(111, projection=\"3d\") # first figure of 1*1 space\n", "ax.set_xlabel(\"$x_1$\", fontsize=18, color=\"tab:blue\")\n", "ax.set_ylabel(\"$x_2$\", fontsize=18, color=\"tab:blue\")\n", "ax.set_zlabel(\"$x_3$\", fontsize=18, color=\"tab:blue\")\n", "ax.set_xlim(axes[0:2])\n", "ax.set_ylim(axes[2:4])\n", "ax.set_zlim(axes[4:6])\n", "\n", "# plot the X_decorrelated_DR dataset\n", "k = 0\n", "Z_projected = np.empty((60, 1))\n", "for i in range(0,60):\n", " for j in range(0,2):\n", " while k<60:\n", " Z_projected[k] = -(normal_vector[0]*X_decorrelated_DR[i, j]+normal_vector[1]*X_decorrelated_DR[i ,j])/normal_vector[2]\n", " k = k+1\n", "\n", "# plot the original datatset\n", "ax.plot(X[:, 0], X[:, 1], X[:, 2], \"bo\", alpha=0.6)\n", " \n", "# plot the X_decorrelated_DR dataset\n", "ax.plot(X_decorrelated_DR[:, 0], X_decorrelated_DR[:, 1], Z_projected[:, 0], \"mo\", alpha=0.6)\n", "\n", "# plot the track of projection\n", "for j in range(0, 60):\n", " ax.add_artist(Arrow3D([X[j, 0], X_decorrelated_DR[j, 0]],[X[j, 1], X_decorrelated_DR[j, 1]],[X[j, 2], Z_projected[j, 0]], mutation_scale=15, lw=1, arrowstyle=\"-|>\", color=\"tab:gray\"))\n", "\n", "# plot the hyperplane(2_D) for projection\n", "ax.plot_surface(x1, x2, z, alpha=0.2, color=\"k\")\n", "\n", "# plot the principal compoents(orthogonal vectors that decide the hyperplane)\n", "ax.add_artist(Arrow3D([0, C[0, 0]],[0, C[0, 1]],[0, C[0, 2]], mutation_scale=15, lw=1, arrowstyle=\"-|>\", color=\"tab:red\"))\n", "ax.add_artist(Arrow3D([0, C[1, 0]],[0, C[1, 1]],[0, C[1, 2]], mutation_scale=15, lw=1, arrowstyle=\"-|>\", color=\"tab:red\"))\n", "\n", "# plot the origin\n", "ax.plot([0], [0], [0], \"r.\")\n", "\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "colab": { "collapsed_sections": [], "name": "dimensionality_reduction.ipynb", "provenance": [], "version": "0.3.2" }, "hide_input": false, "kernelspec": { "display_name": "Python 3", "language": "python", "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.8.8" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": false }, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false } }, "nbformat": 4, "nbformat_minor": 1 } ================================================ FILE: 02_Python/Discrete_Cosine_Transform_(DCT)/Discrete_Cosine_Transform.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "All the IPython Notebooks in **Clustering Algorithms** lecture series by **[Dr. Milaan Parmar](https://www.linkedin.com/in/milaanparmar/)** are available @ **[GitHub](https://github.com/milaan9/Clustering_Algorithms)**\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Discrete Cosine Transform\n", "This is a little jupyter notebook that does a discrete cosine transform (DCT). DCT is a thing like the Fourier transform that's used in JPGs." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "jupyter": { "outputs_hidden": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: numpy in c:\\programdata\\anaconda3\\lib\\site-packages (1.20.1)\n", "Requirement already satisfied: pandas in c:\\programdata\\anaconda3\\lib\\site-packages (1.2.4)\n", "Requirement already satisfied: numpy>=1.16.5 in c:\\programdata\\anaconda3\\lib\\site-packages (from pandas) (1.20.1)\n", "Requirement already satisfied: pytz>=2017.3 in c:\\programdata\\anaconda3\\lib\\site-packages (from pandas) (2021.1)\n", "Requirement already satisfied: python-dateutil>=2.7.3 in c:\\programdata\\anaconda3\\lib\\site-packages (from pandas) (2.8.1)\n", "Requirement already satisfied: six>=1.5 in c:\\programdata\\anaconda3\\lib\\site-packages (from python-dateutil>=2.7.3->pandas) (1.15.0)\n", "Requirement already satisfied: matplotlib in c:\\programdata\\anaconda3\\lib\\site-packages (3.3.4)\n", "Requirement already satisfied: python-dateutil>=2.1 in c:\\programdata\\anaconda3\\lib\\site-packages (from matplotlib) (2.8.1)\n", "Requirement already satisfied: pillow>=6.2.0 in c:\\programdata\\anaconda3\\lib\\site-packages (from matplotlib) (8.2.0)\n", "Requirement already satisfied: cycler>=0.10 in c:\\programdata\\anaconda3\\lib\\site-packages (from matplotlib) (0.10.0)\n", "Requirement already satisfied: numpy>=1.15 in c:\\programdata\\anaconda3\\lib\\site-packages (from matplotlib) (1.20.1)\n", "Requirement already satisfied: kiwisolver>=1.0.1 in c:\\programdata\\anaconda3\\lib\\site-packages (from matplotlib) (1.3.1)\n", "Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.3 in c:\\programdata\\anaconda3\\lib\\site-packages (from matplotlib) (2.4.7)\n", "Requirement already satisfied: six in c:\\programdata\\anaconda3\\lib\\site-packages (from cycler>=0.10->matplotlib) (1.15.0)\n", "Requirement already satisfied: scipy in c:\\programdata\\anaconda3\\lib\\site-packages (1.6.2)\n", "Requirement already satisfied: numpy<1.23.0,>=1.16.5 in c:\\programdata\\anaconda3\\lib\\site-packages (from scipy) (1.20.1)\n", "Populating the interactive namespace from numpy and matplotlib\n" ] } ], "source": [ "!pip install numpy\n", "!pip install pandas\n", "!pip install matplotlib\n", "!pip install scipy\n", "\n", "# Imports and the like\n", "%pylab inline\n", "\n", "import numpy as np\n", "from PIL import Image\n", "import matplotlib.pyplot as plt\n", "\n", "# Graph settings. No more jet plz\n", "mpl.rcParams['image.cmap'] = 'gray'" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "jupyter": { "outputs_hidden": false } }, "outputs": [ { "data": { "text/plain": [ "array([[1. , 1. , 1. , 1. , 1. ,\n", " 1. , 1. , 1. ],\n", " [1. , 1. , 0.92156863, 0.08235294, 0.72941176,\n", " 1. , 1. , 1. ],\n", " [1. , 1. , 0.54901961, 0.29019608, 0.2627451 ,\n", " 1. , 1. , 1. ],\n", " [1. , 0.99607843, 0.15686275, 0.8745098 , 0.16862745,\n", " 0.8627451 , 1. , 1. ],\n", " [1. , 0.75294118, 0.00392157, 0.09019608, 0.02745098,\n", " 0.4745098 , 1. , 1. ],\n", " [1. , 0.35686275, 0.6 , 1. , 0.88235294,\n", " 0.09803922, 0.98039216, 1. ],\n", " [1. , 0.2627451 , 0.90196078, 1. , 1. ,\n", " 0.29411765, 0.8745098 , 1. ],\n", " [1. , 1. , 1. , 1. , 1. ,\n", " 1. , 1. , 1. ]])" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Load up the image, and normalise it\n", "img_path = 'data/a.png'\n", "# Open image. We also convert to grayscale to make it simpler to deal with\n", "img = np.asarray(Image.open(img_path).convert('L'))\n", "# Normalise to 0-1\n", "img = img / 255\n", "\n", "plt.imshow(img)\n", "img" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "jupyter": { "outputs_hidden": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "saved to output/test.png\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# And a little function to save images\n", "\n", "# Shout out to\n", "# stackoverflow.com/questions/31544130/saving-an-imshow-like-image-while-preserving-resolution\n", "def save_image(data, name, vmin=0, vmax=1):\n", " cmap = plt.cm.gray\n", " norm = plt.Normalize(vmin=vmin, vmax=vmax)\n", " \n", " img = cmap(norm(data))\n", " plt.imsave(name, img)\n", " print('saved to {}'.format(name))\n", "\n", "# quick test\n", "arr = np.linspace(-1, 1, 8 * 8).reshape((8, 8))\n", "plt.imshow(arr)\n", "save_image(arr, name=\"output/test.png\", vmin=-1, vmax=1)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Displaying the frequency things\n", "Let's start with seeing if we can render each of the 'frequencies' that the DCT gives us." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "jupyter": { "outputs_hidden": false } }, "outputs": [ { "data": { "text/plain": [ "array([[1., 0., 0., 0., 0., 0., 0., 0.],\n", " [0., 0., 0., 0., 0., 0., 0., 0.],\n", " [0., 0., 0., 0., 0., 0., 0., 0.],\n", " [0., 0., 0., 0., 0., 0., 0., 0.],\n", " [0., 0., 0., 0., 0., 0., 0., 0.],\n", " [0., 0., 0., 0., 0., 0., 0., 0.],\n", " [0., 0., 0., 0., 0., 0., 0., 0.],\n", " [0., 0., 0., 0., 0., 0., 0., 0.]])" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "freq = np.zeros((8, 8))\n", "freq[0,0] = 1\n", "freq" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "jupyter": { "outputs_hidden": false } }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from scipy.fftpack import idct\n", "\n", "freq_img = idct(idct(freq, axis=0), axis=1)\n", "plt.imshow(freq_img)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "jupyter": { "outputs_hidden": false } }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Ok, lets try for a more interesting frequency\n", "freq = np.zeros((8, 8))\n", "freq[2,3] = 1\n", "freq_img = idct(idct(freq, axis=0), axis=1)\n", "plt.imshow(freq_img)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Alright sweet, that worked. (Side point: that plot looks wiggly haha)\n", "\n", "Now lets try... ALL OF THEM" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "jupyter": { "outputs_hidden": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "saved to output/components-0-0.png\n", "saved to output/components-0-1.png\n", "saved to output/components-0-2.png\n", "saved to output/components-0-3.png\n", "saved to output/components-0-4.png\n", "saved to output/components-0-5.png\n", "saved to output/components-0-6.png\n", "saved to output/components-0-7.png\n", "saved to output/components-1-0.png\n", "saved to output/components-1-1.png\n", "saved to output/components-1-2.png\n", "saved to output/components-1-3.png\n", "saved to output/components-1-4.png\n", "saved to output/components-1-5.png\n", "saved to output/components-1-6.png\n", "saved to output/components-1-7.png\n", "saved to output/components-2-0.png\n", "saved to output/components-2-1.png\n", "saved to output/components-2-2.png\n", "saved to output/components-2-3.png\n", "saved to output/components-2-4.png\n", "saved to output/components-2-5.png\n", "saved to output/components-2-6.png\n", "saved to output/components-2-7.png\n", "saved to output/components-3-0.png\n", "saved to output/components-3-1.png\n", "saved to output/components-3-2.png\n", "saved to output/components-3-3.png\n", "saved to output/components-3-4.png\n", "saved to output/components-3-5.png\n", "saved to output/components-3-6.png\n", "saved to output/components-3-7.png\n", "saved to output/components-4-0.png\n", "saved to output/components-4-1.png\n", "saved to output/components-4-2.png\n", "saved to output/components-4-3.png\n", "saved to output/components-4-4.png\n", "saved to output/components-4-5.png\n", "saved to output/components-4-6.png\n", "saved to output/components-4-7.png\n", "saved to output/components-5-0.png\n", "saved to output/components-5-1.png\n", "saved to output/components-5-2.png\n", "saved to output/components-5-3.png\n", "saved to output/components-5-4.png\n", "saved to output/components-5-5.png\n", "saved to output/components-5-6.png\n", "saved to output/components-5-7.png\n", "saved to output/components-6-0.png\n", "saved to output/components-6-1.png\n", "saved to output/components-6-2.png\n", "saved to output/components-6-3.png\n", "saved to output/components-6-4.png\n", "saved to output/components-6-5.png\n", "saved to output/components-6-6.png\n", "saved to output/components-6-7.png\n", "saved to output/components-7-0.png\n", "saved to output/components-7-1.png\n", "saved to output/components-7-2.png\n", "saved to output/components-7-3.png\n", "saved to output/components-7-4.png\n", "saved to output/components-7-5.png\n", "saved to output/components-7-6.png\n", "saved to output/components-7-7.png\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAVAAAADnCAYAAABIUA6gAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAACC0ElEQVR4nO29eZCk11UlfnLfMyu3yqx966XUi1puJKuRhSRrjBSYwY6wFWBPjJmJgCEGwh6ImfGwhPkRLGEWz3jANmAGHBBhYCDG0mDLYYzsQDKW2y216E3t7q7uquraK7fKfV9/fxTn9cvMqurOqpcaS/pOhKJTX73Kevnl++677957ztW1Wi1o0KBBg4beof9/PQENGjRoeLNCM6AaNGjQsE9oBlSDBg0a9gnNgGrQoEHDPqEZUA0aNGjYJ4x7/fBb3/pWX1P0jz/+uE7Ve83NzbUAoNFooFKpoNFooFwuo1AooFqtolwuI5VKoVwuo1QqIZlMolwut12vVqvI5XKoVquo1+uoVqtoNBoAgBs3biib69WrV1sAkM/nsbm5iXw+j1QqhYWFBaRSKeRyOUQiEeTz+bbfczqdGBoagtPphNfrxczMDLxeL1wuF8LhMJxOJwDgxIkTSub62muvtQAgEong0qVLiMfjSCaTmJ+fRyqVgs1mQyAQgM1mw/DwME6fPo2hoSHY7Xb4/X7YbLa28ZFIBFeuXEE0GgUAnD9/Xtk9/da3vtVqtVpYWlrCSy+9hKWlJfEznU6HyclJPPHEE5icnBTXexmvcq0+//zzLQBYWFjACy+8gMXFRQwPD+Od73wnhoeH4fF4MDY2BrfbjZs3b+KrX/0qbt261XZ9ZGQEDz30EIaHh9veBwC+8pWvKJvrF7/4xRYALC8v4+zZs1hdXcWxY8fwzDPP4L777sPKygpefvllrK2ttf3e+Pg43vWud2FsbAzXrl3Dl770JVy/fh1jY2N49NFHMTY2BgD4yEc+omSun/nMZ1oAkEqlsLi4iFQqhcnJSTz++OOYmJjAtWvX8Nxzz+HGjRs4efIkPvzhD+P48eO4fv06nn32Wdy4caNtPJ/HdDoNAPiDP/iDHeepeaAaNGjQsE9oBlSDBg0a9gnNgGrQoEHDPqEZUA0aNGjYJzQDqkGDBg37hGZANWjQoGGf0AyoBg0aNOwTmgHVoEGDhn1CM6AaNGjQsE9oBlSDBg0a9gnNgGrQoEHDPqEZUA0aNGjYJzQDqkGDBg37hGZANWjQoGGf0AyoBg0aNOwTmgHVoEGDhn1CM6AaNGjQsE9oBlSDBg0a9gnNgGrQoEHDPqEZUA0aNGjYJzQDqkGDBg37hGZANWjQoGGf0LVafe1crEGDBg1vWWgeqAYNGjTsE5oB1aBBg4Z9QjOgGjRo0LBPaAZUgwYNGvYJ414/nJub62uG6ejRozpV71Wv11sAUKvVUCwWUa/XUSqVkEqlUCqVUCgUEI1GUSgUkM/nsbm5iXw+33a9WCwinU6jVCqhVquJf//lfZXNNZ/PtwAglUphcXER6XQam5ubuHTpEiKRSNt1GV6vF9PT0xgYGMDQ0BAeeOABhMPhtusA4HQ6lcw1Go22AOD27dt48cUXsby8jM3NTVy4cAGRSARutxvDw8Nwu92YmZnBU089henpabjdboyMjMDlcrWNl98HACKRiLJ7yrX6+uuv46//+q9x7dq1tp+fPHkSH/7wh3H8+PG26/c6XuVaPXv2bAsALly4gL/4i7/A5cuXceTIEbz3ve/FoUOHEAgEcPToUQSDQZw/fx5/9Ed/hAsXLiAQCOC+++6D3+/H4cOH8aM/+qM4dOgQLl68iD//8z/H5cuXAQDf+c53lM31y1/+cgsArl27hmeffRZzc3N45JFH8PGPfxxnzpzB9evX8eyzz+LGjRttv3fs2DF88IMfxNGjR3H27Fl86lOfwrlz5zA7O4tnnnkGs7OzAID3v//9Sub6J3/yJy0AiEQiuHz5MqLRKE6cOIEPfehDOHbsGM6ePYtPf/rTOHfuHB5//HF84hOfwKOPPoqzZ8/if/yP/4FXXnmlbbz8PgDw+c9/fsd57mlAG42Gis/2hkAydKjX6+LfRqOBZrOJZrOJVqsl/gMAnU4HnU4HvV4PvV4Po9EIg8EAo3H7ttTr9b7Mle9br9fb5sa5cA6cB2EwGMRcdTodWq0Wms0mGo0G6vW68vnynvJ9OT+j0QiTySTmuNN8arWa+A46P1/n51IBrtVWqwWDwQCDwdD2c51OJ+Ymo9fxKtBsNsVrg8EAk8nUdg95H2u1GprNZtt64JoFINY556jXqz9Qds6Vz0iz2RTPF7/XTnBdNhoN8b0bjUbx+VSis5qI95NrsdlsQq/Xi3vN6/LcDAaDmJtsI/bCniu5Uqkc8GO9cSgWiwC2F1W5XBb/VqtVVKtVcbPkh1mn04kFbDKZ0Gw2YbVaxfsAgMlkUj7XUqkEYPv+yoZep9MJ42SxWGCz2dp+z2q1CsOl1+vFIq7VaqhUKuJ96YkeFPz+ZQNqNBphtVpht9ths9lgNpthMplgMBjQaDRQrVZRqVRQLpdhMBjEd8EHxmKxiHusEvJcDQYDzGZz28+NRiMajUbXmu51vApUq1UA2w+92WyG3W4X94TfKe9jvV4X95zfPQ1ttVpFsVhEtVoVxkE1+N1zrjabDUajEdVqFaVSSXyWnTZFjqnX6zCZTGK9yO+rCrJB5vOs1+vFs9FoNGAymWC322E0GlGv11EsFlGr1cT95cZQrVbb1vxeeMt4oPzANEh8aDs9UN5o7pqy1yd7f8DOi0LlXGUPGYDwLuXdWgZ3Se72/Fz0VlQvSr5fo9FAq9USc5M9Iv4/gB09Yv5us9l8wzzQ3f7Gbh5oL+NVgN83vV9+r/R65XvI+yavB71ej1ar1XaP6Qz0a67AHQ9U/vvy99oJ+TPwHvN3VXug8vvJa1Keg3yvd5qb7IHKz+Re2HMll8vlg36uNwz0vuh5NptNVCoV4X1yoQHo8kDphXKXBe4Yz348QLyv9DBoZLgQ6YFaLJa237NYLGIR8ovlUaRarSr/vuh98SjP+2W1WmGz2cQc6Rl1zkWv14vPSJjN5q7PpQL87PQoO/+GyWRCo9Houke9jlcB3s9WqyU8M5PJJLwder68d1wPZrNZeKDAHQ+vVqv1zQOV1z/nQQ+OJzxgZ0NTq9XECcRoNIrP0Pm+qsHnmYZSvo/0oJkjqdVq4vvnKVQOixzIAy0UCuo+VZ+RSqUAQBwj+W+hUGhLCHXuOiaTCVartW0BVioVNJtN2Gy2vsRBOVcmrnjE4FGi0WjA7XZ3eUUOh0Mc9wwGA+r1OiqVCoxGI7LZrPK5ZjIZANvhkWazKR4Ct9uNRqMBu90Op9MJq9UKo9EoEng8LlUqFWSz2TYjarfb4Xa7lc4TuLNWq9UqLBYLnE5n28/NZjMqlUrXmu51vAow3NRoNOBwODAwMACXywWdTieO7/l8HjqdDpVKRdxzh8MhDFiz2UQ+n0cqlUKxWITBYIDdblc+V26izWYTDocDPp8PVqtVJGj5WTrDMnq9HoVCQSRxrVYrfD4f7HY7Wq2W8tBI5yZtt9thMBhQKpWQyWRQrVZhs9kwMDAAm83WlmDm/bVareJov1doQsaeP+WbvBlAD5QxDO4k/E8+zssBYhpOXjObzSL4zDijasgeqByblWOyFoul62/z4ZGPe3LcUXUSYTcPlAuUHoW823NH5+9yc5CD+P2IgXKtNhqNHWOacoxWRq/jVYD3s9lsirgc152chOvcWC0Wi/juGQN9oz1Qbpb0QPm3d0rC0QPlhso4bj9CI/KzQsdIr9cLJ6MzBkqnSo4xc2OioyUn7HbDW+YIT09Bzl7STadR7Uwi8fjOh4cLWHbl+2FAOVcuQDnbyqOjzWbrMohWq7XNYHGO3GlVz5XeBY0h52e329FsNsUR3mw2dxmczmMSNwiLxdIXT4lrlfej00jLD72MXserAO8R76HD4ehKIpXLZWGEeM/5kDNWVy6XUSgUxObZuQmoAI09ADFXk8mEWq0m/rZOp9vReHN+/Az0oDvfVwU6DajZbIZerxeJtnq9DrPZDIfDAbPZLE6nPMFxE+Mapkd7t7jyngaUR803A1iv1Wq1RExRLlWQj/Y0VnIslB4fx8vvoxrxeBzAnZpVGlF5J2QGUYa8g5pMJmGgGJZQ7YFsbW0B2Db4PMLbbDb4fD44HI627KXFYkG1WkU2m4XJZEK5XIbRaBTVAdzRnU5nX5JIXKuVSgVWqxVer7ft51arFeVyuWtN9zpeBbLZLACIUI1Op4PD4RBhmVKphHQ6jWKxiGKxCLvdDr/fD7PZLNZHo9FAOp0W99xoNMLlcimfq3yyc7vdMBgMcDgcKBQKiMfjItSw0xE+m82i2WyiUCjA4XAgGAzC4XCg1WqJ91UF+Qgvh+Q4v1KpBJfLhVAoJOYfjUaRz+dhs9ng9/vhcDhQq9WQzWbVHOHfjB5oZxZNrrVk5k32QAEId59ZUbkWrB8GVC65olHnUVKeS6dB5M7KTHy9Xhdj6a2oBO8p35fzYyCeXg+PcPImxc8jV0XwQetHvaKcRNopTLCbR9nreBWQww3cuC0Wi4iB6nQ6cTrh/LhxdnqgjCf2ywOVDZPFYhHrkp7dXh4ox9RqtbZyLWbw+zVPzoXPRKFQEPeRHrScH5HDKJ1lTAfyQFXvEv1EPp8HgDaj12kI5ddyGRMXQGcRbb8MKOdKoy6XCfF4ziO6DLncioazWq0K46XaMPH775yf3W4Xf08ubeLmxKMTC5ar1aq454zjqgbnygeiM3bF2sXO77PX8SrAkEir1RIevFzfyQ2LpxAeMTtLgRgeYRyyn7FlzpWnHya6aPA7DSg3AToJJpNJnD64blVC/p74DPE7pFHk5s0jfD6fF3PjBsWs/b2SE/ZcyclkUsFHe2OwubkpXtMoyvVp9Djl8qWdXnf+1w8w3MD6PhohPsjyAyWDOzcNGmOLjJupftgZapDLPDq9ZM6FwXrOQza6spfq8Xj6Uq/ItUpvstMbY2lVLpdru97reBXgEd5kMsHj8YhwDJOKzLAzbOJ0Otvi8rzfqVSqzUPtZ2zZaDTC4/EIo5TP59vCTp3Gu9FoIJPJiPm5XC7xOcvlsnLPXt505KqQXC4n4p8ul0sYz1wuh2q1CrPZDKfTCY/HI8InrGpgQf5eeMsc4enVyYaTBopGiUd02fOUC8LlgmqZMtmvubIsiF+WTqcTR/SdPDU5oyhXGsi1birBUIPZbBZZYsZBmeySY8acn1wJwc/FWlEaYtXgWuU97HygW60Wcrlc15rudbwKyEk51tSyZllOItXrddjtdhE2oVdEI1oqlVCpVGC320VyRDXk8A0NJY0n44cyw4igkSyXy2IDcDqdKJVKbRoTqiAXvrNeluuQCTkmweh55vN52O12UdrEDbNSqQjj+bbLwssepewt8RrH0BgwC88xfC2/j2rQMPELkjn4/OJ4pJAhex88+vMIVygUlJeGcJ4E58ciehaadybqaAAY45O53jtRVFWAa5WGutMg8j51rulex6sAj68sTXI4HNDpdMhms+Ieskid68HhcIh7y7hnuVxGsVhsW7uqQUPHudrtdmHsi8ViWwhMRrlcRqVSQbFYFJUarN6QwxSqwLVPh4ieJudJJ8DhcIj5FwqFtvvL05wcXjhQEunNmIWXBQO4a5pMJuFBdR6TeVPlB4keKd9HNWKxGIDtRUn+PedDj2RgYKDroSa7h8aJhopZW9UPO7Pw9XodXq9XeJ/MWFYqFbGb0wvm0Yj/0vvgZuRyueDxeJTOE7izVnkk78yq0yh1rulex6sAwwIOh0NkhpPJJBKJhPhOqQpGw+P3+4XnxhBJOp0W8zMajX0hKHBNca6BQEAYn1gshkAggOHh4a61WigUkM1msbW1JZ6xwcFB6PV6bG5uKl+rPH1xg5bX59bWFqxWq7jXvB6NRtvWNI1nLpeDw+EQIYu98JbzQOVEjByrA7ZvrhxrlGOPrK/k8VSO3amG7Nl1JoFoyHk06gSPzrKiDIuCVSf9OE/Og/PjAmWcCWgvPKdnVKlURHKJHkK/60DlwmgZe1E5exmvAnIdqNVqhcPhEN4cPXneQznJwZAIk1tvdB0oRWRYB8rvGNhZdIceqJzpZia/Xx4o0F4HKstbynWgch2rXAfKBBfXw4GSSG8mJhIfdsY+OkuBWCTfmYWXj87kadMAMx6pGnwoWebDL04+iu2kWtRoNMSXLydxyFpR/bDz/fjAcn7yMZzJDbK2ZGWocrksjvpyFr8fXHi5NIgPkAze652YSL2MVwEaD7JjGENkFl7eiGQKLTdbuQKDBqrfTCQ+SzwtMbyxGxOJn5Ox3H4zkeQEquw8yfFkuQRPph3z/spMpFqttqtIiow9DWg/MpD9AsWHeWyXY0Ks7yLrRFa4YQKBcT2XyyVuJhM8qsGMcaPRgNPphMFgECUeNE5ut7urMNpgMIjSEXp2PMJns1mR3VUFvp/T6eziwnu9XlgsFnFPZa+kWCwim82KbGa5XBZxPrvd3pcjPNdqpVIRGVcZnGvnmu51vApwsye/3Ov1ioJvlv3kcjlks1mxCXk8HrRaLVgsFmFYc7mcKLjvFxeem6g8VyZckskkBgYGRGxbBrnwyWQS5XJZhEn4nPbrCA90c+FZGM85kAvPe8f7m0gkxBqmg/C248J3StHJhb70hOiBAmgTFaF3JBvQfuzqMk9cLvQH7uyeO2WGedyQ+dCy16daoKGTC8/5URdS9ohlLjy9YWaJZUZXvz3Q3fQ9d+O29zpeBXZSY5I9UFnjVfaQOk9EskhOvzzQTp1NmQvPZAywc8E5P4McJuF97qeg8m5ceFnPVObCy2V6DC/cq4e8pwHthxJRvyA/5Jw3XXKZA7+bHminziW9034Ufd+LHihjoTJoPHfSAyXbpx/zlIuKOzccuSyMx09Z6JlZY1kspZ/3lPPcSdyC8+pEr+MPCvlYLEuvyWEmJgkZ75Y3TlmPU37Y+xGv300PlPfmXvVA5ZrnN0IPlGuyUw+UhlUuAewkKHQ+k3vhLeeBysYTgBDlkOsVO2Og9PgYe+Ruz92qX3PlMXEnib2dyn1YnybT+WRvRXUSSY6BAne8dYY8GJiXxUTkuTAOKhf590sPtNMD7fwbZJns5oHe63gVkNWYuM749/mdMgYqe6CyHixLmagK368yps6jMZOs9OB244zrdLo2tSj+br8U6Ts9UCaR5JI6OUksC93Ip01ZjQk4oAHtp+ipasgeKI8y8u4jJ5BkObtOD5QGlV5oP45Fsmcnz60zsdW5KGUap3yE5+fslwfa6bXzvsge8U7zkaX6ZP2Bfic7dvMomeGW0et4Fej06mQPlOtTXrtySZ3MkOOGda8Pu4q5dnqgpHLezQOVveh+eKCyAZVPl7vdR967zuudWhp3qwPX2hpr0KBBwz6h64dYggYNGjS8HaB5oBo0aNCwT2gGVIMGDRr2Cc2AatCgQcM+oRlQDRo0aNgn9ixjunr1al8zTCdOnFCmFZfP51sA2voEUU2HogvxeBzFYlEoseTzeRSLRcRiMRSLRUFPI3uC7wMAuVxO2VyTyWQL2Kaf3r59G5lMBtFoFFeuXEE0GkU6ncby8rKgvREDAwOYmpqC2+1GOBzG/fffj8HBQQwMDGBychIDAwMAAJ/Pp2Suq6urLQBYXl7Gt7/9baysrCAajeLy5cuIxWJwOp0YHh6G0+nE1NQUnnzySUxOTsLlcmFoaAhOp7NtvPw+ALCysqLsnnKtXrt2DV/60pdw/fr1tp8fO3YMzzzzDO6777626/c6XuVa/ad/+qcWAFy5cgV/9Vd/hatXr2JmZgZPPfUUpqen4ff7ceTIEfh8Ply4cAFf+MIXcOnSpbbrhw4dwlNPPYWpqSlcuXIFf/mXf4nvfe97AIBvfetbyub63HPPtQBgbm4OX/nKV3Dz5k08/PDD+Pmf/3k89NBD4vrc3Fzb783OzuJ973sfjhw5gnPnzuEzn/kMzp8/jyNHjuD9738/jhw5AgD4wAc+oGSun//851vAtirb66+/jng8jvvuuw8f/OAHMTs7i1deeQV/+Id/iNdeew2PPPIIPv7xj+PMmTN49dVX8bnPfQ6vvfYajh07hg984AOYnZ1FLBbD66+/LpTT/viP/3jHee5pQCn8+2YAZb1kZXT29Sa1UC5aJzNC7ofDYnD+PoUwVIOGMZvNCrqjTHfbrXe62+2GzWbrotORe074fD4l85T7wrdarTYufK1WE33qOxV6dDodMpmMaNDFz9dPLjzXqqwyLoN93jvXdK/jVUDuC2+z2eD1euF0OgUXnrKABoNB9IX3eDxwOp1tYsG5XE70ZqeikGrI7UdkmUVyyQuFwo5N5fg5KbPI33U6nW9YX3ij0djVF17mwvPe8f5arVY0Gg3hTAEH5MLLbTK+37G4uAgAbRSter3e1vWS8mAyu4P0uWq1ilqtBqfTKSh0/WprfPv2bQDbjCSKLVSrVSFmwi/N7/e3/R47YpJTzAeNi4fMpenpaSXzXF1dBbC9ObHxmdvtxujoKDwej/h/sqaKxSISiQTy+TxKpRIsFgtyuZxQ+dbr9QgEAn1hd3Gt5nI54QHLcLlcyOfzXWu61/EqkEgkAGwb71AohGaziUAgIAwmT0i5XA6ZTAYejwdjY2Ow2+1wOp2wWCyo1+uIRCKo1WqIx+Mwm81d60UFKKbSbDYRCoWg1+sxMDAgTk+JRAJ6vX5H4ZtYLIZWq4V0Oi1OT4FAAI1GQ7lIi2yQ3W63kPdLpVJYXV1FLpeD3+/H9PQ0vF4vUqkUFhcXkUql4Ha7MTY2Bq/Xi3K5jEQiITaGu7Hm3jIeKL06maMrN4iiESW7RGb8yOpNVGuS30c16NnRM+YcZUqh2+3uouaxpQJVovj5gDtN0FSCXi09UN4jl8slXtP7pEADaXOtVgtms1loRjYaDeGB9uOecq2SNtjpUcqN0GT0Ol4FZIUjemYOh6OtCR87SbLtstvtFhsn2TyFQgEGg0F4oP1Q+u/0QDmPcrmMTCYjThydhkan06FYLCKTybR9Bs5RtQcqnxRlymm5XBZqTDt50BSt5udi6E9uu7IX3jKK9PQUSIOTX9Mgynz4zg6YvE7pNgBtHTpVgur5cltjCucCd3oQdYYP5LbGfMABiNYFqqX32FSOeqAUxQUAj8cjHhwe4SqVCrLZLAwGAwqFgtAgIGdar9eLhaoaXKulUmlHQ8JjWyd6Ha8C3JhqtRoGBgYEz53dTEnnpHG02+3Cc5f7wieTSRQKBZRKJRiN/e0L32q1hPFxOp3I5/NC1Fmv13fdQ4Zx6FEzRMEuDKrvrew8UMPCZDIhl8uJ06csHcnTRaFQEPfXZrOJsBOp4QdqKrewsKDgo70xuHTpEoC9m8rJ3G25H9Eb3VTuypUrALqbynGX3k0JqrOpHJtg0btWzYW/ceMGAAivk/MbGxvraipH47lTUzl6qWazWfyuanCtymEOGXK4REav41VgbW0NAGC32zE+Pi6aymUyGZTLZRECaTQasNvtCAaDQj6QsfxqtYrFxUXRVM7n8ymLfctgWxer1Yrx8XHRVI5JWHp1neGDcrmMlZUV0VQuFAqJpnLpdFq8ryrIMUu/3w+j0YhyuYxIJCL0aEdHR0VTuc3NTdFULhwOY2xsDJVKBVtbW0gkEmLd3m2zf8t4oJFIBMAdxSAaQB7PZUVsuQOmfJ1HaBpZvo9q0ANlnxb52N4p7CyDMU8eL3K5nEhC9aODJGN1LpdLJDDYn8dut7cpotN4yjt+tVqF3W4XmxANcOdxWQXktbpTjyMAu/Y46nX8QcH4H4+Ofr8fmUxGeD7siVSpVIRnFAwGxbGZx+NUKoVsNotAIIBQKNSXnkiycpjb7cbAwABarZYwogMDA/D5fDsqh2UyGaTTaeh0OjidTgwODiKdTiOZTCr3QOkxyu1w6vU68vk80um0iNMODg4K4xmJRBAKhcQmlUqlROyZydG7KVy9ZRTpudBlzT96SfyXBpHHdo6lyy/HTuQjvmowXit33qTHyYSMy+XqyqqytwsAkfSipBkV4FWCsVqq1HCDcblccLvdQqya4sk8rjPuxOw7+3HzM/dTkd7hcIg5ymA1Ruea7nW8CtB4NBoNofLOGDhPF9wcXS4XbDabaHAmtwTO5/NIpVJi/fYjNCLHQB0OBwYGBoSnnE6nxSa/WwyUCSSr1YqBgQERouh3DJShDm46bF1MVXxm4ZkE9Xg8omyxVCqJ5/5AMVB6dW8GMAsv9zfpzBLLhoA/l/tCczw90516s6vA8vIyAAiPgX+TR2WXy4WxsbGuh5qxMyaM2HIim81ibW1N+cPOLHyz2cTk5KQwNGNjY/D7/aIzI8s+SqWSyGDyeiAQEAbUYDAgGAwiHA4rnSdwZ606nU44HI6uv5HP54XXIaPX8SpAzz4QCCAYDGJ6ehpGoxHz8/PCaMdiMaTTabjdbng8HoyOjooHnzJym5ubWFtbE2snGAwqnyvXlN/vRzAYxOTkJDKZDFKpFJaXl4VD0rlWE4mEqP0dGBiA1+vF5OSkkIvrVxbe6XTC5XLB7/cLb3d1dRVer1dk4Xl9cXFRPG+jo6MiqZtIJNBsNjE8PPz2y8LThe9sFMWEBkVT5fgnBYJ5pObu1S9BZblA3u/3i4SRbNRdLpcojJdhs9lEwogZw2KxKPrjqAQNNo+3nB/nZjQaUSgURIKJHmg+n0c2m0U+n4fFYmmrA7VarX2vA7VYLDvWde6UVe91vArIHig38K2trbaeSLyHch0oBay5pnk8ZU+kfmTh5bAQ58q+THId6E4eqNxumx6o3W4XySeVkOP/dJjkLHytVmvLwnP+O9WByl7+3Z5/jcqpQYMGDfuEZkA1aNCgYZ/QDKgGDRo07BN7HvD7UW7SLzBOx77wjNcxy8pSJbkpF/v2MB7DTCjbB1cqFZGFU3kvGNu8V2470St3/qBgrJLVAJxfNpuFyWRCoVBAoVAQpUysnWs2m/B4PDCZTG0x5VarJbjJADA2NqZsrvx+VHHedxuvAryfLJRPpVLI5XJtegNOpxONRkPEkDOZDPL5PKrVKur1uiAleL1e2O12weFWDTmz3wu3fT/c+YNAjlXyGWLck2uRmXeSJ3jv5Bpcg8EAu90uYrp3q63e04B28oO/n0H+t1x+RIEFliixrosJmEql0sZKMpvNyOfzouCe5UyA2od9amoKwL1z24leufMHBT/zwMCA2FiY8SfLJJvNigw8a0SdTqdYmMxyUpglkUiIz3fixAllc+VaVcV53228CvB7MpvNiMViMBgM4r7QeIbDYZGBz2QyWF1dFUpi3OBDoRBMJhOCwSCq1arI7qsEs+u9ctt75c4fFHISK5fLCTKH1+vF2NgY3G43tra2BP/d6/VienoaPp8P2WwWq6urSKVSsFqtYg3fS7nVW8YDpVe3VyG9zEQiJ15ue0o2T78L6ekt9spt75U7r2qeDodDdDhkjSJfy2ItcuUC29pyN6cnXywW+3JPuVZVcd53G68C3Bj1er3w6gqFguhdbjab4XA4xMbPOl9unKx5JO3YbreLdawaXF+9ctt75c4fFHK9plylwnnyPnZ60Kxq4f3lGub87qbGtqcB3Ymd8f0Kegpyi1XWqMntdGlYW62WWIwUF5HHA2h7rRKsOeyV294rd/6gCAQC4v1pEIlMJtNG2eRDBUA81CxvYklJs9kUYQjV4FpVxXnfbbwK0PsyGo1Cao2nIbLkWNLkcDhQKpUQj8fbqJxGoxE+nw8Oh6ONw60avAe9ctt75c4fFDI9mGVI1WpVnNDsdrvY+Dn/oaEhOBwOFItFxONxYUBl4sfdBHr2NKAzMzMKPtobgwceeAAAuvo6y33hWYDcarWEVB29UIqJ8OdyH3nVuP/++8XceuG298qdPyhmZ2cBQBTsc36rq6uo1WpCMoyevtvtFrJsvC7TOmu1GlZXV5WrRgF31qoqzvtu41VgdHQUwLY3vrKyIqT/WIvITUev1wvjScUlOb4/PT0Ni8WCYrGIra0tJJNJ5XNluKFXbnuv3PmDgt9To9HA1tYWarUarFYrwuGwuEdra2tCVISC34VCAdFoFCsrK7BarfD5fAgEAkIK825e/VvGA6VXt5ecXalUEoo3VGdiEomiGOVyue9ydoODgwB657b3yp0/KMhsyeVyyOfzwhhubW2hWCy2ydkB2x6r2+0WySTK2XETYsy0H8Xp8lpVxXnfbfxBwdBIrVZDJpNBMpmEx+MRng+Lzi0WizCeiURCkBCYOPR6vXC73UgkEoLDrRryEb0Xbnuv3PmDgh5jqVQS/5lMJjidTgwMDCAWiyGfzyMWiwnjGQ6HEY1GRWzW6/UKTYFisSjCU3thTwPaD3msfoELXRZC5lFHjomQykkDS8NKY8rXsvydajBe2yu3vVfu/EHBLDyZW7LqUi6Xg8ViQavVEnPgw8/YF73lXC4nONCMo6kG16oqzvtu41VA7oDALLxer2+LgTIRx400k8mgXq+LcAiNmNfrbeNwq0ZnDPReue29cucPis4YKJ9jbjoy/13mxZPtlclk2jQF+NwfKAbaD85yv8AsPI/FjIHwBpVKpTZDILf84M2VJdnk1iCqMTk5CaB3bnuv3PmDgkdNvV6P27dvC0OztraGra0tOBwOBINBEYejapDD4cDg4CDsdrtQqKfXH4/H+6LyzrWqivO+23gVoGe/tbWFWCyGxcVF1Ot1HD58WGTh2esqm82KLDzbUZCCTBk2xsz7mYXvldveK3f+oKBBJgU2mUwKb3d0dBTJZFJk4Xl9enpaOAOrq6ui3DEYDEKv12NjY+Ptl4XvbCrHmjlqUzJ2x3gnj+07qQjJTeX6MVegd257r9z5g4AeKI9tcr+edDotkhyyzoDNZoPD4RCydZVKRXjLrAPtR7JDrgNVwXnfbbwK8PhqMBhEDNHv97fVgbpcLtE2Ra69letAeTxlFr7fHmiv3PZeuPMHhRz/pwfKLLzH4+nKwsvzl8vxqCnAkMDdnn+NiaRBgwYN+4SuH1lmDRo0aHg7QPNANWjQoGGf0AyoBg0aNOwTmgHVoEGDhn1CM6AaNGjQsE/sWcb02muv9TXD9OCDDyojmkej0RYAUYzOkhvyd8mgYR9tMjxkZk1nGRPLoAAgEokom+vq6moLgKjvy2aziMfjuHHjBhKJRNt1GR6PRyjLBAIBzM7OIhgMip45LDsaGxtTMte5uTnx/X/2s58V17/0pS+J1ydPnhSvf/EXf3HH6//n//wf8fpzn/uceH3jxg1l95Rr9ebNm/jqV7+KW7dutf388OHD+LEf+zEcPny47fq9jle5Vr/5zW+K+/pv/+2/Fdc/8YlPiNc//MM/LF6///3vF6/f8573iNe/+qu/Kl7L7/ONb3xD2Vz/9m//tgVst41+4YUXsLi4iNOnT+Onfuqn8MADD7RdlzE9PY2nn34a09PTuHDhAr7whS/g0qVLmJmZwVNPPSXqtn/iJ35CyVw/97nPtYDt2lo+R4cPH8Z73/teHD58GBcvXsSf//mf4/Lly3jooYfwsz/7s/iBH/iBtuuHDx/Gj/7oj+LQoUPieSRF9XOf+9yO83zLNJW7ffs2AAi+O1lGpGOxaJ7sIjI++Dusx3Q6nWIMi79Vg03lyEIhV5yF8axb7aQRsq7O4XDAbDaLwnv2fGLdqErpvTcLuFYpFNFZAE/Zus413ev4txtYIN9sNoV0HZk9y8vLu8rTUaLPYDCIrpgTExO7yt8dFDLlklJ0VqsV6XQaa2tryOfz8Pl8mJqawsDAAJLJJG7fvo1UKiWayg0MDKBcLmNrawv5fF60Pt8Le5Yx/dZv/VZfPdBPfOITynbK3/7t326bKz+XbAD5miIhnWPIqtgJn/zkJ5XPtVO0hIImfL0TqBBFhSm+1uv1Qjnql3/5l5XM9aMf/ai4p7KBkbs/FgoF8XptbU28lmmoVHXqfJ+PfvSjyu4p16osFCODmq+d6lr3Ol7lWv3P//k/i/t69OhRcZ1dUIH2xoMUdem8Lt/vI0eOyO+vbK6/+Zu/2QIgqM2km8oSjDtpRlAOUpZppOqZrLP7q7/6q0rm+hu/8Rvi++dzJP8tOkSyDKTcRpoylhwvvw8A/Pqv/3rvHmg8Hlfx2d4Q0KvrNCjUpqTAMrU++XCQFkc5OzIa+P/9kLNbWVkBsLO6EuXtdmqpvJN6E73lftFO3yzgWlWlurTb+LcbyNCyWq0IBAK7qit16jDQk9tNvUm1ej4VvoxGI5xOp+gJz+/Q4XAgFArB4XAIAe18Pg+73Y5wOAy73d42noI4d1M42/On/ZDH6hfIr5aFkOWdRtallBXr5evy+H4KKkejUQB3FGuoauR2u4UA8U7qSqSccbHkcjkUi8UuVae3I7hWqfTTGf6gYlCn6lKv499uoKGj3N5u6kqdBnQn9aZQKIRUKoVkMqncgMptiG02m2hzks/nhViL2+3G4OAgNjc3kcvlEIlEEAqFYLfbMTg4iFQqhWg0imw2C7vdLhTF9sKeBnR+fl7dJ+wzLly4AABCTYW9kWQDxYeFEmwUwPD7/UIWjuNl7UXVuHz5MoBtUZDR0VERPxobG4Pf799VHKRTZGR1dRVbW1u7io8cFHKy6Nd//dfF65/6qZ8Sr1999VXx+uMf//iO1+XxH/vYx5TOkeBaPXToELxeLw4dOtT182QyiYWFhbbrvY5XgVdeeUW8/r3f+z3x+qMf/ah4/Xd/93fiNddL53X5O/nWt76leJbbYBLF5XJhYmJCCOH8wz/8A15//XVMT0/j8OHDXfqe2WwWS0tL4mT49NNP4+TJk1hcXMT8/HyXfuhBQYPM59nv96NUKmFjYwOLi4swGAwYGRnByZMn8c///M/Y3NzExYsXcerUKTz55JM4duwYFhYWcPnyZaytrSEQCCAQCNxV4WxP6/Bm2n0Z7Jddb5vNhkajIRqdsU2CHIth4zkqClHxRvZMVSMWiwHY3jU9Hg8MBoNofEVP1O/3d4mDmEwmZDIZNBoNZDIZkSTL5XLY2traUXzk7QKu1XK5LLQyZVitVpG0k9Hr+LcbZE/R4/FgcHAQDocDhUIBsVgMPp8Per2+y9DodDpks1nEYjEUCgWh0LW1tYVms9k3DxSAkHdkj7NEIoFyuQyXy4VwOAyn0yk80OnpadjtdgSDQUSjUZGY5ee52/O/pwHtV0uDfoBSb3JfHioVWSwWEVOUW3qwnQebdAEQzc9MJpPofAlsH/VUgQo/1JxkywzGNlkx0On9UruS1QFUhOcm8HaOgXKtUnGrU5mIPY4613Sv499ukI+wpVJJNLWjWLHVahXtcWSwJ5LT6YTFYhGKV+Vy+Z6y271CDrWx6oZdTZ1OJ0wmU1sIjKdNeW7swstnEjigHqicPf1+x/DwMIA7fYb0er24eTQyTNIwK0c1eqqt82FiIof/AmoNKOfaGfekR6nT6cTOLaNQKAihZZY9UU6MOpwqIddyynORj+dMiAHA+Pj4ju8jeyevv/66eB0KhZTME7izVuk5dmpjsmto55rudbwKyPdJvpfyfZLvvXzP5O/hne98p3gtfw+PPPKIsrlyTiyT29jYQD6fh9vtxvDwMHw+344eZbPZxMDAAIaHh4XHt7GxgVQqBZ1Op1z8WzbIFH6u1Wpwu90IBoOw2+3IZDJYX19HNpsV8/d4PMKbzuVyMJvNbUmxAynSv5l2X3qgcltjZrbZspjJIdkDpfAyAFGi0dnvRzXogdJwsiJANupyKwyCxf4sJ+kMQ/Rjrm8WcK2yPnYnj5JhGRm9jn+7gUdYnU4nnA1ZK9VisYgSp06woRxbdtPL47pVid08UKr70wNldwR6oHSaCoWC0OXlM7lXOSGxpwGlp/RmAJuKsWQJgChRMhgMbRl2ub0Hj/FyeZPcyZNlTCp3dfaF5wPKhBWPGBR37lxkcssRuQsmk2F32y3fyuBapbfTufnk83m4XK6usrRex7/dwESmXq8XpyL2VWd2vdVqdbHmms2mOBV5vV6kUim0Wi3kcrm+9IWXy9BYkVKpVODz+US4IZFIoF6vI5lMwufzQafTCdX/lZUV5HI5Ua7FCpgDKdKfPn1awUd7Y/DUU08BaC+kpUdHI8lCWrldh1zkK/dB6iyk/chHPqJsrk8++SQAdDGlSCOVDaUMOUEmd8FkrE71ri5TM7/2ta+J13K2XT6OypRD+fq5c+fE69/93d8Vr2Va4kHBtZrL5bC+vt4V/nC5XOI4KaPX8Sog3yf5Xn7wgx8Ur9/73veK1/I9k4/2n/rUp8RrmWr7oQ99SNlc2dYln8/j6tWrKBQK8Hq9mJ6exsDAgGBryUX9wPb9O3nyJBwOB1KpFBYXF5FOp+FwODA0NCTeVxV4Aq1UKlhbWxMtjQ8dOgSn04lUKoWbN28inU7D5/OJ6ot0Oo3FxUVcvXoVLpcLQ0NDGBkZEe2A7tY9YU8Dyl7rbwaQWyv3KpcNFG8Im2DRiFarVeHWy+Pl5nSqwVIQxt5kDj47cyYSia5jpd1uFyVXwJ0umOzj8nY+bnKttlotFAqFrr5L9JY613Sv499uoGFi7/RYLCY8t8nJSUSjUWxsbOzYlC8YDGJwcBCtVgvpdBpLS0sIhUIYHh4W76sKjIEyVMB4ptfrRTgcRr1ex9bWFpaXl6HT6cQmsLS0hMuXL2N1dRVDQ0OYmppCIBAQxvNAHqjqQG8/wS9E9ihl6haw7cGxhIk0ynq9Llg9FB2pVCpoNpvifVSDxxedTod8Pi/mSKNfLpdRKBS6+vQ0m03BsmC8Vu5DpDqJ9GaCXHbCjVBGtVoVHryMXse/3SCfarjRM4bocrmQyWR2jIGSi85yIp6wPB5PX2KgcldOPkOMgTocDphMpjZHZacsPGOgVqsV5XJ5T2o3sacB7SyO/X7GyMgIgDs3j2pKDB6T2iUbVhpOMnrY8Iy/36+mcvRqMpkMSqWS8IKq1SqKxaKon9tJjclut4sspsxgGhwcVL6ry8dFuahezhzLkI/tcoZYziLLr1WCa5UqW52F2szEdq7pXserwG5Z+J/8yZ8Ur3fLwjPWD+yehVcJOQufSqUQiUQE+WNoaAj5fF60q5bBLPzQ0JDIfEciETidzh3rRg8K2SCzdTaz8KFQSKibra+vC0WzkZERbG5uolgsIhaLwev1wmw2w+PxiMRyZ3lWJ94yWXh6dbVaTSSJ9Hq9cMFZ08lkEXcXufaS2W/GH3eKQ6oA42q1Wk3UnFGBiXMpFotdHig3A4Yh5DpQu93+puqiqhpcq2wR3Rn+qNfrO2bVex3/dgOPxp1ZeGa3d6sDBSDqQFnp0M860E4PVK4DpQfamYUnXbparXZl4VmDfSAP9M3IhafnyaO83BeeCZpOJpLT6WzL0st6oP04wpMLz57UjLvyyFiv19sygQR7wJOKyqMnpcO4WbwdDSnXKus3O5lFNpsNxWKxa033Ov7tBnqWrVYLAwMDbYIc0WgUmUxmV48ynU4L0RFy4QcGBvrORGKC1WQyIZfLIR6Po1QqCa+ZlRebm5uC9x4MBuFyuUSuhPM7EBOp31z4H/zBH1T2XuTCM64pJ4qYEOKRnDuoTqcT4iJyj3hm33eS6VIBcptlERA+yDqdThjKzgA2Y0oWi0U84CwNyefzYleXj3kHgSyELBeUy9x2+cGRs+3ysVNW9XrmmWeUzK0TXKupVAp+v7+rJtbr9SKZTHaVK93reJVrVb5P8r2U75N87+V7JtN7v/CFL4jXDz/8sLL5ySDBoNFoYHx8HG63G+FwGJFIBM1mE+l0GgaDoYtwYDQasby8jEwmg2g0inA4LJJPjUaji7hwUHTKJzocDtjtdmxubgplqNHRUZjNZgwNDWFjYwPNZhPRaBSBQADHjh2Dz+dDoVDA2toaSqXSPRX8v+W48Dya0/DRCNKw0rjKWoHUBWy1WnA4HF06napBLnynPB13O7PZDLPZ3BV/7ZS/k+M01Wq1L8InbxZwrZZKJVit1h09ynK53LWmex3/dgNDG61WCx6PRxyJGV4qlUrQ6/VdoQ5y4Xk85qnIZrOh2Wx2hUwOCjmEwNpqo9EoWIalUknEXzn/SCSCQqEgPFDWUmezWfHsHcgDfTOpcVORnoXPcgE0dT3l/yhnx/+Xx+32Pqoga5fybzKeyYJguYifkJkRzHxWKpU2g/92Bdeq0WiEy+US7U0IqqB3Cq70Ov7tBpYnGQwGBINB6PV61Ot1ZDIZbG1tic28szC+0WggFouh1WrBaDTC4/HA7/cLJ6ZfivQ8wQHbz0gqlRIVKz6fD6FQCLVaDalUCvF4XHz/9IyZf6BW8IHk7K5cuaLo4/UfL774IgAIDjwNEuOFjHVarVahbUiRER6LGYMkG0nmwqvEt7/9bQAQXGtm0pkd5I64k8hvIpEQmXpmFlmjp3pXl/sXyVJrsiSdfFSXC77l6/IRtF9ydlyrIyMjeOihh7padGxsbOD8+fNd9Z69jleBv//7vxev//Iv/1K8/s3f/M0dr3/5y18Wr7/xjW+I17/2a7+243iV4OcfGhrC7OwsBgcHsbi4iG984xu4ffs2wuEwHnjgga562c3NTdy4cQOxWAwzMzP44R/+YVE3evHiReXOGQ0yQwxutxsbGxt47bXXsLGxgZmZGbznPe/B1NQUbt68ia997WtYWFgQ1ycnJ8X4zc3NLqnJ3bCnAWWy480AenWyjidrvaxWq2DwyK0GmGVleZBsWPn7/ZCzY8mJx+MRNZ3k7DudTng8HoTD4S6vKJPJiOqCUqkk6tcymYwIiL9dwbXqdrvhcDi6DGI2m0WhUOha072Of7uBR/VGowG/34+JiQlsbW0hk8lgZWVFOBudiUu9Xo9kMomVlRUEAgF4PB5MTEyIkFpnhclBIR/hnU4nfD4fEomEEEAJhULwer2YmJhALBYTPZ18Ph+cTidGRkZEDXgymRQnwLs9/29f9QkNGjRoOCD2bCqnQYMGDRp2h+aBatCgQcM+oRlQDRo0aNgnNAOqQYMGDfvEnln4b33rW30NkD7++OPKiizn5uZaQLsaE1WNKBqSSqVQLpfben7L12VpOzKWWHd548YNZXO9evVqC0Bbf+pUKoWFhQWkUinR8KozU0l5NafTCa/Xi5mZGXi93rZmWQBw4sQJJXN97bXXWsB2jeWlS5cQj8eRTCYxPz+PVCoFm82GQCAAm82G4eFhnD59GkNDQ22ye/L4SCSCK1euiMz2+fPnld3Tb33rW61Wq4WlpSW89NJLWFpaEj/T6XSYnJzEE088IaQEge262nsdr3KtPv/88y0AWFhYwAsvvIDFxUUMDw/jne98p2gzwZK2mzdv4qtf/Spu3brVdp3lV8PDw23vAwBf+cpXlM31i1/8YgvYrnI5e/YsVldXcezYMTzzzDO47777sLKygpdffrlLD3R8fBzvete7MDY2hmvXruFLX/oSrl+/jrGxMTz66KMYGxsDAHzkIx9RMtfPfOYzLQBCezSVSmFychKPP/44JiYmcO3aNTz33HO4ceMGTp48iQ9/+MM4fvw4rl+/jmeffRY3btxoG8/nkXXAf/AHf7DjPPc0oFqCScObBZ1rdTcCxG5rutfxGjQAdzGg8q78/Q4WbpPDzn/pRZK1U6/XhXDHTlx4jgEg3kc1rl27BgDC4yXVjHQ4h8MBp9PZpXBjNpvhcrlE/SoL56kdStbEiRMnlMzz5s2bACAky2w2m1DzplQgG/XJrTFMJpNgeZRKJaRSKZRKJRiNRoyMjCiX3QPurNV0Oo2BgYEugzgwMIB0Ot31ffY6XgU2NjYAbOtrjoyMwOFwwOVyiftF6rHFYsHW1paQ1LNaraJOuVqtYnl5GVtbW0ilUrBarX1pwUMqa6vVwsjICFwuF4LBIOLxOFqtFjKZDIxGYxcVVq/XY319HblcDrFYTPDNPR4PGo2GcoqsTCJha3KbzYZYLIZKpYJUKoVwOAyTySRaGDebTSQSCfh8Phw+fBgDAwMoFovY2NgQqlF3U+Pa04C+9NJLSj7cbvj3//7fK3uvv/7rvwYA0fOIHHe5DxKL1eUHXy68J3VL/v1+NGqjtiYNIlty+Hw+wZRiy2MZVNum/BrDEPJ1APjxH/9xJfP86le/CmA7dBAOh+Hz+WCz2eD1emG329sU/OXWGLxerVbFcZ5CKA899FBfhJ+5VgcGBjA1NdUmugFsG8rbt293UTPvdbzKtUrhG5/PhzNnzsDr9SKbzWJtbQ3JZBKVSgWZTAaVSgV+vx9Hjx6F3+9vu57NZvHSSy8hm83C7/fj0KFDoiuDSiwsLADYJn2cOXMGbrcb8XgcV69eRSKREAXynQI2mUwG586dQzabRSAQwMmTJxEIBJDJZLC8vCzeVxWommWz2TA9PQ2r1Yp0Oo0rV64gk8kgGAzi9OnTCAQCiEajIpQ0ODiI48eP48yZM+I7X1hYEOv8bt143zIeKL06UjDJJKIeIQUjrFar0CO0Wq1t12WDJhtf1bh+/TqA9pgmADGXzpgmIcdMAYj47W4x04Pi1q1bAIBwOIzBwUExP/aTkVuPyK0xKFBcKpXg9Xqh1+vh9XoFw6qT9aMCS0tLQteA7SYIisKwrQTR63hVID3SbrdjeHgY09PTWF9fRzQaRblcFiwf0hP9fj8OHz6MTCYDYJsltbW1hZWVFWxsbGB6ehonTpzoS/sReorsETU2NoZWq4VEIiFimlNTU10eaDabxcbGhoiZBgIBETNljFIlyuUygG0DOjAwAK/Xi0qlgng8juXlZZhMJoRCIczOzgoVpmvXrqHVauHRRx/F4cOHsbS0hGvXrmFzc1MYz046dSe0LLwGDRo07BOaAdWgQYOGfWLPI/zbvSe2hjcPdpL+u5dx+x2vQQNwFwMqx4W+38EmXNTxA7bFUBnP7EwWsa8QWx5TVYZxT74PH6CjR48qm+uxY8cA3HtWneg1a39QHD58GMB2/IsKUKzrtFqtbX2j8vk8XC4XdDodqtUqgsEg6vW6CMbbbDY0Gg1sbGwI1agHH3xQ2Vy5VlVl23cbrwLMllutVpF44/dqs9mg1+uh1+tRLpcRCASwtbWFVqvV1lXSZDJhYmICfr8fXq8X5XJZZPdVgrHNXrPqvWbtDwo5W86qj1KphMHBQdHeOBKJoFarIRaLIRwOCyX9ZDIpesYzLs1eT3eTiNzTgD7xxBNKPtwbgQ9/+MMAIBrF8V8W1bPHkdzGmIuWbTxqtZromcTfZyG9ylYUfK97zaoTvWbtD4of+7EfAwCh3p1MJsU8i8Vim94qkwxOp7NNV5V9hXi/z58/j0KhAAD4N//m3yibK9fqQbPtdxuvAqdPnwawnTk+d+4ckskkPB4PRkZG4PP52mQVt7a2MDc3h62trbbrLpcLTzzxBFwul9jUWEivEsyu95pV7zVrf1AwW14qlbC4uIhyuYyBgQHcf//98Hg8iMfjuHDhAuLxOMLhMO6//34MDg4iHo/je9/7Hs6dOye+85mZGVF+d7eeWG8ZD/T48eMA7o2JxD5CvTCRVOK+++4D0HtWvdes/UFBDzQSiYgMscyYkplIOp1OzK+TidRqtZBKpZBOp7G5udkXjc3JyUll2fbdxqsCs+WsOSQTKRQKiVpPMo5arRa2trYEEwnY1jD1+/0YHx8XTKSrV6/2RfyZnmKvWfVes/YHBbPlpVIJ6XQaqVQKFosFwWAQExMTqNVqiEajuHHjBgwGgyhfun79Ol5++WXcunULk5OTOHbsGIaGhoTxZHZ/N2hJJA0aNGjYJzQDqkGDBg37hMaF1/CWgMaF1/D/Am8ZJpLGhde48IDGhVcNjQuvceE1Lvw+oXHhNS68xoXXuPAaF36f0LjwGhde48JrXHgNGjRo6As0A6pBgwYN+4TGhdfwloDGhdfw/wJvGSaSxoXXuPCAxoVXDY0Lr3HhNS78PqFx4TUuvMaF17jwGhd+n9C48BoXXuPCa1x4DRo0aOgLdBpVTYMGDRr2B80D1aBBg4Z9QjOgGjRo0LBPaAZUgwYNGvaJPbPwzz//fF8DpD/2Yz+mrMju7NmzLWC7jKlaraLZbLaJXVSrVWSzWVSrVSHGUKlU2jLv8niWNTWbTQDAd77zHWVz/ad/+qcWsJ2FTSQSor5vbW0NuVyujWMuQ85uu1wujI6Owu12w2q1IhgMilq4xx57TMlcv/nNb7YAiCxwMplsm6fFYsHAwAAsFgsCgQCOHj2KQCDQphrE8dlsFslkUrwPAHzjG99Qdk+5Vjc2NnDhwoWujPTw8DBOnz7dxRe/1/Eq1+rf/M3ftABgbW0Nr7zyCjY2NhAMBkV22+l0IhQKweFwYGVlBS+//DJWV1fFdbvdjsHBQTF+fX0dr7zyCtbX1wEA//t//29lc/2zP/uzFrBdiXH58mXEYjFMTU3hySefxOTkJKLRKC5fvtxVWREOh3Hq1CkMDg7i9u3b+Md//EcsLS0hFArh/vvvF3oIP/3TP61krp/+9KdbAISoTS6Xw9DQEE6fPo1wOIzbt2/jxRdfxPLyMmZmZvDUU09henoaS0tLePHFF7G0tNQ2nlUHrFn+9Kc/veM89zSgqhVT+gkq3AB3ylNarZao6ZTrOim5RoUmh8PRVj/K36XxVI0rV64A2C65ko293W6H2WxGo9FAIBDoKqGiUIper4fRaBTG3mAwYGtrSwifPPbYY0rmSYEWbiScn9PpRL1eF/MwGAwwmUyiNIzEBZ1OJ8rJOM+xsbG+iIlwrZbLZfh8Ptjt9rafW61WUb8qo9fxKrC2tib+9sTEBEKhEMxms6ibrVarKBQKMBgMKJVKCAaDcLlcbUSPWq2GhYUFrKysoFKpwGazYXR0VPlct7a2AGw7JhMTEwiHw7Db7YhGo8IJMRgMQnKP0Ov1WF5eRiQSQbFYRCgUgtvthsViQbPZFO+rCvL35Pf7xQa+ubkpvkfW2drtdmxubiKdTqNcLsPv98Nut8NisSCfz2NtbU1IWnaui07saUBfeOEFBR9td/zCL/yCsvf6i7/4CwB3jAwfaofDAZPJBIvFIr5AekgsQne5XELqjuPl91GNv/qrvwKwzZ4IhUJCQWZ8fBxutxsOhwPBYLDryysWi4jFYigWi0KxJ5PJiOv0WD/60Y8qmedzzz0HAAgEApidnUUgEBCF0B6PR9TclctlxGIxXL16FfF4vK22lp/L4/EgGAzi1KlTXQ+bCnCtjoyM4MyZM13amOvr6zh37lwXW+dex6tcq6+88goAYGJiAo8++ijGxsbaJNbk+uCpqSm8+93vxsTERFt9cCQSwXe/+13EYjGMj4/jh37ohzA2NqZsjsTc3ByA7fv06KOPIhwOY35+Hl//+texsLCAoaEhPPjgg5iYmGj7vY2NDbz88suIRCI4dOgQnn76aRw6dAibm5s4f/68cpUrGmSPx4PDhw/D7XZjbW0Nr776KjY2NsQcpqenMTc3h+effx63bt1qu05PfmNjQ9TiBgKBPf/unga0H8yGfuHy5csAIFgwRqNRGCa73Q6HwwGdTodmsymMq81mg8PhEMclmXbIn5tMJuVzvXr1KoDtIuVmsymOwTabTVDzpqenu1gwqVQKBoMB6XS6jb2USqWwuLjYxaY5KG7cuAEAmJqawpEjR8T8jhw5Io45PC6VSiXkcjlx7JGPUZQUNBgMGB0d7XrYVIBr1eFwiPsno1AoIJlMdq3pXserAI1yKBTC2NgYTp06hZs3b+LatWuCAbO0tIREIgGXyyU2MG5OZNbdvn0b8/Pz0Ol0fRNUZrglHA5jbGwMR48eRTabRTQaxdWrV1Gv1/Hwww93bYrRaBSrq6uYm5uD2+1GOBzGiRMnYDAY8Morr9yV4dMr6Dx4PB54vV6EQiEkk0lEIhHcuHEDPp8PQ0NDOHXqFNLptAhJOBwO+P1+zM7Ool6vC3JDo9HA+Pj4wQSV+/GF9AtHjhwBsH10sFqtwkiS+sijusVigdFoRL1eR6VSgU6na6MmkoPeqQdK/roKkMbmdDoRCATEvCiY22g0YDQau445uVwOiUQChUIBlUpFUPv0ej3q9bpyz44snMHBQej1ejG/lZUVZLNZlEoloftZKBSE5+x0OmGxWIQeKI9TjUYD0WhU8M5DoZCyuXKtulwuYcBl5HI5eDyerjXd63gVCAaDALapudFoFDdv3sTGxgbq9bo4EXHjIVd/aWkJ2WwWuVxOHJtHRkag1+sRDoeF9qVqkP2k1+uxubkJo9GIZDIJn8+HmZkZhMNhNBoNoVVKNBoNhMNh1Ot1+Hw+JJNJLCwsIBqNQq/Xi/dVBZnGnM1mhZaA3+/H5OQk3G43EokEbt68iWQyKRwBv9+PTCaDpaUlbG1tiXwC51epVPb8u3sa0He+850KPtobg/e+970A7qjnkI7H/wAIkRCdTicSSNlsFolEomu8/D6AWgP61FNPifem6r1er0cmk0E2m4XBYBCehQy2KWGc1uPxwOVyodls4vDhw8rbTzz++OMAIGKanN/m5ib0er2IMfPfYDAIn8/Xdl2v18NkMkGv16NWq+Hq1atiU3r44YeVzZVr1Wg0Ym1trSupUavVMDIy0mW0ex2vAlxLJpMJV65cwbVr1wR1mN9pOBxGs9mEyWTC4uIi1tbW0Gw2RZsZq9WKBx98EI1GQ8SfGbN+//vfr2yuDAsYjUZcvXoV169fR61Ww8zMDCYmJmA0GlGr1bCystL2e41GAydPnsSxY8dgNBoxPz+P5eVl1Ot1mM1m5eEG2SCvrq6KDenw4cOYnp6GyWTC9evXMT8/j2q1iiNHjmBqagomkwnLy8vY3NxEvV4X1Giu786NoRNvGQ/00KFDACCSP0wA0eBw8XEBMjHC4xAfeP5cTiapBo+L9IKZTGKypbM3E0GVfXrXVNGnt0wVKlXgImfLjkql0lapoNfrRVLLarXC7Xa3xZ+Z7GBipFarIR6PK1eNAu6sVVmURYYsviKj1/EqwLhasVhENBpFqVQSpwkmk3iKKpVKiMfjKBaLbYpiFosFfr8fFotFdABQrfIOQPSvKpfLQg+B1QBOp1PEwTuTbVarVXD78/m8iO0yrKa6LxaVyxqNhhAJslqtbfeICS1ZU6JQKCAajaJQKIgQntVqFcf5A3mgqt3sfoKLUvbSaJhoJEulEnQ6nTCesjITM/QUEpGNqWrwqC2rLrVaLeTz+S5RExlyixI2xJObuqlWY6LCDeX1qGjFBJEcJ6YxldWY5CZprVYL1WoV+XxeeesR4M5abTabItQgQ6/XCyMlo9fxKkDRF96PVCoFl8slpA25GVGNiUae7WgAiDFUY6IRUA1uIFyrmUwGBoNBlNRlMhmxHmRwrXo8HtTrdRQKBWxtbYkYpeqNibkKVn1wfdrtdiG5x7JBvV4Ph8OBQCAgZAKTySQGBgZECKpUKqFYLHY5MZ3Y04D2I6vXL1Cvk3Wg9OLy+byQrGPGGIAwVvJ1WW9TNr6qwXhtLpcTC5/ag+l0Wmgu7qTGFA6HRUKMu7nT6cTg4CBcLpfSeTJWG41G29SYlpaWkE6nhZdGDUsm5JhsslgsSKfTwoBmMhlEIhHEYjGl8wTurNVmsynitDIYd+tc072OVwGGBdhDijWI4XBYGEbW+LLkZ3FxUXhtbrcbXq8XY2NjCIVCopdPP1SumMhk6GZtbU3oaB45cgSrq6s7JjAZhhgbG0Oj0cDW1hZu3rwp1JhUywTSILOnVDqdhtVqRSAQwPj4uNABvXnzppj/0aNHodPp8N3vfheLi4uYmJjAfffdh1AodM9qTHsa0H60n+0XGJiX2xczScR/5aOn7IFyt5EFa2X9UNWgZ2cwGJDL5VCv12EwGITRpyFlES/RaDTgdrtFEoxekt1ux8DAgHJviYs8n8+LRFWlUkE6nUYikYDT6YTRaBRenNlshsPhEJltdt/kcZTvpbpaALizVpmMY0M2olwui1I2Gb2OVwHeF4PBgHw+L+4lK0T4dwcGBmC1WsUmr9PpUC6XYbfbodfr28SK6eWpBk81er0e+XxeaMJy82TYoPOo22w24XK5xAZLL9rr9UKn0yk/LcnlhpVKRXSHpZNhsVhQKBSQSCRQLBZht9sRDAaxtrYm7m8wGBSljAxJHMgDZV/wfkGlIvn58+cBQBhG/ssYI2Nx7AtvNBqF6K/ZbBYF7fJxnoX1qsGif7lNLb/UQCAAl8sFt9vdtSjlOJnD4RDxsVwuh2w2KxalKq/p9ddfB7DtfTQaDbHojh8/jmKxCJPJJIyorOxuMpkQiUREYThrVA0GAyYnJ/tSB8q1KvdRlyEru8u41/Eq1yq93VKphKmpKbhcLgwMDMBkMonKhmazCavV2qaeLneQrdVquHnzJmKxGBKJBOx2e1+8ZWb2G42G8ByHhoawsbGBZrMpSus66yWNRqMQqt7c3MTw8LDoztpoNJRXDMisPWrUOp1O0eM9kUhgbGwMZrMZw8PDWF9fR7PZRCQSQTAYxMmTJ+Hz+ZDP57GysoJisQidTnewQnr2Be8XVCqS/9Ef/RGAOxljxgiZXJFV0o1Go4jVdV7neLJs+tEX/gtf+AKAOwbRarUK42Sz2WCz2UTpjwwaXLYrYHKBxxYaXFVZ2L/+678GAHGUDQaDcDgcGBwchN1uFzG8Wq2GdDotCvt5vVqtilItp9MJt9uNxx57rC9eHdeq3EddhqzsLuNex6tcqy+//DKA7VPTu9/9bgQCAaTTaSwuLiIejwsjWi6X29TTi8Ui0um0qBX92te+hnQ6LWids7OzyuZIsBbY5/Ph3e9+N7xebxv91efz4dChQ11/O5VK4cUXX0QqlWqjxVI9n++rCjTIdrsdR48ehcPhwNbWFs6fP4+trS0MDw/jkUceQTgcxvr6Ol599VWsr6+LuT355JMizHDt2jURI+XJdjfsaUDZF/zNAHp1nZlKcsUZ9Lbb7cJgspBepnLRcPH3+1FIf+nSJQB3DJPb7Ra7JmvQRkdHu47kmUwGq6uryGazwngmEom26yrBspjR0VEMDQ0JBfrZ2VkEg0Hk83nEYjERw+U85OvkeNP7GB8fx8jIiNJ5Au1rlX3UZcjK7p3odfxBsbq6CmA7TjgxMYHZ2VksLS1hbW1NtEBhXFFWTydhIplMIh6PY2FhAcvLyzh27BgefPDBvnigiUQCwHaIZGJiAtPT02g2m9jc3MSlS5cwMzODo0ePdhmabDaL5eVlLC4uQq/XY2hoCA888AAWFhYwNzcn3lcVeOTmKS4QCKBUKmFzcxPz8/OwWCwYHR3FqVOn0Gw2sb6+jgsXLqDVauGpp57C8ePHcevWLVy4cAGrq6sIBoNt+hK74S2Xhae3aTQaxVGX9E2z2Sy8SjlLz0wxs+FyaRA9UJX1gPR2nE4n7Ha7MPjMIBqNRqTT6a74Sz6fFx4ni+1ZcuH1epUbe7ZdcDqd0Ov1Yn6MYZZKJVFQX61WRRbeYDCIhnKM4xmNRlFp0I9yG65Vq9W6Y1adMc3ONd3reBVgFp4x8Hg8jmw2i2azKb5Tt9stGEbFYhGpVArZbFZ893q9Xmy81CboR3UDkzN6vR65XE5UBdAhcblcIpMto9lswul0CvEbllox1qw6Cy+X8DF5XK/XYbfbRdijUCgIx4MepsPhEMlROSzF09/dkshvmSw8+wzJXTnlusnOrpy1Wg0AREz0bl05T5w4oWyuzMLT4JApxaM4j+g7deXk0bhcLgtOP4/9qusrp6amANzpyknjubS01FYrV6vVUCgU2spzvF5vlxElE4kP+pkzZ5TNlWvV4/HsWPyczWZ3NIa9jlcBbsYWiwWRSEQ03KvX622lSuVyGV6vVxzv5SSn0WjE6OgoBgYG4PV6UalU+pKFl5lIrKNMJBLw+Xw4cuSIKBHqvIetVgtDQ0PihMfjMbtyqr63skFmVQ27mvLvxWIxNBoNJBIJ4THL4RNWlrB+daeNoRNvmSw8vTqyiPR6fZsRpBEl84fF9CyWr1arwkgAEOygfrS1ZRa+08DXajVRp1qv17sK4zuTYtwU6HGrrhjgPFl3yvml02mYTCYxD3ryjCdbrVZYrVbBpOn0QO9WnLwfdGbhO8MZpL7uloW/1/EqwMQEs/Csvmi1WuI7d7vd4l4yg81xrCRhrajdbhebmGrQMOl0urZaYIfDgVarBZvNtqOhabVaIsFID5QZfHrWKtHpgbL2mxULzMIDaPOgbTabqAOlkhhDfACEo7Xr393rh/2IVfULcgxLZhDJjCKyjeQied7sTgm7frGQgDusKZmaRyMkl090VgAwsQXcMb52u11sFKoTXhT94IPL+SUSCTSbTbEx8e87HA54PJ6265TqY1UDvQDV4FolPbczWURdhM5kUa/jVWBwcBDA9sMZiUREGRvVwZhtJ/01lUohHo+3JTaNRiNGRkba2F79MKD0FOW5ms1m+Hw+hMPhthprGWazGeFwGEajEdVqVQh7cEPtFxe+2WyKqhGTyQS/3w+j0Si0AjY2NmA2m+H3+zE0NIRqtSrK8mjs3W63YC3e7VS3pwF96KGH1H3CPuNHf/RHAUB8aP4rH3np2jOLWSqVdi2kl709APjv//2/K5srufCUJ5OVf1KpVFe7Y8LtdgsKnc/nw/T0NLxeryiwV93WmFx4iuYmk0mRRU2n0227uCxG29nWmG2QI5EIrl692pdCeq7V5eVlvPTSS12F8RMTE3jiiScwPj7edr3X8SpALvzCwgK++93v4vbt2xgZGcGDDz4Iv98Pt9uNsbExuFwu3Lx5E1/72tewsLDQVmDP8cPDw5ifn8c3v/lN3L59W/lcGRpZXl7GlStXsLq6iuPHj+ODH/wgZmdnsby8jLNnzwqNU2J8fBwnT57E2NgYrl27hmeffRbXr1/HxMQEHnnkkb5x4VOpFFZXV5FOpzExMYFTp05hbGwMN27cwHPPPYe5uTmcOHECH/rQh0Rb4//7f/8v5ubmMDExgcceewzj4+MiYfe248LL9Z6yoWR/eB7daSAZoC8UCm1lIrVaTfyrGowtplIpITRMhaVsNotUKoW1tbWuXZ2JomazKZJjMitFNbuDHigLvDm/tbU1RCIRuN1uVKtVuN1ueDwekQHlA+5yubC5uSkC981mE7FYDMvLy0rnCdxZq1tbW0JNXAYTHp1rutfxKsCE58rKCmKxGObn50WSjmpMoVAIwWAQsVgM6XQay8vLCAQCoijcYDBgeHgYhw4dErRf1Zlt4E5oxGAwIBaLYWlpCcPDw/B6vZiamkK5XBZen4xms4lQKISpqSlsbm4KBhtJFapDI3LJH1XLwuEwfD4fJiYmsL6+jq2tLczPz2NkZAR+vx+HDh1CLBZDJpPB8vKy0AUOBAIiHHYgLny/FelJv1SBixcvArij8i4Xz5OdxAA8k0aMjwDoEsqQefGqQUX6YrEojAvjMixnMpvNXQINrBW12+0irsTWH9VqVcTWHnnkESXzZBnT1taWKKSndiJphz6fTxhyysJR2MJqtSKTyWBra0uIYYyNjQkmjkpwraZSKfj9/i59T6/XK7xhGfc6XuVapXRepVLB+Pg4dDodwuGwIB4kk0ksLS0hHo8jkUiIOk+n0wmv1ytinvPz88jlclhZWYHVau1LyI1GmfqYFosFoVAIkUgEV65cERJ3nYX0BoMBy8vLIrnFetahoSHUarW+lTEB27F7EmXYqiWZTGJkZAQPPPAAwuEwNjc3cfHiRWxsbMDv9+PYsWMIh8MoFApYX19HJpO5p0L6PfvC/8Iv/EJfeyL9/u//vrIMzc/93M+JuTL5o9fr2+TiGD+ixJqcXOJ1jgfa6WE/+7M/q3yuLLViZYCcENpJDV826ow9ybEaGvs/+qM/UjLXj33sYy3gTjyQrC2bzSbKrqhkJQugyP2kGFfi77LqAAA++tGPKrunXKsyW0eGLIIi417Hq1yr//W//tcW0K74RDqpTENmEoR1yrze2eOLGxlrFv/Lf/kvyub6S7/0Sy0Abf2vCoWCqPO1Wq3iugxSfqneRPJFJ+njd37nd5TM9ROf+IR4prg+S6USMpmMSHrR+ZAVmNhfinNLJpOoVqviffgMfuITn+i9J9KbUZGexpGSajJdUxZXZn8fs9ksZNjk8bJUm2p873vfA9DdJM7n8+3YJI7obEKXTCb3bEJ3UJAtwkJzKtuMjo7C5XKJh6RSqSCRSAjvU35IGLfj8Wh0dFRk91WCa3V4eBjT09M7No9bXFzcsXlcL+NVgB7o6OgoxsbGMDw8jHg8jmvXrolwEh/wsbExzM7OYmxsTMjCFQoFFAoF3L59G4lEAiMjI+I/1WByjcIgbBJ39epV0STO5/N1JdsikQhWV1dFE7oTJ06IJnTJZLJvPZHcbjd8Pp8IH83NzSESiWBqagqnTp3CxMQEFhYWcPnyZSEgMjs7i8nJSWxubmJ9fV2Ep2w22109UK2tsQYNGjTsE3se4TVo0KBBw+7QPFANGjRo2Cc0A6pBgwYN+4RmQDVo0KBhn9AMqAYNGjTsE3uWMX3xi1/sa4bpIx/5iLJ6tS9/+cstoF2Rnhxu1iWWSqW2RnK1Wk3UU7J4nswK+X0A4O/+7u+UzfW5555rAWir/ZN7rPP6TjWLLpcLFotF9B2y2WyCvcJavA984ANK5vq3f/u3LWCb2UFqKWXJisUizGazKPtyuVyCZshyMJIBWGIlvw8A/M3f/I2ye8q1mkqlBHVUhtfrxczMjJDoI+51vMq1+md/9mct4I5oczKZbNOGlWsr4/E4bty4gUQiITjk/JfjE4kEbt26JUqD/vRP/1TZXD/72c+2gG2FIyrMyyLPvN5JeRwYGMDk5CQGBgYQjUZx5coVRKNRDAwMYHp6WlAvP/axjymZ6+/93u+1ALQ9R6Q7DwwMIBaL4fXXX0csFhPapOFwGNFoFK+//jri8Ti8Xq+gR8viJwDwu7/7u73XgfaDctcvkDUDoE0ERBbkkIVCqMxktVoFM0YWE+kn5ubm2v4ehUsoJtFqtXYVsZB725fLZdHvib3tVYIsHG4onJ/cvE4mLdDAytdlEReDwYChoaG+iIlwrbZaLdFbXYZerxd97WX0Ol4FIpEIgO37OjIygnA4LIge/E6z2aygd7I+WFYIq9VqWF5eFr20LBYLwuGw8rmSTizP1Wg0IpFIIJVKodFowGAwdNGI9Xo9NjY2EI1GUa/XEQgE4PV6xXxV98WSnQ32B9Pr9YjH44JJFwqFEAgEYDAYEI/HhcIVe8GzjTSVsYC765buaUDPnj2r4KO9MXj22WcBbBsYuTe5w+EQrT0o/yXv5DQIZAFxvPw+qvGVr3wFAIT2IDUzx8fH4Xa721gTMthfqFgsik6SmUymre8QAPzyL/+yknm+8MILACBU6AOBADweDyYmJuDxeETzu3K5jFgshqtXryIej7exePi5PB4PgsEgZmdn+6JwxLU6MjKCM2fOdHHY19fXce7cuS7Oe6/jVYCkj4mJCTz66KMYGxvD5uYmrl69KvRS6alPTU3h3e9+NyYmJoT4TD6fF1TKWCyG8fFx/NAP/VBf9HspUDIyMoIf+IEfQDgcxvz8PL7+9a9jYWEBQ0NDePDBB7uM98bGBv75n/8ZkUgEhw4dwtNPP41Dhw5hc3MT58+fF5uIKvAEIa/PtbU1vPrqq9jY2MChQ4fw1FNPYWZmBnNzc3j++edx69YtMbfp6em2Vh/08O+mL7GnAWXrgTcD6NXJVC6LxSKocg6HAwaDQXifpE6Sf07tRdL65PdRDTZAGxgYELqO1NAcGBhoO/7IYNM2snyoJEWxCdW7Otk9jUYDR44cEfObnJzE4OAg8vk8NjY2kM/nBTsmFoshm82KBz0UComNS6/XY3BwUIiUqITcJoNqRjLYeK9zTfc6XgWoRhUOhxEOh3H06FEYjUZcv35dsLjW1tZEr3IeLRk6IX13dXUVS0tLsFgssFgsQiZPJbimONcjR44gmUwikUiIdazX67vWajQaRSQSwc2bN+H1ehEMBnHkyBFx2uqXB+rxeER/962tLSQSCSwuLiIYDGJwcBBHjx4V1+fm5kT30+npaaHUxu9nfHz8YB4oZbfeDKCAhsxtl1XoZe/SZDIJqTvqXNLrpNEkJZRUTkrQqcDDDz8MAMIgWa1WOJ1O5PN5YSAzmUwXv5gGky0LnE4ndDqdMLp3U8/uFadPnwawvSgp/sujjcPhEPOoVqtIpVKiZW21WsXo6Ciq1SocDofoZV+v17G4uChidSo9Jq5VtvntJIjEYjEEAoGuNd3reBWgGpfdbsf8/Lyg5dZqNdEShcdJuQMmKbvlchlmsxnHjx/H8PAwQqGQoHYCwGOPPaZsrvQsjUYj5ufnkUwmsb6+jrGxMej1eqFc1KmGX6/XcejQIXi9XoyOjmJ1dVX0hzcajcrDDbKUI734XC6H8fFxIcKztLSEarWK1dVVMf+RkRFEIhFcuHAB8XgcLpcLU1NTsNvtQgB8L+xpQJ955hk1n+4NwMc//nEAaOttREk7im9Q0k7uJlmtVkUPaVmgg0LAjImqNKA///M/DwBtR2DynPP5/K7CF3J7DKfTKbRBdxPEOCh+6qd+CgCEh8v5/cM//AMKhQJMJpPwLuklMflB3QEeN/P5PDKZDL7xjW+IhIOq7qHAnbUaj8dx9erVLrWfQCCAkydPdqkG9TpeBZ588kkA2w/617/+dUSjUfh8PszMzCAUCrWpcskdMO12O3w+HxwOB3w+Hz74wQ/C6/UiEong8uXLuHr1KgDg3/27f6dsrvfffz+AbVWmr3/966I98JkzZzA6Oop4PI65uTmhMEYEAgE8/fTTCAaDWF1dxblz57C2tibCQXxfVWCblEKhgKtXr4qGhu9617sQCASwtraGl156SRh/hjzW1tbwyiuv4O///u8RCARw4sQJ3H///UKP4G5tUvY0oOwz9GYA++vIRlM2RHJDKRpPJj0YV6QaC5Vw+D6qQfFfOYPJ3S4aje56JB8YGMDU1JRoOEaVm92O/AfFAw88AGA7QbO2tibmx2ym0+nE8PBwmyc8OTkJl8uFoaEhOJ1ORKNRsQltbW3h9u3bXeLFKsC12mq1kEgkcP369bafHzt2DIFAoGtN9zpeBSYnJwFs911aWFjA1atXMTMzg4mJCdGI7ciRI/D5fG0dMHm91WohHA5jdnYWU1NTuHLlCs6ePYulpSXlc2VYgNUKN2/ehF6vx+joKB566CHMzc3he9/7Xpeh8Xq9OHToEI4cOYJGo4G1tTWcP38eR44cwYkTJ5SHG+iBMowUj8dhs9kwOjqK2dlZVCoVLC8v47XXXoNerxebwKuvvoqvfOUruHTpEo4dO4YzZ85gcnISsVhMbPx7YU8D2o+FLkNlozY+AJRWoycq64HyyM5+QzabDTqdDoFAQMiEDQwMtP1+Pwwo47WFQgGJREIYb3qYjBd2tmhgj3WbzSZ65aTTaeFxM+n0gz/4g0rmySx8IpFAo9EQ85uenhaxZeqBMgQRjUaRyWSQz+eFHihFqg0Gg9C9VA2u1UwmIxIAMtg8rnNN3+t4lWuVxqZSqWBoaAj1el1ktynBtrq6ilQqhVQqJbxTl8slmggyC18ul7G5uQmr1aq0cyzBTbzRaAjFqkAgIDzPjY2NHbPwBoMBm5uboj10IBDAkSNHMDIygnq9rjwGKiuRMbdgs9kQj8dhMpmQyWQwODgoWnLH43Fcv34dsVgMAwMDmJmZEa2QuYZ1Ot1d2xrvKSbyK7/yK32tA/3kJz+pXLeQpTxySQ9LP/b6Tx630/v84i/+orK5/vIv/7KY607apcCdciUZLAkCIOpcWQbFfwHgt3/7t5XMld9/p5aq3JiPJU5U+pf/v9VqdWmyMr73L/dB2T3lXKml2ilDKAtty7jX8SrXKrUr5S6wsoYqw0+dY+SSMG7w1FyVP8Nu2pX7wa/+6q+KufJvyHqlrHbZSbtWbpRnsVhE40NqyALAb/7mbyqZ66/92q+JZ4qJX/ke8T6aTKa2UB3zJPJ30Gg0urry/n//3//Xex1oZ5+T72dQu7LzYefNYTMrJpHYJ16+Li9W+X1Ugx7ovRbGE70W3h8UzMLzSG6329sEfmUPn60+2FOqWCwKlXx6zfLRXjW4Vg9aMH+38SpAD9Tv92NiYgJ+v194uzyNMFnImGEwGBQZev58bW0N2WwWgUAAhw8f7kt5GOPVAwMDCIfDdy2MJ9LpNCKRyD0X3h8UXPs2m0146clkEhsbG0in0xgcHMTJkycxODgoQiKRSAShUAgnT55EMBgUfZBSqZSIN98tr6BROTVo0KBhn9AMqAYNGjTsE5oB1aBBg4Z9Ys8YaD96YvcLuxU8y4khxjN1Op0QDmGJkzyekJM4KmsWZ2dnxeteuO374c4fBOxUyZiwzNMmz50lSs1mEy6XCw6Ho0tTgMH4RqOBzc3NvsSVuVZVcd53G68CLCKX+eKNRgONRqONXswEUSqVQjabbfvuzWYzxsfH21pOq6ZHAhDZ9V657b1y5w8KOVaZTqeRyWTQbDYRDAZFl85oNCoqSnjdYDC03V/mIPjs3S2vsKcBfde73qXgo70x+OAHPwigu60xi+TZiI1KTAzGd7Y75vjOLKwqfjkAvO997wNw79x2olfu/EHx9NNPA4Cok9za2kImk8HS0hKy2WxbYX8wGBTBeDKsbDabqGnNZrOIxWK4ceMGkskkAOBXfuVXlM2Va1UV53238Spw6tQpANv1tS+//DJWV1cRDodx8uRJQY4Ih8NwuVy4ffs2XnzxRSwvL8PpdIoknDxefh/VYM1qr9z2XrnzBwWTgOzxnslkMDo6ine+850YHh7G/Pw8XnjhBSwsLODIkSN43/veh8OHD2N+fh7/8A//gMXFRQwPD+Phhx/GyMiIKCW7W7nVnga0H+IE/QL7du9VSN9sNtu4xOVyuU2e7Y0qpD9y5AiA3rntvXLnDwrZA71586aY3/LyclchvcPhgMPhwODgYFchfSaTEbWqsVisL/XFXKuqOO+7jVcBFpFHIhFEIhHMzc2hXq/j2LFjbVJ1Pp8P6XRaZIf9fj8cDofQchgbG8PU1JRYO+RwqwTXVK/c9l658wcFPVDWHcfjcfj9fgQCAUxPTyMejyMWi2Fubk5cP3r0qBi/uLgIq9UKm80mvp+VlZWDeaCyRFw/oLI4mWo87FVOPc9SqdTljZL77nQ6YbFYYDabUavVhFHdicqpEufOnQPQO7f9Xrnz733ve5XM88KFCwC2F2Wj0RDzA7ZJACygN5vN8Hq9SKVS4ni5vr4uqJxsxWs0GkXBsmpwrarivHeOV7lWyVkvFos4dOiQaMVrNBqRz+dFnaTNZsPm5iaGh4dFYThL3arVKq5du4bNzU1Eo1E4nU7BsVcJllz1ym3vlTt/UMiMocHBQTidTrhcLlEaFovFMDk5CbPZjLGxMaysrKDZbGJ9fR3hcBinT59GMBhELpfD7du3USgUBNtvL+xpQL/0pS+p+XS74Md//MeVvdenPvUpAHf6wstiIqz9dDgcovbT5XKJfvGyyAjFR3Q6Xd/6wn/mM58B0Du3/V6586oM6Be+8AUA217IxMSEmN/TTz8Nh8OBarUq6lLpJXFDyGazQhwjHA7D6XTC4/Hgh3/4h7tqBlWAa1UV571zvMq1+o//+I8AtvnbTz/9NMLhMJLJJObn58Vmwxrf4eFhnD59GkNDQ22npWQyiWeffRapVArhcBinTp1SauQJctx75bb3yp0/KGiQHQ4HTp48CYfDgXg8ju985ztIJBIYHR3FE088gZGREaysrIiQx+joKB5++GH8yI/8iPjOr1y5AofDgVAodFd2154GtJMf/P0MenV7ydkxTuh0OoUHarfbMTg4+IbK2Z0/fx5A79z2XrnzB8WlS5cAbOtWjo6OCiPPgmRZzo7HOMZHZTk7eq1+vx+Tk5N9kbPjWlXFed9tvAqQs+52u3Ho0CGcOHECCwsLWF5eRj6fx9bWFm7evIlkMgm9Xi8U1OXrkUgE169fx9LSEu6//3784A/+oIhXqgQNU6/c9l658wcFPVCGkYLBIEqlEtbW1nDjxg1YLBZMTEzgwQcfRLPZFJvAQw89hPe973144IEHcO3aNbzyyitYWlrC4OCg2Pj3wlsmBsrMtkxrk1tOWCwWOBwOYRx5vG82m9Dr9YLmlU6n236fFDUKgKgAY6D3ym0neuXOHxQzMzMAtr0PvV6PUqkkPM2trS3h+ZIJxV3b4/HA6XQKQWUmlHh0Y1xZ5friex2U83638SpAr8ZisWBzcxMGg0HcFzJpxsbG4PV64fV6kUwmsbCwgFwuh0wmg1KpBJPJhImJCVitVgwNDaFcLis3SsCdGGiv3PZeufMHhcxZT6fTQv4vEAhgZmYGHo8HsVhM8N8p7h0KhYSxpwAJ13Cr1epK5HZiTy78Jz/5yb5y4X/lV35FGWf3d3/3d1vAnXYe8r9yK4+9/pPjnZ3v8zu/8zvK5vo7v/M7Yq73wm0n7pU7/0u/9EtK5vrbv/3bLQCixIY8d75m+RVpsyaTqe3/dTpd2/jOPlMq+eVcqwflvO82XuVa/a3f+i3Rv4s9uLhh877x+5T7enFevMekH1OKkWN+67d+S/lc75XbTtwrd14Vb/83fuM3xDNVr9dFCxn+LZYtyvx38uJ5f+XvAIB4HwD49V//9d658G9GD7RfTeVUgh5ov5rKqQKz8GwGVywWD9xU7l4kwvYDrtV+NZVTCSZctra2sLS0pLypnEowXt0rt71X7vxBwXwB1azYVG54eFg0lVtZWem5qdzdsvAaE0mDBg0a9ok9j/AaNGjQoGF3aB6oBg0aNOwTmgHVoEGDhn1CM6AaNGjQsE9oBlSDBg0a9ok9y5g+85nP9DXD9J/+039SVq/2J3/yJ6IOjGVIAEQpEsuSWNtFnju58+w1w5/L0mEA8PnPf17ZXD//+c+3ODeWWcmlVSy/6hQyYf2d3KKExf6sywOA//gf/6OSuX7uc59rAUCtVkMul0O1WhXtOmq1WlvdnNVqhdvtFvORaxTZ3kN+n395f2X3lGu1VCrtWH5is9l2bNFwr+NVrtVPf/rTLQCiJKxUKsFiscDj8bS1mWFveHaTZf0i14HH44HFYmkrLfuX91c219/7vd9rAWijC8u0Y5leLENm9cm0Y5m+DAD/7b/9NyVzletVuT6tViv8fr+4R5FIBMVisU3Viu2LC4UCbDabmHO9XhfCQ//y/r3XgfajH0y/0KsWIou9uRjfSOzGGKHKDoB76hvUaDQEU6IftZWddYWc326dCiuVCiqVyq7vp9Pp4Ha7lc6RkNeqzWbbcY6lUmlHZkmv4w+KXC4nXns8nraaSJIWZIPEXlQyms1m22c2Go19ubfy55fnWigUBPNtt+6VFLkBINS6ANwTw6dXyIX88veZz+fFs+F2u8U9kq/L41kbTtyNyr3nT9lU7M2Ay5cvi9cUEyEbgg/+Tk3lZM67PJ7GtVPUWAVef/11AIDZbBZem1wYbzab92wqV61W2wrvq9Wq0DpVCTbqk3dseZ6yN5rL5UTvePm61Wptayp3L/zi/YBrlcXQnVRBWexERq/jVWB9fR3AtjbA4cOH4fV6haQeCRSUOKTsGltvy2ItHO/z+XD48GH4fD7lc+UmSkEZFsZfvXpVtASenJzcsakc9Rnkhm7US1DdVI7eN08ONpsNqVQKt2/fFnM4fvw4gsEgotEoLl26hFgs1nZdHi+/z154y3ig9OpkihsZMVRdkmmPNKpUY+LRieM7aV0qEY/HAWx7FpQpk707Hj06v7xisSgUyLlT0ktKJpPKd3UqEbVaLaEszq6cLper7YGuVCpCnUk2ABR85k5O6TbV4Frl/etkEJVKJXEMldHreBWgB+rxeOB2uxEKhYTiO5lx6XRaHCsdDgcCgYBQ3qKXmk6nkUgkxNrph3o+1xS9z2AwiHw+j0KhgHg8Lp6PzrVK7zMejwu92GAwKEJjqtcqvUZ6ky6XS3iZiUQCLpcLLpcLoVBIzD8ajQoN0EAgIJ6pXC4nHKcDeaD9UHfpFyjlRZ4wANGDvJOrbTQaRQy0Wq2iUql09TyXeecA8MgjjyibK5V/aMDpFctc3XQ6DZPJ1PZ71DIlHVXm8w4MDCgXfz58+DCA7XgWW3owbGA2m9v6aFcqFbhcrq7r3JSMRiOazSY2NjaEYX7Pe96jbK5cq1TB7wwllEolQY+U0et4FaDIhsViwdramojB1ut18Z1arVYhB8iThqxXSzGRcDgMu92OUqmEzc1N5XPlZqfX67G2toatrS3kcjkEg0FhrJrNpugyQDSbTYyOjorNNh6Pi83eYDAo30Tl2HYqlUI+n0epVEIoFBLGMxKJIJfLifnb7XY4HA6kUilxqrPZbBgaGhLP3oEElR9//HEFH+2NwYc+9CEAaHt4+bDT4PB4SU+pWq22XZdV6OXkEgD8zM/8jLK5sv0I1Y3K5XIbT5zK+DslNhjklo/DVqv1nnpY9wrqivLYlUwm2yTsLBaLCEH4fD4huMvQhMViETz6fD6PVCqF1157TRyLf+7nfk7ZXLlWY7EYrly5Irx8YnBwEPfffz+CwWDb9V7Hq8Dp06cBAJubm3j11VcRiUTEcd7v98Nut4uwx8bGBs6fP4/NzU1xnaeAU6dOwefzYXNzExcvXsTc3JzyuVIPIR6P49VXX0UikcD4+Dje9a53CX3Pa9eudbVECQaDeOc734lAIICVlRV85zvfEfqhx44dU94qhT3B8vk8bt++LaQUT5w4gUAggLW1NZw9exZra2uYnJzEY489homJCaysrOC73/0u1tbWMDg4KKT58vk8IpFI18bQiT0NaD90G/sFKopTXYUZbh4li8UidDqdaO2xW0sP9keSd3vVoPAJ+65QfJhHN/m6DFlAgsmvgYEBeDwejI6OKhdooAe6trYm2hswNphIJOB0OhEMBtv0VcPhsJC1o6gtqwvogXY+bCrAtcrvfHl5ue3nZrMZHo+na033Ol4FKCaSTCaxsbGBGzduYHJyEtPT0yK7Pj4+LroSbG1tYX5+Hl6vty0+PzY2Jub33e9+t69N5ba2trCxsYHFxUVhyGdnZ2EymXD16tWuWDGFPKanp4WgzI0bNzAzM4OTJ08ql7PjSSGfz4vQhsvlQiAQwOHDh0UlwLVr14Rm6LFjx4QY+Pz8PHQ6Hex2O8LhMOLxODY3N7+/W3o8+OCDyt6LLT1k+TR6nvQmZW/UbDYL1XmWLcjj5fdRjVdeeQUA2jzhYrEIh8Mh+sV4vd62bCCwnRyjx2e320WrgnQ6jWQyCbPZDECditbFixcBbC/KRqMh5mcwGFAul9tixk6nE6lUShwvV1dXYTKZ2pJdBoMBMzMzd1X53g+4VlOpFILBYFf4w+v1Ih6Pd93Tex2vcq12tvTw+XxCxapYLIpTlMViQSKRwPDwMCwWi1BhslgsqFQquHHjBtbX15FMJuFwOPrS0oN9lhqNBg4dOoRgMIhgMIi1tTWx+RgMhi5BZbb0YC+i0dFRsTk0Gg3l/ZuYRAIg+nK5XC6R2GRLD27uq6urqFQqiMViCIVCeMc73gGv1ytaepRKJeh0OlE5sBv2NKDPPfecmk+3C37yJ39S2Xt9+tOfBtCdRLLZbCKJxDYesiwcr8v1d3ItYz+SSH/4h38IAG0ZbafTidHRUbhcrrbrMmRjJGe95esA8MwzzyiZ55//+Z8DgDieh0IhuN1ujIyMiCQSPXw2DaPQMj15ytw5nU74fD685z3v6YtEHNcq+9t0GulIJIILFy50lZDd63iVa/XFF18EsN258umnn8bQ0JBQv2etYiwWQ6FQwNjYGB555BGMjo6iUCiI6/F4HM899xy2trYwMjKChx56SHT7VAlWjIRCITz11FMYHBzE0tISXnrpJSwvL4sM+8mTJ9t+LxqN4oUXXhCG64knnsDExIQImahuLEjv2+124/jx4yLmefbsWUSjUUxOTuLxxx/H+Pg4FhcX8c1vfhO3b9/GxMQEnnjiCYyPjyMSieDixYu4ePEiXC4XhoeHD9bSg2UsbwawpYectGDRLoPFPFYyw87aNF5njJFGl/+qxmuvvQagvYTGYDCIo8W9lNawYDgWi/Wt5IalYVNTU5iamhLzO3nyJMLhMLLZLNbX15HL5YQqOVsY8/rQ0JCoZgiFQpiamurLsZhr1WQyieOljFqtJrQ1ZfQ6XgUYLvD5fJiensapU6dw8+ZNzM/Pi+PuzZs3kUgkYDabRc+jeDwuYvIbGxuYm5vD/Pw8HnjgATz++ON9ua/0FKnsfvToUVSrVayvr+O1117D7OwsTp8+3eWBJhIJLCwsYG5uDmazGSMjI3jwwQdx/fp1XLhwoW8eqNvtRjAYRCgUEk4Gj+3j4+M4c+YMKpWKaOmh1+sxODiIU6dOwWAw4Nvf/jaWl5cRCoUwMjJyMA+0c1f5fgaTCIwPsVSJJUJy8ziz2SySRyzB6awJlZvTAcC/+lf/StlcmdGXk0Lssrm5uSlaG+/EmmHSiV08h4aGdu3ieVCwjQkNPOf3z//8z3A6nW31p8lkEj6fDzqdDpVKBWNjY6hWq2KODocDtVoNN2/eFA/Pv/7X/1rZXLlWWefXGXqJxWIIh8NCCZ3odbwKsFWK3W7H3NycCMHwfjFMUiwWMTw8jPX1ddGSm+LUZrMZJ06cwMjICMLhMAqFAhYWFgCorRhhxYDBYMDc3By2trawuroqumwGg0HUarWuCoBGo4EjR47A7/e3dcGMxWIwGo3ifVVBri0m6ymXy7Ud2xcXF1GpVLC8vIzJyUkYDAaMjo6K3vaxWAwulwszMzNwOp2i79he2NOAfvjDH1bz6d4AfOITnwCAtuw5457MvBcKBZF53ykLz7pKJjzkLLxKA/rxj38cwB2DWCqVhHHikXyvLDyP/HJxez+y8D/7sz8LYDvZsbS0hM3NTZFVz+VyIgvP5n3MwsvXc7mcyNqnUil87WtfE56ySgPKtSqrn8uQVdRl9DpeBZ566ikA21n4559/XmThjxw5IjYbZtvX19fx6quvYn19va0xot/vx4c+9CH4/X5sbm7iwoUL4sTwkY98RNlcH3jgAQDbWfjnn39edNn8oR/6IYyNjSEej+N73/ueaEBIBINBvO997xNZeHbBDAaDOHbsmHhfVaBBzufzuHTpEgqFAoLBIB577DEMDg5idXUV3/zmN7G6utoWUmCFwJe//GWEw2GcPHkSp0+fFln4u5WG7WlAjx8/ru4T9hmPPvooAAgWDI0nDZTMec3n88JwyteLxSLS6bQwovxXNc6cOQOg/UhO4xmJRO6JNUPjGQ6Hdz3yHxQ/8AM/AGA76bG6uirmd/HiRUQiEbjdbgwPD4uuopyHHCfd3NxEs9lEJBJBPB4X3SdVg2u12WyKbKsMJjo613Sv41WApUHpdBq3bt3C5cuXceTIEUxNTYlGg0ePHhWF5+vr67hw4YJovez3+zE0NITjx4/j0KFDuHjxIr797W/3hTkoVwzcunULc3Nz0Ov1olXx9evXcfny5a4KALKjjh492tYFc3Z2FqdOnerqI39Q0ANlwigajcJut2NiYkJk22/fvo1z587BYDBgYmICjz76KM6ePYtnn30WFy5cwIkTJ/DII49genpaGM8DeaD9bmt89OhRZe/FLDwzmM1ms60PUqVSaasDlfv5GI1GIepB4yu/j2q8+uqrALbjNrKBt9vtIlHjcrnaMovA9pGP9DKHwyGMfzabRTabFXzpJ598Usk8mYVPpVJoNBpifqdOnWoruTGZTBgYGBD1ouw2abFYkM1mxQZlNBoxMzPTFyYS12oikcDg4GBXQz52huxc0/c6XuVaZVvjcrmMQ4cOweFwwO/3w2QyoVAooNVqQafTYW1tDZFIBMPDw2i1WsIztdlsqFarosPkxsaGMBaqQc+cWXhujmtra3j11VfFkbwz2WIwGDA/P49MJoP19XXR1jgUCqFWqynvICp3pB0cHBStzFdWVkS2fWJiQrRYXllZwdmzZ0W88x3veIeImy4tLQk2UqcGQSf2bOnxkY98pK9qTF/84heVEc3f//73t4A7MVDGkahSxPgmWT9MNDFZxDFUO5LfBwDe9773KZvrBz7wgRaAtkJ0HsvsdvuuTeLIgWbZE+tX5eZ0APDcc88pmetP/MRPtACIjKTT6Wwr5mZYpFarIZvNYm1tra0sq1qtto2X3wcAfvzHf1zZPeValUMJMpLJJObn57uomfc6XuVa/Q//4T+0gG1P8ujRo/D7/aIWlVRYKhzxyBsIBNqup9NprK2tIZPJwO/3Y3Z2VmxMP/3TP61srh/72MdawPbpZ2pqCgMDA4hEIl1N4nZKeJJXznAIWwjzOgB89rOfVTLXX/zFX2wB7ZUtcsPAUCgkQjIMeUQikbbr8vjOSpjdVKPeMll41lZ2Sn6xy6FsoOx2Ozwej/DkZMPFOjv+fj+z8HJhfCAQwNjYGILB4K6F8XKBfTwex8rKChKJxK6F9wcFY2qjo6MYHByE3W4XBcjkRLOsZmVlBVevXhVHfV6nAQgGg0J4YmRkROk8gTtr9fDhwzhz5owgARA3b97EuXPncOvWrbbrvY5XAXqgdrsd09PTmJ2dFTHmQqGAZDIpQjgnT57Ek08+iePHj4vQTjKZRCKRwNzcHJaXl3Hs2DGcPn26L9RrMrRcLhemp6cxPT2NCxcu4O///u9x6dIlzMzM4PDhw12MrWw2i8XFRSwuLuL06dP4kR/5ETzwwANYWFgQ9aEqQQ/UZrMhGAwiEAigWq1ibW0N8/PzeMc73oHx8XGcOnUK58+fx5e//GVcuHAB73jHO/Ce97wHp06dwq1bt3Dp0iUsLS2J97ibB/qW48KT/y5rZnaKhrCftdzCmNcTiYTIvstZeJXF32RNyZqJNptNsCLY2rgzKSRrMpbLZfH7bG2sOgtPo8IsPP/+wsICotFomzpULpeDy+XC0NAQqtUqvF4vqtUqXC6XCDs0Gg1sbGyI0ITKYzHXqhxKkJFOp4UBl9HreBWQufDr6+uo1+vY2tpCvV4XpXcTExMIBoPw+XzY2trCrVu3RIy+XC7DaDRiYmJCUHrL5XJfuPD0zA0GA9bX11EulxGPxwUlMxAIoNFodHn2zWYTw8PDsFqtCAaDgvJJARLVtcByzXQqlRLhu8HBQRGfj0QiMBgMosLixIkTwiu+desWYrGY4MIzC3+3Z2rPIzwFdfuFj370o8qOGn/2Z3/WJqjMf+Ue8bKIMrnvFBTh+FqtJoSU+T4A8Kd/+qfK5vq//tf/EuKvpIvWajXk83nBiKJwhwyDwSA2BKPRKCiU9LpZcvMzP/MzSuZK4WcWxpOSyWM75f84L/Ysl6/Lx3y58B4A/viP/1jZPeValUt9ZMj8chn3Ol7lWv393//9FrCd8KBYsryZyuEmWYyY4SaDwdBWAsdYOD/D//yf/1PZXD/1qU+1CVWXSqW2UMxuSmCyHFwul8P6+rpQl5Jl4j7+8Y8rmesnP/lJIf7N9UaVJbvd3lYN4nK5MDY2BpfL1VZVQu+VUo2s2vmX9+/9CP9m5MLTINIYUpdSrlkkN16WYOtUW+9nEolF23x4aaASiQRyuRxKpdKuDzXjMuT5MkTBL14lDh06BGCbB02REznWSS6+xWJBIBDAyMgIAoFAG+WQ47PZLIrFIjY3N+8q0LAfcK1ubGxgYWGhyxsbHh7GzMxMV/1hr+NVgBnotbU1oQ0QDAbhcrlETTDJHSsrK7h27RpWV1fFdbvdDrfbjfHxcQQCAayvr2N1dbUvXHh6ipVKBevr64jFYpiamsL999+PyclJRKNRxOPxLg/UYrFgZGQEg4ODuH37Nq5cuYKlpSWEQiEEAgHlHihPa7VaDel0WpA4BgcHEQ6Hcfv2bVy8eBHLy8uYmZnB6dOnMT09jaWlJVy7dg1LS0sYGhrC+Pi4IIkUCoWDceHfTHqgXDxsy0FPk/Jv5Lkzw84jPrCtlk35MB41Ze9VNVhIXi6XUSgUUKlUUKvVRHLLYDCIDUCGxWKB0+kUFFS2HWg0GoJdpRKMU+XzebRaLTE/7upyJYPFYhGbVLlcRrVahdFoRLFYFJUQVKTvR3E612q5XBbemQyr1SrK2mT0Ol4FGKuu1+uCG+7xeKDX69vK74rFotBICAaDgg9vMplQr9eF9kAmk+mbIj3DLa1WS8Tk7Xa7oJVmMpkds9U6nU6IJhcKBcFi43t0VpgcFLLoj81mg06nEx48pfSoB0rSCuXt6Hk6nU6REKXhvFsOZE8DSmbDmwGyIn0ndlKVZzYegPhS+6E+vxPIL+78m3Lrht3kvuSQCx8wAG0KR6q48EzMcI6cH+sRO+fEcqrOsJAsTjs6OtqX+8y1ynhXZ6lUq9VCKpXq8n57Ha8C8nc1NjaG8fFx8Tf5nfLv6nQ6BAIBkaThva3X66Luky01VJ9AALR9fs611WohGo0iEokIfd2dStNWV1exsrICnU6HUCiEcDgsHBzV91U2yPJcWM+p0+kwPDyMkZERtFqttut+vx+BQACtVqurVcmBkkj9aGfQL7CuTKfTtYkhsy0HqZ0sUZLFlVmuxNIl4E7PpH487PRA77VJHNFrE7qDgu0cKLjCZBy9zk5BZQqIyGGUzq4AFHRRDa7VgzaPu9t4FaAHKsdZ5fiwLKVot9tFeIYxc4akOJ71wXd72PcDhpGsVqtoBrdXkzhCLrm6lyZ0BwXXvkzHlnV1Zc0LmfVH+Tq73d42Xj4N7gWtrbEGDRo07BN7ZuE1aNCgQcPu0DxQDRo0aNgnNAOqQYMGDfuEZkA1aNCgYZ/QDKgGDRo07BOaAdWgQYOGfUIzoBo0aNCwT/z/PffPTWH65MAAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import itertools\n", "\n", "fig, axes = plt.subplots(8, 8)\n", "\n", "for (x, y) in itertools.product(range(8), range(8)):\n", " freq = np.zeros((8, 8))\n", " freq[x, y] = 1\n", " freq_img = idct(idct(freq, axis=0, norm='ortho'), axis=1, norm='ortho')\n", " \n", " ax = axes[x, y]\n", " # Experimentally all things tend to be within this range\n", " ax.imshow(freq_img, vmin=-0.25, vmax=0.25)\n", " ax.axis('off')\n", " \n", " save_image(freq_img, name='output/components-{}-{}.png'.format(x, y), vmin=-0.25, vmax=0.25)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Neato! That worked! :)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Generating the things from an image" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "jupyter": { "outputs_hidden": false } }, "outputs": [ { "data": { "text/plain": [ "array([[ 6.43676471e+00, -2.67804573e-01, 1.14066855e+00,\n", " 1.28416012e-01, 1.65196078e-01, 2.76328891e-01,\n", " -1.70577854e-01, 1.21208766e-02],\n", " [ 1.35862306e-01, 5.87481881e-03, 3.52431981e-01,\n", " 3.01222513e-01, -6.82459017e-01, -3.73353206e-01,\n", " 1.59132959e-01, -2.50116836e-01],\n", " [ 9.84146150e-01, 1.76109941e-01, -8.77287599e-01,\n", " -1.82194378e-01, -5.80653053e-03, -2.06642209e-01,\n", " 3.10223718e-01, 4.79610215e-01],\n", " [-2.13674319e-01, -2.03986691e-02, -2.04994939e-01,\n", " -2.32005457e-01, 5.74831191e-01, 2.41180524e-01,\n", " -1.72429322e-01, 4.04527918e-01],\n", " [ 1.65196078e-01, 1.59533499e-02, 9.12904168e-02,\n", " 1.45871539e-01, -1.86764706e-01, -4.44932490e-02,\n", " -1.80540936e-01, -5.75197360e-01],\n", " [ 1.88319103e-01, 3.92539127e-02, -4.27105658e-01,\n", " -2.17986425e-01, 4.04082687e-01, 3.21360492e-01,\n", " -6.34915065e-02, -1.83447823e-01],\n", " [ 2.07300651e-01, 4.01933732e-02, -1.58403733e-01,\n", " -6.69611716e-02, 5.38718317e-02, 7.05020163e-02,\n", " -1.00163382e-01, -1.17451808e-01],\n", " [-3.08639267e-01, -5.43818250e-02, 3.18181609e-01,\n", " 9.52258897e-02, -1.69691772e-01, -6.60887291e-02,\n", " 1.15682158e-01, 5.57505384e-02]])" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from scipy.fftpack import dct\n", "\n", "freqs = dct(dct(img, axis=0, norm='ortho'), axis=1, norm='ortho')\n", "plt.imshow(freqs)\n", "freqs" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "seems correct..." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "jupyter": { "outputs_hidden": false } }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Convert forward and backwards\n", "freqs = dct(dct(img, axis=0, norm='ortho'), axis=1, norm='ortho')\n", "reconstructed_img = idct(idct(freqs, axis=0, norm='ortho'), axis=1, norm='ortho')\n", "plt.imshow(reconstructed_img)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "jupyter": { "outputs_hidden": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "saved to output/img-components-0-0.png\n", "saved to output/img-components-0-1.png\n", "saved to output/img-components-0-2.png\n", "saved to output/img-components-0-3.png\n", "saved to output/img-components-0-4.png\n", "saved to output/img-components-0-5.png\n", "saved to output/img-components-0-6.png\n", "saved to output/img-components-0-7.png\n", "saved to output/img-components-1-0.png\n", "saved to output/img-components-1-1.png\n", "saved to output/img-components-1-2.png\n", "saved to output/img-components-1-3.png\n", "saved to output/img-components-1-4.png\n", "saved to output/img-components-1-5.png\n", "saved to output/img-components-1-6.png\n", "saved to output/img-components-1-7.png\n", "saved to output/img-components-2-0.png\n", "saved to output/img-components-2-1.png\n", "saved to output/img-components-2-2.png\n", "saved to output/img-components-2-3.png\n", "saved to output/img-components-2-4.png\n", "saved to output/img-components-2-5.png\n", "saved to output/img-components-2-6.png\n", "saved to output/img-components-2-7.png\n", "saved to output/img-components-3-0.png\n", "saved to output/img-components-3-1.png\n", "saved to output/img-components-3-2.png\n", "saved to output/img-components-3-3.png\n", "saved to output/img-components-3-4.png\n", "saved to output/img-components-3-5.png\n", "saved to output/img-components-3-6.png\n", "saved to output/img-components-3-7.png\n", "saved to output/img-components-4-0.png\n", "saved to output/img-components-4-1.png\n", "saved to output/img-components-4-2.png\n", "saved to output/img-components-4-3.png\n", "saved to output/img-components-4-4.png\n", "saved to output/img-components-4-5.png\n", "saved to output/img-components-4-6.png\n", "saved to output/img-components-4-7.png\n", "saved to output/img-components-5-0.png\n", "saved to output/img-components-5-1.png\n", "saved to output/img-components-5-2.png\n", "saved to output/img-components-5-3.png\n", "saved to output/img-components-5-4.png\n", "saved to output/img-components-5-5.png\n", "saved to output/img-components-5-6.png\n", "saved to output/img-components-5-7.png\n", "saved to output/img-components-6-0.png\n", "saved to output/img-components-6-1.png\n", "saved to output/img-components-6-2.png\n", "saved to output/img-components-6-3.png\n", "saved to output/img-components-6-4.png\n", "saved to output/img-components-6-5.png\n", "saved to output/img-components-6-6.png\n", "saved to output/img-components-6-7.png\n", "saved to output/img-components-7-0.png\n", "saved to output/img-components-7-1.png\n", "saved to output/img-components-7-2.png\n", "saved to output/img-components-7-3.png\n", "saved to output/img-components-7-4.png\n", "saved to output/img-components-7-5.png\n", "saved to output/img-components-7-6.png\n", "saved to output/img-components-7-7.png\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Lets draw the compnents that come out\n", "\n", "# first need this function\n", "def lerp(a, b, amt):\n", " '''Linear interpolate between a and b'''\n", " return a + (b - a) * amt\n", "\n", "freqs = dct(dct(img, axis=0, norm='ortho'), axis=1, norm='ortho')\n", "\n", "fig, axes = plt.subplots(8, 8)\n", "\n", "for (x, y) in itertools.product(range(8), range(8)):\n", " freq_select = np.zeros((8, 8))\n", " freq_select[x, y] = 1\n", " \n", " new_freqs = np.multiply(freqs, freq_select)\n", " \n", " freq_img = idct(idct(new_freqs, axis=0, norm='ortho'), axis=1, norm='ortho')\n", " \n", " # If we draw everything with in the same scale it's hard to see the smaller patterns\n", " # because they're so small and come out as mostly grey.\n", " # But if we draw them all with their own scale we can't see the relative size.\n", " # So we go somewhere between.\n", " scale_adjust_amt = 0.1\n", " vmin = lerp(freq_img.min(), -1, scale_adjust_amt)\n", " vmax = lerp(freq_img.max(), 1, scale_adjust_amt)\n", " \n", " ax = axes[x, y]\n", " ax.imshow(freq_img, vmin=vmin, vmax=vmax)\n", " ax.axis('off')\n", " save_image(freq_img, name='output/img-components-{}-{}.png'.format(x, y), vmin=vmin, vmax=vmax)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "jupyter": { "outputs_hidden": false } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Now lets draw the image being built up\n", "freqs = dct(dct(img, axis=0, norm='ortho'), axis=1, norm='ortho')\n", "\n", "fig, axes = plt.subplots(8, 8)\n", "\n", "for (i, (x, y)) in enumerate(itertools.product(range(8), range(8))):\n", " freq_select = np.zeros(8 * 8)\n", " freq_select[:i+1] = 1\n", " freq_select = freq_select.reshape((8, 8))\n", " \n", " new_freqs = np.multiply(freqs, freq_select)\n", " \n", " freq_img = idct(idct(new_freqs, axis=0, norm='ortho'), axis=1, norm='ortho')\n", " \n", " ax = axes[x, y]\n", " ax.imshow(freq_img, vmin=0, vmax=1)\n", " ax.axis('off')" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "jupyter": { "outputs_hidden": false } }, "outputs": [ { "data": { "text/plain": [ "array([[ 0., 1., 5., 6.],\n", " [ 2., 4., 7., 12.],\n", " [ 3., 8., 11., 13.],\n", " [ 9., 10., 14., 15.]])" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Fill in a similar way to how jpegs do it?\n", "\n", "def loop_like_a_jpeg(size):\n", " \"\"\"Generates a bunch of tuples that loop over a matrix in a zig-zag way\n", " \"\"\"\n", " flip_dir = False\n", " for i in range(size):\n", " r = range(i + 1)\n", " if flip_dir:\n", " r = reversed(r)\n", " \n", " for j in r:\n", " # Start at the right edge (0, i), and go upwards to the right\n", " yield (0 + j, i - j)\n", " flip_dir = not flip_dir\n", "\n", " for i in range(1, size):\n", " r = range(size - i)\n", " if flip_dir:\n", " r = reversed(r)\n", " \n", " for j in r:\n", " # Start the the bottom edge (i, size-1) and go upwards to the right\n", " yield(i + j, (size - 1) - j)\n", " flip_dir = not flip_dir\n", "\n", "arr = np.zeros((4, 4))\n", "for (i, (x, y)) in enumerate(loop_like_a_jpeg(4)):\n", "# print(x, y)\n", " arr[y, x] = i\n", "arr" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "jupyter": { "outputs_hidden": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "saved to output/img-buildup-0-0.png\n", "saved to output/img-buildup-0-1.png\n", "saved to output/img-buildup-1-0.png\n", "saved to output/img-buildup-2-0.png\n", "saved to output/img-buildup-1-1.png\n", "saved to output/img-buildup-0-2.png\n", "saved to output/img-buildup-0-3.png\n", "saved to output/img-buildup-1-2.png\n", "saved to output/img-buildup-2-1.png\n", "saved to output/img-buildup-3-0.png\n", "saved to output/img-buildup-4-0.png\n", "saved to output/img-buildup-3-1.png\n", "saved to output/img-buildup-2-2.png\n", "saved to output/img-buildup-1-3.png\n", "saved to output/img-buildup-0-4.png\n", "saved to output/img-buildup-0-5.png\n", "saved to output/img-buildup-1-4.png\n", "saved to output/img-buildup-2-3.png\n", "saved to output/img-buildup-3-2.png\n", "saved to output/img-buildup-4-1.png\n", "saved to output/img-buildup-5-0.png\n", "saved to output/img-buildup-6-0.png\n", "saved to output/img-buildup-5-1.png\n", "saved to output/img-buildup-4-2.png\n", "saved to output/img-buildup-3-3.png\n", "saved to output/img-buildup-2-4.png\n", "saved to output/img-buildup-1-5.png\n", "saved to output/img-buildup-0-6.png\n", "saved to output/img-buildup-0-7.png\n", "saved to output/img-buildup-1-6.png\n", "saved to output/img-buildup-2-5.png\n", "saved to output/img-buildup-3-4.png\n", "saved to output/img-buildup-4-3.png\n", "saved to output/img-buildup-5-2.png\n", "saved to output/img-buildup-6-1.png\n", "saved to output/img-buildup-7-0.png\n", "saved to output/img-buildup-7-1.png\n", "saved to output/img-buildup-6-2.png\n", "saved to output/img-buildup-5-3.png\n", "saved to output/img-buildup-4-4.png\n", "saved to output/img-buildup-3-5.png\n", "saved to output/img-buildup-2-6.png\n", "saved to output/img-buildup-1-7.png\n", "saved to output/img-buildup-2-7.png\n", "saved to output/img-buildup-3-6.png\n", "saved to output/img-buildup-4-5.png\n", "saved to output/img-buildup-5-4.png\n", "saved to output/img-buildup-6-3.png\n", "saved to output/img-buildup-7-2.png\n", "saved to output/img-buildup-7-3.png\n", "saved to output/img-buildup-6-4.png\n", "saved to output/img-buildup-5-5.png\n", "saved to output/img-buildup-4-6.png\n", "saved to output/img-buildup-3-7.png\n", "saved to output/img-buildup-4-7.png\n", "saved to output/img-buildup-5-6.png\n", "saved to output/img-buildup-6-5.png\n", "saved to output/img-buildup-7-4.png\n", "saved to output/img-buildup-7-5.png\n", "saved to output/img-buildup-6-6.png\n", "saved to output/img-buildup-5-7.png\n", "saved to output/img-buildup-6-7.png\n", "saved to output/img-buildup-7-6.png\n", "saved to output/img-buildup-7-7.png\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAVAAAADnCAYAAABIUA6gAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAACc4ElEQVR4nO19aW9caXbeU/u+b9xEiqKkVk93j2d6puEYXjCGxwjgn5BP+Sf5nB+Q3xAECbIAiRPDQYKJx2Nn9t60UqK41r7de2vf8kF+jk5dFilKqluyM/UABKvZVPHUe9/3vGd/XLPZDGusscYaa7w93B9agDXWWGONf6pYK9A11lhjjXfEWoGuscYaa7wj1gp0jTXWWOMdsVaga6yxxhrvCO91//PXv/61oyn6zz//3LWs9/qbv/kbkdXlev22Ho8HLpcLLpcLbrdbXtt/DgBut1t+x/4+9+/fX5qsAC6t63Q6RaPRQK/Xw3A4hGVZGI1Gc3IHg0GkUikEAgFEIhH4fL6r3n9Zsl6Sczweo1arodvtYjgcynePxwO/3w+3241QKIR0Oo1gMIhwOHzd+zu2pr1eD71eD41GA/1+H263Gz6fT+RMJBIIBALweDzweDw3eX9HZB2NRmi1WhiNRuh0OhiNRvD5fAiFQvB6vXC73XPfI5HI3L7UGI1GAACfz7c0WVut1gwAksnkwv8/nU5xdnYGwzDg9/sRDofh8/kQiUQQjUavfN/hcAgA8Pv9S5H1XeTk9/eR81oFusbqMBwOL30NBgO43W5R9m63G4PBAC6XC16v9zoF6qicg8EAg8EAo9FIvrvdbsxmM1FIWvZAILBSGWezGUajEYbDIfr9Pnq9nqyZy+VCIBCA2+3GcDiE1+sVZcULdZUYj8dzsg6HQ4xGI0wmE5GJCtTv9wMAAoHAwmdPQ2CZmE6nIqfXO68uLMuCaZqoVCowTROBQADRaBR+vx+j0QjBYPDSvwGAyWSiFdPK5fT5fIjH4wgEAhgOh+8l51qBfmBQCfV6PZimea0FygM/Ho8xnU4RDocdOTTXydnpdEROyj0YDOD1euH3++HxeDAej+Hz+TAejzGZTFauQGl9djodtFotdDod6HrnQCCATqcDv98Pv9+PWCwGn88Hn88nh4mXltOggu/1emi1WmItU3nyEnK73QgGg0gmkwgGgwgGg0gkEnPvdUNL+q1Aq7bT6cjf6/V6ODo6QrvdhmmauLi4gGVZCIVCSKVSCIVCiMVimM1moqiCwaC8p2ma6Pf7AHCt9feucsbjcbhcLnS7Xbx8+XKhnPSQEomEyOn3+xEKhd5KzrUC/cDQlpzdArUrUFpNtEp4e65KTsqoLU9+pwXAMAgtUMq5LEvjJphMJmLVUcnPZjNMp1OxTmmJ0o0PBAJzVh/DPE6DFuhoNJqzlvm8tQfCy2g2m8Hlci20tpYNPlde6j6fD81mE7VaDY1GA5ZloVqtotPpiPKh0rEsC16vV9bV6/XKc6Fl54ScnU4HXq8XrVYLtVoNzWYTpmmiWq3CsiwJK/F7KpWCx+PBZDKBz+d7KznXCvQDYjAYoN/vyxctkeFwiF6vd0mBzmYzBINBTKdTuN1uOWxOW3jj8XhOxk6nI+4m5eQGpEXMw+RyudDr9QAsz117E6iQGKO1LAuz2WzOIub3YDAIt9uN8XiMYDAoCnVVHXpUoFT03W4XAOTv63g946Pj8XhlCtQeU5xOpxiPx+j1erAsC51OB91uV+TmnhwMBrLes9lM5GR8d9mek11OPm/uVy0n9yQv+veRc61APwAajQaAVwrUNE05PDdJIk2nUwSDQXGb+/2+uCLL3pSGYQB4ZVHQvex2u2g2m+h2u3OJD3sSCQCCwSD6/T5cLhdCoRD8fr/EyJwEFb1pmmg0GpKk6Xa7GI/H4rb7/X5EIhH0+31JelCBOq2YtKxU8o1GA6ZpigU9mUzmnn8sFsN4PJbvdI+dDDVol3YymUjIptlsiuVZq9XQ6XQQiUTE4/D5fHLJ2r2kWCyGWCy2Mjkrlcqcpdzv98XK5BnSXtTbyLlWoB8AvK1pwelkx3UWKPDaPfJ4PHKLzmYzid8BWNrh59+ibFT0tEYpN5NIk8lErCW6zXztcrkwnU7FpQPmN/0yYU/MUMlbliXhhMlkIt/pyvFQ2Q+Sk6CsXGNeTIPBQNZJeyCM7wUCAbGcVqXsGdKwW3a07txuN7rdriQRtWW3StCDoOdkt5Q9Hg/6/f4lOd8FawX6AcC4CmN0+rv9y15yRYvO6/WKFcr3ogW6rAM1GAzku11W+8+8Xq9k4XUM1OPxSJkTFT0PlFMKdDKZzClRHQtlDNftdsv3Xq8n6zmZTCRWugrw8NLq5IHu9XoYj8cAMPdc+/0+/H4/hsPhypXTYDAQJUSFxAuVz5vGQTAYhGEYUjGQy+VWJietelr2djk9Hg86nQ6m0ylCoZCUNnm93reWc61APwBM0wTw2oWnxWkYhlielmXJpuQXXQ5m4enSU3lSMb+h9vKt5ez3+zAMYy4Lr+tAqYh0Fp5yjsdjsZb8fj9ms5m48PYs8jIwmUzmrHnLsmAYxlwYwu/3o9/vw+fzYTAYIBQKifW8SsU0m80kDk5Z+dxN05TMMmUZjUaIxWKYTqcIBAKibFdVztZut1Gr1VCv11Gv11GtVufWlRduMBjEeDxGMpmUCyufzy9tX74JhmGIjPV6HbVaba7KgeckGAxiMpkgkUjIWhYKhbeSc61APwC40bR1pK06bdnp4n6WMuksPLPG/LkTctotz0V1oHTvdMkVLVDWrtotUCdAa05bofaaUFp2LFfSVt0qXfhFMvKLB13L4vf70e12EQwGRdG/q+v5LtCJLlqhlJNKiXHmYDAoNZeRSASDwWBlCtQuZ7fblbAT93S328VkMpmTMxqNvrWc61bOD4jZbCbKRH/Xh0b/jv49+7/RX07JaX9v/d92t9f+uVYFKnS6xpTLvqbT6VT+Hy1lJm6o0JwG48dUhPZ1psxaXmbB+UUlvAq02220221JcM5mMylV8/v9cjmOx2MpJ6JV3el0Vqbs7XJyHf1+PwKBgISbeGlRTtM031rOtQX6AXDVwbAfHpYr6RrGN305IaddvkX/zRinVlh25aV/f9lgqRQPAZNeVKL67/OQA6/rW3U5GX+2rCJvOygP43O04iirvox0+ZW2orW8Ho/HcVlLpRLOzs5QLpdRr9fF0gRexbKDwaA828lkAsuyUKlUJIFYrValNCgej38wOVlHSzk7nQ4qlYqUN1WrVfj9fgSDwRvJuVagHxDXWXQElSj/v11ZrtrCu07m62RxUnkC82ERnZihNWG/nKiYaIloK5T/7RTssvLvLUpezWYzsU556O3yOikrS9kMw5CvTqcjCl93TWmLmPFxAGKB8pILh8NLrxy4Tk7uOS0n5WdibDabzWXrbyrnWoF+ADDoz4QKv7OshrFCAHNdKWw35O/yNX++7E1JGVjyM51O5/6e/h3WgXo8nktyaZkDgYAjdaAsueKBoXup2whZtcBD7/F4EAwGRW5a+1RMTkHLqkuVaPl4PB5Za1qejCuyRpVlYU678FwHXZLk8XgQiUQAQNaQCTgqLT5nPV/A7mWtQk5a5l6vV2p8F8mpSwW1J/UmrBXoBwA3n8/nm2sfZNadsSR7HWgoFEI0GkUwGEQkEpEvTmdadkcS5WSGn+VUdHe4aXUhPQ9UOBxGKBRCOBxGJBKR6TeRSMQRBUoLpNPpiELhAWJSKxAILGxOYJE/KwjoKrNJwWlZ9WFnnWwkEhFrs9/vYzweIxwOIxwOiyKgrB6PZ65FcZkNFbQadb2kz+dDPp/HeDxGKBRCJpNBKBRCt9sVd1h7SAzvUNnzPZYJu5ysTsjlckilUgiHw0in0wiFQuh0OqhWq2Jp0kJ9FznXCvQDgApEl/ToARz657oOlP3E2qrT1t2yFdMiC5R/j0qKf5NyUZHav7Q16kTZDd1iJg1ogdKKo1Kh3LQ2mFTgGusDpHv4l6mU7LLy/fm3GFOeTqdzNavBYBA+n0+UPxNKDDvwfZdZX6stOx2Xp7KORqMoFAqIRqMwDEP2McvJxuPxpRCUtu6WVTmyyALVcsZiMeTzeUSjUen24j62y6lj92+Sc61APwBo1dCKo+vIn+u+cj3UIhQKSSCcE3n017ItUN3PzgJ+XX/KQ84RdlTwtOooE+Wji+pkKycVEbug6PrSFbbXeHq9Xol1cZYl3XkqDL6vU7JyAhStT51IYrssLehYLIZAICAWvQ49OJHl5mXHS4YhECryeDyOdDqNRCJxqb6Wnot25bmHtNW3bDkpK8NJbrcbiUQCmUxG5sAOBoNLcvLZv42cawX6AcDBB+yK4OGYTqfSLcM6T9aBApBxYXThk8mkuO5OuJqUU7d08tbmzEefz7ewF55j1/iaB96p6VFUiozPUcknk8mFWXgqKh2j47pSMbFJAVhed9ciWe1zP/UYu8FgAMMwxFWnQmBYhO48rdVlg5eovhC1Is9kMrh//z4ymQyazSZCoRBarZZk4dkjTzkBzMm6LAVKS9N+cXNMHeVMp9NotVoiZ6fTQblcRqfTQTQaFSV6UznXCvQD4DoLlK4HXQpdSK+tOftrJ6Bdbf4NFh/TldOZWCpQbRVzQztteRK06uzK0W4B6aw3lSnDC9qdd7KoXrvtHo9HBjvry6jf74vFpD8H3XltgTohq04WUjafzycx7ng8jkwmA5fLJcqJn800TXHpFyVplgk9RUmHusLhsChSu5z07nToQc+BvYmcawX6AUCLUsctGbCmG7YoBsqMoT0T7zT49+hS0gqli0wZeegXxUCdVp5XTWinVacHE+skgZ58pBNh2j12Ula67+yE0VY8u6Toauq4nA6H6Nmhywaz2N1uV0JITA4yqanjg4lEQpSOYRiYzWZiLYdCobnYvZNy8vKmrNfJGY1GMZ1OEYlE5N/cVM61Av2AYOaVU8jp0vOh2YeJ0MXkd6eKpxeBGWJm4fVwZ3svfCgUmpNzFS18On5MS4JthD6f71oeIXasECwj44AJp2RlWRcnQqXT6YXeRD6fl0QHs8wsy/F6vY4OP+Hnz+fzyGQyGI1GiEQiyGazCIfDKBQKc7+fyWQQjUZl5B5DOOl0GslkUqxYJ+VMp9M3lpOjDikn46Q3lXOtQD8weBB03R8AsTi0C2+v/1y1nLQ8eegBzMWI6D6t2kIG5pMIVCw3qTklP85gMJC6SibGtNvphKyz2UzaChnPXASdTWb7p07o6JCEU2ByUIdmaFXawRhpJBLBaDSS31sFtQs5rt5FTlqgbyPnuhd+jTXWWOMd4Vp1K+Aaa6yxxv8vWFuga6yxxhrviLUCXWONNdZ4R6wV6BprrLHGO2KtQNdYY4013hHXljH93//7fyXDpDs6NMWEfq37SBf9jn4fALh9+/bSakQMw5jZ5QSwUA5dGvQWWGY9y8LM3enpKdrtttCxclgu6xr14IZ4PH5djeKyZJ2Tk2RnzWZTpt8AkC4qts2RSOwqsATK4/E4vqacUK8nBekZlrlcDltbWwvfkBxAAHBwcLA0WU3TnAG4ljL35OQErVZLuml8Pt8baXadWFfLsmYArq05Pj4+FllZdxuPx6/9N2rGwFJk5ZpqdtpFf5NNE5yLkEwm5+o9LctCs9lEMBhEKpXSZ2yhnNcq0LedmML6uavey0n+avYsA6/b3YDLCpQ/00pU/46TMr5JfnLyaG4crieHv2rOnFUW0gOXKXh1ZwzHxHFkXCwWu1LBO9ExswjkB+f8R37pDqXrivz1IJdlgsqDBfEa4/EYrVYLlUoFrVYLgUBAerSn0+mVCpRKAVjuNCYq5UWyTqdT4V2nrBzSMZ1Or9yfTsjK97E/L16g/X5fjBKN4XCIzc1N+W89TewmTRQ3KqS3K9JFU8jt/48Kk8Mb+Fr/7jJBBslFvc/8GS1kO1HbIiULzB90J7tpRqMRTNMU/hhymdMCZaePy+VCp9ORz7dKBcrJ3ZZlybAIKvXZbIZAIADLshAIBBAKhYTtkp1JemM7fUlp+gseGj3cgoM72BefzWaRSqUuvQ8V7bLB5oNOpyPWpWmaKBaLsr4nJydot9syQIadMl6vF6lUSiYi8fOS8x5YrgLl+L9OpyO9+pZloVwui6y0QEOhkMzcvErW8Xgs06WWKeui59Tr9fD06VM0Gg0YhoHT01OYpgm/3y9tszs7O4hEIkLf4fV6EYvFbtyo8ta74ypLctHPr/vdZWORBWr/mkwmNwo36PcgnFKgs9nsEic8b009L5JTmzh2i5PXV2XNkTqCiomshuQd0m2dHDgCQLqR7JeT07JyPiY5h8giSQXKTiP+7KpBz04oUD5TjqpzuVwwDAO1Wg3tdhuGYaBarcIwDFEwbPe1LGtucLXeFxw4skxoShQOaKF8pmmi1WqhWq2i3W4jHA7D5Xo9GFzLyu4wJ2W1YzQaoV6v4+LiAq1WCy9evECr1UIwGJQh0D6fD4ZhiAJlS/JNn/tbufBaIb6NS+6k5UnomNwi69NudV6lQO2uP8HRbssGuWK63a5wmWuSMz1z0+v1zsVFu93uyqxQKkly2JO/nrzwuh1V/zdH3+n1dhpUnlpxknXRsiwZLAJAaG11/z7h8/kcaT/kXtJDTRhfpkKn3ACEmE3zPekZrLSknVD2WlZe6AyNkEOI8rpcLlH0DEdxqhgnJDkpqx1cVz10ejQawev1Sjss5wswBKWnMd0EN1Kgi36u3XMNzSRJaPfdKTQajbm/d10S6aYWqIaOk7wvuBadTgf1eh29Xg+maaLZbMI0TQwGA0km6SlHnL/JzRkIBDAcDoVCw0kw7mmaJhqNhrjGhmFgMBjMuUXxeByTyUSSHpw45FRvuR0MNRiGgXK5LIqTLrJ+5uPxGOl0GuPxGMlkErdu3ZL30TMslwlt6bK3fTAYoNFoiOVJC6/f74vlFggE5IKlQgJeD6VxAlpWt9uNbrcrstKNr9Vqc7Jyb65SVsuyAMxferyUtKInbTEveIbNtGtPaL77q2ReSgzUbpUuYpJ0OgZKfhN7xl9/XZU4uq5iwAlZtWVhtz7t1Lp2C5TukdfrRa/Xk2ESTk0OInh70wKlzIZhyKBl0iQAkOym1+ud46hZBewWKA8IFal+1uFwWCxQUqrodXTaUuLzJbVEt9ud+3K73ej1euKqOz005E2yknSPe4DWJ2Wlh6Q5lFbRLs4zpefjcl21BcrErLZE9VnTYLgKeEcFaqczuEoBLlqgN7n/ywZvCq307ArRbnVelYXXn8+JuB3jP1pZkhuc1iUftnZ7+LCpSPkaeKWMuXGcmNSk3SFurMFgIIqfrhqt5F6vJ9aAk6yRdnCKPNeU8tEa0rFyKicqglAoJGu+KnANqYSokLi+Ho8HnU5H5mpS2btcroWJLydBqmK9Zkx26tg4APEAgsEg3G43MpmMo7IxVszpVozH6y/gtYHFkAQNgk6nc+m532Sk3Y12ij1ZQavS7qrz9+wuO4PPTuKqLDzwetGuctt13GMVFmiz2QTwSum1221xMwzDQLfblY3K23I8HouMoVBI1p+TtDU1MoBLsw/fF3aFpF2iZrOJTqczpzRZxsRYFy2nVVgik8kE3W4XpmnCMAw0m000m010u12022054ITP55NaTyY+VjG/lGDyqFaroVqtolqtotPpoNVqyR7QbAW5XE7idolEQpIfq5K12WyiXq+jUqmgXC6j2+2i1WpJuRgA4aBKJpNiJKTTaUfj9XodaPXqGDiTnDRIWAdqmibq9bpMzc/lcvI+wWDwjZf/ja9aHdtcFAO1W5da6dr/nxNK6aZ1oPw5F/JNLrwTYMJLW6C6BlR/5+VDC1Rz42i3o9/vO+ba6WSHznDbLVDgdQxKfy7O2FwFtKVOhc+DRHn0vtXWH5UArehVQK+hloPrB0AuJW2BBoPBuT2/CtDKXCQrZWF1RigUgmmaQrm9SlkZZqDrzj2oFSiVLI2VTqezkFPqTd7IW2Xh7bFN++++ycV30oXXf2PR66t+3/4z+8+dUKJUJpqB0a5grqpV1TJpmthF77Es6LIq0mDw7xNaFv4ON7H+cto95oGhsuTf5aWvjQB+sdCalwIvplWUXbXbbbTbbZmKz2dIXie6pAxNdDodGIaBQCAgdaR0k52GYRgwDEMsOjsFN58twzydTgd+vx+RSATdbvdN3XNLwWw2Q6lUQqfTwcnJCc7OznBxcTE3zR94bXC1Wi2USiVhD/3oo4/e6u/dSIFy89ESAuaVqt6Y/BmD48Dr7gD9PsuGXVa+1htrkaz656uoFgBePzytkLTyo4w8xCxZ0VUClFvz+iwb7XYbwKvwiLaKNO2uVuA8UFRI/OK/dZKVk6D73mq1YJqmxBMZo6ViYjKGLr/H40E4HJbi9dlsdm3b5DJQLBZxenqKYrGIdruNTqcjB5xJLa7vYDCQZoB+v4/JZIKNjQ24XC5EIhHHYoy8LMvlMs7OzlCpVFCr1cRim06nYhHrvUC2S8uyMJvNsLu7K4yeToYdLMvC119/jdPTU5ydneHnP/85zs/P5e8y2cl9bFkWut2uJBPv3bsnrb03KdV85zrQRb97XZ2o00mkt0la8UEvChCvwlqmsrQrImA+5MD/pjz6/y2yPpdtgdKF1DV9VPaLrHW6SddZoE6BB51uJi1R/l2yh/KZa4OALr8u8nZS0TNebxiGFM5TefIZ6uQhLSe6m7oBgJUYrA1dNgzDkO+MK7P2l2tOWfWlNBgM0Ol05pQUQ1dOeiKDwQCVSgWnp6c4Pz/H+fk5isXiHKfXaDSSsBNl9vv9yGazaLfbokC5n6/DW5cx8dBelZnXlqD+N06XMenM85tioG9q5XQ6C8+NzlgmHyBZOXlwaHnqzhPNiUQaXtbZLXtTUoFq15JWHKmNI5GIrBsD8az7pNVMi88JK5nge1PB0xrm+pHTaTabSVMArSctp55F4LSso9FoLiEbiUTmPA0mO+gyh0IhqQnWHuB1BsGyZNXKndY6Qwxs8WTnF91hnWcAXhtZTnp5fL5U0rlcDh6PB6lUCnfu3EEymUSv10Or1ZK8gQ6l8dJlcnkpMVA7uNnsbrvd4iQWZfGXjUgkMicfv99UgepBI05n4VluxNuQf5NlScysM/uu+dZZmB4IBCT+RQK1ZSc+6MLTAuIhJUUsY2/9fn8uvBCNRhEOh0Xx69Iny7IcycbSumG5El00Kk2ukcfjkU4avb7A6+EjpmnK7zmhlFgJwNgyKa2ZAdbu5qIpUpoLntY+38MpWRk2YMwzl8vJxKVcLodIJIJOp4NqtYputzsXJtHGFn9OxbTs88Vw1mAwQDgcxoMHDzCZTLC9vY0vvvgCm5ubaLfbOD4+hmEYqNfrODw8RKPRwHA4lPBPMBi80T59Lxf+KsW4aFGc7tvWm4eKz/61qIzJrkwXuc/LBjcPNz0PAg+7tlC1BcoYkma8JAsmO32WCVphtNaA1xYoLWU9MYp/n33PXG97VpSW7TLbJBke0G4Z15LKk51Suo1Pg1lZXYvrhALVstLy0Qo+HA4jk8kgHA7PlapRgekSQh3KcQJ2y55rShbReDyOQqGAWCwG0zTl0hoOh5IYW2SB2vMjy4IOZ3EwiNfrxd7eHh48eIDd3V00Gg14vV40m034fD6cnJyIfIzfL6UXnrC742+KZ9rNdHsW3wmrjjErrQC1VXRTBbqKMiatOLRbywJpxutoAWnXmG4clam2QJftwuu4rOZWTyQSCAaDc+2k+t/o2aCcNqSVKWNnywSfM9eLa8b15FQjys0kiB6IwrV0yvMg+Jx0+IVrxXZC8pazJZJdUvQG9HwBAI4pUE0XrcNE/B6Px5HNZhGPxxEMBmWcHa1QKiNNE023GVieAuXnZ6smz0symUQgEEAqlZI4aDgcFt76aDQqMxAYQnubEM5bu/BXlQnZM9j2WlG7El02OPRgkQJdFOvUVtOqWzmZ3eUhYOKCFp0e+KpdePJY0wLlAXNKgRJerxfRaFQy08lkci6WqCsJaKHQmmIZC+VzqmKAn53x2UgkMlfJEIvFsL29jVgshsFgANM0JSnDeQSU0+mefRbqk4Oc4ZhcLodwOIxUKoX9/X0kk0kZ7stidQ6z5uBirZS4rst05dnhEwqF5Es/33w+j48++giZTEYqGFqtFgzDgNvthmmaYvlT4et5oMvqmjs+PgbwqlpgOp0iGAwikUhgb28PyWQSGxsbyOfzAF6FmDY2NqRQPpvNot/vIxwOYzQaSV89Q1HX4a1deP3fi37X/rNF7r8Tt+V1Fij/W1ugbxomAlyeyLQscNNoaxN4tUm15akVKL8zkcS5m7RinBp8QTl1iEA/Rx2A19lufjHEsEoLVCfYaFUmk0nk83kkEgmZVcrSIHapcDyck8oTuGzVUeZwOCxsA5lMBi6XC9lsFq1WS/4dEx/cE/b44rKhLU6GQ/SU/Hg8jnQ6DeCVZ5JOp2X9uMb8t3oPLDsPwjXioG8q+UQigUwmc2maWiQSwWQyQSQSQTgclkQYPRKGet5kKb+zybKopOkqBXuTeqr3hf0m0y46/3tR++Z1WXinZNYWAl8z/kYFoxWptkDtMVAeJCeUp56gQxmoFBmD000BOlvPvaCtFX454YHw+evLhdav3+9HMplEJpOZCyvQ3aTFodeVSt8JMDkRiUSkhjIUCiEcDiMcDktlA/BqDyYSCUngcX6o/rdMKjoxA4Gy9no9hMNh9Ho9+P3+ufXV54SyTiYTRKNRjEYjRKNRsV51tcYyoetgNzc3xW1PpVKSeNXgPkgmk9jc3ITb7UY2m0Uul5NQjw5bXYX3ioHqkiZ7Bn5RDNRJRaozZosSQdoqui4Gyt91Mg5Gt0CXszCZxGSBnvuoLVAqBL52MjFH901z3fD1VYlCuvN07TX0xbVsMK6sQwyhUAiZTAbBYBC5XG5OwUSjUYk1TqdTSSxQgdK6dwL8/Pl8HplMBoPBQKzOWCx2aZZBPp9HNBqFYRhwuVziFjNO6mSDAtd1Y2MD9Xpd9ihpRugWE4lEQlxfzkjIZrMLrcBlYnd3FwCkIsAwDEQiEeTzeSkP09C0HR6PR9Z0c3NTdMlNdMBbWaBvKqT/kKC1ZLcgr4uBatd+lWVMBBUS8Gr9NEWD2+0Wq4PWEB86D7nT7Xs62aFDB1etCS8jPYWJGXj7ZC+nQBk5I5VJgusy/rFYTMaw0bpexUQm1lDSYqb1uUhx89Jtt9tSf0sL1AnL8zpZuba8xO3weDyIxWKIRqPo9/si6yoQCoWwsbEhbrkmjdPZeYJKk7Qpb1tit6Y1XmONNdZ4R7g+tOW4xhprrPFPFWsLdI011ljjHbFWoGusscYa74i1Al1jjTXWeEesFegaa6yxxjvi2loNwzAkw3RVneRVpUE3xDJrhBZmwyqVivAOsWVPt/hFIhGpHWNt4IeQVfdnsy2PZWMs6PV6vXOj4q4p9F6WrFdmGGezGSzLkunfrAmezWbIZDLY399f+O/YjggAW1tbjj9/DU5U5xDl8XiMVCqFnZ2dxW84m8lEqmQyuTRZ6/X6DMC1Q5CfPHmCer0u+5MlWTcsr1qarN1udwZgrgDefsY5xFrXz9rlZPus7mJapqz9fv/S87fXxjabTTQaDakPXVRSx2EiunwQANxu90I5r30anJrzpv7yf/gDV3b3ON2F9KbPwC8OCdDdNJq1b5XskRqaw8feC69l5exQ1o9y+MiqwVFw5NRmJw9rPdljfNVhd0LmN7XcWZYlE9K5vpz7mMvlFtaJOjUXlJUvnJupMR6PUa/XUa1W0Wg05MLnkGhNemZ/TycmHOn6zUXPzTAMHB8fo91uS+skpzRp1lBO8dK1z8sElaUeMq7r1i3LwtHREer1OqLRqMwTCIVCc8wDemTgTeS8VoHyYACLLVDgdX/5VUM5rusvd7q4lnwz5C63LEs4tnVvNztrPB6Po90Si6BpjTkoYjwei4WkJyHpKUfBYBAul0uGXzgNdkb1+30YhiEWRalUmtsnwKtN3Gg0kM1mL8mmB7ksE+zqIjEce5rZ666tZcoIvJreE4vFkMlkZFAGQfbRZYPKvtvtyj7s9Xo4OzuDaZpoNpt48eIFWq0WotEo2u02IpGIKCS9R10ul8xb5fsuk+54kdK0LAtnZ2fCKPro0SPUajXEYjFsbW0hGo0in8/jO9/5DrLZLADIHFmn9yr3l8fjgWVZOD8/h2maqFQqePjwIarVKmKxGG7duoVYLIZcLoePP/5YvAFOcbrpJX+tAr0J0yXnQr5Nf/kqFKhmhdQkYxwQwJmKdu7oRVaBk7BzrZMuge48lT2Hi9AK5cFxYg7oVXLSUiY9Q6fTmbNA+VwjkYjwIC2aZuOEvPQeRqPRHDU0pxh1Oh1UKhV0Op25tt5AICBMl5w2RXC/LBtU3pz843a7RRm12200m015zX59DjwxTVOeORUF98+qPKjRaCRUzOVyGc+fP0e1WkUymcR0OkUikQAA7OzsSBvlKs+UlpNU0eVyGS9fvkS1WkUikcBsNkM8HsdkMsHOzg6i0eiNrU6NaxUop3wDl6e8Azcf0KH/jX3wgBMg7Sp5Y0gsxmnlbJOkuU4WRj1gYlWusVZMlJeWk5bL7XZL7Egr0FXRBTM2xIntnU4HpmkKGRrw+mJlH3Q4HIbL5Zq7KG9Ck/AuYOyaFxHwSlFpRc/1pTvpdrvnxvHZEQqFHJkcRQtRT7Oi4id/EAn5vF6vuPGhUEgUJdtlOSeU+2EV4OQtGid2CmFtuKzaINGYzV5xw/NM8ayMx2PxREk4+K5jNq/dyY1GQ16/TX/5dRaoxubm5lsLfBW0W1Sr1eSg12o1UUZ0PfWAjslkMte3HQ6HZbiu0wyS+gHTAjEMY27uo5Y1Go3OTbmJx+Mykclphc9EgWEYuLi4gGEYsCwLxWJRJgRpzu1cLieEaDpJwySCU2B4g/HkZrOJZrM5FwPVE5mi0ahQa9gvo2QyubDX+32h46201DudDhqNBqrVKgzDQLPZlJmlVKKcxhSJRGSsHPB6XqsTIKUHp2oBkBATL1Ly2nOyldvtlguLQzr0JUolC2BpzKck6uMsBODV+dLnSvM7tVotdLtdRCIRoSuxK1AdFrnKW75WgXLxAFyyKO3K8SprVP9bwLkBHXQjaXnS8uDDZZyRClTTPXCTagsUuJzFWzY4aIM3Ny2QXq8nlQN0MylzLBaTn2mKB6cVKC3Qbrcr2WzLsoRRUie7otEoOp0OotGokM/pzenUlCOCFi4notPypHXH2DIpHPQwaDuclpVjC8kUyT2r92qv14PL5ZJEEi/7VYDehZ5cZN+3+rsm5aN1arfih8OheLfLUqA8/6QaAV6dL4acqCRpqXMttQVqv0B1EvGdFCj/8aIsPF/brU77uDh7Jt6peB2VPRUmN6E9FsryIH2A7DFQZuoHg8FSeXvs0PS/vJXpJne7XeEr19Qe+nNQga4C2j3jQdeupi5z0Z+Bbqe+jJxW9lpOXqg6jMP1HI/Hc1YSBy+vElTw9pAT96zb7ZZ4ODmSOPiZg4ydBJ8bFSfPDNeY4QOGvXQ8n+tvP0NUxMsE/4a+8EiB0uv1MBqNZFwhADnvWk/Y96XX631jiOxaBUqzGMBCRXid0ly1BVqr1QC8rjPUrrFlWXJYuJCMI7lcLlG+3KwAhAyLDyYejy9dZv2Aadm1Wi1YliXshnzonJadSCQkU6itJ6cTSVzLVquFWq0mJTYMNVCBejyv6JebzaYclG6367g1r2FZFtrttsjKtazX6+h2u/D5fOJyejweFItFobRlNn5VaLfbqFarqFQq8tXv92GapoQhONV9MpkgnU5LyGFra8vxsXvaQrSzq7K6hc+cMcXpdIpwODw3Y1WDZW7LBC8+fQ4YtqvX6wBehzr6/b7QGqfTabRaLbTbbbhcrrlzTtbZ6/BWWXh+vyq+qQm5rsvCOwFNv2q3Pu0Wpma+tFugOonEOI1ToPWpE0mUm+4yDw6L6BdVEzgNumxU9rRA9Rrr+aX8OZ8DWT1XUS0AzCe8GBbR8vDwkvzMNE2hduj3+ytVoHzO+ov7gO46Qw6hUAiGYQg3Fo2BVUFzrmsXXRtMrLHVhsGiSoZlW6CL9hZL2fr9viTdPB6PrKs+a3pfvI2cb0UqR+W3iDxu0e+/6X2WCcZZdDxr0d+9KuTgcr0mxbNz/SwbuoxFHxJuTl0IbP/SU9+1AnbyIFG568uI66PXkZuYbp6OO/f7fUd5mzRM04RpmuK6ce0Y8+ZaUU4mHIPBoJQ0XTc4etmyMo6skxasEuA+oGKyLEtKrxgiWQVms5kk4U5PT3F2doazszPJaHM/6NrlUqkk4ZuPP/547v2cWlt2j/X7fZycnODs7AzFYhGhUAjpdFpCSgyZtFotlEolSSRvbGzMKeM3yfnWrJyMH+r/pnWhf5+Hy15I7xR0hs3OErko2aXbOfUiaV5pboZlgwFvneSiotFF0Qx6a6W5yGLlxHinQCut3W6LYqKFxCoB/ayn0yk6nY5YzbSawuGwI6EQ4PVeLRaLOD8/R7lclvACM+z2agVaIbVaTaiN8/k8ptMpotGoFIE7hVKphLOzM5yfn6PVaokSZemXy+USpcnv5XJZMvLVahXhcFji404qfMuy8M0334jy/Pu//3ucn5/D7/cjlUqJAqIl1263Jcvd6XRw//59bG1tAbisQ5YJ0zTx1VdfoVQq4enTp/j5z3+OZ8+eIZvN4sGDB0in01Kdw5bi3/72tygWi9jf30c6ncbe3p6831IUqLYwF73mf1/F+34Vu+cyYbdAF2VVqeS14rTHZHUrmOavXiY0FxLDCtoCpcWhrU7KruXSStVJLKrvo3z2umAqfG218svJjDZ71hnzZjXDImZFhiRogXa7XSm9sSwL4XB4rlZ42WC4idUMtCYpqy5d06R9w+FQYvSsKOj1epe42p2QeTAYoFKpiAI9Pz/H+fm58MGzmoVNDNyTwWBQKI+pQGlcOYHhcIhKpSLW5/n5ucRAaSlzHTudDtrtNkqlkiTpWNesn8F1uFaB6uDvogTSdWVM19WBOvGAKStJr6hsAoHAXMyTG5RBbxYjs09Xd/5ot3SZYGxZF8Izk8myHxLGacpiMiFSTlrJ71MIfBMwzEBZyctkBy8sBt+160mqWKeg15RyeL3ehQR4etYAGS0Z2tGXk1NrqmUFXtNG0+okaZvf75c4OLPZdO0ZcrKHe5yC/lskigOAdDqNjz76COl0Gt1uF9VqVeqC9brrqgKnWGQpJw0Tt9uNQqEg3UYPHjzA9vY2qtUqXC4XarWahGtYSsYv4GZx2msVqC4iXpYCdSoLz+Js3fLIBAy7d+imUXFSOUWjUSH20krKqcEHdOHZ906XJhQKzVUHsA6QskajUcRiMZGRn8nj8Uh5C7C8+lVdW8sDQLZL4DXZnM/nm6M15iHhzxgCcLI0TK8pi6LJxsk9wOJ57RYDr/ckS5uYSHKqy4uyMmNNWfP5PMbjMaLRKDY2NhCJRGCapvRz80IC5utHgddEhMDyEzR8f4aOwuEwPvroI+zv72N3dxd/9Ed/hJ2dHdTrdTx79gz1eh3tdhunp6dot9uYTCYwTRONRsPRMA7lZAVOMBjEZ599hrt372J/fx8//vGPsb+/j1KphK+//hrlcnmuxVd3rd20MeFaBUrlYa8D1V9XdR/pn9uVphO3OmVlrEu/5sZjnRpLK6icNNMlkwx6SMqywYNLhaPH1lH2UCgkctBCIgMjLVBaBcyQE8tSoDrUQKtsNpvJxeP3+xGLxST+xQsKgFhzdOd15YAT0DFwghYoAJkUxC6lQCAwF3Pmv9MWqFMWnX7+wGsLNBwOYzabIZFIIJvNIpFIIBQKSZyblxFL7Liv6Y04aYHqsJbP50M6nYbb7cbe3h4+/vhj3Lp1C41GQzrlyuWydFWxRIyfw0nwPJAqnNOr7ty5g/v372NnZwfJZBL9fh+xWAzVahWtVgutVmvOCr3pPr1WgfIg2hXoVb3wV1mjVynSZYJWEUsp6IIz0cFSIHuMiTStgUBgTpnq+stlg2tAOagI4/G41KjSGtWyhkIhUQKklWXpGDeOE2Aoge6j2+0WGdPptNSkMubIDcwLbBVlbDoOSM+BlrDL9ao/nzWe7DFniRWtUWbenXaJaSFyTe0WOTnik8mklFr5fD7p8WcNqz2n4GRugTNfub7hcBherxepVEpqRTlTlxluUgvTQ3EyjKPl5DngBe/3+5HJZMRLDQaDSCQScrHr0Igu1boJrtUOeizWm+pAaXUCVytW/T7LBmVl2QTjbmzPXDRjkxuYi6xjTzr2uGzwAqJbrnnB6SbriVF8uHrjMmamJ/I4Zd3R+o1Go2Ipu91uxGIxbG9vSz85pwf1ej1Uq1XhBOdhdyqmDLzuRNHrqNcrHo9jZ2cHsVgMvV5PGgGY2WaPuZ1D3AlQiQQCAUQiEQyHw7kBvrlcDnfv3kU2m0W73UYoFJKxjKenpzAMQ7LvOtHohLxHR0cAgHK5jOl0Kvtgc3MT0WgUt27dkiL2QCCAQqEglxDnIUSjUQyHQxiGAeBVSGjZ8xBOT09FTnpj0WgU9+7dQzqdRi6XEx0RCoWwu7uLVCoFn8+HFy9eoN1uzyl6XlxvkvNGFiiwWIECmHPVrxsmQjh1gGiB6tZHbYHSmtNtkVRO2vLkl30i9TLBtWOrGJUjLWQN3eGjZdJlWAAcO+yUV8eFGUtMJBIoFApIJBLo9XoIBALSRcNeZyp/vs8qLFBaSRwa4vf7ZcAvZQUg5UCmaUrsWe9Pp9aUe4oy6hCN1+tFLBZDKpWCy+VCMpmEZVnyrOv1unQm0Y3XX8sGqxu63a4kYzkwOZlMXmp91cwO4XBY1p/xet1ODSzPoKJyZgwceLX30uk0CoUCksnk3N/iIJ5GoyE5Bl3ponv9+V6LcKMYKIC5Q3CdBXqdAnXyAPEDulwuycABELdMTwqiBUr32J400pQZTihQrqvuyZ/NZnOunA6H8GDr+lV7za0TB4hKiYecGct4PI5AIIBkMilDkznYmUqJsS8dt9UThJYNBv2Z5KBrxgMciUTE1WQohHum3W6LrPYvJ0CrZjgciqza46HVTFBJzWYzmcQViUQk9KRH2y0b7Ld3u1+1OXOCezKZRCwWu7RGZEpIJBLY3t6W19lsFvF4HNFo1JGaVco5mUxQKBQkA5/JZCTMpME9mU6nsbm5ieFwiK2tLeTzeaTT6bnKjOtwrQLlplyUQAKup/HQP+fv6vdYNrQF4na75QABrwfjslyBClS7xZomQyssJ8ADZF8fKnkqJG1h2kFXg647Xy8TtOqHwyESiQRcLpfwyTCmqBGPxxGPx5FOp8WFpvJymoKEe9Xn86Hdbktmm8o+k8nMrWUsFkMsFkM8Hpe9QZfa7/cjkUg41t1FWf1+PyzLEq+Cno+dtoMWXSwWk99Pp9NiUTvlKQEQbqter4dUKiXjAKkI7Z1QfMbRaBSpVEqqLiinTpQuExyZyAu90Wggk8ng3r17ogc41pJhM5fLhf39fbTbbWxubiKXy+E73/mOfCbWC1+HpdWBaqUJYKFi5fs4Dd1xwsWjMmI2XitQu/XpdH8xLQV9AekkzU1Al08PtF22y8l1oIXD5BUtiavg8/lkKj2tTietTw1anf1+X+SlYlwExvRoBbL6wckpXARDDHpGrdvtvlJWrjtjc7RAV3GmQqEQNjY2ZEIY66Xtz5RrGAwGEYlExO1fxbMHIOVgvGT0cxyNRkJsp3++sbEBj8dzaZDMTdZ1TWu8xhprrPGOcK1qnuQaa6yxxv9vWFuga6yxxhrviLUCXWONNdZ4R6wV6BprrLHGO2KtQNdYY4013hFvqtdZmGE6OTkR1sh6vS6cOCzJ4TBa1q7Z6wUVlll/sVBWUvB2u11p32M7InukC4WCFFpfwxK4NFnH4/EMwJWFuoPBQHh82Bkxm82QTqexsbGx8D2bzabMPbx79+6yZH1jhvHi4kJe8+8DwGeffbbw91utlrxOJpOOP3/gVc1sr9cTHpxIJIJsNruwtIbzTjkTVGFpsjabTZFVt0tr2NZp4e/orjVdrxgIBJYmq2VZMwDXltlxGEckErlUw6qhqT2YvPb7/Uvfq2wp5uQyotFooNVqIZ1Oz62pZVlotVqIRqOX1lrNkl0o51sXPGoaCj0ImAvCWkv2czvVn30TsMBcDwLmTEJOQPL7/XNsnKvAojrT2WwmvfqkGuDgXSpQr9d7pQJlIf7vKng47UpRM3NybFkkEpGOJRaFa8XA6UZONVL8U8Kipg+NdruNFy9eoNlsSo0qC9XttcK6u85J6JGUhGVZODw8RK1WQzqdxt27d5FOp6W1O5lMLizwf69OJDtms5lMwSbXOr90yyEVEmcvroK33I7JZCIDGMgeyCnlLALmg4xEInJgnOxAWQQWwZNBcDAYwLIsFItFmT7Oy2kwGMy1T2qwKHuZ4NxKAKhUKvL6+fPn8vqrr76ak4EoFAryOp/PL3yfZVIIk56BB5dsoGdnZ8Im+vLlS7E0CoWCWBx7e3tIJBIAXvNmaa6fZct6ldX57/7dv5PX/+k//Sd5/Sd/8ify+l/8i38hr7VMTnUiLVJ2lmXh/PwchmGgWq3i4cOHqNVqiMfj2N7eRiwWQy6Xw4MHD+ZoUeyD1ZcJTqriXAuiUqnANE2cnJzgpz/9KU5OTpDNZmUI9ObmJr7//e/PWaocF3hdJyDxVppCT2zWRGh6chDbn9iQz/mKq2YP1Ape01FoNkttgXLe4qqZDjk6azAYyFBXEo1RgXHThUIhYW60T1rnpfC7Ch4gdr74/X6hYm6322g0GiiVSmg0GojFYtJXPh6PkcvlxGXnxToej4WeAliuAv2njuFwiGq1inq9jnK5jJcvX6JSqSCRSGA8HiMej2MymeDWrVtCw32TvvL3AT0QO+8VKcLPz8/x/PlzHB0doV6vw+VyiSGileRsNpNhLTdR+Dc+cRzmaqcM1qP69fi1D6mUKKP+vkhWj8cjrjut5eFweCMulGVBk8OZpgnLsmCaJprNJizLmps/oFkj3W73nMXpVI/xPxXQXWR7IZ+f5jLntPHZbIZwOIzJZDI3eV5zmHu93rkB0Wu8Bodk81wxxESrnUNldGux017oIj6o2WyGRqOBWq0Gy7KE9cHtdsuwm2w2K2EHfjYO5rlJqOFGWm00GqFWqwnHdqvVEq5twzDm2Bm1W8wPREsqGAw67sozsUUaCco6GAxgmualvmMAc5aeaZoi6yr6oYfDochJdkbDMITGQY+tGw6HyGazMuFbK1Am75YJ/X61Wk1ef/311wtfb25uymvGb+24f//+MkUUcBqPHbTo2+02yuUyKpXKXAyUl6hWnkQkEnFEgTYaDXmt6S30mpVKJXl9fHw893kIbRXrBN41Sdu3BmXS60OKDp4tjqcbDAZoNBqwLAuxWEwYRvXMUv0duHpM3Nti0eSsWq2GFy9e4OXLl7AsC16vV+KepGT2+/2o1+tz07wYF70JrlWgNIt13NNugTLeqYcp68SMdvs5ZcgJ8EEzaaDjtJw8TnnICujxeOYmqGuWTCdl1aCFpA86Y3ZUoHQnIpGI8LU4SWP8/xO0BUoDgGSDo9FIJpgvuthX6Yn8YwXj8Bwy7na7xQLluSIBH6sduJ/tFijwmtBPExQuA4ueX7fbleoU6p9wOAzLsmAYBjqdjlBfEww73nQwz7UKVBN1MT7X7XbnFCgVE2McVEq81Rl/pIntlFLSdAf22Kc9bmtn6dR865p3fRWZWB5uHnAqfx1uoBy8DPj/GSZZYx48yKQMNk1TONfJe9Pr9TCbzcSjajQal6b3AJez+r9r4HroGZ5cX5INcjIY8DpPwn1K+hE98JzMmU6CFjHlIIMCDRImbGezmVyirHR5m3zCtb/FjGmv10Oz2ZQ4UrPZlAA7v3u9XnHlAczFlhhv4qh9PpRlKlNmYXu9ntSodjodUUo6kcS5m1Tw/BkXnJPrNX2vU/FFclO3Wi3U63XUajX5GfnKGdOj28QSDcuyrszoLhsnJyfy+uHDh/JaZ+T5DADgl7/8pby+ffu2s8LZ0Gg00Gw2USqVcH5+jnK5LDXAjNPxEg2Hw/LZOp0O7t69O/de9nmXy4AON5ydnclrvX46fEK6CmD+OeiQiVP7YBGD5nA4RKvVQq1WE5K5eDyOfr8vtbbNZlOeQzQanVtHp6hyAMjk+/F4LB5dq9VCMpnE5uYmEokEKpUK2u22sKJWq1UcHx8jGo0in8/PcU2xvvaqi/RaBUrz3Z6QocXEBIjmJWc9o3aHeUvxvWjOL1OB0gxfZB1r95zzQBnbogVqt0RpSRNOKVCuD9fWboHyYWpXVFuga1yGrmTgd7JZ0tKgVcJLKRaLLSwD+1134ReBbjgveM775HnjGeReXRRuciqpTKVH3UM5yM2UyWSEfsbn80lppmEYlyoFGKoA3lGBalpb7QYz5qGDwiSS0j9bpJy0UlgmtKzaDddlVvZgNoCFsmoF6mTSixzWvJT0UGQSXOkYKP+NztyTonfVdbb/mNFoNFCtVtFsNmGaJrrdLsbjsSQx9R6YzWZot9sykf5tOMF/lzCbzcQLPT09xenpKU5OThAOh5FMJhEMBjEej8VLbbVauLi4gN/vR7/fRzabnbuMls2JREynUwkztlotVKtVFItFjEYjRKNRtNtt1Go1qXKhnPSgt7e35+jc36sOlBYomRYZW1ykTBmro9Zm6RJvAf5/usfLBuO1g8FAYjO69lPXrFLZ261Oxm4oqyZ5c6IOsNVqodlsotlsSrE/M5rBYHCOPI7tpyy0D4fDaLVawifulHzEb37zG3mts8XaHdWdXL/61a/k9YMHD+T1p59+umwx51Cr1fD8+XOcnJzI4Wi320LBy1ANwzqj0QgnJyeoVqvodDooFArY3d2VyfZO41//638tr//rf/2v8np3d1deP3nyRF7/m3/zb+T1xx9/LK8XudrLhGmaePjwIcrlMp48eYKf/exnePr0KfL5PD7++GNks1lYliX72e1245e//CWOj49xcHCAVCqFvb09AJjj71q2Ah2Px6jX62i32zg+PsbDhw/x9ddfIxaL4ezsDLFYDIPBAK1WS0qwIpEIzs/Pcf/+fdy5c0eK/2/S3XdjC1QnWKh4qDBpKfFmB17TwvL/MwvmlFVnt5avklVboVrpL7KWnZKVm0eHQ9gWy/Wj8rTTqCyyQBmYX1uhkBh9tVqVBJKmwCDdh862ttttdDodxGIxNJtNJBIJRCKRlSjQfypg8fz5+TnOzs6k5A54FePmmWEYqt1uo1gsot/vIxwOwzRN8T6dJJdkgsuyLLE2uQ9GoxFCoZC4+bPZDD6fD6VSCYPBAKlUSpLRxHtZoNS+7CRidxFpSnVGm3Vi/L6I3ZJV/04snp12WTNYasI5VgqQ+0jLZZdNXwjLBJNp9soAcrXYeaSocFkETLkYP2XDwu9yIT3By5KF0MFgENPpFIlEAhsbG4jH4+h2u9KpBEDWn3taExKu8Qo0Mkj/nMvl0O/3cevWLTx48AC3bt1CrVaDy+VCvV4XHaDLBBkas3cLLRPadR+NRtja2sJwOJQ200QiIU1B4/FYGi9YMWCvX34vBcpNxNY2xuLonlOZsvCU2TVS4JIaVhO2OcV2yfekcmR2kMqebrCWleRhVKZUWtpKdSLcQA5ry7Ik3EBaXdbRxmIx+Hw+UZS0mPnZuAkYCI/FYhJjWlbio1wuy2v9zP7ZP/tn8vrWrVvyWmeI2ZCgP6+TWOQtcbYBe99/7/d+D/l8HoZh4OLiQjq/+JoxvG63uzIFqhXJv/yX/1Je/6t/9a/k9b/9t/9WXv+X//Jf5HWxWJTXTrvwjNd3u12EQiF8+umn2Nvbw7179/AXf/EXODg4QLlcxldffYVKpQLDMHB6eioJPConpxpU+PybzSaOjo5wfHyMyWSCH/7wh/j+97+PQqGATz75BIVCAZ1OR0I25XIZX375pbT51mo15PN5eL3eS+3Si3AjXnhaR5yw5Pf751qdqJRYeKx51t9k5S0LmjZZW59UqDrzrq1Pu8Wq4QTXOvDaAmVdIuXieofDYRnFxT55bSXZLVAWhbPk4ncxc8zPri1Qtr/OZjPE43Hk83lsb29LDzwv/Gq1CgBigeq1XOMVtEHh9XqRy+VkEMu9e/ews7MjLnA8HkexWESpVLpkgTrh0QGvnz8tUHYXbW5uIhqNYmtrCz/84Q+xsbEhw1BM00QgEMC3334reR6WPTLc814KlO2YVJ6sR5xMJvD5fHK4aR1xQ3IyEDObvHW0xbdsaFkBSG0nZdXfGWagJcqxZrSaKSNDEsuGpn72+/1SUkFrORwOI5fLiQLVJTicEMRnQcW/Cjrmf8zgJUSlac+kp1IpJJNJmbpEi208HiMWi82Nt9MdN7/rI+2YGOx0OtJc4vP5ZBBHPp+XWHEgEEA8HpcSp1AoJDpBJ5edgH5OTAbTA47FYohGoyInfz4ajeS8a72kL+E34doTx+Go3Fy0eEKhkAxaoBVF15OKNBqNSiF6LBabU1hOHHSOTGOPOBMt5N1mIT+tZSogFgGvUlbGKjUnubbg4/E4dnZ2JGPIAbHdblcGLfOwa37uZVueVDYA5saSbW9vy2s9au3Zs2fy+u/+7u/ktVNWh4YafItUKiVNHVyXra0t7O7uIplMIh6PS/IoFAqh0+nA7/cjl8tJPSiz9U4U0v/85z+X1zrb/v3vf3/h7//whz+U17/4xS/ktQ6NaIt5mXuWhf7lclku8lQqhTt37iCZTCKfz0slht/vx87ODpLJJNxuN549ewbDMBAIBMQQAF7F8rmuy/JGdfy/2+3K2MJ4PI6NjQ0UCgW5NL1er8gYj8dFwdJbYYiSob/rcCMLlDM96ZJra47uJQ8xO2fC4bBYVZzRp+OkywZvF1rLXARanFpm3d1Dy5MK1C6rExaIjlVyjfx+PyKRCHw+H5LJJHK5HBKJBHq9HrxeL/r9vnQfMfasB9T+LlufwGslrS9wthh6vV4kEgm5EPx+P+LxuDR9RKNRuWxpgeqKB+B3t6WTsWwqT+qBTCaDfD5/qQMqHo+LURIMBuUscS11mzfgTC88/wbzCtFoVHQZoT1jnnmv1zs3CP69LVDdv8q6SA6b5aLwux6o7PP5JHlkV0pODWigy0aXg33i0+lUEl3aAuUhCQQCorgYetDK1QlZGURnnIVxTFrCyWQS6XRa1pKdM8CrS41F4VxXbobfZehZC1SUVKC06vUhC4VCUlydTCYxm82QSqWQSCQQj8dlr/+ug5OdptOpeKTZbFa+7PuORlY6ncb29jYmkwk2NzeRzWZl6jvPnhOIRqPY39/HbDbD1tYWNjY2kMlkLpWk+Xw+RCIRZDIZ7O/vw+PxYHt7G5lMRibq30RG1xu0rPxPxjA4OZ2uu46BMnakLVC+vmIzOsaJw3IUDg1guIHZ2UWyviHztnRZTdPE8fExWq0WwuEwMpkMQqEQMpnMwvUiLUGj0YDf70cikUAgEEAqlbJz0SydZ0b3tmu3U0+b1/jtb38rr/V4NZ21hwM8U91uV3i69CWYTqcvxUU5cOT8/FzmChwcHMhh01N5vF6vI3tVnz89wk73uWvozLv+HV0tchV/zztiBrxKznz77beSpf7ss8/k0iLTg73n/ZtvvkGlUhEKDa6/Lg9coqwzysKqCobCKBPrf5lzAF7piaOjI2nn3draEl40/Wzcbvf7cSLRNWJJ0yILlEkNWqBOWnFvApMqDHprC1Rn6SkrKwdWWYweDAbFEgqHw4jH49ddNhIIZ5kNZV7Xf762QIPBoLiPOga6qD0zFAphMpkgmUzC5/MhlUrNWSpMJK3xal21BapDRjRUvF7vnALd2tqS56HX30lepGg0ir29PUwmEykLJMj6EI1GRYF6vV7s7e0hn89LOE/L+aYyxt/tFOMaa6yxxnvgTS78GmusscYaV2Btga6xxhprvCPWCnSNNdZY4x2xVqBrrLHGGu+IN2XhFwZIi8Wi0GawZITzKl0uF8LhMAqFAkKhEOLx+HWDDpaW8p5MJjPg6j7wwWAgXTy6rzeTyVxZMtJoNITt8N69e46VXC1CpVJBp9ORwt7ZbIZ0Oj3XEaTR7/eF7XFra2vpZUx2cBQfqRHYd7xo/VlSZs+KYonPv1QqzYBXWdirBiI3Gg0Zr3bV/FSOCGRGWX2epclqWdYMgLQ2L6r8aDQaaLfbiEaj9hI1AUsL7SPinCq5YhULyxP1zznBSleEsHSQ1ThXYOl7lYPU7e3N7MlnyaL8w38Yb8dJbW9Txri2QNdYY4013hFv3f9H0iY98Z3skZyA4/f75+ZUrgKLLB+26k0mE6EZYD8uhwX4/f4rLVDWEa4KvDkty0KlUhHyMz1d6CoLlMOjlwndX67BMXx6LFg0GsVsNkMkEoHf75+zAim7k8M5+PfsveuaMrpSqQhlRz6flw40LavX65UaUqfqlynjVZPJ2u02Xr58KYRsvV4PkUhEWlQJbTGtotaaHXT0iijr2dkZDMNAJBJBLpeTddU976uE7iJjHW+73cbJyYlY9RsbG4hEInPtvu9SA/5WCnQymaDdbgt3eb/fly4EtkfygLD3lDMZV9mrzXmQ7JoaDAYwTROlUkmoP7hYw+EQyWRSpstoOEXrwKnXdG1Z5M+p3fqwa1nb7Tb8fr+0pml52WWxTJCVlcXQHo8HvV4P5XIZpmnK7MVWqzV3eBKJBPb29pBIJKRomi3AmlSQHR/LwCK3fTgc4smTJ2g0Gmg0Gnjx4sWljpN0Oo2DgwOk02m5MJ3eq1d1mXHEWqVSwaNHj1Cr1RCLxbC9vY1YLIZsNiv0GQCEWdZJcK/qUAOHJhuGgZOTE/zt3/4tzs7OkMlkcO/ePaTTaWxubuLzzz+fey8aWte4ye8MGmpUhPrM9Ho9HB4e4i//8i/x4sULGW23ubkpMi9aRz3O8qqL/8arz35sbX1qziHG6WiBMtag+ZFWBU17QT57zdKoFzgYDMoMQPshdMoC1cN/OSZMU8JaliX0xsDrh+f1ekWJTiaTuWlJeq7oskBrnXEvrpVlWUIZW61WUa/XEYlEMBqNEIlEMBwOhWOd8S92hWk20WUq0KvkbzQaKJVKqNfrOD4+Rq1WQyKRwHA4RCKRwGAwQD6fl1GGH2poCGP09Xod5XIZL1++RLVaRTwex2g0Qjwex3g8xu7uLhKJxMoGyPBStk+RJ21HuVzG06dPcXh4iEKhAI/HA8uyFq4jdYQTM4G1t6TfW08xe/z4Mb7++ms0Gg3k83npSLzq3OiW0/dWoFREZLwjdTC5eTjJhGyWw+FQFCgDzKuarUjlyV7nTqcjFhOtOj7EYDAI0zSFLkNbnAzyLxtU1FxDDprVtMXktddDqMmdxAtL4ybTs99VTiYN+Pw0xTLXlhOixuMxQqGQMLV6PB5x49hSu6r2SD3El3QU+nLlXtbsrR8K+vnTK2FygxTMnAW7SlAR6rNLT7TZbMolz/NP5UmeKV7yNK6cYqTgZaLfezgcotlsotVqwTRNOd9ut1uUfyAQWGg8AbhRaORGCpQ3ebfbFR5tDhQxTVN43zliDZh34TudjiirVfRt0x1utVo4Pz+XkANdJN23PxwOkc1mZQNrBcqKgmWDii4UCsmBmU6nYtVZloV6vS7WMpUXaXcZZ9S4Lvv8rigUCgt/TtKuVquFSqWCUqkkn4WZdrpr9vWLRCKOTPmnUqaCZCyZA2ToCQ0GA7jdbqkeCQaD6PV6GI1Gly5LUlgA8+yj7wtO1qKH43K5MB6PZU05snA2m0l1hWEYiEajczkFTYzI3wew1Et/0XtVKhWcnp6iWCyiWq1iMpkgHA5jOp2iXC6j2WwiEAigVCohkUhIzJRnzgnYs+rT6RS1Wg0vXrxAuVxGqVSSKVFutxtnZ2eo1+sYjUZ48OABUqnUXDXDTYnvrlWgtNa4kWgZ8dDrJJImbNM88rRAeaBWoUBZPtHv90WR6u96GlMkEpHEwocIeNPl4AxTWs780sNb7DTNHwpcX4ZIeOA9Ho9MI6cFaj8wTlkgjNWxtIffaclp5lWGTPjv9O9p0EoFlqtAabVx0A4H8mgLVFO3MMfAOLed+FAPNgeWq0A1uO86nQ4Mw5DLHoAww3Y6HXHv+VrHPVfhhTIH0u120Ww2UavVYFkW3G63eJqGYcCyLGSzWZl1ypjy2yTlrlWg5O7RsU8qQzs3PPA6OG6nB9a866ug3+XhpjvMGCfl561NpcTf42Fadeadf5+xxU6nM7f5aIEy821Z1srnfzLRRdfNzmXvdrvR7/cxnU7FU+GEHrsV6kTGmOvBC1vvOR3y4N6j0uFe0bFZwqlJV1RwOulKa7PT6cge1SPXuE94wTLLTTlXNfWf4RuGmGazmYxVZJKQYRPug0AgMEd6uArQqjcMA/V6HePxWGaS0qrXZ54MBppc8ia4VoE2m00ArxQoC6Z5uHXyg0kianBuSroo5C7naDluIKcUVafTQbvdFnIpJmQYD+VCeTwemKYp8zU58d0+ZdtJkL+60WigUqnIbcnvWlaPxyOZceDVPEinEzFEo9FAs9lEsVjEy5cvUSqVJJTDQzObzeD1elGtVnFxcQGv14vRaIT9/f2593LiIFERBQIBmKY5dyn2ej1hVeA+pKWnE2J2y41u6bKx6JmNx2O0Wi3UajUpAielS6vVku+8vOwek1P0M4QuX2SIqVqtIhgMYnt7G6FQaK6kaTgcSnKRfFTEbDYT42xZhgC9BxpotNhPTk7w5MmTOVZOVg7U63W0Wi3J73Awub7U3isLr90cnXm3M+1NJpO52XmLLFBaKfwOOKdA6QrrhAwTX+yMYICeVimtbE60XxV04ojWJb+zw4uxZf4OrdPBYLAyBcqEnGEYaLVaojx1EoyhEW2BLpLPaTeOz9a+R4HXFiitTR2KWhQWWZU3Qou42+2KAmA4jPtU7+lFisdJC0+vKfdst9sVepRkMgmXy4VKpSIhKXpVdg+EMdtlwn7R6bhyo9GQUsXd3V2JQeukLGmJ7O/5Xll4TY+h+bapHBmn0cXeAC7FnPjvuCGcPEDkr9YZbsa3NCeSNtW5KfQGXVXVAC0gy7LmZKZsuiyDiS6dpX8b+oH3QbPZlDIbcn2TWoQBd8pMwjYmDUmCRzjtytVqNdRqNVSrVZydnaFWq8lhZnwReLVPmY2l7Ht7e3Nr6aRVN5vNxLo8OzvD6ekpTk5OEAwGkUwmhTmSoZtWq4WLiwv4fD70ej2k0+mVKXhaoLxIi8UiTk5OYBgGPB6PXKyVSgWtVgvBYBCVSkXaKbWCcqLwX4dm6BG1221JcgaDQRwdHWE8HuPk5EQqclqtForFIhKJhKw5k7E3Of/X7g4G0KlU7LWfWpny4CyyPPv9/lzckbePrmNcFq6K0QGY6zDhgWHIgeU4rVZLaD6u6pdeFsrlMs7Pz1EqlURmlgQBr2vvqEQnkwkMw5D4GPnMSYPsFFqtFg4PD6U7hvJyijvL1fr9vjx71lyapik3v8fjcaTcSsM0TTx+/BgvX75EpVLBw4cPUavV5rKqtKZoBAQCAZyfn6NeryOVSmFvb2+OeNBJWb/99lupUfzZz36Gp0+fIpvN4jvf+Q4ymQw6nY6U4rjdbvziF7/Ay5cvcXBwgFQqhdu3b8tnIpxY39FoJF7F2dkZfv3rX+PLL79EKpXC+fk5UqkUTNOUzjTTNBEOh6Xa4eDgQOhfnEgmU9n1+33U63VYloWXL1/i22+/xZMnT1CpVDAej7GxsYFqtYrnz59LiOE3v/kNms2m1NhSgb53GZO2QHUyiBuPX9oKpaLUbjwPFV14Jw8QrU8qfLqXAOYUJ/A6I0wLlFYos99OtR7ShaC7zsQRLyh73IWHn5llbYGGw2G4XC4hpnMClmVJNrPdbsM0TXS7XUQikTlaEt06Sys1Eomg1WohHo8jFAqJvE5hMBigXq+jWCyiUqng/Pwc1WpV2ksDgYC4y9PpFIZhoFqtotfrIRwOo9FoIJFISPeVk7IOh0PUajWcn5/LV6vVEvdXVwz0ej2xljgQhbFee3ePEzLrOlXDMFAulzEYDKQ8iB4UB7b4/X5Uq1W43W6k02kJBxJOXUysWmAehMOAms0mXr58KZZ8s9mcawbg8BjGZm+KaxUoDzAVDR+U7hPWySOd7LArKwBzinbZ4ANijFa77XRxtTxUUrRKgdebhE0ALA5fNmgRM/GiC85pzS+SVXfLcPaADqc4BV5CTMKwxjeRSGBzc1Pol5nZpFz0QLimuk7YKejyqUAgIAR9sVgMGxsbiEajUr+sJwXpciAmPZ0OizAWyAxwLpdDv9/HrVu38ODBA9y6dQv1eh0ejwf1el3I0OwGDSnFnTZMmJSlJWcYBvL5PD799FPkcjmYpimEbtFoVGZisNyNRpSTe6Df76NaraJarWIwGGB/fx/j8RiZTAYff/yxWPXb29vodDoIhUKYzWao1+vI5XJCkrmUOlDNX85WvMlkgkAgMDdQgEWy9tY9KlQGlXVsdNlot9sAINYRS2qYVaMF4vf7RVHSwtRc8t1ud45KWK/BskALVMfjeNhjsZiUfbBlk3WNdjZRlhaxdZaJhWUdJF5KvV5PlKjP50M2m0UqlUKhUMB3v/td5PN5GIaB09NTaZe9uLiQRBiTYquoAWadJGcw3Lt3D6PRCBsbG/j+97+PQqEwd9Db7TYuLi4kc8xY3ipKbhiv63Q6CAaD+PTTT7G3t4f79+/jL/7iL3BwcIByuYwvv/wS5XJZ3Gda94yZA8vLZtvBMF6z2cTx8TEuLi7Q6/Xw+eef48GDB7h9+zb+9E//FLdv30alUsE333yDarUK0zSF7ZSxUZIiapbWZYE6pdls4ttvv8XR0RHcbjf+9E//FH/2Z3+GZDKJ27dvI5FISLnVZDKRjPyTJ08QDofRbrfnKojedJauVaB2V1d38NgtUFqdPOC0oOwC6NKAZYIbSdcA0gIFIKyXoVBIspo6FEHlvqjOFViuAtUWqA4vhMNhYQbMZDIIBoNzbKK644SVBNoC1e+1DOgQDi16ygkAqVQKm5ub2NraQrPZRL/fn2v903FwXejtJHQLKS91l8slVt3Ozo7QSLdaLZTLZdTrdbnYWcGxiilijMVqC5RxzY8++gibm5tIpVLodruIxWIoFosol8uXErpO8ppx/9MCbTQacLvd2NjYgNvtxkcffYQvvvgC4XBYEnDFYlG6lHTGnh2JTtSCcw1ogZ6dnaFQKODg4AC5XE4ojuPx+JwO8vv9+OlPf4p6vS7Kk/v0JhOarlWgdNVYqEvLcjweiwXEg6EpjDnFyO/3IxgMIhgMXrJOlw09cMPv98twV7pnTLRQgTKLzJjiZDIR2fQEISdl5XrQKqaFFg6Hkc1mZUAHOyUoNw8c8Lri4aYux9tAl3CEQiFEo9G5tUkmk0gkEojH45hMJojH4xKnpavMfeC0i0mrnsXd9H5YTUFZ9dg9yhcIBGR/8oA7GRKhcmYtNZ99OByG1+tFLpcTizIQCCAej0uJUygUknPGC9/JSgF7b3mn00EkEkE4HEY4HBaPiYhEIojFYmi32xJqsrvsTCY7Jae+sJlVp8x02Wk0sVKEdbTas77JxXTtyjOzy43GJAuDrVSgLFFi1tLn8yEej4tyoOvM4RxOuEdUPpyZyPgW/x5vIBYn87bhpBYmEfgZnJSV78luEs4lDIVC8Hq9iMfjuHXrFuLxuEx9ZxypUqlI/R0TS4AzXNva+k6lUhJv4/zEra0t7O7uIhqNIhaLYTQaIRaLyYCWQCCAXC6HWCwmn82pTq+XL18CAOr1OmazmcyiTKVSCIVC2N3dlbmvjIcyzh2PxyUhxzXkxepEe+/Z2RmAV1UYDI/EYjEcHBwgmUyiUChIM4fP58OtW7dkAtPh4SEMw0AgEBAZAYgCBpZbZ6s/v2EYqNVq8Hg8yGazKBQK2N7enjsjuVxOutL4zO098E4rUCaQcrkcEomExL4zmYx8HipQGgDRaBTBYFBCeQCk5BG4Oix2rQLlA2FMkLMS2SnBMWe0QLlYdEOpQKnltUWwbCyyQH0+nwzeSCQSsqC9Xg9er1dcTga4qTx1uMIJ6NAI5dUXTTKZRCaTQTKZlIoAZlt1jAbAnAJdNvR782JiiZfP55sr+aDiZ8ghGo1KtlhboFznZYMxcMbsmDyMxWKIRCKXaGUikYgoSMpH70OHc2hdLXPPmqYJADLEhLHldDqNjY2NS51wbIOs1+tzZ4nWPr1ChlyWGQ/VZ4BWMIeHJJPJS40SNLRoTdstUKdCeAT3GHMg3AO0PgnducYvWvL26iK+7yJcq0B5OHQsTLvzOj5HBcrDxqnUvBmpnJyy6rhpWFbDsh7eLKlUSiax8ACz06fVakkShoeJStgJ8EFSwfCg0h1iUS+nQTG8MJ1OEQ6HZXIQW8/4mZcNfv5QKCQ1u5wLqrPxBGUbDofIZDJwu93IZDJIpVKIx+Pi0r2pu+NdwCHDfr8fw+FQSqzYp21XKry4OJ2cMUgO2eU+dVLWyWQitZG5XA65XA7ZbPbSvqP3lk6nsb29jclkInLG43E5/E5mt6PRKHZ3dzEej7G9vY2dnZ2FrcTBYBDpdBr5fB57e3sAgJ2dHelDd7rpIxKJ4P79+3C73djb25NcwlUJzGg0inv37sHtduP27dtIJpOSAL9JT7zrDbfB3P+kZrcsSxQnv9szxFSaXq/3uuLppZNfsYCWU9JptnPiuB2WZeHw8FD64ROJBPx+P9LptL043VFZw+Ew0um0yLrISjMMA4eHhzIujMohlUo5IuvsHzZHp9NBrVa7NNyEB1iDE7CY5U6n09jf3xcFr9sqA4HA0te03++LrLocLJVKzVl20+lU2mJJNphKpXDnzh2xRJhUAoBgMOiIrCz0ZzkQ/zZpU5i5Jr755htUKhWZpE8FZuvbdnSvZrNZUVIAhConFovNKVTKyqnv/By6Esfn8y2VVM6yLCnmZzKWE5jsZ4rTo7hfqPxZuWOL2y+U862iz16vV4LwdN3t7ZGcX0kT3unkgR3BYFAsIQa0w+HwlVYvhzLwltJfq5A1FAqJy8PDcpWLG4lEEAqF0O12xQJliMQJ6LmlLKtihpujABd9Jhb203K1u05OzhsIBoMoFApSpkIX2W7VsU6USpbULjoh4/F4JMbolKy5XA4u1yuuK/23Gae3T7Pa2tqSIn+trJxIImpEo1HcunUL+XweyWRyztplHsHtds/JtLu7K+ET/Rn0HlhWOIeeQiQSuXIurjYW+do+R5dJpJtOZFqzcq6xxhprvCPe5MKvscYaa6xxBdYW6BprrLHGO2KtQNdYY4013hFrBbrGGmus8Y54Uxb+2gDpdDqVEhBmr2azGdLptNS62WGapoyYun379tLLLa5DvV4XwjMWytrLWzQ4zRoAdnd3lybrcDicAViY6Wd3F7lx7KUhGhy9p7tQ/gFLkbXRaMyAV/WdizL9ZL4cjUbS2rcInMvK0qtlywkA0+l0BmBuH9oz73oM36JMLctaWO9s+x1H9iqHPNvXmM82EAhcqvG1DzFf0PThiKyc3aCnsfHnuhGF0GMsr8m2L7WM6dpfuKIoXo/ivCbz/v5lTASHS3Q6HTQaDek/5pfb7b5SgQLOUzpcJWulUhFGRD1A5CoF6lSC7ar35UxF1qb1ej1Eo1EUCgXpqNKHjGMEneqY4sG1K3rOI2X5SqfTQSwWQz6flwYKO1/PGw7Re0PvKQ5a0QeG8yDb7bYUz8diMSm54+9xXOCqCNBYQqeHbLTbbRwfH6PdbiMcDs+tK+cRaJaCVZUJslecfxd41QF2cnIyt65sTV4VjflV0JeMnmQViUSQy+VkTdma/C640b8iCZdmZuRMxVKpJNSmhGEYUuNmtwKoYJcN1pVxRBi/k7fesqw5WbnpcrkcvF4vstksQqHQ3MHhkOBlg5tP0xwMh0MZqFuv1/Hs2TM0Go25h51KpWQSOR/8srngNRZ1N00mExwdHaHRaKBer+Pp06doNBqIx+PY2tpCLBZDJpPBRx99JLM4WbO6SlAhnZ+fy2i1X/ziF7i4uEAsFsPOzg6i0Si2t7fxwx/+UCxjdqE4Cbab2vcbifrOzs7w93//9zg7O0M6ncZHH32EdDqNQqGA733ve6KU7C2S+rMvC3oeglbcPFdPnjzBX/7lX+L58+fY2trCD37wA2xvbyOTyeD+/fuX1tJ+npxU/loXPH36FP/5P/9nPHnyBLu7u/ijP/oj3Lp1C8lkEnt7e5faOG86t/TGCpQj3siJQuXUaDTmFChnb1qWhVAohOl0eukgOqFA2dlA93c8HqPX66Fer2MwGAjdgGVZshFYFN5qtaSfWNN4aJ6nZcJ+iwOvO3jIzHh6eopyuYxIJALDMBAOh7GxsSFdShyWsWqQHbJaraJcLuPo6AjVahWxWAz9fl8mB21vb19ijvwQIK1tsVjE8+fPcXJyIsNDONrs008/vZJe5k290O8CTTGj35dsrBcXF3j69CmOjo5QKBTg9/vR6XRk/oSGnrVLWZdpPdspywlyc9XrdTx+/BhfffUVGo2GDBPhwG8NzZmm5XcCXA82UzSbTXzzzTf41a9+hWazidu3b0uHkl5TPYlraQqUpjvnaLIFjhwpdqUUDodl7BWnDBHBYNCRUWH8G6QzZRxMU2DQ7dSTi8jMp1sMiUgk4oiy522nN6We7an5zDVFNOlQ2Ktv39RXbfZlgiERTenCGFi/34fX650bkrFo8g6tGqctPYZD2u22zD1guzG9Kc5/vQp6NuSywFCGXXmQiluP5GPLaaPRQCqVkhZFgmfOiRmbwOvPrd97MBig0WjI8GyOO3S73TAMA5VKBaFQ6JKsxCpCeOyGq9frQuPh8XgQjUbhdrvRaDRwcXEBALh9+/YckdzbdHXdeFfQjbcsC5VKBe12G4ZhiIvEg80/vLm5KYpXW3VOt0kyTsh5gJyIbZqmcK3rgbuhUEioV+1uplNW3lXJI60wqew5uGU0GiGVSklsaZHrzrbDZbn1nEivNxOpMKjkSdngcrmE0oOTjjj0RMOyLPFYNjY2liIn8NotZsgAgHD3XFxcSDKQLca8ZMlLxUn2es4qLwtguQp0UbKtUqng9PQUZ2dncyP5ptMpSqUS6vU6fD4fSqUSotGojI0knLLk7Jc8E8fPnz9HuVwWTqRsNguPx4Pz83M0Gg2Mx2M8ePBAzr42sJzAIk+h2+3i8PAQpVIJxWIRgUBAxhg+f/4cxWIR9+/fx8HBgQwaWkRDZH9fjbdSoLRAyfutv/QwEVI5cMbmqsF4jSbCIjc8B2Iw+aI5wVcxMf0q0FqjFUoLlDJyTJe2ojToISwTWoHyS09Bt7Ow9vt9zGYzYUJdNC2dI9GWDVqR7NP3er3iLZF8DXht/dGK1uwDLpdLOKm4nk4OViZmsxm63a7QiXQ6HUynUzFAmPhst9vodDro9Xpz4/dWBe1pkGSQLLHaArUsC9lsVmhHNFPFKuUdDodoNBool8tot9tigQKvBqC0Wi2k02kZrr7oXL2J5eHGCpTK066QSH/AmAddTXKsk6RplZl3O3c6rQzKTGplDovodrtiha4aDCHQfWu327AsS6g7NPEYLwDTNGWwMeEEsRyHhfDZ8/DwS5eoaIoRLau9coCzYpcNvicPKOXQCpTMizrORYPAsqy5IThMdjrd6szLm2eFlyWZQZkIYUiEl0I4HF44zMVJMPQ1mUzQbrdRq9UwHo9lVB0VK88ZPxsAxysbFilmhhrK5TKm0ykKhQLy+fwc/TL113A4lLCJxpv01o0VKONJvCWbzabEQvWYM4/HI7cpZ1VyLNeqYBiG3JCVSgW1Wk3iSJRVT52v1Wpivi+acegkeDtWq1WcnJygWq1Kkg6AHBq6m5VKRVz63d1deR9aUssErTWfzwfTNGFZFgzDgGEYEld0u90y/kvTLjebTaEw1iEcup/Lhg4V8MLhqLqLiwtx7SORiEz5Z0iqWq3OTe6ite30pT+bzaR0jZcnJ/lvb28jEAgIWR8POff2dDpFOp2eey8+/2WGyPSlTAuy3+/j9PQUjx8/RqFQwGeffYaNjQ2cnJzgpz/9qfDYcySffV6tvsCc2As0JlqtFg4PD/HNN99gZ2cHf/iHf4idnR28ePECf/3Xf41msykGi2Z54PebhBzeygJlwJ0WCLU3LVDtNvM21bfQqkDrV5NZdTod+RmVPW9+WiDMJK9KgdJ1a7fbYoEahoFOpzPHeMr109aS3Vp2mtqYilx7FgwxUNHaqYF7vd5Cnm2nxu8RdMXJJ2WaplCnkDqa68rP0+l0Vl6zqENM+kyRB4n7UJfYMD5uf/5Osd3yPXmh0AJldUMqlUI2m8Xe3t4ce4IOjdhHWmpZnVCgfP/BYIBms4lKpYJ8Po98Po+7d++i2+1KslnrKIao+DlvEve+sQJl8L/b7V5SjLTouEiz2UzcaB54Fq06jel0KtUBVJqaEdLOGKoVPpVtJBJxbHK+XVYmuag8WWNLF5LslmwGqFar8u9ZywjA8UnftVoN5XIZtVoN5+fnqNVqUh5GeflFS5mZ4b29vTkL0ek4GJs7qtUqKpUKyuUyYrGYlAGxXIzPmlb9bDbD1tbWyhQp9x49tnK5jOPjYyQSCUwmE8RiMTSbTVSrVRm6TVkBYHt7Wy4jpyho+J6aCpjeXalUQjgcxtHREcbjMY6PjyU732q1UCqVkEwmkUwmhdSNsjoFli+ORiOhrW632yiXy3j8+DGGwyEODw9Rr9fR6/XQbrdRqVRwdnYm0/1DodBys/CVSgWlUgmlUmnOPKcC1Sav2+3GaDSCYRgAXi1WpVIROopMJuPIAWKs6uLiQmhVGWowDENPwJZsKy0VVhF4vV5Uq1Vh8WRm0SmMx2OUSiUcHR2hVqvJBqS7aY+BAa/WMxqN4vbt28hms9jd3Z0bBu0Eut0uHj9+LJnXR48eoVarSQiE5TZsPKCs0WhUrJS9vT1HaVKIRqOBFy9eoNFo4PHjx3j48CGePn2KZDKJ0WiEZDKJVquFo6MjtNttmaRer9exv78/V9Kiaa2diNuOx2NRNmdnZ/j1r3+Nb7/9FvF4HNvb24jH43IZMVSWTCbRbDZhmiZ2dnawtbUFAOJ6LhtUduPxWOKGL1++xKNHj4TJgdQk9Xodh4eHqNVqiEQi+PLLL2EYhtAJ646vZZ8rel/9fl9CdaVSCefn5zg9PUW320Wv10M6nZautFarhfPzc3z11VeynlT4N8W1CpTuF11guwVqTw7RspvNZmLRMZFDxju6UcsGS2OYNGDiiGa6XUa7tUxXXvNXDwYDRxNLrPFj/IuHiSVVWjExpsfMZzQaFQVwU3fjXcF6umKxKLd1rVYTGhLW9nJPuFwuaVqIRCJoNBpIJBJi2TsBZuG73a5YSNVqVb7PZjNks1n4/X6xTEiNUq1WhXlU14Rqfngn9izDHWxOKZVKYjHNZjMh5ms2mzJLoFqtCoEf4+SrAPcq92itVgPw6sI6OjqCZVlot9tSytZqtVCpVMQQGAwGjtWqUj7gtQWq69Qnk4l4RIyBG4aBwWAgdau0PO3hxvcqY6Li0cXTwOtaS23J6cCwZuRjOQhvc13asszF1FzOVJDMuvJQ6/YsLSvddWaSdZG4k9DlPqTImEwmiEaj2NraQjQaRa/Xk03J9eaaUvE7bdXpbHs4HEahUJA4HcMIw+FQBmNo3iTgdUbcyTIxewsuY93pdBo7OzvY2NjAJ598gkKhgGq1ikAggHq9jmg0KnWh+rIlU6aT7ia7z9rtNqbTqWSIc7kcPv74Y2SzWRiGgWKxCNM0hZ2ThokuE3I6PEauqWq1isFggP39fUwmE+FHSqfT6HQ62NzcFLbT2WyGWq2GTCYzx53mxJry+Q+HQwk1dTodbG9vy1AeninuVRpI4/EYxWJRKgneBtcqUG3V6duY9LaaipeWEhdJMzAySE8uFLoay3Q5KJuOywYCAWQyGUSjUWHoJJsoZeXmoxXH/7eKxBdLPpiMyefzQhD36aefIpfLSRaWMd1yuSyZWx4+r9d7ZSviMjAYDKR9lCSBo9FIMrA8+Ofn57AsC6ZpolgsSv0ivREnY4tagXY6HTSbTbhcLty7dw9bW1u4c+cO/uzP/gz7+/soFov46quvxDWuVCpzXoBlWZfKxJYJnqtmsykhp9FohN/7vd/DwcEB7ty5gx//+Me4ffs2KpUKvv32W1SrVbTbbZyenqJWq4kr2mw2EQwGhcV12aAR0Ww28fDhQxwdHcHtduNHP/oR/uzP/kx6yROJhMRJx+MxTk9P8bOf/QyPHj2SaoLhcCi058uWVffof/311zg8PITH48EXX3yBP/iDPxDCwFQqNVeWd3R0hP/1v/4XHj16JLThrAW+Sd3qtQpU0xnTAtVsdaFQCMlkEsFgUISihaktTbsF6oRlx/fU1i0tUA7eSKVSYqZTVj3ajhaz0xltdgxxs2kLlK4m41vNZhPj8RihUAiNRgPValWyjEx+OUnSBmDuUqQV6nK5sL29jfv372N7exutVguBQEDcO5Y5Aa8LsFdRlA5ALHOXy4VMJoNEIoG9vT08ePBAKHZJIlcul2Vegs7KOi0f8Gof8BIEgHw+j1wuhwcPHuCLL75AKBTC7u4uPB4PisUizs7OcH5+LjXOtJrplTipQGmBnp+fI5/P4969e8hms+KFcK4APbhAIIC//du/lb3ARK6TbafAawv05OQE+Xwe+/v7yOVyMuAmnU7PhZvcbjf+6q/+SvI7b1u3fq0CpcXAOAbNcsYzmWhhaUi32xVFSeXABActPVquywYfiO4VJysoE1i5XE542Hu93lyBOgvr+YCdBDtx2P3ALg6GPXK5nJRd+Hw+WJYFv98Pt9stbX70AlhJ4AR4sHVvNi0Ij8cjAfdEIoHpdIpIJCKzLZnU0qEcJxUowwO6JIiWOV15Joei0Siy2awkvBgCYekLP69Ttct29s1utwufz4d4PA6/3y8MqISuUdUJW0IPElk2tCJhLSoVZDQaley6blCgjvD5fBLL13I6eb5o/NAgItstvVB6oDSU+Dni8biE+zh7gmMYr8O1CpQJlGg0ilQqJZ1GjBnqbCHH3HFDcNCyXuBQKCTN/MsGXTjGZznIhIddy8pCarus3LT6ATgBDpTudrsIhUJIpVIIBoPC876zs4MHDx4AgGQvm80myuUyRqORKADSNY9GI9RqNXE5l3Xwj4+PAbxy39ibTXlDoRC2traws7MDAMhkMtLNM5vNkEgk0O/35XKgsrIsyxHF1Gw2AWDOFU+lUtjZ2UEqlZLRZcCrvfLRRx9ha2sLgUAA33zzjdQ3ctJUIpFAIpFwJDnH58TZn9VqFdlsVr62t7fnQhK5XE5in/So2MapO6+cqBjRZ4Bho/F4jHg8jnw+L+MLmWSjgkwkEjKNS19Qul3W/v7vAz3hjIrc5/Mhk8lgZ2cHsVgMiURibhQgS8UKhYLsD1ZGUMe9ydi7dndw81Ap8eEx8J5MJrGxsYFoNCo3OTNcvV5PpoLzgTs5a5EPxG7psv40kUggm80ikUig1+tJG6fH45mLz+jxYE6Bru1oNBILNBwOI5lMilWvwZmlk8kEyWQSg8FAngEtUPbzAstToK1WC8Bri5llS7FYDJFI5FLclUNEeGhogerhv3SvgeUW1PM9dUsk8OoCymQyl4Zmc0ZpMpmcs+R5qbKEzIn9ak94dbtdTCYT2QP2Rg56TTx/iypJnPaagNfNNLPZTM4WjSOCcvH566lhOly2bHnp3ei/wWFBtJR1spVJN+ZxaOFzD9y0jffa3aFb+VjDx3Y4v9+PeDwuh9Xn880VK1OZsr3TqUJfQocbQqEQBoPBnDuUTCZl4gqtJBaft1qtuXADP6tTSQQeZnZD8G/RzViUUaXcnLeZSqWQyWSQTCbl0lj2+hYKBQCvkh4sAdFy2m/nQCCAcDgs1gmZCfL5PDKZDPx+/6WulGWB+zCZTGJzcxPT6RQbGxvY3t5GoVC4srssmUzi9u3bGI/H2NzcxNbWFgqFgljOToDPKRKJYHt7G6PRCJubm9jd3cXGxgbi8fjc71PR5/N53L59Gy6XC7du3ZKwhNPVAsCr9T04OIDL5cLu7i4ymYyEFK76/Y8++ggejwf7+/tizVMXOJVEisViODg4gNvtlsHOiyatsaIlFovhzp078Hg82N7eRjqdRigUkpDZG//uG7TsDHjVW06KgVAoJCY7h/vaYZqmTFRnuUsgEEAqlZJDyb//RglvjmtlzWQyC60Jy7KulDWfzzsqa7/fR6VSkRmltIDT6fQli4nZbU7VT6VSuHv37qWBIgDg8XiWyjMzHA5RKpWkPpYHIJPJzPVjA5DOM2bhmf3kBtZtfD6fb+lr2u128fTpU9TrdeTzeXz22WfyC6xkoMVBPHz4UDLbBwcHYlE5LatlWXjx4gWazSZyuRy+853vyC+wWSUej88p1EePHqFarSKVSmF/f18uDlt/uSOycq/yPIXD4YU1yJwgRVoaVgkEg0G57JUCXepepZysQWaoS58vjW63i3K5LANaqED5ud4k5438E1qgtMxIIHZV7RlvJrrSq7BACVpzw+FQgu+RSORKVywajSIcDgs5Gy2rVVBQBINBeWC6cuGqdaVF7fP5pIBdw6n19fv9yOfz0qNPN26RnNys7KBiXJewTwBfNji5PxQK2S9AKVli7IvY3d1FMpmURALhcrmkPM6JOkvW+9Kb0LAsC+VyGQDmFOjt27elKUGHanQycZn7gAYWEzFX/Y592rz99zlVzOmRdjzPzGEs6sHXtajhcBj7+/vvXJu+pjVeY4011nhHvMmFX2ONNdZY4wqsLdA11lhjjXfEWoGuscYaa7wj1gp0jTXWWOMdsVaga6yxxhrviDeVMb0xw1Sr1dDtduf6YNPp9JVDSbvdrrQy3rp1a2n1DKPRaAYsLjfhhCXLsqQV8qrCalJRsONKYWmyWpY1A17NmFzEmc4p5aPRCLFY7MryEU5l4oAP9dmXIutkMpkBmHu2i2iKu92u9BwveA+ZOOXkmkLtVRKw2WUlqyV7n6+SdTweS0PGKmRlx5MutSPtiJ0pklQkbKy4Ao7IqlucdbkPB+KwUF7/nPMe7GWELLlyu91LrQO99EOVJH/P8ql3rwO1gw+dtAkcW6b7UK9SoIuobpeBqwZV6CHJLOyNRqMoFArSUaXrKfXUIafA97YrT8ra7XblYopGo9jY2JCWVDvDJd/PCXnt8rHejxtRT3annBwZyDkK5LF3mpVRg51muraPU8hvIisP/SqglQv3cLvdxsnJCQzDQCQSkefPORSr5m4idHsjzzpH7F0l61X11Ktg6dWzfU3TxNnZmQwjz2azUh/OMY3vgmv/FXur9fw8TnEmHw47VDQ4/CCXy12ysjQ/0TLBgmdNbTAYDHBycoJ2u416vY6nT5+i0WggEokgn88jEolI90kqlZLFdJpB9KpNVSwWZZr6kydPUK/XRVbSody7dw+pVEoU/yoPE4u1eWAuLi7w85//HKVSaW6s2dbWFr744os5UjS9QZ0cqM29xpkG7Ig6Pz/HL3/5S1xcXMhgGQ7Z/eEPfyhKVMtKCwpYbt8+x9nZ21pJv/z06VP8t//233B4eIjt7W38/u//Pra2tuT563/DwRw3YZBcBtgkweHZz549w1/+5V/i8PBQnvsiWekFrmL4szbkaB0fHh7i3//7f49Hjx5hf38fP/rRj7C3tyf7VXd06c/6JlyrQLkpSVXLMXAcBGyaJmq1mnAK6QkrrVYLPp8Po9Fori3RKQtU34wEB5uQmIu0wZFIRJgtO52OtKSSufFDYDweCy1CrVbD6ekpSqUSIpEITNMUWbPZrChgp9ktF4FWR61Ww8XFBV68eIGTkxPE43H0ej1xjQeDwZVhEu6rZVp5V+0py7KEmfHly5cia7/fRzQahcvlkhF8dnD4CbDctdafXx9SnrNarYaHDx/iyy+/RL1ex8bGhnTy2T8n2Racsu6vuuw4FIayfvXVV7hz5w4KhcLCrkMqM8CZri67zFSgHG/XbDbx9ddf4+c//zna7Tbu3bsnow7tBt3bzCu9dgfzoHLoBfCaWlXTCnC6EM1yDqVdROPA/tllg5aYfnD2W4i3IAcRkwCPw5cXDbpQsZqly6xB9lD9NRqNZNAvZeXDXYULtAiMz5ISAYBM3OFsVX5dBScu0EUbnhcomSK5fuTNcblc6HQ66PV6C0NOb4gzvjP4nlrm4XCIRqOBVqsF0zTh8Xhk4hZZJQOBgPCLaRlXZX1qWUlsZxgG3G63MFm2Wi2Uy2UEg0FYliU6hGu5ijAOzwYVPHmy/H6/DDWp1+s4Pj7GcDjE9va2TBZ727W8kQng9Xrh9/tl8DBpYWmBWpYltyBHSJGIzn5zX9dT+z5Y5BbzsGjyrm63K7MCOdWI47fs1ieHIgBYKlc8LxztehmGIWR4/DJNE5PJBD6fD4PBQAYXLxrgQP5zAPaBLe8MUk9oegvTNFGtVlEul4VOhPFZ7o92uy10x5ryms/DicHKiw6mYRg4OzvD2dmZMDVyaHK9XodpmkgkEqjVakilUpfcS6fGL9qTRdPpFJVKBYeHh8KAGwwGkc/n4fV6cXp6imq1in6/j/v37yMej8+dt1XDsiwcHR2hVCqhWCzC4/EgnU7D5XLh+PgY5XJZZCXViF3WZYdx9PvxPXu9Hh4/foxisSgUzLdv30YwGMTTp09xfHyMjz/+GHfu3EE+n18oy3uRymnwENACZbaaSomH2uPxzPHGOzk44k2gKc/MJSfQezweDIdDGRZBC3SR28HY6jKx6D25ZuSe4mR//oyyXmWBMqQCLE+B0oqk5eD1euXZkydL81/xeXMeJ+XWlv2qaD0ASLye1hLXnYNOhsOhWKC9Xk9c6lUlkIDXVRedTgf1el3YTGmBAq8ugna7jWw2K6y4To2FuwkGg4FQtxiGAZfLJRdsq9USVgXukUXj9pY9+GSRohuPx0JDYpqmzAWeTCao1+sYj8dIp9Po9/timLztet54p9BtZ0abtMHkZtEKVFMEcxjvKkFl1Gq1ZEJ5p9ORGAzdeip7uqRMIhFOMXMyTqjLlbhmvV5PXGMeEi0z3WN7Aon0CcsELXKt/FgO1m635bnz8OgwCS9WVgisUinx4mQIhJS6dIn5WXjoGM9b1RQuDZ4bZoprtRomk4nMeu10OmI969DYqmCnDgEgVMucbJXP55FOp+cYZBmGIseQPRTi1DxQDdIr12o1uFwu5HI55HI5IUCknNwjiwjv3otUToOcz/V6HZVKRWhDm80mOp3OHLtlMBhEvV4Xq9UpGoerQH7tarWKly9fyk3JKfm0oplNJM3teDzGrVu35H2cpuL1+/3CA95sNmV9aUlyojutaNKxMkGn15TTtJcJfZnQUuKYtdPTU5lQHw6HhSaF1ikTd6xjdTpmy8PNdZpOpxIGabfb8Pl8yOfz8Pv9kgjt9/sSpmk2mzJh3Wno50TXdjQa4fT0FI8fPxa200KhgNPTU/z0pz+VfcJLlhQr+vM7Mc5Og+eh1WrhxYsXePToETY3N/GDH/wAGxsbODk5wd/8zd+gUqnANE350oPKiWXvB3tlAhNHL168wMOHD7Gzs4M//MM/xM7ODp4/f456vY5isSh7xDCMubLAm8ZCb6xAeUuTtL7T6cxZTMxm2S1Q/v9VKdDpdIpOpyOWp9544/F4zqXn56JVbY+BaivFKdCdHAwGYrXZLVCdDLuKiZNxaqfA8hVaoIZhCJ0D6S+0oqdbzKn/TkNXYfD5agvU6/UKtYPX60Wn05E15N72+XwrCTnxb+ghv5PJBIZhoFarIZlMIpPJYHd3V2hnGNq5KjS2CgXKdaUFWq1WkU6nkcvlcOfOHQyHQ3i93rlEqNYNqwI9IVqg1WoVhUIB2WwW+/v76HQ6UiHEZ29PiN60suFGCpSWGt12HeNkPE7HDxgHoxJlydBNWO7eF7Q8Wq0Wms2mKFC6PVRKvKVogTLJsb29Lcp+Fe5crVZDqVRCpVJBuVxGrVaTOCNlpLJvNps4Pz+XB7+xsTHnGjlZ1tRoNKRxgl90ibmO/J1IJIJKpQK/34/pdIrNzU3HS1f0vmJ3FEutTk9PEYvFMJlMEI1GYZomLi4uYFkW3G43isUiXC4X8vn8pfixEzWrlJWX53Q6FVezXC4jHA7j+fPnmEwmOD4+Rr1elz1dLpeFDVXXLDtZygS8rgXXXhCtuGfPnmE4HOLo6AjVanWudDCVSiGRSCAWiyEYDDp+mbLCgnFlwzBgGAbK5TKePHmCwWCAFy9eoF6vo9frwTAMVCoVnJ+fy0Dtt4mF3kiBlstlybjRsrMsS4p4afLyD/M25UMtl8uYTqcIhULIZrOOxsPG4zFKpRKOjo5Qq9VwcnKCer0u7iatpX6/L0r14cOHODk5wf7+PrLZLG7fvj03Ud8pGIaBx48f48WLF6jVanj8+DHq9TrcbrfQwfLG5yXG+sU7d+4gEong9u3b0vHh1OVEV6jRaODRo0f49ttv8fTpU6RSKYzHYySTSelKMgwD3W4XsVgM9Xodd+7cwd7enhx0XrwAHHGXp9MpSqWSrOcvf/lLPH78GMlkEru7u0gkEtLpo8uDKpUKDg4OcOfOnbn3c6JmlYpuMBhIFcvR0REePXqEw8NDSXBsbGygVqvJz0KhEL788ku0221pWohEIo4W0mu6aIbBKpUKjo6OcHh4iFarhcFggEwmg0ajIc0qgUAADx8+xGAwkKn75I53Qk4dn+VFXiwWcXZ2htPTU/GaU6kUWq2WdHqdnZ3h66+/hmEYuHXrFjKZzBxZ4ntl4VnGopNG3W5XMph2l4EPkQXIdEk7nY7QVvT7fTk4Thz4q1x4xmFoMTHTTavKNE1EIhEYhgHLsoQgz0nQSuKBr1QqqNfrwiEDQHjKmZUHIKyXpN+NxWKOWMv8e4wR1mq1ua/ZbIZcLgefzyexxlarhWAwiFqtJsytOtxA1w5wRoECr4vn6/U6SqUSWq0Wut0uAoGAJBdLpZK47aVSCV6vF5lM5lIc2cmqAbKpaosOeHVhHR0dSQyx2Wyi2+2KwmcX2vtkj99GRuC1BcoYd7vdBgBR8JVKRdqlR6ORNFuQ7ZLhs1XISb3D+OZoNJKEVygUEit6NBrBNE2Uy2WZJ8E9T7yXAtVUoYTH45GEBRWmzhQDr1xJWlDsntCE906a8Ww5nU6nUgoynU6FfyYajc5lC2klM77DTbJgmMTSQRm9Xq8QWpHd1C5rv9+fi5m53W65CJyKL9m7ZJh1z2az6PV62NjYwCeffIJCoSCJuHq9LkkjVmgwvsRsrJNhHF0lMpvNsLGxgX6/L4mZXC6HRqOBdDqNer0uhdX60JFLidS4ToGkgqzxJDtoNpvF/fv3kU6n0el0sLW1JXTRs9kMtVoNmUxGuKmcPFN8ViQWbDQasCwL29vb6PV6Qm6XTCbFIOj1eohEIhgOhzg/P0c0GpVKCGD5GXi7nDrJvbm5iX6/P3emtAINBoNSh5vJZKRGm3ivLDwtBbq6dC1TqZQM4uBABiYYmEjiFBlmkXXg20kF2m63JeDOzGs6nUY+n8cnn3yCXC43NwCBWWVa14ZhSC2bnfd82eDQCg4zCIfDmEwmyOVy+Oyzz5DP5+dkNU0TxWJROlWo1JyKfVJ5zGYzsZLcbjcePHiAnZ0d7O/v48c//jFu376NUqmE3/72t8IaWq1WUa/X0Wg0pLDePgxlmaCSbjQaEk8GgO9+97u4e/cuDg4O8M//+T/H/v4+isUifvOb36BUKklPf71eFy8gmUzKkBEnFWir1cI333yDFy9ewOPx4Ec/+hF+/OMfC9VyIpEQ3nhm6f/u7/4Ojx49kk4fJu+ccuH5+U3TxJdffonnz5/D5XLh93//9/EHf/AHyGQy+Oijj5BKpcSjGw6HOD4+xk9+8hM8evQIs9kMf/zHfyzWshPgZzdNE998843I+YMf/ABffPHFJTnZy398fIz/83/+D549ewafz4dWqzVXG/5eCpQKT0+2YacRe8cZzKb1RktTj77S49CcAg8QLVD+7Wg0itlshkwmg52dHWxubqLZbAoPvNfrldo7Jr8YonAKOmPMS0aXJW1vb+P+/fvY2tpCo9GAz+cTF7rdbovlTAvU6UoB1lTSCmaN4v7+Pj7++GNsbm6KVRqPx1EulyVIz7pVNi44BRb905I0TRNut1uSQh999BE+//xzBAIBbGxsYDab4fz8HOfn56hUKnPhpk6nIzF7J0BPrd/vo1qt4uzsDIVCAffv30c+n0cikcCtW7cQj8flGXM8309/+lPUajW0Wq25MJpWTk6s83A4RLlcxvHxMXK5HD755BNks1nkcjk8ePAA2WxW4vXj8Rg+nw9//dd/jVKphHq9Lhao03t1OBzKmlJpZjKZOQ+EYTFWDfzv//2/UalUpLSNNeI3wbUKlA9C94qzvW02myEcDiOXyyEcDkvMk+UjFIRa3EnzHYC0XA6HQxlLRuVEtzOfzyOfz8Pn88GyLClZaDQamM1miMVi8Pv9ovSdco1Y50l3gaEOdvyw3TUajcpMUG7OSCQi7pxO2jkBeh6684zlQF6vVzwR4FXRfS6XE29DZ1xZKgbA8XI27e0w3ERPSR+KWCyGVCoF0zQlAce1HA6HjiYPuS72kjq2E7NiJRAIYDabyXljyZi9Ppjv5SRoYJAWOBKJIJlMigfKll3KxgqBSCQin4MKS9MKOy1nNBpFMpmUdmN2zrFgPhgMIhwOi0dNY4Hr/iY5b6RA6XpFIhFx4z0ej4wwY1yBY+4YTGbgXgvhlEtUrVYBQA5EIpFAMBiU7zs7O/joo48AvOoECofD0k1BJZXJZGShJ5MJGo2GWCHLTHiUSiUAr1w4ADLjMZFIwO/3o1AoYHNzEx6PRyw7uvlMNPB3gdeDKCjjstxkKnq2ErZaLWQyGcmq0koCXj3XBw8eYHt7G8FgEI8ePUKlUsFsNpP6xng8jng87ohy0t1SvMwDgYBYdOwrJzY3NxGLxTCdTqXExu12y/510nW3DxFhYTzljEajSKfTl/ZcOp2WpAzDZqxxdTrhqeuQvV4vCoUCbt++LcqHMnDvJZNJZLNZFAoFsaQ5qFwPaVm2gUKL3S4nlTkbF5hDSKVSyOVyKBQKSCaTktjjRfCm2uq3skD5hlQyLPhNJpNS8Nvv9+HxeGSYhLZAnZwiRAtnNBpJN1Q4HEYymZRZmhrMHk8mE6RSKQyHw0sWaK/Xkxt+mQqU1Q08OCyxooWhWw4BSA1jt9tFJBJBp9ORS4yuPLtqgOUpUB0WYQ0gWyIXsQ74/X5kMhkZuccEIpUSu72crgmlVedyuRAOh5FIJC41SdByisfjIivwuuPKno11CpzRQBc9HA6LBWoHrVImaGlt60HHy4YON9Gy1xYoy/3sF4627GiBMraow3nLHibC8KFdzlAodKn1+To5qWDfKwuv506Gw2EMBgMEAgG5sZPJJNLptLifVDoApCSALVxcaKe6ZThzlAMvWOoTjUavnOLtcr0avhyLxWQyUyqVQjKZlMvCCYWfTqdF1n6/PycrLygN3TKZSqUwnU6RyWSQyWRk/YPB4NKtJrrbyWQSm5ubmE6nKBQKuHXrFvL5/EJaDP673d1dDIdDbG5uYmtrC4VCQcIOToCXBtkGRqMRcrkcdnZ2xKqzJzH8fr/Uh47HY2xtbWFjYwPZbHYlLZ2RSAT37t2Dx+PBzs4OMpmMWJeLDmw0GsX9+/fhdrtx+/ZtJJNJUV5OJZH4nrFYTGTd29ubU56LnmkkEsHdu3fhdruxu7t76fedCuXFYjEcHBzA7Xbj1q1bSKVSwohw1Zry93d2dpBKpURfcF2vg+sNN9cMeOXKkQ6B1lwoFEI6nV7oOpimicPDQymojcfj8Pv9kg3Xf/8Ga3JTzIDXpSHdbneu7CedTs8NdgYgdWLMHKdSKdy9e3fOglOTzlciq9vtXmjdsROM/bsrknUGvLLunz59inq9jnw+j88++0x+wTAM4RnSI/8ePnwoY+Lu3r0roRBaBwDg8/mWvqbdbhdPnjxBo9F4K1nZlnhwcCDK02lZLcuS+kmeK87LXTTBX9PS0IDhxWlTECuRlRei3aPgfAGG8UKhkCgy/r4Dsi6Uk5eh1gUarBjh76fTaflctiz8u3Mi0b0cjUaIRCISh7kq7hKLxcSqojbn7eM0gsGgjP3S9adX/W0mGFj0bXd/nYyFBYNB5HI5ceX5tcj6CQQCErMJBoPyfRWyhsNhbGxsIBwO2y9A9Ho9VKtVTCaTOaXETplEIjGXzWacEXBmMjkTm8Fg8FJb5mg0klIsLStjuYyNazghKxXiTWbjcg/PZjNEIpG53+f/c8r61Fgk66IkK93eRbI6WW6l5bRPEbtO5vedT7ymNV5jjTXWeEe8yYVfY4011ljjCqwt0DXWWGONd8Raga6xxhprvCPWCnSNNdZY4x2xVqBrrLHGGu+Ia8uY+v3+DFjc2UK6BM6qZM/pIpDagwMzVOHt0uoZrpOVMyjfRlYWtDshK/6hZk2XWdkL/UmEF41GFxask7JgPB4vGr231Nq6N8lpmiZisdjC6VVsjZtMJvD7/U7JKbICkM4eey8zu37srY/snV5EE6w6URyRleuqCQSvk1UTIq5aVoew1L3qIN6+DvSq58DJ6LqwNxKJYGNjQ5rytSJjJ42TsyD/KcmqZWZLnq5Pazab0rgQjUaxsbEhXUqsU2T3EQ/+P1Y52Va7CjkJrVw4rYhT6A3DmHv+Ho9HnveiPeR0faUerHETWa/rqlkVxTGnq5FJ9OzsDIZhIBqNIpvNSm885zd8KKxCzmv/1SIFMp1OUS6X0W63Ua/X8ezZMzQaDZnGE4lEpKOD7Vt2Rj4nsOhwzmYzVCoVtFqtObqBq2QlNbDTstrhcrkwHo+ly6hYLOJXv/oVisUiEomEFKWTAZFWnLZOaLEAy+uFt/cBc1pRsVgUygTKGY/Hsb29jVgshs3NTXz/+9+XAmUtp3360LKgurDmFEmr1UK/38fh4SH++3//73jx4gW2trbw+7//+9je3kYymcTdu3elUJ4Wnr0baJmgotQtjbPZTGbZHh4e4n/8j/+B58+fY3t7G1988QU2Nzdlr1IuXUi/qssJeM18Oh6P8ezZM/yH//Af8PjxY+zv7+NHP/oR9vb2ZB9Eo9EPwl0PQAaYTCYTPH36FP/xP/5HPHnyBHt7e/jRj36E3d1dxGKxOR60t8WNdoi2OugKU4GenZ2hWq0iHA4LoViv15NuEAArUUiLHhIHvBqGsVDWcDiMXq+HTCYjh3nVvOAED1Cz2RROp7OzMyQSCQwGAyQSCbhcLoxGo4VzKjmZB3BOgfJnpMwol8t4+fIlTk9PEY/H0e/3Jdzw6aefLnxPTssBlrvWVzFSktywWq3i0aNH+Prrr3FwcICtrS3xMjTjgm7fdAqLaq9dLpeExKrVKh4+fIivv/4azWYThUJhjgxRv88qLXv+TQ4xGY/HaDQa+Oabb/CLX/wChmHg/v37sldXNZDlKvBZjkYjkfOXv/wl2u027t27h1gs9t5yvrULr6liNc0x8Mpdnk6niMfjMtR41dDKnnJSVrryWlbG5z40OHmcsU+2743HY5k0ZZomOp3OwpgoZzEuE4ue/3A4FJ4eTtyiUqScnU5H6B7scMqyW+QtDQYD4cSyLAsul0sun0ajIX3k3W53LuRwkzmQ74NF69rv9+dkZegDeBUqoetOUkG+z00GXixb9sFggHq9LoYUaWg8Hg9qtRqOj48xHA6xtbX1waxP4NXzJ8Fcu92G1+tFLBaD2+0WwsnRaITt7e13/hs3UqD6hu50OkJE32630Wg0UK/XhXedfEi9Xm/hCP9+vy/j3LLZ7DsLbgeVtVaGlmXJHEtOdOeDp6zBYBCDwUAC+RrkTgFeT1BaBrS7SXS7XZTLZZyfn6NWq8l4Og4cIelVpVIRHh+tMJ2YCblo81uWJVTBjUZDnjvZGjmtq9FoIJPJCL0LsSj5sQzo9+ReaDabODk5QblcFjI2PscXL14ItTGnlnPcot6zTtIaazDuWS6XUSwW4Xa7kUwmMZvNcHR0hFKphF6vhwcPHoisjE2vGp1OB8+ePRNZw+Ew9vb24Pf78ejRIxwdHeHjjz/GwcEBNjY2Vi6flvPw8BDlchkXFxcIhULieTx58gQnJyd48OAB7t69+85y3kiB6iwsh5VqC7Tb7crADh4m/r4ddKmWDW50PXzBbn1qWf1+/5ys+vMSepL6MhWolpV/kxacaZrCgcN4HKc1kbdJD6Zd9QGiBUo+KVqgpOxgiKfX68mwXycnkC8C9x6tumaziU6nA7fbLRZos9kEABnmMhqNFlqeV4UGlgUO36C1TNI2WqCz2UwYZikrY7TXZOEdkZWgS0zGU6/XK15nvV7HZDIR0rsPIR/BQePlchmGYcDj8SAWi2E2m6FerwvVD0Nf74IbJ5FIVt/tduWLg0fJn67diasG0zrFtc735GYcDoeiNMkBz7FflJWDaBmWIEsfYbeelgWuqw5x9Pt94eSZTCZSQsUsIllQyT1l//dOg3+LlycnSDE7DLxWBsDri5JJuVUqUIIHqFgsYjKZIJvNCnskPRE+e1Ic2+PLTsvNTDHdzVKphPF4jFwuh1QqhV6vJ/xSek+TJeJDuMjksy8WiwAgVDmGYeD8/Fw4sHiJ0lJe9R4YDoeo1+soFosyy7ZQKMA0TVxcXMA0TdnLZJx9WzlvrB0YR9Bsi51OR+IfVEwsd2G8MRQKzcXsgsGgJBGcgMvlQq/Xk9u82Wyi2WzKpovH48LvxInpvV4PhmGI+0kwK79s6LIVckeRR5vuejablZgXs7McwGyapihZfRk5NeWbWdfJZDLH/+7z+bCxsQG/349eryekXMCr/cKKB5L3rRKz2Uzm0j58+BCbm5v4/PPPsbm5iZOTE/zsZz+bi4+Rz56UNYTTCoo1qO12W2Td2trCD37wA2xsbODk5ESI5Lj2zWYToVDoUtzbaVm5HwzDwOHhIb766ivs7e3hj/7oj3Dr1i28ePECrVYLlUoFlmWh0WigWq0iGAzKTOBVwjAMPHnyROT8kz/5E+zu7uL58+f4q7/6KxSLRWHh5exislLcFDfe1bQ+e72efNECJX+ILga+ygJd5HosGyRg01+0QDlpWlP2MixhV+yrkHU0GokVRAuUxGKk7+j3+0JRQGVGAiyCViqApSsrnXWlFUTqFj0bll4JALnZvV7vypN0XJfRaCTVAuTo2d/fF9I4fiZaoKxyYJ3lKqw7hpz6/b64m+l0GrlcDgcHB7JvuUe59vbqgVVAexfkEysUCiIrjRS9TxgC04bJqmSlB1IqlcRKvnv3rjTK6DUlk4adDeJNuPFJ48OtVqtCXM8/zluUPDShUAhnZ2cSg7QTejnFDU7UajWUSiXUajWUy2XUajU5JDw0lLXRaOD8/Fy6lfL5vNxAOhPqBKbTKSzLEpeSQXkySMZiMeGC73Q6cLlcODs7w2w2QzabnUvCOXHgdQzcsiz0ej3UajVcXFzg7OxMKKMjkYjUr5qmCZfLhVKpBLfbjfF4fGmwsZPQ1LqsFqjVakgkEjg8PMRkMsHR0dFcfXC1WkUqlUIikUA8Hl+Z8qTyZrkd5SkWi3j27BlGoxGOjo6EzrrZbIqsyWRSCBNXAeYLxuMxDMOAaZoyzf3x48cYDod4/vw5arWalA5yyn8ymRTuqVXIyefPOL0uYxsMBiInPdVqtSo119Fo9K3W9EYKtN1u4+nTp/IwSe/Arh2v13tp47INcX9/H36/H7dv35ZWTifduWazicePH+PFixeo1+tzstJFY80kZe12u4jFYtjf30coFMLe3p60RzrpdoxGI+HNfvr0Kb766is8evQIyWQSrVYLiUQCrVZLun3Ozs7gcrmwvb2Ng4MDKVgG4Chh32w2kwvp8ePH+NWvfiVy3r59G4lEAu12G8fHxzAMQzLelUoFd+7cwcHBwdz7LapCeF/wPfv9voRsisUijo6O8PLlSwl75HI5+RzcF99++y16vZ7wJ+mWVCcSH/TKGJ5hpcXR0ZG4wcPhELlcTvYGXcyHDx+i3+9jZ2cHuVzuSl6qZYMyWpaF8/NzFItFVCoVSRqmUqm5DqpoNCqybm9vI5VKrUTWfr8vFD2np6di7PEC4F49Pz+HYRgoFov49ttv0el0hJfqbeS8kSbr9XpiCvPGrtfrQi0BvC6wpytMlkGv14tqtYp4PP7e4/NvArZslstlserq9boQsjEGywQC61XJt01rJRqNLixYXyYmkwk6nQ6azaZY+I1GA4PBAOFwWLKdxWJRgvFnZ2cAXhG92cMjTllN5LhpNpuo1+solUpot9tCtzwYDNBqtVAul8VtL5fL8Hq9SKfTl1x4JzLbOl5L19GyLKGOrtfreP78ORqNhlhH4/FYrDruTb2mLBoHlru2/Pza1aUFCrzy9mglWZYl3h6bV0hbYc9yO4nxeCyWJS07WqTD4RCBQGBOB5imKTFw7uVVZOEpJ2c0sCKECtRefcP1JXHm267pjTuRGD/UZHKRSETaoJgtZCyJGXmdoV2FW8RMGusm0+m0JLq2trZEVlopLLGh28bSoVVkuNl5wuL+QqEgXVy/93u/J9ZSPB5Ho9FAPB5HMBicy4SvAozNUs6NjQ30+30UCgV89tlnKBQKqNfrSKfTaDQaUqdqb7QAXu0lJyxlvudgMBCr3rIs3Lp1C4PBAKlUSlp2O50Odnd30e12EY1GMZlMUCqVkEgk5krsnHLleSaGwyEuLi7QaDRgmuacrPv7+1IxoGc40Gth5xdbOZ3OcA+HQ9RqNVSrVfR6PWxubmI4HApfFmUzTROj0UiU0fn5ubDeLuJQclLObreLQqGA+/fvS/s22YIZryfXW6lUQjKZxGAweCs5b6RAJ5OJlE0wLkja2E8++QS5XE5cTN5OpVIJnU4HXq9XlNIq4HK5hFudCn80GiGfz+OTTz5BNpuFYRg4Pj6GaZowTVNcE8bsWNvoFFiG1Gq1UK1WUS6XMZvN8Mknn+D27ds4ODjAn//5n+POnTsoFov47W9/i3K5PMcgahiGFKszPLHs0AgVdL1el9i32+3G9773Pdy/fx937tzBn//5n2N/fx/FYhG//vWvRb5isShNFrVaTS5dZo+XDSoQ0zTx5Zdf4vDwEB6PB3/wB3+AP/7jPxYFmkqlpOZ2NBrh+PgYf/M3f4Nnz57B5XJJUwiHjDgBfn7TNPGb3/wGz549g9frFVnZ855Op6WZYzgcSkaesjabTQyHQ0e60OwwTVNCYwDwve99D9/73veQy+Xw4MEDZLNZDAYDWJYlsduf/OQnePjwIdxuN0zTXIkFapomnjx5ghcvXsDlcuG73/0uvvvd7yKXy+E73/mOyMkSpuPjY/zkJz/B48eP4fF4YBiGGHs3uZRufOJYE8nDOpvNsLW1hYODA2xubqLZbMLtdksg3DAMsUYBrDQTSwtUy7q5uSmdEc1mUzYgZWWxum4acAp0E1jY3+l0MJvNkMvlkMvlcO/ePXzve99DNBrF1tYWAODi4gLFYlFkZp0day1ZlgUsb4NSgfLv0DpjUujBgwf4/PPPEQwGsbm5KTHGi4sLVCoVyRjTnQ6FQo4nPYbDIcrlMo6Pj1EoFHDnzh0UCgVRSqlUShpC2FDxk5/8BJVKReotnSyzs8vKuQd6f6bTady7dw+pVEpCEqPRCIFAAD/5yU/mQj20QFcha71ex8XFBZLJJO7cuYNUKoVCoYDPP/8cGxsbokAHgwHcbjf++q//GsViUTxTwklLVGfek8kk9vb2kEgksLW1hR/+8IciJ2PPbrcb//N//k8J9bErkTXib5LzWgXKNsZOpzM3s5DFpolEAslkUuKg7NaZTqeIRqMYDocIhUKimJyM2fCws8edrjllvk7WeDwu5jzdeCcPke5EYikFR8DpuloiHo+j1+vBsiyxMtn9w82qJ/ssC/oG1nIyuRYOh+esSQ4+MU0TgUBgrlFhOBzaebYdAS8/7oFIJIJ4PI5IJCIXDf/fdDoVpc4YOPeqfg+noGOsHo9HKMM5ZpHPmnJTzlAoNDc9ahWyssqGpYuxWAzpdBqJRELKvjQ/Pb3AeDyOUCgkDS4se3RqH3B4CHVNLBZDNpuVsBKAOS77UCgkMeVgMChNDWyVfi8FenJyAgDSnuX3+xEIBIQ/fWdnB/v7+wAgvaSpVAqxWEya9/UUIbrLTM4sszbs+fPnADDn1gSDQSSTSQQCAdy6dQu3b9+ekzWdTkupEHnhGXJg6QNldSL5xWqAbrcLv9+PfD6PZDKJzc3NOfdxe3sb8XhcDjwwHyx3apyZrpVlvNbn8yGTySCZTCKXy80p+p2dHenf/uqrr2TDdrtdGIbhiJK3gxN4xuOxyLq9vS3KietHxaUvVpaPUSFxcLFei2WAf5uDn4FXE8uy2Sy2trYQiURE4et9kEql5Iv7kRc9hy8DznRPcTQcy+k2Nzdx584dkdXlcsHn8yESiWAymSCVSmFjY0NGBo5GI7TbbelKcyrkQDkty0KhUMD29jb29/cRjUZlYIzX60U0GsV0OkU6nZbfY2LWNM0by3mtAm232wAg/eOMtTCzZk/3c8r7YDBANBpFp9NBIBAQq47ZOZrzy1SgzGBqC5SJpHA4fEkB0hLldBt2TdEyocJnvNIJBcpwwWg0gsvlQiQSQTKZvPS3WKgei8UWWqC0CpYNrewo52w2QzgcFkvJLqff75euE3tThZNWPRURrUcmqyhrKBSSvag/WyAQWGiB8n34e8tUoJRVh4k8Hg9CoZDIusj6ofWpZeWFoRspnNgLbKbgXqUFSusYgChRhs54adGyY0jPyQQt5dQWKMdV8uxQTuCVBRqJRBCNRhEIBMQCpff0JlyrQFmoHQgEMBqN5FZMJBKL6BkkTkrLjzdRLpdDMpkUBezEA87n8wBeLch4PJ6TNRAIyO1DMBRhl5X90rpradmgVRGLxVAoFKSAf3d3F9lsduHF4vf7JaYzmUywtbWFzc1NGQztRFyJckajUZEzl8uJnCyk13+Xlvzu7i7G4zG2trZQKBRkArhToAzRaBQHBwdwu924deuWlK5dte8ikQju3r0Lt9stNa26q87JiykajeLOnTtwu93Y3t5GOp0W5XmVrPfu3YPL5ZqTdRUDW6LRqKzT3t6eeHZXMTfo57Czs4NUKnXtZ/tQckYiEXkGOzs7b3wGdrjeoGVnwCuLslKpiPnOEiW6chqWZUkW1rIspFIp3L17dy55oAqpl87d8k9J1m63iydPnqDRaCCfz+Ozzz6TXzAMQ5oRtEJ9+PAharWayMpLTA8C9vl8S+WZ+Scgp8hqWZY8/3A4jEwmg3A4vHByFetba7Uaut0uQqGQhKd0PO8f8MFk5Rn9xyRrNpsVj23RTFJ2KfH3qZj42RyQ9YPIeSMFCryersMDMJvNFraSsfaPgyXS6fR1s/YcIb9ijaR2b/6xynpxcQHDMFAoFOYGELMdNZvNzsnEEiY2JhCTyUT3HS+dqOsqOdmsYF87Dr5IJBJzipXxZQCIRqOOkZ+9ySLXbr49VHEFwZwjsurzd5W8dM/tCoD7e8HMhjWp3PKxUM41rfEaa6yxxjviTRboGmusscYaV2Btga6xxhprvCPWCnSNNdZY4x2xVqBrrLHGGu+ItQJdY4011nhHrBXoGmusscY7Yq1A11hjjTXeEf8PTNRTQJgc2xsAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "freqs = dct(dct(img, axis=0, norm='ortho'), axis=1, norm='ortho')\n", "\n", "fig, axes = plt.subplots(8, 8)\n", "\n", "freq_select = np.zeros((8, 8))\n", "for (y, x) in loop_like_a_jpeg(8):\n", " freq_select[x, y] = 1;\n", " \n", " new_freqs = np.multiply(freqs, freq_select)\n", " \n", " freq_img = np.copy(idct(idct(new_freqs, axis=0, norm='ortho'), axis=1, norm='ortho'))\n", " \n", " ax = axes[x, y]\n", " ax.imshow(freq_img, vmin=0, vmax=1)\n", " ax.axis('off')\n", " save_image(freq_img, name='output/img-buildup-{}-{}.png'.format(x, y), vmin=0, vmax=1)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "hide_input": false, "kernelspec": { "display_name": "Python 3", "language": "python", "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.8.8" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": false }, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false } }, "nbformat": 4, "nbformat_minor": 4 } ================================================ FILE: 02_Python/FP_Growth.py ================================================ #================================================================================================================ #---------------------------------------------------------------------------------------------------------------- # FREQUENT PATTERN GROWTH #---------------------------------------------------------------------------------------------------------------- #================================================================================================================ import numpy as np import pandas as pd class FPGrowth: def __init__(self, k =3, tolerance = 0.0001, max_iterations = 500): pass def main(): pass if __name__ == "__main__": main() ================================================ FILE: 02_Python/Genetic_Algorithm.py ================================================ import copy import numpy as np import pandas as pd class CustomGeneticAlgorithm(): def server_present(self, server, time): server_start_time = server[1] server_duration = server[2] server_end_time = server_start_time + server_duration if (time >= server_start_time) and (time < server_end_time): return True return False def deployed_to_hourlyplanning(self, deployed_hourly_cron_capacity): deployed_hourly_cron_capacity_week = [] for day in deployed_hourly_cron_capacity: deployed_hourly_cron_capacity_day = [] for server in day: server_present_hour = [] for time in range(0, 24): server_present_hour.append( self.server_present(server, time)) deployed_hourly_cron_capacity_day.append(server_present_hour) deployed_hourly_cron_capacity_week.append( deployed_hourly_cron_capacity_day) deployed_hourly_cron_capacity_week = np.array( deployed_hourly_cron_capacity_week).sum(axis=1) return deployed_hourly_cron_capacity_week def generate_random_plan(self, n_days, n_racks): period_planning = [] for _ in range(n_days): day_planning = [] for server_id in range(n_racks): start_time = np.random.randint(0, 23) machines = np.random.randint(0, 12) server = [server_id, start_time, machines] day_planning.append(server) period_planning.append(day_planning) return period_planning def generate_initial_population(self, population_size, n_days=7, n_racks=11): population = [] for _ in range(population_size): member = self.generate_random_plan( n_days=n_days, n_racks=n_racks) population.append(member) return population def calculate_fitness(self, deployed_hourly_cron_capacity, required_hourly_cron_capacity): deviation = deployed_hourly_cron_capacity - required_hourly_cron_capacity overcapacity = abs(deviation[deviation > 0].sum()) undercapacity = abs(deviation[deviation < 0].sum()) overcapacity_cost = 0.5 undercapacity_cost = 3 fitness = overcapacity_cost * overcapacity + undercapacity_cost * undercapacity return fitness def crossover(self, population, n_offspring): n_population = len(population) offspring = [] for _ in range(n_offspring): random_one = population[np.random.randint( low=0, high=n_population - 1)] random_two = population[np.random.randint( low=0, high=n_population - 1)] dad_mask = np.random.randint(0, 2, size=np.array(random_one).shape) mom_mask = np.logical_not(dad_mask) child = np.add(np.multiply(random_one, dad_mask), np.multiply(random_two, mom_mask)) offspring.append(child) return offspring def mutate_parent(self, parent, n_mutations): size1 = parent.shape[0] size2 = parent.shape[1] for _ in range(n_mutations): rand1 = np.random.randint(0, size1) rand2 = np.random.randint(0, size2) rand3 = np.random.randint(0, 2) parent[rand1, rand2, rand3] = np.random.randint(0, 12) return parent def mutate_gen(self, population, n_mutations): mutated_population = [] for parent in population: mutated_population.append(self.mutate_parent(parent, n_mutations)) return mutated_population def is_acceptable(self, parent): return np.logical_not((np.array(parent)[:, :, 2:] > 12).any()) def select_acceptable(self, population): population = [ parent for parent in population if self.is_acceptable(parent)] return population def select_best(self, population, required_hourly_cron_capacity, n_best): fitness = [] for idx, deployed_hourly_cron_capacity in enumerate(population): deployed_hourly_cron_capacity = self.deployed_to_hourlyplanning( deployed_hourly_cron_capacity) parent_fitness = self.calculate_fitness(deployed_hourly_cron_capacity, required_hourly_cron_capacity) fitness.append([idx, parent_fitness]) print('Current generation\'s optimal schedule has cost: {}'.format( pd.DataFrame(fitness)[1].min())) fitness_tmp = pd.DataFrame(fitness).sort_values( by=1, ascending=True).reset_index(drop=True) selected_parents_idx = list(fitness_tmp.iloc[:n_best, 0]) selected_parents = [parent for idx, parent in enumerate( population) if idx in selected_parents_idx] return selected_parents def run(self, required_hourly_cron_capacity, n_iterations, n_population_size=500): population = self.generate_initial_population( population_size=n_population_size, n_days=5, n_racks=24) for _ in range(n_iterations): population = self.select_acceptable(population) population = self.select_best( population, required_hourly_cron_capacity, n_best=100) population = self.crossover( population, n_offspring=n_population_size) population = self.mutate_gen(population, n_mutations=1) best_child = self.select_best( population, required_hourly_cron_capacity, n_best=1) return best_child def main(): # Reading from the data file df = pd.read_csv("./data/cron_jobs_schedule.csv") dataset = df.astype(int).values.tolist() required_hourly_cron_capacity = [ [0 for _ in range(24)] for _ in range(5)] for record in dataset: required_hourly_cron_capacity[record[1]][record[2]] += record[3] genetic_algorithm = CustomGeneticAlgorithm() optimal_schedule = genetic_algorithm.run( required_hourly_cron_capacity, n_iterations=100) print('\nOptimal Server Schedule: \n', genetic_algorithm.deployed_to_hourlyplanning(optimal_schedule[0])) if __name__ == "__main__": main() ================================================ FILE: 02_Python/K-Means_Implementation/Iris.csv ================================================ Id,SepalLengthCm,SepalWidthCm,PetalLengthCm,PetalWidthCm,Species 1,5.1,3.5,1.4,0.2,Iris-setosa 2,4.9,3.0,1.4,0.2,Iris-setosa 3,4.7,3.2,1.3,0.2,Iris-setosa 4,4.6,3.1,1.5,0.2,Iris-setosa 5,5.0,3.6,1.4,0.2,Iris-setosa 6,5.4,3.9,1.7,0.4,Iris-setosa 7,4.6,3.4,1.4,0.3,Iris-setosa 8,5.0,3.4,1.5,0.2,Iris-setosa 9,4.4,2.9,1.4,0.2,Iris-setosa 10,4.9,3.1,1.5,0.1,Iris-setosa 11,5.4,3.7,1.5,0.2,Iris-setosa 12,4.8,3.4,1.6,0.2,Iris-setosa 13,4.8,3.0,1.4,0.1,Iris-setosa 14,4.3,3.0,1.1,0.1,Iris-setosa 15,5.8,4.0,1.2,0.2,Iris-setosa 16,5.7,4.4,1.5,0.4,Iris-setosa 17,5.4,3.9,1.3,0.4,Iris-setosa 18,5.1,3.5,1.4,0.3,Iris-setosa 19,5.7,3.8,1.7,0.3,Iris-setosa 20,5.1,3.8,1.5,0.3,Iris-setosa 21,5.4,3.4,1.7,0.2,Iris-setosa 22,5.1,3.7,1.5,0.4,Iris-setosa 23,4.6,3.6,1.0,0.2,Iris-setosa 24,5.1,3.3,1.7,0.5,Iris-setosa 25,4.8,3.4,1.9,0.2,Iris-setosa 26,5.0,3.0,1.6,0.2,Iris-setosa 27,5.0,3.4,1.6,0.4,Iris-setosa 28,5.2,3.5,1.5,0.2,Iris-setosa 29,5.2,3.4,1.4,0.2,Iris-setosa 30,4.7,3.2,1.6,0.2,Iris-setosa 31,4.8,3.1,1.6,0.2,Iris-setosa 32,5.4,3.4,1.5,0.4,Iris-setosa 33,5.2,4.1,1.5,0.1,Iris-setosa 34,5.5,4.2,1.4,0.2,Iris-setosa 35,4.9,3.1,1.5,0.1,Iris-setosa 36,5.0,3.2,1.2,0.2,Iris-setosa 37,5.5,3.5,1.3,0.2,Iris-setosa 38,4.9,3.1,1.5,0.1,Iris-setosa 39,4.4,3.0,1.3,0.2,Iris-setosa 40,5.1,3.4,1.5,0.2,Iris-setosa 41,5.0,3.5,1.3,0.3,Iris-setosa 42,4.5,2.3,1.3,0.3,Iris-setosa 43,4.4,3.2,1.3,0.2,Iris-setosa 44,5.0,3.5,1.6,0.6,Iris-setosa 45,5.1,3.8,1.9,0.4,Iris-setosa 46,4.8,3.0,1.4,0.3,Iris-setosa 47,5.1,3.8,1.6,0.2,Iris-setosa 48,4.6,3.2,1.4,0.2,Iris-setosa 49,5.3,3.7,1.5,0.2,Iris-setosa 50,5.0,3.3,1.4,0.2,Iris-setosa 51,7.0,3.2,4.7,1.4,Iris-versicolor 52,6.4,3.2,4.5,1.5,Iris-versicolor 53,6.9,3.1,4.9,1.5,Iris-versicolor 54,5.5,2.3,4.0,1.3,Iris-versicolor 55,6.5,2.8,4.6,1.5,Iris-versicolor 56,5.7,2.8,4.5,1.3,Iris-versicolor 57,6.3,3.3,4.7,1.6,Iris-versicolor 58,4.9,2.4,3.3,1.0,Iris-versicolor 59,6.6,2.9,4.6,1.3,Iris-versicolor 60,5.2,2.7,3.9,1.4,Iris-versicolor 61,5.0,2.0,3.5,1.0,Iris-versicolor 62,5.9,3.0,4.2,1.5,Iris-versicolor 63,6.0,2.2,4.0,1.0,Iris-versicolor 64,6.1,2.9,4.7,1.4,Iris-versicolor 65,5.6,2.9,3.6,1.3,Iris-versicolor 66,6.7,3.1,4.4,1.4,Iris-versicolor 67,5.6,3.0,4.5,1.5,Iris-versicolor 68,5.8,2.7,4.1,1.0,Iris-versicolor 69,6.2,2.2,4.5,1.5,Iris-versicolor 70,5.6,2.5,3.9,1.1,Iris-versicolor 71,5.9,3.2,4.8,1.8,Iris-versicolor 72,6.1,2.8,4.0,1.3,Iris-versicolor 73,6.3,2.5,4.9,1.5,Iris-versicolor 74,6.1,2.8,4.7,1.2,Iris-versicolor 75,6.4,2.9,4.3,1.3,Iris-versicolor 76,6.6,3.0,4.4,1.4,Iris-versicolor 77,6.8,2.8,4.8,1.4,Iris-versicolor 78,6.7,3.0,5.0,1.7,Iris-versicolor 79,6.0,2.9,4.5,1.5,Iris-versicolor 80,5.7,2.6,3.5,1.0,Iris-versicolor 81,5.5,2.4,3.8,1.1,Iris-versicolor 82,5.5,2.4,3.7,1.0,Iris-versicolor 83,5.8,2.7,3.9,1.2,Iris-versicolor 84,6.0,2.7,5.1,1.6,Iris-versicolor 85,5.4,3.0,4.5,1.5,Iris-versicolor 86,6.0,3.4,4.5,1.6,Iris-versicolor 87,6.7,3.1,4.7,1.5,Iris-versicolor 88,6.3,2.3,4.4,1.3,Iris-versicolor 89,5.6,3.0,4.1,1.3,Iris-versicolor 90,5.5,2.5,4.0,1.3,Iris-versicolor 91,5.5,2.6,4.4,1.2,Iris-versicolor 92,6.1,3.0,4.6,1.4,Iris-versicolor 93,5.8,2.6,4.0,1.2,Iris-versicolor 94,5.0,2.3,3.3,1.0,Iris-versicolor 95,5.6,2.7,4.2,1.3,Iris-versicolor 96,5.7,3.0,4.2,1.2,Iris-versicolor 97,5.7,2.9,4.2,1.3,Iris-versicolor 98,6.2,2.9,4.3,1.3,Iris-versicolor 99,5.1,2.5,3.0,1.1,Iris-versicolor 100,5.7,2.8,4.1,1.3,Iris-versicolor 101,6.3,3.3,6.0,2.5,Iris-virginica 102,5.8,2.7,5.1,1.9,Iris-virginica 103,7.1,3.0,5.9,2.1,Iris-virginica 104,6.3,2.9,5.6,1.8,Iris-virginica 105,6.5,3.0,5.8,2.2,Iris-virginica 106,7.6,3.0,6.6,2.1,Iris-virginica 107,4.9,2.5,4.5,1.7,Iris-virginica 108,7.3,2.9,6.3,1.8,Iris-virginica 109,6.7,2.5,5.8,1.8,Iris-virginica 110,7.2,3.6,6.1,2.5,Iris-virginica 111,6.5,3.2,5.1,2.0,Iris-virginica 112,6.4,2.7,5.3,1.9,Iris-virginica 113,6.8,3.0,5.5,2.1,Iris-virginica 114,5.7,2.5,5.0,2.0,Iris-virginica 115,5.8,2.8,5.1,2.4,Iris-virginica 116,6.4,3.2,5.3,2.3,Iris-virginica 117,6.5,3.0,5.5,1.8,Iris-virginica 118,7.7,3.8,6.7,2.2,Iris-virginica 119,7.7,2.6,6.9,2.3,Iris-virginica 120,6.0,2.2,5.0,1.5,Iris-virginica 121,6.9,3.2,5.7,2.3,Iris-virginica 122,5.6,2.8,4.9,2.0,Iris-virginica 123,7.7,2.8,6.7,2.0,Iris-virginica 124,6.3,2.7,4.9,1.8,Iris-virginica 125,6.7,3.3,5.7,2.1,Iris-virginica 126,7.2,3.2,6.0,1.8,Iris-virginica 127,6.2,2.8,4.8,1.8,Iris-virginica 128,6.1,3.0,4.9,1.8,Iris-virginica 129,6.4,2.8,5.6,2.1,Iris-virginica 130,7.2,3.0,5.8,1.6,Iris-virginica 131,7.4,2.8,6.1,1.9,Iris-virginica 132,7.9,3.8,6.4,2.0,Iris-virginica 133,6.4,2.8,5.6,2.2,Iris-virginica 134,6.3,2.8,5.1,1.5,Iris-virginica 135,6.1,2.6,5.6,1.4,Iris-virginica 136,7.7,3.0,6.1,2.3,Iris-virginica 137,6.3,3.4,5.6,2.4,Iris-virginica 138,6.4,3.1,5.5,1.8,Iris-virginica 139,6.0,3.0,4.8,1.8,Iris-virginica 140,6.9,3.1,5.4,2.1,Iris-virginica 141,6.7,3.1,5.6,2.4,Iris-virginica 142,6.9,3.1,5.1,2.3,Iris-virginica 143,5.8,2.7,5.1,1.9,Iris-virginica 144,6.8,3.2,5.9,2.3,Iris-virginica 145,6.7,3.3,5.7,2.5,Iris-virginica 146,6.7,3.0,5.2,2.3,Iris-virginica 147,6.3,2.5,5.0,1.9,Iris-virginica 148,6.5,3.0,5.2,2.0,Iris-virginica 149,6.2,3.4,5.4,2.3,Iris-virginica 150,5.9,3.0,5.1,1.8,Iris-virginica ================================================ FILE: 02_Python/K-Means_Implementation/K-Means_Clustering_on_Iris_Dataset.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\"logo\"/" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "UID9RK1qDlVB" }, "source": [ "## K- Means Clustering" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 195 }, "colab_type": "code", "executionInfo": { "elapsed": 835, "status": "ok", "timestamp": 1544240454142, "user": { "displayName": "A M Aditya", "photoUrl": "https://lh3.googleusercontent.com/-WI8p7JNWLic/AAAAAAAAAAI/AAAAAAAAAfs/vS8ElgH0p0c/s64/photo.jpg", "userId": "15341571102300750919" }, "user_tz": -480 }, "id": "kO_1kOEGDTws", "outputId": "24bb4b2a-2342-4c91-c702-b127a5391152" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
SepalLengthCmSepalWidthCmPetalLengthCmPetalWidthCmSpecies
05.13.51.40.2Iris-setosa
14.93.01.40.2Iris-setosa
24.73.21.30.2Iris-setosa
34.63.11.50.2Iris-setosa
45.03.61.40.2Iris-setosa
\n", "
" ], "text/plain": [ " SepalLengthCm SepalWidthCm PetalLengthCm PetalWidthCm Species\n", "0 5.1 3.5 1.4 0.2 Iris-setosa\n", "1 4.9 3.0 1.4 0.2 Iris-setosa\n", "2 4.7 3.2 1.3 0.2 Iris-setosa\n", "3 4.6 3.1 1.5 0.2 Iris-setosa\n", "4 5.0 3.6 1.4 0.2 Iris-setosa" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Importing the libraries\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import pandas as pd\n", "import seaborn as sns\n", "from sklearn import datasets\n", "\n", "# Load the iris dataset\n", "iris = pd.read_csv(\"Iris.csv\")\n", "iris.drop([\"Id\"],axis=1,inplace=True)\n", "iris.head()" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
SepalLengthCmSepalWidthCmPetalLengthCmPetalWidthCm
count150.000000150.000000150.000000150.000000
mean5.8433333.0540003.7586671.198667
std0.8280660.4335941.7644200.763161
min4.3000002.0000001.0000000.100000
25%5.1000002.8000001.6000000.300000
50%5.8000003.0000004.3500001.300000
75%6.4000003.3000005.1000001.800000
max7.9000004.4000006.9000002.500000
\n", "
" ], "text/plain": [ " SepalLengthCm SepalWidthCm PetalLengthCm PetalWidthCm\n", "count 150.000000 150.000000 150.000000 150.000000\n", "mean 5.843333 3.054000 3.758667 1.198667\n", "std 0.828066 0.433594 1.764420 0.763161\n", "min 4.300000 2.000000 1.000000 0.100000\n", "25% 5.100000 2.800000 1.600000 0.300000\n", "50% 5.800000 3.000000 4.350000 1.300000\n", "75% 6.400000 3.300000 5.100000 1.800000\n", "max 7.900000 4.400000 6.900000 2.500000" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Getting the Statistical Information\n", "iris.describe()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 150 entries, 0 to 149\n", "Data columns (total 5 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 SepalLengthCm 150 non-null float64\n", " 1 SepalWidthCm 150 non-null float64\n", " 2 PetalLengthCm 150 non-null float64\n", " 3 PetalWidthCm 150 non-null float64\n", " 4 Species 150 non-null object \n", "dtypes: float64(4), object(1)\n", "memory usage: 6.0+ KB\n" ] } ], "source": [ "# Lets check for datatypes\n", "iris.info()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Using Pairplots for better understanding of the data points distribution" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "sns.pairplot(data=iris,hue=\"Species\",palette=\"Set1\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "From above visuals iris-setosa is easily separable from the other two." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "from sklearn.cluster import KMeans\n", "features = iris.loc[:,[\"SepalLengthCm\",\"SepalWidthCm\",\"PetalLengthCm\",\"PetalWidthCm\"]]" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "q_pPmK9GIKMz" }, "source": [ "#### Below snippet shows how we can find the optimum number of clusters for K Means and how can we determine the value of K?" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 376 }, "colab_type": "code", "executionInfo": { "elapsed": 1649, "status": "ok", "timestamp": 1544110062756, "user": { "displayName": "A M Aditya", "photoUrl": "https://lh3.googleusercontent.com/-WI8p7JNWLic/AAAAAAAAAAI/AAAAAAAAAfs/vS8ElgH0p0c/s64/photo.jpg", "userId": "15341571102300750919" }, "user_tz": -480 }, "id": "WevSKogFEalU", "outputId": "d0161248-67f2-48a4-cf4b-224f8faae045" }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEWCAYAAACJ0YulAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nO3de3hd5X3m/e+ts0+SbCwb29rEHBzAQCQaQ0JpCA2hQNIEplMSZ5Kp09KStgxJaHO1wMzbJvO+TEiayaFtmJbJyZnQMG7SXNCUSWDcBJoTYMDGpzg4GGwhg4XBlo86/t4/1tL2lpAlH7S19ta+P9ela631rMP+7Q3WrbWevZ6liMDMzAygKusCzMysdDgUzMwsz6FgZmZ5DgUzM8tzKJiZWZ5DwczM8hwKVrIkfVzSNybhdS6X1FGw/Jyktxf7dSeLpA9K+tEEHWvYZ2VTT03WBVjlkrS/YHE60AMMpMsfmvyKyp+kxcA2oDYi+rOtxsqRzxQsMxExc+gH2A68q6DtnqzrM6tEDgUrdXWSvi5pn6SNkpYNrZC0UNK3JXVJ2ibpw0c7iKR6SZ+RtF3SS5L+TtK0MV73IkmbJL0q6auSGgqO9QeStkp6RdL9kham7Z+Q9DfpfK2kA5I+nS5Pk3RY0uxRartcUoekP5O0S9JOSddJeoekX6Svc3vB9lWSbpX0S0m7Ja2SNCdd/Ug63SNpv6RLCvb7TPp+tkm6ZsTneH/6Olsl/UHBummSvpbutwm4aIzPzKYAh4KVuncD9wLNwP3A30LyixH4Z2AdsAi4AviopKuOcpxPAa8H2oGz0n3+YozXfT9wFXBmut9/SV/3bcAngfcAC4Dn0/oAHgYuT+cvAl4E3pouXwJsiYhXj/J6pwINBXX9T+ADwBuBtwB/IemMdNsPA9elx14IvAp8MV13WTptTs+4fpouvwnYAswFPg18WZLSdd8EOtJj/Tbw3yRdka77y/QzODP9PFYcpX6bKiLCP/7J/Ad4Dnj7iLaPA/+3YHkpcCidfxOwfcT2twFfHeXYAg4AZxa0XQJsS+cvBzpG1PKHBcvvAH6Zzn8Z+HTBuplAH7AYmAYcBk4BbgVuJ/llOxP4BPDXR3nvlwOHgOp0eRYQwJsKtnkCuC6d3wxcUbBuQVpDTVpHADUF6z8IbC1Ynp5ucyqQI+nHmVWw/pPA19L5Z4GrC9bdWPhZ+Wfq/bij2UrdiwXzB4EGSTXA64CFkvYUrK8G/m2UY7SQ/CJ84sgfxyjd/mh2FMw/T/JXNOn0yaEVEbFf0m5gUUQ8J2kNyV/wlwF3kJyZXJq2/c0Yr7c7IoY62Q+l05cK1h8iCRdI3vt3JA0WrB8A5o9x/PznGBEH089hJkmAvRIR+0a836HLdAt57WdhU5hDwcrVDpK/9Jccw7Yvk/xSPS8iXjjG4+cK5k8DOtP5TpJfygBImkHyi3XouA8DbwMuBB5Pl68CLubI9f6TtQP4vYj48cgVkl43yvZj6QTmSJpVEAynceT97CT5LDYWrLMpzH0KVq4eA7ol/XnaGVot6XxJr+kIjYhBkmv0n5M0D0DSojH6HwBuktSaduDeDvzvtP0fgN+V1C6pHvhvwKMR8Vy6/mHgd4BNEdEL/BD4fZIA6zrZN536O+COoQCQ1CLp2nRdFzAInHG0nQtFxA7gJ8AnJTVIegNwAzD07a9VwG2SZktqBW6eoPdgJcqhYGUpvdTyLpLLM9tIzga+BDQdZZc/B7YCP5PUDfxf4OwxXuIfgAdJrqk/C/x/6euuBv4f4Nskf0WfCSwv2O8nJH0LQ2cFm0j6GSbqLAHgCySd7g9K2gf8jKSPhYg4SHLZ6seS9kh68zEc730kfRGdwHeAv4yIh9J1nyC5ZLSN5PP4XxP4PqwEKcIP2TEzs4TPFMzMLM+hYGZmeQ4FMzPLcyiYmVleWd+nMHfu3Fi8eHHWZZiZlZUnnnji5YhoGW1d0UJB0tkc+W43JN+b/gvg62n7YpLhBN4T6Xgwkm4j+Y70APDhiPj+WK+xePFi1qxZM+G1m5lNZZKOemd60S4fRcSWiGiPiHaSQb0OknwH+lZgdXon6up0GUlLSb7vfR5wNXCXpLGGITAzswk2WX0KV5AMKPY8cC2wMm1fSTLaI2n7vRHRExHbSG40uniS6jMzMyYvFJaTDM8LMD8idgKk03lp+yKGD7zVkbYNI+lGSWskrenqmqhRA8zMDCYhFCTVkYyJ/4/jbTpK22tut46IuyNiWUQsa2kZtZ/EzMxO0GScKVwDPBkRQ8MAvyRpAUA63ZW2dzB8ZMpWjoxMaWZmk2AyQuF9HLl0BMlAXkNPb1oB3FfQvjx9bOLpwBKSkTDNzGySFPU+BUnTgSuBDxU03wmsknQDycParweIiI2SVpGMKtkP3FTw0BEzM5sERQ2FdBjfU0a07Sb5NtJo299BMuxvUXW8epB7H9vB8otztM6eXuyXMzMrGxU5zMWBngH+9gdbeWzbK1mXYmZWUioyFM6aN5PpddWs27Fn/I3NzCpIRYZCdZW4YFETazv2Zl2KmVlJqchQAGg/rZnNnd309Lsv28xsSOWGQmszvQODbN65L+tSzMxKRsWGQluuGcD9CmZmBSo2FBY0NdAyq96hYGZWoGJDQRLtuWbWOhTMzPIqNhQA2nPNPPvyAfYe7Mu6FDOzklDRodDWmvQrPP2CzxbMzKDCQ+GC1ibAnc1mZkMqOhSaptVyZssM9yuYmaUqOhQg+Wrq2h17iXjN83zMzCpOxYdCe66Zl/f30Ln3cNalmJllzqHgm9jMzPIqPhTOObWRuuoq9yuYmeFQoK6miqULGx0KZmY4FIDkEtL6jr30DwxmXYqZWaYcCiShcKhvgGd27c+6FDOzTDkU8IipZmZDHArA4lOm09hQw7oOh4KZVbaihoKkZknfkvRzSZslXSJpjqSHJD2TTmcXbH+bpK2Stki6qpi1jagzfxObmVklK/aZwheA70XEOUAbsBm4FVgdEUuA1ekykpYCy4HzgKuBuyRVF7m+vAtzzWx5sZuDvf2T9ZJmZiWnaKEgqRG4DPgyQET0RsQe4FpgZbrZSuC6dP5a4N6I6ImIbcBW4OJi1TdSW66ZwYANL3RP1kuamZWcYp4pnAF0AV+V9JSkL0maAcyPiJ0A6XReuv0iYEfB/h1p26R4Q6s7m83MihkKNcCvAP8jIi4EDpBeKjoKjdL2mlHqJN0oaY2kNV1dXRNTKdAyq55FzdNY685mM6tgxQyFDqAjIh5Nl79FEhIvSVoAkE53FWyfK9i/FegcedCIuDsilkXEspaWlgktuP20ZtZudyiYWeUqWihExIvADklnp01XAJuA+4EVadsK4L50/n5guaR6SacDS4DHilXfaNpbm3lhzyG69vVM5suamZWMmiIf/2bgHkl1wLPA75IE0SpJNwDbgesBImKjpFUkwdEP3BQRA0Wub5ihm9ie7tjDFefOn8yXNjMrCUUNhYhYCywbZdUVR9n+DuCOYtY0lvMXNVJdJdbtcCiYWWXyHc0FptfV8Pr5s3jK30AyswrlUBihPdfEuh17/HhOM6tIDoUR2lqb6T7cz3O7D2ZdipnZpHMojNB+WtLZvHbHqxlXYmY2+RwKIyyZN4vpddWs8+B4ZlaBHAojVFeJ8xc1+fGcZlaRHAqjaM81s6mzm95+P57TzCqLQ2EU7blmegcG2bzTI6aaWWVxKIwi/3hOD45nZhXGoTCKhU0NzJ1Z734FM6s4DoVRSKI91+xnK5hZxXEoHEV7rolfdh1g76G+rEsxM5s0DoWjGOpXWN/h+xXMrHI4FI4i/3hOdzabWQVxKBxF07RazmiZ4c5mM6soDoUxtLc2s9YjpppZBXEojKEt10zXvh527j2cdSlmZpPCoTCG/E1svoRkZhXCoTCGcxfMoq66yv0KZlYxHApjqK+p5tyFjQ4FM6sYDoVxtLc2sf6FvQwMurPZzKY+h8I42nLNHOwdYOuu/VmXYmZWdEUNBUnPSVovaa2kNWnbHEkPSXomnc4u2P42SVslbZF0VTFrO1btOT+e08wqx2ScKfx6RLRHxLJ0+VZgdUQsAVany0haCiwHzgOuBu6SVD0J9Y1p8SkzaGyoYa0fz2lmFSCLy0fXAivT+ZXAdQXt90ZET0RsA7YCF2dQ3zBVVaLNI6aaWYUodigE8KCkJyTdmLbNj4idAOl0Xtq+CNhRsG9H2jaMpBslrZG0pqurq4ilH9Gea2bLS/s41DswKa9nZpaVYofCpRHxK8A1wE2SLhtjW43S9pqv/ETE3RGxLCKWtbS0TFSdY2prbWZgMNjQ6UtIZja1FTUUIqIzne4CvkNyOeglSQsA0umudPMOIFeweyvQWcz6jtUbck2A72w2s6mvaKEgaYakWUPzwG8AG4D7gRXpZiuA+9L5+4HlkuolnQ4sAR4rVn3HY96sBhY1T/NNbGY25dUU8djzge9IGnqdf4iI70l6HFgl6QZgO3A9QERslLQK2AT0AzdFRMlcxG/PNfvZCmY25RUtFCLiWaBtlPbdwBVH2ecO4I5i1XQy2nJN/Mv6neze38MpM+uzLsfMrCh8R/MxavOT2MysAjgUjtH5i5qoEr6JzcymNIfCMZpRX8Pr589yZ7OZTWkOhePQnt7Z7MdzmtlU5VA4Dm25ZvYe6uP53QezLsXMrCgcCsdhaMRUdzab2VTlUDgOS+bNZFptNU9tdyiY2dTkUDgONdVVXLCoyWcKZjZlORSOU1uuiY2d3fT2D2ZdipnZhHMoHKf23Gx6+wfZ8uK+rEsxM5twDoXj1JaOmOrHc5rZVORQOE6Lmqcxd2ad72w2synJoXCcJNHW6hFTzWxqciicgPZcM7/s2k/34b6sSzEzm1AOhRPQlmsmAtZ3+BKSmU0tDoUTMDSMtgfHM7OpxqFwApqm13LG3Bl+ZrOZTTkOhRPUlmtmrUdMNbMpxqFwgtpam9i1r4cXuw9nXYqZ2YRxKJygtqERU30JycymEIfCCVq6sJHaavkmNjObUooeCpKqJT0l6bvp8hxJD0l6Jp3OLtj2NklbJW2RdFWxazsZ9TXVLF3Q6OEuzGxKmYwzhY8AmwuWbwVWR8QSYHW6jKSlwHLgPOBq4C5J1ZNQ3wlryzWzvmMvA4PubDazqaGooSCpFXgn8KWC5muBlen8SuC6gvZ7I6InIrYBW4GLi1nfyWprbeZA7wC/7NqfdSlmZhOi2GcKnwf+DCh8+MD8iNgJkE7npe2LgB0F23WkbcNIulHSGklrurq6ilP1MWo/zTexmdnUUrRQkPSbwK6IeOJYdxml7TXXZSLi7ohYFhHLWlpaTqrGk3X6KTOY1VDjUDCzKaOmiMe+FHi3pHcADUCjpG8AL0laEBE7JS0AdqXbdwC5gv1bgc4i1nfSqqrSEVMdCmY2RYx5piDpIkmnFiz/jqT7JP21pDlj7RsRt0VEa0QsJulA/teI+ABwP7Ai3WwFcF86fz+wXFK9pNOBJcBjJ/SuJlFbromfv7iPw30DWZdiZnbSxrt89PdAL4Cky4A7ga8De4G7T/A17wSulPQMcGW6TERsBFYBm4DvATdFRMn/pm3PzWZgMNjY6fsVzKz8jXf5qDoiXknn3wvcHRHfBr4tae2xvkhE/BD4YTq/G7jiKNvdAdxxrMctBW2tyeM5n9q+hze+bsyTJzOzkjfemUK1pKHguAL414J1xeyPKBvzGhtY2NTAOj9bwcymgPF+sX8TeFjSy8Ah4N8AJJ1FcgnJSL6a6s5mM5sKxjxTSC/n/CnwNeDX4sg40VXAzcUtrXy0tTaz/ZWD7N7fk3UpZmYnZbxvH00HnoiI70TEAUlnS7oFOD8inpycEkvf0IipT/sSkpmVufH6FL4HLIb8JaOfAmcAN0n6ZHFLKx8XLGqiSr6z2czK33ihMDsinknnVwDfjIibgWuA3yxqZWVkRn0Nr58/i3UdDgUzK2/jhULhMBNvAx4CiIheho9nVPGG7mz24znNrJyNFwpPS/pM2o9wFvAggKTmoldWZtpyzbx6sI/trxzMuhQzsxM2Xij8AfAySb/Cb0TE0G+8pcBnilhX2WnLJTexuV/BzMrZeKEwE/jniPhIRKwraO8m6YS21NnzZ9FQW8U6P57TzMrYeKHwN8DcUdoXAV+Y+HLKV011FRcsavLjOc2srI0XChdExMMjGyPi+8AbilNS+WprbWZDZzd9A+6DN7PyNF4o1J7guorUflozvf2DbHlxX9almJmdkPFC4Zn0ITnDSLoGeLY4JZWvtlY/ntPMytt4A+J9FPgXSe8Bhh6ruQy4BN+89hqts6dxyow61u7Ywwfe/LqsyzEzO27jhcI7gRuAc4Cz07aHgQ9FxOFiFlaOJNGW84ipZla+xrt81Ap8Cvg0yRlCL/ASML3IdZWt9lwzW7v2s+9wX9almJkdt/GGzv5YRPwqMB+4HXgF+D1gg6RNk1Bf2WnLNRMB6z1iqpmVofHOFIZMAxqBpvSnE3i0WEWVs6HHc6714HhmVobG7FOQdDdwHrCPJAR+Anw2InyH1lE0T69j8SnT3a9gZmVpvDOF04B64EXgBaAD8G+7cbTnmj3chZmVpfH6FK4GLuLI4Hd/Cjwu6UFJnxhrX0kNkh6TtE7SxqHtJc2R9JCkZ9Lp7IJ9bpO0VdIWSVed3FvLTluumRe7D/PiXn9By8zKy7h9CpHYADwA/B/gx8CZwEfG2bUHeFtEtAHtwNWS3gzcCqyOiCXA6nQZSUuB5SSXq64G7pJUfULvKmNDj+f0TWxmVm7Ge0bzhyXdK2kH8AjJDWtbgN8C5oy1bxom+9PF2vQngGuBlWn7SuC6dP5a4N6I6ImIbcBW4OLjf0vZW7qgkdpq+UlsZlZ2xrt5bTHwLeCWiNh5vAdP/9J/guQBPV+MiEclzR86VkTslDQv3XwR8LOC3TvStpHHvBG4EeC000473pImRUNtNecuaHRns5mVnfH6FP4kIr51IoGQ7j8QEe0kN8FdLOn8MTbXaIcY5Zh3R8SyiFjW0tJyImVNirbWZp7u2MvAoB/PaWbl41jvUzgpEbEH+CFJX8FLkhYApNNd6WYdQK5gt1aS+yHKUluumf09/TzbtX/8jc3MSkTRQkFSy9CznCVNA94O/By4H1iRbrYCuC+dvx9YLqle0unAEuCxYtVXbO3ubDazMjRen8LJWACsTPsVqoBVEfFdST8FVkm6AdgOXA8QERslrQI2Af3ATRExUMT6iuqMuTOYVV/Duo49XL8sN/4OZmYloGihEBFPAxeO0r4buOIo+9wB3FGsmiZTVZV4Q67JZwpmVlYmpU+hUrW1NvPznfs43Fe2JzxmVmEcCkXUnmumfzDY2NmddSlmZsfEoVBE7mw2s3LjUCiieY0NLGhq8E1sZlY2HApF1tba7OEuzKxsOBSKrP20Zp7ffZBXD/RmXYqZ2bgcCkXW1pr2K/hswczKgEOhyC5obULC/QpmVhYcCkU2s76G18+b5VAws7LgUJgEbbkm1nXsJcIjpppZaXMoTIK2XDOvHOhlxyuHsi7FzGxMDoVJ4M5mMysXDoVJcPaps2iorXK/gpmVPIfCJKitruL8hR4x1cxKn0NhkrTlmtnwwl76BgazLsXM7KgcCpOkLddMT/8gW17cl3UpZmZH5VCYJBemI6Z6HCQzK2UOhUnSOnsac2bUsXa7Q8HMSpdDYZJIoq21yWcKZlbSHAqTqC3XzDO79rO/pz/rUszMRuVQmETtuWYiYH3H3qxLMTMbVdFCQVJO0g8kbZa0UdJH0vY5kh6S9Ew6nV2wz22StkraIumqYtWWlfydzb5fwcxKVDHPFPqBP42Ic4E3AzdJWgrcCqyOiCXA6nSZdN1y4DzgauAuSdVFrG/SzZ5Rx+tOme47m82sZBUtFCJiZ0Q8mc7vAzYDi4BrgZXpZiuB69L5a4F7I6InIrYBW4GLi1VfVtpzfjynmZWuSelTkLQYuBB4FJgfETshCQ5gXrrZImBHwW4dadvIY90oaY2kNV1dXcUsuyjaWpvZufcwL3UfzroUM7PXKHooSJoJfBv4aER0j7XpKG2veQBBRNwdEcsiYllLS8tElTlp2nLuVzCz0lXUUJBUSxII90TEP6XNL0lakK5fAOxK2zuAXMHurUBnMevLwnkLG6mpkvsVzKwkFfPbRwK+DGyOiM8WrLofWJHOrwDuK2hfLqle0unAEuCxYtWXlYbaas5d0Oh+BTMrSTVFPPalwH8E1ktam7bdDtwJrJJ0A7AduB4gIjZKWgVsIvnm0k0RMVDE+jLTlmvivqc6GRwMqqpGu2pmZpaNooVCRPyI0fsJAK44yj53AHcUq6ZS0dbazDd+tp1nX97PWfNmZV2OmVme72jOQHu+s9l3NptZaXEoZODMlpnMrK9xZ7OZlRyHQgaqqsQbWv14TjMrPQ6FjLTlmtm8s5vDfVOyL93MypRDISPtuWb6B4NNO8e6n8/MbHI5FDIy1NnsfgUzKyUOhYzMb2zg1MYG9yuYWUlxKGSoLdfkMwUzKykOhQy152bz3O6DfOuJDiJeM/afmdmkcyhk6D3LWln2utl87B/X8cGvPs4Lew5lXZKZVTiHQoZOmVnPqg9dwsfftZTHtr3CVZ97hHsefZ7BQZ81mFk2HAoZq6oSH7z0dB685TLe0NrEf/7OBt7/pUd5fveBrEszswrkUCgRuTnTuef338Qnf+sCNrywl6s+/whf/tE2BnzWYGaTyKFQQiTxvotP48E/uYxLzjiF//e7m7j+737C1l37si7NzCqEQ6EELWiaxlc+eBGfe28bz758gHd84Ud88Qdb6R8YzLo0M5viHAolShL/7sJWHrrlrbx96Tz+6vtbuO6uH7Op08NimFnxOBRKXMuseu56/xu56/2/wot7D/Puv/0Rn33oF/T2+6zBzCaeQ6FMvOOCBTx0y1t5V9tC/nr1M7zrb37ku6HNbMI5FMrI7Bl1fO697Xzlg8vYe6iPf3fXj/nkA5s9/LaZTRiHQhl62znzefBPLuO9F+X4+0ee5Zov/BuPP/dK1mWZ2RTgUChTjQ21fPK33sA9v/8m+gYGec/f/5S/vG8DB3r6sy7NzMpY0UJB0lck7ZK0oaBtjqSHJD2TTmcXrLtN0lZJWyRdVay6pppLz5rL9z96GSsuWczXf/Y8V33+EX70zMtZl2VmZaqYZwpfA64e0XYrsDoilgCr02UkLQWWA+el+9wlqbqItU0pM+pr+Pi7z2PVhy6hrrqKD3z5UW799tN0H+7LujQzKzNFC4WIeAQYeaH7WmBlOr8SuK6g/d6I6ImIbcBW4OJi1TZVXbR4Dg985C186K1nsGrNDq787MOs3vxS1mWZWRmZ7D6F+RGxEyCdzkvbFwE7CrbrSNvsODXUVnPbNefynT++lOZpddywcg0fvfcpXj3Qm3VpZlYGSqWjWaO0jToSnKQbJa2RtKarq6vIZZWvtlwz/3zzr/GRK5bw3ad3cuXnHuaB9TuzLsvMStxkh8JLkhYApNNdaXsHkCvYrhXoHO0AEXF3RCyLiGUtLS1FLbbc1dVUccuVr+efb/41FjRN44/veZI//F9PsGvf4axLM7MSNdmhcD+wIp1fAdxX0L5cUr2k04ElwGOTXNuUde6CRr7zx7/Kn199Dv+6ZRdXfvYR/ulJPwLUzF6rmF9J/SbwU+BsSR2SbgDuBK6U9AxwZbpMRGwEVgGbgO8BN0WEb9OdQDXVVfzR5WfywIffwlnzZvInq9bxe197nE4/AtTMCqic/1pctmxZrFmzJusyys7AYPD1nz7Hp7+3heoqcfs7zuV9F+eQRuvaMbOpRtITEbFs1HUOhcq1ffdB/vzbT/PTZ3dz3sJGLlo8h/MXNXHewkbOmjeT2upS+R6CmU0kh4IdVURw7+M7+Mc1O9i8cx+H0sH16mqqOOfUWZy3MAmJ8xY2cu6CRhpqfU+hWblzKNgxGRgMtr28n42d3Wzs7GbDC3vZ2NnN3kPJndHVVeLMlhmcv7CJpQsbOX9RMm1sqM24cjM7Hg4FO2ERQcerh9jY2c2mzr1s6OxmY+deXuruyW/zulOmp2cTTflpy6z6DKs2s7GMFQo1k12MlRdJ5OZMJzdnOleff2q+vWtfDxs796ZnFcn0gfUv5tfPb6znvIVNnL+wkaULmzh/USOLmqe5M9usxDkU7IS0zKrn8rPncfnZ8/Jt3Yf72JRedtqUXoL64ZZdDKYno03Tajkvvew0dEZx+twZVFc5KMxKhUPBJkxjQy1vPuMU3nzGKfm2w30D/PzFffn+iY2de/naT57LP2N6Wm015y6YlQ+KM1tm0jKrnnmzGphW505ts8nmPgWbdH0Dg/yyaz8bXjhy6WlTZzf7RzwgaFZ9DS2z6vM/82Y1MK+xnpaZ9ck0bWueVkuVzzbMjpn7FKyk1FZXcc6pjZxzaiO//cZWAAYHg+2vHOT5Vw6yq/swXft72NXdQ9f+Hrq6e9jwwl669u3iQO9rb3SvrRZzZ9YzLx8gDWlg1Oen8xobmDuzjvoan32YjcWhYCWhqkosnjuDxXNnjLndgZ5+uvb1sGtfD7v2Hc7PD007Xj3E2h172H2gl9FOgpun1x4505iZhMW8YWcjSag0NtS4U9wqkkPBysqM+hpm1NeMGx59A4O8cqA3Pds4zK7uwvBIwmTN86+ya19Pvn+jUE2VaJxWS/O02mQ6vZamdLkp31aXtBWsa5xW6xv8rKw5FGxKqq2uYn5jA/MbG4Cmo24XEXQf7qdr3+EjodHdw6sHe9l7qI89h/roPtTH7v29PNt1gL2H+ug+3DfqWciQ+pqqgqCoGxYqTSPmmwrCpbGhhhoPLWIZcyhYRZOU/+V81rxZx7TPwGCw/3A/ew6lwXGwj72Hhv/sOXhkXcerB9nUmQTMwVH6RArNqq8ZFiLT62qYXlfN9LpqGmqr8/PTjtZeW9BeV8302moHjR0Xh4LZcaquEk3Ta2mafvzDe/T2DxaEx2tDZc/B5MxkT7r8yoGDHOob4FBv8nOwb4CBweP7xmBddRXT8mFSzbTagmCpPUr7yLbaauprk2lDbXK8hpokkOprqvztrynEoWA2iepqqvKd2iciIugdGExCom+AgwWI63cAAAiiSURBVENh0TvAwd7+0dv7+jmcnx9q72fvwV5eHLHt0ICIx6u+5khQTKtLgqJhtBDJb1OVD5Wkbfj+DbVV1Ofn01CqqaKmWtRWOYSKyaFgVkYkUV9TTX1NNc1FOP7gYHC4f3hIHOwd4HBf4c8gh9L5Q+lyT35+gEN9g8O2f3l/f35d4f7He8ZTqErJg6Nqq5RMq0VNVRoa1VXUDGsfvs3Y26bTYfPJNrXVR0KpuurINtVVyWtUD71Weux8e7pv4fLQNoXLQ+uzDjyHgpnlVVUp7ceo4ZTxNz8pfQOD+WDpKQya3gEO9w8PlkO9A/T0D9I/GPQNDNI/EPQNJtP+gUH6BpNp0p62DQT96TbJaw3SP9A/vD2/fvi2/YNxUqF1MqrEsJBIAqbqSICkYfK2c+bxn9+5dMJf36FgZpmora6itrqKWSU69PrgYNA/mIRFXxo+Q6E0kK4bGAz6B5Jp3+DgsOWhkMlvN3hkv2SbwYJ1R45feOxhrzVwpJ7+weDUpmlFed8OBTOzUVRViboqUVe8R9mXpMp6t2ZmNiaHgpmZ5TkUzMwsr+RCQdLVkrZI2irp1qzrMTOrJCUVCpKqgS8C1wBLgfdJmvjvXJmZ2ahKKhSAi4GtEfFsRPQC9wLXZlyTmVnFKLVQWATsKFjuSNvyJN0oaY2kNV1dXZNanJnZVFdqoTDa/d3DbiuMiLsjYllELGtpaZmksszMKkOp3bzWAeQKlluBzqNt/MQTT7ws6fmiV1Vcc4GXsy6ihPjzGM6fxxH+LIY7mc/jdUdboRjraSGTTFIN8AvgCuAF4HHgP0TExkwLKyJJa472AO1K5M9jOH8eR/izGK5Yn0dJnSlERL+k/wR8H6gGvjKVA8HMrNSUVCgARMQDwANZ12FmVolKraO5Et2ddQElxp/HcP48jvBnMVxRPo+S6lMwM7Ns+UzBzMzyHApmZpbnUMiIpJykH0jaLGmjpI9kXVPWJFVLekrSd7OuJWuSmiV9S9LP0/9HLsm6pixJuiX9d7JB0jclNWRd02SS9BVJuyRtKGibI+khSc+k09kT8VoOhez0A38aEecCbwZu8uB/fATYnHURJeILwPci4hygjQr+XCQtAj4MLIuI80m+rr4826om3deAq0e03QqsjoglwOp0+aQ5FDISETsj4sl0fh/JP/pFY+81dUlqBd4JfCnrWrImqRG4DPgyQET0RsSebKvKXA0wLb3BdTpjjHQwFUXEI8ArI5qvBVam8yuB6ybitRwKJUDSYuBC4NFsK8nU54E/AwazLqQEnAF0AV9NL6d9SdKMrIvKSkS8AHwG2A7sBPZGxIPZVlUS5kfETkj+yATmTcRBHQoZkzQT+Dbw0YjozrqeLEj6TWBXRDyRdS0logb4FeB/RMSFwAEm6NJAOUqvlV8LnA4sBGZI+kC2VU1dDoUMSaolCYR7IuKfsq4nQ5cC75b0HMkzNN4m6RvZlpSpDqAjIobOHL9FEhKV6u3Atojoiog+4J+AX824plLwkqQFAOl010Qc1KGQEUkiuWa8OSI+m3U9WYqI2yKiNSIWk3Qg/mtEVOxfghHxIrBD0tlp0xXApgxLytp24M2Spqf/bq6ggjveC9wPrEjnVwD3TcRBS27sowpyKfAfgfWS1qZtt6djP5ndDNwjqQ54FvjdjOvJTEQ8KulbwJMk39p7igob8kLSN4HLgbmSOoC/BO4EVkm6gSQ4r5+Q1/IwF2ZmNsSXj8zMLM+hYGZmeQ4FMzPLcyiYmVmeQ8HMzPIcClbSJIWk/16w/DFJH5+gY39N0m9PxLHGeZ3r05FOf1DMuiQtlvQfjr9CsyMcClbqeoDfkjQ360IKSao+js1vAP44In69WPWkFgPHFQrH+T6sAjgUrNT1k9yodMvIFSP/opa0P51eLulhSask/ULSnZLeL+kxSeslnVlwmLdL+rd0u99M96+W9FeSHpf0tKQPFRz3B5L+AVg/Sj3vS4+/QdKn0ra/AH4N+DtJfzXKPn+W7rNO0p2jrH9uKBAlLZP0w3T+rZLWpj9PSZpFcjPTW9K2W471fUiaIelf0ho2SHrvsfyHsanJdzRbOfgi8LSkTx/HPm3AuSTDDT8LfCkiLk4fZnQz8NF0u8XAW4EzgR9IOgv4HZKROC+SVA/8WNLQqJwXA+dHxLbCF5O0EPgU8EbgVeBBSddFxH+V9DbgYxGxZsQ+15AMd/ymiDgoac5xvL+PATdFxI/TQRUPkwya97GIGAq3G4/lfUj690BnRLwz3a/pOOqwKcZnClby0tFjv07yoJVj9Xj6zIoe4JfA0C/D9SRBMGRVRAxGxDMk4XEO8BvA76TDjzwKnAIsSbd/bGQgpC4CfpgO2tYP3EPyTISxvB34akQcTN/nyPHyx/Jj4LOSPgw0p6850rG+j/UkZ0yfkvSWiNh7HHXYFONQsHLxeZJr84XPFegn/X84HSitrmBdT8H8YMHyIMPPkEeO8xKAgJsjoj39Ob1g/P4DR6lPx/pGRuwz3jgz+fcI5B9BGRF3Ar8PTAN+Jumcoxx/3PcREb8gOcNZD3wyveRlFcqhYGUh/St6FUkwDHmO5JcZJOPt157Aoa+XVJX2M5wBbAG+D/xROrQ5kl5/DA+5eRR4q6S5aeft+4CHx9nnQeD3JE1PX2e0y0fPceQ9/vuhRklnRsT6iPgUsIbkDGcfMKtg32N6H+mlr4MR8Q2Sh9lU8jDdFc99ClZO/jvwnwqW/ydwn6THSJ5Re7S/4seyheSX93zgDyPisKQvkVxiejI9A+linEcdRsROSbcBPyD5C/2BiBhzKOOI+J6kdmCNpF7gAeD2EZt9AviypNsZ/mS+j0r6dWCAZFjt/0NyFtQvaR3JM32/cIzv4wLgryQNAn3AH41Vt01tHiXVzMzyfPnIzMzyHApmZpbnUDAzszyHgpmZ5TkUzMwsz6FgZmZ5DgUzM8v7/wHba+5xffWB9QAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Finding the optimum number of clusters for k-means classification\n", "\n", "x = iris.iloc[:, [0, 1, 2, 3]].values\n", "\n", "from sklearn.cluster import KMeans\n", "wcss = []\n", "\n", "for i in range(1, 11):\n", " kmeans = KMeans(n_clusters = i, init = 'k-means++', \n", " max_iter = 300, n_init = 10, random_state = 0)\n", " kmeans.fit(x)\n", " wcss.append(kmeans.inertia_)\n", " \n", "# Plotting the results onto a line graph, \n", "# `allowing us to observe 'The elbow'\n", "plt.plot(range(1, 11), wcss)\n", "plt.title('The elbow method')\n", "plt.xlabel('Number of clusters')\n", "plt.ylabel('WCSS') # Within cluster sum of squares\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "IUXmLTh4Ih6r" }, "source": [ "We can clearly see why it is called 'The elbow method' from the above graph, the optimum clusters is where the elbow occurs. This is when the within cluster sum of squares (WCSS) doesn't decrease significantly with every iteration.\n", "\n", "From this we choose the number of clusters as **3**." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Verifying visually that with which cluster number, K-means will be optimum" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(24,4))\n", "\n", "plt.suptitle(\"K Means Clustering\",fontsize=20)\n", "\n", "\n", "plt.subplot(1,5,1)\n", "plt.title(\"K = 1\",fontsize=16)\n", "plt.xlabel(\"PetalLengthCm\")\n", "plt.ylabel(\"PetalWidthCm\")\n", "plt.scatter(features.PetalLengthCm,features.PetalWidthCm)\n", "\n", "\n", "plt.subplot(1,5,2)\n", "plt.title(\"K = 2\",fontsize=16)\n", "plt.xlabel(\"PetalLengthCm\")\n", "kmeans = KMeans(n_clusters=2)\n", "features[\"labels\"] = kmeans.fit_predict(features)\n", "plt.scatter(features.PetalLengthCm[features.labels == 0],features.PetalWidthCm[features.labels == 0])\n", "plt.scatter(features.PetalLengthCm[features.labels == 1],features.PetalWidthCm[features.labels == 1])\n", "\n", "# dropping labels we only want to use features.\n", "features.drop([\"labels\"],axis=1,inplace=True)\n", "\n", "plt.subplot(1,5,4)\n", "plt.title(\"K = 3\",fontsize=16)\n", "plt.xlabel(\"PetalLengthCm\")\n", "kmeans = KMeans(n_clusters=3)\n", "features[\"labels\"] = kmeans.fit_predict(features)\n", "plt.scatter(features.PetalLengthCm[features.labels == 0],features.PetalWidthCm[features.labels == 0])\n", "plt.scatter(features.PetalLengthCm[features.labels == 1],features.PetalWidthCm[features.labels == 1])\n", "plt.scatter(features.PetalLengthCm[features.labels == 2],features.PetalWidthCm[features.labels == 2])\n", "\n", "# dropping labels as we only want to use features.\n", "features.drop([\"labels\"],axis=1,inplace=True)\n", "\n", "plt.subplot(1,5,3)\n", "plt.title(\"K = 4\",fontsize=16)\n", "plt.xlabel(\"PetalLengthCm\")\n", "kmeans = KMeans(n_clusters=4)\n", "features[\"labels\"] = kmeans.fit_predict(features)\n", "plt.scatter(features.PetalLengthCm[features.labels == 0],features.PetalWidthCm[features.labels == 0])\n", "plt.scatter(features.PetalLengthCm[features.labels == 1],features.PetalWidthCm[features.labels == 1])\n", "plt.scatter(features.PetalLengthCm[features.labels == 2],features.PetalWidthCm[features.labels == 2])\n", "plt.scatter(features.PetalLengthCm[features.labels == 3],features.PetalWidthCm[features.labels == 3])\n", "\n", "# dropping labels as we only want to use features.\n", "features.drop([\"labels\"],axis=1,inplace=True)\n", "\n", "plt.subplot(1,5,5)\n", "plt.title(\"Original Labels\",fontsize=16)\n", "plt.xlabel(\"PetalLengthCm\")\n", "plt.scatter(iris.PetalLengthCm[iris.Species == \"Iris-setosa\"],iris.PetalWidthCm[iris.Species == \"Iris-setosa\"])\n", "plt.scatter(iris.PetalLengthCm[iris.Species == \"Iris-versicolor\"],iris.PetalWidthCm[iris.Species == \"Iris-versicolor\"])\n", "plt.scatter(iris.PetalLengthCm[iris.Species == \"Iris-virginica\"],iris.PetalWidthCm[iris.Species == \"Iris-virginica\"])\n", "\n", "plt.subplots_adjust(top=0.8)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "colab": {}, "colab_type": "code", "id": "aJbyXuNGIXI9" }, "outputs": [], "source": [ "# Applying kmeans to the dataset / Creating the kmeans classifier\n", "kmeans = KMeans(n_clusters = 3, init = 'k-means++',\n", " max_iter = 300, n_init = 10, random_state = 0)\n", "y_kmeans = kmeans.fit_predict(x)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 364 }, "colab_type": "code", "executionInfo": { "elapsed": 670, "status": "ok", "timestamp": 1544110172140, "user": { "displayName": "A M Aditya", "photoUrl": "https://lh3.googleusercontent.com/-WI8p7JNWLic/AAAAAAAAAAI/AAAAAAAAAfs/vS8ElgH0p0c/s64/photo.jpg", "userId": "15341571102300750919" }, "user_tz": -480 }, "id": "Q42-XPJjIyXv", "outputId": "12284613-40c5-41c6-93ba-6b66fae0aa5f" }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Visualising the clusters - On the first two columns\n", "plt.scatter(x[y_kmeans == 0, 0], x[y_kmeans == 0, 1], \n", " s = 100, c = 'red', label = 'Iris-setosa')\n", "plt.scatter(x[y_kmeans == 1, 0], x[y_kmeans == 1, 1], \n", " s = 100, c = 'blue', label = 'Iris-versicolour')\n", "plt.scatter(x[y_kmeans == 2, 0], x[y_kmeans == 2, 1],\n", " s = 100, c = 'green', label = 'Iris-virginica')\n", "\n", "# Plotting the centroids of the clusters\n", "plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:,1], \n", " s = 100, c = 'yellow', label = 'Centroids')\n", "\n", "plt.legend()" ] } ], "metadata": { "colab": { "collapsed_sections": [], "name": "KMeans_Clustering.ipynb", "provenance": [], "version": "0.3.2" }, "hide_input": false, "kernelspec": { "display_name": "Python 3", "language": "python", "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.8.8" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": false }, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false } }, "nbformat": 4, "nbformat_minor": 1 } ================================================ FILE: 02_Python/K-Means_Implementation/Links.txt ================================================ https://www.machinelearningplus.com/predictive-modeling/k-means-clustering/ ================================================ FILE: 02_Python/K-Means_Implementation/README.md ================================================ # K-Means-Clustering It is a Unsupervised Machine Learning Algorithm. In this notebook we to predict the optimum number of clusters in Iris dataset and represent it visually. ================================================ FILE: 02_Python/K_Means.py ================================================ #================================================================================================================ #---------------------------------------------------------------------------------------------------------------- # K MEANS CLUSTERING #---------------------------------------------------------------------------------------------------------------- #================================================================================================================ # K means clustering is applied to normalized ipl player data import numpy as np import matplotlib.pyplot as plt from matplotlib import style import pandas as pd style.use('ggplot') class K_Means: def __init__(self, k =3, tolerance = 0.0001, max_iterations = 500): self.k = k self.tolerance = tolerance self.max_iterations = max_iterations def fit(self, data): self.centroids = {} #initialize the centroids, the first 'k' elements in the dataset will be our initial centroids for i in range(self.k): self.centroids[i] = data[i] #begin iterations for i in range(self.max_iterations): self.classes = {} for i in range(self.k): self.classes[i] = [] #find the distance between the point and cluster; choose the nearest centroid for features in data: distances = [np.linalg.norm(features - self.centroids[centroid]) for centroid in self.centroids] classification = distances.index(min(distances)) self.classes[classification].append(features) previous = dict(self.centroids) #average the cluster datapoints to re-calculate the centroids for classification in self.classes: self.centroids[classification] = np.average(self.classes[classification], axis = 0) isOptimal = True for centroid in self.centroids: original_centroid = previous[centroid] curr = self.centroids[centroid] if np.sum((curr - original_centroid)/original_centroid * 100.0) > self.tolerance: isOptimal = False #break out of the main loop if the results are optimal, ie. the centroids don't change their positions much(more than our tolerance) if isOptimal: break def pred(self, data): distances = [np.linalg.norm(data - self.centroids[centroid]) for centroid in self.centroids] classification = distances.index(min(distances)) return classification def main(): df = pd.read_csv(r".\data\ipl.csv") df = df[['one', 'two']] dataset = df.astype(float).values.tolist() X = df.values #returns a numpy array km = K_Means(3) km.fit(X) # Plotting starts here colors = 10*["r", "g", "c", "b", "k"] for centroid in km.centroids: plt.scatter(km.centroids[centroid][0], km.centroids[centroid][1], s = 130, marker = "x") for classification in km.classes: color = colors[classification] for features in km.classes[classification]: plt.scatter(features[0], features[1], color = color,s = 30) plt.show() if __name__ == "__main__": main() ================================================ FILE: 02_Python/K_Nearest_Neighbours.py ================================================ #================================================================================================================ #---------------------------------------------------------------------------------------------------------------- # K NEAREST NEIGHBOURS #---------------------------------------------------------------------------------------------------------------- #================================================================================================================ # Details of implementation/tutorial is in : http://madhugnadig.com/articles/machine-learning/2017/01/13/implementing-k-nearest-neighbours-from-scratch-in-python.html import math import numpy as np import matplotlib.pyplot as plt from matplotlib import style import pandas as pd import random from collections import Counter from sklearn import preprocessing import time #for plotting plt.style.use('ggplot') class CustomKNN: def __init__(self): self.accurate_predictions = 0 self.total_predictions = 0 self.accuracy = 0.0 def predict(self, training_data, to_predict, k = 3): if len(training_data) >= k: print("K cannot be smaller than the total voting groups(ie. number of training data points)") return distributions = [] for group in training_data: for features in training_data[group]: euclidean_distance = np.linalg.norm(np.array(features)- np.array(to_predict)) distributions.append([euclidean_distance, group]) results = [i[1] for i in sorted(distributions)[:k]] result = Counter(results).most_common(1)[0][0] confidence = Counter(results).most_common(1)[0][1]/k return result, confidence def test(self, test_set, training_set): for group in test_set: for data in test_set[group]: predicted_class,confidence = self.predict(training_set, data, k =3) if predicted_class == group: self.accurate_predictions += 1 else: print("Wrong classification with confidence " + str(confidence * 100) + " and class " + str(predicted_class)) self.total_predictions += 1 self.accuracy = 100*(self.accurate_predictions/self.total_predictions) print("\nAcurracy :", str(self.accuracy) + "%") def mod_data(df): df.replace('?', -999999, inplace = True) df.replace('yes', 4, inplace = True) df.replace('no', 2, inplace = True) df.replace('notpresent', 4, inplace = True) df.replace('present', 2, inplace = True) df.replace('abnormal', 4, inplace = True) df.replace('normal', 2, inplace = True) df.replace('poor', 4, inplace = True) df.replace('good', 2, inplace = True) df.replace('ckd', 4, inplace = True) df.replace('notckd', 2, inplace = True) def main(): df = pd.read_csv(r".\data\chronic_kidney_disease.csv") mod_data(df) dataset = df.astype(float).values.tolist() #Normalize the data x = df.values #returns a numpy array min_max_scaler = preprocessing.MinMaxScaler() x_scaled = min_max_scaler.fit_transform(x) df = pd.DataFrame(x_scaled) #Replace df with normalized values #Shuffle the dataset random.shuffle(dataset) #20% of the available data will be used for testing test_size = 0.2 #The keys of the dict are the classes that the data is classfied into training_set = {2: [], 4:[]} test_set = {2: [], 4:[]} #Split data into training and test for cross validation training_data = dataset[:-int(test_size * len(dataset))] test_data = dataset[-int(test_size * len(dataset)):] #Insert data into the training set for record in training_data: training_set[record[-1]].append(record[:-1]) # Append the list in the dict will all the elements of the record except the class #Insert data into the test set for record in test_data: test_set[record[-1]].append(record[:-1]) # Append the list in the dict will all the elements of the record except the class s = time.clock() knn = CustomKNN() knn.test(test_set, training_set) e = time.clock() print("Exec Time:" ,e-s) if __name__ == "__main__": main() ================================================ FILE: 02_Python/K_Nearest_Neighbours_In_Parallel.py ================================================ #================================================================================================================ #---------------------------------------------------------------------------------------------------------------- # K NEAREST NEIGHBOURS #---------------------------------------------------------------------------------------------------------------- #================================================================================================================ # Details of implementation/tutorial is in : http://madhugnadig.com/articles/machine-learning/parallel-processing/2017/02/10/implementing-k-nearest-neighbours-in-parallel-from-scratch.html import math import numpy as np import matplotlib.pyplot as plt from matplotlib import style import pandas as pd import random from collections import Counter from sklearn import preprocessing from itertools import repeat import multiprocessing as mp import time #for plotting plt.style.use('ggplot') class CustomKNN: def __init__(self): self.accurate_predictions = 0 self.total_predictions = 0 self.accuracy = 0.0 def predict(self, training_data, to_predict, k = 3): if len(training_data) >= k: print("K cannot be smaller than the total voting groups(ie. number of training data points)") return distributions = [] for group in training_data: for features in training_data[group]: #Calculate Euclidean distance euclidean_distance = np.linalg.norm(np.array(features)- np.array(to_predict)) distributions.append([euclidean_distance, group]) #Find the class of K nearest points results = [i[1] for i in sorted(distributions)[:k]] result = Counter(results).most_common(1)[0][0] confidence = Counter(results).most_common(1)[0][1]/k return result, to_predict def test(self, test_set, training_set): pool = mp.Pool(processes= 8) arr = {} s = time.clock() # 'Parallelization' happens here for group in test_set: arr[group] = pool.starmap(self.predict, zip(repeat(training_set), test_set[group], repeat(3))) e = time.clock() #Calculating Accuracy for group in test_set: for data in test_set[group]: for i in arr[group]: if data == i[1]: self.total_predictions += 1 #If accuracte -> predicted class = original class if group == i[0]: self.accurate_predictions+=1 self.accuracy = 100*(self.accurate_predictions/self.total_predictions) print("\nAcurracy :", str(self.accuracy) + "%") def mod_data(df): df.replace('?', -999999, inplace = True) df.replace('yes', 4, inplace = True) df.replace('no', 2, inplace = True) df.replace('notpresent', 4, inplace = True) df.replace('present', 2, inplace = True) df.replace('abnormal', 4, inplace = True) df.replace('normal', 2, inplace = True) df.replace('poor', 4, inplace = True) df.replace('good', 2, inplace = True) df.replace('ckd', 4, inplace = True) df.replace('notckd', 2, inplace = True) def main(): #Load the dataset df = pd.read_csv(r".\data\chronic_kidney_disease.csv") mod_data(df) dataset = df.astype(float).values.tolist() #Normalize the data x = df.values #returns a numpy array min_max_scaler = preprocessing.MinMaxScaler() x_scaled = min_max_scaler.fit_transform(x) df = pd.DataFrame(x_scaled) #Replace df with normalized values #Shuffle the dataset random.shuffle(dataset) #10% of the available data will be used for testing test_size = 0.1 #The keys of the dict are the classes that the data is classfied into training_set = {2: [], 4:[]} test_set = {2: [], 4:[]} #Split data into training and test for cross validation training_data = dataset[:-int(test_size * len(dataset))] test_data = dataset[-int(test_size * len(dataset)):] #Insert data into the training set for record in training_data: training_set[record[-1]].append(record[:-1]) # Append the list in the dict will all the elements of the record except the class #Insert data into the test set for record in test_data: test_set[record[-1]].append(record[:-1]) # Append the list in the dict will all the elements of the record except the class s = time.clock() knn = CustomKNN() knn.test(test_set, training_set) e = time.clock() print("Exec Time: ", e-s) if __name__ == "__main__": main() ================================================ FILE: 02_Python/Linear_Regression.py ================================================ #================================================================================================================ #---------------------------------------------------------------------------------------------------------------- # SIMPLE LINEAR REGRESSION #---------------------------------------------------------------------------------------------------------------- #================================================================================================================ #Simple linear regression is applied to stock data, where the x values are time and y values are the stock closing price. #This is not an ideal application of simple linear regression, but it suffices to be a good experiment. import math import numpy as np import matplotlib.pyplot as plt from matplotlib import style import pandas import datetime #Quandl for getting stock data import quandl #for plotting plt.style.use('ggplot') class CustomLinearRegression: def __init__(self): self.intercept = 0 self.slope = 0 #arithmetic mean def am(self, arr): tot = 0.0 for i in arr: tot+= i return tot/len(arr) #finding the slope in best fit line def best_fit(self, dimOne, dimTwo): self.slope = ( (self.am(dimOne) * self.am(dimTwo) ) - self.am(dimOne*dimTwo) ) / ( self.am(dimOne)**2 - self.am(dimOne**2) ) #formula for finding slope return self.slope #finding the best fit intercept def y_intercept(self, dimOne ,dimTwo): self.intercept = self.am( dimTwo ) - ( self.slope * self.am(dimOne) ) return self.intercept #predict for future values based on model def predict(self, ip): ip = np.array(ip) predicted = [(self.slope*param) + self.intercept for param in ip] #create a "predicted" array where the index corresponds to the index of the input return predicted #find the squared error def squared_error(self, original, model): return sum((model - original) **2) #find co-efficient of determination for R^2 def cod(self, original, model): am_line = [self.am(original) for y in original] sq_error = self.squared_error(original, model) sq_error_am = self.squared_error(original, am_line) return 1 - (sq_error/sq_error_am) #R^2 is nothing but 1 - of squared error for our model / squared error if the model only consisted of the mean def main(): stk = quandl.get("WIKI/TSLA") simpl_linear_regression = CustomLinearRegression() #reset index to procure date - date was the initial default index stk = stk.reset_index() #Add them headers stk = stk[['Date','Adj. Open','Adj. High','Adj. Low','Adj. Close', 'Volume']] stk['Date'] = pandas.to_datetime(stk['Date']) stk['Date'] = (stk['Date'] - stk['Date'].min()) / np.timedelta64(1,'D') #The column that needs to be forcasted using linear regression forecast_col = 'Adj. Close' #take care of NA's stk.fillna(-999999, inplace = True) stk['label'] = stk[forecast_col] #IN CASE THE INPUT IS TO BE TAKEN IN FROM THE COMMAND PROMPT UNCOMMENT THE LINES BELOW #takes in input from the user #x = list(map(int, input("Enter x: \n").split())) #y = list(map(int, input("Enter y: \n").split())) #convert to an numpy array with datatype as 64 bit float. #x = np.array(x, dtype = np.float64) #y = np.array(y, dtype = np.float64) stk.dropna(inplace = True) x = np.array(stk['Date']) y = np.array(stk['label']) #Always in the order: first slope, then intercept slope = simpl_linear_regression.best_fit(x, y) #find slope intercept = simpl_linear_regression.y_intercept(x, y) #find the intercept ip = list(map(int, input("Enter x to predict y: \n").split())) line = simpl_linear_regression.predict(ip) #predict based on model reg = [(slope*param) + intercept for param in x] print("Predicted value(s) after linear regression :", line) r_sqrd = simpl_linear_regression.cod(y, reg) print("R^2 Value: " ,r_sqrd) plt.scatter(x, y) plt.scatter(ip, line, color = "red") plt.plot(x, reg) plt.show() if __name__ == "__main__": main() ================================================ FILE: 02_Python/Logistic_Regression.py ================================================ #================================================================================================================ #---------------------------------------------------------------------------------------------------------------- # LOGISTIC REGRESSION #---------------------------------------------------------------------------------------------------------------- #================================================================================================================ import math import numpy as np import matplotlib.pyplot as plt from matplotlib import style import pandas as pd import datetime from sklearn.cross_validation import train_test_split #for plotting plt.style.use('ggplot') #Using gradient decent here to arrive at the optimal. class CustomLogisticRegression: def __init__(self, x, y, tolerence = 0.00001): self.tolerence = tolerence self.cost = [] self.alpha = 0.1 self.lambd = 0.25 self.iter = 2500 self.x = x self.y = y #initialie theta self.theta = np.random.rand(x.shape[1],1) #the cost function def cost_fn(self, m): h = self.sigmoid_function(np.dot(self.x, self.theta)) #get the hypothesis J = ( 1.0/m ) * np.sum( -self.y * (np.log (h)) - ( 1.0 -self.y ) * (np.log(1.0 -h)) ) #This is the cost that needs to be paid by the learning algorithm if the outcome is hθ(x) and the actual outcome is y return J #The sigmoid function def sigmoid_function(z): return 1.0 / ( 1.0 + math.e**(-1*z) ) #Using 1.0 to make it a floating point type #Gradient function def gradients(self, m): zrd = self.theta zrd[0, :] = 0 h = self.sigmoid_function(np.dot(self.x, self.theta)) #get the hypothesis return ( 1.0/m ) * np.dot(self.x.T, ( h - self.y ) ) + (float(self.lambd)/m) * zrd #This is batch def descent(self): for i in range(self.iter): self.cost.append( self.cost_fn(self.x.shape[0])) gradientz = self.gradients(x.shape[0]) #Change theta based on the "gradientz" self.theta[0, :] = gradientz[0, :] - self.alpha * gradientz[0, :] self.theta[1, :] = gradientz[1:, :] - self.alpha * gradientz[1:, :] pred = np.dot(self.x, self.theta) pred[ pred >= 0.5 ] = 1 pred[ pred < 0.5 ] = 0 def main(): #IN CASE THE INPUT IS TO BE TAKEN IN FROM THE COMMAND PROMPT #takes in input from the user #x = list(map(int, input("Enter x: \n").split())) #y = list(map(int, input("Enter y: \n").split())) #convert to an numpy array with datatype as 64 bit float. #x = np.array(x, dtype = np.float64) #y = np.array(y, dtype = np.float64) df = pd.read_table('.\data\logistic_regression_data.txt', sep = ',', names = ('featureOne', 'featureTwo', 'label')) y = np.array(df['label']).T df = np.array(df) x = df[:,:2] #normalize the data df = (df - df.mean()) / (df.max() - df.min()) x_test, y_test, x_train, y_train = train_test_split(x,y, test_size = 0.1, random_state = 0) glm = CustomLogisticRegression(x, y) glm.descent() plt.scatter(x[:,0], y) plt.show() if __name__ == "__main__": main() ================================================ FILE: 02_Python/MSCRED/cnn_lstm/Untitled.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import tensorflow as tf\n", "\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "INFO line 17:13: Renamed keyword argument for tf.nn.conv2d from filter to filters\n", "INFO line 33:72: Changing tf.contrib.layers xavier initializer to a tf.compat.v1.keras.initializers.VarianceScaling and converting arguments.\n", "\n", "WARNING line 73:21: Using member tf.contrib.rnn.ConvLSTMCell in deprecated module tf.contrib.rnn. (Manual edit required) tf.contrib.rnn.* has been deprecated, and widely used cells/functions will be moved to tensorflow/addons repository. Please check it there and file Github issues if necessary.\n", "ERROR line 73:21: Using member tf.contrib.rnn.ConvLSTMCell in deprecated module tf.contrib. tf.contrib.rnn.ConvLSTMCell cannot be converted automatically. tf.contrib will not be distributed with TensorFlow 2.0, please consider an alternative in non-contrib TensorFlow, a community-maintained repository such as tensorflow/addons, or fork the required code.\n", "INFO line 84:21: Renamed 'tf.nn.dynamic_rnn' to 'tf.compat.v1.nn.dynamic_rnn'\n", "INFO line 89:27: Added keywords to args of function 'tf.reduce_sum'\n", "INFO line 109:13: Renamed keyword argument for tf.nn.conv2d_transpose from value to input\n", "INFO line 109:13: Renamed keyword argument for tf.nn.conv2d_transpose from filter to filters\n", "INFO line 143:11: Renamed 'tf.Session' to 'tf.compat.v1.Session'" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2020-07-29 12:50:45.162844: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cudart64_101.dll\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "INFO line 164:11: Added keywords to args of function 'tf.reduce_mean'\n", "INFO line 168:11: Renamed 'tf.global_variables_initializer' to 'tf.compat.v1.global_variables_initializer'\n", "WARNING line 198:4: *.save requires manual check. (This warning is only applicable if the code saves a tf.Keras model) Keras model.save now saves to the Tensorflow SavedModel format by default, instead of HDF5. To continue saving to HDF5, add the argument save_format='h5' to the save() function.\n", "TensorFlow 2.0 Upgrade Script\n", "-----------------------------\n", "Converted 1 files\n", "Detected 3 issues that require attention\n", "--------------------------------------------------------------------------------\n", "--------------------------------------------------------------------------------\n", "File: convlstm.py\n", "--------------------------------------------------------------------------------\n", "convlstm.py:73:21: WARNING: Using member tf.contrib.rnn.ConvLSTMCell in deprecated module tf.contrib.rnn. (Manual edit required) tf.contrib.rnn.* has been deprecated, and widely used cells/functions will be moved to tensorflow/addons repository. Please check it there and file Github issues if necessary.\n", "convlstm.py:73:21: ERROR: Using member tf.contrib.rnn.ConvLSTMCell in deprecated module tf.contrib. tf.contrib.rnn.ConvLSTMCell cannot be converted automatically. tf.contrib will not be distributed with TensorFlow 2.0, please consider an alternative in non-contrib TensorFlow, a community-maintained repository such as tensorflow/addons, or fork the required code.\n", "convlstm.py:198:4: WARNING: *.save requires manual check. (This warning is only applicable if the code saves a tf.Keras model) Keras model.save now saves to the Tensorflow SavedModel format by default, instead of HDF5. To continue saving to HDF5, add the argument save_format='h5' to the save() function.\n", "\n", "\n", "Make sure to read the detailed log 'report.txt'\n", "\n" ] } ], "source": [ "!tf_upgrade_v2 \\\n", " --infile convlstm.py \\\n", " --outfile convlstm-update.py " ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "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.7.7" } }, "nbformat": 4, "nbformat_minor": 4 } ================================================ FILE: 02_Python/MSCRED/cnn_lstm/__init__.py ================================================ ================================================ FILE: 02_Python/MSCRED/cnn_lstm/convlstm-update.py ================================================ import tensorflow as tf import cnn_lstm.utils as util import numpy as np import os def cnn_encoder_layer(data, filter_layer, strides): """ :param data: the input data, when it is the first layer is 5 * 30 * 30 * 3, the second layer is 30 * 30 * 32, the third layer is 15 * 15 * 64, the fourth layer is 8 * 8 * 128 :param filter_layer: :param strides: :return: the result after conv, the first layer is 30 * 30 * 32, the second layer is 15 * 15 * 64, the third layer is 8 * 8 * 128, the final layer is 4 * 4 * 256 """ result = tf.nn.conv2d( input=data, filters=filter_layer, strides=strides, padding="SAME") return tf.nn.selu(result) def tensor_variable(shape, name): """ Tensor variable declaration initialization :param shape: :param name: :return: """ variable = tf.Variable(tf.zeros(shape), name=name) variable = tf.compat.v1.get_variable(name, shape=shape, initializer=tf.compat.v1.keras.initializers.VarianceScaling(scale=1.0, mode="fan_avg", distribution="uniform")) return variable def cnn_encoder(data): """ :param data: the input data size is 5 * 30 * 30 * 3 :return: """ # the first layer,the output size is 30 * 30 * 32 filter1 = tensor_variable([3, 3, 3, 32], "filter1") strides1 = (1, 1, 1, 1) cnn1_out = cnn_encoder_layer(data, filter1, strides1) # the second layer, the output size is 15 * 15 * 64 filter2 = tensor_variable([3, 3, 32, 64], "filter2") strides2 = (1, 2, 2, 1) cnn2_out = cnn_encoder_layer(cnn1_out, filter2, strides2) # the third layer, the output size is 8 * 8 * 128 filter3 = tensor_variable([2, 2, 64, 128], "filter3") strides3 = (1, 2, 2, 1) cnn3_out = cnn_encoder_layer(cnn2_out, filter3, strides3) # the fourth layer, the output size is 4 * 4 * 256 filter4 = tensor_variable([2, 2, 128, 256], "filter4") strides4 = (1, 2, 2, 1) cnn4_out = cnn_encoder_layer(cnn3_out, filter4, strides4) return cnn1_out, cnn2_out, cnn3_out, cnn4_out def cnn_lstm_attention_layer(input_data, layer_number): """ :param input_data: :param layer_number: :return: """ convlstm_layer = tf.contrib.rnn.ConvLSTMCell( conv_ndims=2, input_shape=[input_data.shape[2], input_data.shape[3], input_data.shape[4]], output_channels=input_data.shape[-1], kernel_shape=[2, 2], use_bias=True, skip_connection=False, forget_bias=1.0, initializers=None, name="conv_lstm_cell" + str(layer_number)) outputs, state = tf.compat.v1.nn.dynamic_rnn(convlstm_layer, input_data, dtype=input_data.dtype) # attention based on inner-product between feature representation of last step and other steps attention_w = [] for k in range(util.step_max): attention_w.append(tf.reduce_sum(input_tensor=tf.multiply(outputs[0][k], outputs[0][-1])) / util.step_max) attention_w = tf.reshape(tf.nn.softmax(tf.stack(attention_w)), [1, util.step_max]) outputs = tf.reshape(outputs[0], [util.step_max, -1]) outputs = tf.matmul(attention_w, outputs) outputs = tf.reshape(outputs, [1, input_data.shape[2], input_data.shape[3], input_data.shape[4]]) return outputs, attention_w def cnn_decoder_layer(conv_lstm_out_c, filter, output_shape, strides): """ :param conv_lstm_out_c: :param filter: :param output_shape: :param strides: :return: """ deconv = tf.nn.conv2d_transpose( input=conv_lstm_out_c, filters=filter, output_shape=output_shape, strides=strides, padding="SAME") deconv = tf.nn.selu(deconv) return deconv def cnn_decoder(lstm1_out, lstm2_out, lstm3_out, lstm4_out): d_filter4 = tensor_variable([2, 2, 128, 256], "d_filter4") dec4 = cnn_decoder_layer(lstm4_out, d_filter4, [1, 8, 8, 128], (1, 2, 2, 1)) dec4_concat = tf.concat([dec4, lstm3_out], axis=3) d_filter3 = tensor_variable([2, 2, 64, 256], "d_filter3") dec3 = cnn_decoder_layer(dec4_concat, d_filter3, [1, 15, 15, 64], (1, 2, 2, 1)) dec3_concat = tf.concat([dec3, lstm2_out], axis=3) d_filter2 = tensor_variable([3, 3, 32, 128], "d_filter2") dec2 = cnn_decoder_layer(dec3_concat, d_filter2, [1, 30, 30, 32], (1, 2, 2, 1)) dec2_concat = tf.concat([dec2, lstm1_out], axis=3) d_filter1 = tensor_variable([3, 3, 3, 64], "d_filter1") dec1 = cnn_decoder_layer(dec2_concat, d_filter1, [1, 30, 30, 3], (1, 1, 1, 1)) return dec1 def main(): # Read dataset from file matrix_data_path = util.train_data_path + "train.npy" matrix_gt_1 = np.load(matrix_data_path) sess = tf.compat.v1.Session() data_input = tf.compat.v1.placeholder(tf.float32, [util.step_max, 30, 30, 3]) # cnn encoder conv1_out, conv2_out, conv3_out, conv4_out = cnn_encoder(data_input) conv1_out = tf.reshape(conv1_out, [-1, 5, 30, 30, 32]) conv2_out = tf.reshape(conv2_out, [-1, 5, 15, 15, 64]) conv3_out = tf.reshape(conv3_out, [-1, 5, 8, 8, 128]) conv4_out = tf.reshape(conv4_out, [-1, 5, 4, 4, 256]) # lstm with attention conv1_lstm_attention_out, atten_weight_1 = cnn_lstm_attention_layer(conv1_out, 1) conv2_lstm_attention_out, atten_weight_2 = cnn_lstm_attention_layer(conv2_out, 2) conv3_lstm_attention_out, atten_weight_3 = cnn_lstm_attention_layer(conv3_out, 3) conv4_lstm_attention_out, atten_weight_4 = cnn_lstm_attention_layer(conv4_out, 4) # cnn decoder deconv_out = cnn_decoder(conv1_lstm_attention_out, conv2_lstm_attention_out, conv3_lstm_attention_out, conv4_lstm_attention_out) # loss function: reconstruction error of last step matrix loss = tf.reduce_mean(input_tensor=tf.square(data_input[-1] - deconv_out)) optimizer = tf.compat.v1.train.AdamOptimizer(learning_rate=util.learning_rate).minimize(loss) # variable initialization init = tf.compat.v1.global_variables_initializer() sess.run(init) # training for idx in range(util.train_start_id, util.train_end_id): matrix_gt = matrix_gt_1[idx - util.train_start_id] feed_dict = {data_input: np.asarray(matrix_gt)} a, loss_value = sess.run([optimizer, loss], feed_dict) print("mse of last train data: " + str(loss_value)) # test # Read the data from test file. matrix_data_path = util.test_data_path + "test.npy" matrix_gt_1 = np.load(matrix_data_path) result_all = [] for idx in range(util.test_start_id, util.test_end_id): matrix_gt = matrix_gt_1[idx - util.test_start_id] feed_dict = {data_input: np.asarray(matrix_gt)} result, loss_value = sess.run([deconv_out, loss], feed_dict) result_all.append(result) print("mse of last test data: " + str(loss_value)) # Write the reconstructed matrix to the file reconstructed_path = util.reconstructed_data_path if not os.path.exists(reconstructed_path): os.makedirs(reconstructed_path) reconstructed_path = reconstructed_path + "test_reconstructed.npy" result_all = np.asarray(result_all).reshape((-1, 30, 30, 3)) print(result_all.shape) np.save(reconstructed_path, result_all) if __name__ == '__main__': main() ================================================ FILE: 02_Python/MSCRED/cnn_lstm/convlstm.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "WARNING:tensorflow:\n", "The TensorFlow contrib module will not be included in TensorFlow 2.0.\n", "For more information, please see:\n", " * https://github.com/tensorflow/community/blob/master/rfcs/20180907-contrib-sunset.md\n", " * https://github.com/tensorflow/addons\n", " * https://github.com/tensorflow/io (for I/O related ops)\n", "If you depend on functionality not listed there, please file an issue.\n", "\n", "WARNING:tensorflow:From :85: dynamic_rnn (from tensorflow.python.ops.rnn) is deprecated and will be removed in a future version.\n", "Instructions for updating:\n", "Please use `keras.layers.RNN(cell)`, which is equivalent to this API\n", "WARNING:tensorflow:From c:\\programdata\\anaconda3\\envs\\tfdeeplearning\\lib\\site-packages\\tensorflow_core\\contrib\\rnn\\python\\ops\\rnn_cell.py:2244: calling Constant.__init__ (from tensorflow.python.ops.init_ops) with dtype is deprecated and will be removed in a future version.\n", "Instructions for updating:\n", "Call initializer instance with the dtype argument instead of passing it to the constructor\n", "mse of last train data: 0.00056191476\n", "mse of last train data: 0.0008397814\n", "mse of last train data: 0.0009788115\n", "mse of last train data: 0.0015275143\n", "mse of last train data: 0.0018960452\n", "mse of last train data: 0.0015373339\n", "mse of last train data: 0.0012186245\n", "mse of last train data: 0.0009643246\n", "mse of last train data: 0.00080712256\n", "mse of last train data: 0.0006685078\n", "mse of last train data: 0.00055669027\n", "mse of last train data: 0.0004998121\n", "mse of last train data: 0.00046998213\n", "mse of last train data: 0.0004438546\n", "mse of last train data: 0.00042290962\n", "mse of last train data: 0.00040549517\n", "mse of last train data: 0.00037338244\n", "mse of last train data: 0.00034272377\n", "mse of last train data: 0.0003186365\n", "mse of last train data: 0.0002920385\n", "mse of last train data: 0.00030394315\n", "mse of last train data: 0.00040858088\n", "mse of last train data: 0.000509995\n", "mse of last train data: 0.00048521854\n", "mse of last train data: 0.00054299145\n", "mse of last train data: 0.00043364725\n", "mse of last train data: 0.00037081417\n", "mse of last train data: 0.00033152517\n", "mse of last train data: 0.00030633438\n", "mse of last train data: 0.00029974605\n", "mse of last train data: 0.00028598175\n", "mse of last train data: 0.00026241553\n", "mse of last train data: 0.00023329386\n", "mse of last train data: 0.0002067556\n", "mse of last train data: 0.0001858864\n", "mse of last train data: 0.00017865832\n", "mse of last train data: 0.00017368651\n", "mse of last train data: 0.00016670438\n", "mse of last train data: 0.00016511032\n", "mse of last train data: 0.00016638315\n", "mse of last train data: 0.00017021292\n", "mse of last train data: 0.00017659822\n", "mse of last train data: 0.00016779697\n", "mse of last train data: 0.00015695463\n", "mse of last train data: 0.00015104574\n", "mse of last train data: 0.00014608716\n", "mse of last train data: 0.00014336465\n", "mse of last train data: 0.00014475462\n", "mse of last train data: 0.00014507821\n", "mse of last train data: 0.0001450579\n", "mse of last train data: 0.07205667\n", "mse of last train data: 0.13893458\n", "mse of last train data: 0.19796228\n", "mse of last train data: 0.18094915\n", "mse of last train data: 0.16069302\n", "mse of last train data: 0.14240894\n", "mse of last train data: 0.12506531\n", "mse of last train data: 0.10823243\n", "mse of last train data: 0.09251572\n", "mse of last train data: 0.07781045\n", "mse of last train data: 0.06467669\n", "mse of last train data: 0.05363799\n", "mse of last train data: 0.04450189\n", "mse of last train data: 0.03728957\n", "mse of last train data: 0.03174516\n", "mse of last train data: 0.027739545\n", "mse of last train data: 0.024777628\n", "mse of last train data: 0.02266857\n", "mse of last train data: 0.020791424\n", "mse of last train data: 0.018834757\n", "mse of last train data: 0.017007332\n", "mse of last train data: 0.0152012\n", "mse of last train data: 0.0136817675\n", "mse of last train data: 0.012355283\n", "mse of last train data: 0.011042081\n", "mse of last train data: 0.009847156\n", "mse of last train data: 0.008889004\n", "mse of last train data: 0.008057881\n", "mse of last train data: 0.0073360116\n", "mse of last train data: 0.006629404\n", "mse of last train data: 0.00603446\n", "mse of last train data: 0.0055647404\n", "mse of last train data: 0.005085784\n", "mse of last train data: 0.004635579\n", "mse of last train data: 0.0042376267\n", "mse of last train data: 0.003809187\n", "mse of last train data: 0.0034959386\n", "mse of last train data: 0.003260653\n", "mse of last train data: 0.0030721568\n", "mse of last train data: 0.0029340317\n", "mse of last train data: 0.0027605256\n", "mse of last train data: 0.0026362352\n", "mse of last train data: 0.0025475756\n", "mse of last train data: 0.0024479274\n", "mse of last train data: 0.0023544491\n", "mse of last train data: 0.0022725554\n", "mse of last train data: 0.0022665847\n", "mse of last train data: 0.002288982\n", "mse of last train data: 0.0023486267\n", "mse of last train data: 0.0023323437\n", "mse of last train data: 0.0022963672\n", "mse of last train data: 0.002290437\n", "mse of last train data: 0.0022051383\n", "mse of last train data: 0.0022056552\n", "mse of last train data: 0.0021482974\n", "mse of last train data: 0.0022010433\n", "mse of last train data: 0.0022223855\n", "mse of last train data: 0.0021414428\n", "mse of last train data: 0.0022304913\n", "mse of last train data: 0.00230914\n", "mse of last train data: 0.0022991085\n", "mse of last train data: 0.0023407598\n", "mse of last train data: 0.0024499984\n", "mse of last train data: 0.0024665953\n", "mse of last train data: 0.0026058878\n", "mse of last train data: 0.002833584\n", "mse of last train data: 0.0028792522\n", "mse of last train data: 0.0030756914\n", "mse of last train data: 0.0032068451\n", "mse of last train data: 0.0033346848\n", "mse of last train data: 0.0034521099\n", "mse of last train data: 0.0035960434\n", "mse of last train data: 0.0036712477\n", "mse of last train data: 0.0037712127\n", "mse of last train data: 0.0038479893\n", "mse of last train data: 0.0038579563\n", "mse of last train data: 0.0038726386\n", "mse of last train data: 0.003964872\n", "mse of last train data: 0.004026084\n", "mse of last train data: 0.004028903\n", "mse of last train data: 0.0039217984\n", "mse of last train data: 0.0039538997\n", "mse of last train data: 0.003897768\n", "mse of last train data: 0.00384018\n", "mse of last train data: 0.0037616906\n", "mse of last train data: 0.0037353742\n", "mse of last train data: 0.0037921062\n", "mse of last train data: 0.0038140994\n", "mse of last train data: 0.0039422265\n", "mse of last train data: 0.004063493\n", "mse of last train data: 0.0040876106\n", "mse of last train data: 0.0041476134\n", "mse of last train data: 0.004176664\n", "mse of last train data: 0.004150423\n", "mse of last train data: 0.0041735084\n", "mse of last train data: 0.0041777953\n", "mse of last train data: 0.0041922787\n", "mse of last train data: 0.0041739466\n", "mse of last train data: 0.0041439347\n", "mse of last train data: 0.0040672407\n", "mse of last train data: 0.0038785741\n", "mse of last train data: 0.0038772987\n", "mse of last train data: 0.0038318443\n", "mse of last train data: 0.0037663344\n", "mse of last train data: 0.003679201\n", "mse of last train data: 0.0035277274\n", "mse of last train data: 0.00346549\n", "mse of last train data: 0.0034346743\n", "mse of last train data: 0.0033462397\n", "mse of last train data: 0.0032800194\n", "mse of last train data: 0.0030959256\n", "mse of last train data: 0.00294949\n", "mse of last train data: 0.0027885023\n", "mse of last train data: 0.002630386\n", "mse of last train data: 0.0025397677\n", "mse of last train data: 0.0024446982\n", "mse of last train data: 0.0023684655\n", "mse of last train data: 0.0023111373\n", "mse of last train data: 0.0023532473\n", "mse of last train data: 0.0023284957\n", "mse of last train data: 0.0022286135\n", "mse of last train data: 0.0021931112\n", "mse of last train data: 0.0021555452\n", "mse of last train data: 0.0020743778\n", "mse of last train data: 0.0020993075\n", "mse of last train data: 0.0022181568\n", "mse of last train data: 0.0023018164\n", "mse of last train data: 0.0022113312\n", "mse of last train data: 0.0020134633\n", "mse of last train data: 0.0019012\n", "mse of last train data: 0.001853643\n", "mse of last train data: 0.0018221489\n", "mse of last train data: 0.0018716477\n", "mse of last train data: 0.0018854032\n", "mse of last train data: 0.001888388\n", "mse of last train data: 0.0018411102\n", "mse of last train data: 0.0018166936\n", "mse of last train data: 0.0017583704\n", "mse of last train data: 0.001752599\n", "mse of last train data: 0.0016609089\n", "mse of last train data: 0.0015661017\n", "mse of last train data: 0.0015227802\n", "mse of last train data: 0.0014839825\n", "mse of last train data: 0.0014406227\n", "mse of last train data: 0.0014063524\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "mse of last train data: 0.0013464914\n", "mse of last train data: 0.0012574107\n", "mse of last train data: 0.0011973963\n", "mse of last train data: 0.0011483922\n", "mse of last train data: 0.0010861779\n", "mse of last train data: 0.0011279699\n", "mse of last train data: 0.001181956\n", "mse of last train data: 0.0011827709\n", "mse of last train data: 0.0012015909\n", "mse of last train data: 0.0012706444\n", "mse of last train data: 0.0012969548\n", "mse of last train data: 0.0013360518\n", "mse of last train data: 0.0013549714\n", "mse of last train data: 0.001344365\n", "mse of last train data: 0.0013358138\n", "mse of last train data: 0.0012971199\n", "mse of last train data: 0.0012400298\n", "mse of last train data: 0.0011351941\n", "mse of last train data: 0.0011002468\n", "mse of last train data: 0.0011178211\n", "mse of last train data: 0.0011359766\n", "mse of last train data: 0.001113067\n", "mse of last train data: 0.0010521347\n", "mse of last train data: 0.0010077746\n", "mse of last train data: 0.0009265113\n", "mse of last train data: 0.00095399655\n", "mse of last train data: 0.0009676965\n", "mse of last train data: 0.0009533392\n", "mse of last train data: 0.0011021182\n", "mse of last train data: 0.0011843981\n", "mse of last train data: 0.0012056407\n", "mse of last train data: 0.001262295\n", "mse of last train data: 0.0012374771\n", "mse of last train data: 0.0012458236\n", "mse of last train data: 0.0012676963\n", "mse of last train data: 0.0013123781\n", "mse of last train data: 0.0014086295\n", "mse of last train data: 0.0014814095\n", "mse of last train data: 0.0015082511\n", "mse of last train data: 0.0015982826\n", "mse of last train data: 0.0016851957\n", "mse of last train data: 0.0015878333\n", "mse of last train data: 0.0015919523\n", "mse of last train data: 0.0016622652\n", "mse of last train data: 0.0015962254\n", "mse of last train data: 0.0015314275\n", "mse of last train data: 0.0015526952\n", "mse of last train data: 0.0016658702\n", "mse of last train data: 0.0018051107\n", "mse of last train data: 0.0020628015\n", "mse of last train data: 0.0025127074\n", "mse of last train data: 0.0029573862\n", "mse of last train data: 0.0031659596\n", "mse of last train data: 0.0034723885\n", "mse of last train data: 0.0037655572\n", "mse of last train data: 0.0039095846\n", "mse of last train data: 0.003840831\n", "mse of last train data: 0.0040077097\n", "mse of last train data: 0.0039965403\n", "mse of last train data: 0.003927748\n", "mse of last train data: 0.003750622\n", "mse of last train data: 0.0036334356\n", "mse of last train data: 0.003574275\n", "mse of last train data: 0.0037313572\n", "mse of last train data: 0.0037059211\n", "mse of last train data: 0.0036447744\n", "mse of last train data: 0.0035459776\n", "mse of last train data: 0.0033301672\n", "mse of last train data: 0.0031582052\n", "mse of last train data: 0.0030207264\n", "mse of last train data: 0.002874614\n", "mse of last train data: 0.0027405953\n", "mse of last train data: 0.0027124388\n", "mse of last train data: 0.0026437847\n", "mse of last train data: 0.0025770634\n", "mse of last train data: 0.0025967045\n", "mse of last train data: 0.0025350593\n", "mse of last train data: 0.0024819104\n", "mse of last train data: 0.0024936553\n", "mse of last train data: 0.0024477043\n", "mse of last train data: 0.002376865\n", "mse of last train data: 0.0023258424\n", "mse of last train data: 0.0022483987\n", "mse of last train data: 0.0021567186\n", "mse of last train data: 0.002107201\n", "mse of last train data: 0.0020256473\n", "mse of last train data: 0.00197632\n", "mse of last train data: 0.0019731368\n", "mse of last train data: 0.0019368684\n", "mse of last train data: 0.0018914877\n", "mse of last train data: 0.0018475738\n", "mse of last train data: 0.0017605136\n", "mse of last train data: 0.0016986358\n", "mse of last train data: 0.001640756\n", "mse of last train data: 0.0016501561\n", "mse of last train data: 0.001645608\n", "mse of last train data: 0.0016029997\n", "mse of last train data: 0.0015904047\n", "mse of last train data: 0.0016070447\n", "mse of last train data: 0.0016007202\n", "mse of last train data: 0.0015753297\n", "mse of last train data: 0.0015429567\n", "mse of last train data: 0.0015102365\n", "mse of last train data: 0.0014876345\n", "mse of last train data: 0.0014366853\n", "mse of last train data: 0.0014381347\n", "mse of last train data: 0.001439962\n", "mse of last train data: 0.0014420307\n", "mse of last train data: 0.0013792998\n", "mse of last train data: 0.0013424249\n", "mse of last train data: 0.001325422\n", "mse of last train data: 0.0012873164\n", "mse of last train data: 0.0012872552\n", "mse of last train data: 0.0013417456\n", "mse of last train data: 0.0013084626\n", "mse of last train data: 0.0011857317\n", "mse of last train data: 0.0011190426\n", "mse of last train data: 0.0011062514\n", "mse of last train data: 0.0010339685\n", "mse of last train data: 0.0009947165\n", "mse of last train data: 0.0010266803\n", "mse of last train data: 0.0010349512\n", "mse of last train data: 0.0010006244\n", "mse of last train data: 0.0010220367\n", "mse of last train data: 0.0010284391\n", "mse of last train data: 0.0010194151\n", "mse of last train data: 0.001005341\n", "mse of last train data: 0.00097332476\n", "mse of last train data: 0.00093010295\n", "mse of last train data: 0.0010120556\n", "mse of last train data: 0.0010774386\n", "mse of last train data: 0.0011652409\n", "mse of last train data: 0.0012128444\n", "mse of last train data: 0.0012056258\n", "mse of last train data: 0.0011465251\n", "mse of last train data: 0.0011025794\n", "mse of last train data: 0.0010495858\n", "mse of last train data: 0.001023266\n", "mse of last train data: 0.0010484938\n", "mse of last train data: 0.0010513911\n", "mse of last train data: 0.0011392012\n", "mse of last train data: 0.001153798\n", "mse of last train data: 0.0011481759\n", "mse of last train data: 0.0011563408\n", "mse of last train data: 0.0011308886\n", "mse of last train data: 0.0011234374\n", "mse of last train data: 0.0010046205\n", "mse of last train data: 0.0009797511\n", "mse of last train data: 0.0010366986\n", "mse of last train data: 0.0010408676\n", "mse of last train data: 0.001068525\n", "mse of last train data: 0.0011224989\n", "mse of last train data: 0.0011295491\n", "mse of last train data: 0.0011397352\n", "mse of last train data: 0.0011080813\n", "mse of last train data: 0.0010421994\n", "mse of last train data: 0.001017464\n", "mse of last train data: 0.0010206533\n", "mse of last train data: 0.0010339763\n", "mse of last train data: 0.0010672729\n", "mse of last train data: 0.0010636908\n", "mse of last train data: 0.001066436\n", "mse of last train data: 0.0011004284\n", "mse of last train data: 0.001122066\n", "mse of last train data: 0.0011451798\n", "mse of last train data: 0.0011026084\n", "mse of last train data: 0.0010945576\n", "mse of last train data: 0.0010818676\n", "mse of last train data: 0.0010538438\n", "mse of last train data: 0.0010126596\n", "mse of last train data: 0.0009978677\n", "mse of last train data: 0.0010448605\n", "mse of last train data: 0.001026903\n", "mse of last train data: 0.0010198418\n", "mse of last train data: 0.0010114628\n", "mse of last train data: 0.00095845683\n", "mse of last train data: 0.0009462939\n", "mse of last train data: 0.00091534853\n", "mse of last train data: 0.00093770504\n", "mse of last train data: 0.00095898425\n", "mse of last train data: 0.0009854428\n", "mse of last train data: 0.0010664935\n", "mse of last train data: 0.0011825607\n", "mse of last train data: 0.0012450067\n", "mse of last train data: 0.0013338435\n", "mse of last train data: 0.001365015\n", "mse of last train data: 0.0013943445\n", "mse of last train data: 0.0014056767\n", "mse of last train data: 0.0014466769\n", "mse of last train data: 0.0014638149\n", "mse of last train data: 0.0014998874\n", "mse of last train data: 0.0015322582\n", "mse of last train data: 0.0015588865\n", "mse of last train data: 0.0015689052\n", "mse of last train data: 0.0015233936\n", "mse of last train data: 0.001539662\n", "mse of last train data: 0.0015408073\n", "mse of last train data: 0.0015340863\n", "mse of last train data: 0.0015671833\n", "mse of last train data: 0.0016000806\n", "mse of last train data: 0.0016007663\n", "mse of last train data: 0.0016410188\n", "mse of last train data: 0.0016697388\n", "mse of last train data: 0.00175197\n", "mse of last train data: 0.0018563954\n", "mse of last train data: 0.0018630403\n", "mse of last train data: 0.0019535825\n", "mse of last train data: 0.0020532196\n", "mse of last train data: 0.0020106987\n", "mse of last train data: 0.0019743433\n", "mse of last train data: 0.002038095\n", "mse of last train data: 0.0020216114\n", "mse of last train data: 0.001970227\n", "mse of last train data: 0.001974121\n", "mse of last train data: 0.0019642294\n", "mse of last train data: 0.0020083536\n", "mse of last train data: 0.0020098195\n", "mse of last train data: 0.0020158559\n", "mse of last train data: 0.0020010343\n", "mse of last train data: 0.0018690318\n", "mse of last train data: 0.0017491846\n", "mse of last train data: 0.0017250124\n", "mse of last train data: 0.001702088\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "mse of last train data: 0.0016329982\n", "mse of last train data: 0.0015298986\n", "mse of last train data: 0.0015420592\n", "mse of last train data: 0.001491368\n", "mse of last train data: 0.0014125028\n", "mse of last train data: 0.0013982751\n", "mse of last train data: 0.0014319657\n", "mse of last train data: 0.0014147809\n", "mse of last train data: 0.0013569839\n", "mse of last train data: 0.0012757038\n", "mse of last train data: 0.0011809135\n", "mse of last train data: 0.0011647923\n", "mse of last train data: 0.001151103\n", "mse of last train data: 0.001145226\n", "mse of last train data: 0.0011862615\n", "mse of last train data: 0.001189354\n", "mse of last train data: 0.001171359\n", "mse of last train data: 0.0011854062\n", "mse of last train data: 0.0011679702\n", "mse of last train data: 0.0011461786\n", "mse of last train data: 0.0011005491\n", "mse of last train data: 0.0010598543\n", "mse of last train data: 0.0010017945\n", "mse of last train data: 0.0009647608\n", "mse of last train data: 0.0009159361\n", "mse of last train data: 0.0008956352\n", "mse of last train data: 0.00088806055\n", "mse of last train data: 0.0008519254\n", "mse of last train data: 0.0008260835\n", "mse of last train data: 0.0008365163\n", "mse of last train data: 0.0008214434\n", "mse of last train data: 0.0008438503\n", "mse of last train data: 0.0008232932\n", "mse of last train data: 0.00079800043\n", "mse of last train data: 0.0007680562\n", "mse of last train data: 0.00074435334\n", "mse of last train data: 0.00073817075\n", "mse of last train data: 0.0007202183\n", "mse of last train data: 0.0007133703\n", "mse of last train data: 0.00071843615\n", "mse of last train data: 0.000768639\n", "mse of last train data: 0.0007931737\n", "mse of last train data: 0.00075426634\n", "mse of last train data: 0.000743786\n", "mse of last train data: 0.0007255434\n", "mse of last train data: 0.000679125\n", "mse of last train data: 0.0006794581\n", "mse of last train data: 0.00067914464\n", "mse of last train data: 0.0006936631\n", "mse of last train data: 0.00069016375\n", "mse of last train data: 0.00071026816\n", "mse of last train data: 0.0007423688\n", "mse of last train data: 0.0007434516\n", "mse of last train data: 0.000724178\n", "mse of last train data: 0.0007543912\n", "mse of last train data: 0.0007858621\n", "mse of last train data: 0.00080036814\n", "mse of last train data: 0.0008466258\n", "mse of last train data: 0.0008750254\n", "mse of last train data: 0.00086509157\n", "mse of last train data: 0.00086944096\n", "mse of last train data: 0.0008660486\n", "mse of last train data: 0.00088088954\n", "mse of last train data: 0.0008952701\n", "mse of last train data: 0.00092487794\n", "mse of last train data: 0.00091398106\n", "mse of last train data: 0.00094530836\n", "mse of last train data: 0.0009165718\n", "mse of last train data: 0.000874996\n", "mse of last train data: 0.0008461645\n", "mse of last train data: 0.0008665467\n", "mse of last train data: 0.0008962643\n", "mse of last train data: 0.000867555\n", "mse of last train data: 0.00085542275\n", "mse of last train data: 0.00084130606\n", "mse of last train data: 0.0008583149\n", "mse of last train data: 0.0009010726\n", "mse of last train data: 0.000943708\n", "mse of last train data: 0.0009260789\n", "mse of last train data: 0.0009556278\n", "mse of last train data: 0.0009409341\n", "mse of last train data: 0.00088871294\n", "mse of last train data: 0.00085274776\n", "mse of last train data: 0.0008155256\n", "mse of last train data: 0.0007758231\n", "mse of last train data: 0.0007605526\n", "mse of last train data: 0.0007996544\n", "mse of last train data: 0.0008727017\n", "mse of last train data: 0.00087935326\n", "mse of last train data: 0.0008888069\n", "mse of last train data: 0.0009274797\n", "mse of last train data: 0.0009084317\n", "mse of last train data: 0.0009072056\n", "mse of last train data: 0.00092767144\n", "mse of last train data: 0.0009333326\n", "mse of last train data: 0.000952322\n", "mse of last train data: 0.00096932956\n", "mse of last train data: 0.0009827061\n", "mse of last train data: 0.0010207826\n", "mse of last train data: 0.0010841498\n", "mse of last train data: 0.0011546806\n", "mse of last train data: 0.0012104256\n", "mse of last train data: 0.0012216566\n", "mse of last train data: 0.0012382811\n", "mse of last train data: 0.001256439\n", "mse of last train data: 0.001238168\n", "mse of last train data: 0.0011961329\n", "mse of last train data: 0.0012093284\n", "mse of last train data: 0.0012249821\n", "mse of last train data: 0.0012608183\n", "mse of last train data: 0.0012794193\n", "mse of last train data: 0.0012739777\n", "mse of last train data: 0.0013050393\n", "mse of last train data: 0.0012952167\n", "mse of last train data: 0.0012893219\n", "mse of last train data: 0.0013364957\n", "mse of last train data: 0.0013219004\n", "mse of last train data: 0.0013564738\n", "mse of last train data: 0.0013818522\n", "mse of last train data: 0.001437685\n", "mse of last train data: 0.0014729805\n", "mse of last train data: 0.0015169979\n", "mse of last train data: 0.0015033745\n", "mse of last train data: 0.0014634663\n", "mse of last train data: 0.0015589262\n", "mse of last train data: 0.0015290685\n", "mse of last train data: 0.0015401517\n", "mse of last train data: 0.0015024173\n", "mse of last train data: 0.0015139772\n", "mse of last train data: 0.0014650718\n", "mse of last train data: 0.0014674219\n", "mse of last train data: 0.0014168425\n", "mse of last train data: 0.0013707344\n", "mse of last train data: 0.0013549054\n", "mse of last train data: 0.0013009903\n", "mse of last train data: 0.0012954032\n", "mse of last train data: 0.0013331287\n", "mse of last train data: 0.0012916501\n", "mse of last train data: 0.0012935335\n", "mse of last train data: 0.0012434056\n", "mse of last train data: 0.0012132756\n", "mse of last train data: 0.0011929887\n", "mse of last train data: 0.0011641278\n", "mse of last train data: 0.0011291781\n", "mse of last train data: 0.001105667\n", "mse of last train data: 0.001068929\n", "mse of last train data: 0.0010534077\n", "mse of last train data: 0.0010043996\n", "mse of last train data: 0.0010471272\n", "mse of last train data: 0.0010445536\n", "mse of last train data: 0.0010292436\n", "mse of last train data: 0.0009952802\n", "mse of last train data: 0.0009422138\n", "mse of last train data: 0.00095950224\n", "mse of last train data: 0.00096409523\n", "mse of last train data: 0.0009150089\n", "mse of last train data: 0.00091790827\n", "mse of last train data: 0.00093758426\n", "mse of last train data: 0.0008784499\n", "mse of last train data: 0.0008645862\n", "mse of last train data: 0.00087230065\n", "mse of last train data: 0.00084728515\n", "mse of last train data: 0.0007924842\n", "mse of last train data: 0.0007767578\n", "mse of last train data: 0.0007844462\n", "mse of last train data: 0.0008004956\n", "mse of last train data: 0.0007891942\n", "mse of last train data: 0.0007798631\n", "mse of last train data: 0.0007435473\n", "mse of last train data: 0.0007671225\n", "mse of last train data: 0.00077114406\n", "mse of last train data: 0.0007509592\n", "mse of last train data: 0.0007833343\n", "mse of last train data: 0.0007639879\n", "mse of last train data: 0.0007625261\n", "mse of last train data: 0.0007714412\n", "mse of last train data: 0.00075920875\n", "mse of last train data: 0.0007519961\n", "mse of last train data: 0.0007488591\n", "mse of last train data: 0.000782313\n", "mse of last train data: 0.0007965821\n", "mse of last train data: 0.00081012276\n", "mse of last train data: 0.0008296337\n", "mse of last train data: 0.00075105747\n", "mse of last train data: 0.0007071131\n", "mse of last train data: 0.0007179317\n", "mse of last train data: 0.00071533705\n", "mse of last train data: 0.0006914794\n", "mse of last train data: 0.00066226\n", "mse of last train data: 0.0007012957\n", "mse of last train data: 0.0006899659\n", "mse of last train data: 0.0006702315\n", "mse of last train data: 0.0006717992\n", "mse of last train data: 0.0006725623\n", "mse of last train data: 0.0007080733\n", "mse of last train data: 0.000677911\n", "mse of last train data: 0.0006701805\n", "mse of last train data: 0.0006941974\n", "mse of last train data: 0.0006673816\n", "mse of last train data: 0.0006817229\n", "mse of last train data: 0.0007079854\n", "mse of last train data: 0.0007285663\n", "mse of last train data: 0.00076610706\n", "mse of last train data: 0.000765858\n", "mse of last train data: 0.0007985458\n", "mse of last train data: 0.0007853478\n", "mse of last train data: 0.00078308955\n", "mse of last train data: 0.0007895325\n", "mse of last train data: 0.0007736814\n", "mse of last train data: 0.0007822404\n", "mse of last train data: 0.0007990075\n", "mse of last train data: 0.0007671225\n", "mse of last train data: 0.0007572188\n", "mse of last train data: 0.0007455763\n", "mse of last train data: 0.0007594815\n", "mse of last train data: 0.00077661604\n", "mse of last train data: 0.0007761848\n", "mse of last train data: 0.0007980282\n", "mse of last train data: 0.00084878586\n", "mse of last train data: 0.00095800543\n", "mse of last train data: 0.0009898231\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "mse of last train data: 0.0009541947\n", "mse of last train data: 0.0010108207\n", "mse of last train data: 0.0010364436\n", "mse of last train data: 0.0009894947\n", "mse of last train data: 0.00097643986\n", "mse of last train data: 0.000925609\n", "mse of last train data: 0.0009026852\n", "mse of last train data: 0.00093772635\n", "mse of last train data: 0.0009970642\n", "mse of last train data: 0.0010504007\n", "mse of last train data: 0.0011059847\n", "mse of last train data: 0.0011673279\n", "mse of last train data: 0.0011629892\n", "mse of last train data: 0.0011685679\n", "mse of last train data: 0.0012121707\n", "mse of last train data: 0.0011760428\n", "mse of last train data: 0.0011301434\n", "mse of last train data: 0.0011292599\n", "mse of last train data: 0.0012091325\n", "mse of last train data: 0.0012273844\n", "mse of last train data: 0.0012395179\n", "mse of last train data: 0.0012739047\n", "mse of last train data: 0.0013571507\n", "mse of last train data: 0.0013433759\n", "mse of last train data: 0.0013559854\n", "mse of last train data: 0.0013994459\n", "mse of last train data: 0.0014797584\n", "mse of last train data: 0.0015326106\n", "mse of last train data: 0.0015211492\n", "mse of last train data: 0.0015538143\n", "mse of last train data: 0.0016037362\n", "mse of last train data: 0.0015823002\n", "mse of last train data: 0.0015571585\n", "mse of last train data: 0.001545502\n", "mse of last train data: 0.0015368324\n", "mse of last train data: 0.0014802022\n", "mse of last train data: 0.0014094602\n", "mse of last train data: 0.0013853377\n", "mse of last train data: 0.0012809603\n", "mse of last train data: 0.0012235981\n", "mse of last train data: 0.0012257422\n", "mse of last train data: 0.0012544547\n", "mse of last train data: 0.0012399516\n", "mse of last train data: 0.0012709155\n", "mse of last train data: 0.0012713958\n", "mse of last train data: 0.0012468753\n", "mse of last train data: 0.0012133922\n", "mse of last train data: 0.0011484857\n", "mse of last train data: 0.001122947\n", "mse of last train data: 0.0011318541\n", "mse of last train data: 0.0010868455\n", "mse of last train data: 0.0010498461\n", "mse of last train data: 0.001072044\n", "mse of last train data: 0.0010659883\n", "mse of last train data: 0.0010233234\n", "mse of last train data: 0.0009665305\n", "mse of last train data: 0.00093571533\n", "mse of last train data: 0.0009545754\n", "mse of last train data: 0.000932956\n", "mse of last train data: 0.00092874095\n", "mse of last train data: 0.00093626074\n", "mse of last train data: 0.0009557613\n", "mse of last train data: 0.0009824438\n", "mse of last train data: 0.0009876572\n", "mse of last train data: 0.0009950006\n", "mse of last train data: 0.0009688083\n", "mse of last train data: 0.00096217537\n", "mse of last train data: 0.0009313186\n", "mse of last train data: 0.000918295\n", "mse of last train data: 0.0009082833\n", "mse of last train data: 0.0008865691\n", "mse of last train data: 0.00086521485\n", "mse of last train data: 0.0008536012\n", "mse of last train data: 0.0008478385\n", "mse of last train data: 0.0008322337\n", "mse of last train data: 0.0008125947\n", "mse of last train data: 0.0008112473\n", "mse of last train data: 0.0007705171\n", "mse of last train data: 0.0007348005\n", "mse of last train data: 0.0007527921\n", "mse of last train data: 0.0007673946\n", "mse of last train data: 0.00075016933\n", "mse of last train data: 0.00074245286\n", "mse of last train data: 0.0007343074\n", "mse of last train data: 0.00077942637\n", "mse of last train data: 0.00078259496\n", "mse of last train data: 0.00079123955\n", "mse of last train data: 0.00080244197\n", "mse of last train data: 0.0007918219\n", "mse of last train data: 0.0007765784\n", "mse of last train data: 0.0007558805\n", "mse of last train data: 0.00078713265\n", "mse of last train data: 0.0008180782\n", "mse of last train data: 0.00081295223\n", "mse of last train data: 0.0007907967\n", "mse of last train data: 0.0007853339\n", "mse of last train data: 0.00078770664\n", "mse of last train data: 0.00077738496\n", "mse of last train data: 0.00073202804\n", "mse of last train data: 0.0007404461\n", "mse of last train data: 0.0007666396\n", "mse of last train data: 0.00081070245\n", "mse of last train data: 0.0008375156\n", "mse of last train data: 0.00087021873\n", "mse of last train data: 0.0008757806\n", "mse of last train data: 0.00089811\n", "mse of last train data: 0.0008853341\n", "mse of last train data: 0.00087567733\n", "mse of last train data: 0.00089108734\n", "mse of last train data: 0.0008722552\n", "mse of last train data: 0.0008424445\n", "mse of last train data: 0.0008453589\n", "mse of last train data: 0.00085609156\n", "mse of last train data: 0.0008375242\n", "mse of last train data: 0.0007777993\n", "mse of last train data: 0.0007801824\n", "mse of last train data: 0.0007780854\n", "mse of last train data: 0.00074772915\n", "mse of last train data: 0.0008021815\n", "mse of last train data: 0.000852052\n", "mse of last train data: 0.0008834996\n", "mse of last train data: 0.00088296935\n", "mse of last train data: 0.0009120857\n", "mse of last train data: 0.0009316169\n", "mse of last train data: 0.00089627743\n", "mse of last train data: 0.00087186054\n", "mse of last train data: 0.0008672923\n", "mse of last train data: 0.0008451662\n", "mse of last train data: 0.0008207845\n", "mse of last train data: 0.0007788843\n", "mse of last train data: 0.00076644396\n", "mse of last train data: 0.00078863965\n", "mse of last train data: 0.0008183467\n", "mse of last train data: 0.0008206188\n", "mse of last train data: 0.0008191548\n", "mse of last train data: 0.0008181697\n", "mse of last train data: 0.0008295404\n", "mse of last train data: 0.0008369502\n", "mse of last train data: 0.00087504473\n", "mse of last train data: 0.00094807264\n", "mse of last train data: 0.00095168565\n", "mse of last train data: 0.00093786785\n", "mse of last train data: 0.0009494926\n", "mse of last train data: 0.00095221156\n", "mse of last train data: 0.00096416246\n", "mse of last train data: 0.0010382076\n", "mse of last train data: 0.0010461614\n", "mse of last train data: 0.0010444447\n", "mse of last train data: 0.0010638619\n", "mse of last train data: 0.0010496473\n", "mse of last train data: 0.0010483713\n", "mse of last test data: 0.0010384414\n", "mse of last test data: 0.001307694\n", "mse of last test data: 0.0017374953\n", "mse of last test data: 0.0023031589\n", "mse of last test data: 0.0029748592\n", "mse of last test data: 0.0037031618\n", "mse of last test data: 0.0045573018\n", "mse of last test data: 0.0055009406\n", "mse of last test data: 0.006388207\n", "mse of last test data: 0.007588866\n", "mse of last test data: 0.00892342\n", "mse of last test data: 0.009982019\n", "mse of last test data: 0.011053708\n", "mse of last test data: 0.012057285\n", "mse of last test data: 0.013137471\n", "mse of last test data: 0.014322686\n", "mse of last test data: 0.015435629\n", "mse of last test data: 0.0164074\n", "mse of last test data: 0.017558564\n", "mse of last test data: 0.018451324\n", "mse of last test data: 0.019547584\n", "mse of last test data: 0.020846648\n", "mse of last test data: 0.022295011\n", "mse of last test data: 0.023751698\n", "mse of last test data: 0.025166908\n", "mse of last test data: 0.026294477\n", "mse of last test data: 0.027411463\n", "mse of last test data: 0.028650785\n", "mse of last test data: 0.029543892\n", "mse of last test data: 0.03069337\n", "mse of last test data: 0.031689584\n", "mse of last test data: 0.032348324\n", "mse of last test data: 0.032735217\n", "mse of last test data: 0.032774836\n", "mse of last test data: 0.033247374\n", "mse of last test data: 0.033966284\n", "mse of last test data: 0.034178574\n", "mse of last test data: 0.034851965\n", "mse of last test data: 0.03574161\n", "mse of last test data: 0.03627641\n", "mse of last test data: 0.037307043\n", "mse of last test data: 0.03826935\n", "mse of last test data: 0.039126046\n", "mse of last test data: 0.040106446\n", "mse of last test data: 0.040581167\n", "mse of last test data: 0.040892914\n", "mse of last test data: 0.041396786\n", "mse of last test data: 0.04206962\n", "mse of last test data: 0.042384546\n", "mse of last test data: 0.04255963\n", "mse of last test data: 0.042533204\n", "mse of last test data: 0.042531297\n", "mse of last test data: 0.04243757\n", "mse of last test data: 0.042328015\n", "mse of last test data: 0.04236642\n", "mse of last test data: 0.042201947\n", "mse of last test data: 0.042245027\n", "mse of last test data: 0.04205504\n", "mse of last test data: 0.041910607\n", "mse of last test data: 0.041927192\n", "mse of last test data: 0.0419992\n", "mse of last test data: 0.042246398\n", "mse of last test data: 0.042536404\n", "mse of last test data: 0.042835034\n", "mse of last test data: 0.042819537\n", "mse of last test data: 0.04295462\n", "mse of last test data: 0.043051228\n", "mse of last test data: 0.043088567\n", "mse of last test data: 0.043004733\n", "mse of last test data: 0.042714253\n", "mse of last test data: 0.042343702\n", "mse of last test data: 0.04196994\n", "mse of last test data: 0.041456442\n", "mse of last test data: 0.041171037\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "mse of last test data: 0.04082334\n", "mse of last test data: 0.040083185\n", "mse of last test data: 0.03985819\n", "mse of last test data: 0.039754167\n", "mse of last test data: 0.039474037\n", "mse of last test data: 0.039507117\n", "mse of last test data: 0.039683733\n", "mse of last test data: 0.039667007\n", "mse of last test data: 0.03954234\n", "mse of last test data: 0.03914306\n", "mse of last test data: 0.0385736\n", "mse of last test data: 0.038148172\n", "mse of last test data: 0.037649598\n", "mse of last test data: 0.037061617\n", "mse of last test data: 0.036700785\n", "mse of last test data: 0.036190856\n", "mse of last test data: 0.035422195\n", "mse of last test data: 0.034796197\n", "mse of last test data: 0.034407858\n", "mse of last test data: 0.034019623\n", "mse of last test data: 0.033275053\n", "mse of last test data: 0.03250243\n", "mse of last test data: 0.031793736\n", "mse of last test data: 0.03122516\n", "mse of last test data: 0.030735435\n", "mse of last test data: 0.030259106\n", "mse of last test data: 0.030017732\n", "mse of last test data: 0.02974167\n", "mse of last test data: 0.02909848\n", "mse of last test data: 0.02833938\n", "mse of last test data: 0.02780824\n", "mse of last test data: 0.027193166\n", "mse of last test data: 0.026475754\n", "mse of last test data: 0.025667634\n", "mse of last test data: 0.024950879\n", "mse of last test data: 0.024222\n", "mse of last test data: 0.023429502\n", "mse of last test data: 0.02254987\n", "mse of last test data: 0.02196828\n", "mse of last test data: 0.021193521\n", "mse of last test data: 0.02028674\n", "mse of last test data: 0.019646509\n", "mse of last test data: 0.018891536\n", "mse of last test data: 0.018168326\n", "mse of last test data: 0.0175475\n", "mse of last test data: 0.016908957\n", "mse of last test data: 0.01619197\n", "mse of last test data: 0.01544866\n", "mse of last test data: 0.014649941\n", "mse of last test data: 0.013815872\n", "mse of last test data: 0.012977094\n", "mse of last test data: 0.012175543\n", "mse of last test data: 0.011358927\n", "mse of last test data: 0.010680771\n", "mse of last test data: 0.009901247\n", "mse of last test data: 0.009313815\n", "mse of last test data: 0.008677138\n", "mse of last test data: 0.008175264\n", "mse of last test data: 0.007842597\n", "mse of last test data: 0.007610578\n", "mse of last test data: 0.007446367\n", "mse of last test data: 0.007328755\n", "mse of last test data: 0.0072706873\n", "mse of last test data: 0.0072315196\n", "mse of last test data: 0.0072507737\n", "mse of last test data: 0.0074456963\n", "mse of last test data: 0.0076559093\n", "mse of last test data: 0.007952152\n", "mse of last test data: 0.008333183\n", "mse of last test data: 0.008844702\n", "mse of last test data: 0.009205255\n", "mse of last test data: 0.009758698\n", "mse of last test data: 0.010508039\n", "mse of last test data: 0.011222202\n", "mse of last test data: 0.012041376\n", "mse of last test data: 0.013106552\n", "mse of last test data: 0.014052004\n", "mse of last test data: 0.014951649\n", "mse of last test data: 0.01584717\n", "mse of last test data: 0.016637348\n", "mse of last test data: 0.017568303\n", "mse of last test data: 0.01823545\n", "mse of last test data: 0.018862344\n", "mse of last test data: 0.01954903\n", "mse of last test data: 0.020380951\n", "mse of last test data: 0.021499444\n", "mse of last test data: 0.022486042\n", "mse of last test data: 0.023462072\n", "mse of last test data: 0.024444459\n", "mse of last test data: 0.025658702\n", "mse of last test data: 0.026623877\n", "mse of last test data: 0.027497932\n", "mse of last test data: 0.028352885\n", "mse of last test data: 0.029477308\n", "mse of last test data: 0.030210283\n", "mse of last test data: 0.03099371\n", "mse of last test data: 0.031869322\n", "mse of last test data: 0.032669522\n", "mse of last test data: 0.03350015\n", "mse of last test data: 0.034063555\n", "mse of last test data: 0.034736462\n", "mse of last test data: 0.035724353\n", "mse of last test data: 0.036485925\n", "mse of last test data: 0.036842436\n", "mse of last test data: 0.037415814\n", "mse of last test data: 0.037718218\n", "mse of last test data: 0.03796529\n", "mse of last test data: 0.038130216\n", "mse of last test data: 0.038551964\n", "mse of last test data: 0.038782805\n", "mse of last test data: 0.038809787\n", "mse of last test data: 0.0388401\n", "mse of last test data: 0.038793024\n", "mse of last test data: 0.03895594\n", "mse of last test data: 0.03914743\n", "mse of last test data: 0.039296836\n", "mse of last test data: 0.039728686\n", "mse of last test data: 0.040101677\n", "mse of last test data: 0.040367268\n", "mse of last test data: 0.040627647\n", "mse of last test data: 0.040936448\n", "mse of last test data: 0.041172534\n", "mse of last test data: 0.041425318\n", "mse of last test data: 0.04147524\n", "mse of last test data: 0.04157543\n", "mse of last test data: 0.041296557\n", "mse of last test data: 0.041335024\n", "mse of last test data: 0.041136358\n", "mse of last test data: 0.040835697\n", "mse of last test data: 0.04065752\n", "mse of last test data: 0.04041579\n", "mse of last test data: 0.040381014\n", "mse of last test data: 0.04044666\n", "mse of last test data: 0.04036908\n", "mse of last test data: 0.040147748\n", "mse of last test data: 0.04003042\n", "mse of last test data: 0.03965651\n", "mse of last test data: 0.03932365\n", "mse of last test data: 0.03912295\n", "mse of last test data: 0.038741607\n", "mse of last test data: 0.038381852\n", "mse of last test data: 0.038367312\n", "mse of last test data: 0.03811866\n", "mse of last test data: 0.037675697\n", "mse of last test data: 0.037530858\n", "mse of last test data: 0.03723132\n", "mse of last test data: 0.03688892\n", "mse of last test data: 0.03685664\n", "mse of last test data: 0.03657884\n", "mse of last test data: 0.03635766\n", "mse of last test data: 0.03633707\n", "mse of last test data: 0.036062397\n", "mse of last test data: 0.035945144\n", "mse of last test data: 0.035621196\n", "mse of last test data: 0.03516288\n", "mse of last test data: 0.03473452\n", "mse of last test data: 0.03427851\n", "mse of last test data: 0.0338027\n", "mse of last test data: 0.03323697\n", "mse of last test data: 0.032772798\n", "mse of last test data: 0.032562565\n", "mse of last test data: 0.032350477\n", "mse of last test data: 0.032089394\n", "mse of last test data: 0.031830788\n", "mse of last test data: 0.031764828\n", "mse of last test data: 0.03166443\n", "mse of last test data: 0.03170151\n", "mse of last test data: 0.031261694\n", "mse of last test data: 0.030939216\n", "mse of last test data: 0.03081177\n", "mse of last test data: 0.030562615\n", "mse of last test data: 0.030256944\n", "mse of last test data: 0.030192852\n", "mse of last test data: 0.029942954\n", "mse of last test data: 0.029430553\n", "mse of last test data: 0.028814787\n", "mse of last test data: 0.028157063\n", "mse of last test data: 0.027540611\n", "mse of last test data: 0.027061442\n", "mse of last test data: 0.026554784\n", "mse of last test data: 0.026266748\n", "mse of last test data: 0.025907198\n", "mse of last test data: 0.025414491\n", "mse of last test data: 0.024933107\n", "mse of last test data: 0.024703918\n", "mse of last test data: 0.0248048\n", "mse of last test data: 0.024647307\n", "mse of last test data: 0.024336813\n", "mse of last test data: 0.023993976\n", "mse of last test data: 0.023803623\n", "mse of last test data: 0.023561517\n", "mse of last test data: 0.023275027\n", "mse of last test data: 0.022709692\n", "mse of last test data: 0.022081068\n", "mse of last test data: 0.021661425\n", "mse of last test data: 0.021428918\n", "mse of last test data: 0.021290788\n", "mse of last test data: 0.021268034\n", "mse of last test data: 0.021303197\n", "mse of last test data: 0.021500012\n", "mse of last test data: 0.021755792\n", "mse of last test data: 0.021958767\n", "mse of last test data: 0.022109263\n", "mse of last test data: 0.022315828\n", "mse of last test data: 0.022623992\n", "mse of last test data: 0.022780182\n", "mse of last test data: 0.023006381\n", "mse of last test data: 0.023298213\n", "mse of last test data: 0.023594327\n", "mse of last test data: 0.023626985\n", "mse of last test data: 0.023717942\n", "mse of last test data: 0.024134878\n", "mse of last test data: 0.024442924\n", "mse of last test data: 0.024846632\n", "mse of last test data: 0.025394179\n", "mse of last test data: 0.026140306\n", "mse of last test data: 0.026889877\n", "mse of last test data: 0.027327998\n", "mse of last test data: 0.027573977\n", "mse of last test data: 0.02802628\n", "mse of last test data: 0.028345205\n", "mse of last test data: 0.02849541\n", "mse of last test data: 0.028633604\n", "mse of last test data: 0.029166307\n", "mse of last test data: 0.029777998\n", "mse of last test data: 0.030415766\n", "mse of last test data: 0.030932292\n", "mse of last test data: 0.03141561\n", "mse of last test data: 0.031903934\n", "mse of last test data: 0.032281023\n", "mse of last test data: 0.0326458\n", "mse of last test data: 0.033046126\n", "mse of last test data: 0.03333811\n", "mse of last test data: 0.033477485\n", "mse of last test data: 0.033775162\n", "mse of last test data: 0.034282345\n", "mse of last test data: 0.03464786\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "mse of last test data: 0.035031658\n", "mse of last test data: 0.035490207\n", "mse of last test data: 0.03572595\n", "mse of last test data: 0.03601049\n", "mse of last test data: 0.03597831\n", "mse of last test data: 0.036039367\n", "mse of last test data: 0.03608627\n", "mse of last test data: 0.03606685\n", "mse of last test data: 0.03624761\n", "mse of last test data: 0.036428586\n", "mse of last test data: 0.03631103\n", "mse of last test data: 0.036340993\n", "mse of last test data: 0.036536086\n", "mse of last test data: 0.036383446\n", "mse of last test data: 0.03621247\n", "mse of last test data: 0.03625416\n", "mse of last test data: 0.036143474\n", "mse of last test data: 0.036067598\n", "mse of last test data: 0.036154605\n", "mse of last test data: 0.03604631\n", "mse of last test data: 0.0359825\n", "mse of last test data: 0.036142346\n", "mse of last test data: 0.036077425\n", "mse of last test data: 0.03606107\n", "mse of last test data: 0.036258876\n", "mse of last test data: 0.03632675\n", "mse of last test data: 0.036120854\n", "mse of last test data: 0.036069844\n", "mse of last test data: 0.036016762\n", "mse of last test data: 0.03600339\n", "mse of last test data: 0.036333516\n", "mse of last test data: 0.036598675\n", "mse of last test data: 0.036708616\n", "mse of last test data: 0.03702915\n", "mse of last test data: 0.03743927\n", "mse of last test data: 0.037524562\n", "mse of last test data: 0.037685137\n", "mse of last test data: 0.037835393\n", "mse of last test data: 0.037793335\n", "mse of last test data: 0.03783053\n", "mse of last test data: 0.03790146\n", "mse of last test data: 0.03799495\n", "mse of last test data: 0.038179226\n", "mse of last test data: 0.03811621\n", "mse of last test data: 0.037942342\n", "mse of last test data: 0.03772454\n", "mse of last test data: 0.037465274\n", "mse of last test data: 0.03732606\n", "mse of last test data: 0.037236284\n", "mse of last test data: 0.037277386\n", "mse of last test data: 0.037350263\n", "mse of last test data: 0.037502833\n", "mse of last test data: 0.037746042\n", "mse of last test data: 0.038084935\n", "mse of last test data: 0.038162284\n", "mse of last test data: 0.037942823\n", "mse of last test data: 0.037823606\n", "mse of last test data: 0.037551586\n", "mse of last test data: 0.037443716\n", "mse of last test data: 0.037281357\n", "mse of last test data: 0.037416983\n", "mse of last test data: 0.037451915\n", "mse of last test data: 0.037382595\n", "mse of last test data: 0.037274934\n", "mse of last test data: 0.037476376\n", "mse of last test data: 0.03734141\n", "mse of last test data: 0.037266914\n", "mse of last test data: 0.037171412\n", "mse of last test data: 0.037094492\n", "mse of last test data: 0.036912702\n", "mse of last test data: 0.036717176\n", "mse of last test data: 0.03696139\n", "mse of last test data: 0.037003577\n", "mse of last test data: 0.037010066\n", "mse of last test data: 0.037026666\n", "mse of last test data: 0.037105616\n", "mse of last test data: 0.037414543\n", "mse of last test data: 0.037588768\n", "mse of last test data: 0.037979055\n", "mse of last test data: 0.03834311\n", "mse of last test data: 0.03848743\n", "mse of last test data: 0.038371816\n", "mse of last test data: 0.038517695\n", "mse of last test data: 0.03890951\n", "mse of last test data: 0.039032325\n", "mse of last test data: 0.038940143\n", "mse of last test data: 0.039055612\n", "mse of last test data: 0.03948929\n", "mse of last test data: 0.039855823\n", "mse of last test data: 0.039860543\n", "mse of last test data: 0.039730966\n", "mse of last test data: 0.039699364\n", "mse of last test data: 0.039754596\n", "mse of last test data: 0.039835285\n", "mse of last test data: 0.039802346\n", "mse of last test data: 0.03984447\n", "mse of last test data: 0.0399325\n", "mse of last test data: 0.04027743\n", "mse of last test data: 0.04030818\n", "mse of last test data: 0.040431373\n", "mse of last test data: 0.04068201\n", "mse of last test data: 0.041012682\n", "mse of last test data: 0.04120658\n", "mse of last test data: 0.041185886\n", "mse of last test data: 0.041001167\n", "mse of last test data: 0.041156203\n", "mse of last test data: 0.041229323\n", "mse of last test data: 0.04103733\n", "mse of last test data: 0.04084468\n", "mse of last test data: 0.040916957\n", "mse of last test data: 0.041137584\n", "mse of last test data: 0.04123667\n", "mse of last test data: 0.04103982\n", "mse of last test data: 0.040686384\n", "mse of last test data: 0.04060656\n", "mse of last test data: 0.04076821\n", "mse of last test data: 0.04075272\n", "mse of last test data: 0.040907077\n", "mse of last test data: 0.040763214\n", "mse of last test data: 0.04057824\n", "mse of last test data: 0.040400766\n", "mse of last test data: 0.04029853\n", "mse of last test data: 0.04030188\n", "mse of last test data: 0.04051611\n", "mse of last test data: 0.040467434\n", "mse of last test data: 0.04032812\n", "mse of last test data: 0.040335715\n", "mse of last test data: 0.0405933\n", "mse of last test data: 0.040547967\n", "mse of last test data: 0.04082879\n", "mse of last test data: 0.04097587\n", "mse of last test data: 0.040699992\n", "mse of last test data: 0.040394023\n", "mse of last test data: 0.040129915\n", "mse of last test data: 0.039803337\n", "mse of last test data: 0.039406665\n", "mse of last test data: 0.039154865\n", "mse of last test data: 0.03869359\n", "mse of last test data: 0.0383316\n", "mse of last test data: 0.0379935\n", "mse of last test data: 0.03787038\n", "mse of last test data: 0.037636872\n", "mse of last test data: 0.037317097\n", "mse of last test data: 0.037037548\n", "mse of last test data: 0.03698923\n", "mse of last test data: 0.037039768\n", "mse of last test data: 0.036923762\n", "mse of last test data: 0.03671856\n", "mse of last test data: 0.03651316\n", "mse of last test data: 0.036244605\n", "mse of last test data: 0.036072135\n", "mse of last test data: 0.035909202\n", "mse of last test data: 0.035528228\n", "mse of last test data: 0.03558189\n", "mse of last test data: 0.035503305\n", "mse of last test data: 0.035497822\n", "mse of last test data: 0.035637442\n", "mse of last test data: 0.035471745\n", "mse of last test data: 0.035452746\n", "mse of last test data: 0.03572343\n", "mse of last test data: 0.0359579\n", "mse of last test data: 0.03599089\n", "mse of last test data: 0.03591044\n", "mse of last test data: 0.036002126\n", "mse of last test data: 0.03595816\n", "mse of last test data: 0.035726678\n", "mse of last test data: 0.035456814\n", "mse of last test data: 0.035001807\n", "mse of last test data: 0.034719385\n", "mse of last test data: 0.03468811\n", "mse of last test data: 0.034629267\n", "mse of last test data: 0.034678638\n", "mse of last test data: 0.034925133\n", "mse of last test data: 0.035014037\n", "mse of last test data: 0.03494468\n", "mse of last test data: 0.035068564\n", "mse of last test data: 0.035189286\n", "mse of last test data: 0.035209198\n", "mse of last test data: 0.035288822\n", "mse of last test data: 0.035522904\n", "mse of last test data: 0.035889734\n", "mse of last test data: 0.03612873\n", "mse of last test data: 0.036274746\n", "mse of last test data: 0.03674327\n", "mse of last test data: 0.037314296\n", "mse of last test data: 0.037749104\n", "mse of last test data: 0.03806662\n", "mse of last test data: 0.038177904\n", "mse of last test data: 0.038116015\n", "mse of last test data: 0.038094003\n", "mse of last test data: 0.038104504\n", "mse of last test data: 0.03827262\n", "mse of last test data: 0.038561925\n", "mse of last test data: 0.038967945\n", "mse of last test data: 0.039505426\n", "mse of last test data: 0.040004343\n", "mse of last test data: 0.040388074\n", "mse of last test data: 0.04060459\n", "mse of last test data: 0.041038353\n", "mse of last test data: 0.04167475\n", "mse of last test data: 0.04242282\n", "mse of last test data: 0.042974524\n", "mse of last test data: 0.043507062\n", "mse of last test data: 0.043978337\n", "mse of last test data: 0.044552732\n", "mse of last test data: 0.044811197\n", "mse of last test data: 0.044948854\n", "mse of last test data: 0.0453248\n", "mse of last test data: 0.045763493\n", "mse of last test data: 0.045807287\n", "mse of last test data: 0.04584695\n", "mse of last test data: 0.045835588\n", "mse of last test data: 0.046063326\n", "mse of last test data: 0.046142258\n", "mse of last test data: 0.04619061\n", "mse of last test data: 0.04602862\n", "mse of last test data: 0.046279095\n", "mse of last test data: 0.04648937\n", "mse of last test data: 0.046688378\n", "mse of last test data: 0.047017314\n", "mse of last test data: 0.04759529\n", "mse of last test data: 0.048187714\n", "mse of last test data: 0.04876649\n", "mse of last test data: 0.049561806\n", "mse of last test data: 0.050339673\n", "mse of last test data: 0.050895724\n", "mse of last test data: 0.051403012\n", "mse of last test data: 0.051551413\n", "mse of last test data: 0.05184145\n", "mse of last test data: 0.05213111\n", "mse of last test data: 0.05201789\n", "mse of last test data: 0.05168149\n", "mse of last test data: 0.05192534\n", "mse of last test data: 0.05235551\n", "mse of last test data: 0.052856937\n", "mse of last test data: 0.053938713\n", "mse of last test data: 0.054606132\n", "mse of last test data: 0.055008397\n", "mse of last test data: 0.055384487\n", "mse of last test data: 0.05562475\n", "mse of last test data: 0.05541428\n", "mse of last test data: 0.055100046\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "mse of last test data: 0.054605152\n", "mse of last test data: 0.054154\n", "mse of last test data: 0.05385637\n", "mse of last test data: 0.0536435\n", "mse of last test data: 0.05328147\n", "mse of last test data: 0.053027265\n", "mse of last test data: 0.053042434\n", "mse of last test data: 0.05267731\n", "mse of last test data: 0.052673582\n", "mse of last test data: 0.05239616\n", "mse of last test data: 0.051708102\n", "mse of last test data: 0.051275477\n", "mse of last test data: 0.05111995\n", "mse of last test data: 0.050987016\n", "mse of last test data: 0.050700914\n", "mse of last test data: 0.050172016\n", "mse of last test data: 0.049366377\n", "mse of last test data: 0.048903815\n", "mse of last test data: 0.04788856\n", "mse of last test data: 0.0470797\n", "mse of last test data: 0.046200998\n", "mse of last test data: 0.045548897\n", "mse of last test data: 0.044755854\n", "mse of last test data: 0.04399403\n", "mse of last test data: 0.04330141\n", "mse of last test data: 0.042683505\n", "mse of last test data: 0.04236841\n", "mse of last test data: 0.04186626\n", "mse of last test data: 0.0416881\n", "mse of last test data: 0.041540608\n", "mse of last test data: 0.04154751\n", "mse of last test data: 0.041715562\n", "mse of last test data: 0.041812643\n", "mse of last test data: 0.041822653\n", "mse of last test data: 0.041784607\n", "mse of last test data: 0.04144943\n", "mse of last test data: 0.041050747\n", "mse of last test data: 0.040759165\n", "mse of last test data: 0.040293314\n", "mse of last test data: 0.039935593\n", "mse of last test data: 0.039261766\n", "mse of last test data: 0.038622603\n", "mse of last test data: 0.038196854\n", "mse of last test data: 0.03789666\n", "mse of last test data: 0.037674353\n", "mse of last test data: 0.037321392\n", "mse of last test data: 0.037049852\n", "mse of last test data: 0.03672101\n", "mse of last test data: 0.036547102\n", "mse of last test data: 0.03663898\n", "mse of last test data: 0.03675339\n", "mse of last test data: 0.036771975\n", "mse of last test data: 0.03672096\n", "mse of last test data: 0.03690495\n", "mse of last test data: 0.03713462\n", "mse of last test data: 0.03707089\n", "mse of last test data: 0.0369767\n", "mse of last test data: 0.036843468\n", "mse of last test data: 0.0366896\n", "mse of last test data: 0.036693912\n", "mse of last test data: 0.036737178\n", "mse of last test data: 0.036925703\n", "mse of last test data: 0.037359696\n", "mse of last test data: 0.03801434\n", "mse of last test data: 0.038453683\n", "mse of last test data: 0.0388445\n", "mse of last test data: 0.03943726\n", "mse of last test data: 0.040112153\n", "mse of last test data: 0.040496938\n", "mse of last test data: 0.040723853\n", "mse of last test data: 0.041014466\n", "mse of last test data: 0.041356135\n", "mse of last test data: 0.041903637\n", "mse of last test data: 0.04234812\n", "mse of last test data: 0.042939443\n", "mse of last test data: 0.043498352\n", "mse of last test data: 0.043968774\n", "mse of last test data: 0.044493068\n", "mse of last test data: 0.04521411\n", "mse of last test data: 0.045771904\n", "mse of last test data: 0.046629895\n", "mse of last test data: 0.047299497\n", "mse of last test data: 0.047667027\n", "mse of last test data: 0.047989164\n", "mse of last test data: 0.048167024\n", "mse of last test data: 0.048462152\n", "mse of last test data: 0.048996046\n", "mse of last test data: 0.049763598\n", "mse of last test data: 0.050080504\n", "mse of last test data: 0.050239693\n", "mse of last test data: 0.050378412\n", "mse of last test data: 0.050598167\n", "mse of last test data: 0.05105101\n", "mse of last test data: 0.051576763\n", "mse of last test data: 0.052223917\n", "mse of last test data: 0.053182542\n", "mse of last test data: 0.054220323\n", "mse of last test data: 0.055362917\n", "mse of last test data: 0.056611493\n", "mse of last test data: 0.057848323\n", "mse of last test data: 0.05854145\n", "mse of last test data: 0.059256084\n", "mse of last test data: 0.059849508\n", "mse of last test data: 0.060376026\n", "mse of last test data: 0.060621083\n", "mse of last test data: 0.06094754\n", "mse of last test data: 0.061078124\n", "mse of last test data: 0.06154837\n", "mse of last test data: 0.06218207\n", "mse of last test data: 0.062612005\n", "mse of last test data: 0.06316759\n", "mse of last test data: 0.06364927\n", "mse of last test data: 0.06395581\n", "mse of last test data: 0.06490716\n", "mse of last test data: 0.0659104\n", "mse of last test data: 0.066883266\n", "mse of last test data: 0.06799279\n", "mse of last test data: 0.06883022\n", "mse of last test data: 0.06999637\n", "mse of last test data: 0.07040557\n", "mse of last test data: 0.07055467\n", "mse of last test data: 0.0704412\n", "mse of last test data: 0.070556104\n", "mse of last test data: 0.07039124\n", "mse of last test data: 0.070203714\n", "mse of last test data: 0.06943795\n", "mse of last test data: 0.06905787\n", "mse of last test data: 0.06877463\n", "mse of last test data: 0.06792161\n", "mse of last test data: 0.067531504\n", "mse of last test data: 0.06737344\n", "mse of last test data: 0.067189686\n", "mse of last test data: 0.06694325\n", "mse of last test data: 0.06666852\n", "mse of last test data: 0.065830804\n", "mse of last test data: 0.06537669\n", "mse of last test data: 0.06491417\n", "mse of last test data: 0.06468389\n", "mse of last test data: 0.06437395\n", "mse of last test data: 0.06392299\n", "mse of last test data: 0.06348827\n", "mse of last test data: 0.063527524\n", "mse of last test data: 0.063115045\n", "mse of last test data: 0.0627057\n", "mse of last test data: 0.062102113\n", "mse of last test data: 0.061501656\n", "mse of last test data: 0.061108947\n", "mse of last test data: 0.060269404\n", "mse of last test data: 0.05914622\n", "mse of last test data: 0.058618482\n", "mse of last test data: 0.057946824\n", "mse of last test data: 0.057315763\n", "mse of last test data: 0.056833602\n", "mse of last test data: 0.056032997\n", "mse of last test data: 0.055409484\n", "mse of last test data: 0.054566707\n", "mse of last test data: 0.05363072\n", "mse of last test data: 0.052835308\n", "mse of last test data: 0.052092392\n", "mse of last test data: 0.051302966\n", "mse of last test data: 0.050705142\n", "mse of last test data: 0.0497013\n", "mse of last test data: 0.04873594\n", "mse of last test data: 0.047886934\n", "mse of last test data: 0.047256593\n", "mse of last test data: 0.046389896\n", "mse of last test data: 0.045826245\n", "mse of last test data: 0.045038085\n", "mse of last test data: 0.04472146\n", "mse of last test data: 0.04450987\n", "mse of last test data: 0.043820444\n", "mse of last test data: 0.043335173\n", "mse of last test data: 0.043237902\n", "mse of last test data: 0.042693343\n", "mse of last test data: 0.0420492\n", "mse of last test data: 0.041761592\n", "mse of last test data: 0.041558076\n", "mse of last test data: 0.04113762\n", "mse of last test data: 0.040989418\n", "mse of last test data: 0.040603217\n", "mse of last test data: 0.040685717\n", "mse of last test data: 0.040991854\n", "mse of last test data: 0.041050777\n", "mse of last test data: 0.04132885\n", "mse of last test data: 0.041440982\n", "mse of last test data: 0.041547675\n", "mse of last test data: 0.041578636\n", "mse of last test data: 0.041851215\n", "mse of last test data: 0.041640528\n", "mse of last test data: 0.041732017\n", "mse of last test data: 0.0419739\n", "mse of last test data: 0.04194562\n", "mse of last test data: 0.04221782\n", "mse of last test data: 0.042523533\n", "mse of last test data: 0.043012597\n", "mse of last test data: 0.043684058\n", "mse of last test data: 0.04402702\n", "mse of last test data: 0.044481214\n", "mse of last test data: 0.0450937\n", "mse of last test data: 0.045700084\n", "mse of last test data: 0.046173405\n", "mse of last test data: 0.0467588\n", "mse of last test data: 0.047187176\n", "mse of last test data: 0.047719445\n", "mse of last test data: 0.04842757\n", "mse of last test data: 0.049238943\n", "mse of last test data: 0.04988231\n", "mse of last test data: 0.050821222\n", "mse of last test data: 0.051694877\n", "mse of last test data: 0.05214913\n", "mse of last test data: 0.052437652\n", "mse of last test data: 0.052969992\n", "mse of last test data: 0.053789765\n", "mse of last test data: 0.054559898\n", "mse of last test data: 0.05517614\n", "mse of last test data: 0.055931017\n", "mse of last test data: 0.056781147\n", "mse of last test data: 0.0573848\n", "mse of last test data: 0.057863265\n", "mse of last test data: 0.05891953\n", "mse of last test data: 0.059961736\n", "mse of last test data: 0.060802933\n", "mse of last test data: 0.061579917\n", "mse of last test data: 0.06266324\n", "mse of last test data: 0.06371082\n", "mse of last test data: 0.06462453\n", "mse of last test data: 0.06564987\n", "mse of last test data: 0.06654139\n", "mse of last test data: 0.067626685\n", "mse of last test data: 0.06854836\n", "mse of last test data: 0.06957363\n", "mse of last test data: 0.07085023\n", "mse of last test data: 0.07175384\n", "mse of last test data: 0.07260185\n", "mse of last test data: 0.073333375\n", "mse of last test data: 0.074260205\n", "mse of last test data: 0.07508073\n", "mse of last test data: 0.075647935\n", "mse of last test data: 0.07631055\n", "mse of last test data: 0.07694918\n", "mse of last test data: 0.076984815\n", "mse of last test data: 0.077071525\n", "mse of last test data: 0.077484496\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "mse of last test data: 0.07809034\n", "mse of last test data: 0.07847417\n", "mse of last test data: 0.079089314\n", "mse of last test data: 0.07933486\n", "mse of last test data: 0.079938\n", "mse of last test data: 0.08079829\n", "mse of last test data: 0.081314266\n", "mse of last test data: 0.08216548\n", "mse of last test data: 0.0826575\n", "mse of last test data: 0.08339308\n", "mse of last test data: 0.083519086\n", "mse of last test data: 0.0840565\n", "mse of last test data: 0.084472895\n", "mse of last test data: 0.08464473\n", "mse of last test data: 0.08453613\n", "mse of last test data: 0.083544716\n", "mse of last test data: 0.082723804\n", "mse of last test data: 0.08207079\n", "mse of last test data: 0.08183347\n", "mse of last test data: 0.0817586\n", "mse of last test data: 0.081749596\n", "mse of last test data: 0.08135106\n", "mse of last test data: 0.08085264\n", "mse of last test data: 0.08009475\n", "mse of last test data: 0.07935655\n", "mse of last test data: 0.07896202\n", "mse of last test data: 0.07839527\n", "mse of last test data: 0.07789573\n", "mse of last test data: 0.077722974\n", "mse of last test data: 0.07696794\n", "mse of last test data: 0.07575168\n", "mse of last test data: 0.074648835\n", "mse of last test data: 0.073912315\n", "mse of last test data: 0.07296068\n", "mse of last test data: 0.072213\n", "mse of last test data: 0.07117133\n", "mse of last test data: 0.070252426\n", "mse of last test data: 0.06944831\n", "mse of last test data: 0.068270326\n", "mse of last test data: 0.0670842\n", "mse of last test data: 0.06638204\n", "mse of last test data: 0.06568636\n", "mse of last test data: 0.06470476\n", "mse of last test data: 0.06364994\n", "mse of last test data: 0.06275745\n", "mse of last test data: 0.06165835\n", "mse of last test data: 0.06073502\n", "mse of last test data: 0.059538607\n", "mse of last test data: 0.05833644\n", "mse of last test data: 0.05694349\n", "mse of last test data: 0.055479866\n", "mse of last test data: 0.054633502\n", "mse of last test data: 0.05381038\n", "mse of last test data: 0.05303871\n", "mse of last test data: 0.052432828\n", "mse of last test data: 0.05182874\n", "mse of last test data: 0.051080927\n", "mse of last test data: 0.050386973\n", "mse of last test data: 0.049565386\n", "mse of last test data: 0.049125805\n", "mse of last test data: 0.048725173\n", "mse of last test data: 0.04790157\n", "mse of last test data: 0.04716007\n", "mse of last test data: 0.046846654\n", "mse of last test data: 0.046007197\n", "mse of last test data: 0.045369487\n", "mse of last test data: 0.044932183\n", "mse of last test data: 0.04426895\n", "mse of last test data: 0.043891855\n", "mse of last test data: 0.043293122\n", "mse of last test data: 0.04309746\n", "mse of last test data: 0.04310781\n", "mse of last test data: 0.04271647\n", "mse of last test data: 0.042131722\n", "mse of last test data: 0.042267226\n", "mse of last test data: 0.04246434\n", "mse of last test data: 0.042620976\n", "mse of last test data: 0.042942483\n", "mse of last test data: 0.04303761\n", "mse of last test data: 0.04349474\n", "mse of last test data: 0.0437899\n", "mse of last test data: 0.044176083\n", "mse of last test data: 0.044732552\n", "mse of last test data: 0.04543317\n", "mse of last test data: 0.045993652\n", "mse of last test data: 0.046672627\n", "mse of last test data: 0.04723318\n", "mse of last test data: 0.047575876\n", "mse of last test data: 0.048151337\n", "mse of last test data: 0.04898234\n", "mse of last test data: 0.04950618\n", "mse of last test data: 0.04985728\n", "mse of last test data: 0.050079018\n", "mse of last test data: 0.050002214\n", "mse of last test data: 0.04996802\n", "mse of last test data: 0.050199352\n", "mse of last test data: 0.05039392\n", "mse of last test data: 0.050659057\n", "mse of last test data: 0.05120479\n", "mse of last test data: 0.05144986\n", "mse of last test data: 0.051979337\n", "mse of last test data: 0.05278858\n", "mse of last test data: 0.053678963\n", "mse of last test data: 0.0549005\n", "mse of last test data: 0.056104675\n", "mse of last test data: 0.05728328\n", "mse of last test data: 0.058226917\n", "mse of last test data: 0.059043556\n", "mse of last test data: 0.05978783\n", "mse of last test data: 0.06066101\n", "mse of last test data: 0.061586507\n", "mse of last test data: 0.062372074\n", "mse of last test data: 0.063418165\n", "mse of last test data: 0.0644478\n", "mse of last test data: 0.06523493\n", "mse of last test data: 0.06619985\n", "mse of last test data: 0.06691338\n", "mse of last test data: 0.06766483\n", "mse of last test data: 0.06823798\n", "mse of last test data: 0.069028705\n", "mse of last test data: 0.07040166\n", "mse of last test data: 0.07137897\n", "mse of last test data: 0.07202942\n", "mse of last test data: 0.072754875\n", "mse of last test data: 0.07371439\n", "mse of last test data: 0.07483628\n", "mse of last test data: 0.07592519\n", "mse of last test data: 0.07681563\n", "mse of last test data: 0.07812281\n", "mse of last test data: 0.07933848\n", "mse of last test data: 0.08018373\n", "mse of last test data: 0.08074742\n", "mse of last test data: 0.08127048\n", "mse of last test data: 0.081600845\n", "mse of last test data: 0.08173432\n", "mse of last test data: 0.08185565\n", "mse of last test data: 0.08203371\n", "mse of last test data: 0.08234206\n", "mse of last test data: 0.08275901\n", "mse of last test data: 0.0827084\n", "mse of last test data: 0.08287379\n", "mse of last test data: 0.08255896\n", "mse of last test data: 0.08321978\n", "mse of last test data: 0.08352913\n", "mse of last test data: 0.08377892\n", "mse of last test data: 0.08411917\n", "mse of last test data: 0.08434226\n", "mse of last test data: 0.08462197\n", "mse of last test data: 0.08449116\n", "mse of last test data: 0.0841965\n", "mse of last test data: 0.083713956\n", "mse of last test data: 0.08332585\n", "mse of last test data: 0.08333279\n", "mse of last test data: 0.08346157\n", "mse of last test data: 0.08324353\n", "mse of last test data: 0.08334021\n", "mse of last test data: 0.08322359\n", "mse of last test data: 0.08286543\n", "mse of last test data: 0.0823608\n", "mse of last test data: 0.08179303\n", "mse of last test data: 0.08076766\n", "mse of last test data: 0.08036916\n", "mse of last test data: 0.079468556\n", "mse of last test data: 0.07863285\n", "mse of last test data: 0.077711366\n", "mse of last test data: 0.07701495\n", "mse of last test data: 0.07648523\n", "mse of last test data: 0.076334864\n", "mse of last test data: 0.07590014\n", "mse of last test data: 0.075278714\n", "mse of last test data: 0.07451074\n", "mse of last test data: 0.073665306\n", "mse of last test data: 0.072604604\n", "mse of last test data: 0.071306616\n", "mse of last test data: 0.069950886\n", "mse of last test data: 0.068437\n", "mse of last test data: 0.067476794\n", "mse of last test data: 0.0665985\n", "mse of last test data: 0.0661967\n", "mse of last test data: 0.06555315\n", "mse of last test data: 0.064645395\n", "mse of last test data: 0.06402787\n", "mse of last test data: 0.063268885\n", "mse of last test data: 0.06259369\n", "mse of last test data: 0.061966043\n", "mse of last test data: 0.061628904\n", "mse of last test data: 0.06091293\n", "mse of last test data: 0.060561795\n", "mse of last test data: 0.059895515\n", "mse of last test data: 0.0587479\n", "mse of last test data: 0.058090683\n", "mse of last test data: 0.0575988\n", "mse of last test data: 0.0569736\n", "mse of last test data: 0.056413162\n", "mse of last test data: 0.055881493\n", "mse of last test data: 0.055156387\n", "mse of last test data: 0.054764092\n", "mse of last test data: 0.05379415\n", "mse of last test data: 0.05341845\n", "mse of last test data: 0.052721445\n", "mse of last test data: 0.051884793\n", "mse of last test data: 0.051117186\n", "mse of last test data: 0.050562695\n", "mse of last test data: 0.05040292\n", "mse of last test data: 0.050410375\n", "mse of last test data: 0.050853588\n", "mse of last test data: 0.051424023\n", "mse of last test data: 0.051752765\n", "mse of last test data: 0.05224338\n", "mse of last test data: 0.052897\n", "mse of last test data: 0.052691735\n", "mse of last test data: 0.05253566\n", "mse of last test data: 0.052735034\n", "mse of last test data: 0.052889466\n", "mse of last test data: 0.052931055\n", "mse of last test data: 0.05241148\n", "mse of last test data: 0.051971577\n", "mse of last test data: 0.052343342\n", "mse of last test data: 0.0528425\n", "mse of last test data: 0.0532845\n", "mse of last test data: 0.05380743\n", "mse of last test data: 0.054178886\n", "mse of last test data: 0.05485781\n", "mse of last test data: 0.054932643\n", "mse of last test data: 0.055016536\n", "mse of last test data: 0.0553546\n", "mse of last test data: 0.05567089\n", "mse of last test data: 0.055940997\n", "mse of last test data: 0.056046944\n", "mse of last test data: 0.056290556\n", "mse of last test data: 0.05663026\n", "mse of last test data: 0.057073623\n", "mse of last test data: 0.057451386\n", "mse of last test data: 0.05813381\n", "mse of last test data: 0.05874961\n", "mse of last test data: 0.059299555\n", "mse of last test data: 0.05980952\n", "mse of last test data: 0.060260225\n", "mse of last test data: 0.0608641\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "mse of last test data: 0.061568096\n", "mse of last test data: 0.062518425\n", "mse of last test data: 0.06325057\n", "mse of last test data: 0.06402895\n", "mse of last test data: 0.06497191\n", "mse of last test data: 0.06579888\n", "mse of last test data: 0.067111544\n", "mse of last test data: 0.068179786\n", "mse of last test data: 0.06903188\n", "mse of last test data: 0.07017574\n", "mse of last test data: 0.07141715\n", "mse of last test data: 0.07240259\n", "mse of last test data: 0.07312126\n", "mse of last test data: 0.07356385\n", "mse of last test data: 0.07393713\n", "mse of last test data: 0.07472873\n", "mse of last test data: 0.07574809\n", "mse of last test data: 0.07669301\n", "mse of last test data: 0.0775595\n", "mse of last test data: 0.078188\n", "mse of last test data: 0.07941976\n", "mse of last test data: 0.080385394\n", "mse of last test data: 0.08167663\n", "mse of last test data: 0.08269441\n", "mse of last test data: 0.08372783\n", "mse of last test data: 0.084634386\n", "mse of last test data: 0.08485869\n", "mse of last test data: 0.085374646\n", "mse of last test data: 0.085740976\n", "mse of last test data: 0.08663443\n", "mse of last test data: 0.08713622\n", "mse of last test data: 0.08758123\n", "mse of last test data: 0.08789659\n", "mse of last test data: 0.08796546\n", "mse of last test data: 0.0878321\n", "mse of last test data: 0.087539405\n", "mse of last test data: 0.08747789\n", "mse of last test data: 0.088020965\n", "mse of last test data: 0.08858664\n", "mse of last test data: 0.088778175\n", "mse of last test data: 0.089013495\n", "mse of last test data: 0.08898069\n", "mse of last test data: 0.08858915\n", "mse of last test data: 0.08817425\n", "mse of last test data: 0.08775721\n", "mse of last test data: 0.08751199\n", "mse of last test data: 0.08770336\n", "mse of last test data: 0.08773042\n", "mse of last test data: 0.08756273\n", "mse of last test data: 0.087514915\n", "mse of last test data: 0.087031506\n", "mse of last test data: 0.08626881\n", "mse of last test data: 0.08545341\n", "mse of last test data: 0.08504947\n", "mse of last test data: 0.08450457\n", "mse of last test data: 0.08383059\n", "mse of last test data: 0.082974434\n", "mse of last test data: 0.08217745\n", "mse of last test data: 0.08167454\n", "mse of last test data: 0.08074595\n", "mse of last test data: 0.08006667\n", "mse of last test data: 0.078919806\n", "mse of last test data: 0.07762168\n", "mse of last test data: 0.07612659\n", "mse of last test data: 0.07543544\n", "mse of last test data: 0.07471285\n", "mse of last test data: 0.07409527\n", "mse of last test data: 0.07324239\n", "mse of last test data: 0.07200914\n", "mse of last test data: 0.07094035\n", "mse of last test data: 0.06998237\n", "mse of last test data: 0.0689911\n", "mse of last test data: 0.06862763\n", "mse of last test data: 0.068846315\n", "mse of last test data: 0.06896952\n", "mse of last test data: 0.069029845\n", "mse of last test data: 0.06876393\n", "mse of last test data: 0.06822805\n", "mse of last test data: 0.067627475\n", "mse of last test data: 0.066910386\n", "mse of last test data: 0.06596285\n", "mse of last test data: 0.06475239\n", "mse of last test data: 0.06337351\n", "mse of last test data: 0.06190893\n", "mse of last test data: 0.060455818\n", "mse of last test data: 0.05945335\n", "mse of last test data: 0.058874406\n", "mse of last test data: 0.058529194\n", "mse of last test data: 0.05847619\n", "mse of last test data: 0.058467004\n", "mse of last test data: 0.058635216\n", "mse of last test data: 0.05900268\n", "mse of last test data: 0.05964228\n", "mse of last test data: 0.060126405\n", "mse of last test data: 0.06030947\n", "mse of last test data: 0.06021211\n", "mse of last test data: 0.060109865\n", "mse of last test data: 0.05989852\n", "mse of last test data: 0.059676565\n", "mse of last test data: 0.058915537\n", "mse of last test data: 0.05818829\n", "mse of last test data: 0.05793772\n", "mse of last test data: 0.057634525\n", "mse of last test data: 0.05776301\n", "mse of last test data: 0.05802423\n", "mse of last test data: 0.058413498\n", "mse of last test data: 0.05889824\n", "mse of last test data: 0.059561614\n", "mse of last test data: 0.05995116\n", "mse of last test data: 0.060674265\n", "mse of last test data: 0.061642237\n", "mse of last test data: 0.062265716\n", "mse of last test data: 0.06261126\n", "mse of last test data: 0.06321956\n", "mse of last test data: 0.06385407\n", "mse of last test data: 0.06478457\n", "mse of last test data: 0.06547407\n", "mse of last test data: 0.06600813\n", "mse of last test data: 0.066247664\n", "mse of last test data: 0.06696937\n", "mse of last test data: 0.06712928\n", "mse of last test data: 0.067296825\n", "mse of last test data: 0.06803123\n", "mse of last test data: 0.068576775\n", "mse of last test data: 0.068736695\n", "mse of last test data: 0.06898644\n", "mse of last test data: 0.06920508\n", "mse of last test data: 0.06966729\n", "mse of last test data: 0.07024488\n", "mse of last test data: 0.0707083\n", "mse of last test data: 0.071489014\n", "mse of last test data: 0.072244056\n", "mse of last test data: 0.072727054\n", "mse of last test data: 0.07265602\n", "mse of last test data: 0.07259401\n", "mse of last test data: 0.07283661\n", "mse of last test data: 0.07355048\n", "mse of last test data: 0.07413451\n", "mse of last test data: 0.07455221\n", "mse of last test data: 0.074991226\n", "mse of last test data: 0.07586654\n", "mse of last test data: 0.07635737\n", "mse of last test data: 0.0767616\n", "mse of last test data: 0.07676927\n", "mse of last test data: 0.07701653\n", "mse of last test data: 0.07765571\n", "mse of last test data: 0.07808881\n", "mse of last test data: 0.07842322\n", "mse of last test data: 0.0786469\n", "mse of last test data: 0.07885746\n", "mse of last test data: 0.078998715\n", "mse of last test data: 0.079190984\n", "mse of last test data: 0.07954396\n", "mse of last test data: 0.079925425\n", "mse of last test data: 0.0804836\n", "mse of last test data: 0.080848426\n", "mse of last test data: 0.08105866\n", "mse of last test data: 0.081377424\n", "mse of last test data: 0.081521235\n", "mse of last test data: 0.08179761\n", "mse of last test data: 0.08261895\n", "mse of last test data: 0.08329921\n", "mse of last test data: 0.083642446\n", "mse of last test data: 0.08394619\n", "mse of last test data: 0.08432225\n", "(1200, 30, 30, 3)\n" ] } ], "source": [ "import tensorflow as tf\n", "import utils as util\n", "import numpy as np\n", "import os\n", "\n", "\n", "def cnn_encoder_layer(data, filter_layer, strides):\n", " \"\"\"\n", " :param data: the input data, when it is the first layer is 5 * 30 * 30 * 3, the second layer is 30 * 30 * 32,\n", " the third layer is 15 * 15 * 64, the fourth layer is 8 * 8 * 128\n", " :param filter_layer:\n", " :param strides:\n", " :return: the result after conv, the first layer is 30 * 30 * 32, the second layer is 15 * 15 * 64, the third layer\n", " is 8 * 8 * 128, the final layer is 4 * 4 * 256\n", " \"\"\"\n", "\n", " result = tf.nn.conv2d(\n", " input=data,\n", " filters=filter_layer,\n", " strides=strides,\n", " padding=\"SAME\")\n", " return tf.nn.selu(result)\n", "\n", "\n", "def tensor_variable(shape, name):\n", " \"\"\"\n", " Tensor variable declaration initialization\n", " :param shape:\n", " :param name:\n", " :return:\n", " \"\"\"\n", " variable = tf.Variable(tf.zeros(shape), name=name)\n", " variable = tf.compat.v1.get_variable(name, shape=shape, initializer=tf.compat.v1.keras.initializers.VarianceScaling(scale=1.0, mode=\"fan_avg\", distribution=\"uniform\"))\n", " \n", " return variable\n", "\n", "\n", "def cnn_encoder(data):\n", " \"\"\"\n", "\n", " :param data: the input data size is 5 * 30 * 30 * 3\n", " :return:\n", " \"\"\"\n", " # the first layer,the output size is 30 * 30 * 32\n", " filter1 = tensor_variable([3, 3, 3, 32], \"filter1\")\n", " strides1 = (1, 1, 1, 1)\n", " cnn1_out = cnn_encoder_layer(data, filter1, strides1)\n", "\n", " # the second layer, the output size is 15 * 15 * 64\n", " filter2 = tensor_variable([3, 3, 32, 64], \"filter2\")\n", " strides2 = (1, 2, 2, 1)\n", " cnn2_out = cnn_encoder_layer(cnn1_out, filter2, strides2)\n", "\n", " # the third layer, the output size is 8 * 8 * 128\n", " filter3 = tensor_variable([2, 2, 64, 128], \"filter3\")\n", " strides3 = (1, 2, 2, 1)\n", " cnn3_out = cnn_encoder_layer(cnn2_out, filter3, strides3)\n", "\n", " # the fourth layer, the output size is 4 * 4 * 256\n", " filter4 = tensor_variable([2, 2, 128, 256], \"filter4\")\n", " strides4 = (1, 2, 2, 1)\n", " cnn4_out = cnn_encoder_layer(cnn3_out, filter4, strides4)\n", "\n", " return cnn1_out, cnn2_out, cnn3_out, cnn4_out\n", "\n", "\n", "def cnn_lstm_attention_layer(input_data, layer_number):\n", " \"\"\"\n", "\n", " :param input_data:\n", " :param layer_number:\n", " :return:\n", " \"\"\"\n", " convlstm_layer = tf.contrib.rnn.ConvLSTMCell(\n", " conv_ndims=2,\n", " input_shape=[input_data.shape[2], input_data.shape[3], input_data.shape[4]],\n", " output_channels=input_data.shape[-1],\n", " kernel_shape=[2, 2],\n", " use_bias=True,\n", " skip_connection=False,\n", " forget_bias=1.0,\n", " initializers=None,\n", " name=\"conv_lstm_cell\" + str(layer_number))\n", "\n", " outputs, state = tf.compat.v1.nn.dynamic_rnn(convlstm_layer, input_data, dtype=input_data.dtype)\n", "\n", " # attention based on inner-product between feature representation of last step and other steps\n", " attention_w = []\n", " for k in range(util.step_max):\n", " attention_w.append(tf.reduce_sum(input_tensor=tf.multiply(outputs[0][k], outputs[0][-1])) / util.step_max)\n", " attention_w = tf.reshape(tf.nn.softmax(tf.stack(attention_w)), [1, util.step_max])\n", "\n", " outputs = tf.reshape(outputs[0], [util.step_max, -1])\n", " outputs = tf.matmul(attention_w, outputs)\n", " outputs = tf.reshape(outputs, [1, input_data.shape[2], input_data.shape[3], input_data.shape[4]])\n", "\n", " return outputs, attention_w\n", "\n", "\n", "def cnn_decoder_layer(conv_lstm_out_c, filter, output_shape, strides):\n", " \"\"\"\n", "\n", " :param conv_lstm_out_c:\n", " :param filter:\n", " :param output_shape:\n", " :param strides:\n", " :return:\n", " \"\"\"\n", "\n", " deconv = tf.nn.conv2d_transpose(\n", " input=conv_lstm_out_c,\n", " filters=filter,\n", " output_shape=output_shape,\n", " strides=strides,\n", " padding=\"SAME\")\n", " deconv = tf.nn.selu(deconv)\n", " return deconv\n", "\n", "\n", "def cnn_decoder(lstm1_out, lstm2_out, lstm3_out, lstm4_out):\n", " d_filter4 = tensor_variable([2, 2, 128, 256], \"d_filter4\")\n", " dec4 = cnn_decoder_layer(lstm4_out, d_filter4, [1, 8, 8, 128], (1, 2, 2, 1))\n", " dec4_concat = tf.concat([dec4, lstm3_out], axis=3)\n", "\n", " d_filter3 = tensor_variable([2, 2, 64, 256], \"d_filter3\")\n", " dec3 = cnn_decoder_layer(dec4_concat, d_filter3, [1, 15, 15, 64], (1, 2, 2, 1))\n", " dec3_concat = tf.concat([dec3, lstm2_out], axis=3)\n", "\n", " d_filter2 = tensor_variable([3, 3, 32, 128], \"d_filter2\")\n", " dec2 = cnn_decoder_layer(dec3_concat, d_filter2, [1, 30, 30, 32], (1, 2, 2, 1))\n", " dec2_concat = tf.concat([dec2, lstm1_out], axis=3)\n", "\n", " d_filter1 = tensor_variable([3, 3, 3, 64], \"d_filter1\")\n", " dec1 = cnn_decoder_layer(dec2_concat, d_filter1, [1, 30, 30, 3], (1, 1, 1, 1))\n", "\n", " return dec1\n", "\n", "\n", "def main():\n", " # Read dataset from file\n", " matrix_data_path = util.train_data_path + \"train.npy\"\n", " matrix_gt_1 = np.load(matrix_data_path)\n", "\n", " sess = tf.compat.v1.Session()\n", " data_input = tf.compat.v1.placeholder(tf.float32, [util.step_max, 30, 30, 3])\n", "\n", " # cnn encoder\n", " conv1_out, conv2_out, conv3_out, conv4_out = cnn_encoder(data_input)\n", "\n", " conv1_out = tf.reshape(conv1_out, [-1, 5, 30, 30, 32])\n", " conv2_out = tf.reshape(conv2_out, [-1, 5, 15, 15, 64])\n", " conv3_out = tf.reshape(conv3_out, [-1, 5, 8, 8, 128])\n", " conv4_out = tf.reshape(conv4_out, [-1, 5, 4, 4, 256])\n", "\n", " # lstm with attention\n", " conv1_lstm_attention_out, atten_weight_1 = cnn_lstm_attention_layer(conv1_out, 1)\n", " conv2_lstm_attention_out, atten_weight_2 = cnn_lstm_attention_layer(conv2_out, 2)\n", " conv3_lstm_attention_out, atten_weight_3 = cnn_lstm_attention_layer(conv3_out, 3)\n", " conv4_lstm_attention_out, atten_weight_4 = cnn_lstm_attention_layer(conv4_out, 4)\n", "\n", " # cnn decoder\n", " deconv_out = cnn_decoder(conv1_lstm_attention_out, conv2_lstm_attention_out, conv3_lstm_attention_out,\n", " conv4_lstm_attention_out)\n", " # loss function: reconstruction error of last step matrix\n", " loss = tf.reduce_mean(input_tensor=tf.square(data_input[-1] - deconv_out))\n", " optimizer = tf.compat.v1.train.AdamOptimizer(learning_rate=util.learning_rate).minimize(loss)\n", "\n", " # variable initialization\n", " init = tf.compat.v1.global_variables_initializer()\n", " sess.run(init)\n", "\n", " # training\n", " for idx in range(util.train_start_id, util.train_end_id):\n", " matrix_gt = matrix_gt_1[idx - util.train_start_id]\n", " feed_dict = {data_input: np.asarray(matrix_gt)}\n", " a, loss_value = sess.run([optimizer, loss], feed_dict)\n", " print(\"mse of last train data: \" + str(loss_value))\n", "\n", " # test\n", " # Read the data from test file.\n", " matrix_data_path = util.test_data_path + \"test.npy\"\n", " matrix_gt_1 = np.load(matrix_data_path)\n", " result_all = []\n", " for idx in range(util.test_start_id, util.test_end_id):\n", " matrix_gt = matrix_gt_1[idx - util.test_start_id]\n", " feed_dict = {data_input: np.asarray(matrix_gt)}\n", " result, loss_value = sess.run([deconv_out, loss], feed_dict)\n", " result_all.append(result)\n", " print(\"mse of last test data: \" + str(loss_value))\n", "\n", " # Write the reconstructed matrix to the file\n", " reconstructed_path = util.reconstructed_data_path\n", " if not os.path.exists(reconstructed_path):\n", " os.makedirs(reconstructed_path)\n", " reconstructed_path = reconstructed_path + \"test_reconstructed.npy\"\n", "\n", " result_all = np.asarray(result_all).reshape((-1, 30, 30, 3))\n", " print(result_all.shape)\n", " np.save(reconstructed_path, result_all)\n", "\n", "\n", "if __name__ == '__main__':\n", " main()\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "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.5.4" } }, "nbformat": 4, "nbformat_minor": 4 } ================================================ FILE: 02_Python/MSCRED/cnn_lstm/convlstm.py ================================================ import tensorflow as tf import cnn_lstm.utils as util import numpy as np import os def cnn_encoder_layer(data, filter_layer, strides): """ :param data: the input data, when it is the first layer is 5 * 30 * 30 * 3, the second layer is 30 * 30 * 32, the third layer is 15 * 15 * 64, the fourth layer is 8 * 8 * 128 :param filter_layer: :param strides: :return: the result after conv, the first layer is 30 * 30 * 32, the second layer is 15 * 15 * 64, the third layer is 8 * 8 * 128, the final layer is 4 * 4 * 256 """ result = tf.nn.conv2d( input=data, filter=filter_layer, strides=strides, padding="SAME") return tf.nn.selu(result) def tensor_variable(shape, name): """ Tensor variable declaration initialization :param shape: :param name: :return: """ variable = tf.Variable(tf.zeros(shape), name=name) variable = tf.compat.v1.get_variable(name, shape=shape, initializer=tf.contrib.layers.xavier_initializer()) return variable def cnn_encoder(data): """ :param data: the input data size is 5 * 30 * 30 * 3 :return: """ # the first layer,the output size is 30 * 30 * 32 filter1 = tensor_variable([3, 3, 3, 32], "filter1") strides1 = (1, 1, 1, 1) cnn1_out = cnn_encoder_layer(data, filter1, strides1) # the second layer, the output size is 15 * 15 * 64 filter2 = tensor_variable([3, 3, 32, 64], "filter2") strides2 = (1, 2, 2, 1) cnn2_out = cnn_encoder_layer(cnn1_out, filter2, strides2) # the third layer, the output size is 8 * 8 * 128 filter3 = tensor_variable([2, 2, 64, 128], "filter3") strides3 = (1, 2, 2, 1) cnn3_out = cnn_encoder_layer(cnn2_out, filter3, strides3) # the fourth layer, the output size is 4 * 4 * 256 filter4 = tensor_variable([2, 2, 128, 256], "filter4") strides4 = (1, 2, 2, 1) cnn4_out = cnn_encoder_layer(cnn3_out, filter4, strides4) return cnn1_out, cnn2_out, cnn3_out, cnn4_out def cnn_lstm_attention_layer(input_data, layer_number): """ :param input_data: :param layer_number: :return: """ convlstm_layer = tf.contrib.rnn.ConvLSTMCell( conv_ndims=2, input_shape=[input_data.shape[2], input_data.shape[3], input_data.shape[4]], output_channels=input_data.shape[-1], kernel_shape=[2, 2], use_bias=True, skip_connection=False, forget_bias=1.0, initializers=None, name="conv_lstm_cell" + str(layer_number)) outputs, state = tf.nn.dynamic_rnn(convlstm_layer, input_data, dtype=input_data.dtype) # attention based on inner-product between feature representation of last step and other steps attention_w = [] for k in range(util.step_max): attention_w.append(tf.reduce_sum(tf.multiply(outputs[0][k], outputs[0][-1])) / util.step_max) attention_w = tf.reshape(tf.nn.softmax(tf.stack(attention_w)), [1, util.step_max]) outputs = tf.reshape(outputs[0], [util.step_max, -1]) outputs = tf.matmul(attention_w, outputs) outputs = tf.reshape(outputs, [1, input_data.shape[2], input_data.shape[3], input_data.shape[4]]) return outputs, attention_w def cnn_decoder_layer(conv_lstm_out_c, filter, output_shape, strides): """ :param conv_lstm_out_c: :param filter: :param output_shape: :param strides: :return: """ deconv = tf.nn.conv2d_transpose( value=conv_lstm_out_c, filter=filter, output_shape=output_shape, strides=strides, padding="SAME") deconv = tf.nn.selu(deconv) return deconv def cnn_decoder(lstm1_out, lstm2_out, lstm3_out, lstm4_out): d_filter4 = tensor_variable([2, 2, 128, 256], "d_filter4") dec4 = cnn_decoder_layer(lstm4_out, d_filter4, [1, 8, 8, 128], (1, 2, 2, 1)) dec4_concat = tf.concat([dec4, lstm3_out], axis=3) d_filter3 = tensor_variable([2, 2, 64, 256], "d_filter3") dec3 = cnn_decoder_layer(dec4_concat, d_filter3, [1, 15, 15, 64], (1, 2, 2, 1)) dec3_concat = tf.concat([dec3, lstm2_out], axis=3) d_filter2 = tensor_variable([3, 3, 32, 128], "d_filter2") dec2 = cnn_decoder_layer(dec3_concat, d_filter2, [1, 30, 30, 32], (1, 2, 2, 1)) dec2_concat = tf.concat([dec2, lstm1_out], axis=3) d_filter1 = tensor_variable([3, 3, 3, 64], "d_filter1") dec1 = cnn_decoder_layer(dec2_concat, d_filter1, [1, 30, 30, 3], (1, 1, 1, 1)) return dec1 def main(): # Read dataset from file matrix_data_path = util.train_data_path + "train.npy" matrix_gt_1 = np.load(matrix_data_path) sess = tf.Session() data_input = tf.compat.v1.placeholder(tf.float32, [util.step_max, 30, 30, 3]) # cnn encoder conv1_out, conv2_out, conv3_out, conv4_out = cnn_encoder(data_input) conv1_out = tf.reshape(conv1_out, [-1, 5, 30, 30, 32]) conv2_out = tf.reshape(conv2_out, [-1, 5, 15, 15, 64]) conv3_out = tf.reshape(conv3_out, [-1, 5, 8, 8, 128]) conv4_out = tf.reshape(conv4_out, [-1, 5, 4, 4, 256]) # lstm with attention conv1_lstm_attention_out, atten_weight_1 = cnn_lstm_attention_layer(conv1_out, 1) conv2_lstm_attention_out, atten_weight_2 = cnn_lstm_attention_layer(conv2_out, 2) conv3_lstm_attention_out, atten_weight_3 = cnn_lstm_attention_layer(conv3_out, 3) conv4_lstm_attention_out, atten_weight_4 = cnn_lstm_attention_layer(conv4_out, 4) # cnn decoder deconv_out = cnn_decoder(conv1_lstm_attention_out, conv2_lstm_attention_out, conv3_lstm_attention_out, conv4_lstm_attention_out) # loss function: reconstruction error of last step matrix loss = tf.reduce_mean(tf.square(data_input[-1] - deconv_out)) optimizer = tf.compat.v1.train.AdamOptimizer(learning_rate=util.learning_rate).minimize(loss) # variable initialization init = tf.global_variables_initializer() sess.run(init) # training for idx in range(util.train_start_id, util.train_end_id): matrix_gt = matrix_gt_1[idx - util.train_start_id] feed_dict = {data_input: np.asarray(matrix_gt)} a, loss_value = sess.run([optimizer, loss], feed_dict) print("mse of last train data: " + str(loss_value)) # test # Read the data from test file. matrix_data_path = util.test_data_path + "test.npy" matrix_gt_1 = np.load(matrix_data_path) result_all = [] for idx in range(util.test_start_id, util.test_end_id): matrix_gt = matrix_gt_1[idx - util.test_start_id] feed_dict = {data_input: np.asarray(matrix_gt)} result, loss_value = sess.run([deconv_out, loss], feed_dict) result_all.append(result) print("mse of last test data: " + str(loss_value)) # Write the reconstructed matrix to the file reconstructed_path = util.reconstructed_data_path if not os.path.exists(reconstructed_path): os.makedirs(reconstructed_path) reconstructed_path = reconstructed_path + "test_reconstructed.npy" result_all = np.asarray(result_all).reshape((-1, 30, 30, 3)) print(result_all.shape) np.save(reconstructed_path, result_all) if __name__ == '__main__': main() ================================================ FILE: 02_Python/MSCRED/cnn_lstm/evaluation.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The shape of test data is (1200, 30, 30, 3)\n", "The shape of reconstructed data is (1200, 30, 30, 3)\n", "Max valid anom is 2.00\n", "Threshold is 3.00\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import os\n", "import utils as util\n", "import re\n", "\n", "# score initialization\n", "valid_anomaly_score = np.zeros((util.valid_end_id - util.valid_start_id, 1))\n", "test_anomaly_score = np.zeros((util.test_end_id - util.valid_end_id, 1))\n", "\n", "# load the data from file\n", "test_data_path = util.test_data_path\n", "reconstructed_data_path = util.reconstructed_data_path\n", "test_data_path = os.path.join(test_data_path, \"test.npy\")\n", "reconstructed_data_path = os.path.join(reconstructed_data_path, \"test_reconstructed.npy\")\n", "test_data = np.load(test_data_path)\n", "test_data = test_data[:, -1, ...] # only compare the last matrix with the reconstructed data\n", "reconstructed_data = np.load(reconstructed_data_path)\n", "print(\"The shape of test data is {}\".format(test_data.shape))\n", "print(\"The shape of reconstructed data is {}\".format(reconstructed_data.shape))\n", "\n", "valid_len = util.valid_end_id - util.valid_start_id\n", "\n", "# compute the threshold, threshold = alpha * max{s(t)} , s(t) is the anomaly scores over validation period.\n", "for i in range(util.valid_end_id - util.valid_start_id):\n", "\terror = np.square(np.subtract(test_data[i, ..., 0], reconstructed_data[i, ..., 0]))\n", "\tnum_anom = len(np.where(error > util.threhold))\n", "\tvalid_anomaly_score[i] = num_anom\n", "\n", "max_valid_anom = np.max(valid_anomaly_score)\n", "threshold = max_valid_anom * util.alpha\n", "\n", "print(\"Max valid anom is %.2f\" % max_valid_anom)\n", "print(\"Threshold is %.2f\" % threshold)\n", "\n", "# compute the anomaly score in the test data.\n", "for i in range(util.test_end_id - util.valid_end_id):\n", "\terror = np.square(np.subtract(test_data[i, ..., 0], reconstructed_data[i, ..., 0]))\n", "\tnum_anom = len(np.where(error > threshold))\n", "\ttest_anomaly_score[i - valid_len] = num_anom\n", "\n", "# plot anomaly score curve and identification result\n", "anomaly_pos = np.zeros(5)\n", "root_cause_gt = np.zeros((5, 3))\n", "anomaly_span = [10, 30, 90]\n", "\n", "# Read the test_anomaly.csv, each line behalf of an anomaly, the first is the position, the next three number is the\n", "# root cause.\n", "root_cause_f = open(\"../data/test_anomaly.csv\", \"r\")\n", "\n", "root_cause_gt = np.loadtxt(root_cause_f, delimiter=\",\", dtype=np.int32)\n", "anomaly_pos = root_cause_gt[:, 0]\n", "anomaly_pos = [(anomaly_pos[i]/util.gap_time-util.test_start_id-anomaly_span[i % 3]/util.gap_time) for i in range(5)]\n", "for i in range(5):\n", "\troot_cause_gt[i][0] = anomaly_pos[i]\n", "\n", "\n", "fig, axes = plt.subplots()\n", "test_num = util.test_end_id - util.test_start_id\n", "plt.xticks(fontsize = 25)\n", "plt.ylim((0, 100))\n", "plt.yticks(np.arange(0, 101, 20), fontsize = 25)\n", "plt.plot(test_anomaly_score, 'b', linewidth = 2)\n", "threshold = np.full((test_num), max_valid_anom * util.alpha)\n", "axes.plot(threshold, color = 'black', linestyle = '--',linewidth = 2)\n", "for k in range(len(anomaly_pos)):\n", "\taxes.axvspan(anomaly_pos[k], anomaly_pos[k] + anomaly_span[k%3]/util.gap_time, color='red', linewidth=2)\n", "\n", "labels = [' ', '0e3', '2e3', '4e3', '6e3', '8e3', '10e3']\n", "axes.set_xticklabels(labels, rotation = 25, fontsize = 20)\n", "plt.xlabel('Test Time', fontsize = 25)\n", "plt.ylabel('Anomaly Score', fontsize = 25)\n", "axes.spines['right'].set_visible(False)\n", "axes.spines['top'].set_visible(False)\n", "axes.yaxis.set_ticks_position('left')\n", "axes.xaxis.set_ticks_position('bottom')\n", "fig.subplots_adjust(bottom=0.25)\n", "fig.subplots_adjust(left=0.25)\n", "plt.title(\"MSCRED\", size = 25)\n", "plt.show()\n" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[[[ 7.04064071e-01, 3.74522775e-01, 4.47765976e-01],\n", " [-2.98897862e-01, -7.66673505e-01, 4.26859260e-01],\n", " [ 5.42617023e-01, 3.69995445e-01, -6.44724131e-01],\n", " ...,\n", " [-1.01098157e-01, 2.04227835e-01, -5.04897773e-01],\n", " [-3.84952039e-01, -3.95544618e-01, 5.00987656e-02],\n", " [-8.38977844e-02, -8.14120397e-02, -5.31205954e-03]],\n", "\n", " [[-2.64311314e-01, -2.52485245e-01, -3.25333983e-01],\n", " [ 4.30644780e-01, 3.51560205e-01, -2.94740409e-01],\n", " [-3.42947125e-01, -2.47012973e-01, 3.40349197e-01],\n", " ...,\n", " [-1.42371416e-01, 2.19778404e-01, -4.18861330e-01],\n", " [-3.53498220e-01, -4.27131832e-01, 1.35710686e-01],\n", " [-5.40348962e-02, -1.22621477e-01, 4.99183722e-02]],\n", "\n", " [[ 5.22105038e-01, 3.02384377e-01, 3.36110651e-01],\n", " [-2.89837956e-01, -6.70089483e-01, 3.94490510e-01],\n", " [ 5.53662360e-01, 2.92761773e-01, -5.11705399e-01],\n", " ...,\n", " [ 1.09688327e-01, -2.00070634e-01, 7.28469133e-01],\n", " [ 6.70080245e-01, 5.83485782e-01, -4.08666655e-02],\n", " [ 3.99453044e-02, 9.08637345e-02, 2.97329854e-04]],\n", "\n", " ...,\n", "\n", " [[-8.80392268e-02, -1.00941710e-01, -8.62924680e-02],\n", " [ 1.50133893e-01, 5.63429408e-02, -1.44342631e-01],\n", " [-1.02274962e-01, -1.17299981e-01, 1.09629296e-01],\n", " ...,\n", " [ 4.11492251e-02, -8.19874480e-02, 9.28616762e-01],\n", " [ 8.15970778e-01, 6.26959145e-01, 9.17455405e-02],\n", " [-1.12580411e-01, -9.61837843e-02, 1.77792534e-01]],\n", "\n", " [[-7.37436175e-01, -3.24902683e-01, -3.88478458e-01],\n", " [ 2.23024666e-01, 9.28885818e-01, -3.27060014e-01],\n", " [-5.19271135e-01, -3.01478446e-01, 6.87132418e-01],\n", " ...,\n", " [-1.10190757e-01, 1.62858039e-01, 3.14977206e-02],\n", " [ 1.10810861e-01, -5.14560975e-02, 2.63920635e-01],\n", " [-1.16073824e-01, -1.91061035e-01, 1.34103924e-01]],\n", "\n", " [[ 6.41601160e-03, -4.35149409e-02, -6.51849583e-02],\n", " [ 1.22927040e-01, -5.28241433e-02, -6.55850545e-02],\n", " [-8.67857132e-03, -8.20624754e-02, -3.15133445e-02],\n", " ...,\n", " [-1.82486519e-01, 1.31603345e-01, 1.33611903e-01],\n", " [ 2.04952165e-01, 1.11552589e-02, 1.28105909e-01],\n", " [-1.99556217e-01, -1.64938122e-01, 2.04542413e-01]]],\n", "\n", "\n", " [[[ 6.79917336e-01, 3.55985790e-01, 4.28662121e-01],\n", " [-2.83477157e-01, -7.54773140e-01, 4.19623792e-01],\n", " [ 5.27973533e-01, 3.61982346e-01, -6.18236363e-01],\n", " ...,\n", " [-8.83809477e-02, 1.91086918e-01, -4.80915755e-01],\n", " [-3.57060909e-01, -3.69313687e-01, 4.88834903e-02],\n", " [-8.70463327e-02, -7.39597306e-02, -1.31816452e-03]],\n", "\n", " [[-2.44989142e-01, -2.38429546e-01, -3.16050351e-01],\n", " [ 4.24357980e-01, 3.54713440e-01, -2.89681107e-01],\n", " [-3.22282493e-01, -2.24485964e-01, 3.35882634e-01],\n", " ...,\n", " [-1.34595096e-01, 2.10720986e-01, -4.09628510e-01],\n", " [-3.48464072e-01, -4.15548891e-01, 1.32037923e-01],\n", " [-4.62375097e-02, -1.18703760e-01, 3.54624651e-02]],\n", "\n", " [[ 5.02865314e-01, 2.85199761e-01, 3.22424948e-01],\n", " [-2.97595859e-01, -6.55339897e-01, 3.88778359e-01],\n", " [ 5.20777166e-01, 2.72323757e-01, -4.73876327e-01],\n", " ...,\n", " [ 9.89991277e-02, -1.82224751e-01, 7.15534508e-01],\n", " [ 6.50987029e-01, 5.61722100e-01, -2.38141473e-02],\n", " [ 3.26592848e-02, 8.09843168e-02, 1.06586050e-02]],\n", "\n", " ...,\n", "\n", " [[-7.64092207e-02, -8.32142308e-02, -7.65090808e-02],\n", " [ 1.42628595e-01, 3.80489193e-02, -1.45639628e-01],\n", " [-7.68235624e-02, -9.94603857e-02, 9.94035080e-02],\n", " ...,\n", " [ 3.20766978e-02, -3.54966559e-02, 9.33479607e-01],\n", " [ 8.21256816e-01, 6.11127853e-01, 1.14048757e-01],\n", " [-1.36615664e-01, -1.28301144e-01, 2.08944276e-01]],\n", "\n", " [[-7.35684097e-01, -3.12582195e-01, -3.77254516e-01],\n", " [ 2.21078888e-01, 9.28260028e-01, -2.96603888e-01],\n", " [-5.13130128e-01, -2.98380405e-01, 6.79174542e-01],\n", " ...,\n", " [-1.11217394e-01, 1.74280569e-01, 4.29298021e-02],\n", " [ 1.26864836e-01, -4.78857681e-02, 2.73473918e-01],\n", " [-1.24763295e-01, -1.92039981e-01, 1.41049162e-01]],\n", "\n", " [[ 1.32945245e-02, -3.87203358e-02, -6.21801876e-02],\n", " [ 1.21750608e-01, -7.69304484e-02, -6.02132604e-02],\n", " [-1.58674363e-03, -8.07843432e-02, -5.53307384e-02],\n", " ...,\n", " [-1.75814062e-01, 1.33520216e-01, 1.49803266e-01],\n", " [ 2.20021561e-01, 1.84681676e-02, 1.31551251e-01],\n", " [-2.04605982e-01, -1.67672649e-01, 2.10331142e-01]]],\n", "\n", "\n", " [[[ 6.52920544e-01, 3.35909814e-01, 4.09017503e-01],\n", " [-2.76899219e-01, -7.40868509e-01, 4.06494081e-01],\n", " [ 5.16137540e-01, 3.56847495e-01, -5.93396425e-01],\n", " ...,\n", " [-7.08877817e-02, 1.74005613e-01, -4.63341177e-01],\n", " [-3.26822639e-01, -3.38207126e-01, 4.29577343e-02],\n", " [-7.95312524e-02, -5.43444492e-02, -1.07008256e-02]],\n", "\n", " [[-2.24392816e-01, -2.20552221e-01, -2.93454707e-01],\n", " [ 4.12042409e-01, 3.54120970e-01, -2.68817008e-01],\n", " [-2.92297423e-01, -1.98751420e-01, 3.31134677e-01],\n", " ...,\n", " [-1.23868063e-01, 1.93920195e-01, -3.80687058e-01],\n", " [-3.35400194e-01, -3.89126062e-01, 1.20310627e-01],\n", " [-2.72770673e-02, -9.98448581e-02, 2.90213507e-02]],\n", "\n", " [[ 4.90766495e-01, 2.69954264e-01, 3.09346884e-01],\n", " [-3.00604820e-01, -6.45075738e-01, 3.70979786e-01],\n", " [ 4.93564457e-01, 2.60388762e-01, -4.44828093e-01],\n", " ...,\n", " [ 8.86952132e-02, -1.64795712e-01, 7.12646186e-01],\n", " [ 6.58571661e-01, 5.52982032e-01, 3.04084923e-03],\n", " [ 1.83560643e-02, 6.79676682e-02, 3.19759510e-02]],\n", "\n", " ...,\n", "\n", " [[-6.24664761e-02, -6.57579601e-02, -6.79971278e-02],\n", " [ 1.39382973e-01, 1.91848613e-02, -1.49713799e-01],\n", " [-3.93616557e-02, -7.71472603e-02, 9.43215862e-02],\n", " ...,\n", " [ 1.82397887e-02, 4.21114964e-03, 9.38782632e-01],\n", " [ 8.26476872e-01, 5.98676145e-01, 1.36195764e-01],\n", " [-1.59242004e-01, -1.58888862e-01, 2.33872399e-01]],\n", "\n", " [[-7.30418801e-01, -3.03994894e-01, -3.59382868e-01],\n", " [ 2.08334461e-01, 9.24598396e-01, -2.77217895e-01],\n", " [-5.08326411e-01, -2.95484096e-01, 6.56581044e-01],\n", " ...,\n", " [-1.08930230e-01, 1.84923634e-01, 5.60650229e-02],\n", " [ 1.41883463e-01, -3.83467562e-02, 2.73193657e-01],\n", " [-1.21756844e-01, -1.80763751e-01, 1.42212972e-01]],\n", "\n", " [[ 1.09339440e-02, -3.85531969e-02, -6.03271686e-02],\n", " [ 1.26041695e-01, -8.69184881e-02, -5.33027239e-02],\n", " [-1.33838924e-03, -8.33624080e-02, -6.58709183e-02],\n", " ...,\n", " [-1.72450170e-01, 1.36239484e-01, 1.61665335e-01],\n", " [ 2.30772883e-01, 2.10260451e-02, 1.33851498e-01],\n", " [-2.07984760e-01, -1.68746337e-01, 2.15266049e-01]]],\n", "\n", "\n", " ...,\n", "\n", "\n", " [[[ 3.28091562e-01, 2.31943071e-01, 3.14745069e-01],\n", " [-1.57922059e-01, -3.69662017e-01, 4.29991275e-01],\n", " [ 1.38514131e-01, 6.90799952e-02, 4.04169001e-02],\n", " ...,\n", " [-3.36202681e-02, 3.79698873e-01, 5.83139472e-02],\n", " [-1.52178168e-01, -2.67343760e-01, 1.01641491e-01],\n", " [ 8.24085176e-02, -7.91617557e-02, 1.62353024e-01]],\n", "\n", " [[-1.64384618e-01, 2.79992763e-02, -9.60212499e-02],\n", " [ 1.73426345e-01, -1.67210206e-01, 5.19643784e-01],\n", " [-4.87699091e-01, -3.44360441e-01, -3.71591836e-01],\n", " ...,\n", " [ 7.17706442e-01, 5.90285540e-01, -2.06201538e-01],\n", " [-7.54648209e-01, -5.48575699e-01, 1.69417053e-01],\n", " [ 4.39212680e-01, 3.24219108e-01, 2.90745378e-01]],\n", "\n", " [[ 1.15504839e-01, -3.59496236e-01, 2.11073101e-01],\n", " [-6.04588687e-01, -2.78948098e-02, -6.96893752e-01],\n", " [ 9.27109957e-01, 6.12412393e-01, 7.39015758e-01],\n", " ...,\n", " [-8.95947635e-01, -2.06889696e-02, 2.18627051e-01],\n", " [ 7.65301168e-01, 2.25973502e-01, -5.38723655e-02],\n", " [-4.61084932e-01, -2.26172164e-01, -2.31560826e-01]],\n", "\n", " ...,\n", "\n", " [[ 4.29580957e-02, 2.00401142e-01, -9.89372656e-03],\n", " [ 2.80811816e-01, -5.80144167e-01, 6.62714303e-01],\n", " [-8.62461567e-01, -8.50817740e-01, -6.59833968e-01],\n", " ...,\n", " [-3.38320106e-01, -4.47020203e-01, 3.65264952e-01],\n", " [ 5.08716524e-01, 1.64203539e-01, 2.79004216e-01],\n", " [-1.48775503e-01, 2.80653563e-04, -2.43095998e-02]],\n", "\n", " [[ 7.59837553e-02, -3.04642200e-01, 7.23583251e-02],\n", " [-3.56067806e-01, 1.97861642e-01, -6.84033215e-01],\n", " [ 6.93900704e-01, 5.06925106e-01, 6.18374407e-01],\n", " ...,\n", " [-4.82215174e-02, -7.39484131e-02, 2.66021729e-01],\n", " [-2.97970474e-01, -1.82971597e-01, 1.40596166e-01],\n", " [ 6.37628734e-02, -1.64584979e-01, -6.98368391e-03]],\n", "\n", " [[-1.52346035e-02, 7.06654638e-02, -1.95035860e-01],\n", " [ 3.47436965e-01, -3.62274557e-01, 4.49141830e-01],\n", " [-3.07297379e-01, -2.55061120e-01, -4.59841579e-01],\n", " ...,\n", " [ 5.57698607e-01, 4.91494775e-01, -6.12601228e-02],\n", " [-6.95904195e-01, -4.71823573e-01, 1.46396654e-02],\n", " [ 2.97390342e-01, 1.40025854e-01, 4.26453441e-01]]],\n", "\n", "\n", " [[[ 3.24486405e-01, 2.35852838e-01, 3.16618949e-01],\n", " [-1.47060588e-01, -3.71782124e-01, 4.39458400e-01],\n", " [ 1.24793984e-01, 6.01639412e-02, 4.02406976e-02],\n", " ...,\n", " [-4.24607433e-02, 3.75543803e-01, 5.36665022e-02],\n", " [-1.58329174e-01, -2.62590230e-01, 8.84788856e-02],\n", " [ 7.86422864e-02, -8.49000067e-02, 1.59324989e-01]],\n", "\n", " [[-1.56178862e-01, 3.88972163e-02, -8.18306804e-02],\n", " [ 1.84061542e-01, -1.79109320e-01, 5.51241696e-01],\n", " [-5.04722238e-01, -3.61917734e-01, -3.77561033e-01],\n", " ...,\n", " [ 7.31009662e-01, 6.15777791e-01, -2.33439296e-01],\n", " [-7.76671290e-01, -5.65945387e-01, 1.57402903e-01],\n", " [ 4.49532956e-01, 3.28452915e-01, 2.99394101e-01]],\n", "\n", " [[ 1.02626652e-01, -3.79289985e-01, 2.02140883e-01],\n", " [-6.18043244e-01, -2.82461736e-02, -7.26448536e-01],\n", " [ 9.41066682e-01, 6.22839689e-01, 7.20671415e-01],\n", " ...,\n", " [-8.86739612e-01, -2.51042284e-02, 2.30643317e-01],\n", " [ 7.48107672e-01, 2.05714211e-01, -3.81364413e-02],\n", " [-4.56352353e-01, -2.17234656e-01, -2.21152052e-01]],\n", "\n", " ...,\n", "\n", " [[ 4.88667563e-02, 2.08087280e-01, 2.22599614e-04],\n", " [ 2.77121454e-01, -5.75004578e-01, 6.66037500e-01],\n", " [-8.59576702e-01, -8.47260952e-01, -6.52055919e-01],\n", " ...,\n", " [-3.55650306e-01, -4.60160762e-01, 3.68615270e-01],\n", " [ 5.20491242e-01, 1.72276929e-01, 2.78160036e-01],\n", " [-1.54244632e-01, 1.75210810e-03, -3.07583250e-02]],\n", "\n", " [[ 6.62929937e-02, -3.24058682e-01, 6.67889863e-02],\n", " [-3.66179794e-01, 1.99684113e-01, -6.91476703e-01],\n", " [ 7.09880829e-01, 5.20802855e-01, 6.20879591e-01],\n", " ...,\n", " [-7.47452453e-02, -9.68089625e-02, 2.69781321e-01],\n", " [-2.67466784e-01, -1.57957792e-01, 1.42870709e-01],\n", " [ 5.39872609e-02, -1.61136732e-01, -6.13016216e-03]],\n", "\n", " [[-1.50470277e-02, 6.99529871e-02, -1.96954578e-01],\n", " [ 3.42375636e-01, -3.51661652e-01, 4.33758259e-01],\n", " [-2.95699447e-01, -2.37829417e-01, -4.44642812e-01],\n", " ...,\n", " [ 5.50044358e-01, 4.92978215e-01, -7.66981244e-02],\n", " [-6.90217018e-01, -4.70508039e-01, 5.79284364e-03],\n", " [ 2.85830498e-01, 1.34887442e-01, 4.29425836e-01]]],\n", "\n", "\n", " [[[ 3.22824657e-01, 2.41062775e-01, 3.19095403e-01],\n", " [-1.33742616e-01, -3.75967473e-01, 4.45875257e-01],\n", " [ 1.09649576e-01, 5.39407656e-02, 2.87951119e-02],\n", " ...,\n", " [-4.55035567e-02, 3.71275246e-01, 5.01804650e-02],\n", " [-1.81368187e-01, -2.69674420e-01, 8.57768580e-02],\n", " [ 7.66498372e-02, -8.69410187e-02, 1.54167458e-01]],\n", "\n", " [[-1.47284225e-01, 5.40608615e-02, -6.48469031e-02],\n", " [ 1.95705503e-01, -1.93635330e-01, 5.73859096e-01],\n", " [-5.27484119e-01, -3.80984455e-01, -3.97037566e-01],\n", " ...,\n", " [ 7.26183951e-01, 6.15301311e-01, -2.34625325e-01],\n", " [-7.81320512e-01, -5.73726118e-01, 1.32431850e-01],\n", " [ 4.48875099e-01, 3.27830642e-01, 2.97908694e-01]],\n", "\n", " [[ 9.61836874e-02, -3.76938581e-01, 1.92711875e-01],\n", " [-6.23054445e-01, -4.85291816e-02, -7.19452918e-01],\n", " [ 9.25066173e-01, 6.09999716e-01, 7.03961849e-01],\n", " ...,\n", " [-8.86654675e-01, -3.78013216e-02, 2.37394124e-01],\n", " [ 7.53812671e-01, 2.03501374e-01, -6.07147906e-03],\n", " [-4.62591290e-01, -2.21702829e-01, -2.10880756e-01]],\n", "\n", " ...,\n", "\n", " [[ 5.16885631e-02, 2.13301256e-01, 6.57005655e-03],\n", " [ 2.78806061e-01, -5.69760323e-01, 6.82743192e-01],\n", " [-8.65907311e-01, -8.49609911e-01, -6.51102364e-01],\n", " ...,\n", " [-3.74296576e-01, -4.66497570e-01, 3.73103946e-01],\n", " [ 5.29079616e-01, 1.75842151e-01, 2.83917338e-01],\n", " [-1.62859187e-01, 5.19873691e-04, -3.13235670e-02]],\n", "\n", " [[ 6.07125461e-02, -3.37973148e-01, 6.29941672e-02],\n", " [-3.81902844e-01, 1.94704801e-01, -7.04610884e-01],\n", " [ 7.16744184e-01, 5.26270092e-01, 6.13018990e-01],\n", " ...,\n", " [-1.20134160e-01, -1.33741260e-01, 2.75083065e-01],\n", " [-2.27044120e-01, -1.26904070e-01, 1.43584237e-01],\n", " [ 3.92883942e-02, -1.60847932e-01, -1.08369496e-02]],\n", "\n", " [[-8.11249111e-03, 7.45976344e-02, -1.99472487e-01],\n", " [ 3.41928095e-01, -3.49469543e-01, 4.36438680e-01],\n", " [-2.98026115e-01, -2.31392533e-01, -4.40462291e-01],\n", " ...,\n", " [ 5.49112678e-01, 4.93310511e-01, -9.49802548e-02],\n", " [-6.88755691e-01, -4.68035698e-01, -1.30833518e-02],\n", " [ 2.80838847e-01, 1.32115334e-01, 4.35462296e-01]]]],\n", " dtype=float32)" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "reconstructed_data" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "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.5.4" } }, "nbformat": 4, "nbformat_minor": 4 } ================================================ FILE: 02_Python/MSCRED/cnn_lstm/evalution.py ================================================ import numpy as np import matplotlib.pyplot as plt import os import cnn_lstm.utils as util import re # score initialization valid_anomaly_score = np.zeros((util.valid_end_id - util.valid_start_id, 1)) test_anomaly_score = np.zeros((util.test_end_id - util.valid_end_id, 1)) # load the data from file test_data_path = util.test_data_path reconstructed_data_path = util.reconstructed_data_path test_data_path = os.path.join(test_data_path, "test.npy") reconstructed_data_path = os.path.join(reconstructed_data_path, "test_reconstructed.npy") test_data = np.load(test_data_path) test_data = test_data[:, -1, ...] # only compare the last matrix with the reconstructed data reconstructed_data = np.load(reconstructed_data_path) print("The shape of test data is {}".format(test_data.shape)) print("The shape of reconstructed data is {}".format(reconstructed_data.shape)) valid_len = util.valid_end_id - util.valid_start_id # compute the threshold, threshold = alpha * max{s(t)} , s(t) is the anomaly scores over validation period. for i in range(util.valid_end_id - util.valid_start_id): error = np.square(np.subtract(test_data[i, ..., 0], reconstructed_data[i, ..., 0])) num_anom = len(np.where(error > util.threhold)) valid_anomaly_score[i] = num_anom max_valid_anom = np.max(valid_anomaly_score) threshold = max_valid_anom * util.alpha print("Max valid anom is %.2f" % max_valid_anom) print("Threshold is %.2f" % threshold) # compute the anomaly score in the test data. for i in range(util.test_end_id - util.valid_end_id): error = np.square(np.subtract(test_data[i, ..., 0], reconstructed_data[i, ..., 0])) num_anom = len(np.where(error > threshold)) test_anomaly_score[i - valid_len] = num_anom # plot anomaly score curve and identification result anomaly_pos = np.zeros(5) root_cause_gt = np.zeros((5, 3)) anomaly_span = [10, 30, 90] # Read the test_anomaly.csv, each line behalf of an anomaly, the first is the position, the next three number is the # root cause. root_cause_f = open("../data/test_anomaly.csv", "r") root_cause_gt = np.loadtxt(root_cause_f, delimiter=",", dtype=np.int32) anomaly_pos = root_cause_gt[:, 0] anomaly_pos = [(anomaly_pos[i]/util.gap_time-util.test_start_id-anomaly_span[i % 3]/util.gap_time) for i in range(5)] for i in range(5): root_cause_gt[i][0] = anomaly_pos[i] fig, axes = plt.subplots() test_num = util.test_end_id - util.test_start_id plt.xticks(fontsize = 25) plt.ylim((0, 100)) plt.yticks(np.arange(0, 101, 20), fontsize = 25) plt.plot(test_anomaly_score, 'b', linewidth = 2) threshold = np.full((test_num), max_valid_anom * util.alpha) axes.plot(threshold, color = 'black', linestyle = '--',linewidth = 2) for k in range(len(anomaly_pos)): axes.axvspan(anomaly_pos[k], anomaly_pos[k] + anomaly_span[k%3]/util.gap_time, color='red', linewidth=2) labels = [' ', '0e3', '2e3', '4e3', '6e3', '8e3', '10e3'] axes.set_xticklabels(labels, rotation = 25, fontsize = 20) plt.xlabel('Test Time', fontsize = 25) plt.ylabel('Anomaly Score', fontsize = 25) axes.spines['right'].set_visible(False) axes.spines['top'].set_visible(False) axes.yaxis.set_ticks_position('left') axes.xaxis.set_ticks_position('bottom') fig.subplots_adjust(bottom=0.25) fig.subplots_adjust(left=0.25) plt.title("MSCRED", size = 25) plt.show() ================================================ FILE: 02_Python/MSCRED/cnn_lstm/generation_signature_matrice.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "series_number is 30\n", "series_length is 20000\n", "signature_matrices_number is 2000\n", "the shape of signature_matrices is (3, 2000, 30, 30)\n", "train dataset shape is (790, 5, 30, 30, 3)\n", "test dataset shape is (1200, 5, 30, 30, 3)\n" ] } ], "source": [ "\"\"\"\n", "To represent the inter-correlations between different pairs of time series om a multivariate\n", "time series segment from t-w to t, we construct an n * n signature matrix M based upon the\n", "pairwise inner-product of two time series within the segment.\n", "\n", "Construct s (s = 3) signature matrices with different lengths(w = 10, 30, 60)\n", "\"\"\"\n", "\n", "import numpy as np\n", "import pandas as pd\n", "import utils as util\n", "import os\n", "\n", "\n", "class SignatureMatrices:\n", " def __init__(self):\n", "\n", " self.raw_data = pd.read_csv(util.raw_data_path, header=None)\n", " self.series_number = self.raw_data.shape[0]\n", " self.series_length = self.raw_data.shape[1]\n", " self.signature_matrices_number = int(self.series_length / util.gap_time)\n", "\n", " print(\"series_number is\", self.series_number)\n", " print(\"series_length is\", self.series_length)\n", " print(\"signature_matrices_number is\", self.signature_matrices_number)\n", "\n", " def signature_matrices_generation(self, win):\n", " \"\"\"\n", " Generation signature matrices according win_size and gap_time, the size of raw_data is n * T, n is the number of\n", " time series, T is the length of time series.\n", " To represent the inter-correlations between different pairs of time series in a multivariate time series segment\n", " from t − w to t, we construct an n × n signature matrix Mt based upon the pairwise inner-product of two time series\n", " within this segment.\n", " :param win: the length of the time series segment\n", " :return: the signature matrices\n", " \"\"\"\n", "\n", " if win == 0:\n", " print(\"The size of win cannot be 0\")\n", "\n", " raw_data = np.asarray(self.raw_data)\n", " signature_matrices = np.zeros((self.signature_matrices_number, self.series_number, self.series_number))\n", "\n", " for t in range(win, self.signature_matrices_number):\n", " raw_data_t = raw_data[:, t - win:t]\n", " signature_matrices[t] = np.dot(raw_data_t, raw_data_t.T) / win\n", "\n", " return signature_matrices\n", "\n", " def generate_train_test(self, signature_matrices):\n", " \"\"\"\n", " Generate train and test dataset, and store them to ../data/train/train.npy and ../data/test/test.npy\n", " :param signature_matrices:\n", " :return:\n", " \"\"\"\n", " train_dataset = []\n", " test_dataset = []\n", "\n", " for data_id in range(self.signature_matrices_number):\n", " index = data_id - util.step_max + 1\n", " if data_id < util.train_start_id:\n", " continue\n", " index_dataset = signature_matrices[:, index:index + util.step_max]\n", " if data_id < util.test_start_id:\n", " train_dataset.append(index_dataset)\n", " else:\n", " test_dataset.append(index_dataset)\n", "\n", " train_dataset = np.asarray(train_dataset)\n", " train_dataset = np.reshape(train_dataset, [-1, util.step_max, self.series_number, self.series_number,\n", " signature_matrices.shape[0]])\n", " test_dataset = np.asarray(test_dataset)\n", " test_dataset = np.reshape(test_dataset, [-1, util.step_max,self.series_number, self.series_number,\n", " signature_matrices.shape[0]])\n", "\n", " print(\"train dataset shape is\", train_dataset.shape)\n", " print(\"test dataset shape is\", test_dataset.shape)\n", "\n", " train_path = \"../data/train/\"\n", " if not os.path.exists(train_path):\n", " os.makedirs(train_path)\n", " train_path = train_path + \"train.npy\"\n", "\n", " test_path = \"../data/test/\"\n", " if not os.path.exists(test_path):\n", " os.makedirs(test_path)\n", " test_path = test_path + \"test.npy\"\n", "\n", " np.save(train_path, train_dataset)\n", " np.save(test_path, test_dataset)\n", "\n", "\n", "if __name__ == '__main__':\n", " Matrices = SignatureMatrices()\n", " signature_matrices = []\n", "\n", " # Generation signature matrices according the win size w\n", " for w in util.win_size:\n", " signature_matrices.append(Matrices.signature_matrices_generation(w))\n", "\n", " signature_matrices = np.asarray(signature_matrices)\n", " print(\"the shape of signature_matrices is\", signature_matrices.shape)\n", "\n", " # Generate train and test dataset\n", " Matrices.generate_train_test(signature_matrices)\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "hide_input": false, "kernelspec": { "display_name": "Python 3", "language": "python", "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.8.8" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": false }, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false } }, "nbformat": 4, "nbformat_minor": 4 } ================================================ FILE: 02_Python/MSCRED/cnn_lstm/generation_signature_matrice.py ================================================ """ To represent the inter-correlations between different pairs of time series om a multivariate time series segment from t-w to t, we construct an n * n signature matrix M based upon the pairwise inner-product of two time series within the segment. Construct s (s = 3) signature matrices with different lengths(w = 10, 30, 60) """ import numpy as np import pandas as pd import cnn_lstm.utils as util import os class SignatureMatrices: def __init__(self): self.raw_data = pd.read_csv(util.raw_data_path, header=None) self.series_number = self.raw_data.shape[0] self.series_length = self.raw_data.shape[1] self.signature_matrices_number = int(self.series_length / util.gap_time) print("series_number is", self.series_number) print("series_length is", self.series_length) print("signature_matrices_number is", self.signature_matrices_number) def signature_matrices_generation(self, win): """ Generation signature matrices according win_size and gap_time, the size of raw_data is n * T, n is the number of time series, T is the length of time series. To represent the inter-correlations between different pairs of time series in a multivariate time series segment from t − w to t, we construct an n × n signature matrix Mt based upon the pairwise inner-product of two time series within this segment. :param win: the length of the time series segment :return: the signature matrices """ if win == 0: print("The size of win cannot be 0") raw_data = np.asarray(self.raw_data) signature_matrices = np.zeros((self.signature_matrices_number, self.series_number, self.series_number)) for t in range(win, self.signature_matrices_number): raw_data_t = raw_data[:, t - win:t] signature_matrices[t] = np.dot(raw_data_t, raw_data_t.T) / win return signature_matrices def generate_train_test(self, signature_matrices): """ Generate train and test dataset, and store them to ../data/train/train.npy and ../data/test/test.npy :param signature_matrices: :return: """ train_dataset = [] test_dataset = [] for data_id in range(self.signature_matrices_number): index = data_id - util.step_max + 1 if data_id < util.train_start_id: continue index_dataset = signature_matrices[:, index:index + util.step_max] if data_id < util.test_start_id: train_dataset.append(index_dataset) else: test_dataset.append(index_dataset) train_dataset = np.asarray(train_dataset) train_dataset = np.reshape(train_dataset, [-1, util.step_max, self.series_number, self.series_number, signature_matrices.shape[0]]) test_dataset = np.asarray(test_dataset) test_dataset = np.reshape(test_dataset, [-1, util.step_max,self.series_number, self.series_number, signature_matrices.shape[0]]) print("train dataset shape is", train_dataset.shape) print("test dataset shape is", test_dataset.shape) train_path = "../data/train/" if not os.path.exists(train_path): os.makedirs(train_path) train_path = train_path + "train.npy" test_path = "../data/test/" if not os.path.exists(test_path): os.makedirs(test_path) test_path = test_path + "test.npy" np.save(train_path, train_dataset) np.save(test_path, test_dataset) if __name__ == '__main__': Matrices = SignatureMatrices() signature_matrices = [] # Generation signature matrices according the win size w for w in util.win_size: signature_matrices.append(Matrices.signature_matrices_generation(w)) signature_matrices = np.asarray(signature_matrices) print("the shape of signature_matrices is", signature_matrices.shape) # Generate train and test dataset Matrices.generate_train_test(signature_matrices) ================================================ FILE: 02_Python/MSCRED/cnn_lstm/report.txt ================================================ TensorFlow 2.0 Upgrade Script ----------------------------- Converted 1 files Detected 3 issues that require attention -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- File: convlstm.py -------------------------------------------------------------------------------- convlstm.py:73:21: WARNING: Using member tf.contrib.rnn.ConvLSTMCell in deprecated module tf.contrib.rnn. (Manual edit required) tf.contrib.rnn.* has been deprecated, and widely used cells/functions will be moved to tensorflow/addons repository. Please check it there and file Github issues if necessary. convlstm.py:73:21: ERROR: Using member tf.contrib.rnn.ConvLSTMCell in deprecated module tf.contrib. tf.contrib.rnn.ConvLSTMCell cannot be converted automatically. tf.contrib will not be distributed with TensorFlow 2.0, please consider an alternative in non-contrib TensorFlow, a community-maintained repository such as tensorflow/addons, or fork the required code. convlstm.py:198:4: WARNING: *.save requires manual check. (This warning is only applicable if the code saves a tf.Keras model) Keras model.save now saves to the Tensorflow SavedModel format by default, instead of HDF5. To continue saving to HDF5, add the argument save_format='h5' to the save() function. ================================================================================ Detailed log follows: ================================================================================ -------------------------------------------------------------------------------- Processing file 'convlstm.py' outputting to 'convlstm-update.py' -------------------------------------------------------------------------------- 17:13: INFO: Renamed keyword argument for tf.nn.conv2d from filter to filters 33:72: INFO: Changing tf.contrib.layers xavier initializer to a tf.compat.v1.keras.initializers.VarianceScaling and converting arguments. 73:21: WARNING: Using member tf.contrib.rnn.ConvLSTMCell in deprecated module tf.contrib.rnn. (Manual edit required) tf.contrib.rnn.* has been deprecated, and widely used cells/functions will be moved to tensorflow/addons repository. Please check it there and file Github issues if necessary. 73:21: ERROR: Using member tf.contrib.rnn.ConvLSTMCell in deprecated module tf.contrib. tf.contrib.rnn.ConvLSTMCell cannot be converted automatically. tf.contrib will not be distributed with TensorFlow 2.0, please consider an alternative in non-contrib TensorFlow, a community-maintained repository such as tensorflow/addons, or fork the required code. 84:21: INFO: Renamed 'tf.nn.dynamic_rnn' to 'tf.compat.v1.nn.dynamic_rnn' 89:27: INFO: Added keywords to args of function 'tf.reduce_sum' 109:13: INFO: Renamed keyword argument for tf.nn.conv2d_transpose from value to input 109:13: INFO: Renamed keyword argument for tf.nn.conv2d_transpose from filter to filters 143:11: INFO: Renamed 'tf.Session' to 'tf.compat.v1.Session' 164:11: INFO: Added keywords to args of function 'tf.reduce_mean' 168:11: INFO: Renamed 'tf.global_variables_initializer' to 'tf.compat.v1.global_variables_initializer' 198:4: WARNING: *.save requires manual check. (This warning is only applicable if the code saves a tf.Keras model) Keras model.save now saves to the Tensorflow SavedModel format by default, instead of HDF5. To continue saving to HDF5, add the argument save_format='h5' to the save() function. -------------------------------------------------------------------------------- ================================================ FILE: 02_Python/MSCRED/cnn_lstm/utils.py ================================================ # Parameter initialization gap_time = 10 # gap time between each segment win_size = [10, 30, 60] # window size of each segment step_max = 5 # maximum step of ConvLSTM raw_data_path = '../data/synthetic_data_with_anomaly-s-1.csv' # path to load raw data model_path = '../MSCRED/' train_data_path = "../data/train/" test_data_path = "../data/test/" reconstructed_data_path = "../data/reconstructed/" train_start_id = 10 train_end_id = 800 test_start_id = 800 test_end_id = 2000 valid_start_id = 800 valid_end_id = 1000 training_iters = 5 save_model_step = 1 learning_rate = 0.0002 threhold = 0.005 alpha = 1.5 ================================================ FILE: 02_Python/MSCRED/data/synthetic_data_with_anomaly-s-1.csv ================================================ [File too large to display: 14.6 MB] ================================================ FILE: 02_Python/Mean_Shift.py ================================================ #================================================================================================================ #---------------------------------------------------------------------------------------------------------------- # MEAN SHIFT #---------------------------------------------------------------------------------------------------------------- #================================================================================================================ import math import numpy as np import matplotlib.pyplot as plt from matplotlib import style import pandas import datetime from sklearn import preprocessing, cross_validation #for plotting plt.style.use('ggplot') class CustomMS: def __init__(self): pass def main(): ''' Pclass Passenger Class (1 = 1st; 2 = 2nd; 3 = 3rd) survival Survival (0 = No; 1 = Yes) name Name sex Sex age Age sibsp Number of Siblings/Spouses Aboard parch Number of Parents/Children Aboard ticket Ticket Number fare Passenger Fare (British pound) cabin Cabin embarked Port of Embarkation (C = Cherbourg; Q = Queenstown; S = Southampton) boat Lifeboat body Body Identification Number home.dest Home/Destination ''' df = pd.read_excel('data/titanic.xls') original_df = pd.DataFrame.copy(df) df.drop(['body','name'], 1, inplace=True) df.fillna(0,inplace=True) def handle_non_numerical_data(df): # handling non-numerical data: must convert. columns = df.columns.values for column in columns: text_digit_vals = {} def convert_to_int(val): return text_digit_vals[val] #print(column,df[column].dtype) if df[column].dtype != np.int64 and df[column].dtype != np.float64: column_contents = df[column].values.tolist() #finding just the uniques unique_elements = set(column_contents) # great, found them. x = 0 for unique in unique_elements: if unique not in text_digit_vals: # creating dict that contains new # id per unique string text_digit_vals[unique] = x x+=1 # now we map the new "id" vlaue # to replace the string. df[column] = list(map(convert_to_int,df[column])) return df df = handle_non_numerical_data(df) df.drop(['ticket','home.dest'], 1, inplace=True) X = np.array(df.drop(['survived'], 1).astype(float)) X = preprocessing.scale(X) y = np.array(df['survived']) ms = CustomMS() ms.fit(dataset = dataset) if __name__ == "__main__": main() ================================================ FILE: 02_Python/Naive_Bayes.py ================================================ #================================================================================================================ #---------------------------------------------------------------------------------------------------------------- # NAIVE BAYES #---------------------------------------------------------------------------------------------------------------- #================================================================================================================ #Using Naive Bayes to classify emails as spam and non-spam import math import numpy as np import matplotlib.pyplot as plt from matplotlib import style import pandas as pd import nltk import re #for plotting plt.style.use('ggplot') class CustomNB: def __init__(self): pass def create_freq_table(self, texts, labels=None): #create the dataframe ft = pd.DataFrame([]) #iterate through them emails for index, trm in enumerate(texts): vocabulary = trm #all the words of the email #amount of times each word occurs in the dictionary freq_dict = pd.Series({ v : trm.count(v) for v in vocabulary}) if labels!=None: freq_dict['CLASS'] = labels[index] ft = ft.append(freq_dict, ignore_index=True) ft = ft.fillna(0) return ft def train(self, freq): fq = freq.iloc[:,1:] labels = fq.iloc[:, 0].values vocabulary = list(fq.columns.values) s, ns = pd.DataFrame([]), pd.DataFrame([]) for index, rw in fq.iterrows(): if labels[index] == 1: s = s.append(rw) else: ns = ns.append(rw) swc = sum([word for word in s.sum()]) nswc = sum([word for word in ns.sum()]) #Create the dicts for storing the model non_spam_model, spam_model = {}, {} alpha = 0.5 for word in vocabulary: spam_occurances = s[word].sum() non_spam_occurances = ns[word].sum() #Now, the crux of the algo, the bayesian probablity bayesian_probablity_for_spam = ( spam_occurances + alpha ) / ( swc ) bayesian_probablity_for_non_spam = ( non_spam_occurances + alpha ) / ( nswc ) #Update the model non_spam_model[word], spam_model[word] = bayesian_probablity_for_spam , bayesian_probablity_for_non_spam return spam_model, non_spam_model def predict(self, text, spam_model,non_spam_model): text = [x for x in text.replace('\n', ' ')] text = [''.join(text).split()] f_table = self.create_freq_table(text) vocabulary = f_table.columns.values spam_prob = 0 non_spam_prob = 0 for word in vocabulary: if word in spam_model: spam_prob += spam_model[word] if word in non_spam_model: non_spam_prob += non_spam_model[word] print(spam_prob, non_spam_prob) return (spam_prob / non_spam_prob) def main(): # 0 means spam, 1 means not spam emails = {"0": ["Dear friend, win 1000$ cash right now!!.", " Webcams Day & Night - All LIVE - Webcams Contest", "Congratulations, you've won a free car!"], "1": ["Hey, Can you redo the presentation and send it on by Friday?", "Thank you for the documents, I will revert as soon as possible", "Open the Pod bay doors, HAL." , " I'm sorry, Dave. I'm afraid I can't do that."]} t= [] labl = [] for k in emails: for mail in emails[k]: tokens = [word.lower() for sent in nltk.sent_tokenize(mail) for word in nltk.word_tokenize(sent)] filtered_tokens = [] # filter out any tokens not containing letters (e.g., numeric tokens, raw punctuation) for token in tokens: if re.search('[a-zA-Z]', token): filtered_tokens.append(token) t.append(' '.join(filtered_tokens)) labl.append(k) for i in range(len(t)): t[i] = t[i].split() nb = CustomNB() freq_table = nb.create_freq_table(t, labl) sp, nsp = nb.train(freq_table) #ip = "Hey, Can you redo the presentation and send it on by Friday?" #ip = "Webcams Day & Night - All LIVE - Webcams Contest" ip = "Open the Pod bay doors, HAL." #ip = "I'm sorry, Dave. I'm afraid I can't do that." propr_ip = [] for ch in nltk.word_tokenize(ip): if re.search('[a-zA-Z]', ch): propr_ip.append(ch.lower()) propr_ip = ' '.join(propr_ip) x = nb.predict(propr_ip, sp, nsp) print(x) if x < 0.5: print("spam") else: print("not spam") if __name__ == "__main__": main() ================================================ FILE: 02_Python/README.md ================================================

Last Commit

# Clustering Algorithms with Python Implementing machine learning algorithms from scratch. ## Algorithms implemented so far: 1. Simple Linear Regression. Dataset: Stock data from Quandl 2. Logistic Regression. Dataset: Stanford ML course dataset 3. Naive Bayes Classifier. Dataset: Email spam/non-span 4. Decision Trees 5. K Nearest Neighbours. K Nearest Neighbours in Parallel. Dataset: Chronic Kidney disease data from UCI 6. A-Star Algorithm 7. K Means Clustering. K Means Clustering in Parallel. Dataset: IPL player stats norm data 8. Support Vector Machine ================================================ FILE: 02_Python/Random_Forest_Classifier.py ================================================ import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier RSEED = 50 # Load in data df = pd.read_csv('https://s3.amazonaws.com/projects-rf/clean_data.csv') # Full dataset: https://www.kaggle.com/cdc/behavioral-risk-factor-surveillance-system # Extract the labels labels = np.array(df.pop('label')) # 30% examples in test data train, test, train_labels, test_labels = train_test_split(df, labels, stratify = labels, test_size = 0.3, random_state = RSEED) # Imputation of missing values train = train.fillna(train.mean()) test = test.fillna(test.mean()) # Features for feature importances features = list(train.columns) # Create the model with 100 trees model = RandomForestClassifier(n_estimators=100, random_state=RSEED, max_features = 'sqrt', n_jobs=-1, verbose = 1) # Fit on training data model.fit(train, train_labels) n_nodes = [] max_depths = [] # Stats about the trees in random forest for ind_tree in model.estimators_: n_nodes.append(ind_tree.tree_.node_count) max_depths.append(ind_tree.tree_.max_depth) print(f'Average number of nodes {int(np.mean(n_nodes))}') print(f'Average maximum depth {int(np.mean(max_depths))}') # Training predictions (to demonstrate overfitting) train_rf_predictions = model.predict(train) train_rf_probs = model.predict_proba(train)[:, 1] # Testing predictions (to determine performance) rf_predictions = model.predict(test) rf_probs = model.predict_proba(test)[:, 1] from sklearn.metrics import precision_score, recall_score, roc_auc_score, roc_curve import matplotlib.pyplot as plt # Plot formatting plt.style.use('fivethirtyeight') plt.rcParams['font.size'] = 18 def evaluate_model(predictions, probs, train_predictions, train_probs): """Compare machine learning model to baseline performance. Computes statistics and shows ROC curve.""" baseline = {} baseline['recall'] = recall_score(test_labels, [1 for _ in range(len(test_labels))]) baseline['precision'] = precision_score(test_labels, [1 for _ in range(len(test_labels))]) baseline['roc'] = 0.5 results = {} results['recall'] = recall_score(test_labels, predictions) results['precision'] = precision_score(test_labels, predictions) results['roc'] = roc_auc_score(test_labels, probs) train_results = {} train_results['recall'] = recall_score(train_labels, train_predictions) train_results['precision'] = precision_score(train_labels, train_predictions) train_results['roc'] = roc_auc_score(train_labels, train_probs) for metric in ['recall', 'precision', 'roc']: print(f'{metric.capitalize()} Baseline: {round(baseline[metric], 2)} Test: {round(results[metric], 2)} Train: {round(train_results[metric], 2)}') # Calculate false positive rates and true positive rates base_fpr, base_tpr, _ = roc_curve(test_labels, [1 for _ in range(len(test_labels))]) model_fpr, model_tpr, _ = roc_curve(test_labels, probs) plt.figure(figsize = (8, 6)) plt.rcParams['font.size'] = 16 # Plot both curves plt.plot(base_fpr, base_tpr, 'b', label = 'baseline') plt.plot(model_fpr, model_tpr, 'r', label = 'model') plt.legend(); plt.xlabel('False Positive Rate'); plt.ylabel('True Positive Rate'); plt.title('ROC Curves'); plt.show(); evaluate_model(rf_predictions, rf_probs, train_rf_predictions, train_rf_probs) plt.savefig('roc_auc_curve.png') from sklearn.metrics import confusion_matrix import itertools def plot_confusion_matrix(cm, classes, normalize=False, title='Confusion matrix', cmap=plt.cm.Oranges): """ This function prints and plots the confusion matrix. Normalization can be applied by setting `normalize=True`. Source: http://scikit-learn.org/stable/auto_examples/model_selection/plot_confusion_matrix.html """ if normalize: cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis] print("Normalized confusion matrix") else: print('Confusion matrix, without normalization') print(cm) # Plot the confusion matrix plt.figure(figsize = (10, 10)) plt.imshow(cm, interpolation='nearest', cmap=cmap) plt.title(title, size = 24) plt.colorbar(aspect=4) tick_marks = np.arange(len(classes)) plt.xticks(tick_marks, classes, rotation=45, size = 14) plt.yticks(tick_marks, classes, size = 14) fmt = '.2f' if normalize else 'd' thresh = cm.max() / 2. # Labeling the plot for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])): plt.text(j, i, format(cm[i, j], fmt), fontsize = 20, horizontalalignment="center", color="white" if cm[i, j] > thresh else "black") plt.grid(None) plt.tight_layout() plt.ylabel('True label', size = 18) plt.xlabel('Predicted label', size = 18) # Confusion matrix cm = confusion_matrix(test_labels, rf_predictions) plot_confusion_matrix(cm, classes = ['Poor Health', 'Good Health'], title = 'Health Confusion Matrix') plt.savefig('cm.png') ================================================ FILE: 02_Python/Support_Vector_Machine.py ================================================ #================================================================================================================ #---------------------------------------------------------------------------------------------------------------- # SUPPORT VECTOR MACHINE #---------------------------------------------------------------------------------------------------------------- #================================================================================================================ import math import numpy as np import matplotlib.pyplot as plt from matplotlib import style import pandas as pd import datetime import random #for plotting plt.style.use('ggplot') class CustomSVM: def __init__(self): pass #Use the data and find a 'model' ie the values for W and b. Maximize b and minimize b def fit(self, dataset): self.dataset = dataset # Magnitude of W is the key, list of W and b is the value options = {} all_feature_values = [] for yi, attrs in self.dataset.items(): for attr in attrs: for f in attr: all_feature_values.append(f) self.max_attr = max(all_feature_values) self.min_attr = min(all_feature_values) del all_feature_values step_size = [self.max_attr * 0.1,self.max_attr * 0.01,self.max_attr * 0.005] latest_optimum = 10 * self.max_attr b_range = 5 b_multiple = 5 trans = [[1, 1, 1, 1], [1, 1, 1, -1], [1, 1,-1, 1], [1, 1,-1,-1], [1 ,-1, 1, 1], [1 ,-1, -1, 1], [1 ,-1, 1, -1], [1 ,-1, -1, -1], [-1, 1, 1, 1], [-1, 1, 1, -1], [-1, 1, -1, 1], [-1, 1, -1, -1], [-1,-1, 1, 1], [-1,-1, 1, -1], [-1,-1, -1, 1], [-1,-1, -1, -1]] for step in step_size: W = np.array([latest_optimum,latest_optimum, latest_optimum, latest_optimum]) optimization_flag = False while not optimization_flag: for b in np.arange(-1*(self.max_attr* b_range ), self.max_attr * b_range, step * b_multiple): for transformation in trans: W_t = W * transformation found = True for yi, attributes in self.dataset.items(): for xi in attributes: if not (yi * (np.dot(xi, W_t) +b )) >= 1: found = False break if found: options[np.linalg.norm(W_t)] = [W_t, b] if W[0]<0: optimization_flag = True else: W = np.array(list(map(lambda w: w-step, W))) norms = min([n for n in options]) self.W = options[norms][0] self.b = options[norms][1] latest_optimum = options[norms][0][0] + step*2 def predict(self, attrs): #sign of the X(i).W + b defines the class dot_product = np.dot(np.array(attrs), self.W) classification = np.sign(dot_product + self.b) return classification def test(self, test_set): self.accurate_predictions, self.total_predictions = 0, 0 for group in test_set: for data in test_set[group]: predicted_class = self.predict(data) if predicted_class == group: self.accurate_predictions += 1 self.total_predictions += 1 self.accuracy = 100*(self.accurate_predictions/self.total_predictions) print("\nAcurracy :", str(self.accuracy) + "%") def main(): df = pd.read_csv(r"./data/iris.csv") #Reading from the data file df.replace('Iris-setosa', -1, inplace = True) df.replace('Iris-versicolor', 1, inplace = True) dataset = df.astype(float).values.tolist() #Shuffle the dataset random.shuffle(dataset) #20% of the available data will be used for testing test_size = 0.20 #The keys of the dict are the classes that the data is classfied into training_set = {-1: [], 1:[]} test_set = {-1: [], 1:[]} training_data = dataset[:-int(test_size * len(dataset))] test_data = dataset[-int(test_size * len(dataset)):] for record in training_data: #Append the list in the dict will all the elements of the record except the class training_set[record[-1]].append(record[:-1]) #Insert data into the test set for record in test_data: # Append the list in the dict will all the elements of the record except the class test_set[record[-1]].append(record[:-1]) dataset = { -1 : np.array([[2,3],[4,5],[2,1]]), 1: np.array([[5,6], [8,8], [9,9]]) } svm = CustomSVM() svm.fit(dataset = training_set) svm.test(test_set) if __name__ == "__main__": main() ================================================ FILE: 02_Python/data/chronic_kidney_disease.csv ================================================ age,bp,sg,al,su,rbc,pc,pcc,ba,bgr,bu,sc,sod,pot,hemo,pcv,wbcc,rbcc,htn,dm,cad,appet,pe,ane,class 48,80,1.020,1,0,?,normal,notpresent,notpresent,121,36,1.2,?,?,15.4,44,7800,5.2,yes,yes,no,good,no,no,ckd 7,50,1.020,4,0,?,normal,notpresent,notpresent,?,18,0.8,?,?,11.3,38,6000,?,no,no,no,good,no,no,ckd 62,80,1.010,2,3,normal,normal,notpresent,notpresent,423,53,1.8,?,?,9.6,31,7500,?,no,yes,no,poor,no,yes,ckd 48,70,1.005,4,0,normal,abnormal,present,notpresent,117,56,3.8,111,2.5,11.2,32,6700,3.9,yes,no,no,poor,yes,yes,ckd 51,80,1.010,2,0,normal,normal,notpresent,notpresent,106,26,1.4,?,?,11.6,35,7300,4.6,no,no,no,good,no,no,ckd 60,90,1.015,3,0,?,?,notpresent,notpresent,74,25,1.1,142,3.2,12.2,39,7800,4.4,yes,yes,no,good,yes,no,ckd 68,70,1.010,0,0,?,normal,notpresent,notpresent,100,54,24.0,104,4.0,12.4,36,?,?,no,no,no,good,no,no,ckd 24,?,1.015,2,4,normal,abnormal,notpresent,notpresent,410,31,1.1,?,?,12.4,44,6900,5,no,yes,no,good,yes,no,ckd 52,100,1.015,3,0,normal,abnormal,present,notpresent,138,60,1.9,?,?,10.8,33,9600,4.0,yes,yes,no,good,no,yes,ckd 53,90,1.020,2,0,abnormal,abnormal,present,notpresent,70,107,7.2,114,3.7,9.5,29,12100,3.7,yes,yes,no,poor,no,yes,ckd 50,60,1.010,2,4,?,abnormal,present,notpresent,490,55,4.0,?,?,9.4,28,?,?,yes,yes,no,good,no,yes,ckd 63,70,1.010,3,0,abnormal,abnormal,present,notpresent,380,60,2.7,131,4.2,10.8,32,4500,3.8,yes,yes,no,poor,yes,no,ckd 68,70,1.015,3,1,?,normal,present,notpresent,208,72,2.1,138,5.8,9.7,28,12200,3.4,yes,yes,yes,poor,yes,no,ckd 68,70,?,?,?,?,?,notpresent,notpresent,98,86,4.6,135,3.4,9.8,?,?,?,yes,yes,yes,poor,yes,no,ckd 68,80,1.010,3,2,normal,abnormal,present,present,157,90,4.1,130,6.4,5.6,16,11000,2.6,yes,yes,yes,poor,yes,no,ckd 40,80,1.015,3,0,?,normal,notpresent,notpresent,76,162,9.6,141,4.9,7.6,24,3800,2.8,yes,no,no,good,no,yes,ckd 47,70,1.015,2,0,?,normal,notpresent,notpresent,99,46,2.2,138,4.1,12.6,?,?,?,no,no,no,good,no,no,ckd 47,80,?,?,?,?,?,notpresent,notpresent,114,87,5.2,139,3.7,12.1,?,?,?,yes,no,no,poor,no,no,ckd 60,100,1.025,0,3,?,normal,notpresent,notpresent,263,27,1.3,135,4.3,12.7,37,11400,4.3,yes,yes,yes,good,no,no,ckd 62,60,1.015,1,0,?,abnormal,present,notpresent,100,31,1.6,?,?,10.3,30,5300,3.7,yes,no,yes,good,no,no,ckd 61,80,1.015,2,0,abnormal,abnormal,notpresent,notpresent,173,148,3.9,135,5.2,7.7,24,9200,3.2,yes,yes,yes,poor,yes,yes,ckd 60,90,?,?,?,?,?,notpresent,notpresent,?,180,76,4.5,?,10.9,32,6200,3.6,yes,yes,yes,good,no,no,ckd 48,80,1.025,4,0,normal,abnormal,notpresent,notpresent,95,163,7.7,136,3.8,9.8,32,6900,3.4,yes,no,no,good,no,yes,ckd 21,70,1.010,0,0,?,normal,notpresent,notpresent,?,?,?,?,?,?,?,?,?,no,no,no,poor,no,yes,ckd 42,100,1.015,4,0,normal,abnormal,notpresent,present,?,50,1.4,129,4.0,11.1,39,8300,4.6,yes,no,no,poor,no,no,ckd 61,60,1.025,0,0,?,normal,notpresent,notpresent,108,75,1.9,141,5.2,9.9,29,8400,3.7,yes,yes,no,good,no,yes,ckd 75,80,1.015,0,0,?,normal,notpresent,notpresent,156,45,2.4,140,3.4,11.6,35,10300,4,yes,yes,no,poor,no,no,ckd 69,70,1.010,3,4,normal,abnormal,notpresent,notpresent,264,87,2.7,130,4.0,12.5,37,9600,4.1,yes,yes,yes,good,yes,no,ckd 75,70,?,1,3,?,?,notpresent,notpresent,123,31,1.4,?,?,?,?,?,?,no,yes,no,good,no,no,ckd 68,70,1.005,1,0,abnormal,abnormal,present,notpresent,?,28,1.4,?,?,12.9,38,?,?,no,no,yes,good,no,no,ckd ?,70,?,?,?,?,?,notpresent,notpresent,93,155,7.3,132,4.9,?,?,?,?,yes,yes,no,good,no,no,ckd 73,90,1.015,3,0,?,abnormal,present,notpresent,107,33,1.5,141,4.6,10.1,30,7800,4,no,no,no,poor,no,no,ckd 61,90,1.010,1,1,?,normal,notpresent,notpresent,159,39,1.5,133,4.9,11.3,34,9600,4.0,yes,yes,no,poor,no,no,ckd 60,100,1.020,2,0,abnormal,abnormal,notpresent,notpresent,140,55,2.5,?,?,10.1,29,?,?,yes,no,no,poor,no,no,ckd 70,70,1.010,1,0,normal,?,present,present,171,153,5.2,?,?,?,?,?,?,no,yes,no,poor,no,no,ckd 65,90,1.020,2,1,abnormal,normal,notpresent,notpresent,270,39,2.0,?,?,12.0,36,9800,4.9,yes,yes,no,poor,no,yes,ckd 76,70,1.015,1,0,normal,normal,notpresent,notpresent,92,29,1.8,133,3.9,10.3,32,?,?,yes,no,no,good,no,no,ckd 72,80,?,?,?,?,?,notpresent,notpresent,137,65,3.4,141,4.7,9.7,28,6900,2.5,yes,yes,no,poor,no,yes,ckd 69,80,1.020,3,0,abnormal,normal,notpresent,notpresent,?,103,4.1,132,5.9,12.5,?,?,?,yes,no,no,good,no,no,ckd 82,80,1.010,2,2,normal,?,notpresent,notpresent,140,70,3.4,136,4.2,13.0,40,9800,4.2,yes,yes,no,good,no,no,ckd 46,90,1.010,2,0,normal,abnormal,notpresent,notpresent,99,80,2.1,?,?,11.1,32,9100,4.1,yes,no,no,good,no,no,ckd 45,70,1.010,0,0,?,normal,notpresent,notpresent,?,20,0.7,?,?,?,?,?,?,no,no,no,good,yes,no,ckd 47,100,1.010,0,0,?,normal,notpresent,notpresent,204,29,1.0,139,4.2,9.7,33,9200,4.5,yes,no,no,good,no,yes,ckd 35,80,1.010,1,0,abnormal,?,notpresent,notpresent,79,202,10.8,134,3.4,7.9,24,7900,3.1,no,yes,no,good,no,no,ckd 54,80,1.010,3,0,abnormal,abnormal,notpresent,notpresent,207,77,6.3,134,4.8,9.7,28,?,?,yes,yes,no,poor,yes,no,ckd 54,80,1.020,3,0,?,abnormal,notpresent,notpresent,208,89,5.9,130,4.9,9.3,?,?,?,yes,yes,no,poor,yes,no,ckd 48,70,1.015,0,0,?,normal,notpresent,notpresent,124,24,1.2,142,4.2,12.4,37,6400,4.7,no,yes,no,good,no,no,ckd 11,80,1.010,3,0,?,normal,notpresent,notpresent,?,17,0.8,?,?,15.0,45,8600,?,no,no,no,good,no,no,ckd 73,70,1.005,0,0,normal,normal,notpresent,notpresent,70,32,0.9,125,4.0,10.0,29,18900,3.5,yes,yes,no,good,yes,no,ckd 60,70,1.010,2,0,normal,abnormal,present,notpresent,144,72,3.0,?,?,9.7,29,21600,3.5,yes,yes,no,poor,no,yes,ckd 53,60,?,?,?,?,?,notpresent,notpresent,91,114,3.25,142,4.3,8.6,28,11000,3.8,yes,yes,no,poor,yes,yes,ckd 54,100,1.015,3,0,?,normal,present,notpresent,162,66,1.6,136,4.4,10.3,33,?,?,yes,yes,no,poor,yes,no,ckd 53,90,1.015,0,0,?,normal,notpresent,notpresent,?,38,2.2,?,?,10.9,34,4300,3.7,no,no,no,poor,no,yes,ckd 62,80,1.015,0,5,?,?,notpresent,notpresent,246,24,1.0,?,?,13.6,40,8500,4.7,yes,yes,no,good,no,no,ckd 63,80,1.010,2,2,normal,?,notpresent,notpresent,?,?,3.4,136,4.2,13.0,40,9800,4.2,yes,no,yes,good,no,no,ckd 35,80,1.005,3,0,abnormal,normal,notpresent,notpresent,?,?,?,?,?,9.5,28,?,?,no,no,no,good,yes,no,ckd 76,70,1.015,3,4,normal,abnormal,present,notpresent,?,164,9.7,131,4.4,10.2,30,11300,3.4,yes,yes,yes,poor,yes,no,ckd 76,90,?,?,?,?,normal,notpresent,notpresent,93,155,7.3,132,4.9,?,?,?,?,yes,yes,yes,poor,no,no,ckd 73,80,1.020,2,0,abnormal,abnormal,notpresent,notpresent,253,142,4.6,138,5.8,10.5,33,7200,4.3,yes,yes,yes,good,no,no,ckd 59,100,?,?,?,?,?,notpresent,notpresent,?,96,6.4,?,?,6.6,?,?,?,yes,yes,no,good,no,yes,ckd 67,90,1.020,1,0,?,abnormal,present,notpresent,141,66,3.2,138,6.6,?,?,?,?,yes,no,no,good,no,no,ckd 67,80,1.010,1,3,normal,abnormal,notpresent,notpresent,182,391,32.0,163,39.0,?,?,?,?,no,no,no,good,yes,no,ckd 15,60,1.020,3,0,?,normal,notpresent,notpresent,86,15,0.6,138,4.0,11.0,33,7700,3.8,yes,yes,no,good,no,no,ckd 46,70,1.015,1,0,abnormal,normal,notpresent,notpresent,150,111,6.1,131,3.7,7.5,27,?,?,no,no,no,good,no,yes,ckd 55,80,1.010,0,0,?,normal,notpresent,notpresent,146,?,?,?,?,9.8,?,?,?,no,no,no,good,no,no,ckd 44,90,1.010,1,0,?,normal,notpresent,notpresent,?,20,1.1,?,?,15.0,48,?,?,no,no,no,good,no,no,ckd 67,70,1.020,2,0,abnormal,normal,notpresent,notpresent,150,55,1.6,131,4.8,?,?,?,?,yes,yes,no,good,yes,no,ckd 45,80,1.020,3,0,normal,abnormal,notpresent,notpresent,425,?,?,?,?,?,?,?,?,no,no,no,poor,no,no,ckd 65,70,1.010,2,0,?,normal,present,notpresent,112,73,3.3,?,?,10.9,37,?,?,no,no,no,good,no,no,ckd 26,70,1.015,0,4,?,normal,notpresent,notpresent,250,20,1.1,?,?,15.6,52,6900,6.0,no,yes,no,good,no,no,ckd 61,80,1.015,0,4,?,normal,notpresent,notpresent,360,19,0.7,137,4.4,15.2,44,8300,5.2,yes,yes,no,good,no,no,ckd 46,60,1.010,1,0,normal,normal,notpresent,notpresent,163,92,3.3,141,4.0,9.8,28,14600,3.2,yes,yes,no,good,no,no,ckd 64,90,1.010,3,3,?,abnormal,present,notpresent,?,35,1.3,?,?,10.3,?,?,?,yes,yes,no,good,yes,no,ckd ?,100,1.015,2,0,abnormal,abnormal,notpresent,notpresent,129,107,6.7,132,4.4,4.8,14,6300,?,yes,no,no,good,yes,yes,ckd 56,90,1.015,2,0,abnormal,abnormal,notpresent,notpresent,129,107,6.7,131,4.8,9.1,29,6400,3.4,yes,no,no,good,no,no,ckd 5,?,1.015,1,0,?,normal,notpresent,notpresent,?,16,0.7,138,3.2,8.1,?,?,?,no,no,no,good,no,yes,ckd 48,80,1.005,4,0,abnormal,abnormal,notpresent,present,133,139,8.5,132,5.5,10.3,36,6200,4,no,yes,no,good,yes,no,ckd 67,70,1.010,1,0,?,normal,notpresent,notpresent,102,48,3.2,137,5.0,11.9,34,7100,3.7,yes,yes,no,good,yes,no,ckd 70,80,?,?,?,?,?,notpresent,notpresent,158,85,3.2,141,3.5,10.1,30,?,?,yes,no,no,good,yes,no,ckd 56,80,1.010,1,0,?,normal,notpresent,notpresent,165,55,1.8,?,?,13.5,40,11800,5.0,yes,yes,no,poor,yes,no,ckd 74,80,1.010,0,0,?,normal,notpresent,notpresent,132,98,2.8,133,5.0,10.8,31,9400,3.8,yes,yes,no,good,no,no,ckd 45,90,?,?,?,?,?,notpresent,notpresent,360,45,2.4,128,4.4,8.3,29,5500,3.7,yes,yes,no,good,no,no,ckd 38,70,?,?,?,?,?,notpresent,notpresent,104,77,1.9,140,3.9,?,?,?,?,yes,no,no,poor,yes,no,ckd 48,70,1.015,1,0,normal,normal,notpresent,notpresent,127,19,1.0,134,3.6,?,?,?,?,yes,yes,no,good,no,no,ckd 59,70,1.010,3,0,normal,abnormal,notpresent,notpresent,76,186,15,135,7.6,7.1,22,3800,2.1,yes,no,no,poor,yes,yes,ckd 70,70,1.015,2,?,?,?,notpresent,notpresent,?,46,1.5,?,?,9.9,?,?,?,no,yes,no,poor,yes,no,ckd 56,80,?,?,?,?,?,notpresent,notpresent,415,37,1.9,?,?,?,?,?,?,no,yes,no,good,no,no,ckd 70,100,1.005,1,0,normal,abnormal,present,notpresent,169,47,2.9,?,?,11.1,32,5800,5,yes,yes,no,poor,no,no,ckd 58,110,1.010,4,0,?,normal,notpresent,notpresent,251,52,2.2,?,?,?,?,13200,4.7,yes,yes,no,good,no,no,ckd 50,70,1.020,0,0,?,normal,notpresent,notpresent,109,32,1.4,139,4.7,?,?,?,?,no,no,no,poor,no,no,ckd 63,100,1.010,2,2,normal,normal,notpresent,present,280,35,3.2,143,3.5,13.0,40,9800,4.2,yes,no,yes,good,no,no,ckd 56,70,1.015,4,1,abnormal,normal,notpresent,notpresent,210,26,1.7,136,3.8,16.1,52,12500,5.6,no,no,no,good,no,no,ckd 71,70,1.010,3,0,normal,abnormal,present,present,219,82,3.6,133,4.4,10.4,33,5600,3.6,yes,yes,yes,good,no,no,ckd 73,100,1.010,3,2,abnormal,abnormal,present,notpresent,295,90,5.6,140,2.9,9.2,30,7000,3.2,yes,yes,yes,poor,no,no,ckd 65,70,1.010,0,0,?,normal,notpresent,notpresent,93,66,1.6,137,4.5,11.6,36,11900,3.9,no,yes,no,good,no,no,ckd 62,90,1.015,1,0,?,normal,notpresent,notpresent,94,25,1.1,131,3.7,?,?,?,?,yes,no,no,good,yes,yes,ckd 60,80,1.010,1,1,?,normal,notpresent,notpresent,172,32,2.7,?,?,11.2,36,?,?,no,yes,yes,poor,no,no,ckd 65,60,1.015,1,0,?,normal,notpresent,notpresent,91,51,2.2,132,3.8,10.0,32,9100,4.0,yes,yes,no,poor,yes,no,ckd 50,140,?,?,?,?,?,notpresent,notpresent,101,106,6.5,135,4.3,6.2,18,5800,2.3,yes,yes,no,poor,no,yes,ckd 56,180,?,0,4,?,abnormal,notpresent,notpresent,298,24,1.2,139,3.9,11.2,32,10400,4.2,yes,yes,no,poor,yes,no,ckd 34,70,1.015,4,0,abnormal,abnormal,notpresent,notpresent,153,22,0.9,133,3.8,?,?,?,?,no,no,no,good,yes,no,ckd 71,90,1.015,2,0,?,abnormal,present,present,88,80,4.4,139,5.7,11.3,33,10700,3.9,no,no,no,good,no,no,ckd 17,60,1.010,0,0,?,normal,notpresent,notpresent,92,32,2.1,141,4.2,13.9,52,7000,?,no,no,no,good,no,no,ckd 76,70,1.015,2,0,normal,abnormal,present,notpresent,226,217,10.2,?,?,10.2,36,12700,4.2,yes,no,no,poor,yes,yes,ckd 55,90,?,?,?,?,?,notpresent,notpresent,143,88,2.0,?,?,?,?,?,?,yes,yes,no,poor,yes,no,ckd 65,80,1.015,0,0,?,normal,notpresent,notpresent,115,32,11.5,139,4.0,14.1,42,6800,5.2,no,no,no,good,no,no,ckd 50,90,?,?,?,?,?,notpresent,notpresent,89,118,6.1,127,4.4,6.0,17,6500,?,yes,yes,no,good,yes,yes,ckd 55,100,1.015,1,4,normal,?,notpresent,notpresent,297,53,2.8,139,4.5,11.2,34,13600,4.4,yes,yes,no,good,no,no,ckd 45,80,1.015,0,0,?,abnormal,notpresent,notpresent,107,15,1.0,141,4.2,11.8,37,10200,4.2,no,no,no,good,no,no,ckd 54,70,?,?,?,?,?,notpresent,notpresent,233,50.1,1.9,?,?,11.7,?,?,?,no,yes,no,good,no,no,ckd 63,90,1.015,0,0,?,normal,notpresent,notpresent,123,19,2.0,142,3.8,11.7,34,11400,4.7,no,no,no,good,no,no,ckd 65,80,1.010,3,3,?,normal,notpresent,notpresent,294,71,4.4,128,5.4,10.0,32,9000,3.9,yes,yes,yes,good,no,no,ckd ?,60,1.015,3,0,abnormal,abnormal,notpresent,notpresent,?,34,1.2,?,?,10.8,33,?,?,no,no,no,good,no,no,ckd 61,90,1.015,0,2,?,normal,notpresent,notpresent,?,?,?,?,?,?,?,9800,?,no,yes,no,poor,no,yes,ckd 12,60,1.015,3,0,abnormal,abnormal,present,notpresent,?,51,1.8,?,?,12.1,?,10300,?,no,no,no,good,no,no,ckd 47,80,1.010,0,0,?,abnormal,notpresent,notpresent,?,28,0.9,?,?,12.4,44,5600,4.3,no,no,no,good,no,yes,ckd ?,70,1.015,4,0,abnormal,normal,notpresent,notpresent,104,16,0.5,?,?,?,?,?,?,no,no,no,good,yes,no,ckd ?,70,1.020,0,0,?,?,notpresent,notpresent,219,36,1.3,139,3.7,12.5,37,9800,4.4,no,no,no,good,no,no,ckd 55,70,1.010,3,0,?,normal,notpresent,notpresent,99,25,1.2,?,?,11.4,?,?,?,no,no,no,poor,yes,no,ckd 60,70,1.010,0,0,?,normal,notpresent,notpresent,140,27,1.2,?,?,?,?,?,?,no,no,no,good,no,no,ckd 72,90,1.025,1,3,?,normal,notpresent,notpresent,323,40,2.2,137,5.3,12.6,?,?,?,no,yes,yes,poor,no,no,ckd 54,60,?,3,?,?,?,notpresent,notpresent,125,21,1.3,137,3.4,15.0,46,?,?,yes,yes,no,good,yes,no,ckd 34,70,?,?,?,?,?,notpresent,notpresent,?,219,12.2,130,3.8,6.0,?,?,?,yes,no,no,good,no,yes,ckd 43,80,1.015,2,3,?,abnormal,present,present,?,30,1.1,?,?,14.0,42,14900,?,no,no,no,good,no,no,ckd 65,100,1.015,0,0,?,normal,notpresent,notpresent,90,98,2.5,?,?,9.1,28,5500,3.6,yes,no,no,good,no,no,ckd 72,90,?,?,?,?,?,notpresent,notpresent,308,36,2.5,131,4.3,?,?,?,?,yes,yes,no,poor,no,no,ckd 70,90,1.015,0,0,?,normal,notpresent,notpresent,144,125,4.0,136,4.6,12.0,37,8200,4.5,yes,yes,no,poor,yes,no,ckd 71,60,1.015,4,0,normal,normal,notpresent,notpresent,118,125,5.3,136,4.9,11.4,35,15200,4.3,yes,yes,no,poor,yes,no,ckd 52,90,1.015,4,3,normal,abnormal,notpresent,notpresent,224,166,5.6,133,47,8.1,23,5000,2.9,yes,yes,no,good,no,yes,ckd 75,70,1.025,1,0,?,normal,notpresent,notpresent,158,49,1.4,135,4.7,11.1,?,?,?,yes,no,no,poor,yes,no,ckd 50,90,1.010,2,0,normal,abnormal,present,present,128,208,9.2,134,4.8,8.2,22,16300,2.7,no,no,no,poor,yes,yes,ckd 5,50,1.010,0,0,?,normal,notpresent,notpresent,?,25,0.6,?,?,11.8,36,12400,?,no,no,no,good,no,no,ckd 50,?,?,?,?,normal,?,notpresent,notpresent,219,176,13.8,136,4.5,8.6,24,13200,2.7,yes,no,no,good,yes,yes,ckd 70,100,1.015,4,0,normal,normal,notpresent,notpresent,118,125,5.3,136,4.9,12.0,37,8400,8.0,yes,no,no,good,no,no,ckd 47,100,1.010,?,?,normal,?,notpresent,notpresent,122,?,16.9,138,5.2,10.8,33,10200,3.8,no,yes,no,good,no,no,ckd 48,80,1.015,0,2,?,normal,notpresent,notpresent,214,24,1.3,140,4.0,13.2,39,?,?,no,yes,no,poor,no,no,ckd 46,90,1.020,?,?,?,normal,notpresent,notpresent,213,68,2.8,146,6.3,9.3,?,?,?,yes,yes,no,good,no,no,ckd 45,60,1.010,2,0,normal,abnormal,present,notpresent,268,86,4.0,134,5.1,10.0,29,9200,?,yes,yes,no,good,no,no,ckd 73,?,1.010,1,0,?,?,notpresent,notpresent,95,51,1.6,142,3.5,?,?,?,?,no,no,no,good,no,no,ckd 41,70,1.015,2,0,?,abnormal,notpresent,present,?,68,2.8,132,4.1,11.1,33,?,?,yes,no,no,good,yes,yes,ckd 69,70,1.010,0,4,?,normal,notpresent,notpresent,256,40,1.2,142,5.6,?,?,?,?,no,no,no,good,no,no,ckd 67,70,1.010,1,0,normal,normal,notpresent,notpresent,?,106,6.0,137,4.9,6.1,19,6500,?,yes,no,no,good,no,yes,ckd 72,90,?,?,?,?,?,notpresent,notpresent,84,145,7.1,135,5.3,?,?,?,?,no,yes,no,good,no,no,ckd 41,80,1.015,1,4,abnormal,normal,notpresent,notpresent,210,165,18.0,135,4.7,?,?,?,?,no,yes,no,good,no,no,ckd 60,90,1.010,2,0,abnormal,normal,notpresent,notpresent,105,53,2.3,136,5.2,11.1,33,10500,4.1,no,no,no,good,no,no,ckd 57,90,1.015,5,0,abnormal,abnormal,notpresent,present,?,322,13.0,126,4.8,8.0,24,4200,3.3,yes,yes,yes,poor,yes,yes,ckd 53,100,1.010,1,3,abnormal,normal,notpresent,notpresent,213,23,1.0,139,4,?,?,?,?,no,yes,no,good,no,no,ckd 60,60,1.010,3,1,normal,abnormal,present,notpresent,288,36,1.7,130,3.0,7.9,25,15200,3.0,yes,no,no,poor,no,yes,ckd 69,60,?,?,?,?,?,notpresent,notpresent,171,26,48.1,?,?,?,?,?,?,yes,no,no,poor,no,no,ckd 65,70,1.020,1,0,abnormal,abnormal,notpresent,notpresent,139,29,1.0,?,?,10.5,32,?,?,yes,no,no,good,yes,no,ckd 8,60,1.025,3,0,normal,normal,notpresent,notpresent,78,27,0.9,?,?,12.3,41,6700,?,no,no,no,poor,yes,no,ckd 76,90,?,?,?,?,?,notpresent,notpresent,172,46,1.7,141,5.5,9.6,30,?,?,yes,yes,no,good,no,yes,ckd 39,70,1.010,0,0,?,normal,notpresent,notpresent,121,20,0.8,133,3.5,10.9,32,?,?,no,yes,no,good,no,no,ckd 55,90,1.010,2,1,abnormal,abnormal,notpresent,notpresent,273,235,14.2,132,3.4,8.3,22,14600,2.9,yes,yes,no,poor,yes,yes,ckd 56,90,1.005,4,3,abnormal,abnormal,notpresent,notpresent,242,132,16.4,140,4.2,8.4,26,?,3,yes,yes,no,poor,yes,yes,ckd 50,70,1.020,3,0,abnormal,normal,present,present,123,40,1.8,?,?,11.1,36,4700,?,no,no,no,good,no,no,ckd 66,90,1.015,2,0,?,normal,notpresent,present,153,76,3.3,?,?,?,?,?,?,no,no,no,poor,no,no,ckd 62,70,1.025,3,0,normal,abnormal,notpresent,notpresent,122,42,1.7,136,4.7,12.6,39,7900,3.9,yes,yes,no,good,no,no,ckd 71,60,1.020,3,2,normal,normal,present,notpresent,424,48,1.5,132,4.0,10.9,31,?,?,yes,yes,yes,good,no,no,ckd 59,80,1.010,1,0,abnormal,normal,notpresent,notpresent,303,35,1.3,122,3.5,10.4,35,10900,4.3,no,yes,no,poor,no,no,ckd 81,60,?,?,?,?,?,notpresent,notpresent,148,39,2.1,147,4.2,10.9,35,9400,2.4,yes,yes,yes,poor,yes,no,ckd 62,?,1.015,3,0,abnormal,?,notpresent,notpresent,?,?,?,?,?,14.3,42,10200,4.8,yes,yes,no,good,no,no,ckd 59,70,?,?,?,?,?,notpresent,notpresent,204,34,1.5,124,4.1,9.8,37,6000,?,no,yes,no,good,no,no,ckd 46,80,1.010,0,0,?,normal,notpresent,notpresent,160,40,2,140,4.1,9.0,27,8100,3.2,yes,no,no,poor,no,yes,ckd 14,?,1.015,0,0,?,?,notpresent,notpresent,192,15,0.8,137,4.2,14.3,40,9500,5.4,no,yes,no,poor,yes,no,ckd 60,80,1.020,0,2,?,?,notpresent,notpresent,?,?,?,?,?,?,?,?,?,no,yes,no,good,no,no,ckd 27,60,?,?,?,?,?,notpresent,notpresent,76,44,3.9,127,4.3,?,?,?,?,no,no,no,poor,yes,yes,ckd 34,70,1.020,0,0,abnormal,normal,notpresent,notpresent,139,19,0.9,?,?,12.7,42,2200,?,no,no,no,poor,no,no,ckd 65,70,1.015,4,4,?,normal,present,notpresent,307,28,1.5,?,?,11.0,39,6700,?,yes,yes,no,good,no,no,ckd ?,70,1.010,0,2,?,normal,notpresent,notpresent,220,68,2.8,?,?,8.7,27,?,?,yes,yes,no,good,no,yes,ckd 66,70,1.015,2,5,?,normal,notpresent,notpresent,447,41,1.7,131,3.9,12.5,33,9600,4.4,yes,yes,no,good,no,no,ckd 83,70,1.020,3,0,normal,normal,notpresent,notpresent,102,60,2.6,115,5.7,8.7,26,12800,3.1,yes,no,no,poor,no,yes,ckd 62,80,1.010,1,2,?,?,notpresent,notpresent,309,113,2.9,130,2.5,10.6,34,12800,4.9,no,no,no,good,no,no,ckd 17,70,1.015,1,0,abnormal,normal,notpresent,notpresent,22,1.5,7.3,145,2.8,13.1,41,11200,?,no,no,no,good,no,no,ckd 54,70,?,?,?,?,?,notpresent,notpresent,111,146,7.5,141,4.7,11.0,35,8600,4.6,no,no,no,good,no,no,ckd 60,50,1.010,0,0,?,normal,notpresent,notpresent,261,58,2.2,113,3.0,?,?,4200,3.4,yes,no,no,good,no,no,ckd 21,90,1.010,4,0,normal,abnormal,present,present,107,40,1.7,125,3.5,8.3,23,12400,3.9,no,no,no,good,no,yes,ckd 65,80,1.015,2,1,normal,normal,present,notpresent,215,133,2.5,?,?,13.2,41,?,?,no,yes,no,good,no,no,ckd 42,90,1.020,2,0,abnormal,abnormal,present,notpresent,93,153,2.7,139,4.3,9.8,34,9800,?,no,no,no,poor,yes,yes,ckd 72,90,1.010,2,0,?,abnormal,present,notpresent,124,53,2.3,?,?,11.9,39,?,?,no,no,no,good,no,no,ckd 73,90,1.010,1,4,abnormal,abnormal,present,notpresent,234,56,1.9,?,?,10.3,28,?,?,no,yes,no,good,no,no,ckd 45,70,1.025,2,0,normal,abnormal,present,notpresent,117,52,2.2,136,3.8,10.0,30,19100,3.7,no,no,no,good,no,no,ckd 61,80,1.020,0,0,?,normal,notpresent,notpresent,131,23,0.8,140,4.1,11.3,35,?,?,no,no,no,good,no,no,ckd 30,70,1.015,0,0,?,normal,notpresent,notpresent,101,106,6.5,135,4.3,?,?,?,?,no,no,no,poor,no,no,ckd 54,60,1.015,3,2,?,abnormal,notpresent,notpresent,352,137,3.3,133,4.5,11.3,31,5800,3.6,yes,yes,yes,poor,yes,no,ckd 4,?,1.020,1,0,?,normal,notpresent,notpresent,99,23,0.6,138,4.4,12,34,?,?,no,no,no,good,no,no,ckd 8,50,1.020,4,0,normal,normal,notpresent,notpresent,?,46,1.0,135,3.8,?,?,?,?,no,no,no,good,yes,no,ckd 3,?,1.010,2,0,normal,normal,notpresent,notpresent,?,22,0.7,?,?,10.7,34,12300,?,no,no,no,good,no,no,ckd 8,?,?,?,?,?,?,notpresent,notpresent,80,66,2.5,142,3.6,12.2,38,?,?,no,no,no,good,no,no,ckd 64,60,1.010,4,1,abnormal,abnormal,notpresent,present,239,58,4.3,137,5.4,9.5,29,7500,3.4,yes,yes,no,poor,yes,no,ckd 6,60,1.010,4,0,abnormal,abnormal,notpresent,present,94,67,1.0,135,4.9,9.9,30,16700,4.8,no,no,no,poor,no,no,ckd ?,70,1.010,3,0,normal,normal,notpresent,notpresent,110,115,6.0,134,2.7,9.1,26,9200,3.4,yes,yes,no,poor,no,no,ckd 46,110,1.015,0,0,?,normal,notpresent,notpresent,130,16,0.9,?,?,?,?,?,?,no,no,no,good,no,no,ckd 32,90,1.025,1,0,abnormal,abnormal,notpresent,notpresent,?,223,18.1,113,6.5,5.5,15,2600,2.8,yes,yes,no,poor,yes,yes,ckd 80,70,1.010,2,?,?,abnormal,notpresent,notpresent,?,49,1.2,?,?,?,?,?,?,yes,yes,no,good,no,no,ckd 70,90,1.020,2,1,abnormal,abnormal,notpresent,present,184,98.6,3.3,138,3.9,5.8,?,?,?,yes,yes,yes,poor,no,no,ckd 49,100,1.010,3,0,abnormal,abnormal,notpresent,notpresent,129,158,11.8,122,3.2,8.1,24,9600,3.5,yes,yes,no,poor,yes,yes,ckd 57,80,?,?,?,?,?,notpresent,notpresent,?,111,9.3,124,5.3,6.8,?,4300,3.0,yes,yes,no,good,no,yes,ckd 59,100,1.020,4,2,normal,normal,notpresent,notpresent,252,40,3.2,137,4.7,11.2,30,26400,3.9,yes,yes,no,poor,yes,no,ckd 65,80,1.015,0,0,?,normal,notpresent,notpresent,92,37,1.5,140,5.2,8.8,25,10700,3.2,yes,no,yes,good,yes,no,ckd 90,90,1.025,1,0,?,normal,notpresent,notpresent,139,89,3.0,140,4.1,12.0,37,7900,3.9,yes,yes,no,good,no,no,ckd 64,70,?,?,?,?,?,notpresent,notpresent,113,94,7.3,137,4.3,7.9,21,?,?,yes,yes,yes,good,yes,yes,ckd 78,60,?,?,?,?,?,notpresent,notpresent,114,74,2.9,135,5.9,8.0,24,?,?,no,yes,no,good,no,yes,ckd ?,90,?,?,?,?,?,notpresent,notpresent,207,80,6.8,142,5.5,8.5,?,?,?,yes,yes,no,good,no,yes,ckd 65,90,1.010,4,2,normal,normal,notpresent,notpresent,172,82,13.5,145,6.3,8.8,31,?,?,yes,yes,no,good,yes,yes,ckd 61,70,?,?,?,?,?,notpresent,notpresent,100,28,2.1,?,?,12.6,43,?,?,yes,yes,no,good,no,no,ckd 60,70,1.010,1,0,?,normal,notpresent,notpresent,109,96,3.9,135,4.0,13.8,41,?,?,yes,no,no,good,no,no,ckd 50,70,1.010,0,0,?,normal,notpresent,notpresent,230,50,2.2,?,?,12,41,10400,4.6,yes,yes,no,good,no,no,ckd 67,80,?,?,?,?,?,notpresent,notpresent,341,37,1.5,?,?,12.3,41,6900,4.9,yes,yes,no,good,no,yes,ckd 19,70,1.020,0,0,?,normal,notpresent,notpresent,?,?,?,?,?,11.5,?,6900,?,no,no,no,good,no,no,ckd 59,100,1.015,4,2,normal,normal,notpresent,notpresent,255,132,12.8,135,5.7,7.3,20,9800,3.9,yes,yes,yes,good,no,yes,ckd 54,120,1.015,0,0,?,normal,notpresent,notpresent,103,18,1.2,?,?,?,?,?,?,no,no,no,good,no,no,ckd 40,70,1.015,3,4,normal,normal,notpresent,notpresent,253,150,11.9,132,5.6,10.9,31,8800,3.4,yes,yes,no,poor,yes,no,ckd 55,80,1.010,3,1,normal,abnormal,present,present,214,73,3.9,137,4.9,10.9,34,7400,3.7,yes,yes,no,good,yes,no,ckd 68,80,1.015,0,0,?,abnormal,notpresent,notpresent,171,30,1.0,?,?,13.7,43,4900,5.2,no,yes,no,good,no,no,ckd 2,?,1.010,3,0,normal,abnormal,notpresent,notpresent,?,?,?,?,?,?,?,?,?,no,no,no,good,yes,no,ckd 64,70,1.010,0,0,?,normal,notpresent,notpresent,107,15,?,?,?,12.8,38,?,?,no,no,no,good,no,no,ckd 63,100,1.010,1,0,?,normal,notpresent,notpresent,78,61,1.8,141,4.4,12.2,36,10500,4.3,no,yes,no,good,no,no,ckd 33,90,1.015,0,0,?,normal,notpresent,notpresent,92,19,0.8,?,?,11.8,34,7000,?,no,no,no,good,no,no,ckd 68,90,1.010,0,0,?,normal,notpresent,notpresent,238,57,2.5,?,?,9.8,28,8000,3.3,yes,yes,no,poor,no,no,ckd 36,80,1.010,0,0,?,normal,notpresent,notpresent,103,?,?,?,?,11.9,36,8800,?,no,no,no,good,no,no,ckd 66,70,1.020,1,0,normal,?,notpresent,notpresent,248,30,1.7,138,5.3,?,?,?,?,yes,yes,no,good,no,no,ckd 74,60,?,?,?,?,?,notpresent,notpresent,108,68,1.8,?,?,?,?,?,?,yes,yes,no,good,no,no,ckd 71,90,1.010,0,3,?,normal,notpresent,notpresent,303,30,1.3,136,4.1,13.0,38,9200,4.6,yes,yes,no,good,no,no,ckd 34,60,1.020,0,0,?,normal,notpresent,notpresent,117,28,2.2,138,3.8,?,?,?,?,no,no,no,good,yes,no,ckd 60,90,1.010,3,5,abnormal,normal,notpresent,present,490,95,2.7,131,3.8,11.5,35,12000,4.5,yes,yes,no,good,no,no,ckd 64,100,1.015,4,2,abnormal,abnormal,notpresent,present,163,54,7.2,140,4.6,7.9,26,7500,3.4,yes,yes,no,good,yes,no,ckd 57,80,1.015,0,0,?,normal,notpresent,notpresent,120,48,1.6,?,?,11.3,36,7200,3.8,yes,yes,no,good,no,no,ckd 60,70,?,?,?,?,?,notpresent,notpresent,124,52,2.5,?,?,?,?,?,?,yes,no,no,good,no,no,ckd 59,50,1.010,3,0,normal,abnormal,notpresent,notpresent,241,191,12.0,114,2.9,9.6,31,15700,3.8,no,yes,no,good,yes,no,ckd 65,60,1.010,2,0,normal,abnormal,present,notpresent,192,17,1.7,130,4.3,?,?,9500,?,yes,yes,no,poor,no,no,ckd 60,90,?,?,?,?,?,notpresent,notpresent,269,51,2.8,138,3.7,11.5,35,?,?,yes,yes,yes,good,yes,no,ckd 50,90,1.015,1,0,abnormal,abnormal,notpresent,notpresent,?,?,?,?,?,?,?,?,?,no,no,no,good,yes,no,ckd 51,100,1.015,2,0,normal,normal,notpresent,present,93,20,1.6,146,4.5,?,?,?,?,no,no,no,poor,no,no,ckd 37,100,1.010,0,0,abnormal,normal,notpresent,notpresent,?,19,1.3,?,?,15.0,44,4100,5.2,yes,no,no,good,no,no,ckd 45,70,1.010,2,0,?,normal,notpresent,notpresent,113,93,2.3,?,?,7.9,26,5700,?,no,no,yes,good,no,yes,ckd 65,80,?,?,?,?,?,notpresent,notpresent,74,66,2.0,136,5.4,9.1,25,?,?,yes,yes,yes,good,yes,no,ckd 80,70,1.015,2,2,?,normal,notpresent,notpresent,141,53,2.2,?,?,12.7,40,9600,?,yes,yes,no,poor,yes,no,ckd 72,100,?,?,?,?,?,notpresent,notpresent,201,241,13.4,127,4.8,9.4,28,?,?,yes,yes,no,good,no,yes,ckd 34,90,1.015,2,0,normal,normal,notpresent,notpresent,104,50,1.6,137,4.1,11.9,39,?,?,no,no,no,good,no,no,ckd 65,70,1.015,1,0,?,normal,notpresent,notpresent,203,46,1.4,?,?,11.4,36,5000,4.1,yes,yes,no,poor,yes,no,ckd 57,70,1.015,1,0,?,abnormal,notpresent,notpresent,165,45,1.5,140,3.3,10.4,31,4200,3.9,no,no,no,good,no,no,ckd 69,70,1.010,4,3,normal,abnormal,present,present,214,96,6.3,120,3.9,9.4,28,11500,3.3,yes,yes,yes,good,yes,yes,ckd 62,90,1.020,2,1,?,normal,notpresent,notpresent,169,48,2.4,138,2.9,13.4,47,11000,6.1,yes,no,no,good,no,no,ckd 64,90,1.015,3,2,?,abnormal,present,notpresent,463,64,2.8,135,4.1,12.2,40,9800,4.6,yes,yes,no,good,no,yes,ckd 48,100,?,?,?,?,?,notpresent,notpresent,103,79,5.3,135,6.3,6.3,19,7200,2.6,yes,no,yes,poor,no,no,ckd 48,110,1.015,3,0,abnormal,normal,present,notpresent,106,215,15.2,120,5.7,8.6,26,5000,2.5,yes,no,yes,good,no,yes,ckd 54,90,1.025,1,0,normal,abnormal,notpresent,notpresent,150,18,1.2,140,4.2,?,?,?,?,no,no,no,poor,yes,yes,ckd 59,70,1.010,1,3,abnormal,abnormal,notpresent,notpresent,424,55,1.7,138,4.5,12.6,37,10200,4.1,yes,yes,yes,good,no,no,ckd 56,90,1.010,4,1,normal,abnormal,present,notpresent,176,309,13.3,124,6.5,3.1,9,5400,2.1,yes,yes,no,poor,yes,yes,ckd 40,80,1.025,0,0,normal,normal,notpresent,notpresent,140,10,1.2,135,5.0,15.0,48,10400,4.5,no,no,no,good,no,no,notckd 23,80,1.025,0,0,normal,normal,notpresent,notpresent,70,36,1.0,150,4.6,17.0,52,9800,5.0,no,no,no,good,no,no,notckd 45,80,1.025,0,0,normal,normal,notpresent,notpresent,82,49,0.6,147,4.4,15.9,46,9100,4.7,no,no,no,good,no,no,notckd 57,80,1.025,0,0,normal,normal,notpresent,notpresent,119,17,1.2,135,4.7,15.4,42,6200,6.2,no,no,no,good,no,no,notckd 51,60,1.025,0,0,normal,normal,notpresent,notpresent,99,38,0.8,135,3.7,13.0,49,8300,5.2,no,no,no,good,no,no,notckd 34,80,1.025,0,0,normal,normal,notpresent,notpresent,121,27,1.2,144,3.9,13.6,52,9200,6.3,no,no,no,good,no,no,notckd 60,80,1.025,0,0,normal,normal,notpresent,notpresent,131,10,0.5,146,5.0,14.5,41,10700,5.1,no,no,no,good,no,no,notckd 38,60,1.020,0,0,normal,normal,notpresent,notpresent,91,36,0.7,135,3.7,14.0,46,9100,5.8,no,no,no,good,no,no,notckd 42,80,1.020,0,0,normal,normal,notpresent,notpresent,98,20,0.5,140,3.5,13.9,44,8400,5.5,no,no,no,good,no,no,notckd 35,80,1.020,0,0,normal,normal,notpresent,notpresent,104,31,1.2,135,5.0,16.1,45,4300,5.2,no,no,no,good,no,no,notckd 30,80,1.020,0,0,normal,normal,notpresent,notpresent,131,38,1.0,147,3.8,14.1,45,9400,5.3,no,no,no,good,no,no,notckd 49,80,1.020,0,0,normal,normal,notpresent,notpresent,122,32,1.2,139,3.9,17.0,41,5600,4.9,no,no,no,good,no,no,notckd 55,80,1.020,0,0,normal,normal,notpresent,notpresent,118,18,0.9,135,3.6,15.5,43,7200,5.4,no,no,no,good,no,no,notckd 45,80,1.020,0,0,normal,normal,notpresent,notpresent,117,46,1.2,137,5.0,16.2,45,8600,5.2,no,no,no,good,no,no,notckd 42,80,1.020,0,0,normal,normal,notpresent,notpresent,132,24,0.7,140,4.1,14.4,50,5000,4.5,no,no,no,good,no,no,notckd 50,80,1.020,0,0,normal,normal,notpresent,notpresent,97,40,0.6,150,4.5,14.2,48,10500,5.0,no,no,no,good,no,no,notckd 55,80,1.020,0,0,normal,normal,notpresent,notpresent,133,17,1.2,135,4.8,13.2,41,6800,5.3,no,no,no,good,no,no,notckd 48,80,1.025,0,0,normal,normal,notpresent,notpresent,122,33,0.9,146,3.9,13.9,48,9500,4.8,no,no,no,good,no,no,notckd ?,80,?,?,?,?,?,notpresent,notpresent,100,49,1.0,140,5.0,16.3,53,8500,4.9,no,no,no,good,no,no,notckd 25,80,1.025,0,0,normal,normal,notpresent,notpresent,121,19,1.2,142,4.9,15.0,48,6900,5.3,no,no,no,good,no,no,notckd 23,80,1.025,0,0,normal,normal,notpresent,notpresent,111,34,1.1,145,4.0,14.3,41,7200,5.0,no,no,no,good,no,no,notckd 30,80,1.025,0,0,normal,normal,notpresent,notpresent,96,25,0.5,144,4.8,13.8,42,9000,4.5,no,no,no,good,no,no,notckd 56,80,1.025,0,0,normal,normal,notpresent,notpresent,139,15,1.2,135,5.0,14.8,42,5600,5.5,no,no,no,good,no,no,notckd 47,80,1.020,0,0,normal,normal,notpresent,notpresent,95,35,0.9,140,4.1,?,?,?,?,no,no,no,good,no,no,notckd 19,80,1.020,0,0,normal,normal,notpresent,notpresent,107,23,0.7,141,4.2,14.4,44,?,?,no,no,no,good,no,no,notckd 52,80,1.020,0,0,normal,normal,notpresent,notpresent,125,22,1.2,139,4.6,16.5,43,4700,4.6,no,no,no,good,no,no,notckd 20,60,1.025,0,0,normal,normal,notpresent,notpresent,?,?,?,137,4.7,14.0,41,4500,5.5,no,no,no,good,no,no,notckd 46,60,1.025,0,0,normal,normal,notpresent,notpresent,123,46,1.0,135,5.0,15.7,50,6300,4.8,no,no,no,good,no,no,notckd 48,60,1.020,0,0,normal,normal,notpresent,notpresent,112,44,1.2,142,4.9,14.5,44,9400,6.4,no,no,no,good,no,no,notckd 24,70,1.025,0,0,normal,normal,notpresent,notpresent,140,23,0.6,140,4.7,16.3,48,5800,5.6,no,no,no,good,no,no,notckd 47,80,?,?,?,?,?,notpresent,notpresent,93,33,0.9,144,4.5,13.3,52,8100,5.2,no,no,no,good,no,no,notckd 55,80,1.025,0,0,normal,normal,notpresent,notpresent,130,50,1.2,147,5,15.5,41,9100,6.0,no,no,no,good,no,no,notckd 20,70,1.020,0,0,normal,normal,notpresent,notpresent,123,44,1.0,135,3.8,14.6,44,5500,4.8,no,no,no,good,no,no,notckd 60,70,1.020,0,0,normal,normal,notpresent,notpresent,?,?,?,?,?,16.4,43,10800,5.7,no,no,no,good,no,no,notckd 33,80,1.025,0,0,normal,normal,notpresent,notpresent,100,37,1.2,142,4.0,16.9,52,6700,6.0,no,no,no,good,no,no,notckd 66,70,1.020,0,0,normal,normal,notpresent,notpresent,94,19,0.7,135,3.9,16.0,41,5300,5.9,no,no,no,good,no,no,notckd 71,70,1.020,0,0,normal,normal,notpresent,notpresent,81,18,0.8,145,5.0,14.7,44,9800,6.0,no,no,no,good,no,no,notckd 39,70,1.025,0,0,normal,normal,notpresent,notpresent,124,22,0.6,137,3.8,13.4,43,?,?,no,no,no,good,no,no,notckd 56,70,1.025,0,0,normal,normal,notpresent,notpresent,70,46,1.2,135,4.9,15.9,50,11000,5.1,?,?,?,good,no,no,notckd 42,70,1.020,0,0,normal,normal,notpresent,notpresent,93,32,0.9,143,4.7,16.6,43,7100,5.3,no,no,no,good,no,no,notckd 54,70,1.020,0,0,?,?,?,?,76,28,0.6,146,3.5,14.8,52,8400,5.9,no,no,no,good,no,no,notckd 47,80,1.025,0,0,normal,normal,notpresent,notpresent,124,44,1.0,140,4.9,14.9,41,7000,5.7,no,no,no,good,no,no,notckd 30,80,1.020,0,0,normal,normal,notpresent,notpresent,89,42,0.5,139,5.0,16.7,52,10200,5.0,no,no,no,good,no,no,notckd 50,?,1.020,0,0,normal,normal,notpresent,notpresent,92,19,1.2,150,4.8,14.9,48,4700,5.4,no,no,no,good,no,no,notckd 75,60,1.020,0,0,normal,normal,notpresent,notpresent,110,50,0.7,135,5.0,14.3,40,8300,5.8,no,no,no,?,?,?,notckd 44,70,?,?,?,?,?,notpresent,notpresent,106,25,0.9,150,3.6,15.0,50,9600,6.5,no,no,no,good,no,no,notckd 41,70,1.020,0,0,normal,normal,notpresent,notpresent,125,38,0.6,140,5.0,16.8,41,6300,5.9,no,no,no,good,no,no,notckd 53,60,1.025,0,0,normal,normal,notpresent,notpresent,116,26,1.0,146,4.9,15.8,45,7700,5.2,?,?,?,good,no,no,notckd 34,60,1.020,0,0,normal,normal,notpresent,notpresent,91,49,1.2,135,4.5,13.5,48,8600,4.9,no,no,no,good,no,no,notckd 73,60,1.020,0,0,normal,normal,notpresent,notpresent,127,48,0.5,150,3.5,15.1,52,11000,4.7,no,no,no,good,no,no,notckd 45,60,1.020,0,0,normal,normal,?,?,114,26,0.7,141,4.2,15.0,43,9200,5.8,no,no,no,good,no,no,notckd 44,60,1.025,0,0,normal,normal,notpresent,notpresent,96,33,0.9,147,4.5,16.9,41,7200,5.0,no,no,no,good,no,no,notckd 29,70,1.020,0,0,normal,normal,notpresent,notpresent,127,44,1.2,145,5.0,14.8,48,?,?,no,no,no,good,no,no,notckd 55,70,1.020,0,0,normal,normal,notpresent,notpresent,107,26,1.1,?,?,17.0,50,6700,6.1,no,no,no,good,no,no,notckd 33,80,1.025,0,0,normal,normal,notpresent,notpresent,128,38,0.6,135,3.9,13.1,45,6200,4.5,no,no,no,good,no,no,notckd 41,80,1.020,0,0,normal,normal,notpresent,notpresent,122,25,0.8,138,5.0,17.1,41,9100,5.2,no,no,no,good,no,no,notckd 52,80,1.020,0,0,normal,normal,notpresent,notpresent,128,30,1.2,140,4.5,15.2,52,4300,5.7,no,no,no,good,no,no,notckd 47,60,1.020,0,0,normal,normal,notpresent,notpresent,137,17,0.5,150,3.5,13.6,44,7900,4.5,no,no,no,good,no,no,notckd 43,80,1.025,0,0,normal,normal,notpresent,notpresent,81,46,0.6,135,4.9,13.9,48,6900,4.9,no,no,no,good,no,no,notckd 51,60,1.020,0,0,?,?,notpresent,notpresent,129,25,1.2,139,5.0,17.2,40,8100,5.9,no,no,no,good,no,no,notckd 46,60,1.020,0,0,normal,normal,notpresent,notpresent,102,27,0.7,142,4.9,13.2,44,11000,5.4,no,no,no,good,no,no,notckd 56,60,1.025,0,0,normal,normal,notpresent,notpresent,132,18,1.1,147,4.7,13.7,45,7500,5.6,no,no,no,good,no,no,notckd 80,70,1.020,0,0,normal,normal,notpresent,notpresent,?,?,?,135,4.1,15.3,48,6300,6.1,no,no,no,good,no,no,notckd 55,80,1.020,0,0,normal,normal,notpresent,notpresent,104,28,0.9,142,4.8,17.3,52,8200,4.8,no,no,no,good,no,no,notckd 39,70,1.025,0,0,normal,normal,notpresent,notpresent,131,46,0.6,145,5.0,15.6,41,9400,4.7,no,no,no,good,no,no,notckd 44,70,1.025,0,0,normal,normal,notpresent,notpresent,?,?,?,?,?,13.8,48,7800,4.4,no,no,no,good,no,no,notckd 35,?,1.020,0,0,normal,normal,?,?,99,30,0.5,135,4.9,15.4,48,5000,5.2,no,no,no,good,no,no,notckd 58,70,1.020,0,0,normal,normal,notpresent,notpresent,102,48,1.2,139,4.3,15.0,40,8100,4.9,no,no,no,good,no,no,notckd 61,70,1.025,0,0,normal,normal,notpresent,notpresent,120,29,0.7,137,3.5,17.4,52,7000,5.3,no,no,no,good,no,no,notckd 30,60,1.020,0,0,normal,normal,notpresent,notpresent,138,15,1.1,135,4.4,?,?,?,?,no,no,no,good,no,no,notckd 57,60,1.020,0,0,normal,normal,notpresent,notpresent,105,49,1.2,150,4.7,15.7,44,10400,6.2,no,no,no,good,no,no,notckd 65,60,1.020,0,0,normal,normal,notpresent,notpresent,109,39,1.0,144,3.5,13.9,48,9600,4.8,no,no,no,good,no,no,notckd 70,60,?,?,?,?,?,notpresent,notpresent,120,40,0.5,140,4.6,16.0,43,4500,4.9,no,no,no,good,no,no,notckd 43,80,1.025,0,0,normal,normal,notpresent,notpresent,130,30,1.1,143,5.0,15.9,45,7800,4.5,no,no,no,good,no,no,notckd 40,80,1.020,0,0,normal,normal,notpresent,notpresent,119,15,0.7,150,4.9,?,?,?,?,no,no,no,good,no,no,notckd 58,80,1.020,0,0,normal,normal,notpresent,notpresent,100,50,1.2,140,3.5,14.0,50,6700,6.5,no,no,no,good,no,no,notckd 47,60,1.020,0,0,normal,normal,notpresent,notpresent,109,25,1.1,141,4.7,15.8,41,8300,5.2,no,no,no,good,no,no,notckd 30,60,1.025,0,0,normal,normal,notpresent,notpresent,120,31,0.8,150,4.6,13.4,44,10700,5.8,no,no,no,good,no,no,notckd 28,70,1.020,0,0,normal,normal,?,?,131,29,0.6,145,4.9,?,45,8600,6.5,no,no,no,good,no,no,notckd 33,60,1.025,0,0,normal,normal,notpresent,notpresent,80,25,0.9,146,3.5,14.1,48,7800,5.1,no,no,no,good,no,no,notckd 43,80,1.020,0,0,normal,normal,notpresent,notpresent,114,32,1.1,135,3.9,?,42,?,?,no,no,no,good,no,no,notckd 59,70,1.025,0,0,normal,normal,notpresent,notpresent,130,39,0.7,147,4.7,13.5,46,6700,4.5,no,no,no,good,no,no,notckd 34,70,1.025,0,0,normal,normal,notpresent,notpresent,?,33,1,150,5.0,15.3,44,10500,6.1,no,no,no,good,no,no,notckd 23,80,1.020,0,0,normal,normal,notpresent,notpresent,99,46,1.2,142,4.0,17.7,46,4300,5.5,no,no,no,good,no,no,notckd 24,80,1.025,0,0,normal,normal,notpresent,notpresent,125,?,?,136,3.5,15.4,43,5600,4.5,no,no,no,good,no,no,notckd 60,60,1.020,0,0,normal,normal,notpresent,notpresent,134,45,0.5,139,4.8,14.2,48,10700,5.6,no,no,no,good,no,no,notckd 25,60,1.020,0,0,normal,normal,notpresent,notpresent,119,27,0.5,?,?,15.2,40,9200,5.2,no,no,no,good,no,no,notckd 44,70,1.025,0,0,normal,normal,notpresent,notpresent,92,40,0.9,141,4.9,14.0,52,7500,6.2,no,no,no,good,no,no,notckd 62,80,1.020,0,0,normal,normal,notpresent,notpresent,132,34,0.8,147,3.5,17.8,44,4700,4.5,no,no,no,good,no,no,notckd 25,70,1.020,0,0,normal,normal,notpresent,notpresent,88,42,0.5,136,3.5,13.3,48,7000,4.9,no,no,no,good,no,no,notckd 32,70,1.025,0,0,normal,normal,notpresent,notpresent,100,29,1.1,142,4.5,14.3,43,6700,5.9,no,no,no,good,no,no,notckd 63,70,1.025,0,0,normal,normal,notpresent,notpresent,130,37,0.9,150,5.0,13.4,41,7300,4.7,no,no,no,good,no,no,notckd 44,60,1.020,0,0,normal,normal,notpresent,notpresent,95,46,0.5,138,4.2,15.0,50,7700,6.3,no,no,no,good,no,no,notckd 37,60,1.025,0,0,normal,normal,notpresent,notpresent,111,35,0.8,135,4.1,16.2,50,5500,5.7,no,no,no,good,no,no,notckd 64,60,1.020,0,0,normal,normal,notpresent,notpresent,106,27,0.7,150,3.3,14.4,42,8100,4.7,no,no,no,good,no,no,notckd 22,60,1.025,0,0,normal,normal,notpresent,notpresent,97,18,1.2,138,4.3,13.5,42,7900,6.4,no,no,no,good,no,no,notckd 33,60,?,?,?,normal,normal,notpresent,notpresent,130,41,0.9,141,4.4,15.5,52,4300,5.8,no,no,no,good,no,no,notckd 43,60,1.025,0,0,normal,normal,notpresent,notpresent,108,25,1.0,144,5.0,17.8,43,7200,5.5,no,no,no,good,no,no,notckd 38,80,1.020,0,0,normal,normal,notpresent,notpresent,99,19,0.5,147,3.5,13.6,44,7300,6.4,no,no,no,good,no,no,notckd 35,70,1.025,0,0,?,?,notpresent,notpresent,82,36,1.1,150,3.5,14.5,52,9400,6.1,no,no,no,good,no,no,notckd 65,70,1.025,0,0,?,?,notpresent,notpresent,85,20,1.0,142,4.8,16.1,43,9600,4.5,no,no,no,good,no,no,notckd 29,80,1.020,0,0,normal,normal,notpresent,notpresent,83,49,0.9,139,3.3,17.5,40,9900,4.7,no,no,no,good,no,no,notckd 37,60,1.020,0,0,normal,normal,notpresent,notpresent,109,47,1.1,141,4.9,15.0,48,7000,5.2,no,no,no,good,no,no,notckd 39,60,1.020,0,0,normal,normal,notpresent,notpresent,86,37,0.6,150,5.0,13.6,51,5800,4.5,no,no,no,good,no,no,notckd 32,60,1.025,0,0,normal,normal,notpresent,notpresent,102,17,0.4,147,4.7,14.6,41,6800,5.1,no,no,no,good,no,no,notckd 23,60,1.020,0,0,normal,normal,notpresent,notpresent,95,24,0.8,145,5.0,15,52,6300,4.6,no,no,no,good,no,no,notckd 34,70,1.025,0,0,normal,normal,notpresent,notpresent,87,38,0.5,144,4.8,17.1,47,7400,6.1,no,no,no,good,no,no,notckd 66,70,1.025,0,0,normal,normal,notpresent,notpresent,107,16,1.1,140,3.6,13.6,42,11000,4.9,no,no,no,good,no,no,notckd 47,60,1.020,0,0,normal,normal,notpresent,notpresent,117,22,1.2,138,3.5,13,45,5200,5.6,no,no,no,good,no,no,notckd 74,60,1.020,0,0,normal,normal,notpresent,notpresent,88,50,0.6,147,3.7,17.2,53,6000,4.5,no,no,no,good,no,no,notckd 35,60,1.025,0,0,normal,normal,notpresent,notpresent,105,39,0.5,135,3.9,14.7,43,5800,6.2,no,no,no,good,no,no,notckd 29,80,1.020,0,0,normal,normal,notpresent,notpresent,70,16,0.7,138,3.5,13.7,54,5400,5.8,no,no,no,good,no,no,notckd 33,80,1.025,0,0,normal,normal,notpresent,notpresent,89,19,1.1,144,5.0,15,40,10300,4.8,no,no,no,good,no,no,notckd 67,80,1.025,0,0,normal,normal,notpresent,notpresent,99,40,0.5,?,?,17.8,44,5900,5.2,no,no,no,good,no,no,notckd 73,80,1.025,0,0,normal,normal,notpresent,notpresent,118,44,0.7,137,3.5,14.8,45,9300,4.7,no,no,no,good,no,no,notckd 24,80,1.020,0,0,normal,normal,notpresent,notpresent,93,46,1.0,145,3.5,?,?,10700,6.3,no,no,no,good,no,no,notckd 60,80,1.025,0,0,normal,normal,notpresent,notpresent,81,15,0.5,141,3.6,15,46,10500,5.3,no,no,no,good,no,no,notckd 68,60,1.025,0,0,normal,normal,notpresent,notpresent,125,41,1.1,139,3.8,17.4,50,6700,6.1,no,no,no,good,no,no,notckd 30,80,1.025,0,0,normal,normal,notpresent,notpresent,82,42,0.7,146,5.0,14.9,45,9400,5.9,no,no,no,good,no,no,notckd 75,70,1.020,0,0,normal,normal,notpresent,notpresent,107,48,0.8,144,3.5,13.6,46,10300,4.8,no,no,no,good,no,no,notckd 69,70,1.020,0,0,normal,normal,notpresent,notpresent,83,42,1.2,139,3.7,16.2,50,9300,5.4,no,no,no,good,no,no,notckd 28,60,1.025,0,0,normal,normal,notpresent,notpresent,79,50,0.5,145,5.0,17.6,51,6500,5.0,no,no,no,good,no,no,notckd 72,60,1.020,0,0,normal,normal,notpresent,notpresent,109,26,0.9,150,4.9,15,52,10500,5.5,no,no,no,good,no,no,notckd 61,70,1.025,0,0,normal,normal,notpresent,notpresent,133,38,1.0,142,3.6,13.7,47,9200,4.9,no,no,no,good,no,no,notckd 79,80,1.025,0,0,normal,normal,notpresent,notpresent,111,44,1.2,146,3.6,16.3,40,8000,6.4,no,no,no,good,no,no,notckd 70,80,1.020,0,0,normal,normal,notpresent,notpresent,74,41,0.5,143,4.5,15.1,48,9700,5.6,no,no,no,good,no,no,notckd 58,70,1.025,0,0,normal,normal,notpresent,notpresent,88,16,1.1,147,3.5,16.4,53,9100,5.2,no,no,no,good,no,no,notckd 64,70,1.020,0,0,normal,normal,notpresent,notpresent,97,27,0.7,145,4.8,13.8,49,6400,4.8,no,no,no,good,no,no,notckd 71,60,1.025,0,0,normal,normal,notpresent,notpresent,?,?,0.9,140,4.8,15.2,42,7700,5.5,no,no,no,good,no,no,notckd 62,80,1.025,0,0,normal,normal,notpresent,notpresent,78,45,0.6,138,3.5,16.1,50,5400,5.7,no,no,no,good,no,no,notckd 59,60,1.020,0,0,normal,normal,notpresent,notpresent,113,23,1.1,139,3.5,15.3,54,6500,4.9,no,no,no,good,no,no,notckd 71,70,1.025,0,0,?,?,notpresent,notpresent,79,47,0.5,142,4.8,16.6,40,5800,5.9,no,no,no,good,no,no,notckd 48,80,1.025,0,0,normal,normal,notpresent,notpresent,75,22,0.8,137,5.0,16.8,51,6000,6.5,no,no,no,good,no,no,notckd 80,80,1.025,0,0,normal,normal,notpresent,notpresent,119,46,0.7,141,4.9,13.9,49,5100,5.0,no,no,no,good,no,no,notckd 57,60,1.020,0,0,normal,normal,notpresent,notpresent,132,18,1.1,150,4.7,15.4,42,11000,4.5,no,no,no,good,no,no,notckd 63,70,1.020,0,0,normal,normal,notpresent,notpresent,113,25,0.6,146,4.9,16.5,52,8000,5.1,no,no,no,good,no,no,notckd 46,70,1.025,0,0,normal,normal,notpresent,notpresent,100,47,0.5,142,3.5,16.4,43,5700,6.5,no,no,no,good,no,no,notckd 15,80,1.025,0,0,normal,normal,notpresent,notpresent,93,17,0.9,136,3.9,16.7,50,6200,5.2,no,no,no,good,no,no,notckd 51,80,1.020,0,0,normal,normal,notpresent,notpresent,94,15,1.2,144,3.7,15.5,46,9500,6.4,no,no,no,good,no,no,notckd 41,80,1.025,0,0,normal,normal,notpresent,notpresent,112,48,0.7,140,5.0,17.0,52,7200,5.8,no,no,no,good,no,no,notckd 52,80,1.025,0,0,normal,normal,notpresent,notpresent,99,25,0.8,135,3.7,15.0,52,6300,5.3,no,no,no,good,no,no,notckd 36,80,1.025,0,0,normal,normal,notpresent,notpresent,85,16,1.1,142,4.1,15.6,44,5800,6.3,no,no,no,good,no,no,notckd 57,80,1.020,0,0,normal,normal,notpresent,notpresent,133,48,1.2,147,4.3,14.8,46,6600,5.5,no,no,no,good,no,no,notckd 43,60,1.025,0,0,normal,normal,notpresent,notpresent,117,45,0.7,141,4.4,13.0,54,7400,5.4,no,no,no,good,no,no,notckd 50,80,1.020,0,0,normal,normal,notpresent,notpresent,137,46,0.8,139,5.0,14.1,45,9500,4.6,no,no,no,good,no,no,notckd 55,80,1.020,0,0,normal,normal,notpresent,notpresent,140,49,0.5,150,4.9,15.7,47,6700,4.9,no,no,no,good,no,no,notckd 42,70,1.025,0,0,normal,normal,notpresent,notpresent,75,31,1.2,141,3.5,16.5,54,7800,6.2,no,no,no,good,no,no,notckd 12,80,1.020,0,0,normal,normal,notpresent,notpresent,100,26,0.6,137,4.4,15.8,49,6600,5.4,no,no,no,good,no,no,notckd 17,60,1.025,0,0,normal,normal,notpresent,notpresent,114,50,1.0,135,4.9,14.2,51,7200,5.9,no,no,no,good,no,no,notckd 58,80,1.025,0,0,normal,normal,notpresent,notpresent,131,18,1.1,141,3.5,15.8,53,6800,6.1,no,no,no,good,no,no,notckd ================================================ FILE: 02_Python/data/concentric_circles.csv ================================================ -0.5964976874818628,-0.7767253221036915 -0.08971783096451161,-0.4135830691211844 -1.0007531618691181,-0.326171630582138 -0.9537852659730824,0.247659193850729 -0.29478237596151846,-0.10597967151189042 1.0089481560222697,0.418957720062357 0.4913625964913842,0.3053228383973465 1.1302285078923262,0.2475452229338419 -0.13401621257124116,-0.3393357143716329 -0.08480068219467549,-1.0052906444497578 0.3159956622497828,0.1779199816860224 0.44592745119819,0.07941311252194524 0.55141084722587,-0.092912256107955 -0.7351642114185724,-0.8108332955247171 -0.030738176707417533,0.48161576521627303 0.5410349238313751,0.033695124259219965 -1.1060408287508423,-0.27255600210143627 -0.8956263215864325,0.37709460887577856 -0.45964928055200543,0.1616316400651608 0.009262750915371364,-0.43773882675143894 0.3910802426496407,-0.19726120820081744 0.7815012221940484,-0.16136742925025216 -1.0270971274262792,-0.028474220990273923 -0.41899604487741965,-0.1638446195071755 -0.24642269568234043,-0.9553017329407091 -0.49988661909323057,0.8331754388910466 -0.3558967488795625,0.10153523372529666 -0.3691681582398468,-0.16356514163042923 0.1202655132497247,0.5782415257208986 0.06398003327431977,0.9295584048122627 0.5804526859080539,-0.7536050120698863 -0.47493816473688405,-0.025411492163156135 -0.1790931802506636,-0.4435894097293005 0.08582982726129436,-0.9610098301536245 0.18538265499310036,0.4860855499086707 0.5118289545481801,0.06422381288573517 0.10414435731385942,-0.9989307945723512 -0.36078211845604335,1.0072705431661375 -0.545950970561058,-0.2567776552090378 0.7238655468576771,0.7138741120027197 -0.3946860848013648,0.07717049429188888 0.6563761573889337,0.9102517063066479 0.1366023473712878,0.8890204155640026 -0.9979590415306634,-0.5402916832715131 0.25299835724956954,-0.34599960851692046 -0.7610667244529692,-0.6399527971339043 -0.12619623813797248,-0.5781290022909709 -0.8178069994943656,-0.6191256879340781 0.29553006673230825,0.3427415677139836 -0.5477795142140935,-0.8767927249049886 0.7213629978729259,-0.536989728087863 -0.4507593309518629,0.11145869153814122 0.1952445588609756,-0.9884100407758708 0.7063123250175316,0.5586914764207283 0.9129170548865992,-0.5958367919928296 0.4488749284055041,0.2616957024297636 -0.9706688189694048,0.39987899797844717 0.6578777725336112,1.004053128789949 -0.4332280182796834,-1.042707541332595 -0.6504891111468709,0.686107163505586 -0.11170205648412146,-0.4408229006486496 0.48141993829924795,0.18940926442605527 0.5248858040382582,-0.15017454449939022 -0.061465232798958915,1.1137576078651625 0.8367392324597515,-0.5585814975760535 0.7448287927226515,0.5435130921961728 0.2000979783210328,-0.9798946244457659 0.6063713975209812,0.7190588629106595 -0.05678078961418228,-0.510253261357331 0.9744774522644813,0.22364494600299922 0.24927550195138698,-0.43608772096308385 -0.28959770048621103,1.0781095209794138 0.9862784532417114,-0.5337967254343098 -0.4372726966823024,0.022009318083580656 0.12411031154595079,-0.4978154314297547 0.10317571583411264,0.6526045903437112 0.2692560713085656,-0.4880307405101292 0.9528683766519546,0.0907861552790156 0.6923293380065622,-0.6736495735496721 0.587140424481366,0.9167332251670203 -1.1381731344395067,0.19733227490651742 0.3164238116845555,0.8831142643204528 -0.38470904988845933,-0.07565126258314112 -0.4209551654342268,0.09633814896530785 0.6058233062239393,0.7222742509666764 -0.9822375553819702,0.479848686635196 -1.0137588150503813,-0.24707816765033172 -0.40015177089465576,-0.3437911139051542 -0.5001769347384208,0.07484154541380679 -0.1661523906512215,-0.36618029053645834 1.0687842432407153,-0.12561742627636227 0.32747852947338496,-0.9771772898954294 0.4590030820691221,-0.3732661528045094 0.25000096690611257,0.5853758489631067 -0.10949171844021163,1.0375147582493571 -0.4855029243734636,0.21657429425570318 0.348979997083154,-0.23865263012829943 0.30349476828420124,-0.31591019453302843 -0.37861337110059634,-0.46066147801010127 -1.0017545284137161,-0.31120371930340923 0.21827203823271743,-0.3664515071911094 0.9686711936119857,0.21513796462072718 -0.4661117462842649,-0.09263645544872756 -0.33984954392972044,0.34503713697077915 0.19235135031961606,0.42674918901938746 0.2570628372716435,0.550305444709873 -0.7224662156881066,0.7440598516202538 0.36057555006083486,0.283869684976919 -0.020384573728330843,-0.7714204011020536 0.43933579781650234,-0.4213949416890632 -0.05935728229103,-0.898753381438475 -0.6002136044119903,-0.3175325920524773 -0.1876241779645519,0.5197498776188059 0.18598025117776068,-0.863719338762845 -0.423484133875512,0.8977713732555921 -0.7898523085367052,-0.6545754466869886 0.9091424840509388,0.3726236062800244 -0.2637749723453783,-0.9703202818605153 -0.3956197431022276,0.24721208977531264 -0.5730793763648695,0.7281329971156115 -0.33984825379893147,-0.16468149625463055 -0.1677635559056578,-0.2990687968486708 0.4576355041516013,0.2510025643722984 0.4672173742962245,0.10349739090048553 0.3919274270658863,-1.0084682913664749 -0.41476960763962006,0.11121071077072969 0.4282746548536248,-0.10697831387323135 0.40310612360387515,0.13567108826648516 -0.05858015135127177,-0.49258139013277197 -0.9626167759313159,-0.19916400306257787 0.0156655208680778,0.37801833292557097 -0.24607910731204297,-0.3234661205847393 -0.2680191072811375,0.4014734054093518 0.27275266141389765,-0.2328861391331067 0.4769244377618038,0.0009522859115531652 0.9717458527377411,0.04019585528297948 0.3509633753454921,-0.536170328893512 -0.15730674394730323,0.47257195665320934 -0.09760535815243604,0.4978741058640103 0.6036263728937201,-0.8437959492855501 0.316647281171155,0.41989978455634847 0.4005043818488322,-0.40541748139807793 -0.04620338212244712,-0.5755162411736535 0.213167370692542,-0.5047779918165176 -0.9081287791540691,0.7037905853139147 0.26134594290931873,0.4701321253033402 -0.3126119574252444,-0.3575243983351418 -0.39781412797910154,-0.11803093804446368 0.3897055500068163,-0.4557066160796452 -0.48604807281046836,0.30269352393954313 -0.749357695690378,-0.5681559328275477 -0.43091355963766415,0.1430603978569948 -0.019664062301775656,0.6434900809067136 -0.2571387284601371,-0.3362912780679074 -0.5678246506820418,-0.24604661733240835 0.8899939951221372,0.18258110263769775 0.05075157555567561,-1.0820815877434384 -0.2805571670393938,-0.5057049913634942 0.42486877167208104,-0.094905881732696 0.3930646469292933,0.8944231579612191 0.19249069684523606,0.47221175548741345 0.5785824436905204,0.0813604331474045 0.4025461794311977,0.39389986689499046 -0.6317328905794198,-0.81417649525151 1.102953614812882,-0.1761260303069548 -0.5663289738252122,-0.8620931558537943 -0.4416663008557587,0.25716360727572757 -0.5155428282199412,-0.3625053664480704 1.0253811125979453,-0.25521594681668247 0.27769644295832824,0.9315126674235171 0.7573827658180695,-0.31474887443301863 -0.4587273511301044,-0.1470075377867423 0.34471165652890495,-0.18265328435081077 0.29775582814488394,-0.3472810679911276 0.21096672354207704,0.4077306270142454 -0.5876090300538764,0.13102029401723095 -0.9960167510070388,0.6126492016759321 -0.22904500148506568,0.4317187957718132 0.36211298552602067,-0.09146105612235811 -0.9759797736569765,-0.6165126801293732 0.18142699007496443,-0.518454072884067 0.7857601408503241,0.6590730394272838 -0.5118524062072036,0.10231234837063125 0.06599484755864332,-0.9125759026163084 0.8905604212056506,-0.5469216044165577 -1.0285660669633698,0.38607245890985104 -0.5619980578074139,0.7403474763779649 0.33727174069865873,1.034876900997665 0.27407525143463646,0.43601825634185387 -0.45153438664053497,0.8280552293609089 0.8362826762619205,0.45387596341030667 -0.09418894804075939,0.9535681648429286 -0.2567700566463323,-0.8804012691517964 -0.28583391730490926,0.9426055544264509 -0.03362960069823995,-0.539572247822683 -0.1037396267786264,0.5555998131741026 -0.9643872823243382,0.09610789050122792 0.36935644279403274,-0.8966699917883852 0.7458729821179275,0.6813533807089754 -0.14184876992059392,-0.521841743327658 0.33124588576040126,-0.138824920968453 0.08714760688175001,-0.4271728521417989 -1.0513327390854184,0.46256749072516434 0.5893479236921118,-0.1888678232691976 0.5788759716250035,-0.8394426920734803 -0.933013963683661,-0.29516537272808596 0.5086535007198805,-0.2866537554607676 -0.9692668534942654,0.5061975161175142 -0.5328276291971281,0.7823323040239676 -0.9217136388307866,0.1313735785117146 -0.40406979191385334,0.43544178585219023 -0.4067151868802853,0.7510362977905335 -0.9864635306519217,0.3351121080246421 -0.5703947860590478,0.013757261500273864 -0.4914901197991216,-0.1777077120513563 0.8398814680746901,0.5037361278542494 0.6247357443776939,-0.9334887951112227 -0.9679679505416116,0.33188952062028787 0.6597678450335809,0.7060169788661986 -0.41774059704133504,0.24000335168294215 -0.2990377820128566,-0.21834637911706878 0.9952566385074013,0.1622244753255163 -0.31801170723338895,1.0851331583932677 -0.404789709953823,-0.09766326580278245 -0.65930601466402,-0.6521360918614213 0.43930167891835864,-0.3312296991560522 1.0192668930014706,0.04913791098874962 -0.39016644469512596,-0.8087585201768581 -0.054280868816785496,-1.0613630874053348 -0.9067189155663109,-0.1495186893957394 0.16770942232908803,0.421212515380306 -1.0433434750672557,0.059239035159299666 0.05943445131492384,0.44107676307083143 0.21995573932921547,0.9847478839856044 -0.7142018812095754,0.6063878003170229 -0.10711663183668428,0.43512605585549874 -0.46471275367378034,-0.12545421888003633 0.5176545513497237,-0.1064930040659019 0.9399135330027256,0.32454439984258054 0.683160107329799,-0.5592643021963657 -0.37982618308760857,0.02630168606580701 -0.4403066016512578,-0.7453305296283443 -0.8639562036024161,-0.370936217392039 -0.3634000255796373,1.104352634471847 -0.46607356497433305,-0.1722494722701516 -0.4324598729439077,-0.8699876605440724 -0.3774077725478204,0.30914189336576425 0.7734372069892316,0.2126214006502542 -0.13488509934689247,0.4750222281829011 -0.34249805037156467,0.4290934314330419 -0.332515953703242,0.3904095238684516 -0.18711507147399783,0.37818245612669205 -0.4019065222365251,-0.8607542537347073 0.01967962163007076,0.42646328114491683 0.9123223570962696,0.3749234799832767 -0.4725381478653645,-0.04061092659388703 -0.3571488674533796,0.9236370006691802 0.2718048441307173,0.2681838841791901 -0.09747869604231205,-1.0836761914072832 -0.3057913976217668,0.9734109653290065 0.525975939041422,-0.08321922050604946 0.2873901067762959,0.9258478095787808 0.4028154951214911,0.1619649367551107 0.6471527617590014,0.6628246827636484 -0.7725197585233375,0.7782705134127221 -0.9045113147434148,-0.3963862598362432 0.9422239650251897,-0.27402422465437165 -0.38879376217565664,0.059404418448781734 0.4135308925034162,0.4501152781307004 0.5219130527521878,0.18290729812635734 0.35931058358283424,-0.8471774455005006 0.24999409274952142,-0.40947045397879017 0.04454591655329928,-0.5829355092516588 -0.2749947213249698,-0.927127176304089 0.0677065524328374,0.9607337302048053 0.4520474622174612,0.21077530105548747 -0.9398328695851624,-0.12988746634568155 -0.6752052494581422,-0.651108717126316 -0.012752712672613242,-0.9888034777044296 0.5127656905014132,0.2788167777635829 -0.16699205027770447,-0.5250330614574951 -0.24112330289771242,0.4696207184731173 -0.9212717067922636,-0.35419100911564644 0.3862515964351605,-0.34651072962454665 -0.004559508002486494,-0.4862064394921664 0.05540232679339348,-0.9439978458646662 0.531235669394689,0.7945564092051391 -0.7010409881475659,0.719973547975449 0.4086785410051035,-0.003349117800603839 -0.5182302424020724,0.25535541613341994 0.877825258441639,0.435693144768315 -0.8865533022790029,0.5131520719700442 0.7986219954013896,0.6186270534897585 -0.4159693822164605,0.31657348656229833 -0.37672654218865165,-0.9141975842433028 0.91825997932632,-0.5692031204525406 0.010303545861572443,0.5405485427851331 -0.6274983068834641,-0.775859559178861 0.17912205697364092,-0.4237461791404885 0.9070690752725555,-0.20810135894992557 0.08047424124721375,0.5733388318623391 -0.7292621719209866,-0.21959643577361823 0.32454447530762026,0.8304783537522029 -0.5621289684177577,-0.7235474587528163 0.7082286072961878,-0.8456155885063508 0.9097484056293046,-0.24813285645094338 0.7899791730245955,0.530457252401472 0.4581955037177326,0.7315444405239956 0.11464385320627396,-0.5175396756868441 -0.9353893973410421,0.27628354644257086 0.3730261429230154,-0.1719549471647861 0.32328003835713637,0.42790636232819146 -0.6581860171733552,-0.8080437436134085 0.5299407558465055,-0.6511610280889729 -0.01767216944854167,0.49836725053362124 -0.23723462403256948,0.2385651117522939 -1.0306202034264922,-0.030358549900346834 -0.07427602907772096,0.5057801294718551 0.9658886186344339,-0.1839696011214987 0.6524566748559094,-0.7463230761245332 -0.8958305228582344,-0.4193900064310585 -0.5351916698730456,0.0018277533908535593 0.2886836982346829,0.9057451623940046 -0.9711288858464331,0.27741656197299347 -0.1265236778507134,0.48247458130257326 0.868677952225601,-0.515283200869523 0.9116914963370987,-0.17686561745308463 -0.8249415977199243,-0.47619561182185166 -0.8678043729736393,0.5245609563222245 0.9152206727793272,-0.3294459297468073 0.5209136973922057,0.7618202457129495 0.9175370420434311,0.6846402480732732 -0.3318933784802655,-0.5429127369198464 -0.3228050279983245,0.1817119207035938 0.5806661325943425,0.1535613686262304 -0.6943891334062174,0.597514978864269 -0.14836274653434273,0.5777969183018764 -0.3120514163005832,0.3379697581578297 -0.08324023048222384,0.5653358599299948 -0.6236139459944454,0.07707285088061441 -0.19474229933008502,-0.2723791117035379 -1.0964018834918035,0.0967731555623242 -0.951619025627734,0.48208628116311153 -0.5626316341485967,1.0356783881386273 0.675732690007578,0.6864249981232644 -0.78445480859867,0.590694952753727 0.9096737174266027,0.38707302357336526 0.2493042082972942,0.4362248498898234 0.5339441839754818,0.126350925359421 -0.4336279856956844,-0.20492740568525525 0.06241758635639284,0.9982531502526226 -0.8505739829885182,-0.5017513963251689 0.4896373743616472,0.350139843675366 0.401510474123803,0.47861919472424885 0.6453930091429755,-0.8101629753960268 0.2518801313265028,0.5152407999403616 0.5198978625764599,0.22445149043513254 -0.13896993109704514,-0.893762541311697 -0.6839988358343277,-0.8241429852318991 0.6896844387094905,-0.9171322379582705 -0.018058660850644837,1.0867317016844733 0.9581115907421452,0.23778817034433947 1.065657801944628,-0.18722839061195373 0.7495087800261524,0.7995760727751848 0.14372137077224806,-0.8071270326861059 0.5892354504692613,0.2598664554414738 -0.07648137942136227,0.4713983037922881 -0.5691818485443167,-0.8165965052488681 -0.27688349631108183,-0.4271076190843389 0.4698491396101956,-0.37077746729934724 -0.43790399443417716,-0.11429513818516232 -0.3013400827440534,0.3719774658136155 0.7189386973791765,-0.8036258954775898 0.41943584834647274,0.16416772554216336 -0.2845799164858944,0.48271914142248934 0.30337356704512863,-0.4405959027701863 -0.4774181049740365,-0.2673454698575085 0.20668346056328746,0.4086024472369887 0.24388509820161347,0.11046421900252626 -0.1758616455348633,0.8792870342538996 0.41988505470545995,-0.31725197260025073 0.5991715166730222,-0.7565035606537661 -0.12142656840001856,-0.3832162142878519 -0.5053328354739859,0.12220563798005817 -0.9282468297658448,0.34020463431837755 0.4695417234865105,-0.08240363383411979 -0.9906796771313714,0.162728970667304 -0.41637581602841045,0.26962904740591637 -0.32608250847081494,0.9388327313597491 -0.27741441806790534,-0.4156100245429923 0.5620502578944575,-0.3398182607095208 -0.9677165384294093,-0.4097593595804705 0.8760491982994245,0.30728819176785477 0.33874400394256066,-0.11080312272967537 -0.032591370236060145,-0.48960962419559045 0.5794077310679605,0.11166579240349282 0.5495025010357477,0.10967768230543753 -0.3503683225271275,-0.44772871175210555 -0.5126563264780427,0.4014364946560648 -0.40354286770189296,-0.23659769418441168 -0.0488900234410143,0.4633568811477356 -0.2124726740194857,-0.6102569400116281 -1.0752906953060168,-0.07312207172566837 0.44519347123140507,-0.029585590821374366 -0.060200066660610285,0.9491757015440506 0.45646094809610366,0.21380764666888724 0.4637140436592558,0.2830005033992875 -0.3684272579472403,-0.38631238193555645 -0.5150419868073974,-0.4286258424918744 -0.43472384337514974,0.7504423308642552 -0.027926225368791198,-0.5089185654417928 -0.20513042151172778,0.9840881613578055 0.8268141934656339,-0.11038501739416157 -0.46401343324337047,-0.9360331411156992 0.20765879585661853,-0.33090995097962844 -0.7651959913656242,-0.7037637390432254 0.1401349376450489,-0.5114466497102617 -0.5353178168381143,0.7382200519882536 -0.30523629117612544,0.4339327043127625 0.41628092997373256,0.8685141498307223 0.12321645158203892,-0.6063258433943441 -0.10586854346569731,-0.9204866856447135 -0.3745378552393598,-0.23181739721113465 0.9637066660616821,-0.42631599699799066 0.9818801171919108,-0.18415084527497516 -0.020159176592507946,0.5602766622796881 -0.37373516718842387,-0.08853553976848685 -0.4595342416837214,-0.15044114371766792 0.577150716527892,-0.6397292742310804 -1.0008707962267067,-0.14102640298687985 -0.7199330240264394,0.6707094264537493 0.09752168857107471,1.0337724265318775 0.9031862543748955,-0.2174087374572961 0.9496104948805995,-0.5088741341628038 0.6839024915739618,-0.830027794019837 0.3070654338705196,0.4589870715747382 0.338038132718353,-0.31671455404775434 0.9320353071003498,0.1257405903483963 0.23073184577919917,-0.40990188053269117 -0.0003044099313824905,0.9845251910719187 -1.013112119599334,0.15399018622981867 -1.0254128024516875,-0.05499327719851769 0.1420397850203173,-0.5252072546364881 0.0911264181972598,0.4284227308623113 -0.4368183745934743,0.3871929073031755 -0.3605329257914988,1.0532310967332992 -0.7623567559412663,0.7354803450367904 0.39765601234676856,1.0114615999721448 0.18157170282281765,-0.3839483951193683 -1.1779001893768763,0.22327296489810827 -0.18391953719060553,0.5167857590464651 -0.9632344557440297,-0.37343380811848115 0.2670959491447908,0.3790595922602033 -0.9112900122985277,0.24629485415621138 0.9241019792224805,0.6750741183861587 -0.1956120492121439,-0.3499027312755772 0.4763670007115128,-0.08396333549977225 0.4206895212731797,-0.3231049077008083 -0.3594419157539056,0.4550878671911299 0.08610130516509465,-0.45808942166487476 0.9648728817485887,0.13860067848607824 -0.020437399285161216,-1.136283376691147 -0.5396595581133179,0.24035569862360065 0.5662426493589651,0.6564798189985738 0.20836453864475565,-0.40737692438520123 -0.28752937811597135,0.559923571402364 0.31122343974358946,-0.355724807517385 0.7684071371301983,-0.43193089634630927 0.20070187814587984,0.37382805628115806 0.00027185226382153704,0.8528153972653477 0.9562680429733982,0.31346831031508715 -0.34124021589525744,0.4072314477140854 -0.25997755136074324,-0.8555280035698538 -0.7330968809503283,0.6495754444986244 0.43440270289056415,-0.7199606985122708 0.13409839728638273,0.5674931249300522 0.5691132069745215,-0.05845847383088684 0.7564951986280338,-0.6306522452279231 0.315420911805392,0.3738174074884045 -0.2867713420568993,1.0129030395576466 0.16666983671191557,0.44926914769117904 -0.41265464327498813,-0.9106096634601865 0.5030813809416231,-0.2875085762742861 0.5569410527094143,0.19436995753984762 -0.3084778073509184,-0.3645227992835511 0.15962973259057123,0.9843509503234547 -0.7482496427783087,-0.6309146006994942 -0.19440524182522173,-0.44594696883704377 0.44688684822993296,-0.8696062912082978 0.30068848578127527,-0.505225205210269 -0.4314698206294684,-0.43872354948581926 0.35994679948944436,-0.9135646710489602 0.5488171138655524,-0.8879203377898214 -0.43768537054948076,-0.86167957463104 -0.2564515462138911,0.42966463540871275 0.4112435969277164,-0.8638497431076824 0.9395797798902269,-0.3765851855738564 -0.3821907430937799,0.12399385369073652 -0.11635534184124138,-0.6091843066107713 0.09525734089897758,0.933299460107712 ================================================ FILE: 02_Python/data/cron_jobs_schedule.csv ================================================ job_id,day,hour,capacity 1,0,1,1 2,0,1,1 3,0,2,2 4,0,3,2 5,0,4,2 6,0,4,2 7,0,5,4 8,0,7,4 9,0,7,4 10,0,8,2 11,0,8,2 12,0,8,2 13,0,9,6 14,0,10,1 15,0,10,1 16,0,11,2 17,0,12,4 18,0,13,1 19,0,13,1 20,0,13,4 21,0,14,4 22,0,14,4 23,0,15,2 24,0,15,2 25,0,16,2 26,0,16,2 27,0,16,4 28,0,16,2 29,0,17,6 30,0,18,2 31,0,18,2 32,0,18,2 33,0,20,4 34,0,20,4 35,0,21,1 36,0,21,1 37,0,21,2 38,0,22,4 39,0,22,2 40,0,22,2 41,0,23,2 42,0,23,2 43,0,23,2 44,1,1,6 45,1,2,6 46,1,2,2 47,1,3,2 48,1,4,6 49,1,4,2 50,1,5,4 51,1,7,4 52,1,7,4 53,1,8,2 54,1,8,2 55,1,8,1 56,1,8,1 57,1,10,1 58,1,10,1 59,1,11,2 60,1,12,4 61,1,13,1 62,1,13,1 63,1,13,4 64,1,14,4 65,1,14,4 66,1,15,2 67,1,15,2 68,1,16,1 69,1,16,1 70,1,16,4 71,1,17,2 72,1,17,6 73,1,18,2 74,1,18,2 75,1,18,2 76,1,20,1 77,1,20,1 78,1,21,1 79,1,21,1 80,1,21,2 81,1,22,4 82,1,22,2 83,1,22,2 84,1,23,2 85,1,23,1 86,1,23,1 87,2,2,1 88,2,2,1 89,2,2,2 90,2,3,2 91,2,4,6 92,2,4,2 93,2,5,6 94,2,7,2 95,2,7,2 96,2,8,1 97,2,8,1 98,2,8,4 99,2,8,4 100,2,10,2 101,2,10,2 102,2,11,2 103,2,12,4 104,2,13,1 105,2,13,1 106,2,13,4 107,2,14,4 108,2,14,4 109,2,15,2 110,2,15,2 111,2,16,2 112,2,16,2 113,2,16,2 114,2,17,2 115,2,17,4 116,2,18,2 117,2,18,2 118,2,18,2 119,2,20,2 120,2,20,2 121,2,21,1 122,2,21,1 123,2,21,2 124,2,22,2 125,2,22,1 126,2,22,1 127,2,22,2 128,2,23,2 129,2,23,2 130,3,0,6 131,3,2,6 132,3,2,2 133,3,3,6 134,3,4,2 135,3,4,6 136,3,5,4 137,3,7,4 138,3,7,4 139,3,8,2 140,3,8,2 141,3,8,1 142,3,8,1 143,3,10,2 144,3,10,2 145,3,11,6 146,3,12,6 147,3,13,1 148,3,13,1 149,3,13,6 150,3,14,4 151,3,14,4 152,3,15,2 153,3,15,2 154,3,16,2 155,3,16,1 156,3,16,2 157,3,16,1 158,3,17,6 159,3,18,2 160,3,18,2 161,3,18,2 162,3,20,4 163,3,20,4 164,3,21,1 165,3,21,1 166,3,21,2 167,3,22,4 168,3,22,2 169,3,22,2 170,3,23,1 171,3,23,2 172,3,23,1 173,4,0,1 174,4,0,1 175,4,1,2 176,4,3,2 177,4,4,2 178,4,4,2 179,4,5,4 180,4,7,4 181,4,7,4 182,4,8,2 183,4,8,2 184,4,8,1 185,4,8,1 186,4,10,1 187,4,10,1 188,4,11,2 189,4,12,4 190,4,13,1 191,4,13,1 192,4,13,6 193,4,14,4 194,4,14,4 195,4,15,6 196,4,15,2 197,4,16,1 198,4,16,1 199,4,16,1 200,4,16,1 201,4,17,2 202,4,18,2 203,4,18,2 204,4,18,2 205,4,20,1 206,4,20,2 207,4,20,1 208,4,21,2 209,4,21,2 210,4,22,4 211,4,22,2 212,4,22,2 213,4,23,2 214,4,23,4 215,4,23,2 ================================================ FILE: 02_Python/data/graph.in ================================================ -----###E- -------#-- --#-#--#-- --#-##S#-- --#--###-- --#----#-- --#---##-- --#--##--- --####---- ---------- ================================================ FILE: 02_Python/data/ipl.csv ================================================ one,two 0.22767982399693698,0.8582041480574577 0.9791882160551239,0.07715064988053028 0.504576604695406,0.5531144137299899 0.058132400743383585,0.52809798025712 0.7753430178214513,0.2179216898195512 0.5504238310550534,0.4708598154998745 0.04578653961976978,0.9185789498889001 0.5857699421693808,0.05803225463485838 0.7090721735923948,0.5818736617699065 0.018503930375096615,0.8865229185953829 0.8860650735174704,0.2395640162180548 0.6036387317795797,0.665583852216638 0.06942298413661226,0.858127672145648 0.6047387405995206,0.2781095847447219 0.7589891224957259,0.5120267751911348 0.08497507872469842,0.9911224601360906 0.6442858551230015,0.10730211335716414 0.6033125864818462,0.5364792610891768 0.0356326816753208,0.5874738213240243 0.6007179456626193,0.04656070021470395 0.6434305051145501,0.46461982084514997 0.005591057423835321,0.7325276954580224 0.6575004481350551,0.05025199077912135 0.6119056619160002,0.4952656410930785 0.013445197916278915,0.5016854306552392 0.7435273458440346,0.06386612295413036 0.6464662016389027,0.7148365185160322 0.2944081925357683,0.6986518421938682 0.9202207766123844,0.22637577124261393 0.6086795437566336,0.4786324767901295 0.0017518581090074316,0.5717931915621521 0.5077758503070033,0.2952284046764161 0.7791374916271712,0.49180666903860926 0.3078314950916783,0.8873374005146625 0.7581289957252834,0.19708612067771564 0.5486059364923573,0.5077936048016689 0.07527233079788495,0.522245376009042 0.5331128659173083,0.2143938721367786 0.4675014929645063,0.5271035868712899 0.18676781644394796,0.5070094980570479 0.8420132419188935,0.21490523432247818 0.642154431128747,0.6348127382396339 0.052001937496261946,0.9359277170660035 0.8148348297937917,0.16192163973622503 0.6943799683926528,0.5570759898576467 0.06508554149897222,0.9578825575349748 0.526030561477054,0.11168162286789401 0.5032780595784369,0.7508359873017096 0.1434226030623043,0.6911550271957625 0.8631445582912479,0.06988288031897169 0.6640990534886784,0.7730624203184077 0.09883778157876079,0.6261103580685701 0.7099346165895388,0.17850561972937623 0.6990012632919802,0.5981535368819337 0.2836900068227715,0.800106866601715 0.9350250628933433,0.16491007875502797 0.5710043090859719,0.6327473536908004 0.2188560796324386,0.9112905730514449 0.6294583790577973,0.27098231721904953 0.711909882692649,0.45341554453235267 0.2132610762251217,0.673521946268582 0.8092292788993549,0.29198518492616304 0.6893207764833285,0.6687151469112381 0.007126439690630053,0.9255992747515998 0.5616420089530748,0.15084239574623537 0.6222060261235629,0.5617219107848401 0.25948656499836426,0.563451806372046 0.5118871824449225,0.0005155650075597518 0.4692706390762479,0.5100323609510921 0.15755852023930098,0.7983291110557653 0.704470781180232,0.26733186354144606 0.5463181510428853,0.5171059613482747 0.11119696467025533,0.8096091807601442 0.5625437902157645,0.16666468289016856 0.4915519993039712,0.6398784074491172 0.16583790552093025,0.8614262570137948 0.8337721936021407,0.027733937152207035 0.5231896001098805,0.46037966005528497 0.2650083577810597,0.5980176200194074 0.5812853381010545,0.22865029666825695 0.5221046626094096,0.7215891408793452 0.060121371203491425,0.8400569038052936 0.8711799609358672,0.11348520558105879 0.5068205670603647,0.5525489511568009 0.07123126486775308,0.610044742146314 0.6862034914064209,0.23187687966148002 0.775153374890182,0.5331614170965996 ================================================ FILE: 02_Python/data/iris.csv ================================================ 5.1,3.5,1.4,0.2,Iris-setosa 4.9,3.0,1.4,0.2,Iris-setosa 4.7,3.2,1.3,0.2,Iris-setosa 4.6,3.1,1.5,0.2,Iris-setosa 5.0,3.6,1.4,0.2,Iris-setosa 5.4,3.9,1.7,0.4,Iris-setosa 4.6,3.4,1.4,0.3,Iris-setosa 5.0,3.4,1.5,0.2,Iris-setosa 4.4,2.9,1.4,0.2,Iris-setosa 4.9,3.1,1.5,0.1,Iris-setosa 5.4,3.7,1.5,0.2,Iris-setosa 4.8,3.4,1.6,0.2,Iris-setosa 4.8,3.0,1.4,0.1,Iris-setosa 4.3,3.0,1.1,0.1,Iris-setosa 5.8,4.0,1.2,0.2,Iris-setosa 5.7,4.4,1.5,0.4,Iris-setosa 5.4,3.9,1.3,0.4,Iris-setosa 5.1,3.5,1.4,0.3,Iris-setosa 5.7,3.8,1.7,0.3,Iris-setosa 5.1,3.8,1.5,0.3,Iris-setosa 5.4,3.4,1.7,0.2,Iris-setosa 5.1,3.7,1.5,0.4,Iris-setosa 4.6,3.6,1.0,0.2,Iris-setosa 5.1,3.3,1.7,0.5,Iris-setosa 4.8,3.4,1.9,0.2,Iris-setosa 5.0,3.0,1.6,0.2,Iris-setosa 5.0,3.4,1.6,0.4,Iris-setosa 5.2,3.5,1.5,0.2,Iris-setosa 5.2,3.4,1.4,0.2,Iris-setosa 4.7,3.2,1.6,0.2,Iris-setosa 4.8,3.1,1.6,0.2,Iris-setosa 5.4,3.4,1.5,0.4,Iris-setosa 5.2,4.1,1.5,0.1,Iris-setosa 5.5,4.2,1.4,0.2,Iris-setosa 4.9,3.1,1.5,0.1,Iris-setosa 5.0,3.2,1.2,0.2,Iris-setosa 5.5,3.5,1.3,0.2,Iris-setosa 4.9,3.1,1.5,0.1,Iris-setosa 4.4,3.0,1.3,0.2,Iris-setosa 5.1,3.4,1.5,0.2,Iris-setosa 5.0,3.5,1.3,0.3,Iris-setosa 4.5,2.3,1.3,0.3,Iris-setosa 4.4,3.2,1.3,0.2,Iris-setosa 5.0,3.5,1.6,0.6,Iris-setosa 5.1,3.8,1.9,0.4,Iris-setosa 4.8,3.0,1.4,0.3,Iris-setosa 5.1,3.8,1.6,0.2,Iris-setosa 4.6,3.2,1.4,0.2,Iris-setosa 5.3,3.7,1.5,0.2,Iris-setosa 5.0,3.3,1.4,0.2,Iris-setosa 7.0,3.2,4.7,1.4,Iris-versicolor 6.4,3.2,4.5,1.5,Iris-versicolor 6.9,3.1,4.9,1.5,Iris-versicolor 5.5,2.3,4.0,1.3,Iris-versicolor 6.5,2.8,4.6,1.5,Iris-versicolor 5.7,2.8,4.5,1.3,Iris-versicolor 6.3,3.3,4.7,1.6,Iris-versicolor 4.9,2.4,3.3,1.0,Iris-versicolor 6.6,2.9,4.6,1.3,Iris-versicolor 5.2,2.7,3.9,1.4,Iris-versicolor 5.0,2.0,3.5,1.0,Iris-versicolor 5.9,3.0,4.2,1.5,Iris-versicolor 6.0,2.2,4.0,1.0,Iris-versicolor 6.1,2.9,4.7,1.4,Iris-versicolor 5.6,2.9,3.6,1.3,Iris-versicolor 6.7,3.1,4.4,1.4,Iris-versicolor 5.6,3.0,4.5,1.5,Iris-versicolor 5.8,2.7,4.1,1.0,Iris-versicolor 6.2,2.2,4.5,1.5,Iris-versicolor 5.6,2.5,3.9,1.1,Iris-versicolor 5.9,3.2,4.8,1.8,Iris-versicolor 6.1,2.8,4.0,1.3,Iris-versicolor 6.3,2.5,4.9,1.5,Iris-versicolor 6.1,2.8,4.7,1.2,Iris-versicolor 6.4,2.9,4.3,1.3,Iris-versicolor 6.6,3.0,4.4,1.4,Iris-versicolor 6.8,2.8,4.8,1.4,Iris-versicolor 6.7,3.0,5.0,1.7,Iris-versicolor 6.0,2.9,4.5,1.5,Iris-versicolor 5.7,2.6,3.5,1.0,Iris-versicolor 5.5,2.4,3.8,1.1,Iris-versicolor 5.5,2.4,3.7,1.0,Iris-versicolor 5.8,2.7,3.9,1.2,Iris-versicolor 6.0,2.7,5.1,1.6,Iris-versicolor 5.4,3.0,4.5,1.5,Iris-versicolor 6.0,3.4,4.5,1.6,Iris-versicolor 6.7,3.1,4.7,1.5,Iris-versicolor 6.3,2.3,4.4,1.3,Iris-versicolor 5.6,3.0,4.1,1.3,Iris-versicolor 5.5,2.5,4.0,1.3,Iris-versicolor 5.5,2.6,4.4,1.2,Iris-versicolor 6.1,3.0,4.6,1.4,Iris-versicolor 5.8,2.6,4.0,1.2,Iris-versicolor 5.0,2.3,3.3,1.0,Iris-versicolor 5.6,2.7,4.2,1.3,Iris-versicolor 5.7,3.0,4.2,1.2,Iris-versicolor 5.7,2.9,4.2,1.3,Iris-versicolor 6.2,2.9,4.3,1.3,Iris-versicolor 5.1,2.5,3.0,1.1,Iris-versicolor 5.7,2.8,4.1,1.3,Iris-versicolor ================================================ FILE: 02_Python/data/logistic_regression_data.txt ================================================ 0.051267,0.69956,1 -0.092742,0.68494,1 -0.21371,0.69225,1 -0.375,0.50219,1 -0.51325,0.46564,1 -0.52477,0.2098,1 -0.39804,0.034357,1 -0.30588,-0.19225,1 0.016705,-0.40424,1 0.13191,-0.51389,1 0.38537,-0.56506,1 0.52938,-0.5212,1 0.63882,-0.24342,1 0.73675,-0.18494,1 0.54666,0.48757,1 0.322,0.5826,1 0.16647,0.53874,1 -0.046659,0.81652,1 -0.17339,0.69956,1 -0.47869,0.63377,1 -0.60541,0.59722,1 -0.62846,0.33406,1 -0.59389,0.005117,1 -0.42108,-0.27266,1 -0.11578,-0.39693,1 0.20104,-0.60161,1 0.46601,-0.53582,1 0.67339,-0.53582,1 -0.13882,0.54605,1 -0.29435,0.77997,1 -0.26555,0.96272,1 -0.16187,0.8019,1 -0.17339,0.64839,1 -0.28283,0.47295,1 -0.36348,0.31213,1 -0.30012,0.027047,1 -0.23675,-0.21418,1 -0.06394,-0.18494,1 0.062788,-0.16301,1 0.22984,-0.41155,1 0.2932,-0.2288,1 0.48329,-0.18494,1 0.64459,-0.14108,1 0.46025,0.012427,1 0.6273,0.15863,1 0.57546,0.26827,1 0.72523,0.44371,1 0.22408,0.52412,1 0.44297,0.67032,1 0.322,0.69225,1 0.13767,0.57529,1 -0.0063364,0.39985,1 -0.092742,0.55336,1 -0.20795,0.35599,1 -0.20795,0.17325,1 -0.43836,0.21711,1 -0.21947,-0.016813,1 -0.13882,-0.27266,1 0.18376,0.93348,0 0.22408,0.77997,0 0.29896,0.61915,0 0.50634,0.75804,0 0.61578,0.7288,0 0.60426,0.59722,0 0.76555,0.50219,0 0.92684,0.3633,0 0.82316,0.27558,0 0.96141,0.085526,0 0.93836,0.012427,0 0.86348,-0.082602,0 0.89804,-0.20687,0 0.85196,-0.36769,0 0.82892,-0.5212,0 0.79435,-0.55775,0 0.59274,-0.7405,0 0.51786,-0.5943,0 0.46601,-0.41886,0 0.35081,-0.57968,0 0.28744,-0.76974,0 0.085829,-0.75512,0 0.14919,-0.57968,0 -0.13306,-0.4481,0 -0.40956,-0.41155,0 -0.39228,-0.25804,0 -0.74366,-0.25804,0 -0.69758,0.041667,0 -0.75518,0.2902,0 -0.69758,0.68494,0 -0.4038,0.70687,0 -0.38076,0.91886,0 -0.50749,0.90424,0 -0.54781,0.70687,0 0.10311,0.77997,0 0.057028,0.91886,0 -0.10426,0.99196,0 -0.081221,1.1089,0 0.28744,1.087,0 0.39689,0.82383,0 0.63882,0.88962,0 0.82316,0.66301,0 0.67339,0.64108,0 1.0709,0.10015,0 -0.046659,-0.57968,0 -0.23675,-0.63816,0 -0.15035,-0.36769,0 -0.49021,-0.3019,0 -0.46717,-0.13377,0 -0.28859,-0.060673,0 -0.61118,-0.067982,0 -0.66302,-0.21418,0 -0.59965,-0.41886,0 -0.72638,-0.082602,0 -0.83007,0.31213,0 -0.72062,0.53874,0 -0.59389,0.49488,0 -0.48445,0.99927,0 -0.0063364,0.99927,0 0.63265,-0.030612,0 ================================================ FILE: 02_Python/data/titanic-subset.csv ================================================ pclass,sex,embarked,survived 1,female,S,1 1,male,S,1 2,female,S,0 1,male,S,0 2,female,S,0 1,male,S,1 1,female,S,1 1,male,S,0 1,female,S,1 1,male,C,0 1,male,C,0 1,female,C,1 1,female,C,1 1,female,S,1 1,male,S,0 1,male,S,0 1,male,C,0 1,female,C,1 1,female,C,1 1,male,C,0 1,male,S,0 1,female,S,1 1,male,C,1 1,female,C,1 1,female,S,1 1,male,C,0 1,male,C,1 1,female,C,1 1,female,S,1 1,male,S,1 2,male,S,0 1,male,C,1 1,female,S,1 1,female,S,1 2,male,S,0 1,female,C,1 2,female,S,0 1,male,S,1 1,male,S,0 1,male,C,0 1,male,C,0 1,female,C,1 1,female,S,1 1,female,C,1 1,female,C,1 1,male,S,0 2,male,S,0 1,male,S,1 2,female,C,0 1,male,C,1 1,female,C,1 2,male,S,0 1,male,S,0 1,male,S,0 1,male,S,1 1,female,S,1 1,male,S,1 2,female,S,0 2,male,S,0 1,female,C,1 2,male,S,0 1,female,S,1 1,male,S,0 1,female,S,1 1,male,S,1 2,female,S,1 1,female,C,1 1,female,S,1 1,male,C,0 1,female,S,1 2,male,S,0 1,male,C,0 1,female,C,1 1,female,S,1 1,male,S,0 1,male,S,0 1,female,C,1 1,male,C,0 1,female,C,1 1,female,S,1 1,male,S,0 1,male,S,0 1,female,S,1 1,female,S,1 1,male,C,0 1,female,C,1 1,male,S,1 1,male,S,1 1,female,S,1 1,male,S,0 1,female,S,1 1,male,S,1 1,female,S,1 1,male,S,1 1,male,S,1 1,female,S,1 1,male,C,0 1,female,C,1 1,female,C,1 ================================================ FILE: 02_Python/data/titanic.csv ================================================ pclass,sex,age,embarked,sibsp,parch,survived 1,female,29,0,0,S,1 1,male,0.9167,1,2,S,1 1,female,2,1,2,S,0 1,male,30,1,2,S,0 1,female,25,1,2,S,0 1,male,48,0,0,S,1 1,female,63,1,0,S,1 1,male,39,0,0,S,0 1,female,53,2,0,S,1 1,male,71,0,0,C,0 1,male,47,1,0,C,0 1,female,18,1,0,C,1 1,female,24,0,0,C,1 1,female,26,0,0,S,1 1,male,80,0,0,S,1 1,male,,0,0,S,0 1,male,24,0,1,C,0 1,female,50,0,1,C,1 1,female,32,0,0,C,1 1,male,36,0,0,C,0 1,male,37,1,1,S,1 1,female,47,1,1,S,1 1,male,26,0,0,C,1 1,female,42,0,0,C,1 1,female,29,0,0,S,1 1,male,25,0,0,C,0 1,male,25,1,0,C,1 1,female,19,1,0,C,1 1,female,35,0,0,S,1 1,male,28,0,0,S,1 1,male,45,0,0,S,0 1,male,40,0,0,C,1 1,female,30,0,0,S,1 1,female,58,0,0,S,1 1,male,42,0,0,S,0 1,female,45,0,0,C,1 1,female,22,0,1,S,1 1,male,,0,0,S,1 1,male,41,0,0,S,0 1,male,48,0,0,C,0 1,male,,0,0,C,0 1,female,44,0,0,C,1 1,female,59,2,0,S,1 1,female,60,0,0,C,1 1,female,41,0,0,C,1 1,male,45,0,0,S,0 1,male,,0,0,S,0 1,male,42,0,0,S,1 1,female,53,0,0,C,1 1,male,36,0,1,C,1 1,female,58,0,1,C,1 1,male,33,0,0,S,0 1,male,28,0,0,S,0 1,male,17,0,0,S,0 1,male,11,1,2,S,1 1,female,14,1,2,S,1 1,male,36,1,2,S,1 1,female,36,1,2,S,1 1,male,49,0,0,S,0 1,female,,0,0,C,1 1,male,36,1,0,S,0 1,female,76,1,0,S,1 1,male,46,1,0,S,0 1,female,47,1,0,S,1 1,male,27,1,0,S,1 1,female,33,1,0,S,1 1,female,36,0,0,C,1 1,female,30,0,0,S,1 1,male,45,0,0,C,1 1,female,,0,1,S,1 1,male,,0,0,S,0 1,male,27,1,0,C,0 1,female,26,1,0,C,1 1,female,22,0,0,S,1 1,male,,0,0,S,0 1,male,47,0,0,S,0 1,female,39,1,1,C,1 1,male,37,1,1,C,0 1,female,64,0,2,C,1 1,female,55,2,0,S,1 1,male,,0,0,S,0 1,male,70,1,1,S,0 1,female,36,0,2,S,1 1,female,64,1,1,S,1 1,male,39,1,0,C,0 1,female,38,1,0,C,1 1,male,51,0,0,S,1 1,male,27,0,0,S,1 1,female,33,0,0,S,1 1,male,31,1,0,S,0 1,female,27,1,2,S,1 1,male,31,1,0,S,1 1,female,17,1,0,S,1 1,male,53,1,1,S,1 1,male,4,0,2,S,1 1,female,54,1,1,S,1 1,male,50,1,0,C,0 1,female,27,1,1,C,1 1,female,48,1,0,C,1 1,female,48,1,0,C,1 1,male,49,1,0,C,1 1,male,39,0,0,C,0 1,female,23,0,1,C,1 1,female,38,0,0,C,1 1,female,54,1,0,C,1 1,female,36,0,0,C,0 1,male,,0,0,S,0 1,female,,0,0,S,1 1,female,,0,0,C,1 1,male,36,0,0,S,1 1,male,30,0,0,C,0 1,female,24,3,2,S,1 1,female,28,3,2,S,1 1,female,23,3,2,S,1 1,male,19,3,2,S,0 1,male,64,1,4,S,0 1,female,60,1,4,S,1 1,female,30,0,0,C,1 1,male,,0,0,S,0 1,male,50,2,0,S,1 1,male,43,1,0,C,1 1,female,,1,0,S,1 1,female,22,0,2,C,1 1,male,60,1,1,C,1 1,female,48,1,1,C,1 1,male,,0,0,S,0 1,male,37,1,0,S,0 1,female,35,1,0,S,1 1,male,47,0,0,S,0 1,female,35,0,0,C,1 1,female,22,0,1,C,1 1,female,45,0,1,C,1 1,male,24,0,0,C,0 1,male,49,1,0,C,1 1,female,,1,0,C,1 1,male,71,0,0,C,0 1,male,53,0,0,C,1 1,female,19,0,0,S,1 1,male,38,0,1,S,0 1,female,58,0,1,S,1 1,male,23,0,1,C,1 1,female,45,0,1,C,1 1,male,46,0,0,C,0 1,male,25,1,0,C,1 1,female,25,1,0,C,1 1,male,48,1,0,C,1 1,female,49,1,0,C,1 1,male,,0,0,S,0 1,male,45,1,0,S,0 1,female,35,1,0,S,1 1,male,40,0,0,S,0 1,male,27,0,0,C,1 1,male,,0,0,S,1 1,female,24,0,0,C,1 1,male,55,1,1,S,0 1,female,52,1,1,S,1 1,male,42,0,0,S,0 1,male,,0,0,S,0 1,male,55,0,0,S,0 1,female,16,0,1,C,1 1,female,44,0,1,C,1 1,female,51,1,0,S,1 1,male,42,1,0,S,0 1,female,35,1,0,S,1 1,male,35,0,0,C,1 1,male,38,1,0,S,1 1,male,,0,0,C,0 1,female,35,1,0,S,1 1,female,38,0,0,,1 1,female,50,0,0,C,0 1,male,49,0,0,S,1 1,male,46,0,0,S,0 1,male,50,0,0,S,0 1,male,32.5,0,0,C,0 1,male,58,0,0,C,0 1,male,41,1,0,S,0 1,female,,1,0,S,1 1,male,42,1,0,S,1 1,female,45,1,0,S,1 1,male,,0,0,S,0 1,female,39,0,0,S,1 1,female,49,0,0,S,1 1,female,30,0,0,C,1 1,male,35,0,0,C,1 1,male,,0,0,C,0 1,male,42,0,0,S,0 1,female,55,0,0,C,1 1,female,16,0,1,S,1 1,female,51,0,1,S,1 1,male,29,0,0,S,0 1,female,21,0,0,S,1 1,male,30,0,0,S,0 1,female,58,0,0,C,1 1,female,15,0,1,S,1 1,male,30,0,0,S,0 1,female,16,0,0,S,1 1,male,,0,0,C,1 1,male,19,1,0,S,0 1,female,18,1,0,S,1 1,female,24,0,0,C,1 1,male,46,0,0,C,0 1,male,54,0,0,S,0 1,male,36,0,0,S,1 1,male,28,1,0,C,0 1,female,,1,0,C,1 1,male,65,0,0,S,0 1,male,44,2,0,Q,0 1,female,33,1,0,Q,1 1,female,37,1,0,Q,1 1,male,30,1,0,C,1 1,male,55,0,0,S,0 1,male,47,0,0,S,0 1,male,37,0,1,C,0 1,female,31,1,0,C,1 1,female,23,1,0,C,1 1,male,58,0,2,C,0 1,female,19,0,2,S,1 1,male,64,0,0,S,0 1,female,39,0,0,C,1 1,male,,0,0,C,1 1,female,22,0,1,C,1 1,male,65,0,1,C,0 1,male,28.5,0,0,C,0 1,male,,0,0,S,0 1,male,45.5,0,0,S,0 1,male,23,0,0,S,0 1,male,29,1,0,S,0 1,female,22,1,0,S,1 1,male,18,1,0,C,0 1,female,17,1,0,C,1 1,female,30,0,0,S,1 1,male,52,0,0,S,1 1,male,47,0,0,S,0 1,female,56,0,1,C,1 1,male,38,0,0,S,0 1,male,,0,0,S,1 1,male,22,0,0,C,0 1,male,,0,0,C,0 1,female,43,0,1,S,1 1,male,31,0,0,S,0 1,male,45,0,0,S,1 1,male,,0,0,S,0 1,female,33,0,0,C,1 1,male,46,0,0,C,0 1,male,36,0,0,C,0 1,female,33,0,0,S,1 1,male,55,1,0,C,0 1,female,54,1,0,C,1 1,male,33,0,0,S,0 1,male,13,2,2,C,1 1,female,18,2,2,C,1 1,female,21,2,2,C,1 1,male,61,1,3,C,0 1,female,48,1,3,C,1 1,male,,0,0,S,1 1,female,24,0,0,C,1 1,male,,0,0,S,1 1,female,35,1,0,C,1 1,female,30,0,0,C,1 1,male,34,0,0,S,1 1,female,40,0,0,S,1 1,male,35,0,0,S,1 1,male,50,1,0,S,0 1,female,39,1,0,S,1 1,male,56,0,0,C,1 1,male,28,0,0,S,1 1,male,56,0,0,S,0 1,male,56,0,0,C,0 1,male,24,1,0,S,0 1,male,,0,0,S,0 1,female,18,1,0,S,1 1,male,24,1,0,S,1 1,female,23,1,0,S,1 1,male,6,0,2,C,1 1,male,45,1,1,C,1 1,female,40,1,1,C,1 1,male,57,1,0,C,0 1,female,,1,0,C,1 1,male,32,0,0,C,1 1,male,62,0,0,S,0 1,male,54,1,0,C,1 1,female,43,1,0,C,1 1,female,52,1,0,C,1 1,male,,0,0,C,0 1,female,62,0,0,,1 1,male,67,1,0,S,0 1,female,63,1,0,S,0 1,male,61,0,0,S,0 1,female,48,0,0,S,1 1,female,18,0,2,S,1 1,male,52,1,1,S,0 1,female,39,1,1,S,1 1,male,48,1,0,S,1 1,female,,1,0,S,1 1,male,49,1,1,C,0 1,male,17,0,2,C,1 1,female,39,1,1,C,1 1,female,,0,0,C,1 1,male,31,0,0,C,1 1,male,40,0,0,C,0 1,male,61,0,0,S,0 1,male,47,0,0,S,0 1,female,35,0,0,C,1 1,male,64,1,0,C,0 1,female,60,1,0,C,1 1,male,60,0,0,S,0 1,male,54,0,1,S,0 1,male,21,0,1,S,0 1,female,55,0,0,C,1 1,female,31,0,2,S,1 1,male,57,1,1,S,0 1,female,45,1,1,S,1 1,male,50,1,1,C,0 1,male,27,0,2,C,0 1,female,50,1,1,C,1 1,female,21,0,0,S,1 1,male,51,0,1,C,0 1,male,21,0,1,C,1 1,male,,0,0,S,0 1,female,31,0,0,C,1 1,male,,0,0,S,1 1,male,62,0,0,S,0 1,female,36,0,0,C,1 2,male,30,1,0,C,0 2,female,28,1,0,C,1 2,male,30,0,0,S,0 2,male,18,0,0,S,0 2,male,25,0,0,S,0 2,male,34,1,0,S,0 2,female,36,1,0,S,1 2,male,57,0,0,S,0 2,male,18,0,0,S,0 2,male,23,0,0,S,0 2,female,36,0,0,S,1 2,male,28,0,0,S,0 2,male,51,0,0,S,0 2,male,32,1,0,S,1 2,female,19,1,0,S,1 2,male,28,0,0,S,0 2,male,1,2,1,S,1 2,female,4,2,1,S,1 2,female,12,2,1,S,1 2,female,36,0,3,S,1 2,male,34,0,0,S,1 2,female,19,0,0,S,1 2,male,23,0,0,S,0 2,male,26,0,0,S,0 2,male,42,0,0,S,0 2,male,27,0,0,S,0 2,female,24,0,0,S,1 2,female,15,0,2,S,1 2,male,60,1,1,S,0 2,female,40,1,1,S,1 2,female,20,1,0,S,1 2,male,25,1,0,S,0 2,female,36,0,0,S,1 2,male,25,0,0,S,0 2,male,42,0,0,S,0 2,female,42,0,0,S,1 2,male,0.8333,0,2,S,1 2,male,26,1,1,S,1 2,female,22,1,1,S,1 2,female,35,0,0,S,1 2,male,,0,0,S,0 2,male,19,0,0,S,0 2,female,44,1,0,S,0 2,male,54,1,0,S,0 2,male,52,0,0,S,0 2,male,37,1,0,S,0 2,female,29,1,0,S,0 2,female,25,1,1,S,1 2,female,45,0,2,S,1 2,male,29,1,0,S,0 2,female,28,1,0,S,1 2,male,29,0,0,S,0 2,male,28,0,0,S,0 2,male,24,0,0,S,1 2,female,8,0,2,S,1 2,male,31,1,1,S,0 2,female,31,1,1,S,1 2,female,22,0,0,S,1 2,female,30,0,0,S,0 2,female,,0,0,S,0 2,male,21,0,0,S,0 2,male,,0,0,S,0 2,male,8,1,1,S,1 2,male,18,0,0,S,0 2,female,48,0,2,S,1 2,female,28,0,0,S,1 2,male,32,0,0,S,0 2,male,17,0,0,S,0 2,male,29,1,0,C,0 2,female,24,1,0,C,1 2,male,25,0,0,S,0 2,male,18,0,0,S,0 2,female,18,0,1,S,1 2,female,34,0,1,S,1 2,male,54,0,0,S,0 2,male,8,0,2,S,1 2,male,42,1,1,S,0 2,female,34,1,1,S,1 2,female,27,1,0,C,1 2,female,30,1,0,C,1 2,male,23,0,0,S,0 2,male,21,0,0,S,0 2,male,18,0,0,S,0 2,male,40,1,0,S,0 2,female,29,1,0,S,1 2,male,18,0,0,S,0 2,male,36,0,0,S,0 2,male,,0,0,S,0 2,female,38,0,0,S,0 2,male,35,0,0,S,0 2,male,38,1,0,S,0 2,male,34,1,0,S,0 2,female,34,0,0,S,1 2,male,16,0,0,S,0 2,male,26,0,0,S,0 2,male,47,0,0,S,0 2,male,21,1,0,S,0 2,male,21,1,0,S,0 2,male,24,0,0,S,0 2,male,24,0,0,S,0 2,male,34,0,0,S,0 2,male,30,0,0,S,0 2,male,52,0,0,S,0 2,male,30,0,0,S,0 2,male,0.6667,1,1,S,1 2,female,24,0,2,S,1 2,male,44,0,0,S,0 2,female,6,0,1,S,1 2,male,28,0,1,S,0 2,male,62,0,0,S,1 2,male,30,0,0,S,0 2,female,7,0,2,S,1 2,male,43,1,1,S,0 2,female,45,1,1,S,1 2,female,24,1,2,S,1 2,female,24,1,2,S,1 2,male,49,1,2,S,0 2,female,48,1,2,S,1 2,female,55,0,0,S,1 2,male,24,2,0,S,0 2,male,32,2,0,S,0 2,male,21,2,0,S,0 2,female,18,1,1,S,0 2,female,20,2,1,S,1 2,male,23,2,1,S,0 2,male,36,0,0,S,0 2,female,54,1,3,S,1 2,male,50,0,0,S,0 2,male,44,1,0,S,0 2,female,29,1,0,S,1 2,male,21,0,0,S,0 2,male,42,0,0,S,1 2,male,63,1,0,S,0 2,female,60,1,0,S,0 2,male,33,0,0,S,0 2,female,17,0,0,S,1 2,male,42,1,0,S,0 2,female,24,2,1,S,1 2,male,47,0,0,S,0 2,male,24,2,0,S,0 2,male,22,2,0,S,0 2,male,32,0,0,S,0 2,female,23,0,0,C,1 2,male,34,1,0,S,0 2,female,24,1,0,S,1 2,female,22,0,0,S,0 2,female,,0,0,Q,1 2,male,35,0,0,Q,0 2,female,45,0,0,S,1 2,male,57,0,0,Q,0 2,male,,0,0,S,0 2,male,31,0,0,S,0 2,female,26,1,1,S,0 2,male,30,1,1,S,0 2,male,,0,0,Q,0 2,female,1,1,2,C,1 2,female,3,1,2,C,1 2,male,25,1,2,C,0 2,female,22,1,2,C,1 2,female,17,0,0,C,1 2,female,,0,0,S,1 2,female,34,0,0,S,1 2,male,36,0,0,C,0 2,male,24,0,0,S,0 2,male,61,0,0,Q,0 2,male,50,1,0,S,0 2,female,42,1,0,S,1 2,female,57,0,0,S,0 2,male,,0,0,C,0 2,male,1,0,2,C,1 2,male,31,1,1,C,0 2,female,24,1,1,C,1 2,male,,0,0,C,0 2,male,30,0,0,S,0 2,male,40,0,0,S,0 2,male,32,0,0,S,0 2,male,30,0,0,S,0 2,male,46,0,0,S,0 2,female,13,0,1,S,1 2,female,41,0,1,S,1 2,male,19,0,0,S,1 2,male,39,0,0,S,0 2,male,48,0,0,S,0 2,male,70,0,0,S,0 2,male,27,0,0,S,0 2,male,54,0,0,S,0 2,male,39,0,0,S,0 2,male,16,0,0,S,0 2,male,62,0,0,Q,0 2,male,32.5,1,0,C,0 2,female,14,1,0,C,1 2,male,2,1,1,S,1 2,male,3,1,1,S,1 2,male,36.5,0,2,S,0 2,male,26,0,0,S,0 2,male,19,1,1,S,0 2,male,28,0,0,S,0 2,male,20,0,0,C,1 2,female,29,0,0,S,1 2,male,39,0,0,S,0 2,male,22,0,0,S,1 2,male,,0,0,C,1 2,male,23,0,0,S,0 2,male,29,0,0,C,1 2,male,28,0,0,S,0 2,male,,0,0,S,0 2,female,50,0,1,S,1 2,male,19,0,0,S,0 2,male,,0,0,C,0 2,male,41,0,0,S,0 2,female,21,0,1,S,1 2,female,19,0,0,S,1 2,male,43,0,1,S,0 2,female,32,0,0,S,1 2,male,34,0,0,S,0 2,male,30,0,0,C,1 2,male,27,0,0,C,0 2,female,2,1,1,S,1 2,female,8,1,1,S,1 2,female,33,0,2,S,1 2,male,36,0,0,S,0 2,male,34,1,0,S,0 2,female,30,3,0,S,1 2,female,28,0,0,S,1 2,male,23,0,0,C,0 2,male,0.8333,1,1,S,1 2,male,3,1,1,S,1 2,female,24,2,3,S,1 2,female,50,0,0,S,1 2,male,19,0,0,S,0 2,female,21,0,0,S,1 2,male,26,0,0,S,0 2,male,25,0,0,S,0 2,male,27,0,0,S,0 2,female,25,0,1,S,1 2,female,18,0,2,S,1 2,female,20,0,0,S,1 2,female,30,0,0,S,1 2,male,59,0,0,S,0 2,female,30,0,0,Q,1 2,male,35,0,0,S,0 2,female,40,0,0,S,1 2,male,25,0,0,S,0 2,male,41,0,0,C,0 2,male,25,0,0,S,0 2,male,18.5,0,0,S,0 2,male,14,0,0,S,0 2,female,50,0,0,S,1 2,male,23,0,0,S,0 2,female,28,0,0,S,1 2,female,27,0,0,S,1 2,male,29,1,0,S,0 2,female,27,1,0,S,0 2,male,40,0,0,S,0 2,female,31,0,0,S,1 2,male,30,1,0,S,0 2,male,23,1,0,S,0 2,female,31,0,0,S,1 2,male,,0,0,S,0 2,female,12,0,0,S,1 2,female,40,0,0,S,1 2,female,32.5,0,0,S,1 2,male,27,1,0,S,0 2,female,29,1,0,S,1 2,male,2,1,1,S,1 2,female,4,1,1,S,1 2,female,29,0,2,S,1 2,female,0.9167,1,2,S,1 2,female,5,1,2,S,1 2,male,36,1,2,S,0 2,female,33,1,2,S,1 2,male,66,0,0,S,0 2,male,,0,0,S,0 2,male,31,0,0,S,1 2,male,,0,0,S,1 2,female,26,0,0,S,1 2,female,24,0,0,S,0 3,male,42,0,0,S,0 3,male,13,0,2,S,0 3,male,16,1,1,S,0 3,female,35,1,1,S,1 3,female,16,0,0,S,1 3,male,25,0,0,S,1 3,male,20,0,0,S,1 3,female,18,0,0,C,1 3,male,30,0,0,S,0 3,male,26,0,0,S,0 3,female,40,1,0,S,0 3,male,0.8333,0,1,S,1 3,female,18,0,1,S,1 3,male,26,0,0,C,1 3,male,26,0,0,S,0 3,male,20,0,0,S,0 3,male,24,0,0,S,0 3,male,25,0,0,S,0 3,male,35,0,0,S,0 3,male,18,0,0,S,0 3,male,32,0,0,S,0 3,female,19,1,0,S,1 3,male,4,4,2,S,0 3,female,6,4,2,S,0 3,female,2,4,2,S,0 3,female,17,4,2,S,1 3,female,38,4,2,S,0 3,female,9,4,2,S,0 3,female,11,4,2,S,0 3,male,39,1,5,S,0 3,male,27,0,0,S,1 3,male,26,0,0,S,0 3,female,39,1,5,S,0 3,male,20,0,0,S,0 3,male,26,0,0,S,0 3,male,25,1,0,S,0 3,female,18,1,0,S,0 3,male,24,0,0,S,0 3,male,35,0,0,S,0 3,male,5,4,2,S,0 3,male,9,4,2,S,0 3,male,3,4,2,S,1 3,male,13,4,2,S,0 3,female,5,4,2,S,1 3,male,40,1,5,S,0 3,male,23,0,0,S,1 3,female,38,1,5,S,1 3,female,45,0,0,C,1 3,male,21,0,0,C,0 3,male,23,0,0,S,0 3,female,17,0,0,C,0 3,male,30,0,0,C,0 3,male,23,0,0,S,0 3,female,13,0,0,C,1 3,male,20,0,0,C,0 3,male,32,1,0,S,0 3,female,33,3,0,S,1 3,female,0.75,2,1,C,1 3,female,0.75,2,1,C,1 3,female,5,2,1,C,1 3,female,24,0,3,C,1 3,female,18,0,0,S,1 3,male,40,0,0,C,0 3,male,26,0,0,S,0 3,male,20,0,0,C,1 3,female,18,0,1,C,0 3,female,45,0,1,C,0 3,female,27,0,0,Q,0 3,male,22,0,0,S,0 3,male,19,0,0,S,0 3,male,26,0,0,S,0 3,male,22,0,0,S,0 3,male,,0,0,C,0 3,male,20,0,0,C,0 3,male,32,0,0,S,1 3,male,21,0,0,S,0 3,male,18,0,0,S,0 3,male,26,0,0,S,0 3,male,6,1,1,C,0 3,female,9,1,1,C,0 3,male,,0,0,C,0 3,female,,0,2,C,0 3,female,,0,2,Q,0 3,male,40,1,1,Q,0 3,female,32,1,1,Q,0 3,male,21,0,0,S,0 3,female,22,0,0,Q,1 3,female,20,0,0,S,0 3,male,29,1,0,S,0 3,male,22,1,0,S,0 3,male,22,0,0,S,0 3,male,35,0,0,S,0 3,female,18.5,0,0,Q,0 3,male,21,0,0,Q,1 3,male,19,0,0,Q,0 3,female,18,0,0,Q,0 3,female,21,0,0,S,0 3,female,30,0,0,S,0 3,male,18,0,0,S,0 3,male,38,0,0,S,0 3,male,17,0,0,S,0 3,male,17,0,0,S,0 3,female,21,0,0,Q,0 3,male,21,0,0,Q,0 3,male,21,0,0,S,0 3,male,,1,0,C,0 3,female,,1,0,C,0 3,male,28,0,0,S,0 3,male,24,0,0,S,0 3,female,16,0,0,Q,1 3,female,37,0,0,Q,0 3,male,28,0,0,S,0 3,male,24,0,0,S,0 3,male,21,0,0,Q,0 3,male,32,0,0,S,1 3,male,29,0,0,S,0 3,male,26,1,0,C,0 3,male,18,1,0,C,0 3,male,20,0,0,S,0 3,male,18,0,0,S,1 3,male,24,0,0,Q,0 3,male,36,0,0,S,0 3,male,24,0,0,S,0 3,male,31,0,0,Q,0 3,male,31,0,0,Q,0 3,female,22,0,0,Q,1 3,female,30,0,0,Q,0 3,male,70.5,0,0,Q,0 3,male,43,0,0,S,0 3,male,35,0,0,S,0 3,male,27,0,0,S,0 3,male,19,0,0,S,0 3,male,30,0,0,S,0 3,male,9,1,1,S,1 3,male,3,1,1,S,1 3,female,36,0,2,S,1 3,male,59,0,0,S,0 3,male,19,0,0,S,0 3,female,17,0,1,S,1 3,male,44,0,1,S,0 3,male,17,0,0,S,0 3,male,22.5,0,0,C,0 3,male,45,0,0,S,1 3,female,22,0,0,S,0 3,male,19,0,0,S,0 3,female,30,0,0,Q,1 3,male,29,0,0,Q,1 3,male,0.3333,0,2,S,0 3,male,34,1,1,S,0 3,female,28,1,1,S,0 3,male,27,0,0,S,0 3,male,25,0,0,S,0 3,male,24,2,0,S,0 3,male,22,0,0,S,0 3,male,21,2,0,S,0 3,male,17,2,0,S,0 3,male,,1,0,S,0 3,female,,1,0,S,1 3,male,36.5,1,0,S,1 3,female,36,1,0,S,1 3,male,30,0,0,S,1 3,male,16,0,0,S,0 3,male,1,1,2,S,1 3,female,0.1667,1,2,S,1 3,male,26,1,2,S,0 3,female,33,1,2,S,1 3,male,25,0,0,S,0 3,male,,0,0,S,0 3,male,,0,0,S,0 3,male,22,0,0,S,0 3,male,36,0,0,S,0 3,female,19,0,0,Q,1 3,male,17,0,0,S,0 3,male,42,0,0,S,0 3,male,43,0,0,S,0 3,male,,0,0,C,0 3,male,32,0,0,Q,0 3,male,19,0,0,S,1 3,female,30,0,0,S,1 3,female,24,0,0,Q,0 3,female,23,0,0,S,1 3,male,33,0,0,C,0 3,male,65,0,0,Q,0 3,male,24,0,0,S,1 3,male,23,1,0,S,0 3,female,22,1,0,S,1 3,male,18,0,0,S,0 3,male,16,0,0,S,0 3,male,45,0,0,S,0 3,male,,0,0,C,0 3,male,39,0,2,C,0 3,male,17,1,1,C,0 3,male,15,1,1,C,0 3,male,47,0,0,S,0 3,female,5,0,0,S,1 3,male,,0,0,C,0 3,male,40.5,0,0,S,0 3,male,40.5,0,0,Q,0 3,male,,0,0,S,1 3,male,18,0,0,S,0 3,female,,0,0,Q,0 3,male,,0,0,Q,0 3,male,,0,0,Q,0 3,male,26,0,0,Q,0 3,male,,0,0,Q,0 3,male,,0,0,S,1 3,female,21,2,2,S,0 3,female,9,2,2,S,0 3,male,,0,0,S,0 3,male,18,2,2,S,0 3,male,16,1,3,S,0 3,female,48,1,3,S,0 3,male,,0,0,Q,0 3,male,,0,0,S,0 3,male,25,0,0,Q,0 3,male,,0,0,S,0 3,male,,0,0,C,0 3,male,22,0,0,S,0 3,female,16,0,0,Q,1 3,female,,0,0,Q,1 3,male,9,0,2,S,1 3,male,33,1,1,S,0 3,male,41,0,0,S,0 3,female,31,1,1,S,1 3,male,38,0,0,S,0 3,male,9,5,2,S,0 3,male,1,5,2,S,0 3,male,11,5,2,S,0 3,female,10,5,2,S,0 3,female,16,5,2,S,0 3,male,14,5,2,S,0 3,male,40,1,6,S,0 3,female,43,1,6,S,0 3,male,51,0,0,S,0 3,male,32,0,0,S,0 3,male,,0,0,S,0 3,male,20,0,0,S,0 3,male,37,2,0,S,0 3,male,28,2,0,S,0 3,male,19,0,0,S,0 3,female,24,0,0,S,0 3,female,17,0,0,Q,0 3,male,,1,0,S,0 3,male,,1,0,S,0 3,male,28,1,0,S,0 3,female,24,1,0,S,1 3,male,20,0,0,S,0 3,male,23.5,0,0,C,0 3,male,41,2,0,S,0 3,male,26,1,0,S,0 3,male,21,0,0,S,0 3,female,45,1,0,S,1 3,female,,0,0,S,0 3,male,25,0,0,S,0 3,male,,0,0,Q,0 3,male,11,0,0,C,0 3,female,,0,0,Q,1 3,male,27,0,0,S,1 3,male,,0,0,S,1 3,female,18,0,0,Q,0 3,female,26,0,0,S,1 3,female,23,0,0,S,0 3,female,22,0,0,S,1 3,male,28,0,0,S,0 3,female,28,0,0,S,0 3,female,,0,0,Q,0 3,female,2,0,1,S,1 3,female,22,1,1,S,1 3,male,43,0,0,S,0 3,male,28,0,0,S,0 3,female,27,0,0,S,1 3,male,,0,0,Q,0 3,female,,0,0,S,1 3,male,42,0,0,S,0 3,male,,0,0,S,1 3,male,30,0,0,C,0 3,male,,0,0,S,0 3,female,27,1,0,S,0 3,female,25,1,0,S,0 3,male,,0,0,S,0 3,male,29,0,0,C,1 3,male,21,0,0,S,1 3,male,,0,0,S,0 3,male,20,0,0,S,0 3,male,48,0,0,S,0 3,male,17,1,0,S,0 3,female,,0,0,Q,1 3,male,,0,0,S,1 3,male,34,0,0,S,0 3,male,26,0,0,S,1 3,male,22,0,0,S,0 3,male,33,0,0,S,0 3,male,31,0,0,S,0 3,male,29,0,0,S,0 3,male,4,1,1,S,1 3,female,1,1,1,S,1 3,male,49,0,0,S,0 3,male,33,0,0,S,0 3,male,19,0,0,S,0 3,female,27,0,2,S,1 3,male,,1,2,S,0 3,female,,1,2,S,0 3,male,,1,2,S,0 3,female,,1,2,S,0 3,male,23,0,0,S,0 3,male,32,0,0,S,1 3,male,27,0,0,S,0 3,female,20,1,0,S,0 3,female,21,1,0,S,0 3,male,32,0,0,S,1 3,male,17,0,0,S,0 3,male,21,0,0,S,0 3,male,30,0,0,S,0 3,male,21,0,0,S,1 3,male,33,0,0,S,0 3,male,22,0,0,S,0 3,female,4,0,1,C,1 3,male,39,0,1,C,1 3,male,,0,0,C,0 3,male,18.5,0,0,C,0 3,male,,0,0,Q,0 3,male,,0,0,S,0 3,female,,0,0,Q,1 3,female,,0,0,Q,1 3,male,34.5,0,0,Q,0 3,male,44,0,0,S,0 3,male,,0,0,Q,1 3,male,,1,0,C,0 3,female,,1,0,C,0 3,male,,1,0,Q,0 3,male,,1,0,Q,0 3,male,,0,0,Q,0 3,female,22,2,0,S,0 3,male,26,2,0,S,0 3,female,4,0,2,S,1 3,male,29,3,1,S,1 3,female,26,1,1,S,1 3,female,1,1,1,S,0 3,male,18,1,1,S,0 3,female,36,0,2,S,0 3,male,,0,0,C,0 3,male,25,0,0,C,1 3,male,,0,0,C,0 3,female,37,0,0,S,0 3,male,,0,0,S,0 3,male,,0,0,S,1 3,male,,0,0,S,0 3,female,22,0,0,S,1 3,male,,0,0,Q,0 3,male,26,0,0,S,1 3,male,29,0,0,S,0 3,male,29,0,0,S,0 3,male,22,0,0,S,0 3,male,22,0,0,C,1 3,male,,3,1,S,0 3,female,,3,1,S,0 3,female,,3,1,S,0 3,female,,3,1,S,0 3,female,,0,4,S,0 3,male,32,0,0,S,0 3,male,34.5,0,0,C,0 3,female,,1,0,Q,0 3,male,,1,0,Q,0 3,male,36,0,0,S,0 3,male,39,0,0,S,0 3,male,24,0,0,S,0 3,female,25,0,0,S,0 3,female,45,0,0,S,0 3,male,36,1,0,S,0 3,female,30,1,0,S,0 3,male,20,1,0,S,1 3,male,,0,0,Q,0 3,male,28,0,0,S,0 3,male,,0,0,S,0 3,male,30,1,0,S,0 3,female,26,1,0,S,0 3,male,,0,0,S,0 3,male,20.5,0,0,S,0 3,male,27,0,0,S,1 3,male,51,0,0,S,0 3,female,23,0,0,S,1 3,male,32,0,0,S,1 3,male,,0,0,S,0 3,male,,0,0,S,0 3,female,,0,0,Q,1 3,male,24,0,0,S,1 3,male,22,0,0,S,0 3,female,,0,0,Q,0 3,male,,0,0,Q,0 3,male,,0,0,S,0 3,male,29,0,0,S,0 3,male,,0,0,C,1 3,female,30.5,0,0,Q,0 3,female,,0,0,Q,1 3,male,,0,0,C,0 3,male,35,0,0,C,0 3,male,33,0,0,S,0 3,female,,0,0,C,1 3,male,,0,0,C,0 3,female,,0,0,Q,1 3,male,,0,0,Q,1 3,female,,2,0,Q,1 3,female,,2,0,Q,1 3,male,,2,0,Q,1 3,female,,0,0,Q,1 3,male,,0,0,Q,0 3,female,,0,0,Q,1 3,female,15,0,0,Q,1 3,female,35,0,0,Q,0 3,male,,0,0,Q,0 3,male,24,1,0,S,0 3,female,19,1,0,S,0 3,female,,0,0,Q,0 3,female,,0,0,S,0 3,female,,0,0,S,0 3,male,55.5,0,0,S,0 3,male,,0,0,Q,0 3,male,21,0,0,S,1 3,male,,0,0,S,0 3,male,24,0,0,S,0 3,male,21,0,0,S,0 3,male,28,0,0,S,0 3,male,,0,0,S,0 3,female,,0,0,Q,1 3,male,25,0,0,S,0 3,male,6,0,1,S,1 3,female,27,0,1,S,1 3,male,,0,0,S,0 3,female,,1,0,Q,1 3,male,,1,0,Q,0 3,male,,0,0,Q,0 3,male,34,0,0,S,0 3,male,,0,0,Q,0 3,male,,0,0,S,1 3,male,,1,1,C,1 3,male,,1,1,C,1 3,female,,0,2,C,1 3,female,,0,0,C,1 3,male,,0,0,S,0 3,female,,0,0,Q,1 3,female,24,0,0,Q,1 3,male,,0,0,S,0 3,female,,1,0,Q,1 3,female,,1,0,Q,1 3,female,,0,0,Q,1 3,male,18,0,0,S,0 3,male,22,0,0,S,0 3,female,15,0,0,C,1 3,female,1,0,2,C,1 3,male,20,1,1,C,1 3,female,19,1,1,C,1 3,male,33,0,0,S,0 3,male,,0,0,S,0 3,male,,0,0,C,0 3,female,,0,0,Q,0 3,male,,0,0,S,0 3,male,12,1,0,C,1 3,female,14,1,0,C,1 3,female,29,0,0,S,0 3,male,28,0,0,S,0 3,female,18,0,0,S,1 3,female,26,0,0,S,1 3,male,21,0,0,S,0 3,male,41,0,0,S,0 3,male,39,0,0,S,1 3,male,21,0,0,S,0 3,male,28.5,0,0,C,0 3,female,22,0,0,S,1 3,male,61,0,0,S,0 3,male,,1,0,Q,0 3,male,,0,0,Q,0 3,female,,1,0,Q,1 3,male,,0,0,Q,0 3,male,,0,0,Q,0 3,male,,0,0,Q,0 3,male,23,0,0,S,0 3,female,,0,0,Q,0 3,female,,0,0,Q,1 3,female,,0,0,Q,1 3,female,22,0,0,S,1 3,male,,0,0,Q,1 3,female,,0,0,Q,1 3,male,9,0,1,S,1 3,male,28,0,0,S,0 3,male,42,0,1,S,0 3,male,,0,0,S,0 3,female,31,0,0,S,0 3,male,28,0,0,S,0 3,male,32,0,0,S,1 3,male,20,0,0,S,0 3,female,23,0,0,S,0 3,female,20,0,0,S,0 3,male,20,0,0,S,0 3,male,16,0,0,S,0 3,female,31,0,0,S,1 3,female,,0,0,Q,0 3,male,2,3,1,S,0 3,male,6,3,1,S,0 3,female,3,3,1,S,0 3,female,8,3,1,S,0 3,female,29,0,4,S,0 3,male,1,4,1,S,0 3,male,7,4,1,S,0 3,male,2,4,1,S,0 3,male,16,4,1,S,0 3,male,14,4,1,S,0 3,female,41,0,5,S,0 3,male,21,0,0,S,0 3,male,19,0,0,S,0 3,male,,0,0,C,0 3,male,32,0,0,S,0 3,male,0.75,1,1,S,0 3,female,3,1,1,S,0 3,female,26,0,2,S,0 3,male,,0,0,S,0 3,male,,0,0,S,0 3,male,,0,0,S,0 3,male,21,0,0,S,0 3,male,25,0,0,S,0 3,male,22,0,0,S,0 3,male,25,1,0,S,1 3,male,,1,1,C,1 3,female,,1,1,C,1 3,female,,0,2,C,1 3,female,,0,0,Q,0 3,male,24,0,0,S,0 3,female,28,0,0,S,0 3,male,19,0,0,S,0 3,male,,0,0,S,0 3,male,25,1,0,S,0 3,female,18,0,0,S,0 3,male,32,0,0,S,1 3,male,,0,0,S,0 3,male,17,0,0,S,0 3,male,24,0,0,S,0 3,male,,0,0,S,0 3,female,,0,0,S,0 3,male,,0,0,C,0 3,male,,0,0,S,0 3,male,38,0,0,S,0 3,male,21,0,0,S,0 3,male,10,4,1,Q,0 3,male,4,4,1,Q,0 3,male,7,4,1,Q,0 3,male,2,4,1,Q,0 3,male,8,4,1,Q,0 3,female,39,0,5,Q,0 3,female,22,0,0,S,0 3,male,35,0,0,S,0 3,female,,0,0,Q,1 3,male,,0,0,S,0 3,female,,0,0,S,0 3,male,50,1,0,S,0 3,female,47,1,0,S,0 3,male,,0,0,S,0 3,male,,0,0,S,0 3,female,2,1,1,S,0 3,male,18,1,1,S,0 3,female,41,0,2,S,0 3,female,,0,0,S,1 3,male,50,0,0,S,0 3,male,16,0,0,S,0 3,male,,0,0,Q,1 3,male,,0,0,Q,0 3,male,,0,0,C,0 3,male,25,0,0,C,0 3,male,,0,0,C,0 3,male,,0,0,Q,0 3,male,,0,0,S,0 3,male,38.5,0,0,S,0 3,male,,8,2,S,0 3,male,14.5,8,2,S,0 3,female,,8,2,S,0 3,female,,8,2,S,0 3,female,,8,2,S,0 3,female,,8,2,S,0 3,male,,8,2,S,0 3,male,,8,2,S,0 3,male,,8,2,S,0 3,male,,1,9,S,0 3,female,,1,9,S,0 3,male,24,0,0,S,0 3,female,21,0,0,S,1 3,male,39,0,0,S,0 3,male,,2,0,C,0 3,male,,2,0,C,0 3,male,,2,0,C,0 3,female,1,1,1,S,1 3,female,24,0,2,S,1 3,female,4,1,1,S,1 3,male,25,0,0,S,1 3,male,20,0,0,S,0 3,male,24.5,0,0,S,0 3,male,,0,0,Q,0 3,male,,0,0,S,0 3,male,,0,0,Q,0 3,male,29,0,0,S,1 3,male,,0,0,S,0 3,female,,0,0,Q,1 3,male,,0,0,S,0 3,male,,0,0,S,0 3,male,22,0,0,C,0 3,male,,0,0,S,0 3,male,40,0,0,S,0 3,male,21,0,0,S,0 3,female,18,0,0,S,1 3,male,4,3,2,S,0 3,male,10,3,2,S,0 3,female,9,3,2,S,0 3,female,2,3,2,S,0 3,male,40,1,4,S,0 3,female,45,1,4,S,0 3,male,,0,0,S,0 3,male,,0,0,S,0 3,male,,0,0,S,0 3,male,,0,0,Q,0 3,female,,0,0,Q,1 3,male,19,0,0,S,0 3,male,30,0,0,S,0 3,male,,0,0,S,0 3,male,32,0,0,S,0 3,male,,0,0,S,0 3,male,33,0,0,C,0 3,female,23,0,0,S,1 3,male,21,0,0,S,0 3,male,60.5,0,0,S,0 3,male,19,0,0,S,0 3,female,22,0,0,S,0 3,male,31,0,0,S,1 3,male,27,0,0,S,0 3,female,2,0,1,S,0 3,female,29,1,1,S,0 3,male,16,0,0,S,1 3,male,44,0,0,S,1 3,male,25,0,0,S,0 3,male,74,0,0,S,0 3,male,14,0,0,S,1 3,male,24,0,0,S,0 3,male,25,0,0,S,1 3,male,34,0,0,S,0 3,male,0.4167,0,1,C,1 3,male,,1,0,C,0 3,male,,0,0,C,0 3,male,,0,0,C,0 3,female,16,1,1,C,1 3,male,,0,0,S,0 3,male,,1,0,S,0 3,female,,1,0,S,1 3,male,32,0,0,S,0 3,male,,0,0,Q,0 3,male,,0,0,S,0 3,male,30.5,0,0,S,0 3,male,44,0,0,S,0 3,male,,0,0,C,0 3,male,25,0,0,S,1 3,male,,0,0,C,0 3,male,7,1,1,C,1 3,female,9,1,1,C,1 3,female,29,0,2,C,1 3,male,36,0,0,S,0 3,female,18,0,0,S,1 3,female,63,0,0,S,1 3,male,,1,1,S,0 3,male,11.5,1,1,S,0 3,male,40.5,0,2,S,0 3,female,10,0,2,S,0 3,male,36,1,1,S,0 3,female,30,1,1,S,0 3,male,,0,0,S,0 3,male,33,0,0,S,0 3,male,28,0,0,S,0 3,male,28,0,0,S,0 3,male,47,0,0,S,0 3,female,18,2,0,S,0 3,male,31,3,0,S,0 3,male,16,2,0,S,0 3,female,31,1,0,S,0 3,male,22,0,0,C,1 3,male,20,0,0,S,0 3,female,14,0,0,S,0 3,male,22,0,0,S,0 3,male,22,0,0,S,0 3,male,,0,0,S,0 3,male,,0,0,S,0 3,male,,0,0,S,0 3,male,32.5,0,0,S,0 3,female,38,0,0,C,1 3,male,51,0,0,S,0 3,male,18,1,0,S,0 3,male,21,1,0,S,0 3,female,47,1,0,S,1 3,male,,0,0,S,0 3,male,,0,0,S,0 3,male,,0,0,S,0 3,male,28.5,0,0,S,0 3,male,21,0,0,S,0 3,male,27,0,0,S,0 3,male,,0,0,S,0 3,male,36,0,0,S,0 3,male,27,1,0,C,0 3,female,15,1,0,C,1 3,male,45.5,0,0,C,0 3,male,,0,0,C,0 3,male,,0,0,C,0 3,female,14.5,1,0,C,0 3,female,,1,0,C,0 3,male,26.5,0,0,C,0 3,male,27,0,0,C,0 3,male,29,0,0,S,0 ================================================ FILE: LICENSE ================================================ MIT License Copyright (c) 2021 milaan9 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: README.md ================================================

Last Commit Stars Badge Forks Badge Size Pull Requests Badge Issues Badge Language MIT License

binder

# Unsupervised Learning The Unsupervised learning is a branch of machine learning that learns from test data that has not been labeled, classified or categorized. Instead of responding to feedback, unsupervised learning identifies commonalities in the data and reacts based on the presence or absence of such commonalities in each new piece of data. # Clustering Clustering or cluster analysis is an unsupervised learning problem. It is often used as a data analysis technique for discovering interesting patterns in data, such as groups of customers based on their behavior. In clustering problems we split the training examples by unknown characteristics. The algorithm itself decides what characteristic to use for splitting. Usage examples: market segmentation, social networks analysis, organize computing clusters, astronomical data analysis, image compression, etc.