From b892d99fa3a42cd7d3e71c77d2204a4aef8b8e71 Mon Sep 17 00:00:00 2001 From: milanXpetrovic Date: Sat, 18 Feb 2023 00:43:08 +0100 Subject: [PATCH 1/8] perf: add dump context --- .github/workflows/commit-lint.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/commit-lint.yml b/.github/workflows/commit-lint.yml index 9d8dc5a..765de9e 100644 --- a/.github/workflows/commit-lint.yml +++ b/.github/workflows/commit-lint.yml @@ -15,6 +15,11 @@ jobs: with: fetch-depth: 0 + - name: Dump GitHub context + env: + GITHUB_CONTEXT: ${{ toJSON(github) }} + run: echo "$GITHUB_CONTEXT" + - name: Commit Lint uses: wagoid/commitlint-github-action@v5 with: From ebcaf4435da2a8b063b7b1e03f580c11400c5191 Mon Sep 17 00:00:00 2001 From: milanXpetrovic Date: Tue, 21 Feb 2023 13:21:44 +0100 Subject: [PATCH 2/8] fix: updated names of files --- README.md | 5 +- .../0_0_angle_dist_in_group.py | 6 +- .../automated_schneider/0_1_group_to_pop.py | 22 +++++++ .../population_matrix.py} | 29 ++++----- .../schneider_automatic.py | 0 fly_pipe/preproc/0_2_join_csvs.py | 65 ------------------- fly_pipe/settings.py | 3 + ...eider_social.py => automated_schneider.py} | 4 ++ 8 files changed, 46 insertions(+), 88 deletions(-) rename fly_pipe/find_edges/{ => automated_schneider}/0_0_angle_dist_in_group.py (78%) create mode 100644 fly_pipe/find_edges/automated_schneider/0_1_group_to_pop.py rename fly_pipe/find_edges/{0_1_group_to_pop.py => automated_schneider/population_matrix.py} (55%) rename fly_pipe/find_edges/{ => automated_schneider}/schneider_automatic.py (100%) delete mode 100644 fly_pipe/preproc/0_2_join_csvs.py rename fly_pipe/utils/{schneider_social.py => automated_schneider.py} (97%) diff --git a/README.md b/README.md index 2e7ce14..090c73d 100644 --- a/README.md +++ b/README.md @@ -4,11 +4,12 @@ - [x] Make dev env - [x] run whole pipeline -- [ ] add versioning +- [x] add versioning ### Pipeline scripts - [x] PREPROC: unpack excell to csv tables - [ ] MAIN: automatic detection of soc interaction - [ ] util: check soc space index -- [ ] util: merge multiple track csv from one video + + diff --git a/fly_pipe/find_edges/0_0_angle_dist_in_group.py b/fly_pipe/find_edges/automated_schneider/0_0_angle_dist_in_group.py similarity index 78% rename from fly_pipe/find_edges/0_0_angle_dist_in_group.py rename to fly_pipe/find_edges/automated_schneider/0_0_angle_dist_in_group.py index d63f769..ba1f0f0 100644 --- a/fly_pipe/find_edges/0_0_angle_dist_in_group.py +++ b/fly_pipe/find_edges/automated_schneider/0_0_angle_dist_in_group.py @@ -3,7 +3,7 @@ import pandas as pd from fly_pipe.utils import fileio -from fly_pipe.utils import schneider_social as ss +from fly_pipe.utils import automated_schneider as ss POPULATION_NAME = "CSf" @@ -21,6 +21,6 @@ for group_name, group_path in population.items(): group = fileio.load_files_from_folder(group_path, file_format='.csv') - total = ss.find_distances_and_angles_in_group( + result = ss.find_distances_and_angles_in_group( group, pxpermm[group_name]) - total.to_csv("{}/{}.csv".format(OUTPUT_PATH, group_name)) + result.to_csv("{}/{}.csv".format(OUTPUT_PATH, group_name)) diff --git a/fly_pipe/find_edges/automated_schneider/0_1_group_to_pop.py b/fly_pipe/find_edges/automated_schneider/0_1_group_to_pop.py new file mode 100644 index 0000000..6d500b2 --- /dev/null +++ b/fly_pipe/find_edges/automated_schneider/0_1_group_to_pop.py @@ -0,0 +1,22 @@ +import pandas as pd + +from fly_pipe.utils import fileio + + +POPULATION_NAME = "CSf" +INPUT_PATH = "../../data/find_edges/0_0_angle_dist_in_group/" + POPULATION_NAME +OUTPUT_PATH = "../../data/find_edges/0_1_group_to_population/" + POPULATION_NAME + +group = fileio.load_files_from_folder(INPUT_PATH, file_format='.csv') +result = pd.DataFrame() + +for name, path in group.items(): + df = pd.read_csv(path, index_col=0) + df = df.groupby(['angle', 'distance'])[ + 'counts'].sum().reset_index(name='counts') + result = pd.concat([result, df], axis=0) + +result = result.groupby(['angle', 'distance'])[ + 'counts'].sum().reset_index(name='counts') + +result.to_csv("{}.csv".format(OUTPUT_PATH)) diff --git a/fly_pipe/find_edges/0_1_group_to_pop.py b/fly_pipe/find_edges/automated_schneider/population_matrix.py similarity index 55% rename from fly_pipe/find_edges/0_1_group_to_pop.py rename to fly_pipe/find_edges/automated_schneider/population_matrix.py index 3e6e222..6da1f43 100644 --- a/fly_pipe/find_edges/0_1_group_to_pop.py +++ b/fly_pipe/find_edges/automated_schneider/population_matrix.py @@ -1,33 +1,26 @@ -# %% -import os + import numpy as np import pandas as pd from fly_pipe.utils import fileio - -POPULATION_NAME = "CSf" -INPUT_PATH = "../../data/find_edges/0_0_angle_dist_in_group/" + POPULATION_NAME -OUTPUT_PATH = "../../data/find_edges/0_1_group_to_population/" + POPULATION_NAME +INPUT_PATH = "../../data/find_edges/0_1_group_to_population/" +OUTPUT_PATH = "../../data/find_edges/" group = fileio.load_files_from_folder(INPUT_PATH, file_format='.csv') -total = pd.DataFrame() - -for name, path in group.items(): - df = pd.read_csv(path, index_col=0) - df = df.groupby(['angle', 'distance'])[ - 'counts'].sum().reset_index(name='counts') - total = pd.concat([total, df], axis=0) - -total = total.groupby(['angle', 'distance'])[ - 'counts'].sum().reset_index(name='counts') - -total.to_csv("{}.csv".format(OUTPUT_PATH)) degree_bins = np.array([x for x in range(-180, 181, 5)]) distance_bins = np.array([x*0.25 for x in range(0, 81)]) round_bins = pd.DataFrame(0, index=distance_bins, columns=degree_bins) + +round +group by +round +group by + +res. to df + for row in total.iterrows(): _, value = row degree = value["angle"] diff --git a/fly_pipe/find_edges/schneider_automatic.py b/fly_pipe/find_edges/automated_schneider/schneider_automatic.py similarity index 100% rename from fly_pipe/find_edges/schneider_automatic.py rename to fly_pipe/find_edges/automated_schneider/schneider_automatic.py diff --git a/fly_pipe/preproc/0_2_join_csvs.py b/fly_pipe/preproc/0_2_join_csvs.py deleted file mode 100644 index 262cffa..0000000 --- a/fly_pipe/preproc/0_2_join_csvs.py +++ /dev/null @@ -1,65 +0,0 @@ -import sys -import os -import pandas as pd - -from utils import fileio - - -INPUT_PATH = "./data/preproc/0_0_unpack_xlsx/" -OUTPUT_PATH = "./data/preproc/0_1_join_csvs/" - -if not os.path.exists(OUTPUT_PATH): - os.makedirs(OUTPUT_PATH) - -files = fileio.load_multiple_folders(INPUT_PATH) - -for file_name, file_path in files.items(): - if not os.path.exists(OUTPUT_PATH+"/"+file_name): - os.makedirs(OUTPUT_PATH+"/"+file_name) - - arenas = fileio.load_multiple_folders(file_path) - - for arena_name, arena_path in arenas.items(): - if not os.path.exists(OUTPUT_PATH+"/"+file_name+"/"+arena_name): - os.makedirs(OUTPUT_PATH+"/"+file_name+"/"+arena_name) - - videos = fileio.load_multiple_folders(arena_path) - - -d = {} -for video_name, video_path in videos.items(): - - csvs = [] - content = fileio.load_files_from_folder(video_path) - - for csv_name, csv_path in content.items(): - csvs.append((csv_name, pd.read_csv(csv_path))) - - d.update({video_name: csvs}) - - -v1_csvs = d['v1'] -v2_csvs = d['v2'] - -pairs = 0 -for csv_name_v2, data_v2 in v2_csvs: - row_v2 = data_v2.iloc[0].values - - x_v2 = row_v2[0] - y_v2 = row_v2[1] - - for csv_name_v1, data_v1 in v1_csvs: - - row_v1 = data_v1.iloc[-1].values - - x_v1 = row_v1[0] - y_v1 = row_v1[1] - - if abs(x_v2-x_v1) < 20 and abs(y_v2 - y_v1) < 20: - - print(x_v1, x_v2) - print(y_v1, y_v2) - print(csv_name_v2, csv_name_v1) - pairs += 1 - -print(pairs) diff --git a/fly_pipe/settings.py b/fly_pipe/settings.py index 17b573b..e7c081c 100644 --- a/fly_pipe/settings.py +++ b/fly_pipe/settings.py @@ -1,3 +1,6 @@ +import os +root = os.path.dirname(os.path.dirname(__file__)) + # CONFIG = '../../configs/test.yaml' diff --git a/fly_pipe/utils/schneider_social.py b/fly_pipe/utils/automated_schneider.py similarity index 97% rename from fly_pipe/utils/schneider_social.py rename to fly_pipe/utils/automated_schneider.py index d91ffc7..e46d6f4 100644 --- a/fly_pipe/utils/schneider_social.py +++ b/fly_pipe/utils/automated_schneider.py @@ -42,3 +42,7 @@ def find_distances_and_angles_in_group(group, pxpermm): total = pd.concat([total, df], axis=0) return total + + +def population_matrix(): + pass \ No newline at end of file From 7fa8f3eece68a1943c698d081a4e9b68b4ff4560 Mon Sep 17 00:00:00 2001 From: milanXpetrovic Date: Mon, 6 Mar 2023 01:38:32 +0100 Subject: [PATCH 3/8] fix: bug with angle rotation fixed --- .../0_0_angle_dist_in_group.py | 128 +++++++++++++++--- 1 file changed, 111 insertions(+), 17 deletions(-) diff --git a/fly_pipe/find_edges/automated_schneider/0_0_angle_dist_in_group.py b/fly_pipe/find_edges/automated_schneider/0_0_angle_dist_in_group.py index ba1f0f0..cfd977e 100644 --- a/fly_pipe/find_edges/automated_schneider/0_0_angle_dist_in_group.py +++ b/fly_pipe/find_edges/automated_schneider/0_0_angle_dist_in_group.py @@ -1,26 +1,120 @@ -import os -import json +# %% +from mpl_toolkits.mplot3d import Axes3D +import sys +import itertools import pandas as pd - +import numpy as np from fly_pipe.utils import fileio -from fly_pipe.utils import automated_schneider as ss +import matplotlib.pyplot as plt +from matplotlib.image import NonUniformImage +import matplotlib.pyplot as plt +import numpy as np +treatment = fileio.load_multiple_folders("./CSf") -POPULATION_NAME = "CSf" +for group_name, group_path in treatment.items(): + print(group_name) + group = fileio.load_files_from_folder(group_path, file_format='.csv') -INPUT_PATH = "../../data/raw/" + POPULATION_NAME -OUTPUT_PATH = "../../data/find_edges/0_0_angle_dist_in_group/" + POPULATION_NAME + total = pd.DataFrame() + group_dfs = {fly: pd.read_csv(path, index_col=0) + for fly, path in group.items()} + combinations = list(itertools.permutations(group_dfs.keys(), 2)) + print(len(combinations)) + for fly1, fly2 in combinations: + df1, df2 = group_dfs[fly1], group_dfs[fly2] -PXPERMM_PATH = "../../data/pxpermm/" + POPULATION_NAME + ".json" + df = pd.DataFrame() + df['distance'] = np.sqrt( + np.square(df1['pos x']-df2['pos x']) + np.square(df1['pos y']-df2['pos y'])) -if not os.path.exists(OUTPUT_PATH): - os.makedirs(OUTPUT_PATH) + df['distance'] = df['distance'] / (df1.a.mean()*4) + df['distance'] = round(df['distance'], 2) -population = fileio.load_multiple_folders(INPUT_PATH) -pxpermm = json.load(open(PXPERMM_PATH)) + df["dfx"] = df2['pos x'] - df1['pos x'] + df["dfy"] = df2['pos y'] - df1['pos y'] -for group_name, group_path in population.items(): - group = fileio.load_files_from_folder(group_path, file_format='.csv') - result = ss.find_distances_and_angles_in_group( - group, pxpermm[group_name]) - result.to_csv("{}/{}.csv".format(OUTPUT_PATH, group_name)) + df1.loc[df1['ori'] < 0, 'ori'] *= -1 # 2*np.pi + + cos = np.cos(df1["ori"]) + sin = np.sin(df1["ori"]) + + df['qx2'] = df1['pos x'] + cos * df["dfx"] - sin * df["dfy"] + df['qy2'] = df1['pos y'] + sin * df["dfx"] + cos * df["dfy"] + + df['angle'] = np.arctan2( + df["qy2"]-df1["pos y"], df["qx2"]-df1["pos x"]) + df['angle'] = np.rad2deg(df['angle']) + df['angle'] = np.round(df['angle']) + + df = df[df.distance <= 6] + df = df.groupby(['angle', 'distance'] + ).size().reset_index(name='counts') + # df = df[['angle', 'distance']] + + total = pd.concat([total, df], axis=0) + total.to_csv("./0_0_angle_dist/" + group_name + ".csv") + +group = fileio.load_files_from_folder("./0_0_angle_dist/", file_format='.csv') +tot = pd.DataFrame() +for name, path in group.items(): + df = pd.read_csv(path, index_col=0) + tot = pd.concat([tot, df], axis=0) + +df = tot.groupby(['angle', 'distance'])[ + 'counts'].sum().reset_index(name='counts') +# %% +# define the bins +degree_bins = np.arange(-180, 181, 5) +distance_bins = np.arange(0, 6.001, 0.25) + +# calculate the 2D histogram +hist, _, _ = np.histogram2d(df['angle'], df['distance'], bins=( + degree_bins, distance_bins), weights=df['counts']) + +# plot the histogram as a polar heatmap +# plt.style.use('dark_background') # this makes the text and grid lines white +fig, ax = plt.subplots(figsize=(10, 10), subplot_kw={'polar': True}) +ax.grid(False) # pcolormesh gives an annoying warning when the grid is on +ax.pcolormesh(np.radians(degree_bins), distance_bins, hist.T, cmap='jet') +ax.grid(True) +plt.tight_layout() +plt.show() + + +# %% +degree_bins = np.arange(-180, 181, 5) +distance_bins = np.arange(0, 6.001, 0.25) +round_bins = pd.DataFrame(0, index=distance_bins, columns=degree_bins) + +for row in df.iterrows(): + _, value = row + degree = value["angle"] + distance = value["distance"] + count = value["counts"] + degree_bin = np.digitize([degree], degree_bins)[0]-1 + distance_bin = np.digitize([distance], distance_bins)[0]-1 + round_bins.iloc[distance_bin, degree_bin] += count +n = len(degree_bins) +m = len(distance_bins) + +rad = np.linspace(0, 10., m) +a = np.linspace(0, 2 * np.pi, n) +r, th = np.meshgrid(rad, a) +z = round_bins.to_numpy().T +plt.figure(figsize=(10, 10)) +plt.subplot(projection="polar") +plt.pcolormesh(th, r, z, cmap='jet') +plt.plot(a, r, ls='none', color='k') +plt.grid() +plt.colorbar() + + +# %% +histogram = round(round_bins.sum(axis=1)) +histogram.plot(kind="bar") + +# TODO: +# fix pxpermm and major x axis (column "a") for each individual +# make ploting to work as function +# make distribution to rounds bins as function From 856538661e585fa1250063f007923e4c1a4ea983 Mon Sep 17 00:00:00 2001 From: milanXpetrovic Date: Tue, 7 Mar 2023 01:33:36 +0100 Subject: [PATCH 4/8] fix: angle and distance working good --- .../0_0_angle_dist_in_group.py | 37 ++++++++++++------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/fly_pipe/find_edges/automated_schneider/0_0_angle_dist_in_group.py b/fly_pipe/find_edges/automated_schneider/0_0_angle_dist_in_group.py index cfd977e..6113ff9 100644 --- a/fly_pipe/find_edges/automated_schneider/0_0_angle_dist_in_group.py +++ b/fly_pipe/find_edges/automated_schneider/0_0_angle_dist_in_group.py @@ -10,19 +10,22 @@ import matplotlib.pyplot as plt import numpy as np -treatment = fileio.load_multiple_folders("./CSf") +PATH = "../../../data/raw\CSf" +treatment = fileio.load_multiple_folders(PATH) for group_name, group_path in treatment.items(): print(group_name) group = fileio.load_files_from_folder(group_path, file_format='.csv') total = pd.DataFrame() - group_dfs = {fly: pd.read_csv(path, index_col=0) - for fly, path in group.items()} - combinations = list(itertools.permutations(group_dfs.keys(), 2)) + # group_dfs = {fly: pd.read_csv(path, index_col=0) + # for fly, path in group.items()} + + combinations = list(itertools.permutations(group.keys(), 2)) print(len(combinations)) for fly1, fly2 in combinations: - df1, df2 = group_dfs[fly1], group_dfs[fly2] + df1 = pd.read_csv(group[fly1], index_col=0) + df2 = pd.read_csv(group[fly2], index_col=0) df = pd.DataFrame() df['distance'] = np.sqrt( @@ -31,6 +34,12 @@ df['distance'] = df['distance'] / (df1.a.mean()*4) df['distance'] = round(df['distance'], 2) + df2["pos x"] = df2["pos x"] - df1["pos x"] + df2["pos y"] = df2["pos y"] - df1["pos y"] + + df1["pos x"] = df1["pos x"] - df1["pos x"] + df1["pos y"] = df1["pos y"] - df1["pos y"] + df["dfx"] = df2['pos x'] - df1['pos x'] df["dfy"] = df2['pos y'] - df1['pos y'] @@ -42,20 +51,23 @@ df['qx2'] = df1['pos x'] + cos * df["dfx"] - sin * df["dfy"] df['qy2'] = df1['pos y'] + sin * df["dfx"] + cos * df["dfy"] - df['angle'] = np.arctan2( - df["qy2"]-df1["pos y"], df["qx2"]-df1["pos x"]) + # df['angle'] = np.arctan2( + # df["qy2"]-df1["pos y"], df["qx2"]-df1["pos x"]) + df['angle'] = np.arctan2(df["qy2"], df["qx2"]) df['angle'] = np.rad2deg(df['angle']) df['angle'] = np.round(df['angle']) - df = df[df.distance <= 6] + df = df[df.distance <= 20] df = df.groupby(['angle', 'distance'] ).size().reset_index(name='counts') # df = df[['angle', 'distance']] total = pd.concat([total, df], axis=0) - total.to_csv("./0_0_angle_dist/" + group_name + ".csv") + total.to_csv( + "../../../data/find_edges/0_0_angle_dist_in_group/CSf/" + group_name + ".csv") -group = fileio.load_files_from_folder("./0_0_angle_dist/", file_format='.csv') +group = fileio.load_files_from_folder( + "../../../data/find_edges/0_0_angle_dist_in_group/CSf/", file_format='.csv') tot = pd.DataFrame() for name, path in group.items(): df = pd.read_csv(path, index_col=0) @@ -63,10 +75,10 @@ df = tot.groupby(['angle', 'distance'])[ 'counts'].sum().reset_index(name='counts') -# %% + # define the bins degree_bins = np.arange(-180, 181, 5) -distance_bins = np.arange(0, 6.001, 0.25) +distance_bins = np.arange(0, 20.001, 0.25) # calculate the 2D histogram hist, _, _ = np.histogram2d(df['angle'], df['distance'], bins=( @@ -81,7 +93,6 @@ plt.tight_layout() plt.show() - # %% degree_bins = np.arange(-180, 181, 5) distance_bins = np.arange(0, 6.001, 0.25) From b39b74b066a369d538c04e6190128bd2e3ec0fd6 Mon Sep 17 00:00:00 2001 From: milanXpetrovic Date: Mon, 13 Mar 2023 00:54:44 +0100 Subject: [PATCH 5/8] fix: better histogram and ploting --- .../0_0_angle_dist_in_group.py | 145 +++++++++--------- 1 file changed, 69 insertions(+), 76 deletions(-) diff --git a/fly_pipe/find_edges/automated_schneider/0_0_angle_dist_in_group.py b/fly_pipe/find_edges/automated_schneider/0_0_angle_dist_in_group.py index 6113ff9..39d12b5 100644 --- a/fly_pipe/find_edges/automated_schneider/0_0_angle_dist_in_group.py +++ b/fly_pipe/find_edges/automated_schneider/0_0_angle_dist_in_group.py @@ -1,39 +1,74 @@ # %% -from mpl_toolkits.mplot3d import Axes3D import sys +import json import itertools import pandas as pd import numpy as np -from fly_pipe.utils import fileio -import matplotlib.pyplot as plt -from matplotlib.image import NonUniformImage + import matplotlib.pyplot as plt -import numpy as np +from scipy.signal import find_peaks -PATH = "../../../data/raw\CSf" -treatment = fileio.load_multiple_folders(PATH) +from fly_pipe.utils import fileio + + +FPS = 22.8 +POP = "CSf" +PATH = "../../../data/raw/" + POP +OUTPUT_PATH = "../../../data/find_edges/0_0_angle_dist_in_group/" + POP +normalization = json.load(open("../../../data/normalization.json")) +pxpermm = json.load(open("../../../data/pxpermm/" + POP + ".json")) + +treatment = fileio.load_multiple_folders(PATH) for group_name, group_path in treatment.items(): print(group_name) group = fileio.load_files_from_folder(group_path, file_format='.csv') total = pd.DataFrame() - # group_dfs = {fly: pd.read_csv(path, index_col=0) - # for fly, path in group.items()} - + group_dfs = {fly: pd.read_csv(path, index_col=0) + for fly, path in group.items()} combinations = list(itertools.permutations(group.keys(), 2)) - print(len(combinations)) - for fly1, fly2 in combinations: - df1 = pd.read_csv(group[fly1], index_col=0) - df2 = pd.read_csv(group[fly2], index_col=0) + norm = normalization[group_name] + + # for fly in group.keys(): + # df1 = group_dfs[fly] + + for fly1, fly2 in combinations: + df1 = group_dfs[fly1].copy(deep=True) + df2 = group_dfs[fly2].copy(deep=True) df = pd.DataFrame() + + # df['movement'] = ((df1['pos x'] - df1['pos x'].shift()) + # ** 2 + (df1['pos y'] - df1['pos y'].shift())**2)**0.5 + + # df['movement'] = df['movement']/pxpermm[group_name]/FPS + # df.loc[0, 'movement'] = df.loc[1, 'movement'] + + # n, c = np.histogram(df['movement'].values, + # bins=np.arange(0, 2.51, 0.01)) + # opp = np.max(n) - n + # peaks, properties = find_peaks(opp/np.max(opp), prominence=0.05) + + # if len(peaks) == 0: + # movecut = 0 + + # else: + # movecut = c[peaks[0]] + + df2["pos x"] = (df2["pos x"] - norm["x"]) # / norm["radius"] + df2["pos y"] = (df2["pos y"] - norm["y"]) # / norm["radius"] + df1["pos x"] = (df1["pos x"] - norm["x"]) # / norm["radius"] + df1["pos y"] = (df1["pos y"] - norm["y"]) # / norm["radius"] + df['distance'] = np.sqrt( np.square(df1['pos x']-df2['pos x']) + np.square(df1['pos y']-df2['pos y'])) df['distance'] = df['distance'] / (df1.a.mean()*4) df['distance'] = round(df['distance'], 2) + df1.loc[df1['ori'] < 0, 'ori'] *= -1 + df2["pos x"] = df2["pos x"] - df1["pos x"] df2["pos y"] = df2["pos y"] - df1["pos y"] @@ -43,89 +78,47 @@ df["dfx"] = df2['pos x'] - df1['pos x'] df["dfy"] = df2['pos y'] - df1['pos y'] - df1.loc[df1['ori'] < 0, 'ori'] *= -1 # 2*np.pi - cos = np.cos(df1["ori"]) sin = np.sin(df1["ori"]) df['qx2'] = df1['pos x'] + cos * df["dfx"] - sin * df["dfy"] df['qy2'] = df1['pos y'] + sin * df["dfx"] + cos * df["dfy"] - # df['angle'] = np.arctan2( - # df["qy2"]-df1["pos y"], df["qx2"]-df1["pos x"]) df['angle'] = np.arctan2(df["qy2"], df["qx2"]) df['angle'] = np.rad2deg(df['angle']) df['angle'] = np.round(df['angle']) - df = df[df.distance <= 20] + df = df[df.distance <= 7] + # df = df[df.movement >= movecut] + df = df.groupby(['angle', 'distance'] ).size().reset_index(name='counts') - # df = df[['angle', 'distance']] total = pd.concat([total, df], axis=0) - total.to_csv( - "../../../data/find_edges/0_0_angle_dist_in_group/CSf/" + group_name + ".csv") -group = fileio.load_files_from_folder( - "../../../data/find_edges/0_0_angle_dist_in_group/CSf/", file_format='.csv') -tot = pd.DataFrame() + total.to_csv("{}/{}.csv".format(OUTPUT_PATH, group_name)) + +group = fileio.load_files_from_folder(OUTPUT_PATH, file_format='.csv') + +degree_bins = np.arange(0, 361, 5) +distance_bins = np.arange(0, 6.251, 0.25) +res = np.zeros((len(degree_bins)-1, len(distance_bins)-1)) + for name, path in group.items(): df = pd.read_csv(path, index_col=0) - tot = pd.concat([tot, df], axis=0) + df.loc[df['angle'] < 0, 'angle'] += 360 -df = tot.groupby(['angle', 'distance'])[ - 'counts'].sum().reset_index(name='counts') + hist, _, _ = np.histogram2d(df['angle'], df['distance'], bins=( + degree_bins, distance_bins), weights=df['counts']) -# define the bins -degree_bins = np.arange(-180, 181, 5) -distance_bins = np.arange(0, 20.001, 0.25) + norm_hist = np.ceil((hist / np.max(hist)) * 256) + res += hist -# calculate the 2D histogram -hist, _, _ = np.histogram2d(df['angle'], df['distance'], bins=( - degree_bins, distance_bins), weights=df['counts']) - -# plot the histogram as a polar heatmap -# plt.style.use('dark_background') # this makes the text and grid lines white fig, ax = plt.subplots(figsize=(10, 10), subplot_kw={'polar': True}) -ax.grid(False) # pcolormesh gives an annoying warning when the grid is on -ax.pcolormesh(np.radians(degree_bins), distance_bins, hist.T, cmap='jet') +img = ax.pcolormesh(np.radians(degree_bins), distance_bins, res.T, cmap='jet') + +ax.set_rgrids(np.arange(0, 6.251, 0.5), angle=0) ax.grid(True) + plt.tight_layout() plt.show() - -# %% -degree_bins = np.arange(-180, 181, 5) -distance_bins = np.arange(0, 6.001, 0.25) -round_bins = pd.DataFrame(0, index=distance_bins, columns=degree_bins) - -for row in df.iterrows(): - _, value = row - degree = value["angle"] - distance = value["distance"] - count = value["counts"] - degree_bin = np.digitize([degree], degree_bins)[0]-1 - distance_bin = np.digitize([distance], distance_bins)[0]-1 - round_bins.iloc[distance_bin, degree_bin] += count -n = len(degree_bins) -m = len(distance_bins) - -rad = np.linspace(0, 10., m) -a = np.linspace(0, 2 * np.pi, n) -r, th = np.meshgrid(rad, a) -z = round_bins.to_numpy().T -plt.figure(figsize=(10, 10)) -plt.subplot(projection="polar") -plt.pcolormesh(th, r, z, cmap='jet') -plt.plot(a, r, ls='none', color='k') -plt.grid() -plt.colorbar() - - -# %% -histogram = round(round_bins.sum(axis=1)) -histogram.plot(kind="bar") - -# TODO: -# fix pxpermm and major x axis (column "a") for each individual -# make ploting to work as function -# make distribution to rounds bins as function From 7932b7184dc0e45f3a3e329ddcbf65a1fe37bcbe Mon Sep 17 00:00:00 2001 From: milanXpetrovic Date: Mon, 13 Mar 2023 01:22:49 +0100 Subject: [PATCH 6/8] fix: better histogram and ploting --- .../0_0_angle_dist_in_group.py | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/fly_pipe/find_edges/automated_schneider/0_0_angle_dist_in_group.py b/fly_pipe/find_edges/automated_schneider/0_0_angle_dist_in_group.py index 39d12b5..4c3eda0 100644 --- a/fly_pipe/find_edges/automated_schneider/0_0_angle_dist_in_group.py +++ b/fly_pipe/find_edges/automated_schneider/0_0_angle_dist_in_group.py @@ -39,22 +39,22 @@ df2 = group_dfs[fly2].copy(deep=True) df = pd.DataFrame() - # df['movement'] = ((df1['pos x'] - df1['pos x'].shift()) - # ** 2 + (df1['pos y'] - df1['pos y'].shift())**2)**0.5 + df['movement'] = ((df1['pos x'] - df1['pos x'].shift()) + ** 2 + (df1['pos y'] - df1['pos y'].shift())**2)**0.5 - # df['movement'] = df['movement']/pxpermm[group_name]/FPS - # df.loc[0, 'movement'] = df.loc[1, 'movement'] + df['movement'] = df['movement']/pxpermm[group_name]*FPS + df.loc[0, 'movement'] = df.loc[1, 'movement'] - # n, c = np.histogram(df['movement'].values, - # bins=np.arange(0, 2.51, 0.01)) - # opp = np.max(n) - n - # peaks, properties = find_peaks(opp/np.max(opp), prominence=0.05) + n, c = np.histogram(df['movement'].values, + bins=np.arange(0, 2.51, 0.01)) + opp = np.max(n) - n + peaks, properties = find_peaks(opp/np.max(opp), prominence=0.05) - # if len(peaks) == 0: - # movecut = 0 + if len(peaks) == 0: + movecut = 0 # 0.01 - # else: - # movecut = c[peaks[0]] + else: + movecut = c[peaks[0]] df2["pos x"] = (df2["pos x"] - norm["x"]) # / norm["radius"] df2["pos y"] = (df2["pos y"] - norm["y"]) # / norm["radius"] @@ -89,7 +89,7 @@ df['angle'] = np.round(df['angle']) df = df[df.distance <= 7] - # df = df[df.movement >= movecut] + df = df[df.movement > movecut] df = df.groupby(['angle', 'distance'] ).size().reset_index(name='counts') @@ -98,6 +98,7 @@ total.to_csv("{}/{}.csv".format(OUTPUT_PATH, group_name)) + group = fileio.load_files_from_folder(OUTPUT_PATH, file_format='.csv') degree_bins = np.arange(0, 361, 5) @@ -112,7 +113,7 @@ degree_bins, distance_bins), weights=df['counts']) norm_hist = np.ceil((hist / np.max(hist)) * 256) - res += hist + res += norm_hist fig, ax = plt.subplots(figsize=(10, 10), subplot_kw={'polar': True}) img = ax.pcolormesh(np.radians(degree_bins), distance_bins, res.T, cmap='jet') From ce3277bf34a29f1b2f227a7654785e91bddd1721 Mon Sep 17 00:00:00 2001 From: milanXpetrovic Date: Mon, 13 Mar 2023 23:45:53 +0100 Subject: [PATCH 7/8] fix: better histogram and ploting --- .../0_0_angle_dist_in_group.py | 53 +++++++++++-------- 1 file changed, 32 insertions(+), 21 deletions(-) diff --git a/fly_pipe/find_edges/automated_schneider/0_0_angle_dist_in_group.py b/fly_pipe/find_edges/automated_schneider/0_0_angle_dist_in_group.py index 4c3eda0..f8fa86d 100644 --- a/fly_pipe/find_edges/automated_schneider/0_0_angle_dist_in_group.py +++ b/fly_pipe/find_edges/automated_schneider/0_0_angle_dist_in_group.py @@ -20,6 +20,10 @@ pxpermm = json.load(open("../../../data/pxpermm/" + POP + ".json")) treatment = fileio.load_multiple_folders(PATH) + +degree_bins = np.arange(0, 361, 5) +distance_bins = np.arange(0, 6.251, 0.25) + for group_name, group_path in treatment.items(): print(group_name) group = fileio.load_files_from_folder(group_path, file_format='.csv') @@ -31,30 +35,22 @@ norm = normalization[group_name] - # for fly in group.keys(): - # df1 = group_dfs[fly] - for fly1, fly2 in combinations: df1 = group_dfs[fly1].copy(deep=True) df2 = group_dfs[fly2].copy(deep=True) df = pd.DataFrame() - df['movement'] = ((df1['pos x'] - df1['pos x'].shift()) - ** 2 + (df1['pos y'] - df1['pos y'].shift())**2)**0.5 + df['movement_df1'] = ((df1['pos x'] - df1['pos x'].shift()) + ** 2 + (df1['pos y'] - df1['pos y'].shift())**2)**0.5 - df['movement'] = df['movement']/pxpermm[group_name]*FPS - df.loc[0, 'movement'] = df.loc[1, 'movement'] + df.loc[0, 'movement_df1'] = df.loc[1, 'movement_df1'] - n, c = np.histogram(df['movement'].values, + df['movement_df1'] = df['movement_df1']/pxpermm[group_name]/FPS + n, c = np.histogram(df['movement_df1'].values, bins=np.arange(0, 2.51, 0.01)) opp = np.max(n) - n peaks, properties = find_peaks(opp/np.max(opp), prominence=0.05) - - if len(peaks) == 0: - movecut = 0 # 0.01 - - else: - movecut = c[peaks[0]] + movecut_df1 = 0 if len(peaks) == 0 else c[peaks[0]] df2["pos x"] = (df2["pos x"] - norm["x"]) # / norm["radius"] df2["pos y"] = (df2["pos y"] - norm["y"]) # / norm["radius"] @@ -84,21 +80,33 @@ df['qx2'] = df1['pos x'] + cos * df["dfx"] - sin * df["dfy"] df['qy2'] = df1['pos y'] + sin * df["dfx"] + cos * df["dfy"] - df['angle'] = np.arctan2(df["qy2"], df["qx2"]) + df['angle'] = np.arctan2(df["dfy"], df["dfx"]) df['angle'] = np.rad2deg(df['angle']) df['angle'] = np.round(df['angle']) + df["angle_diff"] = (np.rad2deg(df1["ori"])) - df["angle"] + + while df["angle_diff"].min() < -180 and df["angle_diff"].max() > 180: + df.loc[df['angle_diff'] < -180, 'angle_diff'] += 360 + df.loc[df['angle_diff'] > 180, 'angle_diff'] -= 360 + + df["angle"] = np.round(df["angle_diff"]) + df = df[df.distance <= 7] - df = df[df.movement > movecut] + # df = df[df.movement_df1 > (movecut_df1*pxpermm[group_name]/FPS)] df = df.groupby(['angle', 'distance'] ).size().reset_index(name='counts') total = pd.concat([total, df], axis=0) - total.to_csv("{}/{}.csv".format(OUTPUT_PATH, group_name)) + # histogram and bins + # hist, _, _ = np.histogram2d(df['angle'], df['distance'], bins=( + # degree_bins, distance_bins), weights=df['counts']) + total.to_csv("{}/{}.csv".format(OUTPUT_PATH, group_name)) +# %% group = fileio.load_files_from_folder(OUTPUT_PATH, file_format='.csv') degree_bins = np.arange(0, 361, 5) @@ -115,11 +123,14 @@ norm_hist = np.ceil((hist / np.max(hist)) * 256) res += norm_hist -fig, ax = plt.subplots(figsize=(10, 10), subplot_kw={'polar': True}) -img = ax.pcolormesh(np.radians(degree_bins), distance_bins, res.T, cmap='jet') +res = np.ceil((res / np.max(res)) * 256) -ax.set_rgrids(np.arange(0, 6.251, 0.5), angle=0) -ax.grid(True) +fig, ax = plt.subplots(figsize=(8, 8), subplot_kw={'polar': True}) +img = ax.pcolormesh(np.radians(degree_bins), distance_bins, res.T, cmap="jet") + +ax.set_rgrids(np.arange(0, 6.251, 1.0), angle=0) +ax.grid(True) +plt.title("MOVECUT * pxpermm[group_name] / FPS") plt.tight_layout() plt.show() From 50d5c4da451efb350cf4a26f11fb2e8a341019e1 Mon Sep 17 00:00:00 2001 From: milanXpetrovic Date: Tue, 14 Mar 2023 17:38:02 +0100 Subject: [PATCH 8/8] Add files via upload --- .../find_edges/automated_schneider/movie1.csv | 401 ++++++++++++++++++ .../find_edges/automated_schneider/prog.txt | 49 +++ 2 files changed, 450 insertions(+) create mode 100644 fly_pipe/find_edges/automated_schneider/movie1.csv create mode 100644 fly_pipe/find_edges/automated_schneider/prog.txt diff --git a/fly_pipe/find_edges/automated_schneider/movie1.csv b/fly_pipe/find_edges/automated_schneider/movie1.csv new file mode 100644 index 0000000..94ed540 --- /dev/null +++ b/fly_pipe/find_edges/automated_schneider/movie1.csv @@ -0,0 +1,401 @@ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,1,1,1,2,2,1,3,4,3,4,3,5,5,8,6,6,6,5,5,7,9,7,5,5,4,3,4,4,3,1,1,1,1,1,1,0,1,1,2,1,1,1,1,2,2,4,4,5,5,6,7,13,9,6,7,7,5,4,6,4,5,4,4,2,4,2,1,1,2,1,1,1 +11,18,19,18,37,44,28,36,36,43,58,47,53,72,98,73,84,80,110,105,93,109,84,99,73,75,52,55,39,40,27,23,22,20,15,17,21,22,17,22,27,27,27,35,42,36,44,53,66,66,76,72,81,74,90,108,86,93,77,85,66,50,47,48,45,32,25,25,33,45,21,17,11 +85,61,91,111,88,148,89,109,132,144,139,155,137,171,163,148,143,231,211,251,168,202,164,160,151,169,149,163,154,154,111,120,96,103,75,78,84,94,103,116,127,138,144,139,124,137,156,130,125,130,171,139,146,145,195,201,182,180,191,157,177,149,156,186,136,92,83,91,91,77,59,65,85 +121,132,102,94,89,170,185,175,122,140,162,134,123,133,115,114,122,114,116,118,107,91,121,203,183,126,166,178,142,137,127,147,161,163,146,129,163,99,119,187,158,194,133,165,110,145,123,124,153,141,119,145,133,155,131,113,134,157,163,186,141,127,165,170,144,159,168,119,123,131,165,167,121 +135,108,114,132,174,131,127,126,153,153,133,98,118,122,151,191,94,106,89,119,104,120,106,110,98,108,141,119,111,120,147,105,112,148,124,124,81,117,130,117,122,116,99,124,120,104,99,85,114,87,138,110,126,107,124,104,126,122,134,155,119,114,118,127,119,158,122,122,107,108,139,127,135 +116,112,116,125,102,104,124,113,166,133,133,119,104,137,107,113,160,128,121,123,112,113,106,96,100,113,68,103,156,153,112,102,123,133,126,135,160,122,120,107,83,109,111,108,117,82,84,91,108,128,103,107,107,104,99,103,145,110,143,116,138,127,131,118,142,148,123,100,119,182,136,130,116 +152,151,137,141,142,138,117,205,204,153,138,140,119,147,180,164,152,142,119,138,150,112,172,113,110,109,114,123,128,142,126,101,138,109,113,138,136,121,126,143,113,136,190,120,122,87,133,110,92,115,112,100,102,115,119,146,130,138,131,110,132,173,155,118,163,138,132,154,149,129,117,126,152 +200,165,164,197,158,178,151,147,153,202,138,167,156,191,126,109,116,140,139,173,128,160,135,117,110,119,121,103,134,119,106,129,129,110,101,93,141,127,133,141,204,125,119,157,128,126,103,93,94,102,119,92,179,139,168,153,137,139,136,172,156,178,164,132,151,123,128,139,175,179,162,182,200 +162,176,169,170,133,132,131,153,149,178,163,138,133,167,124,146,175,136,121,130,128,149,135,120,91,130,111,117,147,122,131,139,137,105,104,95,79,111,154,102,142,108,112,126,117,114,100,109,136,143,102,132,118,144,126,126,144,102,121,125,124,178,161,125,147,150,161,127,136,191,190,199,162 +180,128,132,176,147,184,172,153,184,178,167,158,143,133,190,135,138,109,146,111,138,145,123,100,92,118,117,140,118,112,131,102,118,138,110,118,108,96,118,100,98,98,102,119,145,105,107,131,133,86,110,115,121,106,132,140,137,104,112,160,171,166,139,166,166,145,153,188,162,179,166,161,180 +166,137,145,151,172,187,154,135,145,150,138,137,110,142,171,178,131,111,106,104,146,153,120,124,137,102,129,112,156,123,112,99,94,124,99,116,127,117,119,109,106,86,110,99,104,83,117,121,117,93,116,98,90,84,94,104,113,126,135,194,169,152,153,125,139,136,153,143,195,160,166,150,166 +150,160,197,233,245,186,190,168,139,170,163,137,188,139,159,154,139,154,154,127,150,143,132,137,167,136,115,157,176,138,118,104,106,119,118,132,119,256,122,145,101,106,107,135,170,121,74,97,89,79,81,86,102,101,109,123,103,140,114,147,152,167,190,133,224,149,196,156,158,174,167,217,150 +187,139,148,252,165,139,166,190,162,169,176,133,173,151,139,175,172,122,132,117,142,142,135,167,148,139,119,163,127,154,106,143,128,104,102,100,101,114,132,158,86,121,87,76,137,70,123,120,130,104,111,118,113,113,139,107,126,158,152,139,122,122,126,137,188,168,181,161,167,203,194,220,187 +180,205,178,166,150,170,182,179,190,206,143,187,156,138,164,145,146,155,136,134,110,120,161,152,133,141,112,119,150,157,146,100,103,119,103,82,95,91,106,143,143,141,111,80,123,122,136,81,125,139,91,103,96,126,107,128,130,102,106,149,106,91,137,152,145,149,136,152,152,146,225,181,180 +153,201,249,188,177,199,158,170,159,180,202,156,115,129,116,116,110,138,112,104,102,100,127,156,123,96,109,114,97,122,105,86,88,90,74,90,99,104,96,82,122,114,101,78,100,94,112,109,123,121,71,92,75,136,123,123,139,91,95,107,146,124,112,133,166,141,224,193,191,153,243,172,153 +196,164,158,144,152,171,253,164,137,186,232,186,224,144,145,165,124,132,143,152,132,132,121,111,118,108,102,98,75,122,107,100,106,153,129,121,108,116,153,154,82,116,107,91,126,89,94,77,83,93,121,94,83,98,123,144,136,92,147,109,108,116,125,119,145,124,156,169,139,146,182,165,196 +194,148,182,226,144,147,148,139,181,210,167,181,169,134,114,109,93,140,114,185,149,117,92,121,134,85,98,124,106,73,97,131,109,137,85,86,99,121,109,101,104,78,96,132,100,92,98,70,57,81,75,89,98,95,90,107,95,91,115,111,88,112,104,114,102,189,132,152,155,117,127,128,194 +159,152,153,162,212,152,138,169,129,186,141,172,166,147,117,166,123,107,110,147,160,107,110,99,82,130,134,85,93,97,133,113,96,138,94,88,124,122,110,124,95,61,88,73,88,56,86,83,70,62,76,71,70,98,97,72,100,106,125,87,93,112,133,117,81,130,113,134,179,185,139,149,159 +164,141,160,188,161,121,139,178,145,130,146,133,108,123,89,110,105,121,125,90,92,123,122,119,91,112,76,74,87,122,113,98,87,98,90,83,81,111,84,63,69,83,101,91,50,72,90,68,78,77,72,69,110,98,123,101,65,71,81,94,104,94,112,119,97,122,135,140,129,175,163,137,164 +142,139,165,148,155,142,146,178,151,139,159,121,119,125,85,98,100,117,114,84,68,81,118,69,78,98,98,111,132,123,89,107,132,107,81,66,75,98,107,76,93,95,105,78,79,121,98,130,79,94,110,74,96,97,101,95,115,95,99,120,106,89,98,156,110,105,127,147,140,148,148,153,142 +147,164,146,182,121,106,163,164,135,133,132,118,92,97,78,106,98,131,97,93,50,66,69,91,65,70,77,98,71,68,57,134,88,108,105,61,47,64,84,70,79,112,72,94,48,79,68,65,70,74,87,83,119,74,106,108,103,79,86,81,95,106,76,111,91,134,135,111,139,132,137,191,147 +117,166,127,139,190,140,138,130,155,146,108,113,104,102,109,87,87,79,82,75,86,63,68,47,103,64,67,76,69,74,71,81,63,98,89,76,61,53,89,53,56,77,49,48,60,59,60,64,44,65,68,52,84,51,58,89,93,65,55,93,68,85,97,88,86,121,133,109,113,123,171,121,117 +139,131,150,143,122,120,123,113,141,127,113,137,131,112,87,88,77,78,60,87,68,63,82,70,68,67,72,72,101,68,88,91,91,120,81,48,72,73,48,44,47,64,45,41,40,42,42,58,71,65,64,54,48,57,50,46,102,66,76,66,68,105,134,116,129,98,139,132,121,140,155,105,139 +103,121,123,113,119,73,112,111,91,81,105,131,88,84,69,91,69,78,75,75,99,62,71,73,66,81,87,60,57,65,71,58,91,98,47,70,77,55,40,68,60,52,58,49,66,46,58,55,62,47,51,56,50,46,70,41,56,56,87,80,70,78,70,99,128,112,109,119,122,98,127,111,103 +109,95,84,126,89,90,95,109,109,111,79,92,60,71,90,92,63,79,48,46,72,73,90,58,87,99,72,89,69,62,74,55,65,50,61,52,53,64,67,32,36,47,32,58,28,50,47,50,56,49,57,31,39,46,50,43,72,35,50,61,66,93,70,100,103,99,100,88,100,107,94,96,109 +94,84,98,77,95,127,104,109,72,77,88,76,82,63,54,57,54,48,67,59,57,59,64,43,57,61,52,53,74,65,55,50,92,51,64,46,53,45,57,44,47,36,35,32,31,39,41,41,36,53,33,35,32,37,28,30,40,46,42,80,90,134,62,75,84,88,108,69,106,132,161,141,94 +87,91,96,88,108,142,91,99,69,74,87,64,59,65,73,52,65,54,58,53,63,51,48,54,59,60,49,80,64,68,61,38,53,56,63,42,50,44,53,50,35,53,26,36,43,54,51,56,51,54,36,42,34,41,38,55,45,55,35,40,46,38,79,104,75,81,84,86,62,82,88,100,87 +96,89,89,70,79,98,121,114,80,67,71,94,85,59,50,85,61,59,65,37,49,36,50,49,59,50,47,41,53,51,33,42,48,51,67,32,45,29,41,54,38,55,49,38,76,46,57,30,37,43,20,31,25,29,24,38,31,37,35,57,57,50,70,83,67,72,67,115,70,75,83,87,96 +67,76,62,50,60,87,78,73,70,96,67,62,42,41,28,36,46,26,50,35,45,50,63,45,62,54,44,39,43,57,44,45,29,41,30,35,45,43,40,39,44,37,41,46,47,43,52,74,45,27,24,40,36,49,35,30,57,31,31,38,43,48,42,58,80,46,54,61,61,115,103,79,67 +72,55,63,74,85,54,46,71,67,90,67,39,48,40,36,25,26,34,35,46,40,42,56,34,37,30,37,33,40,42,51,26,32,49,42,46,51,36,50,41,33,33,43,39,46,36,35,38,50,34,40,26,37,36,38,35,49,36,59,45,48,54,48,49,50,42,55,55,61,67,81,60,72 +57,71,54,51,41,72,60,53,42,46,61,41,47,28,24,25,21,24,15,24,28,33,45,42,41,32,38,52,36,27,36,26,25,17,40,20,22,19,39,49,23,25,32,36,45,42,33,27,18,22,32,27,23,44,30,26,36,20,31,40,62,60,38,81,54,48,54,58,62,65,68,55,57 +54,59,58,51,56,53,46,39,34,39,45,31,21,28,28,28,22,15,16,49,31,24,57,64,38,36,46,58,51,53,38,28,23,25,26,26,32,23,26,38,29,29,24,37,48,35,28,40,36,28,13,14,34,26,28,20,30,30,29,31,28,45,55,62,62,58,46,41,42,58,56,47,54 +42,43,51,43,65,63,49,36,44,37,39,24,26,21,14,21,18,14,13,20,32,29,51,29,40,42,53,27,31,37,22,25,27,56,37,35,39,34,38,19,31,29,28,22,37,38,38,30,23,32,30,55,25,13,16,10,25,28,31,36,20,30,34,60,57,49,37,43,40,42,51,43,42 +49,44,39,52,54,39,27,34,36,29,20,19,19,18,22,23,16,17,24,20,17,14,23,41,38,35,33,24,31,21,39,18,38,22,17,21,35,32,19,17,25,18,33,32,44,47,48,23,23,18,15,13,14,23,17,11,15,15,21,24,36,27,47,46,40,44,35,34,39,47,46,47,49 +33,46,46,43,37,43,35,24,26,34,20,16,19,14,10,9,10,15,16,11,16,14,19,30,31,25,23,21,29,18,16,11,16,17,16,32,18,12,14,19,15,34,27,30,31,38,25,31,24,16,13,15,17,17,26,15,12,9,18,30,21,33,43,47,43,28,29,55,34,50,34,36,33 +36,58,44,42,42,26,25,20,23,29,17,18,9,13,9,13,13,20,14,12,17,22,16,30,27,20,35,25,24,28,34,13,12,9,20,13,14,16,23,10,23,78,21,21,22,37,29,15,14,17,16,10,20,20,26,32,25,16,19,19,37,33,27,30,41,27,33,26,28,32,33,38,36 +30,25,26,38,34,27,33,35,22,32,17,11,10,14,12,7,9,16,17,18,14,21,23,25,18,31,29,26,41,18,24,13,13,13,13,11,11,16,34,13,23,19,18,24,23,17,22,13,24,14,24,14,20,19,12,13,18,8,12,18,24,31,20,31,30,25,31,27,28,33,27,39,30 +33,43,41,59,38,44,21,26,38,20,14,19,16,15,11,11,9,12,13,11,16,20,17,24,29,27,27,25,25,33,18,13,12,9,13,14,14,19,24,16,26,33,12,12,26,19,17,21,17,26,14,13,8,10,10,13,17,11,13,16,17,37,28,36,23,21,23,31,28,26,22,24,33 +24,27,22,31,29,29,18,26,27,20,20,12,11,13,15,17,9,12,11,18,19,16,23,17,19,15,20,28,27,13,9,16,16,15,14,7,12,10,12,12,18,13,10,14,24,14,22,17,10,13,18,11,18,9,9,15,9,9,9,25,14,19,28,23,23,19,30,38,26,24,24,31,24 +44,26,53,25,20,21,16,23,16,24,11,9,10,8,14,10,19,11,10,9,11,12,12,13,15,13,20,12,17,11,11,16,14,12,14,11,11,24,14,14,23,13,19,15,16,21,15,20,15,13,9,8,12,10,12,5,9,9,11,14,20,17,18,24,21,18,24,21,23,23,21,31,44 +42,31,24,20,17,35,17,31,19,18,13,15,11,10,12,9,10,6,13,31,24,17,13,12,9,10,11,7,9,9,10,23,12,9,9,19,13,39,31,20,30,19,18,28,24,26,55,21,18,11,9,17,9,22,15,10,10,16,10,13,21,14,14,20,25,31,30,19,19,40,23,37,42 +21,32,25,21,17,29,23,17,28,16,18,26,12,7,5,5,8,5,6,6,16,14,16,11,7,10,13,8,7,8,7,50,19,6,11,7,16,18,16,25,26,13,16,18,25,22,33,13,9,7,12,20,11,19,12,7,8,14,20,10,19,13,15,17,19,26,21,18,19,15,45,21,21 +16,17,15,31,28,11,18,17,14,13,19,6,6,8,5,6,5,5,7,6,7,13,16,7,6,10,14,8,11,11,18,10,9,14,10,6,10,9,15,26,21,14,14,20,23,12,12,11,12,15,8,6,12,27,23,22,35,20,8,11,22,14,22,19,17,20,19,17,21,13,17,20,16 +15,15,13,13,20,12,16,15,12,10,13,10,9,7,4,9,6,5,10,79,31,16,12,10,7,8,18,9,6,13,17,4,5,4,19,17,12,11,10,11,6,4,7,16,12,15,14,20,11,28,10,7,9,20,22,27,21,14,11,12,14,16,16,17,16,16,18,18,14,13,15,16,15 +15,13,12,13,31,14,23,11,8,11,13,11,8,7,6,11,8,7,7,8,28,25,19,28,7,11,23,13,13,6,13,7,7,11,16,26,20,6,14,17,10,27,11,9,8,31,19,31,7,7,7,5,7,5,10,5,7,4,8,9,10,15,12,13,12,13,15,16,13,12,16,13,15 +9,11,15,13,14,13,14,24,12,13,10,7,9,9,7,15,8,5,4,25,28,14,11,24,27,6,12,37,14,9,17,11,6,36,6,47,17,12,49,57,23,10,15,24,20,10,12,20,13,5,7,5,6,5,8,4,6,8,17,15,4,6,9,12,20,9,14,15,19,13,10,10,9 +9,12,14,10,15,12,15,11,9,10,8,6,7,7,7,12,11,7,10,20,26,25,8,8,7,14,36,9,31,8,36,15,8,12,32,40,13,7,20,69,18,13,10,20,16,18,9,28,8,11,6,12,16,6,6,7,7,6,18,9,6,14,11,8,12,11,11,13,12,10,9,8,9 +11,9,18,13,11,19,13,14,15,10,11,22,17,34,17,13,22,8,13,17,12,9,7,7,4,6,6,30,16,13,8,5,8,6,13,13,13,5,7,27,12,17,6,33,16,9,6,4,5,24,31,17,6,5,4,10,10,14,12,14,11,9,7,7,9,11,11,10,11,11,11,7,11 +7,7,30,21,46,19,10,16,12,10,9,14,9,13,8,16,10,14,9,10,7,9,8,5,6,4,5,7,16,5,8,6,9,8,26,19,18,22,10,57,29,13,9,18,17,9,8,5,5,10,14,9,6,3,4,28,7,17,16,12,32,10,7,7,7,8,8,9,8,8,7,7,7 +5,7,6,7,7,8,7,10,11,24,9,8,16,10,30,31,8,5,11,11,7,5,8,8,5,4,3,29,32,7,5,5,4,36,43,59,18,23,28,23,32,6,7,11,5,3,2,6,5,3,6,6,3,6,3,7,5,6,6,4,6,6,10,9,5,7,10,7,9,9,8,9,5 +7,8,5,8,6,7,11,12,11,7,9,12,16,6,8,26,28,19,12,16,9,9,11,28,9,6,3,4,31,20,11,8,9,46,12,20,7,8,22,10,10,9,9,17,8,4,3,5,6,7,3,4,3,3,5,16,4,5,11,4,5,6,9,18,5,7,6,6,3,5,10,13,7 +16,11,7,9,12,12,12,10,7,5,10,31,6,16,17,21,21,24,10,15,20,5,16,13,40,23,5,7,9,13,10,22,22,18,10,8,28,10,12,7,7,20,18,10,17,15,3,5,7,6,6,3,4,5,5,7,3,5,6,3,4,7,5,9,7,4,8,5,4,4,4,5,16 +4,5,6,6,9,10,6,6,9,5,9,10,10,7,16,14,38,28,12,15,10,7,7,20,7,8,8,8,9,5,5,24,21,28,5,5,7,40,16,41,58,10,7,11,21,18,14,11,7,5,4,6,3,4,7,5,9,8,6,11,5,6,7,17,5,17,33,5,5,4,9,11,4 +7,20,5,12,11,6,11,8,5,3,10,9,17,25,23,16,14,23,21,26,13,10,10,11,11,22,20,4,8,6,5,3,6,29,2,4,6,41,15,23,50,7,11,14,23,17,38,18,3,15,16,6,16,9,13,7,3,5,3,4,3,4,10,5,2,5,8,5,3,4,6,5,7 +6,6,6,17,11,6,11,17,5,5,16,25,10,12,19,20,14,14,20,22,17,5,10,5,6,9,7,6,9,8,11,5,7,19,12,11,24,11,14,11,13,17,29,14,13,7,5,4,2,2,4,6,12,3,3,10,3,7,6,4,6,8,3,7,4,4,5,5,7,3,3,5,6 +4,4,4,8,19,7,11,8,12,5,5,8,14,30,16,25,23,22,16,9,19,7,8,9,22,15,12,7,6,11,16,10,4,2,11,5,5,9,35,32,10,5,6,9,18,10,4,13,4,3,4,3,4,7,4,4,3,3,3,4,5,7,4,4,7,3,6,7,4,3,4,5,4 +4,4,4,6,9,27,15,6,2,3,6,6,11,11,23,16,11,15,11,5,6,9,15,28,5,10,13,25,15,16,9,13,4,1,6,5,10,19,13,19,10,14,14,19,23,3,6,4,16,2,2,2,23,17,6,5,7,7,4,6,9,8,10,22,12,17,13,10,10,12,3,6,4 +3,4,24,11,5,6,7,17,5,18,5,9,6,9,11,7,15,9,17,16,17,20,19,12,14,11,9,15,29,7,6,22,7,16,3,10,10,8,17,14,5,6,9,8,5,4,6,6,6,2,7,5,8,11,10,3,13,13,10,3,5,22,4,4,7,19,13,10,6,5,5,4,3 +5,17,38,4,5,4,9,18,5,3,13,5,6,13,9,15,23,17,13,23,17,12,5,9,6,20,14,19,6,16,4,6,16,32,15,36,6,7,7,6,3,6,11,7,3,4,7,20,3,6,5,7,9,7,5,7,14,11,7,7,7,16,5,5,6,12,20,11,11,16,12,22,5 +6,4,3,3,6,4,12,15,6,5,5,7,11,8,16,60,19,11,10,27,15,9,11,5,8,3,12,40,9,16,4,6,11,8,27,7,11,14,13,17,8,4,5,3,2,2,4,5,5,6,6,11,6,4,9,4,2,11,5,10,5,33,14,9,8,25,12,6,10,4,6,4,6 +6,13,5,9,8,10,4,4,4,4,7,19,9,23,20,42,15,8,14,14,9,9,9,6,10,9,23,20,23,9,22,21,5,2,2,5,9,8,9,12,50,7,7,2,2,6,4,16,17,4,6,5,5,8,5,3,6,6,9,10,4,5,5,8,9,14,8,12,7,4,2,8,6 +5,6,12,6,8,15,7,12,6,9,11,15,31,19,10,16,8,5,16,6,9,9,11,8,15,4,4,8,11,5,5,10,9,2,3,12,10,26,24,15,3,5,3,6,5,21,10,13,28,16,21,3,11,16,6,4,5,4,7,7,6,10,5,32,11,10,9,9,10,5,6,3,5 +3,3,9,7,10,5,5,3,10,4,9,12,6,5,7,7,6,5,13,5,6,13,12,14,11,9,16,12,14,6,5,6,9,3,3,5,22,11,12,5,5,3,3,7,2,2,22,16,26,23,18,3,5,7,5,3,11,4,5,4,5,10,5,5,4,5,4,4,3,7,3,5,3 +2,2,4,12,6,3,2,2,6,5,4,4,4,10,6,7,7,5,24,12,6,25,16,8,8,10,35,11,7,45,10,3,5,4,8,9,5,4,4,5,3,2,4,2,1,3,6,12,8,7,9,9,5,12,9,5,5,8,4,4,5,15,14,4,3,4,3,4,9,5,6,4,2 +2,2,4,4,4,5,2,2,2,5,2,2,8,8,9,10,19,8,12,5,12,10,9,11,11,14,4,5,3,3,32,1,5,6,30,30,19,2,2,2,1,2,2,1,2,3,7,9,10,6,7,7,6,11,5,3,1,2,3,3,5,6,7,5,5,4,4,5,6,6,10,4,2 +11,3,3,2,3,8,2,2,3,4,5,4,6,4,5,4,8,5,10,16,6,13,6,4,5,4,7,3,21,2,17,3,2,3,4,21,4,8,5,1,2,1,4,2,2,2,8,8,32,25,8,8,7,15,15,9,5,9,3,3,15,4,4,7,5,6,6,6,4,5,6,9,11 +10,2,4,6,4,4,14,5,7,4,4,3,9,8,5,13,10,7,9,8,9,9,6,7,16,7,2,24,4,1,2,2,2,13,4,18,4,5,2,1,1,2,2,13,7,13,4,6,14,28,4,9,18,3,4,6,4,7,4,8,7,9,9,6,5,5,10,15,5,6,6,8,10 +3,7,3,5,12,3,11,5,12,4,3,4,4,9,12,6,7,7,6,7,7,6,5,5,6,3,1,7,2,2,3,1,1,7,5,12,42,4,1,1,1,1,7,3,3,2,3,6,14,20,17,3,6,4,8,3,3,3,8,13,7,5,6,6,8,6,10,5,5,5,4,5,3 +10,9,3,13,14,1,1,7,7,4,5,6,17,8,5,4,5,6,4,5,7,4,2,3,13,1,1,2,1,1,1,1,2,6,29,16,2,12,2,3,2,6,3,2,3,2,7,11,7,8,4,4,4,4,8,5,5,9,6,10,8,5,7,7,13,5,4,9,5,2,5,6,10 +12,3,3,2,6,5,1,2,2,2,5,13,4,5,4,4,3,5,5,4,6,8,2,2,3,1,1,1,1,1,1,1,1,5,9,9,1,4,8,2,5,4,1,3,3,3,13,32,49,19,11,14,3,3,5,17,4,6,6,4,14,7,6,11,5,4,5,6,12,2,9,8,12 +4,3,1,1,1,1,1,3,7,3,4,7,6,4,4,5,3,2,5,4,4,8,9,3,2,1,1,1,1,1,1,1,1,1,3,1,1,4,3,1,2,1,3,2,1,2,16,41,7,6,13,6,2,2,6,12,5,6,12,4,5,4,3,9,4,4,8,5,5,3,2,2,4 +5,3,1,2,11,2,1,1,1,1,1,1,2,8,7,3,2,1,2,5,5,2,2,1,2,1,1,1,1,1,1,1,1,1,1,1,1,10,2,1,1,1,6,2,1,3,2,2,2,2,7,5,2,2,1,2,5,9,8,2,2,3,3,8,5,7,3,4,3,2,2,4,5 +4,2,1,6,16,8,3,1,1,1,1,2,3,2,2,2,2,2,6,3,6,2,2,1,1,1,1,2,1,1,1,0,1,1,2,1,2,1,1,8,3,1,2,4,9,6,11,2,3,4,3,3,3,4,1,1,4,9,3,1,2,2,4,4,3,5,4,3,3,2,2,3,4 +4,2,2,1,3,3,5,1,3,3,2,2,3,5,5,3,4,6,4,3,5,1,1,2,1,1,3,1,1,1,1,1,1,1,1,0,2,1,1,1,3,1,2,1,2,2,7,8,7,4,1,1,2,2,6,2,5,4,3,3,2,3,11,3,3,3,2,3,1,1,2,3,4 +2,5,5,1,4,2,1,1,1,1,1,2,2,3,2,3,3,3,4,7,5,2,2,1,1,1,1,2,1,1,1,1,0,1,0,1,1,0,1,1,1,1,5,2,4,1,4,11,16,11,4,1,2,2,9,5,4,3,2,2,5,3,3,8,4,4,1,5,5,4,1,3,2 +3,1,1,1,1,1,1,1,1,1,1,1,2,1,1,3,3,5,7,4,3,2,3,1,1,1,1,0,0,1,0,0,1,1,0,0,0,0,0,0,1,4,4,4,13,17,4,2,3,21,24,12,12,7,10,6,3,3,7,2,1,2,3,9,2,6,2,1,2,1,2,2,3 +2,2,2,3,15,1,1,1,1,1,1,2,1,2,3,4,3,2,2,1,1,2,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,2,1,4,5,10,1,3,4,1,1,2,4,1,1,3,1,2,2,2,3,3,2,1,2,1,1,1,2,2,2,2 +2,4,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,4,16,10,17,11,1,1,1,0,1,1,2,2,2,2,1,1,8,10,1,1,1,1,1,1,1,1,2 +1,1,2,2,2,1,1,1,1,1,1,2,2,2,3,2,2,2,1,2,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,2,1,11,14,8,3,1,1,1,1,1,1,1,2,1,1,1,2,2,4,4,2,1,1,1,1,1,1,1,1 +1,2,2,1,1,1,2,1,1,1,1,1,2,2,2,2,2,2,4,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,3,1,0,0,0,0,0,1,1,1,1,2,2,2,2,3,1,1,1,1,2,4,4,1,1,1 +1,3,2,1,1,1,2,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1 +1,2,2,1,1,1,1,1,1,1,1,2,1,1,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1 +0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/fly_pipe/find_edges/automated_schneider/prog.txt b/fly_pipe/find_edges/automated_schneider/prog.txt new file mode 100644 index 0000000..a2fde31 --- /dev/null +++ b/fly_pipe/find_edges/automated_schneider/prog.txt @@ -0,0 +1,49 @@ +INPUTI U PROGRAM ZA ODREDIVANJE KRITERIJA + +INPUTS: + -strains is a cell containing string names + -n is a whole number for how many trials to use each pass + -nrand1 is a whole number for how many passes + -nrand2 is a whole number for how many pseudo trials used in each pass + -distance_bin is a number for distance bins (in body lengths) + [default 0.25] + -angle_bin same but for angles [default 5] + -start indicates what time index to start calculations (in min) + [default 0] + -exptime indicates when to stop calculations (in min) [default 30] + Note that you need to have enough frames for exptime+start + -offsettime if ~0, will stagger pseudo trials randomly in time + from 0 to offsettime (in min) [default 0] + -resample indicates whether or not to re-use trials when making pseudo- + trials (only use when also giving offsettime!) [default 0] + -distance_max is the upper limit to look for spatial configurations + [default = 50 body lengths] + +- seed za random odabir fileova + +- config file sa postavkama 'Bootstrap Criteria Settings.txt' + +- provjera i ucitavanje dataseta + +- provjera ako postoji i ucitavanje normalizacije + - ako ne postoji, generira se pomocu skripe Normalize + +- provjera ako podaci imaju duzinu od zadanog broja minuta + +- ucitavaju se sojevi, tj. populacije i onda program ide populaciju po populaciju i racuna parametre nad grupama koje pronadje u tom folderu + +GLAVNI DIO PROGRAMA + +- prvo iterira po strainsima, tj. onoliko koliko ima foldera u .\raw + +- nakon sto krene iteracija po strainsima odabire se jedan strain koji se obraduje + +- prvo provjera ako je vec obradjen, ako je onda ide dalje i ispisuje da je vec obradjen + +- opcija za eliminaciju musica koje se ne krecu, kod njih je postavljeno na 0 al ako je na 1 onda se poziva funkcija get_movecut() + +- u paraleli se racunaju za svaku grupu distance i kutovi sa funkcijom fast_fly_space() +- racuna se matrica koja ima dimenzije 401x73x26 +distance bins, angle bins, za svaku populaciju + +sprema se u temp_home.mat