From e11dc06fb58492c2724822c277366b5011a31fb0 Mon Sep 17 00:00:00 2001 From: zzangupenn Date: Fri, 6 Jun 2025 02:26:45 -0400 Subject: [PATCH 01/54] todo list --- README.md | 56 +++---------------- .../envs/dynamic_models/single_track.py | 2 +- 2 files changed, 10 insertions(+), 48 deletions(-) diff --git a/README.md b/README.md index deafba72..5883a806 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,13 @@ -![Python 3.8 3.9](https://github.com/f1tenth/f1tenth_gym/actions/workflows/ci.yml/badge.svg) -![Docker](https://github.com/f1tenth/f1tenth_gym/actions/workflows/docker.yml/badge.svg) -![Code Style](https://github.com/f1tenth/f1tenth_gym/actions/workflows/lint.yml/badge.svg) - # The F1TENTH Gym environment -This is the repository of the F1TENTH Gym environment. - -This project is still under heavy developement. - -You can find the [documentation](https://f1tenth-gym.readthedocs.io/en/latest/) of the environment here. +Zirui branch TODO list: +- [ ] verify collision +- [ ] scan toggle +- [ ] separate time step and integrater time step +- [ ] add frenet +- [ ] use correct loop count +- [ ] simplify observation +- [ ] simplify reset ## Quickstart We recommend installing the simulation inside a virtualenv. You can install the environment by running: @@ -25,41 +24,4 @@ Then you can run a quick waypoint follow example by: ```bash cd examples python3 waypoint_follow.py -``` - -A Dockerfile is also provided with support for the GUI with nvidia-docker (nvidia GPU required): -```bash -docker build -t f1tenth_gym_container -f Dockerfile . -docker run --gpus all -it -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix f1tenth_gym_container -```` -Then the same example can be ran. - -## Known issues -- Library support issues on Windows. You must use Python 3.8 as of 10-2021 -- On MacOS Big Sur and above, when rendering is turned on, you might encounter the error: -``` -ImportError: Can't find framework /System/Library/Frameworks/OpenGL.framework. -``` -You can fix the error by installing a newer version of pyglet: -```bash -$ pip3 install pyglet==1.5.11 -``` -And you might see an error similar to -``` -gym 0.17.3 requires pyglet<=1.5.0,>=1.4.0, but you'll have pyglet 1.5.11 which is incompatible. -``` -which could be ignored. The environment should still work without error. - -## Citing -If you find this Gym environment useful, please consider citing: - -``` -@inproceedings{okelly2020f1tenth, - title={F1TENTH: An Open-source Evaluation Environment for Continuous Control and Reinforcement Learning}, - author={O’Kelly, Matthew and Zheng, Hongrui and Karthik, Dhruv and Mangharam, Rahul}, - booktitle={NeurIPS 2019 Competition and Demonstration Track}, - pages={77--89}, - year={2020}, - organization={PMLR} -} -``` +``` \ No newline at end of file diff --git a/f1tenth_gym/envs/dynamic_models/single_track.py b/f1tenth_gym/envs/dynamic_models/single_track.py index 7a1e3516..eea349f1 100644 --- a/f1tenth_gym/envs/dynamic_models/single_track.py +++ b/f1tenth_gym/envs/dynamic_models/single_track.py @@ -16,7 +16,7 @@ def vehicle_dynamics_st(x: np.ndarray, u_init: np.ndarray, params: dict): x1: y position in global coordinates x2: steering angle of front wheels x3: velocity in x direction - x4:yaw angle + x4: yaw angle x5: yaw rate x6: slip angle at vehicle center u (numpy.ndarray (2, )): control input vector (u1, u2) From 3cb8746024b69add2a80f4df7e79772f83666783 Mon Sep 17 00:00:00 2001 From: zzangupenn Date: Fri, 6 Jun 2025 03:03:00 -0400 Subject: [PATCH 02/54] todo list --- README.md | 2 ++ f1tenth_gym/envs/f110_env.py | 1 + 2 files changed, 3 insertions(+) diff --git a/README.md b/README.md index 5883a806..ed8b6e35 100644 --- a/README.md +++ b/README.md @@ -3,11 +3,13 @@ Zirui branch TODO list: - [ ] verify collision - [ ] scan toggle +- [ ] scan plot - [ ] separate time step and integrater time step - [ ] add frenet - [ ] use correct loop count - [ ] simplify observation - [ ] simplify reset +- [ ] control_buffer_size ## Quickstart We recommend installing the simulation inside a virtualenv. You can install the environment by running: diff --git a/f1tenth_gym/envs/f110_env.py b/f1tenth_gym/envs/f110_env.py index f18c5636..35cbb960 100644 --- a/f1tenth_gym/envs/f110_env.py +++ b/f1tenth_gym/envs/f110_env.py @@ -392,6 +392,7 @@ def default_config(cls) -> dict: "params": cls.f1tenth_vehicle_params(), "num_agents": 2, "timestep": 0.01, + "integrator_timestep": 0.01, "ego_idx": 0, "integrator": "rk4", "model": "st", From 0c4f534bb9afe7c8eccb2d00ae4d127fa3e2023e Mon Sep 17 00:00:00 2001 From: zzangupenn Date: Sat, 7 Jun 2025 17:14:51 -0400 Subject: [PATCH 03/54] clip lidar scan, add renderer toggle, remove dict in dynamics functions and std_state, simplified std_state and obs --- README.md | 6 +- examples/waypoint_follow.py | 20 +- f1tenth_gym/envs/base_classes.py | 40 +- f1tenth_gym/envs/dynamic_models/__init__.py | 10 +- f1tenth_gym/envs/dynamic_models/kinematic.py | 399 +++-- .../dynamic_models/multi_body/multi_body.py | 1568 +++++++++++------ .../dynamic_models/multi_body/tire_model.py | 168 +- .../multi_body/tire_model_new.py | 184 ++ .../envs/dynamic_models/single_track.py | 350 ++-- f1tenth_gym/envs/f110_env.py | 62 +- f1tenth_gym/envs/integrator.py | 18 +- f1tenth_gym/envs/laser_models.py | 10 +- f1tenth_gym/envs/observation.py | 67 +- 13 files changed, 1860 insertions(+), 1042 deletions(-) create mode 100644 f1tenth_gym/envs/dynamic_models/multi_body/tire_model_new.py diff --git a/README.md b/README.md index ed8b6e35..120a9258 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,15 @@ # The F1TENTH Gym environment Zirui branch TODO list: +- [x] clip lidar after adding noise, put lidar noise in config +- [x] remove unnecessary use of dictionary. model st is 50% faster, mb is 150% faster. +- [x] toggle renderer - [ ] verify collision - [ ] scan toggle -- [ ] scan plot - [ ] separate time step and integrater time step - [ ] add frenet - [ ] use correct loop count -- [ ] simplify observation +- [x] simplify std_state observation - [ ] simplify reset - [ ] control_buffer_size diff --git a/examples/waypoint_follow.py b/examples/waypoint_follow.py index 893af2f0..b69b3ceb 100644 --- a/examples/waypoint_follow.py +++ b/examples/waypoint_follow.py @@ -314,11 +314,13 @@ def main(): "timestep": 0.01, "integrator": "rk4", "control_input": ["speed", "steering_angle"], - "model": "mb", - "observation_config": {"type": "kinematic_state"}, + "model": "mb", # "ks", "st", "mb" + "observation_config": {"type": "dynamic_state"}, + # "params": F110Env.f1tenth_vehicle_params(), "params": F110Env.fullscale_vehicle_params(), "reset_config": {"type": "rl_random_static"}, "scale": 10.0, + "enable_rendering": 0, }, render_mode="human", ) @@ -327,6 +329,8 @@ def main(): planner = PurePursuitPlanner( track=track, wb=( + # F110Env.f1tenth_vehicle_params()["lf"] + # + F110Env.f1tenth_vehicle_params()["lr"] F110Env.fullscale_vehicle_params()["lf"] + F110Env.fullscale_vehicle_params()["lr"] ), @@ -342,19 +346,25 @@ def main(): laptime = 0.0 start = time.time() + times = [] while not done: action = env.action_space.sample() for i, agent_id in enumerate(obs.keys()): speed, steer = planner.plan( - obs[agent_id]["pose_x"], - obs[agent_id]["pose_y"], - obs[agent_id]["pose_theta"], + obs[agent_id]["std_state"][0], + obs[agent_id]["std_state"][1], + obs[agent_id]["std_state"][4], work["tlad"], work["vgain"], ) action[i] = np.array([steer, speed]) + t1 = time.time() obs, step_reward, done, truncated, info = env.step(action) + times.append(1/(time.time() - t1)) + if len(times) > 10000: + print("FPS:", np.mean(times)) + times = [] laptime += step_reward frame = env.render() diff --git a/f1tenth_gym/envs/base_classes.py b/f1tenth_gym/envs/base_classes.py index 4bfe5c82..8ca4e4c8 100644 --- a/f1tenth_gym/envs/base_classes.py +++ b/f1tenth_gym/envs/base_classes.py @@ -102,6 +102,11 @@ def __init__( self.integrator = integrator self.action_type = action_type self.model = model + if self.model == DynamicModel.MB: + from .dynamic_models.multi_body.multi_body import sequential_param_keys + self.sequential_param_keys = sequential_param_keys + else: + self.sequential_param_keys = None self.standard_state_fn = self.model.get_standardized_state_fn() # state of the vehicle @@ -308,9 +313,31 @@ def update_pose(self, raw_steer, vel): u_np = np.array([sv, accl]) f_dynamics = self.model.f_dynamics - self.state = self.integrator.integrate( - f=f_dynamics, x=self.state, u=u_np, dt=self.time_step, params=self.params - ) + if self.model == DynamicModel.MB: + self.state = self.integrator.integrate( + f_dynamics, self.state, u_np, self.time_step, [self.params[key] for key in self.sequential_param_keys] + ) + else: + self.state = self.integrator.integrate( + f_dynamics, self.state, u_np, self.time_step, *[self.params['mu'], + self.params['C_Sf'], + self.params['C_Sr'], + self.params['lf'], + self.params['lr'], + self.params['h'], + self.params['m'], + self.params['I'], + self.params['s_min'], + self.params['s_max'], + self.params['sv_min'], + self.params['sv_max'], + self.params['v_switch'], + self.params['a_max'], + self.params['v_min'], + self.params['v_max'], + self.params['width'], + self.params['length']] + ) # bound yaw angle self.state[4] %= 2 * np.pi # TODO: This is a problem waiting to happen @@ -358,14 +385,17 @@ def update_scan(self, agent_scans, agent_index): agent_scans[agent_index] = new_scan @property - def standard_state(self) -> dict: + def standard_state(self) -> np.ndarray: """ Returns the state of the vehicle as an observation Returns: np.ndarray (7, ): state of the vehicle """ - return self.standard_state_fn(self.state) + # t1 = time.time() + standard_state = self.standard_state_fn(self.state) + # print(time.time() - t1) + return standard_state class Simulator(object): diff --git a/f1tenth_gym/envs/dynamic_models/__init__.py b/f1tenth_gym/envs/dynamic_models/__init__.py index bc011941..1d7f262e 100644 --- a/f1tenth_gym/envs/dynamic_models/__init__.py +++ b/f1tenth_gym/envs/dynamic_models/__init__.py @@ -39,15 +39,19 @@ def get_initial_state(self, pose=None, params: Optional[dict] = None): # initialize zero state if self == DynamicModel.KS: # state is [x, y, steer_angle, vel, yaw_angle] - state = np.zeros(5) + self.state_dim = 5 + self.control_dim = 2 elif self == DynamicModel.ST: # state is [x, y, steer_angle, vel, yaw_angle, yaw_rate, slip_angle] - state = np.zeros(7) + self.state_dim = 7 + self.control_dim = 2 elif self == DynamicModel.MB: # state is a 29D vector - state = np.zeros(29) + self.state_dim = 29 + self.control_dim = 2 else: raise ValueError(f"Unknown model type {self}") + state = np.zeros(self.state_dim) # set initial pose if provided if pose is not None: diff --git a/f1tenth_gym/envs/dynamic_models/kinematic.py b/f1tenth_gym/envs/dynamic_models/kinematic.py index cdd6a468..85d45789 100644 --- a/f1tenth_gym/envs/dynamic_models/kinematic.py +++ b/f1tenth_gym/envs/dynamic_models/kinematic.py @@ -1,189 +1,284 @@ import numpy as np from numba import njit -from numba.typed import Dict from .utils import steering_constraint, accl_constraints -def vehicle_dynamics_ks(x: np.ndarray, u_init: np.ndarray, params: dict): - """ - Single Track Kinematic Vehicle Dynamics. - Follows https://gitlab.lrz.de/tum-cps/commonroad-vehicle-models/-/blob/master/vehicleModels_commonRoad.pdf, section 5 - - Args: - x (numpy.ndarray (5, )): vehicle state vector (x0, x1, x2, x3, x4) - x0: x position in global coordinates - x1: y position in global coordinates - x2: steering angle of front wheels - x3: velocity in x direction - x4: yaw angle - u (numpy.ndarray (2, )): control input vector (u1, u2) - u1: steering angle velocity of front wheels - u2: longitudinal acceleration - params (dict): dictionary containing the following parameters: - mu (float): friction coefficient - C_Sf (float): cornering stiffness of front wheels - C_Sr (float): cornering stiffness of rear wheels - lf (float): distance from center of gravity to front axle - lr (float): distance from center of gravity to rear axle - h (float): height of center of gravity - m (float): mass of vehicle - I (float): moment of inertia of vehicle, about Z axis - s_min (float): minimum steering angle - s_max (float): maximum steering angle - sv_min (float): minimum steering velocity - sv_max (float): maximum steering velocity - v_switch (float): velocity above which the acceleration is no longer able to create wheel slip - a_max (float): maximum allowed acceleration - v_min (float): minimum allowed velocity - v_max (float): maximum allowed velocity - - Returns: - f (numpy.ndarray): right hand side of differential equations - """ +# def vehicle_dynamics_ks(x: np.ndarray, u_init: np.ndarray, params: dict): +# """ +# Single Track Kinematic Vehicle Dynamics. +# Follows https://gitlab.lrz.de/tum-cps/commonroad-vehicle-models/-/blob/master/vehicleModels_commonRoad.pdf, section 5 + +# Args: +# x (numpy.ndarray (5, )): vehicle state vector (x0, x1, x2, x3, x4) +# x0: x position in global coordinates +# x1: y position in global coordinates +# x2: steering angle of front wheels +# x3: velocity in x direction +# x4: yaw angle +# u (numpy.ndarray (2, )): control input vector (u1, u2) +# u1: steering angle velocity of front wheels +# u2: longitudinal acceleration +# params (dict): dictionary containing the following parameters: +# mu (float): friction coefficient +# C_Sf (float): cornering stiffness of front wheels +# C_Sr (float): cornering stiffness of rear wheels +# lf (float): distance from center of gravity to front axle +# lr (float): distance from center of gravity to rear axle +# h (float): height of center of gravity +# m (float): mass of vehicle +# I (float): moment of inertia of vehicle, about Z axis +# s_min (float): minimum steering angle +# s_max (float): maximum steering angle +# sv_min (float): minimum steering velocity +# sv_max (float): maximum steering velocity +# v_switch (float): velocity above which the acceleration is no longer able to create wheel slip +# a_max (float): maximum allowed acceleration +# v_min (float): minimum allowed velocity +# v_max (float): maximum allowed velocity + +# Returns: +# f (numpy.ndarray): right hand side of differential equations +# """ +# # Controls +# X = x[0] +# Y = x[1] +# DELTA = x[2] +# V = x[3] +# PSI = x[4] +# # Raw Actions +# RAW_STEER_VEL = u_init[0] +# RAW_ACCL = u_init[1] +# # wheelbase +# lwb = params["lf"] + params["lr"] + +# # constraints +# u = np.array( +# [ +# steering_constraint( +# DELTA, +# RAW_STEER_VEL, +# params["s_min"], +# params["s_max"], +# params["sv_min"], +# params["sv_max"], +# ), +# accl_constraints( +# V, +# RAW_ACCL, +# params["v_switch"], +# params["a_max"], +# params["v_min"], +# params["v_max"], +# ), +# ] +# ) +# # Corrected Actions +# STEER_VEL = u[0] +# ACCL = u[1] + +# # system dynamics +# f = np.array( +# [ +# V * np.cos(PSI), # X_DOT +# V * np.sin(PSI), # Y_DOT +# STEER_VEL, # DELTA_DOT +# ACCL, # V_DOT +# (V / lwb) * np.tan(DELTA), # PSI_DOT +# ] +# ) +# return f + + +# def vehicle_dynamics_ks_cog(x: np.ndarray, u_init: np.ndarray, params: dict): +# """ +# Single Track Kinematic Vehicle Dynamics. +# Follows https://gitlab.lrz.de/tum-cps/commonroad-vehicle-models/-/blob/master/vehicleModels_commonRoad.pdf, section 5 + +# Args: +# x (numpy.ndarray (5, )): vehicle state vector (x0, x1, x2, x3, x4) +# x0: x position in global coordinates +# x1: y position in global coordinates +# x2: steering angle of front wheels +# x3: velocity in x direction +# x4: yaw angle +# u (numpy.ndarray (2, )): control input vector (u1, u2) +# u1: steering angle velocity of front wheels +# u2: longitudinal acceleration +# params (dict): dictionary containing the following parameters: +# mu (float): friction coefficient +# C_Sf (float): cornering stiffness of front wheels +# C_Sr (float): cornering stiffness of rear wheels +# lf (float): distance from center of gravity to front axle +# lr (float): distance from center of gravity to rear axle +# h (float): height of center of gravity +# m (float): mass of vehicle +# I (float): moment of inertia of vehicle, about Z axis +# s_min (float): minimum steering angle +# s_max (float): maximum steering angle +# sv_min (float): minimum steering velocity +# sv_max (float): maximum steering velocity +# v_switch (float): velocity above which the acceleration is no longer able to create wheel slip +# a_max (float): maximum allowed acceleration +# v_min (float): minimum allowed velocity +# v_max (float): maximum allowed velocity + +# Returns: +# f (numpy.ndarray): right hand side of differential equations +# """ +# # Controls +# X = x[0] +# Y = x[1] +# DELTA = x[2] +# V = x[3] +# PSI = x[4] +# # Raw Actions +# RAW_STEER_VEL = u_init[0] +# RAW_ACCL = u_init[1] +# # wheelbase +# lwb = params["lf"] + params["lr"] +# # constraints +# u = np.array( +# [ +# steering_constraint( +# DELTA, +# RAW_STEER_VEL, +# params["s_min"], +# params["s_max"], +# params["sv_min"], +# params["sv_max"], +# ), +# accl_constraints( +# V, +# RAW_ACCL, +# params["v_switch"], +# params["a_max"], +# params["v_min"], +# params["v_max"], +# ), +# ] +# ) +# # slip angle (beta) from vehicle kinematics +# beta = np.arctan(np.tan(x[2]) * params["lr"] / lwb) + +# # system dynamics +# f = [ +# V * np.cos(beta + PSI), +# V * np.sin(beta + PSI), +# u[0], +# u[1], +# V * np.cos(beta) * np.tan(DELTA) / lwb, +# ] + +# return f + +@njit(cache=True) +def vehicle_dynamics_ks( + x: np.ndarray, + u_init: np.ndarray, + mu: float, + C_Sf: float, + C_Sr: float, + lf: float, + lr: float, + h: float, + m: float, + I: float, + s_min: float, + s_max: float, + sv_min: float, + sv_max: float, + v_switch: float, + a_max: float, + v_min: float, + v_max: float, + width: float, + length: float +) -> np.ndarray: # Controls X = x[0] Y = x[1] DELTA = x[2] V = x[3] PSI = x[4] - # Raw Actions + RAW_STEER_VEL = u_init[0] RAW_ACCL = u_init[1] - # wheelbase - lwb = params["lf"] + params["lr"] - - # constraints - u = np.array( - [ - steering_constraint( - DELTA, - RAW_STEER_VEL, - params["s_min"], - params["s_max"], - params["sv_min"], - params["sv_max"], - ), - accl_constraints( - V, - RAW_ACCL, - params["v_switch"], - params["a_max"], - params["v_min"], - params["v_max"], - ), - ] - ) - # Corrected Actions + + lwb = lf + lr + + u = [ + steering_constraint(DELTA, RAW_STEER_VEL, s_min, s_max, sv_min, sv_max), + accl_constraints(V, RAW_ACCL, v_switch, a_max, v_min, v_max) + ] + STEER_VEL = u[0] ACCL = u[1] - # system dynamics - f = np.array( - [ - V * np.cos(PSI), # X_DOT - V * np.sin(PSI), # Y_DOT - STEER_VEL, # DELTA_DOT - ACCL, # V_DOT - (V / lwb) * np.tan(DELTA), # PSI_DOT - ] - ) + f = np.asarray([ + V * np.cos(PSI), + V * np.sin(PSI), + STEER_VEL, + ACCL, + (V / lwb) * np.tan(DELTA), + ]) + return f - -def vehicle_dynamics_ks_cog(x: np.ndarray, u_init: np.ndarray, params: dict): - """ - Single Track Kinematic Vehicle Dynamics. - Follows https://gitlab.lrz.de/tum-cps/commonroad-vehicle-models/-/blob/master/vehicleModels_commonRoad.pdf, section 5 - - Args: - x (numpy.ndarray (5, )): vehicle state vector (x0, x1, x2, x3, x4) - x0: x position in global coordinates - x1: y position in global coordinates - x2: steering angle of front wheels - x3: velocity in x direction - x4: yaw angle - u (numpy.ndarray (2, )): control input vector (u1, u2) - u1: steering angle velocity of front wheels - u2: longitudinal acceleration - params (dict): dictionary containing the following parameters: - mu (float): friction coefficient - C_Sf (float): cornering stiffness of front wheels - C_Sr (float): cornering stiffness of rear wheels - lf (float): distance from center of gravity to front axle - lr (float): distance from center of gravity to rear axle - h (float): height of center of gravity - m (float): mass of vehicle - I (float): moment of inertia of vehicle, about Z axis - s_min (float): minimum steering angle - s_max (float): maximum steering angle - sv_min (float): minimum steering velocity - sv_max (float): maximum steering velocity - v_switch (float): velocity above which the acceleration is no longer able to create wheel slip - a_max (float): maximum allowed acceleration - v_min (float): minimum allowed velocity - v_max (float): maximum allowed velocity - - Returns: - f (numpy.ndarray): right hand side of differential equations - """ +@njit(cache=True) +def vehicle_dynamics_ks_cog( + x: np.ndarray, + u_init: np.ndarray, + mu: float, + C_Sf: float, + C_Sr: float, + lf: float, + lr: float, + h: float, + m: float, + I: float, + s_min: float, + s_max: float, + sv_min: float, + sv_max: float, + v_switch: float, + a_max: float, + v_min: float, + v_max: float, + width: float, + length: float +) -> np.ndarray: # Controls X = x[0] Y = x[1] DELTA = x[2] V = x[3] PSI = x[4] - # Raw Actions + RAW_STEER_VEL = u_init[0] RAW_ACCL = u_init[1] - # wheelbase - lwb = params["lf"] + params["lr"] - # constraints - u = np.array( - [ - steering_constraint( - DELTA, - RAW_STEER_VEL, - params["s_min"], - params["s_max"], - params["sv_min"], - params["sv_max"], - ), - accl_constraints( - V, - RAW_ACCL, - params["v_switch"], - params["a_max"], - params["v_min"], - params["v_max"], - ), - ] - ) - # slip angle (beta) from vehicle kinematics - beta = np.arctan(np.tan(x[2]) * params["lr"] / lwb) - - # system dynamics - f = [ + + lwb = lf + lr + + u = [ + steering_constraint(DELTA, RAW_STEER_VEL, s_min, s_max, sv_min, sv_max), + accl_constraints(V, RAW_ACCL, v_switch, a_max, v_min, v_max) + ] + + beta = np.arctan(np.tan(DELTA) * lr / lwb) + + f = np.asarray([ V * np.cos(beta + PSI), V * np.sin(beta + PSI), u[0], u[1], V * np.cos(beta) * np.tan(DELTA) / lwb, - ] + ]) return f @njit(cache=True) -def get_standardized_state_ks(x: np.ndarray) -> dict: - """[X,Y,DELTA,V_X, V_Y,YAW,YAW_RATE,SLIP]""" - d = dict() - d["x"] = x[0] - d["y"] = x[1] - d["delta"] = x[2] - d["v_x"] = x[3] - d["v_y"] = 0.0 - d["yaw"] = x[4] - d["yaw_rate"] = x[5] - d["slip"] = 0.0 - return d +def get_standardized_state_ks(x: np.ndarray) -> np.ndarray: + """[X,Y,Steering_Angle,Speed,YAW,YAW_RATE,V_Y]""" + return np.asarray([x[0], x[1], x[2], x[3], x[4], 0.0, 0.0, 0.0]) diff --git a/f1tenth_gym/envs/dynamic_models/multi_body/multi_body.py b/f1tenth_gym/envs/dynamic_models/multi_body/multi_body.py index bcdafdaf..a4ef6c8f 100644 --- a/f1tenth_gym/envs/dynamic_models/multi_body/multi_body.py +++ b/f1tenth_gym/envs/dynamic_models/multi_body/multi_body.py @@ -13,9 +13,708 @@ from ..kinematic import vehicle_dynamics_ks_cog -def vehicle_dynamics_mb(x: np.ndarray, u_init: np.ndarray, params: dict): +# def vehicle_dynamics_mb_new(x: np.ndarray, u_init: np.ndarray, params: dict): +# """ +# vehicleDynamics_mb - multi-body vehicle dynamics based on the DoT (department of transportation) vehicle dynamics +# reference point: center of mass + +# Syntax: +# f = vehicleDynamics_mb(x,u,p) + +# Inputs: +# :param x: vehicle state vector +# :param uInit: vehicle input vector +# :param params: vehicle parameter vector + +# Outputs: +# :return f: right-hand side of differential equations +# """ + +# # ------------- BEGIN CODE -------------- + +# # set gravity constant +# g = 9.81 # [m/s^2] + +# # states +# # x0 = x-position in a global coordinate system +# # x1 = y-position in a global coordinate system +# # x2 = steering angle of front wheels +# # x3 = velocity in x-direction +# # x4 = yaw angle +# # x5 = yaw rate + +# # x6 = roll angle +# # x7 = roll rate +# # x8 = pitch angle +# # x9 = pitch rate +# # x10 = velocity in y-direction +# # x11 = z-position +# # x12 = velocity in z-direction + +# # x13 = roll angle front +# # x14 = roll rate front +# # x15 = velocity in y-direction front +# # x16 = z-position front +# # x17 = velocity in z-direction front + +# # x18 = roll angle rear +# # x19 = roll rate rear +# # x20 = velocity in y-direction rear +# # x21 = z-position rear +# # x22 = velocity in z-direction rear + +# # x23 = left front wheel angular speed +# # x24 = right front wheel angular speed +# # x25 = left rear wheel angular speed +# # x26 = right rear wheel angular speed + +# # x27 = delta_y_f +# # x28 = delta_y_r + +# # u0 = steering angle velocity of front wheels +# # u1 = acceleration + +# u = np.zeros_like(u_init) + +# # vehicle body dimensions +# length = params["length"] # vehicle length [m] +# width = params["width"] # vehicle width [m] + +# # steering constraints +# # s_min = params["s_min"] # minimum steering angle [rad] +# # s_max = params["s_max"] # maximum steering angle [rad] +# # sv_min = params["sv_min"] # minimum steering velocity [rad/s] +# # sv_max = params["sv_max"] # maximum steering velocity [rad/s] + +# # longitudinal constraints +# # v_min = params["v_min"] # minimum velocity [m/s] +# # v_max = params["v_max"] # minimum velocity [m/s] +# # v_switch = params["v_switch"] # switching velocity [m/s] +# # a_max = params["a_max"] # maximum absolute acceleration [m/s^2] + +# # # masses +# # m = params["m"] # vehicle mass [kg] MASS +# # m_s = params["m_s"] # sprung mass [kg] SMASS +# # m_uf = params["m_uf"] # unsprung mass front [kg] UMASSF +# # m_ur = params["m_ur"] # unsprung mass rear [kg] UMASSR + +# # # axes distances +# # lf = params["lf"] +# # # distance from spring mass center of gravity to front axle [m] LENA +# # lr = params["lf"] +# # # distance from spring mass center of gravity to rear axle [m] LENB + +# # # moments of inertia of sprung mass +# # I_Phi_s = params["I_Phi_s"] +# # # moment of inertia for sprung mass in roll [kg m^2] IXS +# # I_y_s = params["I_y_s"] # moment of inertia for sprung mass in pitch [kg m^2] IYS +# # I_z = params["I_z"] # moment of inertia for sprung mass in yaw [kg m^2] IZZ +# # I_xz_s = params["I_xz_s"] # moment of inertia cross product [kg m^2] IXZ + +# # # suspension parameters +# # K_sf = params["K_sf"] # suspension spring rate (front) [N/m] KSF +# # K_sdf = params["K_sdf"] # suspension damping rate (front) [N s/m] KSDF +# # K_sr = params["K_sr"] # suspension spring rate (rear) [N/m] KSR +# # K_sdr = params["K_sdr"] # suspension damping rate (rear) [N s/m] KSDR + +# # # geometric parameters +# # T_f = params["T_f"] # track width front [m] TRWF +# # T_r = params["T_r"] # track width rear [m] TRWB +# # K_ras = params["K_ras"] +# # # lateral spring rate at compliant compliant pin joint between M_s and M_u [N/m] KRAS + +# # K_tsf = params["K_tsf"] +# # # auxiliary torsion roll stiffness per axle (normally negative) (front) [N m/rad] KTSF +# # K_tsr = params["K_tsr"] +# # # auxiliary torsion roll stiffness per axle (normally negative) (rear) [N m/rad] KTSR +# # K_rad = params["K_rad"] +# # # damping rate at compliant compliant pin joint between M_s and M_u [N s/m] KRADP +# # K_zt = params["K_zt"] # vertical spring rate of tire [N/m] TSPRINGR + +# # h_cg = params["h_cg"] +# # # center of gravity height of total mass [m] HCG (mainly required for conversion to other vehicle models) +# # h_raf = params["h_raf"] # height of roll axis above ground (front) [m] HRAF +# # h_rar = params["h_rar"] # height of roll axis above ground (rear) [m] HRAR + +# # h_s = params["h_s"] # M_s center of gravity above ground [m] HS + +# # I_uf = params["I_uf"] +# # # moment of inertia for unsprung mass about x-axis (front) [kg m^2] IXUF +# # I_ur = params["I_ur"] +# # # moment of inertia for unsprung mass about x-axis (rear) [kg m^2] IXUR +# # I_y_w = params["I_y_w"] +# # # wheel inertia, from internet forum for 235/65 R 17 [kg m^2] + +# # K_lt = params["K_lt"] +# # # lateral compliance rate of tire, wheel, and suspension, per tire [m/N] KLT +# # R_w = params["R_w"] +# # # effective wheel/tire radius chosen as tire rolling radius RR taken from ADAMS documentation [m] + +# # # split of brake and engine torque +# # T_sb = params["T_sb"] +# # T_se = params["T_se"] + +# # # suspension parameters +# # D_f = params["D_f"] # [rad/m] DF +# # D_r = params["D_r"] # [rad/m] DR +# # E_f = params["E_f"] # [needs conversion if nonzero] EF +# # E_r = params["E_r"] # [needs conversion if nonzero] ER + +# KIN_THRESH = 0.5 + +# # consider steering and acceleration constraints - outside of the integration +# u[0] = steering_constraint( +# x[2], +# u_init[0], +# params["s_min"], +# params["s_max"], +# params["sv_min"], +# params["sv_max"], +# ) +# u[1] = accl_constraints( +# x[3], +# u_init[1], +# params["v_switch"], +# params["a_max"], +# params["v_min"], +# params["v_max"], +# ) + +# if abs(x[3]) < KIN_THRESH: +# beta = 0.0 +# else: +# beta = np.arctan(x[10] / x[3]) +# vel = np.sqrt(x[3] ** 2 + x[10] ** 2) + +# # vertical tire forces +# F_z_LF = ( +# x[16] +# + params["R_w"] * (np.cos(x[13]) - 1) +# - 0.5 * params["T_f"] * np.sin(x[13]) +# ) * params["K_zt"] +# F_z_RF = ( +# x[16] +# + params["R_w"] * (np.cos(x[13]) - 1) +# + 0.5 * params["T_f"] * np.sin(x[13]) +# ) * params["K_zt"] +# F_z_LR = ( +# x[21] +# + params["R_w"] * (np.cos(x[18]) - 1) +# - 0.5 * params["T_r"] * np.sin(x[18]) +# ) * params["K_zt"] +# F_z_RR = ( +# x[21] +# + params["R_w"] * (np.cos(x[18]) - 1) +# + 0.5 * params["T_r"] * np.sin(x[18]) +# ) * params["K_zt"] + +# # obtain individual tire speeds +# u_w_lf = (x[3] + 0.5 * params["T_f"] * x[5]) * np.cos(x[2]) + ( +# x[10] + params["lf"] * x[5] +# ) * np.sin(x[2]) +# u_w_rf = (x[3] - 0.5 * params["T_f"] * x[5]) * np.cos(x[2]) + ( +# x[10] + params["lf"] * x[5] +# ) * np.sin(x[2]) +# u_w_lr = x[3] + 0.5 * params["T_r"] * x[5] +# u_w_rr = x[3] - 0.5 * params["T_r"] * x[5] + +# # negative wheel spin forbidden +# if u_w_lf < 0.0: +# u_w_lf *= 0 + +# if u_w_rf < 0.0: +# u_w_rf *= 0 + +# if u_w_lr < 0.0: +# u_w_lr *= 0 + +# if u_w_rr < 0.0: +# u_w_rr *= 0 +# # compute longitudinal slip +# # switch to kinematic model for small velocities +# if abs(x[3]) < KIN_THRESH: +# s_lf = 0.0 +# s_rf = 0.0 +# s_lr = 0.0 +# s_rr = 0.0 +# else: +# s_lf = 1 - params["R_w"] * x[23] / u_w_lf +# s_rf = 1 - params["R_w"] * x[24] / u_w_rf +# s_lr = 1 - params["R_w"] * x[25] / u_w_lr +# s_rr = 1 - params["R_w"] * x[26] / u_w_rr + +# # lateral slip angles +# # switch to kinematic model for small velocities +# if abs(x[3]) < KIN_THRESH: +# alpha_LF = 0.0 +# alpha_RF = 0.0 +# alpha_LR = 0.0 +# alpha_RR = 0.0 +# else: +# alpha_LF = ( +# np.arctan( +# (x[10] + params["lf"] * x[5] - x[14] * (params["R_w"] - x[16])) +# / (x[3] + 0.5 * params["T_f"] * x[5]) +# ) +# - x[2] +# ) +# alpha_RF = ( +# np.arctan( +# (x[10] + params["lf"] * x[5] - x[14] * (params["R_w"] - x[16])) +# / (x[3] - 0.5 * params["T_f"] * x[5]) +# ) +# - x[2] +# ) +# alpha_LR = np.arctan( +# (x[10] - params["lr"] * x[5] - x[19] * (params["R_w"] - x[21])) +# / (x[3] + 0.5 * params["T_r"] * x[5]) +# ) +# alpha_RR = np.arctan( +# (x[10] - params["lr"] * x[5] - x[19] * (params["R_w"] - x[21])) +# / (x[3] - 0.5 * params["T_r"] * x[5]) +# ) + +# # auxiliary suspension movement +# z_SLF = ( +# (params["h_s"] - params["R_w"] + x[16] - x[11]) / np.cos(x[6]) +# - params["h_s"] +# + params["R_w"] +# + params["lf"] * x[8] +# + 0.5 * (x[6] - x[13]) * params["T_f"] +# ) +# z_SRF = ( +# (params["h_s"] - params["R_w"] + x[16] - x[11]) / np.cos(x[6]) +# - params["h_s"] +# + params["R_w"] +# + params["lf"] * x[8] +# - 0.5 * (x[6] - x[13]) * params["T_f"] +# ) +# z_SLR = ( +# (params["h_s"] - params["R_w"] + x[21] - x[11]) / np.cos(x[6]) +# - params["h_s"] +# + params["R_w"] +# - params["lr"] * x[8] +# + 0.5 * (x[6] - x[18]) * params["T_r"] +# ) +# z_SRR = ( +# (params["h_s"] - params["R_w"] + x[21] - x[11]) / np.cos(x[6]) +# - params["h_s"] +# + params["R_w"] +# - params["lr"] * x[8] +# - 0.5 * (x[6] - x[18]) * params["T_r"] +# ) + +# dz_SLF = x[17] - x[12] + params["lf"] * x[9] + 0.5 * (x[7] - x[14]) * params["T_f"] +# dz_SRF = x[17] - x[12] + params["lf"] * x[9] - 0.5 * (x[7] - x[14]) * params["T_f"] +# dz_SLR = x[22] - x[12] - params["lr"] * x[9] + 0.5 * (x[7] - x[19]) * params["T_r"] +# dz_SRR = x[22] - x[12] - params["lr"] * x[9] - 0.5 * (x[7] - x[19]) * params["T_r"] + +# # camber angles +# gamma_LF = x[6] + params["D_f"] * z_SLF + params["E_f"] * (z_SLF) ** 2 +# gamma_RF = x[6] - params["D_f"] * z_SRF - params["E_f"] * (z_SRF) ** 2 +# gamma_LR = x[6] + params["D_r"] * z_SLR + params["E_r"] * (z_SLR) ** 2 +# gamma_RR = x[6] - params["D_r"] * z_SRR - params["E_r"] * (z_SRR) ** 2 + +# # compute longitudinal tire forces using the magic formula for pure slip +# F0_x_LF = formula_longitudinal(s_lf, gamma_LF, F_z_LF, params) +# F0_x_RF = formula_longitudinal(s_rf, gamma_RF, F_z_RF, params) +# F0_x_LR = formula_longitudinal(s_lr, gamma_LR, F_z_LR, params) +# F0_x_RR = formula_longitudinal(s_rr, gamma_RR, F_z_RR, params) + +# # compute lateral tire forces using the magic formula for pure slip +# res = formula_lateral(alpha_LF, gamma_LF, F_z_LF, params) +# F0_y_LF = res[0] +# mu_y_LF = res[1] +# res = formula_lateral(alpha_RF, gamma_RF, F_z_RF, params) +# F0_y_RF = res[0] +# mu_y_RF = res[1] +# res = formula_lateral(alpha_LR, gamma_LR, F_z_LR, params) +# F0_y_LR = res[0] +# mu_y_LR = res[1] +# res = formula_lateral(alpha_RR, gamma_RR, F_z_RR, params) +# F0_y_RR = res[0] +# mu_y_RR = res[1] + +# # compute longitudinal tire forces using the magic formula for combined slip +# F_x_LF = formula_longitudinal_comb(s_lf, alpha_LF, F0_x_LF, params) +# F_x_RF = formula_longitudinal_comb(s_rf, alpha_RF, F0_x_RF, params) +# F_x_LR = formula_longitudinal_comb(s_lr, alpha_LR, F0_x_LR, params) +# F_x_RR = formula_longitudinal_comb(s_rr, alpha_RR, F0_x_RR, params) + +# # compute lateral tire forces using the magic formula for combined slip +# F_y_LF = formula_lateral_comb( +# s_lf, alpha_LF, gamma_LF, mu_y_LF, F_z_LF, F0_y_LF, params +# ) +# F_y_RF = formula_lateral_comb( +# s_rf, alpha_RF, gamma_RF, mu_y_RF, F_z_RF, F0_y_RF, params +# ) +# F_y_LR = formula_lateral_comb( +# s_lr, alpha_LR, gamma_LR, mu_y_LR, F_z_LR, F0_y_LR, params +# ) +# F_y_RR = formula_lateral_comb( +# s_rr, alpha_RR, gamma_RR, mu_y_RR, F_z_RR, F0_y_RR, params +# ) + +# # auxiliary movements for compliant joint equations +# delta_z_f = params["h_s"] - params["R_w"] + x[16] - x[11] +# delta_z_r = params["h_s"] - params["R_w"] + x[21] - x[11] + +# delta_phi_f = x[6] - x[13] +# delta_phi_r = x[6] - x[18] + +# dot_delta_phi_f = x[7] - x[14] +# dot_delta_phi_r = x[7] - x[19] + +# dot_delta_z_f = x[17] - x[12] +# dot_delta_z_r = x[22] - x[12] + +# dot_delta_y_f = x[10] + params["lf"] * x[5] - x[15] +# dot_delta_y_r = x[10] - params["lr"] * x[5] - x[20] + +# delta_f = ( +# delta_z_f * np.sin(x[6]) +# - x[27] * np.cos(x[6]) +# - (params["h_raf"] - params["R_w"]) * np.sin(delta_phi_f) +# ) +# delta_r = ( +# delta_z_r * np.sin(x[6]) +# - x[28] * np.cos(x[6]) +# - (params["h_rar"] - params["R_w"]) * np.sin(delta_phi_r) +# ) + +# dot_delta_f = ( +# (delta_z_f * np.cos(x[6]) + x[27] * np.sin(x[6])) * x[7] +# + dot_delta_z_f * np.sin(x[6]) +# - dot_delta_y_f * np.cos(x[6]) +# - (params["h_raf"] - params["R_w"]) * np.cos(delta_phi_f) * dot_delta_phi_f +# ) +# dot_delta_r = ( +# (delta_z_r * np.cos(x[6]) + x[28] * np.sin(x[6])) * x[7] +# + dot_delta_z_r * np.sin(x[6]) +# - dot_delta_y_r * np.cos(x[6]) +# - (params["h_rar"] - params["R_w"]) * np.cos(delta_phi_r) * dot_delta_phi_r +# ) + +# # compliant joint forces +# F_RAF = delta_f * params["K_ras"] + dot_delta_f * params["K_rad"] +# F_RAR = delta_r * params["K_ras"] + dot_delta_r * params["K_rad"] + +# # auxiliary suspension forces (bump stop neglected squat/lift forces neglected) +# F_SLF = ( +# params["m_s"] * g * params["lr"] / (2 * (params["lf"] + params["lr"])) +# - z_SLF * params["K_sf"] +# - dz_SLF * params["K_sdf"] +# + (x[6] - x[13]) * params["K_tsf"] / params["T_f"] +# ) + +# F_SRF = ( +# params["m_s"] * g * params["lr"] / (2 * (params["lf"] + params["lr"])) +# - z_SRF * params["K_sf"] +# - dz_SRF * params["K_sdf"] +# - (x[6] - x[13]) * params["K_tsf"] / params["T_f"] +# ) + +# F_SLR = ( +# params["m_s"] * g * params["lf"] / (2 * (params["lf"] + params["lr"])) +# - z_SLR * params["K_sr"] +# - dz_SLR * params["K_sdr"] +# + (x[6] - x[18]) * params["K_tsr"] / params["T_r"] +# ) + +# F_SRR = ( +# params["m_s"] * g * params["lf"] / (2 * (params["lf"] + params["lr"])) +# - z_SRR * params["K_sr"] +# - dz_SRR * params["K_sdr"] +# - (x[6] - x[18]) * params["K_tsr"] / params["T_r"] +# ) + +# # auxiliary variables sprung mass +# sumX = ( +# F_x_LR +# + F_x_RR +# + (F_x_LF + F_x_RF) * np.cos(x[2]) +# - (F_y_LF + F_y_RF) * np.sin(x[2]) +# ) + +# sumN = ( +# (F_y_LF + F_y_RF) * params["lf"] * np.cos(x[2]) +# + (F_x_LF + F_x_RF) * params["lf"] * np.sin(x[2]) +# + (F_y_RF - F_y_LF) * 0.5 * params["T_f"] * np.sin(x[2]) +# + (F_x_LF - F_x_RF) * 0.5 * params["T_f"] * np.cos(x[2]) +# + (F_x_LR - F_x_RR) * 0.5 * params["T_r"] +# - (F_y_LR + F_y_RR) * params["lr"] +# ) + +# sumY_s = (F_RAF + F_RAR) * np.cos(x[6]) + (F_SLF + F_SLR + F_SRF + F_SRR) * np.sin( +# x[6] +# ) + +# sumL = ( +# 0.5 * F_SLF * params["T_f"] +# + 0.5 * F_SLR * params["T_r"] +# - 0.5 * F_SRF * params["T_f"] +# - 0.5 * F_SRR * params["T_r"] +# - F_RAF +# / np.cos(x[6]) +# * ( +# params["h_s"] +# - x[11] +# - params["R_w"] +# + x[16] +# - (params["h_raf"] - params["R_w"]) * np.cos(x[13]) +# ) +# - F_RAR +# / np.cos(x[6]) +# * ( +# params["h_s"] +# - x[11] +# - params["R_w"] +# + x[21] +# - (params["h_rar"] - params["R_w"]) * np.cos(x[18]) +# ) +# ) + +# sumZ_s = (F_SLF + F_SLR + F_SRF + F_SRR) * np.cos(x[6]) - (F_RAF + F_RAR) * np.sin( +# x[6] +# ) + +# sumM_s = ( +# params["lf"] * (F_SLF + F_SRF) +# - params["lr"] * (F_SLR + F_SRR) +# + ( +# (F_x_LF + F_x_RF) * np.cos(x[2]) +# - (F_y_LF + F_y_RF) * np.sin(x[2]) +# + F_x_LR +# + F_x_RR +# ) +# * (params["h_s"] - x[11]) +# ) + +# # auxiliary variables unsprung mass +# sumL_uf = ( +# 0.5 * F_SRF * params["T_f"] +# - 0.5 * F_SLF * params["T_f"] +# - F_RAF * (params["h_raf"] - params["R_w"]) +# + F_z_LF +# * ( +# params["R_w"] * np.sin(x[13]) +# + 0.5 * params["T_f"] * np.cos(x[13]) +# - params["K_lt"] * F_y_LF +# ) +# - F_z_RF +# * ( +# -params["R_w"] * np.sin(x[13]) +# + 0.5 * params["T_f"] * np.cos(x[13]) +# + params["K_lt"] * F_y_RF +# ) +# - ((F_y_LF + F_y_RF) * np.cos(x[2]) + (F_x_LF + F_x_RF) * np.sin(x[2])) +# * (params["R_w"] - x[16]) +# ) + +# sumL_ur = ( +# 0.5 * F_SRR * params["T_r"] +# - 0.5 * F_SLR * params["T_r"] +# - F_RAR * (params["h_rar"] - params["R_w"]) +# + F_z_LR +# * ( +# params["R_w"] * np.sin(x[18]) +# + 0.5 * params["T_r"] * np.cos(x[18]) +# - params["K_lt"] * F_y_LR +# ) +# - F_z_RR +# * ( +# -params["R_w"] * np.sin(x[18]) +# + 0.5 * params["T_r"] * np.cos(x[18]) +# + params["K_lt"] * F_y_RR +# ) +# - (F_y_LR + F_y_RR) * (params["R_w"] - x[21]) +# ) + +# sumZ_uf = F_z_LF + F_z_RF + F_RAF * np.sin(x[6]) - (F_SLF + F_SRF) * np.cos(x[6]) + +# sumZ_ur = F_z_LR + F_z_RR + F_RAR * np.sin(x[6]) - (F_SLR + F_SRR) * np.cos(x[6]) + +# sumY_uf = ( +# (F_y_LF + F_y_RF) * np.cos(x[2]) +# + (F_x_LF + F_x_RF) * np.sin(x[2]) +# - F_RAF * np.cos(x[6]) +# - (F_SLF + F_SRF) * np.sin(x[6]) +# ) + +# sumY_ur = (F_y_LR + F_y_RR) - F_RAR * np.cos(x[6]) - (F_SLR + F_SRR) * np.sin(x[6]) + +# # dynamics common with single-track model +# f = np.zeros(29) # init 'right hand side' +# # switch to kinematic model for small velocities +# if abs(x[3]) < KIN_THRESH: +# # wheelbase +# # lwb = lf + lr + +# # system dynamics +# # x_ks = [x[0], x[1], x[2], x[3], x[4]] +# # f_ks = vehicle_dynamics_ks(x_ks, u, p) +# # f.extend(f_ks) +# # f.append(u[1]*lwb*np.tan(x[2]) + x[3]/(lwb*np.cos(x[2])**2)*u[0]) + +# # Use kinematic model with reference point at center of mass +# # wheelbase +# lwb = params["lf"] + params["lr"] +# # system dynamics +# x_ks = [x[0], x[1], x[2], x[3], x[4]] +# # kinematic model +# f_ks = vehicle_dynamics_ks_cog(np.array(x_ks), u, params['mu'], +# params['C_Sf'], +# params['C_Sr'], +# params['lf'], +# params['lr'], +# params['h'], +# params['m'], +# params['I'], +# params['s_min'], +# params['s_max'], +# params['sv_min'], +# params['sv_max'], +# params['v_switch'], +# params['a_max'], +# params['v_min'], +# params['v_max'], +# params['width'], +# params['length']) +# f[0:5] = np.array([f_ks[0], f_ks[1], f_ks[2], f_ks[3], f_ks[4]]) +# # derivative of slip angle and yaw rate +# d_beta = (params["lr"] * u[0]) / ( +# lwb +# * np.cos(x[2]) ** 2 +# * (1 + (np.tan(x[2]) ** 2 * params["lr"] / lwb) ** 2) +# ) +# dd_psi = ( +# 1 +# / lwb +# * ( +# u[1] * np.cos(x[6]) * np.tan(x[2]) +# - x[3] * np.sin(x[6]) * d_beta * np.tan(x[2]) +# + x[3] * np.cos(x[6]) * u[0] / np.cos(x[2]) ** 2 +# ) +# ) +# f[5] = dd_psi + +# else: +# f[0] = np.cos(beta + x[4]) * vel +# f[1] = np.sin(beta + x[4]) * vel +# f[2] = u[0] +# f[3] = 1 / params["m"] * sumX + x[5] * x[10] +# f[4] = x[5] +# f[5] = ( +# 1 +# / (params["I_z"] - (params["I_xz_s"]) ** 2 / params["I_Phi_s"]) +# * (sumN + params["I_xz_s"] / params["I_Phi_s"] * sumL) +# ) + +# # remaining sprung mass dynamics +# f[6] = x[7] +# f[7] = ( +# 1 +# / (params["I_Phi_s"] - (params["I_xz_s"]) ** 2 / params["I_z"]) +# * (params["I_xz_s"] / params["I_z"] * sumN + sumL) +# ) +# f[8] = x[9] +# f[9] = 1 / params["I_y_s"] * sumM_s +# f[10] = 1 / params["m_s"] * sumY_s - x[5] * x[3] +# f[11] = x[12] +# f[12] = g - 1 / params["m_s"] * sumZ_s + +# # unsprung mass dynamics (front) +# f[13] = x[14] +# f[14] = 1 / params["I_uf"] * sumL_uf +# f[15] = 1 / params["m_uf"] * sumY_uf - x[5] * x[3] +# f[16] = x[17] +# f[17] = g - 1 / params["m_uf"] * sumZ_uf + +# # unsprung mass dynamics (rear) +# f[18] = x[19] +# f[19] = 1 / params["I_ur"] * sumL_ur +# f[20] = 1 / params["m_ur"] * sumY_ur - x[5] * x[3] +# f[21] = x[22] +# f[22] = g - 1 / params["m_ur"] * sumZ_ur + +# # convert acceleration input to brake and engine torque +# if u[1] > 0: +# T_B = 0.0 +# T_E = params["m"] * params["R_w"] * u[1] +# else: +# T_B = params["m"] * params["R_w"] * u[1] +# T_E = 0.0 + +# # wheel dynamics (T new parameter for torque splitting) +# f[23] = ( +# 1 +# / params["I_y_w"] +# * ( +# -params["R_w"] * F_x_LF +# + 0.5 * params["T_sb"] * T_B +# + 0.5 * params["T_se"] * T_E +# ) +# ) +# f[24] = ( +# 1 +# / params["I_y_w"] +# * ( +# -params["R_w"] * F_x_RF +# + 0.5 * params["T_sb"] * T_B +# + 0.5 * params["T_se"] * T_E +# ) +# ) +# f[25] = ( +# 1 +# / params["I_y_w"] +# * ( +# -params["R_w"] * F_x_LR +# + 0.5 * (1 - params["T_sb"]) * T_B +# + 0.5 * (1 - params["T_se"]) * T_E +# ) +# ) +# f[26] = ( +# 1 +# / params["I_y_w"] +# * ( +# -params["R_w"] * F_x_RR +# + 0.5 * (1 - params["T_sb"]) * T_B +# + 0.5 * (1 - params["T_se"]) * T_E +# ) +# ) + +# # negative wheel spin forbidden +# for iState in range(23, 27): +# if x[iState] < 0.0: +# x[iState] = 0.0 +# f[iState] = 0.0 + +# # compliant joint equations +# f[27] = dot_delta_y_f +# f[28] = dot_delta_y_r + +# return f +sequential_param_keys = ['length', 'width', 's_min', 's_max', 'sv_min', + 'sv_max', 'v_min', 'v_max', 'v_switch', 'a_max', + 'm', 'm_s', 'm_uf', 'm_ur', 'lf', 'lr', 'I_Phi_s', + 'I_y_s', 'I_z', 'I_xz_s', 'K_sf', 'K_sdf', 'K_sr', + 'K_sdr', 'T_f', 'T_r', 'K_ras', 'K_tsf', 'K_tsr', + 'K_rad', 'K_zt', 'h_cg', 'h_raf', 'h_rar', 'h_s', + 'I_uf', 'I_ur', 'I_y_w', 'K_lt', 'R_w', 'T_sb', + 'T_se', 'D_f', 'D_r', 'E_f', 'E_r', 'tire_p_cx1', + 'tire_p_dx1', 'tire_p_dx3', 'tire_p_ex1', 'tire_p_kx1', + 'tire_p_hx1', 'tire_p_vx1', 'tire_r_bx1', 'tire_r_bx2', + 'tire_r_cx1', 'tire_r_ex1', 'tire_r_hx1', 'tire_p_cy1', + 'tire_p_dy1', 'tire_p_dy3', 'tire_p_ey1', 'tire_p_ky1', + 'tire_p_hy1', 'tire_p_hy3', 'tire_p_vy1', 'tire_p_vy3', + 'tire_r_by1', 'tire_r_by2', 'tire_r_by3', 'tire_r_cy1', + 'tire_r_ey1', 'tire_r_hy1', 'tire_r_vy1', 'tire_r_vy3', + 'tire_r_vy4', 'tire_r_vy5', 'tire_r_vy6'] + +@njit(cache=True) +def vehicle_dynamics_mb(x, u_init, params): """ - vehicleDynamics_mb - multi-body vehicle dynamics based on the DoT (department of transportation) vehicle dynamics + vehicleDynamics_mb - multi-body vehicle dynamics based on the DOT (department of transportation) vehicle dynamics reference point: center of mass Syntax: @@ -28,300 +727,214 @@ def vehicle_dynamics_mb(x: np.ndarray, u_init: np.ndarray, params: dict): Outputs: :return f: right-hand side of differential equations - """ - # ------------- BEGIN CODE -------------- + Author: Matthias Althoff + Written: 05-January-2017 + Last update: 17-December-2017 + Last revision: --- + """ + KIN_THRESH = 0.5 + use_kinematic = abs(x[3]) < KIN_THRESH + #------------- BEGIN CODE -------------- # set gravity constant - g = 9.81 # [m/s^2] - - # states - # x0 = x-position in a global coordinate system - # x1 = y-position in a global coordinate system - # x2 = steering angle of front wheels - # x3 = velocity in x-direction - # x4 = yaw angle - # x5 = yaw rate - - # x6 = roll angle - # x7 = roll rate - # x8 = pitch angle - # x9 = pitch rate - # x10 = velocity in y-direction - # x11 = z-position - # x12 = velocity in z-direction - - # x13 = roll angle front - # x14 = roll rate front - # x15 = velocity in y-direction front - # x16 = z-position front - # x17 = velocity in z-direction front - - # x18 = roll angle rear - # x19 = roll rate rear - # x20 = velocity in y-direction rear - # x21 = z-position rear - # x22 = velocity in z-direction rear - - # x23 = left front wheel angular speed - # x24 = right front wheel angular speed - # x25 = left rear wheel angular speed - # x26 = right rear wheel angular speed - - # x27 = delta_y_f - # x28 = delta_y_r - - # u0 = steering angle velocity of front wheels - # u1 = acceleration - - u = np.zeros_like(u_init) + g = 9.81 #[m/s^2] + + #states + #x1 = x-position in a global coordinate system + #x2 = y-position in a global coordinate system + #x3 = steering angle of front wheels + #x4 = velocity in x-direction + #x5 = yaw angle + #x6 = yaw rate + + #x7 = roll angle + #x8 = roll rate + #x9 = pitch angle + #x10 = pitch rate + #x11 = velocity in y-direction + #x12 = z-position + #x13 = velocity in z-direction + + #x14 = roll angle front + #x15 = roll rate front + #x16 = velocity in y-direction front + #x17 = z-position front + #x18 = velocity in z-direction front + + #x19 = roll angle rear + #x20 = roll rate rear + #x21 = velocity in y-direction rear + #x22 = z-position rear + #x23 = velocity in z-direction rear + + #x24 = left front wheel angular speed + #x25 = right front wheel angular speed + #x26 = left rear wheel angular speed + #x27 = right rear wheel angular speed + + #x28 = delta_y_f + #x29 = delta_y_r + + #u1 = steering angle velocity of front wheels + #u2 = acceleration # vehicle body dimensions - length = params["length"] # vehicle length [m] - width = params["width"] # vehicle width [m] + length = params[0] # vehicle length [m] + width = params[1] # vehicle width [m] # steering constraints - # s_min = params["s_min"] # minimum steering angle [rad] - # s_max = params["s_max"] # maximum steering angle [rad] - # sv_min = params["sv_min"] # minimum steering velocity [rad/s] - # sv_max = params["sv_max"] # maximum steering velocity [rad/s] + s_min = params[2] # minimum steering angle [rad] + s_max = params[3] # maximum steering angle [rad] + sv_min = params[4] # minimum steering velocity [rad/s] + sv_max = params[5] # maximum steering velocity [rad/s] # longitudinal constraints - # v_min = params["v_min"] # minimum velocity [m/s] - # v_max = params["v_max"] # minimum velocity [m/s] - # v_switch = params["v_switch"] # switching velocity [m/s] - # a_max = params["a_max"] # maximum absolute acceleration [m/s^2] - - # # masses - # m = params["m"] # vehicle mass [kg] MASS - # m_s = params["m_s"] # sprung mass [kg] SMASS - # m_uf = params["m_uf"] # unsprung mass front [kg] UMASSF - # m_ur = params["m_ur"] # unsprung mass rear [kg] UMASSR - - # # axes distances - # lf = params["lf"] - # # distance from spring mass center of gravity to front axle [m] LENA - # lr = params["lf"] - # # distance from spring mass center of gravity to rear axle [m] LENB - - # # moments of inertia of sprung mass - # I_Phi_s = params["I_Phi_s"] - # # moment of inertia for sprung mass in roll [kg m^2] IXS - # I_y_s = params["I_y_s"] # moment of inertia for sprung mass in pitch [kg m^2] IYS - # I_z = params["I_z"] # moment of inertia for sprung mass in yaw [kg m^2] IZZ - # I_xz_s = params["I_xz_s"] # moment of inertia cross product [kg m^2] IXZ - - # # suspension parameters - # K_sf = params["K_sf"] # suspension spring rate (front) [N/m] KSF - # K_sdf = params["K_sdf"] # suspension damping rate (front) [N s/m] KSDF - # K_sr = params["K_sr"] # suspension spring rate (rear) [N/m] KSR - # K_sdr = params["K_sdr"] # suspension damping rate (rear) [N s/m] KSDR - - # # geometric parameters - # T_f = params["T_f"] # track width front [m] TRWF - # T_r = params["T_r"] # track width rear [m] TRWB - # K_ras = params["K_ras"] - # # lateral spring rate at compliant compliant pin joint between M_s and M_u [N/m] KRAS - - # K_tsf = params["K_tsf"] - # # auxiliary torsion roll stiffness per axle (normally negative) (front) [N m/rad] KTSF - # K_tsr = params["K_tsr"] - # # auxiliary torsion roll stiffness per axle (normally negative) (rear) [N m/rad] KTSR - # K_rad = params["K_rad"] - # # damping rate at compliant compliant pin joint between M_s and M_u [N s/m] KRADP - # K_zt = params["K_zt"] # vertical spring rate of tire [N/m] TSPRINGR - - # h_cg = params["h_cg"] - # # center of gravity height of total mass [m] HCG (mainly required for conversion to other vehicle models) - # h_raf = params["h_raf"] # height of roll axis above ground (front) [m] HRAF - # h_rar = params["h_rar"] # height of roll axis above ground (rear) [m] HRAR - - # h_s = params["h_s"] # M_s center of gravity above ground [m] HS - - # I_uf = params["I_uf"] - # # moment of inertia for unsprung mass about x-axis (front) [kg m^2] IXUF - # I_ur = params["I_ur"] - # # moment of inertia for unsprung mass about x-axis (rear) [kg m^2] IXUR - # I_y_w = params["I_y_w"] - # # wheel inertia, from internet forum for 235/65 R 17 [kg m^2] - - # K_lt = params["K_lt"] - # # lateral compliance rate of tire, wheel, and suspension, per tire [m/N] KLT - # R_w = params["R_w"] - # # effective wheel/tire radius chosen as tire rolling radius RR taken from ADAMS documentation [m] - - # # split of brake and engine torque - # T_sb = params["T_sb"] - # T_se = params["T_se"] - - # # suspension parameters - # D_f = params["D_f"] # [rad/m] DF - # D_r = params["D_r"] # [rad/m] DR - # E_f = params["E_f"] # [needs conversion if nonzero] EF - # E_r = params["E_r"] # [needs conversion if nonzero] ER + v_min = params[6] # minimum velocity [m/s] + v_max = params[7] # minimum velocity [m/s] + v_switch = params[8] # switching velocity [m/s] + a_max = params[9] # maximum absolute acceleration [m/s^2] + + # masses + m = params[10] # vehicle mass [kg] MASS + m_s = params[11] # sprung mass [kg] SMASS + m_uf = params[12] # unsprung mass front [kg] UMASSF + m_ur = params[13] # unsprung mass rear [kg] UMASSR + + # axes distances + lf = params[14] # distance from spring mass center of gravity to front axle [m] LENA + lr = params[15] # distance from spring mass center of gravity to rear axle [m] LENB + + # moments of inertia of sprung mass + I_Phi_s = params[16] # moment of inertia for sprung mass in roll [kg m^2] IXS + I_y_s = params[17] # moment of inertia for sprung mass in pitch [kg m^2] IYS + I_z = params[18] # moment of inertia for sprung mass in yaw [kg m^2] IZZ + I_xz_s = params[19] # moment of inertia cross product [kg m^2] IXZ + + # suspension parameters + K_sf = params[20] # suspension spring rate (front) [N/m] KSF + K_sdf = params[21] # suspension damping rate (front) [N s/m] KSDF + K_sr = params[22] # suspension spring rate (rear) [N/m] KSR + K_sdr = params[23] # suspension damping rate (rear) [N s/m] KSDR + + # geometric parameters + T_f = params[24] # track width front [m] TRWF + T_r = params[25] # track width rear [m] TRWB + K_ras = params[26] # lateral spring rate at compliant compliant pin joint between M_s and M_u [N/m] KRAS + + K_tsf = params[27] # auxiliary torsion roll stiffness per axle (normally negative) (front) [N m/rad] KTSF + K_tsr = params[28] # auxiliary torsion roll stiffness per axle (normally negative) (rear) [N m/rad] KTSR + K_rad = params[29] # damping rate at compliant compliant pin joint between M_s and M_u [N s/m] KRADP + K_zt = params[30] # vertical spring rate of tire [N/m] TSPRINGR + + h_cg = params[31] # center of gravity height of total mass [m] HCG (mainly required for conversion to other vehicle models) + h_raf = params[32] # height of roll axis above ground (front) [m] HRAF + h_rar = params[33] # height of roll axis above ground (rear) [m] HRAR + + h_s = params[34] # M_s center of gravity above ground [m] HS + + I_uf = params[35] # moment of inertia for unsprung mass about x-axis (front) [kg m^2] IXUF + I_ur = params[36] # moment of inertia for unsprung mass about x-axis (rear) [kg m^2] IXUR + I_y_w = params[37] # wheel inertia, from internet forum for 235/65 R 17 [kg m^2] + + K_lt = params[38] # lateral compliance rate of tire, wheel, and suspension, per tire [m/N] KLT + R_w = params[39] # effective wheel/tire radius chosen as tire rolling radius RR taken from ADAMS documentation [m] + + # split of brake and engine torque + T_sb = params[40] + T_se = params[41] + + # suspension parameters + D_f = params[42] # [rad/m] DF + D_r = params[43] # [rad/m] DR + E_f = params[44] # [needs conversion if nonzero] EF + E_r = params[45] # [needs conversion if nonzero] ER - KIN_THRESH = 0.5 # consider steering and acceleration constraints - outside of the integration - u[0] = steering_constraint( - x[2], - u_init[0], - params["s_min"], - params["s_max"], - params["sv_min"], - params["sv_max"], - ) - u[1] = accl_constraints( - x[3], - u_init[1], - params["v_switch"], - params["a_max"], - params["v_min"], - params["v_max"], - ) - - if abs(x[3]) < KIN_THRESH: - beta = 0.0 + # u = np.array([steering_constraint(x[2], u_init[0], s_min, s_max, sv_min, sv_max), accl_constraints(x[3], u_init[1], v_switch, a_max, v_min, v_max)]) + + #compute slip angle at cg - outside of the integration + # switch to kinematic model for small velocities handeled outside + u = np.array([steering_constraint(x[2], u_init[0], s_min, s_max, sv_min, sv_max), + accl_constraints(x[3], u_init[1], v_switch, a_max, v_min, v_max)]) + + + if use_kinematic: + beta = 0. else: - beta = np.arctan(x[10] / x[3]) - vel = np.sqrt(x[3] ** 2 + x[10] ** 2) - - # vertical tire forces - F_z_LF = ( - x[16] - + params["R_w"] * (np.cos(x[13]) - 1) - - 0.5 * params["T_f"] * np.sin(x[13]) - ) * params["K_zt"] - F_z_RF = ( - x[16] - + params["R_w"] * (np.cos(x[13]) - 1) - + 0.5 * params["T_f"] * np.sin(x[13]) - ) * params["K_zt"] - F_z_LR = ( - x[21] - + params["R_w"] * (np.cos(x[18]) - 1) - - 0.5 * params["T_r"] * np.sin(x[18]) - ) * params["K_zt"] - F_z_RR = ( - x[21] - + params["R_w"] * (np.cos(x[18]) - 1) - + 0.5 * params["T_r"] * np.sin(x[18]) - ) * params["K_zt"] - - # obtain individual tire speeds - u_w_lf = (x[3] + 0.5 * params["T_f"] * x[5]) * np.cos(x[2]) + ( - x[10] + params["lf"] * x[5] - ) * np.sin(x[2]) - u_w_rf = (x[3] - 0.5 * params["T_f"] * x[5]) * np.cos(x[2]) + ( - x[10] + params["lf"] * x[5] - ) * np.sin(x[2]) - u_w_lr = x[3] + 0.5 * params["T_r"] * x[5] - u_w_rr = x[3] - 0.5 * params["T_r"] * x[5] - - # negative wheel spin forbidden - if u_w_lf < 0.0: - u_w_lf *= 0 - - if u_w_rf < 0.0: - u_w_rf *= 0 - - if u_w_lr < 0.0: - u_w_lr *= 0 - - if u_w_rr < 0.0: - u_w_rr *= 0 - # compute longitudinal slip - # switch to kinematic model for small velocities - if abs(x[3]) < KIN_THRESH: - s_lf = 0.0 - s_rf = 0.0 - s_lr = 0.0 - s_rr = 0.0 + beta = np.arctan(x[10]/x[3]) + vel = np.sqrt(x[3]**2 + x[10]**2) + + #vertical tire forces + F_z_LF = (x[16] + R_w*(np.cos(x[13]) - 1) - 0.5*T_f*np.sin(x[13]))*K_zt + F_z_RF = (x[16] + R_w*(np.cos(x[13]) - 1) + 0.5*T_f*np.sin(x[13]))*K_zt + F_z_LR = (x[21] + R_w*(np.cos(x[18]) - 1) - 0.5*T_r*np.sin(x[18]))*K_zt + F_z_RR = (x[21] + R_w*(np.cos(x[18]) - 1) + 0.5*T_r*np.sin(x[18]))*K_zt + + #obtain individual tire speeds + u_w_lf = (x[3] + 0.5*T_f*x[5])*np.cos(x[2]) + (x[10] + lf*x[5])*np.sin(x[2]) + u_w_rf = (x[3] - 0.5*T_f*x[5])*np.cos(x[2]) + (x[10] + lf*x[5])*np.sin(x[2]) + u_w_lr = x[3] + 0.5*T_r*x[5] + u_w_rr = x[3] - 0.5*T_r*x[5] + + #negative wheel spin forbidden + u_w_lf = np.maximum(u_w_lf, 0.0) + u_w_rf = np.maximum(u_w_rf, 0.0) + u_w_lr = np.maximum(u_w_lr, 0.0) + u_w_rr = np.maximum(u_w_rr, 0.0) + + #compute longitudinal slip + #switch to kinematic model for small velocities + if use_kinematic: + s_lf = 0. + s_rf = 0. + s_lr = 0. + s_rr = 0. else: - s_lf = 1 - params["R_w"] * x[23] / u_w_lf - s_rf = 1 - params["R_w"] * x[24] / u_w_rf - s_lr = 1 - params["R_w"] * x[25] / u_w_lr - s_rr = 1 - params["R_w"] * x[26] / u_w_rr - - # lateral slip angles - # switch to kinematic model for small velocities - if abs(x[3]) < KIN_THRESH: - alpha_LF = 0.0 - alpha_RF = 0.0 - alpha_LR = 0.0 - alpha_RR = 0.0 + s_lf = 1 - R_w*x[23]/u_w_lf + s_rf = 1 - R_w*x[24]/u_w_rf + s_lr = 1 - R_w*x[25]/u_w_lr + s_rr = 1 - R_w*x[26]/u_w_rr + + + #lateral slip angles + #switch to kinematic model for small velocities + if use_kinematic: + alpha_LF = 0. + alpha_RF = 0. + alpha_LR = 0. + alpha_RR = 0. else: - alpha_LF = ( - np.arctan( - (x[10] + params["lf"] * x[5] - x[14] * (params["R_w"] - x[16])) - / (x[3] + 0.5 * params["T_f"] * x[5]) - ) - - x[2] - ) - alpha_RF = ( - np.arctan( - (x[10] + params["lf"] * x[5] - x[14] * (params["R_w"] - x[16])) - / (x[3] - 0.5 * params["T_f"] * x[5]) - ) - - x[2] - ) - alpha_LR = np.arctan( - (x[10] - params["lr"] * x[5] - x[19] * (params["R_w"] - x[21])) - / (x[3] + 0.5 * params["T_r"] * x[5]) - ) - alpha_RR = np.arctan( - (x[10] - params["lr"] * x[5] - x[19] * (params["R_w"] - x[21])) - / (x[3] - 0.5 * params["T_r"] * x[5]) - ) - - # auxiliary suspension movement - z_SLF = ( - (params["h_s"] - params["R_w"] + x[16] - x[11]) / np.cos(x[6]) - - params["h_s"] - + params["R_w"] - + params["lf"] * x[8] - + 0.5 * (x[6] - x[13]) * params["T_f"] - ) - z_SRF = ( - (params["h_s"] - params["R_w"] + x[16] - x[11]) / np.cos(x[6]) - - params["h_s"] - + params["R_w"] - + params["lf"] * x[8] - - 0.5 * (x[6] - x[13]) * params["T_f"] - ) - z_SLR = ( - (params["h_s"] - params["R_w"] + x[21] - x[11]) / np.cos(x[6]) - - params["h_s"] - + params["R_w"] - - params["lr"] * x[8] - + 0.5 * (x[6] - x[18]) * params["T_r"] - ) - z_SRR = ( - (params["h_s"] - params["R_w"] + x[21] - x[11]) / np.cos(x[6]) - - params["h_s"] - + params["R_w"] - - params["lr"] * x[8] - - 0.5 * (x[6] - x[18]) * params["T_r"] - ) - - dz_SLF = x[17] - x[12] + params["lf"] * x[9] + 0.5 * (x[7] - x[14]) * params["T_f"] - dz_SRF = x[17] - x[12] + params["lf"] * x[9] - 0.5 * (x[7] - x[14]) * params["T_f"] - dz_SLR = x[22] - x[12] - params["lr"] * x[9] + 0.5 * (x[7] - x[19]) * params["T_r"] - dz_SRR = x[22] - x[12] - params["lr"] * x[9] - 0.5 * (x[7] - x[19]) * params["T_r"] - - # camber angles - gamma_LF = x[6] + params["D_f"] * z_SLF + params["E_f"] * (z_SLF) ** 2 - gamma_RF = x[6] - params["D_f"] * z_SRF - params["E_f"] * (z_SRF) ** 2 - gamma_LR = x[6] + params["D_r"] * z_SLR + params["E_r"] * (z_SLR) ** 2 - gamma_RR = x[6] - params["D_r"] * z_SRR - params["E_r"] * (z_SRR) ** 2 - - # compute longitudinal tire forces using the magic formula for pure slip + alpha_LF = np.arctan((x[10] + lf*x[5] - x[14]*(R_w - x[16]))/(x[3] + 0.5*T_f*x[5])) - x[2] + alpha_RF = np.arctan((x[10] + lf*x[5] - x[14]*(R_w - x[16]))/(x[3] - 0.5*T_f*x[5])) - x[2] + alpha_LR = np.arctan((x[10] - lr*x[5] - x[19]*(R_w - x[21]))/(x[3] + 0.5*T_r*x[5])) + alpha_RR = np.arctan((x[10] - lr*x[5] - x[19]*(R_w - x[21]))/(x[3] - 0.5*T_r*x[5])) + + #auxiliary suspension movement + z_SLF = (h_s - R_w + x[16] - x[11])/np.cos(x[6]) - h_s + R_w + lf*x[8] + 0.5*(x[6] - x[13])*T_f + z_SRF = (h_s - R_w + x[16] - x[11])/np.cos(x[6]) - h_s + R_w + lf*x[8] - 0.5*(x[6] - x[13])*T_f + z_SLR = (h_s - R_w + x[21] - x[11])/np.cos(x[6]) - h_s + R_w - lr*x[8] + 0.5*(x[6] - x[18])*T_r + z_SRR = (h_s - R_w + x[21] - x[11])/np.cos(x[6]) - h_s + R_w - lr*x[8] - 0.5*(x[6] - x[18])*T_r + + dz_SLF = x[17] - x[12] + lf*x[9] + 0.5*(x[7] - x[14])*T_f + dz_SRF = x[17] - x[12] + lf*x[9] - 0.5*(x[7] - x[14])*T_f + dz_SLR = x[22] - x[12] - lr*x[9] + 0.5*(x[7] - x[19])*T_r + dz_SRR = x[22] - x[12] - lr*x[9] - 0.5*(x[7] - x[19])*T_r + + #camber angles + gamma_LF = x[6] + D_f*z_SLF + E_f*(z_SLF)**2 + gamma_RF = x[6] - D_f*z_SRF - E_f*(z_SRF)**2 + gamma_LR = x[6] + D_r*z_SLR + E_r*(z_SLR)**2 + gamma_RR = x[6] - D_r*z_SRR - E_r*(z_SRR)**2 + + #compute longitudinal tire forces using the magic formula for pure slip F0_x_LF = formula_longitudinal(s_lf, gamma_LF, F_z_LF, params) F0_x_RF = formula_longitudinal(s_rf, gamma_RF, F_z_RF, params) F0_x_LR = formula_longitudinal(s_lr, gamma_LR, F_z_LR, params) F0_x_RR = formula_longitudinal(s_rr, gamma_RR, F_z_RR, params) - - # compute lateral tire forces using the magic formula for pure slip + + #compute lateral tire forces using the magic formula for pure slip res = formula_lateral(alpha_LF, gamma_LF, F_z_LF, params) F0_y_LF = res[0] mu_y_LF = res[1] @@ -335,29 +948,21 @@ def vehicle_dynamics_mb(x: np.ndarray, u_init: np.ndarray, params: dict): F0_y_RR = res[0] mu_y_RR = res[1] - # compute longitudinal tire forces using the magic formula for combined slip + #compute longitudinal tire forces using the magic formula for combined slip F_x_LF = formula_longitudinal_comb(s_lf, alpha_LF, F0_x_LF, params) F_x_RF = formula_longitudinal_comb(s_rf, alpha_RF, F0_x_RF, params) F_x_LR = formula_longitudinal_comb(s_lr, alpha_LR, F0_x_LR, params) F_x_RR = formula_longitudinal_comb(s_rr, alpha_RR, F0_x_RR, params) - # compute lateral tire forces using the magic formula for combined slip - F_y_LF = formula_lateral_comb( - s_lf, alpha_LF, gamma_LF, mu_y_LF, F_z_LF, F0_y_LF, params - ) - F_y_RF = formula_lateral_comb( - s_rf, alpha_RF, gamma_RF, mu_y_RF, F_z_RF, F0_y_RF, params - ) - F_y_LR = formula_lateral_comb( - s_lr, alpha_LR, gamma_LR, mu_y_LR, F_z_LR, F0_y_LR, params - ) - F_y_RR = formula_lateral_comb( - s_rr, alpha_RR, gamma_RR, mu_y_RR, F_z_RR, F0_y_RR, params - ) - - # auxiliary movements for compliant joint equations - delta_z_f = params["h_s"] - params["R_w"] + x[16] - x[11] - delta_z_r = params["h_s"] - params["R_w"] + x[21] - x[11] + #compute lateral tire forces using the magic formula for combined slip + F_y_LF = formula_lateral_comb(s_lf, alpha_LF, gamma_LF, mu_y_LF, F_z_LF, F0_y_LF, params) + F_y_RF = formula_lateral_comb(s_rf, alpha_RF, gamma_RF, mu_y_RF, F_z_RF, F0_y_RF, params) + F_y_LR = formula_lateral_comb(s_lr, alpha_LR, gamma_LR, mu_y_LR, F_z_LR, F0_y_LR, params) + F_y_RR = formula_lateral_comb(s_rr, alpha_RR, gamma_RR, mu_y_RR, F_z_RR, F0_y_RR, params) + + #auxiliary movements for compliant joint equations + delta_z_f = h_s - R_w + x[16] - x[11] + delta_z_r = h_s - R_w + x[21] - x[11] delta_phi_f = x[6] - x[13] delta_phi_r = x[6] - x[18] @@ -368,185 +973,72 @@ def vehicle_dynamics_mb(x: np.ndarray, u_init: np.ndarray, params: dict): dot_delta_z_f = x[17] - x[12] dot_delta_z_r = x[22] - x[12] - dot_delta_y_f = x[10] + params["lf"] * x[5] - x[15] - dot_delta_y_r = x[10] - params["lr"] * x[5] - x[20] + dot_delta_y_f = x[10] + lf*x[5] - x[15] + dot_delta_y_r = x[10] - lr*x[5] - x[20] - delta_f = ( - delta_z_f * np.sin(x[6]) - - x[27] * np.cos(x[6]) - - (params["h_raf"] - params["R_w"]) * np.sin(delta_phi_f) - ) - delta_r = ( - delta_z_r * np.sin(x[6]) - - x[28] * np.cos(x[6]) - - (params["h_rar"] - params["R_w"]) * np.sin(delta_phi_r) - ) + delta_f = delta_z_f*np.sin(x[6]) - x[27]*np.cos(x[6]) - (h_raf - R_w)*np.sin(delta_phi_f) + delta_r = delta_z_r*np.sin(x[6]) - x[28]*np.cos(x[6]) - (h_rar - R_w)*np.sin(delta_phi_r) - dot_delta_f = ( - (delta_z_f * np.cos(x[6]) + x[27] * np.sin(x[6])) * x[7] - + dot_delta_z_f * np.sin(x[6]) - - dot_delta_y_f * np.cos(x[6]) - - (params["h_raf"] - params["R_w"]) * np.cos(delta_phi_f) * dot_delta_phi_f - ) - dot_delta_r = ( - (delta_z_r * np.cos(x[6]) + x[28] * np.sin(x[6])) * x[7] - + dot_delta_z_r * np.sin(x[6]) - - dot_delta_y_r * np.cos(x[6]) - - (params["h_rar"] - params["R_w"]) * np.cos(delta_phi_r) * dot_delta_phi_r - ) + dot_delta_f = (delta_z_f*np.cos(x[6]) + x[27]*np.sin(x[6]))*x[7] + dot_delta_z_f*np.sin(x[6]) - dot_delta_y_f*np.cos(x[6]) - (h_raf - R_w)*np.cos(delta_phi_f)*dot_delta_phi_f + dot_delta_r = (delta_z_r*np.cos(x[6]) + x[28]*np.sin(x[6]))*x[7] + dot_delta_z_r*np.sin(x[6]) - dot_delta_y_r*np.cos(x[6]) - (h_rar - R_w)*np.cos(delta_phi_r)*dot_delta_phi_r - # compliant joint forces - F_RAF = delta_f * params["K_ras"] + dot_delta_f * params["K_rad"] - F_RAR = delta_r * params["K_ras"] + dot_delta_r * params["K_rad"] + #compliant joint forces + F_RAF = delta_f*K_ras + dot_delta_f*K_rad + F_RAR = delta_r*K_ras + dot_delta_r*K_rad + + #auxiliary suspension forces (bump stop neglected squat/lift forces neglected) + F_SLF = m_s*g*lr/(2*(lf+lr)) - z_SLF*K_sf - dz_SLF*K_sdf + (x[6] - x[13])*K_tsf/T_f - # auxiliary suspension forces (bump stop neglected squat/lift forces neglected) - F_SLF = ( - params["m_s"] * g * params["lr"] / (2 * (params["lf"] + params["lr"])) - - z_SLF * params["K_sf"] - - dz_SLF * params["K_sdf"] - + (x[6] - x[13]) * params["K_tsf"] / params["T_f"] - ) + F_SRF = m_s*g*lr/(2*(lf+lr)) - z_SRF*K_sf - dz_SRF*K_sdf - (x[6] - x[13])*K_tsf/T_f - F_SRF = ( - params["m_s"] * g * params["lr"] / (2 * (params["lf"] + params["lr"])) - - z_SRF * params["K_sf"] - - dz_SRF * params["K_sdf"] - - (x[6] - x[13]) * params["K_tsf"] / params["T_f"] - ) + F_SLR = m_s*g*lf/(2*(lf+lr)) - z_SLR*K_sr - dz_SLR*K_sdr + (x[6] - x[18])*K_tsr/T_r - F_SLR = ( - params["m_s"] * g * params["lf"] / (2 * (params["lf"] + params["lr"])) - - z_SLR * params["K_sr"] - - dz_SLR * params["K_sdr"] - + (x[6] - x[18]) * params["K_tsr"] / params["T_r"] - ) + F_SRR = m_s*g*lf/(2*(lf+lr)) - z_SRR*K_sr - dz_SRR*K_sdr - (x[6] - x[18])*K_tsr/T_r - F_SRR = ( - params["m_s"] * g * params["lf"] / (2 * (params["lf"] + params["lr"])) - - z_SRR * params["K_sr"] - - dz_SRR * params["K_sdr"] - - (x[6] - x[18]) * params["K_tsr"] / params["T_r"] - ) + #auxiliary variables sprung mass + sumX = F_x_LR + F_x_RR + (F_x_LF + F_x_RF)*np.cos(x[2]) - (F_y_LF + F_y_RF)*np.sin(x[2]) - # auxiliary variables sprung mass - sumX = ( - F_x_LR - + F_x_RR - + (F_x_LF + F_x_RF) * np.cos(x[2]) - - (F_y_LF + F_y_RF) * np.sin(x[2]) - ) + sumN = (F_y_LF + F_y_RF)*lf*np.cos(x[2]) + (F_x_LF + F_x_RF)*lf*np.sin(x[2]) \ + + (F_y_RF - F_y_LF)*0.5*T_f*np.sin(x[2]) + (F_x_LF - F_x_RF)*0.5*T_f*np.cos(x[2]) \ + + (F_x_LR - F_x_RR)*0.5*T_r - (F_y_LR + F_y_RR)*lr - sumN = ( - (F_y_LF + F_y_RF) * params["lf"] * np.cos(x[2]) - + (F_x_LF + F_x_RF) * params["lf"] * np.sin(x[2]) - + (F_y_RF - F_y_LF) * 0.5 * params["T_f"] * np.sin(x[2]) - + (F_x_LF - F_x_RF) * 0.5 * params["T_f"] * np.cos(x[2]) - + (F_x_LR - F_x_RR) * 0.5 * params["T_r"] - - (F_y_LR + F_y_RR) * params["lr"] - ) + sumY_s = (F_RAF + F_RAR)*np.cos(x[6]) + (F_SLF + F_SLR + F_SRF + F_SRR)*np.sin(x[6]) - sumY_s = (F_RAF + F_RAR) * np.cos(x[6]) + (F_SLF + F_SLR + F_SRF + F_SRR) * np.sin( - x[6] - ) + sumL = 0.5*F_SLF*T_f + 0.5*F_SLR*T_r - 0.5*F_SRF*T_f - 0.5*F_SRR*T_r \ + - F_RAF/np.cos(x[6])*(h_s - x[11] - R_w + x[16] - (h_raf - R_w)*np.cos(x[13])) \ + - F_RAR/np.cos(x[6])*(h_s - x[11] - R_w + x[21] - (h_rar - R_w)*np.cos(x[18])) - sumL = ( - 0.5 * F_SLF * params["T_f"] - + 0.5 * F_SLR * params["T_r"] - - 0.5 * F_SRF * params["T_f"] - - 0.5 * F_SRR * params["T_r"] - - F_RAF - / np.cos(x[6]) - * ( - params["h_s"] - - x[11] - - params["R_w"] - + x[16] - - (params["h_raf"] - params["R_w"]) * np.cos(x[13]) - ) - - F_RAR - / np.cos(x[6]) - * ( - params["h_s"] - - x[11] - - params["R_w"] - + x[21] - - (params["h_rar"] - params["R_w"]) * np.cos(x[18]) - ) - ) + sumZ_s = (F_SLF + F_SLR + F_SRF + F_SRR)*np.cos(x[6]) - (F_RAF + F_RAR)*np.sin(x[6]) - sumZ_s = (F_SLF + F_SLR + F_SRF + F_SRR) * np.cos(x[6]) - (F_RAF + F_RAR) * np.sin( - x[6] - ) + sumM_s = lf*(F_SLF + F_SRF) - lr*(F_SLR + F_SRR) + ((F_x_LF + F_x_RF)*np.cos(x[2]) \ + - (F_y_LF + F_y_RF)*np.sin(x[2]) + F_x_LR + F_x_RR)*(h_s - x[11]) - sumM_s = ( - params["lf"] * (F_SLF + F_SRF) - - params["lr"] * (F_SLR + F_SRR) - + ( - (F_x_LF + F_x_RF) * np.cos(x[2]) - - (F_y_LF + F_y_RF) * np.sin(x[2]) - + F_x_LR - + F_x_RR - ) - * (params["h_s"] - x[11]) - ) + #auxiliary variables unsprung mass + sumL_uf = 0.5*F_SRF*T_f - 0.5*F_SLF*T_f - F_RAF*(h_raf - R_w) \ + + F_z_LF*(R_w*np.sin(x[13]) + 0.5*T_f*np.cos(x[13]) - K_lt*F_y_LF) \ + - F_z_RF*(-R_w*np.sin(x[13]) + 0.5*T_f*np.cos(x[13]) + K_lt*F_y_RF) \ + - ((F_y_LF + F_y_RF)*np.cos(x[2]) + (F_x_LF + F_x_RF)*np.sin(x[2]))*(R_w - x[16]) - # auxiliary variables unsprung mass - sumL_uf = ( - 0.5 * F_SRF * params["T_f"] - - 0.5 * F_SLF * params["T_f"] - - F_RAF * (params["h_raf"] - params["R_w"]) - + F_z_LF - * ( - params["R_w"] * np.sin(x[13]) - + 0.5 * params["T_f"] * np.cos(x[13]) - - params["K_lt"] * F_y_LF - ) - - F_z_RF - * ( - -params["R_w"] * np.sin(x[13]) - + 0.5 * params["T_f"] * np.cos(x[13]) - + params["K_lt"] * F_y_RF - ) - - ((F_y_LF + F_y_RF) * np.cos(x[2]) + (F_x_LF + F_x_RF) * np.sin(x[2])) - * (params["R_w"] - x[16]) - ) + sumL_ur = 0.5*F_SRR*T_r - 0.5*F_SLR*T_r - F_RAR*(h_rar - R_w) \ + + F_z_LR*(R_w*np.sin(x[18]) + 0.5*T_r*np.cos(x[18]) - K_lt*F_y_LR) \ + - F_z_RR*(-R_w*np.sin(x[18]) + 0.5*T_r*np.cos(x[18]) + K_lt*F_y_RR) \ + - (F_y_LR + F_y_RR)*(R_w - x[21]) - sumL_ur = ( - 0.5 * F_SRR * params["T_r"] - - 0.5 * F_SLR * params["T_r"] - - F_RAR * (params["h_rar"] - params["R_w"]) - + F_z_LR - * ( - params["R_w"] * np.sin(x[18]) - + 0.5 * params["T_r"] * np.cos(x[18]) - - params["K_lt"] * F_y_LR - ) - - F_z_RR - * ( - -params["R_w"] * np.sin(x[18]) - + 0.5 * params["T_r"] * np.cos(x[18]) - + params["K_lt"] * F_y_RR - ) - - (F_y_LR + F_y_RR) * (params["R_w"] - x[21]) - ) + sumZ_uf = F_z_LF + F_z_RF + F_RAF*np.sin(x[6]) - (F_SLF + F_SRF)*np.cos(x[6]) - sumZ_uf = F_z_LF + F_z_RF + F_RAF * np.sin(x[6]) - (F_SLF + F_SRF) * np.cos(x[6]) + sumZ_ur = F_z_LR + F_z_RR + F_RAR*np.sin(x[6]) - (F_SLR + F_SRR)*np.cos(x[6]) - sumZ_ur = F_z_LR + F_z_RR + F_RAR * np.sin(x[6]) - (F_SLR + F_SRR) * np.cos(x[6]) + sumY_uf = (F_y_LF + F_y_RF)*np.cos(x[2]) + (F_x_LF + F_x_RF)*np.sin(x[2]) \ + - F_RAF*np.cos(x[6]) - (F_SLF + F_SRF)*np.sin(x[6]) - sumY_uf = ( - (F_y_LF + F_y_RF) * np.cos(x[2]) - + (F_x_LF + F_x_RF) * np.sin(x[2]) - - F_RAF * np.cos(x[6]) - - (F_SLF + F_SRF) * np.sin(x[6]) - ) + sumY_ur = (F_y_LR + F_y_RR) \ + - F_RAR*np.cos(x[6]) - (F_SLR + F_SRR)*np.sin(x[6]) - sumY_ur = (F_y_LR + F_y_RR) - F_RAR * np.cos(x[6]) - (F_SLR + F_SRR) * np.sin(x[6]) # dynamics common with single-track model - f = np.zeros(29) # init 'right hand side' + f = np.zeros((29,))# init 'right hand side' # switch to kinematic model for small velocities - if abs(x[3]) < KIN_THRESH: + if use_kinematic: # wheelbase # lwb = lf + lr @@ -558,137 +1050,129 @@ def vehicle_dynamics_mb(x: np.ndarray, u_init: np.ndarray, params: dict): # Use kinematic model with reference point at center of mass # wheelbase - lwb = params["lf"] + params["lr"] + lwb = lf + lr + # system dynamics - x_ks = [x[0], x[1], x[2], x[3], x[4]] + x_ks = x[0:5] # kinematic model - f_ks = vehicle_dynamics_ks_cog(np.array(x_ks), u, params) - f[0:5] = np.array([f_ks[0], f_ks[1], f_ks[2], f_ks[3], f_ks[4]]) + # f_ks = vehicle_dynamics_ks_cog(x_ks, u, p) + # f = [f_ks[0], f_ks[1], f_ks[2], f_ks[3], f_ks[4]] # 1 2 3 4 5 + f_ks = vehicle_dynamics_ks_cog(x_ks, u, 0., 0., 0., lf, lr, 0., 0., 0., s_min, s_max, sv_min, sv_max, v_switch, a_max, v_min, v_max, 0., 0.) + f[0:5] = f_ks # derivative of slip angle and yaw rate - d_beta = (params["lr"] * u[0]) / ( - lwb - * np.cos(x[2]) ** 2 - * (1 + (np.tan(x[2]) ** 2 * params["lr"] / lwb) ** 2) - ) - dd_psi = ( - 1 - / lwb - * ( - u[1] * np.cos(x[6]) * np.tan(x[2]) - - x[3] * np.sin(x[6]) * d_beta * np.tan(x[2]) - + x[3] * np.cos(x[6]) * u[0] / np.cos(x[2]) ** 2 - ) - ) + d_beta = (lr * u[0]) / (lwb * np.cos(x[2]) ** 2 * (1 + (np.tan(x[2]) ** 2 * lr / lwb) ** 2)) + dd_psi = 1 / lwb * (u[1] * np.cos(x[6]) * np.tan(x[2]) - + x[3] * np.sin(x[6]) * d_beta * np.tan(x[2]) + + x[3] * np.cos(x[6]) * u[0] / np.cos(x[2]) ** 2) + # f.append(dd_psi) # 6 f[5] = dd_psi else: - f[0] = np.cos(beta + x[4]) * vel - f[1] = np.sin(beta + x[4]) * vel - f[2] = u[0] - f[3] = 1 / params["m"] * sumX + x[5] * x[10] - f[4] = x[5] - f[5] = ( - 1 - / (params["I_z"] - (params["I_xz_s"]) ** 2 / params["I_Phi_s"]) - * (sumN + params["I_xz_s"] / params["I_Phi_s"] * sumL) - ) + f[0] = np.cos(beta + x[4])*vel # 1 + f[1] = np.sin(beta + x[4])*vel # 2 + f[2] = u[0] # 3 + f[3] = 1/m*sumX + x[5]*x[10] # 4 + f[4] = x[5] # 5 + f[5] = 1/(I_z - (I_xz_s)**2/I_Phi_s)*(sumN + I_xz_s/I_Phi_s*sumL) # 6 + # remaining sprung mass dynamics - f[6] = x[7] - f[7] = ( - 1 - / (params["I_Phi_s"] - (params["I_xz_s"]) ** 2 / params["I_z"]) - * (params["I_xz_s"] / params["I_z"] * sumN + sumL) - ) - f[8] = x[9] - f[9] = 1 / params["I_y_s"] * sumM_s - f[10] = 1 / params["m_s"] * sumY_s - x[5] * x[3] - f[11] = x[12] - f[12] = g - 1 / params["m_s"] * sumZ_s - - # unsprung mass dynamics (front) - f[13] = x[14] - f[14] = 1 / params["I_uf"] * sumL_uf - f[15] = 1 / params["m_uf"] * sumY_uf - x[5] * x[3] - f[16] = x[17] - f[17] = g - 1 / params["m_uf"] * sumZ_uf - - # unsprung mass dynamics (rear) - f[18] = x[19] - f[19] = 1 / params["I_ur"] * sumL_ur - f[20] = 1 / params["m_ur"] * sumY_ur - x[5] * x[3] - f[21] = x[22] - f[22] = g - 1 / params["m_ur"] * sumZ_ur + f[6] = x[7] # 7 + f[7] = 1/(I_Phi_s - (I_xz_s)**2/I_z)*(I_xz_s/I_z*sumN + sumL) # 8 + f[8] = x[9] # 9 + f[9] = 1/I_y_s*sumM_s # 10 + f[10] = 1/m_s*sumY_s - x[5]*x[3] # 11 + f[11] = x[12] # 12 + f[12] = g - 1/m_s*sumZ_s # 13 + + #unsprung mass dynamics (front) + f[13] = x[14] # 14 + f[14] = 1/I_uf*sumL_uf # 15 + f[15] = 1/m_uf*sumY_uf - x[5]*x[3] # 16 + f[16] = x[17] # 17 + f[17] = g - 1/m_uf*sumZ_uf # 18 + + #unsprung mass dynamics (rear) + f[18] = x[19] # 19 + f[19] = 1/I_ur*sumL_ur # 20 + f[20] = 1/m_ur*sumY_ur - x[5]*x[3] # 21 + f[21] = x[22] # 22 + f[22] = g - 1/m_ur*sumZ_ur # 23 # convert acceleration input to brake and engine torque if u[1] > 0: T_B = 0.0 - T_E = params["m"] * params["R_w"] * u[1] + T_E = m * R_w * u[1] else: - T_B = params["m"] * params["R_w"] * u[1] + T_B = m * R_w * u[1] T_E = 0.0 - # wheel dynamics (T new parameter for torque splitting) + #wheel dynamics (p.T new parameter for torque splitting) - splitting for brake/drive torque is outside of the integration f[23] = ( 1 - / params["I_y_w"] + / I_y_w * ( - -params["R_w"] * F_x_LF - + 0.5 * params["T_sb"] * T_B - + 0.5 * params["T_se"] * T_E + -R_w * F_x_LF + + 0.5 * T_sb * T_B + + 0.5 * T_se * T_E ) ) f[24] = ( 1 - / params["I_y_w"] + / I_y_w * ( - -params["R_w"] * F_x_RF - + 0.5 * params["T_sb"] * T_B - + 0.5 * params["T_se"] * T_E + -R_w * F_x_RF + + 0.5 * T_sb * T_B + + 0.5 * T_se * T_E ) ) f[25] = ( 1 - / params["I_y_w"] + / I_y_w * ( - -params["R_w"] * F_x_LR - + 0.5 * (1 - params["T_sb"]) * T_B - + 0.5 * (1 - params["T_se"]) * T_E + -R_w * F_x_LR + + 0.5 * (1 - T_sb) * T_B + + 0.5 * (1 - T_se) * T_E ) ) f[26] = ( 1 - / params["I_y_w"] + / I_y_w * ( - -params["R_w"] * F_x_RR - + 0.5 * (1 - params["T_sb"]) * T_B - + 0.5 * (1 - params["T_se"]) * T_E + -R_w * F_x_RR + + 0.5 * (1 - T_sb) * T_B + + 0.5 * (1 - T_se) * T_E ) ) - # negative wheel spin forbidden + #negative wheel spin forbidden handeled outside of this function for iState in range(23, 27): if x[iState] < 0.0: x[iState] = 0.0 f[iState] = 0.0 - # compliant joint equations - f[27] = dot_delta_y_f - f[28] = dot_delta_y_r - + #compliant joint equations + f[27] = dot_delta_y_f # 28 + f[28] = dot_delta_y_r # 29 + + # longitudinal slip + # s_lf + # s_rf + # s_lr + # s_rr + + # lateral slip + # alpha_LF + # alpha_RF + # alpha_LR + # alpha_RR + + # return f, F_x_LF, F_x_RF, F_x_LR, F_x_RR, F_y_LF, F_y_RF, F_y_LR, F_y_RR, \ + # s_lf, s_rf, s_lr, s_rr, alpha_LF, alpha_RF, alpha_LR, alpha_RR, \ + # F_z_LF, F_z_RF, F_z_LR, F_z_RR return f - @njit(cache=True) -def get_standardized_state_mb(x: np.ndarray) -> dict: - """[X,Y,DELTA,V_X, V_Y,YAW,YAW_RATE,SLIP]""" - d = dict() - d["x"] = x[0] - d["y"] = x[1] - d["delta"] = x[2] - d["v_x"] = x[3] - d["v_y"] = x[10] - d["yaw"] = x[4] - d["yaw_rate"] = x[5] - d["slip"] = np.arctan2(x[10], x[3]) - return d +def get_standardized_state_mb(x: np.ndarray) -> np.ndarray: + """[X,Y,Steering_Angle,Speed,YAW,YAW_RATE,V_Y]""" + return np.array([x[0], x[1], x[2], np.sqrt(x[3] ** 2 + x[10] ** 2), x[4], x[5], np.arctan2(x[10], x[3])]) diff --git a/f1tenth_gym/envs/dynamic_models/multi_body/tire_model.py b/f1tenth_gym/envs/dynamic_models/multi_body/tire_model.py index 6fc6f704..e18d38a1 100644 --- a/f1tenth_gym/envs/dynamic_models/multi_body/tire_model.py +++ b/f1tenth_gym/envs/dynamic_models/multi_body/tire_model.py @@ -1,17 +1,33 @@ +# Copyright 2020 Technical University of Munich, Professorship of Cyber-Physical Systems, Matthew O'Kelly, Aman Sinha, Hongrui Zheng + +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + import numpy as np from numba import njit # longitudinal tire forces -def formula_longitudinal(kappa, gamma, F_z, params: dict): +@njit(cache=True) +def formula_longitudinal(kappa, gamma, F_z, params): + # longitudinal coefficients - tire_p_cx1 = params["tire_p_cx1"] # Shape factor Cfx for longitudinal force - tire_p_dx1 = params["tire_p_dx1"] # Longitudinal friction Mux at Fznom - tire_p_dx3 = params["tire_p_dx3"] # Variation of friction Mux with camber - tire_p_ex1 = params["tire_p_ex1"] # Longitudinal curvature Efx at Fznom - tire_p_kx1 = params["tire_p_kx1"] # Longitudinal slip stiffness Kfx/Fz at Fznom - tire_p_hx1 = params["tire_p_hx1"] # Horizontal shift Shx at Fznom - tire_p_vx1 = params["tire_p_vx1"] # Vertical shift Svx/Fz at Fznom + tire_p_cx1 = params[46] # Shape factor Cfx for longitudinal force + tire_p_dx1 = params[47] # Longitudinal friction Mux at Fznom + tire_p_dx3 = params[48] # Variation of friction Mux with camber + tire_p_ex1 = params[49] # Longitudinal curvature Efx at Fznom + tire_p_kx1 = params[50] # Longitudinal slip stiffness Kfx/Fz at Fznom + tire_p_hx1 = params[51] # Horizontal shift Shx at Fznom + tire_p_vx1 = params[52] # Vertical shift Svx/Fz at Fznom # turn slip is neglected, so xi_i=1 # all scaling factors lambda = 1 @@ -23,7 +39,7 @@ def formula_longitudinal(kappa, gamma, F_z, params: dict): S_vx = F_z * tire_p_vx1 kappa_x = kappa + S_hx - mu_x = tire_p_dx1 * (1 - tire_p_dx3 * gamma**2) + mu_x = tire_p_dx1 * (1 - tire_p_dx3 * gamma ** 2) C_x = tire_p_cx1 D_x = mu_x * F_z @@ -32,25 +48,23 @@ def formula_longitudinal(kappa, gamma, F_z, params: dict): B_x = K_x / (C_x * D_x) # magic tire formula - return D_x * np.sin( - C_x - * np.arctan(B_x * kappa_x - E_x * (B_x * kappa_x - np.arctan(B_x * kappa_x))) - + S_vx - ) + return D_x * np.sin(C_x * np.arctan(B_x * kappa_x - E_x * (B_x * kappa_x - np.arctan(B_x * kappa_x))) + S_vx) # lateral tire forces -def formula_lateral(alpha, gamma, F_z, params: dict): +@njit(cache=True) +def formula_lateral(alpha, gamma, F_z, params): + # lateral coefficients - tire_p_cy1 = params["tire_p_cy1"] # Shape factor Cfy for lateral forces - tire_p_dy1 = params["tire_p_dy1"] # Lateral friction Muy - tire_p_dy3 = params["tire_p_dy3"] # Variation of friction Muy with squared camber - tire_p_ey1 = params["tire_p_ey1"] # Lateral curvature Efy at Fznom - tire_p_ky1 = params["tire_p_ky1"] # Maximum value of stiffness Kfy/Fznom - tire_p_hy1 = params["tire_p_hy1"] # Horizontal shift Shy at Fznom - tire_p_hy3 = params["tire_p_hy3"] # Variation of shift Shy with camber - tire_p_vy1 = params["tire_p_vy1"] # Vertical shift in Svy/Fz at Fznom - tire_p_vy3 = params["tire_p_vy3"] # Variation of shift Svy/Fz with camber + tire_p_cy1 = params[58] # Shape factor Cfy for lateral forces + tire_p_dy1 = params[59] # Lateral friction Muy + tire_p_dy3 = params[60] # Variation of friction Muy with squared camber + tire_p_ey1 = params[61] # Lateral curvature Efy at Fznom + tire_p_ky1 = params[62] # Maximum value of stiffness Kfy/Fznom + tire_p_hy1 = params[63] # Horizontal shift Shy at Fznom + tire_p_hy3 = params[64] # Variation of shift Shy with camber + tire_p_vy1 = params[65] # Vertical shift in Svy/Fz at Fznom + tire_p_vy3 = params[66] # Variation of shift Svy/Fz with camber # turn slip is neglected, so xi_i=1 # all scaling factors lambda = 1 @@ -62,7 +76,7 @@ def formula_lateral(alpha, gamma, F_z, params: dict): S_vy = np.sign(gamma) * F_z * (tire_p_vy1 + tire_p_vy3 * np.fabs(gamma)) alpha_y = alpha + S_hy - mu_y = tire_p_dy1 * (1 - tire_p_dy3 * gamma**2) + mu_y = tire_p_dy1 * (1 - tire_p_dy3 * gamma ** 2) C_y = tire_p_cy1 D_y = mu_y * F_z @@ -71,16 +85,7 @@ def formula_lateral(alpha, gamma, F_z, params: dict): B_y = K_y / (C_y * D_y) # magic tire formula - F_y = ( - D_y - * np.sin( - C_y - * np.arctan( - B_y * alpha_y - E_y * (B_y * alpha_y - np.arctan(B_y * alpha_y)) - ) - ) - + S_vy - ) + F_y = D_y * np.sin(C_y * np.arctan(B_y * alpha_y - E_y * (B_y * alpha_y - np.arctan(B_y * alpha_y)))) + S_vy res = [] res.append(F_y) @@ -89,15 +94,17 @@ def formula_lateral(alpha, gamma, F_z, params: dict): # longitudinal tire forces for combined slip -def formula_longitudinal_comb(kappa, alpha, F0_x, params: dict): +@njit(cache=True) +def formula_longitudinal_comb(kappa, alpha, F0_x, params): + # longitudinal coefficients - tire_r_bx1 = params["tire_r_bx1"] # Slope factor for combined slip Fx reduction - tire_r_bx2 = params["tire_r_bx2"] # Variation of slope Fx reduction with kappa - tire_r_cx1 = params["tire_r_cx1"] # Shape factor for combined slip Fx reduction - tire_r_ex1 = params["tire_r_ex1"] # Curvature factor of combined Fx - tire_r_hx1 = params["tire_r_hx1"] # Shift factor for combined slip Fx reduction + tire_r_bx1 = params[53] # Slope factor for combined slip Fx reduction + tire_r_bx2 = params[54] # Variation of slope Fx reduction with kappa + tire_r_cx1 = params[55] # Shape factor for combined slip Fx reduction + tire_r_ex1 = params[56] # Curvature factor of combined Fx + tire_r_hx1 = params[57] # Shift factor for combined slip Fx reduction - # turn slip '' neglected, so xi_i=1 + # turn slip is neglected, so xi_i=1 # all scaling factors lambda = 1 S_hxalpha = tire_r_hx1 @@ -107,40 +114,30 @@ def formula_longitudinal_comb(kappa, alpha, F0_x, params: dict): B_xalpha = tire_r_bx1 * np.cos(np.arctan(tire_r_bx2 * kappa)) C_xalpha = tire_r_cx1 E_xalpha = tire_r_ex1 - D_xalpha = F0_x / ( - np.cos( - C_xalpha - * np.arctan( - B_xalpha * S_hxalpha - - E_xalpha * (B_xalpha * S_hxalpha - np.arctan(B_xalpha * S_hxalpha)) - ) - ) - ) + D_xalpha = F0_x / (np.cos(C_xalpha * np.arctan( + B_xalpha * S_hxalpha - E_xalpha * (B_xalpha * S_hxalpha - np.arctan(B_xalpha * S_hxalpha))))) # magic tire formula return D_xalpha * np.cos( - C_xalpha - * np.arctan( - B_xalpha * alpha_s - - E_xalpha * (B_xalpha * alpha_s - np.arctan(B_xalpha * alpha_s)) - ) - ) + C_xalpha * np.arctan(B_xalpha * alpha_s - E_xalpha * (B_xalpha * alpha_s - np.arctan(B_xalpha * alpha_s)))) # lateral tire forces for combined slip -def formula_lateral_comb(kappa, alpha, gamma, mu_y, F_z, F0_y, params: dict): +@njit(cache=True) +def formula_lateral_comb(kappa, alpha, gamma, mu_y, F_z, F0_y, params): + # lateral coefficients - tire_r_by1 = params["tire_r_by1"] # Slope factor for combined Fy reduction - tire_r_by2 = params["tire_r_by2"] # Variation of slope Fy reduction with alpha - tire_r_by3 = params["tire_r_by3"] # Shift term for alpha in slope Fy reduction - tire_r_cy1 = params["tire_r_cy1"] # Shape factor for combined Fy reduction - tire_r_ey1 = params["tire_r_ey1"] # Curvature factor of combined Fy - tire_r_hy1 = params["tire_r_hy1"] # Shift factor for combined Fy reduction - tire_r_vy1 = params["tire_r_vy1"] # Kappa induced side force Svyk/Muy*Fz at Fznom - tire_r_vy3 = params["tire_r_vy3"] # Variation of Svyk/Muy*Fz with camber - tire_r_vy4 = params["tire_r_vy4"] # Variation of Svyk/Muy*Fz with alpha - tire_r_vy5 = params["tire_r_vy5"] # Variation of Svyk/Muy*Fz with kappa - tire_r_vy6 = params["tire_r_vy6"] # Variation of Svyk/Muy*Fz with atan(kappa) + tire_r_by1 = params[67] # Slope factor for combined Fy reduction + tire_r_by2 = params[68] # Variation of slope Fy reduction with alpha + tire_r_by3 = params[69] # Shift term for alpha in slope Fy reduction + tire_r_cy1 = params[70] # Shape factor for combined Fy reduction + tire_r_ey1 = params[71] # Curvature factor of combined Fy + tire_r_hy1 = params[72] # Shift factor for combined Fy reduction + tire_r_vy1 = params[73] # Kappa induced side force Svyk/Muy*Fz at Fznom + tire_r_vy3 = params[74] # Variation of Svyk/Muy*Fz with camber + tire_r_vy4 = params[75] # Variation of Svyk/Muy*Fz with alpha + tire_r_vy5 = params[76] # Variation of Svyk/Muy*Fz with kappa + tire_r_vy6 = params[77] # Variation of Svyk/Muy*Fz with atan(kappa) # turn slip is neglected, so xi_i=1 # all scaling factors lambda = 1 @@ -152,33 +149,12 @@ def formula_lateral_comb(kappa, alpha, gamma, mu_y, F_z, F0_y, params: dict): B_ykappa = tire_r_by1 * np.cos(np.arctan(tire_r_by2 * (alpha - tire_r_by3))) C_ykappa = tire_r_cy1 E_ykappa = tire_r_ey1 - D_ykappa = F0_y / ( - np.cos( - C_ykappa - * np.arctan( - B_ykappa * S_hykappa - - E_ykappa * (B_ykappa * S_hykappa - np.arctan(B_ykappa * S_hykappa)) - ) - ) - ) - - D_vykappa = ( - mu_y - * F_z - * (tire_r_vy1 + tire_r_vy3 * gamma) - * np.cos(np.arctan(tire_r_vy4 * alpha)) - ) + D_ykappa = F0_y / (np.cos(C_ykappa * np.arctan( + B_ykappa * S_hykappa - E_ykappa * (B_ykappa * S_hykappa - np.arctan(B_ykappa * S_hykappa))))) + + D_vykappa = mu_y * F_z * (tire_r_vy1 + tire_r_vy3 * gamma) * np.cos(np.arctan(tire_r_vy4 * alpha)) S_vykappa = D_vykappa * np.sin(tire_r_vy5 * np.arctan(tire_r_vy6 * kappa)) # magic tire formula - return ( - D_ykappa - * np.cos( - C_ykappa - * np.arctan( - B_ykappa * kappa_s - - E_ykappa * (B_ykappa * kappa_s - np.arctan(B_ykappa * kappa_s)) - ) - ) - + S_vykappa - ) + return D_ykappa * np.cos(C_ykappa * np.arctan( + B_ykappa * kappa_s - E_ykappa * (B_ykappa * kappa_s - np.arctan(B_ykappa * kappa_s)))) + S_vykappa diff --git a/f1tenth_gym/envs/dynamic_models/multi_body/tire_model_new.py b/f1tenth_gym/envs/dynamic_models/multi_body/tire_model_new.py new file mode 100644 index 00000000..6fc6f704 --- /dev/null +++ b/f1tenth_gym/envs/dynamic_models/multi_body/tire_model_new.py @@ -0,0 +1,184 @@ +import numpy as np +from numba import njit + + +# longitudinal tire forces +def formula_longitudinal(kappa, gamma, F_z, params: dict): + # longitudinal coefficients + tire_p_cx1 = params["tire_p_cx1"] # Shape factor Cfx for longitudinal force + tire_p_dx1 = params["tire_p_dx1"] # Longitudinal friction Mux at Fznom + tire_p_dx3 = params["tire_p_dx3"] # Variation of friction Mux with camber + tire_p_ex1 = params["tire_p_ex1"] # Longitudinal curvature Efx at Fznom + tire_p_kx1 = params["tire_p_kx1"] # Longitudinal slip stiffness Kfx/Fz at Fznom + tire_p_hx1 = params["tire_p_hx1"] # Horizontal shift Shx at Fznom + tire_p_vx1 = params["tire_p_vx1"] # Vertical shift Svx/Fz at Fznom + + # turn slip is neglected, so xi_i=1 + # all scaling factors lambda = 1 + + # coordinate system transformation + kappa = -kappa + + S_hx = tire_p_hx1 + S_vx = F_z * tire_p_vx1 + + kappa_x = kappa + S_hx + mu_x = tire_p_dx1 * (1 - tire_p_dx3 * gamma**2) + + C_x = tire_p_cx1 + D_x = mu_x * F_z + E_x = tire_p_ex1 + K_x = F_z * tire_p_kx1 + B_x = K_x / (C_x * D_x) + + # magic tire formula + return D_x * np.sin( + C_x + * np.arctan(B_x * kappa_x - E_x * (B_x * kappa_x - np.arctan(B_x * kappa_x))) + + S_vx + ) + + +# lateral tire forces +def formula_lateral(alpha, gamma, F_z, params: dict): + # lateral coefficients + tire_p_cy1 = params["tire_p_cy1"] # Shape factor Cfy for lateral forces + tire_p_dy1 = params["tire_p_dy1"] # Lateral friction Muy + tire_p_dy3 = params["tire_p_dy3"] # Variation of friction Muy with squared camber + tire_p_ey1 = params["tire_p_ey1"] # Lateral curvature Efy at Fznom + tire_p_ky1 = params["tire_p_ky1"] # Maximum value of stiffness Kfy/Fznom + tire_p_hy1 = params["tire_p_hy1"] # Horizontal shift Shy at Fznom + tire_p_hy3 = params["tire_p_hy3"] # Variation of shift Shy with camber + tire_p_vy1 = params["tire_p_vy1"] # Vertical shift in Svy/Fz at Fznom + tire_p_vy3 = params["tire_p_vy3"] # Variation of shift Svy/Fz with camber + + # turn slip is neglected, so xi_i=1 + # all scaling factors lambda = 1 + + # coordinate system transformation + # alpha = -alpha + + S_hy = np.sign(gamma) * (tire_p_hy1 + tire_p_hy3 * np.fabs(gamma)) + S_vy = np.sign(gamma) * F_z * (tire_p_vy1 + tire_p_vy3 * np.fabs(gamma)) + + alpha_y = alpha + S_hy + mu_y = tire_p_dy1 * (1 - tire_p_dy3 * gamma**2) + + C_y = tire_p_cy1 + D_y = mu_y * F_z + E_y = tire_p_ey1 + K_y = F_z * tire_p_ky1 # simplify K_y0 to tire_p_ky1*F_z + B_y = K_y / (C_y * D_y) + + # magic tire formula + F_y = ( + D_y + * np.sin( + C_y + * np.arctan( + B_y * alpha_y - E_y * (B_y * alpha_y - np.arctan(B_y * alpha_y)) + ) + ) + + S_vy + ) + + res = [] + res.append(F_y) + res.append(mu_y) + return res + + +# longitudinal tire forces for combined slip +def formula_longitudinal_comb(kappa, alpha, F0_x, params: dict): + # longitudinal coefficients + tire_r_bx1 = params["tire_r_bx1"] # Slope factor for combined slip Fx reduction + tire_r_bx2 = params["tire_r_bx2"] # Variation of slope Fx reduction with kappa + tire_r_cx1 = params["tire_r_cx1"] # Shape factor for combined slip Fx reduction + tire_r_ex1 = params["tire_r_ex1"] # Curvature factor of combined Fx + tire_r_hx1 = params["tire_r_hx1"] # Shift factor for combined slip Fx reduction + + # turn slip '' neglected, so xi_i=1 + # all scaling factors lambda = 1 + + S_hxalpha = tire_r_hx1 + + alpha_s = alpha + S_hxalpha + + B_xalpha = tire_r_bx1 * np.cos(np.arctan(tire_r_bx2 * kappa)) + C_xalpha = tire_r_cx1 + E_xalpha = tire_r_ex1 + D_xalpha = F0_x / ( + np.cos( + C_xalpha + * np.arctan( + B_xalpha * S_hxalpha + - E_xalpha * (B_xalpha * S_hxalpha - np.arctan(B_xalpha * S_hxalpha)) + ) + ) + ) + + # magic tire formula + return D_xalpha * np.cos( + C_xalpha + * np.arctan( + B_xalpha * alpha_s + - E_xalpha * (B_xalpha * alpha_s - np.arctan(B_xalpha * alpha_s)) + ) + ) + + +# lateral tire forces for combined slip +def formula_lateral_comb(kappa, alpha, gamma, mu_y, F_z, F0_y, params: dict): + # lateral coefficients + tire_r_by1 = params["tire_r_by1"] # Slope factor for combined Fy reduction + tire_r_by2 = params["tire_r_by2"] # Variation of slope Fy reduction with alpha + tire_r_by3 = params["tire_r_by3"] # Shift term for alpha in slope Fy reduction + tire_r_cy1 = params["tire_r_cy1"] # Shape factor for combined Fy reduction + tire_r_ey1 = params["tire_r_ey1"] # Curvature factor of combined Fy + tire_r_hy1 = params["tire_r_hy1"] # Shift factor for combined Fy reduction + tire_r_vy1 = params["tire_r_vy1"] # Kappa induced side force Svyk/Muy*Fz at Fznom + tire_r_vy3 = params["tire_r_vy3"] # Variation of Svyk/Muy*Fz with camber + tire_r_vy4 = params["tire_r_vy4"] # Variation of Svyk/Muy*Fz with alpha + tire_r_vy5 = params["tire_r_vy5"] # Variation of Svyk/Muy*Fz with kappa + tire_r_vy6 = params["tire_r_vy6"] # Variation of Svyk/Muy*Fz with atan(kappa) + + # turn slip is neglected, so xi_i=1 + # all scaling factors lambda = 1 + + S_hykappa = tire_r_hy1 + + kappa_s = kappa + S_hykappa + + B_ykappa = tire_r_by1 * np.cos(np.arctan(tire_r_by2 * (alpha - tire_r_by3))) + C_ykappa = tire_r_cy1 + E_ykappa = tire_r_ey1 + D_ykappa = F0_y / ( + np.cos( + C_ykappa + * np.arctan( + B_ykappa * S_hykappa + - E_ykappa * (B_ykappa * S_hykappa - np.arctan(B_ykappa * S_hykappa)) + ) + ) + ) + + D_vykappa = ( + mu_y + * F_z + * (tire_r_vy1 + tire_r_vy3 * gamma) + * np.cos(np.arctan(tire_r_vy4 * alpha)) + ) + S_vykappa = D_vykappa * np.sin(tire_r_vy5 * np.arctan(tire_r_vy6 * kappa)) + + # magic tire formula + return ( + D_ykappa + * np.cos( + C_ykappa + * np.arctan( + B_ykappa * kappa_s + - E_ykappa * (B_ykappa * kappa_s - np.arctan(B_ykappa * kappa_s)) + ) + ) + + S_vykappa + ) diff --git a/f1tenth_gym/envs/dynamic_models/single_track.py b/f1tenth_gym/envs/dynamic_models/single_track.py index eea349f1..6bbe2308 100644 --- a/f1tenth_gym/envs/dynamic_models/single_track.py +++ b/f1tenth_gym/envs/dynamic_models/single_track.py @@ -1,48 +1,179 @@ import numpy as np from numba import njit -from numba.typed import Dict from .utils import steering_constraint, accl_constraints +# @njit() +# def vehicle_dynamics_st(x: np.ndarray, u_init: np.ndarray, params: dict): +# """ +# Single Track Vehicle Dynamics. +# From https://gitlab.lrz.de/tum-cps/commonroad-vehicle-models/-/blob/master/vehicleModels_commonRoad.pdf, section 7 -def vehicle_dynamics_st(x: np.ndarray, u_init: np.ndarray, params: dict): - """ - Single Track Vehicle Dynamics. - From https://gitlab.lrz.de/tum-cps/commonroad-vehicle-models/-/blob/master/vehicleModels_commonRoad.pdf, section 7 +# Args: +# x (numpy.ndarray (7, )): vehicle state vector (x0, x1, x2, x3, x4, x5, x6) +# x0: x position in global coordinates +# x1: y position in global coordinates +# x2: steering angle of front wheels +# x3: velocity in x direction +# x4: yaw angle +# x5: yaw rate +# x6: slip angle at vehicle center +# u (numpy.ndarray (2, )): control input vector (u1, u2) +# u1: steering angle velocity of front wheels +# u2: longitudinal acceleration +# params (dict): dictionary containing the following parameters: +# mu (float): friction coefficient +# C_Sf (float): cornering stiffness of front wheels +# C_Sr (float): cornering stiffness of rear wheels +# lf (float): distance from center of gravity to front axle +# lr (float): distance from center of gravity to rear axle +# h (float): height of center of gravity +# m (float): mass of vehicle +# I (float): moment of inertia of vehicle, about Z axis +# s_min (float): minimum steering angle +# s_max (float): maximum steering angle +# sv_min (float): minimum steering velocity +# sv_max (float): maximum steering velocity +# v_switch (float): velocity above which the acceleration is no longer able to create wheel spin +# a_max (float): maximum allowed acceleration +# v_min (float): minimum allowed velocity +# v_max (float): maximum allowed velocity - Args: - x (numpy.ndarray (7, )): vehicle state vector (x0, x1, x2, x3, x4, x5, x6) - x0: x position in global coordinates - x1: y position in global coordinates - x2: steering angle of front wheels - x3: velocity in x direction - x4: yaw angle - x5: yaw rate - x6: slip angle at vehicle center - u (numpy.ndarray (2, )): control input vector (u1, u2) - u1: steering angle velocity of front wheels - u2: longitudinal acceleration - params (dict): dictionary containing the following parameters: - mu (float): friction coefficient - C_Sf (float): cornering stiffness of front wheels - C_Sr (float): cornering stiffness of rear wheels - lf (float): distance from center of gravity to front axle - lr (float): distance from center of gravity to rear axle - h (float): height of center of gravity - m (float): mass of vehicle - I (float): moment of inertia of vehicle, about Z axis - s_min (float): minimum steering angle - s_max (float): maximum steering angle - sv_min (float): minimum steering velocity - sv_max (float): maximum steering velocity - v_switch (float): velocity above which the acceleration is no longer able to create wheel spin - a_max (float): maximum allowed acceleration - v_min (float): minimum allowed velocity - v_max (float): maximum allowed velocity +# Returns: +# f (numpy.ndarray): right hand side of differential equations +# """ +# # States +# X = x[0] +# Y = x[1] +# DELTA = x[2] +# V = x[3] +# PSI = x[4] +# PSI_DOT = x[5] +# BETA = x[6] +# # We have to wrap the slip angle to [-pi, pi] +# # BETA = np.arctan2(np.sin(BETA), np.cos(BETA)) - Returns: - f (numpy.ndarray): right hand side of differential equations - """ +# # gravity constant m/s^2 +# g = 9.81 + +# # constraints +# u = np.array( +# [ +# steering_constraint( +# DELTA, +# u_init[0], +# params["s_min"], +# params["s_max"], +# params["sv_min"], +# params["sv_max"], +# ), +# accl_constraints( +# V, +# u_init[1], +# params["v_switch"], +# params["a_max"], +# params["v_min"], +# params["v_max"], +# ), +# ] +# ) +# # Controls +# STEER_VEL = u[0] +# ACCL = u[1] + +# # switch to kinematic model for small velocities +# if V < 0.5: +# # wheelbase +# lwb = params["lf"] + params["lr"] +# BETA_HAT = np.arctan(np.tan(DELTA) * params["lr"] / lwb) +# BETA_DOT = ( +# (1 / (1 + (np.tan(DELTA) * (params["lr"] / lwb)) ** 2)) +# * (params["lr"] / (lwb * np.cos(DELTA) ** 2)) +# * STEER_VEL +# ) +# f = np.array( +# [ +# V * np.cos(PSI + BETA_HAT), # X_DOT +# V * np.sin(PSI + BETA_HAT), # Y_DOT +# STEER_VEL, # DELTA_DOT +# ACCL, # V_DOT +# V * np.cos(BETA_HAT) * np.tan(DELTA) / lwb, # PSI_DOT +# (1 / lwb) +# * ( +# ACCL * np.cos(BETA) * np.tan(DELTA) +# - V * np.sin(BETA) * np.tan(DELTA) * BETA_DOT +# + ((V * np.cos(BETA) * STEER_VEL) / (np.cos(DELTA) ** 2)) +# ), # PSI_DOT_DOT +# BETA_DOT, # BETA_DOT +# ] +# ) +# else: +# # system dynamics +# glr = g * params["lr"] - ACCL * params["h"] +# glf = g * params["lf"] + ACCL * params["h"] +# f = np.array( +# [ +# V * np.cos(PSI + BETA), # X_DOT +# V * np.sin(PSI + BETA), # Y_DOT +# STEER_VEL, # DELTA_DOT +# ACCL, # V_DOT +# PSI_DOT, # PSI_DOT +# ( +# (params["mu"] * params["m"]) +# / (params["I"] * (params["lf"] + params["lr"])) +# ) +# * ( +# params["lf"] * params["C_Sf"] * (glr) * DELTA +# + ( +# params["lr"] * params["C_Sr"] * (glf) +# - params["lf"] * params["C_Sf"] * (glr) +# ) +# * BETA +# - ( +# params["lf"] * params["lf"] * params["C_Sf"] * (glr) +# + params["lr"] * params["lr"] * params["C_Sr"] * (glf) +# ) +# * (PSI_DOT / V) +# ), # PSI_DOT_DOT +# (params["mu"] / (V * (params["lr"] + params["lf"]))) +# * ( +# params["C_Sf"] * (glr) * DELTA +# - (params["C_Sr"] * (glf) + params["C_Sf"] * (glr)) * BETA +# + ( +# params["C_Sr"] * (glf) * params["lr"] +# - params["C_Sf"] * (glr) * params["lf"] +# ) +# * (PSI_DOT / V) +# ) +# - PSI_DOT, # BETA_DOT +# ] +# ) + +# return f + +@njit(cache=True) +def vehicle_dynamics_st( + x: np.ndarray, + u_init: np.ndarray, + mu: float, + C_Sf: float, + C_Sr: float, + lf: float, + lr: float, + h: float, + m: float, + I: float, + s_min: float, + s_max: float, + sv_min: float, + sv_max: float, + v_switch: float, + a_max: float, + v_min: float, + v_max: float, + width: float, + length: float +) -> np.ndarray: # States X = x[0] Y = x[1] @@ -51,118 +182,61 @@ def vehicle_dynamics_st(x: np.ndarray, u_init: np.ndarray, params: dict): PSI = x[4] PSI_DOT = x[5] BETA = x[6] - # We have to wrap the slip angle to [-pi, pi] - # BETA = np.arctan2(np.sin(BETA), np.cos(BETA)) - # gravity constant m/s^2 - g = 9.81 + g = 9.81 # gravity constant - # constraints - u = np.array( - [ - steering_constraint( - DELTA, - u_init[0], - params["s_min"], - params["s_max"], - params["sv_min"], - params["sv_max"], - ), - accl_constraints( - V, - u_init[1], - params["v_switch"], - params["a_max"], - params["v_min"], - params["v_max"], - ), - ] - ) - # Controls + u = [ + steering_constraint(DELTA, u_init[0], s_min, s_max, sv_min, sv_max), + accl_constraints(V, u_init[1], v_switch, a_max, v_min, v_max) + ] STEER_VEL = u[0] ACCL = u[1] - # switch to kinematic model for small velocities if V < 0.5: - # wheelbase - lwb = params["lf"] + params["lr"] - BETA_HAT = np.arctan(np.tan(DELTA) * params["lr"] / lwb) + lwb = lf + lr + BETA_HAT = np.arctan(np.tan(DELTA) * lr / lwb) BETA_DOT = ( - (1 / (1 + (np.tan(DELTA) * (params["lr"] / lwb)) ** 2)) - * (params["lr"] / (lwb * np.cos(DELTA) ** 2)) + (1 / (1 + (np.tan(DELTA) * (lr / lwb)) ** 2)) + * (lr / (lwb * np.cos(DELTA) ** 2)) * STEER_VEL ) - f = np.array( - [ - V * np.cos(PSI + BETA_HAT), # X_DOT - V * np.sin(PSI + BETA_HAT), # Y_DOT - STEER_VEL, # DELTA_DOT - ACCL, # V_DOT - V * np.cos(BETA_HAT) * np.tan(DELTA) / lwb, # PSI_DOT - (1 / lwb) - * ( - ACCL * np.cos(BETA) * np.tan(DELTA) - - V * np.sin(BETA) * np.tan(DELTA) * BETA_DOT - + ((V * np.cos(BETA) * STEER_VEL) / (np.cos(DELTA) ** 2)) - ), # PSI_DOT_DOT - BETA_DOT, # BETA_DOT - ] - ) + f = np.asarray([ + V * np.cos(PSI + BETA_HAT), + V * np.sin(PSI + BETA_HAT), + STEER_VEL, + ACCL, + V * np.cos(BETA_HAT) * np.tan(DELTA) / lwb, + (1 / lwb) * ( + ACCL * np.cos(BETA) * np.tan(DELTA) + - V * np.sin(BETA) * np.tan(DELTA) * BETA_DOT + + (V * np.cos(BETA) * STEER_VEL) / (np.cos(DELTA) ** 2) + ), + BETA_DOT + ]) else: - # system dynamics - glr = g * params["lr"] - ACCL * params["h"] - glf = g * params["lf"] + ACCL * params["h"] - f = np.array( - [ - V * np.cos(PSI + BETA), # X_DOT - V * np.sin(PSI + BETA), # Y_DOT - STEER_VEL, # DELTA_DOT - ACCL, # V_DOT - PSI_DOT, # PSI_DOT - ( - (params["mu"] * params["m"]) - / (params["I"] * (params["lf"] + params["lr"])) - ) - * ( - params["lf"] * params["C_Sf"] * (glr) * DELTA - + ( - params["lr"] * params["C_Sr"] * (glf) - - params["lf"] * params["C_Sf"] * (glr) - ) - * BETA - - ( - params["lf"] * params["lf"] * params["C_Sf"] * (glr) - + params["lr"] * params["lr"] * params["C_Sr"] * (glf) - ) - * (PSI_DOT / V) - ), # PSI_DOT_DOT - (params["mu"] / (V * (params["lr"] + params["lf"]))) - * ( - params["C_Sf"] * (glr) * DELTA - - (params["C_Sr"] * (glf) + params["C_Sf"] * (glr)) * BETA - + ( - params["C_Sr"] * (glf) * params["lr"] - - params["C_Sf"] * (glr) * params["lf"] - ) - * (PSI_DOT / V) - ) - - PSI_DOT, # BETA_DOT - ] - ) - + glr = g * lr - ACCL * h + glf = g * lf + ACCL * h + f = np.asarray([ + V * np.cos(PSI + BETA), + V * np.sin(PSI + BETA), + STEER_VEL, + ACCL, + PSI_DOT, + (mu * m / (I * (lf + lr))) * ( + lf * C_Sf * glr * DELTA + + (lr * C_Sr * glf - lf * C_Sf * glr) * BETA + - (lf**2 * C_Sf * glr + lr**2 * C_Sr * glf) * (PSI_DOT / V) + ), + (mu / (V * (lr + lf))) * ( + C_Sf * glr * DELTA + - (C_Sr * glf + C_Sf * glr) * BETA + + (C_Sr * glf * lr - C_Sf * glr * lf) * (PSI_DOT / V) + ) - PSI_DOT + ]) return f @njit(cache=True) -def get_standardized_state_st(x: np.ndarray) -> dict: - """[X,Y,DELTA,V_X, V_Y,YAW,YAW_RATE,SLIP]""" - d = dict() - d["x"] = x[0] - d["y"] = x[1] - d["delta"] = x[2] - d["v_x"] = x[3] * np.cos(x[6]) - d["v_y"] = x[3] * np.sin(x[6]) - d["yaw"] = x[4] - d["yaw_rate"] = x[5] - d["slip"] = x[6] - return d +def get_standardized_state_st(x: np.ndarray) -> np.ndarray: + """[X,Y,Steering_Angle,Speed,YAW,YAW_RATE,V_Y]""" + return x diff --git a/f1tenth_gym/envs/f110_env.py b/f1tenth_gym/envs/f110_env.py index 35cbb960..07aef22b 100644 --- a/f1tenth_gym/envs/f110_env.py +++ b/f1tenth_gym/envs/f110_env.py @@ -21,7 +21,7 @@ # SOFTWARE. """ -Author: Hongrui Zheng +Author: Hongrui Zheng, Zirui Zang """ # gym imports @@ -128,7 +128,7 @@ def __init__(self, config: dict = None, render_mode=None, **kwargs): self.start_ys = np.zeros((self.num_agents,)) self.start_thetas = np.zeros((self.num_agents,)) self.start_rot = np.eye(2) - + # initiate stuff self.sim = Simulator( self.params, @@ -177,13 +177,14 @@ def __init__(self, config: dict = None, render_mode=None, **kwargs): self.metadata["render_fps"] = int(1.0 / self.timestep) if self.render_mode == "human_fast": self.metadata["render_fps"] *= 10 # boost fps by 10x - self.renderer, self.render_spec = make_renderer( - params=self.params, - track=self.track, - agent_ids=self.agent_ids, - render_mode=render_mode, - render_fps=self.metadata["render_fps"], - ) + if self.config["enable_rendering"]: + self.renderer, self.render_spec = make_renderer( + params=self.params, + track=self.track, + agent_ids=self.agent_ids, + render_mode=render_mode, + render_fps=self.metadata["render_fps"], + ) @classmethod def fullscale_vehicle_params(cls) -> dict: @@ -206,7 +207,7 @@ def fullscale_vehicle_params(cls) -> dict: # maximum curvature change "kappa_dot_max": 0.4, # maximum curvature rate rate - "kappa_dot_dot_max": 20, + "kappa_dot_dot_max": 20.0, # Longitudinal constraints "v_switch": 4.755, "a_max": 11.5, @@ -276,21 +277,21 @@ def fullscale_vehicle_params(cls) -> dict: "R_w": 0.344, # split of brake and engine torque "T_sb": 0.76, - "T_se": 1, + "T_se": 1.0, # suspension parameters # [rad/m] DF "D_f": -0.6233595800524934, # [rad/m] DR "D_r": -0.20997375328083986, # [needs conversion if nonzero] EF - "E_f": 0, + "E_f": 0.0, # [needs conversion if nonzero] ER - "E_r": 0, + "E_r": 0.0, # tire parameters from ADAMS handbook # longitudinal coefficients "tire_p_cx1": 1.6411, # Shape factor Cfx for longitudinal force "tire_p_dx1": 1.1739, # Longitudinal friction Mux at Fznom - "tire_p_dx3": 0, # Variation of friction Mux with camber + "tire_p_dx3": 0.0, # Variation of friction Mux with camber "tire_p_ex1": 0.46403, # Longitudinal curvature Efx at Fznom "tire_p_kx1": 22.303, # Longitudinal slip stiffness Kfx/Fz at Fznom "tire_p_hx1": 0.0012297, # Horizontal shift Shx at Fznom @@ -399,7 +400,9 @@ def default_config(cls) -> dict: "control_input": ["speed", "steering_angle"], "observation_config": {"type": None}, "reset_config": {"type": None}, - "scale": 1.0, + "enable_rendering": True, + "enable_scan": True, + "control_delay_buffer_size": 0, } def configure(self, config: dict) -> None: @@ -500,17 +503,18 @@ def step(self, action): self._update_state() # rendering observation - self.render_obs = { - "ego_idx": self.sim.ego_idx, - "poses_x": self.sim.agent_poses[:, 0], - "poses_y": self.sim.agent_poses[:, 1], - "poses_theta": self.sim.agent_poses[:, 2], - "steering_angles": self.sim.agent_steerings, - "lap_times": self.lap_times, - "lap_counts": self.lap_counts, - "collisions": self.sim.collisions, - "sim_time": self.current_time, - } + if self.config["enable_rendering"]: + self.render_obs = { + "ego_idx": self.sim.ego_idx, + "poses_x": self.sim.agent_poses[:, 0], + "poses_y": self.sim.agent_poses[:, 1], + "poses_theta": self.sim.agent_poses[:, 2], + "steering_angles": self.sim.agent_steerings, + "lap_times": self.lap_times, + "lap_counts": self.lap_counts, + "collisions": self.sim.collisions, + "sim_time": self.current_time, + } # check done done, toggle_list = self._check_done() @@ -614,8 +618,8 @@ def add_render_callback(self, callback_func): Args: callback_func (function (EnvRenderer) -> None): custom function to called during render() """ - - self.renderer.add_renderer_callback(callback_func) + if self.config["enable_rendering"]: + self.renderer.add_renderer_callback(callback_func) def render(self, mode="human"): """ @@ -631,7 +635,7 @@ def render(self, mode="human"): """ # NOTE: separate render (manage render-mode) from render_frame (actual rendering with pyglet) - if self.render_mode not in self.metadata["render_modes"]: + if self.render_mode not in self.metadata["render_modes"] or not self.config["enable_rendering"]: return self.renderer.update(state=self.render_obs) diff --git a/f1tenth_gym/envs/integrator.py b/f1tenth_gym/envs/integrator.py index 0987fbfe..bdb5ed6d 100644 --- a/f1tenth_gym/envs/integrator.py +++ b/f1tenth_gym/envs/integrator.py @@ -1,7 +1,6 @@ from abc import abstractmethod from enum import Enum - class IntegratorType(Enum): RK4 = 1 Euler = 2 @@ -21,7 +20,7 @@ def __init__(self) -> None: self._integrator_type = None @abstractmethod - def integrate(self, f, x, u, dt, params): + def integrate(self, f, x, u, dt, *args): raise NotImplementedError("integrate method not implemented") @property @@ -34,17 +33,17 @@ def __init__(self) -> None: super().__init__() self._integrator_type = "rk4" - def integrate(self, f, x, u, dt, params): - k1 = f(x, u, params) + def integrate(self, f, x, u, dt, *args): + k1 = f(x, u, *args) k2_state = x + dt * (k1 / 2) - k2 = f(k2_state, u, params) + k2 = f(k2_state, u, *args) k3_state = x + dt * (k2 / 2) - k3 = f(k3_state, u, params) + k3 = f(k3_state, u, *args) k4_state = x + dt * k3 - k4 = f(k4_state, u, params) + k4 = f(k4_state, u, *args) # dynamics integration x = x + dt * (1 / 6) * (k1 + 2 * k2 + 2 * k3 + k4) @@ -56,7 +55,6 @@ def __init__(self) -> None: super().__init__() self._integrator_type = "euler" - def integrate(self, f, x, u, dt, params): - dstate = f(x, u, params) - x = x + dt * dstate + def integrate(self, f, x, u, dt, *args): + x = x + dt * f(x, u, *args) return x diff --git a/f1tenth_gym/envs/laser_models.py b/f1tenth_gym/envs/laser_models.py index 0e80e6f9..d3d81bac 100644 --- a/f1tenth_gym/envs/laser_models.py +++ b/f1tenth_gym/envs/laser_models.py @@ -244,7 +244,7 @@ def get_scan( # make sure it stays in the range [0, theta_dis) while theta_index >= theta_dis: theta_index -= theta_dis - + return scan @@ -512,6 +512,7 @@ def scan(self, pose, rng, std_dev=0.01): if self.map_height is None: raise ValueError("Map is not set for scan simulator.") + scan = get_scan( pose, self.theta_dis, @@ -533,10 +534,9 @@ def scan(self, pose, rng, std_dev=0.01): ) if rng is not None: - noise = rng.normal(0.0, std_dev, size=self.num_beams) - scan += noise - - return scan + scan = scan + rng.normal(0.0, std_dev, size=self.num_beams) + + return np.clip(scan, 0.0, self.max_range) def get_increment(self): return self.angle_increment diff --git a/f1tenth_gym/envs/observation.py b/f1tenth_gym/envs/observation.py index 03f60410..bda7635a 100644 --- a/f1tenth_gym/envs/observation.py +++ b/f1tenth_gym/envs/observation.py @@ -125,12 +125,10 @@ def observe(self): collision = self.env.unwrapped.sim.collisions[i] std_state = agent.standard_state - - x, y, theta = std_state["x"], std_state["y"], std_state["yaw"] - - vx = std_state["v_x"] - vy = std_state["v_y"] - angvel = std_state["yaw_rate"] + x, y, theta = std_state[0], std_state[1], std_state[4] + vx = std_state[3] * np.cos(std_state[6]) + vy = std_state[3] * np.sin(std_state[6]) + angvel = std_state[5] observations["scans"].append(agent_scan) observations["poses_x"].append(x) @@ -162,36 +160,15 @@ def space(self): scan_size = self.env.unwrapped.sim.agents[0].scan_simulator.num_beams scan_range = self.env.unwrapped.sim.agents[0].scan_simulator.max_range large_num = 1e30 # large number to avoid unbounded obs space (ie., low=-inf or high=inf) - + complete_space = {} for agent_id in self.env.unwrapped.agent_ids: agent_dict = { "scan": gym.spaces.Box( low=0.0, high=scan_range, shape=(scan_size,), dtype=np.float32 ), - "pose_x": gym.spaces.Box( - low=-large_num, high=large_num, shape=(), dtype=np.float32 - ), - "pose_y": gym.spaces.Box( - low=-large_num, high=large_num, shape=(), dtype=np.float32 - ), - "pose_theta": gym.spaces.Box( - low=-large_num, high=large_num, shape=(), dtype=np.float32 - ), - "linear_vel_x": gym.spaces.Box( - low=-large_num, high=large_num, shape=(), dtype=np.float32 - ), - "linear_vel_y": gym.spaces.Box( - low=-large_num, high=large_num, shape=(), dtype=np.float32 - ), - "ang_vel_z": gym.spaces.Box( - low=-large_num, high=large_num, shape=(), dtype=np.float32 - ), - "delta": gym.spaces.Box( - low=-large_num, high=large_num, shape=(), dtype=np.float32 - ), - "beta": gym.spaces.Box( - low=-large_num, high=large_num, shape=(), dtype=np.float32 + "std_state": gym.spaces.Box( + low=-large_num, high=large_num, shape=(7,), dtype=np.float32 ), "collision": gym.spaces.Box( low=0.0, high=1.0, shape=(), dtype=np.float32 @@ -204,7 +181,7 @@ def space(self): ), } complete_space[agent_id] = gym.spaces.Dict( - {k: agent_dict[k] for k in self.features} + agent_dict ) obs_space = gym.spaces.Dict(complete_space) @@ -219,41 +196,21 @@ def observe(self): lap_time = self.env.unwrapped.lap_times[i] lap_count = self.env.unwrapped.lap_counts[i] - std_state = agent.standard_state - - x, y, theta = std_state["x"], std_state["y"], std_state["yaw"] - delta = std_state["delta"] - beta = std_state["slip"] - vx = std_state["v_x"] - vy = std_state["v_y"] - angvel = std_state["yaw_rate"] - # create agent's observation dict agent_obs = { "scan": scan, - "pose_x": x, - "pose_y": y, - "pose_theta": theta, - "linear_vel_x": vx, - "linear_vel_y": vy, - "ang_vel_z": angvel, - "delta": delta, - "beta": beta, - "collision": int(agent.in_collision), + "std_state": agent.standard_state, + "collision": agent.in_collision, "lap_time": lap_time, "lap_count": lap_count, } # add agent's observation to multi-agent observation - obs[agent_id] = {k: agent_obs[k] for k in self.features} + obs[agent_id] = agent_obs # cast to match observation space for key in obs[agent_id].keys(): - if isinstance(obs[agent_id][key], np.ndarray) or isinstance( - obs[agent_id][key], list) or isinstance( - obs[agent_id][key], float - ): - obs[agent_id][key] = np.array(obs[agent_id][key], dtype=np.float32) + obs[agent_id][key] = np.array(obs[agent_id][key], dtype=np.float32) return obs From c13d400a967ae4b7488e9afad78649df69a36450 Mon Sep 17 00:00:00 2001 From: zzangupenn Date: Sat, 7 Jun 2025 19:42:12 -0400 Subject: [PATCH 04/54] change FeatureObs to DirectObs --- README.md | 6 +- examples/waypoint_follow.py | 16 ++-- f1tenth_gym/envs/observation.py | 164 ++++++++++++++------------------ 3 files changed, 83 insertions(+), 103 deletions(-) diff --git a/README.md b/README.md index 120a9258..12d2b742 100644 --- a/README.md +++ b/README.md @@ -9,9 +9,11 @@ Zirui branch TODO list: - [ ] separate time step and integrater time step - [ ] add frenet - [ ] use correct loop count -- [x] simplify std_state observation +- [x] simplify std_state and observation - [ ] simplify reset -- [ ] control_buffer_size +- [ ] control_buffer_size in config +- [ ] use class attribute for config, not dict +- [ ] save dynamic param and default gym config in separate yaml file ## Quickstart We recommend installing the simulation inside a virtualenv. You can install the environment by running: diff --git a/examples/waypoint_follow.py b/examples/waypoint_follow.py index b69b3ceb..4977f02c 100644 --- a/examples/waypoint_follow.py +++ b/examples/waypoint_follow.py @@ -314,10 +314,10 @@ def main(): "timestep": 0.01, "integrator": "rk4", "control_input": ["speed", "steering_angle"], - "model": "mb", # "ks", "st", "mb" - "observation_config": {"type": "dynamic_state"}, - # "params": F110Env.f1tenth_vehicle_params(), - "params": F110Env.fullscale_vehicle_params(), + "model": "st", # "ks", "st", "mb" + "observation_config": {"type": "direct"}, + "params": F110Env.f1tenth_vehicle_params(), + # "params": F110Env.fullscale_vehicle_params(), "reset_config": {"type": "rl_random_static"}, "scale": 10.0, "enable_rendering": 0, @@ -329,10 +329,10 @@ def main(): planner = PurePursuitPlanner( track=track, wb=( - # F110Env.f1tenth_vehicle_params()["lf"] - # + F110Env.f1tenth_vehicle_params()["lr"] - F110Env.fullscale_vehicle_params()["lf"] - + F110Env.fullscale_vehicle_params()["lr"] + F110Env.f1tenth_vehicle_params()["lf"] + + F110Env.f1tenth_vehicle_params()["lr"] + # F110Env.fullscale_vehicle_params()["lf"] + # + F110Env.fullscale_vehicle_params()["lr"] ), ) diff --git a/f1tenth_gym/envs/observation.py b/f1tenth_gym/envs/observation.py index bda7635a..b0f3fde8 100644 --- a/f1tenth_gym/envs/observation.py +++ b/f1tenth_gym/envs/observation.py @@ -26,6 +26,74 @@ def space(self): def observe(self): raise NotImplementedError() +class DirectObservation(Observation): + def __init__(self, env): + super().__init__(env) + self.env = env + + def space(self): + scan_size = self.env.unwrapped.sim.agents[0].scan_simulator.num_beams + scan_range = self.env.unwrapped.sim.agents[0].scan_simulator.max_range + large_num = 1e30 # large number to avoid unbounded obs space (ie., low=-inf or high=inf) + + complete_space = {} + for agent_id in self.env.unwrapped.agent_ids: + agent_dict = { + "scan": gym.spaces.Box( + low=0.0, high=scan_range, shape=(scan_size,), dtype=np.float32 + ), + "std_state": gym.spaces.Box( + low=-large_num, high=large_num, shape=(7,), dtype=np.float32 + ), + # "dyna_state": gym.spaces.Box( + # low=-large_num, high=large_num, shape=(int(self.env.model.state_dim),), dtype=np.float32 + # ), + # "frenet_state": gym.spaces.Box( + # low=-large_num, high=large_num, shape=(7,), dtype=np.float32 + # ), + "collision": gym.spaces.Box( + low=0.0, high=1.0, shape=(), dtype=np.float32 + ), + "lap_time": gym.spaces.Box( + low=0.0, high=large_num, shape=(), dtype=np.float32 + ), + "lap_count": gym.spaces.Box( + low=0.0, high=large_num, shape=(), dtype=np.float32 + ), + } + complete_space[agent_id] = gym.spaces.Dict( + agent_dict + ) + + obs_space = gym.spaces.Dict(complete_space) + return obs_space + + def observe(self): + obs = {} # dictionary agent_id -> observation dict + + for i, agent_id in enumerate(self.env.unwrapped.agent_ids): + scan = self.env.unwrapped.sim.agent_scans[i] + agent = self.env.unwrapped.sim.agents[i] + lap_time = self.env.unwrapped.lap_times[i] + lap_count = self.env.unwrapped.lap_counts[i] + + # create agent's observation dict + agent_obs = { + "scan": scan, + "std_state": agent.standard_state, + "collision": agent.in_collision, + "lap_time": lap_time, + "lap_count": lap_count, + } + + # add agent's observation to multi-agent observation + obs[agent_id] = agent_obs + + # cast to match observation space + for key in obs[agent_id].keys(): + obs[agent_id][key] = np.array(obs[agent_id][key], dtype=np.float32) + + return obs class OriginalObservation(Observation): def __init__(self, env): @@ -151,102 +219,12 @@ def observe(self): return observations -class FeaturesObservation(Observation): - def __init__(self, env, features: List[str]): - super().__init__(env) - self.features = features - - def space(self): - scan_size = self.env.unwrapped.sim.agents[0].scan_simulator.num_beams - scan_range = self.env.unwrapped.sim.agents[0].scan_simulator.max_range - large_num = 1e30 # large number to avoid unbounded obs space (ie., low=-inf or high=inf) - - complete_space = {} - for agent_id in self.env.unwrapped.agent_ids: - agent_dict = { - "scan": gym.spaces.Box( - low=0.0, high=scan_range, shape=(scan_size,), dtype=np.float32 - ), - "std_state": gym.spaces.Box( - low=-large_num, high=large_num, shape=(7,), dtype=np.float32 - ), - "collision": gym.spaces.Box( - low=0.0, high=1.0, shape=(), dtype=np.float32 - ), - "lap_time": gym.spaces.Box( - low=0.0, high=large_num, shape=(), dtype=np.float32 - ), - "lap_count": gym.spaces.Box( - low=0.0, high=large_num, shape=(), dtype=np.float32 - ), - } - complete_space[agent_id] = gym.spaces.Dict( - agent_dict - ) - - obs_space = gym.spaces.Dict(complete_space) - return obs_space - - def observe(self): - obs = {} # dictionary agent_id -> observation dict - - for i, agent_id in enumerate(self.env.unwrapped.agent_ids): - scan = self.env.unwrapped.sim.agent_scans[i] - agent = self.env.unwrapped.sim.agents[i] - lap_time = self.env.unwrapped.lap_times[i] - lap_count = self.env.unwrapped.lap_counts[i] - - # create agent's observation dict - agent_obs = { - "scan": scan, - "std_state": agent.standard_state, - "collision": agent.in_collision, - "lap_time": lap_time, - "lap_count": lap_count, - } - - # add agent's observation to multi-agent observation - obs[agent_id] = agent_obs - - # cast to match observation space - for key in obs[agent_id].keys(): - obs[agent_id][key] = np.array(obs[agent_id][key], dtype=np.float32) - - return obs - - -def observation_factory(env, type: str | None, **kwargs) -> Observation: +def observation_factory(env, type: str | None) -> Observation: type = type or "original" if type == "original": return OriginalObservation(env) - elif type == "features": - return FeaturesObservation(env, **kwargs) - elif type == "kinematic_state": - features = ["pose_x", "pose_y", "delta", "linear_vel_x", "pose_theta"] - return FeaturesObservation(env, features=features) - elif type == "dynamic_state": - features = [ - "pose_x", - "pose_y", - "delta", - "linear_vel_x", - "pose_theta", - "ang_vel_z", - "beta", - ] - return FeaturesObservation(env, features=features) - elif type == "frenet_dynamic_state": - features = [ - "pose_x", - "pose_y", - "delta", - "linear_vel_x", - "linear_vel_y", - "pose_theta", - "ang_vel_z", - "beta", - ] - return FeaturesObservation(env, features=features) + elif type == "direct": + return DirectObservation(env) else: raise ValueError(f"Invalid observation type {type}.") From 8a7cc361d643d0b073bdd56cba368a607e4ed6ff Mon Sep 17 00:00:00 2001 From: zzangupenn Date: Sat, 7 Jun 2025 22:12:57 -0400 Subject: [PATCH 05/54] scan toggle --- README.md | 2 +- ...1_1base__classes_1_1_race_car-members.html | 2 +- ...1_1envs_1_1base__classes_1_1_race_car.html | 8 ++-- docs/html/functions.html | 2 +- docs/html/functions_func.html | 2 +- docs/html/search/all_c.js | 2 +- docs/html/search/functions_8.js | 2 +- docs/xml/base__classes_8py.xml | 6 +-- ..._1_1envs_1_1base__classes_1_1_race_car.xml | 8 ++-- docs/xml/index.xml | 2 +- examples/waypoint_follow.py | 3 +- f1tenth_gym/envs/base_classes.py | 45 +++++++++++-------- f1tenth_gym/envs/f110_env.py | 14 +++--- f1tenth_gym/envs/utils.py | 5 ++- 14 files changed, 57 insertions(+), 46 deletions(-) diff --git a/README.md b/README.md index 12d2b742..d59476b6 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ Zirui branch TODO list: - [x] remove unnecessary use of dictionary. model st is 50% faster, mb is 150% faster. - [x] toggle renderer - [ ] verify collision -- [ ] scan toggle +- [x] scan toggle - [ ] separate time step and integrater time step - [ ] add frenet - [ ] use correct loop count diff --git a/docs/html/classf110__gym_1_1envs_1_1base__classes_1_1_race_car-members.html b/docs/html/classf110__gym_1_1envs_1_1base__classes_1_1_race_car-members.html index 71b2699e..a484de97 100644 --- a/docs/html/classf110__gym_1_1envs_1_1base__classes_1_1_race_car-members.html +++ b/docs/html/classf110__gym_1_1envs_1_1base__classes_1_1_race_car-members.html @@ -97,7 +97,7 @@ ttc_thresh (defined in f110_gym.envs.base_classes.RaceCar)f110_gym.envs.base_classes.RaceCar update_opp_poses(self, opp_poses)f110_gym.envs.base_classes.RaceCar update_params(self, params)f110_gym.envs.base_classes.RaceCar - update_pose(self, raw_steer, vel)f110_gym.envs.base_classes.RaceCar + update_dynamic(self, raw_steer, vel)f110_gym.envs.base_classes.RaceCar update_scan(self)f110_gym.envs.base_classes.RaceCar diff --git a/docs/html/classf110__gym_1_1envs_1_1base__classes_1_1_race_car.html b/docs/html/classf110__gym_1_1envs_1_1base__classes_1_1_race_car.html index 0f1b2a5c..587d07cd 100644 --- a/docs/html/classf110__gym_1_1envs_1_1base__classes_1_1_race_car.html +++ b/docs/html/classf110__gym_1_1envs_1_1base__classes_1_1_race_car.html @@ -106,7 +106,7 @@   def check_ttc (self)   -def update_pose (self, raw_steer, vel) +def update_dynamic (self, raw_steer, vel)   def update_opp_poses (self, opp_poses)   @@ -457,13 +457,13 @@

-

◆ update_pose()

+

◆ update_dynamic()

- + @@ -514,7 +514,7 @@

Steps the vehicle's laser scan simulation
-Separated from update_pose because needs to update scan based on NEW poses of agents in the environment
+Separated from update_dynamic because needs to update scan based on NEW poses of agents in the environment
 
 Args:
     None
diff --git a/docs/html/functions.html b/docs/html/functions.html
index d1933dfa..79be3cb0 100644
--- a/docs/html/functions.html
+++ b/docs/html/functions.html
@@ -175,7 +175,7 @@ 

- u -

    , f110_gym.envs.base_classes.Simulator , f110_gym.envs.f110_env.F110Env -
  • update_pose() +
  • update_dynamic() : f110_gym.envs.base_classes.RaceCar
  • update_scan() diff --git a/docs/html/functions_func.html b/docs/html/functions_func.html index eb5d2d9a..bb07acd2 100644 --- a/docs/html/functions_func.html +++ b/docs/html/functions_func.html @@ -175,7 +175,7 @@

    - u -

      , f110_gym.envs.base_classes.Simulator , f110_gym.envs.f110_env.F110Env -
    • update_pose() +
    • update_dynamic() : f110_gym.envs.base_classes.RaceCar
    • update_scan() diff --git a/docs/html/search/all_c.js b/docs/html/search/all_c.js index 93a2641c..6ac1d253 100644 --- a/docs/html/search/all_c.js +++ b/docs/html/search/all_c.js @@ -4,6 +4,6 @@ var searchData= ['update_5fobs_30',['update_obs',['../classf110__gym_1_1envs_1_1rendering_1_1_env_renderer.html#a1b9284f2e59c9000f10bd18e1ec6a9b3',1,'f110_gym::envs::rendering::EnvRenderer']]], ['update_5fopp_5fposes_31',['update_opp_poses',['../classf110__gym_1_1envs_1_1base__classes_1_1_race_car.html#a4800c5ac90ba93b79a0338e5e34ead43',1,'f110_gym::envs::base_classes::RaceCar']]], ['update_5fparams_32',['update_params',['../classf110__gym_1_1envs_1_1base__classes_1_1_race_car.html#a6ab5b5dd420b182b5156ee9566c03411',1,'f110_gym.envs.base_classes.RaceCar.update_params()'],['../classf110__gym_1_1envs_1_1base__classes_1_1_simulator.html#a974c58957a6b14582149d704ef28a68c',1,'f110_gym.envs.base_classes.Simulator.update_params()'],['../classf110__gym_1_1envs_1_1f110__env_1_1_f110_env.html#a79d419bbf2ff0e377d808e4a8f41cc81',1,'f110_gym.envs.f110_env.F110Env.update_params()']]], - ['update_5fpose_33',['update_pose',['../classf110__gym_1_1envs_1_1base__classes_1_1_race_car.html#ae12c14c1353e6aab2f72036593d85518',1,'f110_gym::envs::base_classes::RaceCar']]], + ['update_5fpose_33',['update_dynamic',['../classf110__gym_1_1envs_1_1base__classes_1_1_race_car.html#ae12c14c1353e6aab2f72036593d85518',1,'f110_gym::envs::base_classes::RaceCar']]], ['update_5fscan_34',['update_scan',['../classf110__gym_1_1envs_1_1base__classes_1_1_race_car.html#a356ec05a0a0c056f4d43f5fb0451c83d',1,'f110_gym::envs::base_classes::RaceCar']]] ]; diff --git a/docs/html/search/functions_8.js b/docs/html/search/functions_8.js index 43c88610..7b08aeb4 100644 --- a/docs/html/search/functions_8.js +++ b/docs/html/search/functions_8.js @@ -4,6 +4,6 @@ var searchData= ['update_5fobs_66',['update_obs',['../classf110__gym_1_1envs_1_1rendering_1_1_env_renderer.html#a1b9284f2e59c9000f10bd18e1ec6a9b3',1,'f110_gym::envs::rendering::EnvRenderer']]], ['update_5fopp_5fposes_67',['update_opp_poses',['../classf110__gym_1_1envs_1_1base__classes_1_1_race_car.html#a4800c5ac90ba93b79a0338e5e34ead43',1,'f110_gym::envs::base_classes::RaceCar']]], ['update_5fparams_68',['update_params',['../classf110__gym_1_1envs_1_1base__classes_1_1_race_car.html#a6ab5b5dd420b182b5156ee9566c03411',1,'f110_gym.envs.base_classes.RaceCar.update_params()'],['../classf110__gym_1_1envs_1_1base__classes_1_1_simulator.html#a974c58957a6b14582149d704ef28a68c',1,'f110_gym.envs.base_classes.Simulator.update_params()'],['../classf110__gym_1_1envs_1_1f110__env_1_1_f110_env.html#a79d419bbf2ff0e377d808e4a8f41cc81',1,'f110_gym.envs.f110_env.F110Env.update_params()']]], - ['update_5fpose_69',['update_pose',['../classf110__gym_1_1envs_1_1base__classes_1_1_race_car.html#ae12c14c1353e6aab2f72036593d85518',1,'f110_gym::envs::base_classes::RaceCar']]], + ['update_5fpose_69',['update_dynamic',['../classf110__gym_1_1envs_1_1base__classes_1_1_race_car.html#ae12c14c1353e6aab2f72036593d85518',1,'f110_gym::envs::base_classes::RaceCar']]], ['update_5fscan_70',['update_scan',['../classf110__gym_1_1envs_1_1base__classes_1_1_race_car.html#a356ec05a0a0c056f4d43f5fb0451c83d',1,'f110_gym::envs::base_classes::RaceCar']]] ]; diff --git a/docs/xml/base__classes_8py.xml b/docs/xml/base__classes_8py.xml index 87973cdf..55086aea 100644 --- a/docs/xml/base__classes_8py.xml +++ b/docs/xml/base__classes_8py.xml @@ -242,7 +242,7 @@ returnin_collision -defupdate_pose(self,raw_steer,vel): +defupdate_dynamic(self,raw_steer,vel): """ Stepsthevehicle'sphysicalsimulation @@ -313,7 +313,7 @@ defupdate_scan(self): """ Stepsthevehicle'slaserscansimulation -Separatedfromupdate_posebecauseneedstoupdatescanbasedonNEWposesofagentsintheenvironment +Separatedfromupdate_dynamicbecauseneedstoupdatescanbasedonNEWposesofagentsintheenvironment Args: None @@ -443,7 +443,7 @@ #loopingoveragents fori,agentinenumerate(self.agents): #updateeachagent'spose -agent.update_pose(control_inputs[i,0],control_inputs[i,1]) +agent.update_dynamic(control_inputs[i,0],control_inputs[i,1]) #updatesim'sinformationofagentposes self.agent_poses[i,:]=np.append(agent.state[0:2],agent.state[4]) diff --git a/docs/xml/classf110__gym_1_1envs_1_1base__classes_1_1_race_car.xml b/docs/xml/classf110__gym_1_1envs_1_1base__classes_1_1_race_car.xml index 905e3309..9672522a 100644 --- a/docs/xml/classf110__gym_1_1envs_1_1base__classes_1_1_race_car.xml +++ b/docs/xml/classf110__gym_1_1envs_1_1base__classes_1_1_race_car.xml @@ -442,9 +442,9 @@ Returns: def - def f110_gym.envs.base_classes.RaceCar.update_pose + def f110_gym.envs.base_classes.RaceCar.update_dynamic (self, raw_steer, vel) - update_pose + update_dynamic self self @@ -516,7 +516,7 @@ Returns: Steps the vehicle's laser scan simulation -Separated from update_pose because needs to update scan based on NEW poses of agents in the environment +Separated from update_dynamic because needs to update scan based on NEW poses of agents in the environment Args: None @@ -596,7 +596,7 @@ Data Members: f110_gym::envs::base_classes::RaceCarttc_thresh f110_gym::envs::base_classes::RaceCarupdate_opp_poses f110_gym::envs::base_classes::RaceCarupdate_params - f110_gym::envs::base_classes::RaceCarupdate_pose + f110_gym::envs::base_classes::RaceCarupdate_dynamic f110_gym::envs::base_classes::RaceCarupdate_scan diff --git a/docs/xml/index.xml b/docs/xml/index.xml index ac873c31..21676967 100644 --- a/docs/xml/index.xml +++ b/docs/xml/index.xml @@ -254,7 +254,7 @@ reset ray_cast_agents check_ttc - update_pose + update_dynamic update_opp_poses update_scan diff --git a/examples/waypoint_follow.py b/examples/waypoint_follow.py index 4977f02c..7698c275 100644 --- a/examples/waypoint_follow.py +++ b/examples/waypoint_follow.py @@ -319,8 +319,9 @@ def main(): "params": F110Env.f1tenth_vehicle_params(), # "params": F110Env.fullscale_vehicle_params(), "reset_config": {"type": "rl_random_static"}, - "scale": 10.0, + "map_scale": 10.0, "enable_rendering": 0, + "enable_scan": 0, }, render_mode="human", ) diff --git a/f1tenth_gym/envs/base_classes.py b/f1tenth_gym/envs/base_classes.py index 8ca4e4c8..4c7f1203 100644 --- a/f1tenth_gym/envs/base_classes.py +++ b/f1tenth_gym/envs/base_classes.py @@ -62,6 +62,7 @@ class RaceCar(object): def __init__( self, + config, params, seed, action_type: CarAction, @@ -73,7 +74,6 @@ def __init__( fov=4.7, ): """ - TODO rewrite it Init function @@ -98,7 +98,8 @@ def __init__( self.is_ego = is_ego self.time_step = time_step self.num_beams = num_beams - self.fov = fov + self.config = config + self.fov = fov # TODO self.integrator = integrator self.action_type = action_type self.model = model @@ -281,7 +282,7 @@ def check_ttc(self, current_scan): return in_collision - def update_pose(self, raw_steer, vel): + def update_dynamic(self, raw_steer, vel): """ Steps the vehicle's physical simulation @@ -319,7 +320,7 @@ def update_pose(self, raw_steer, vel): ) else: self.state = self.integrator.integrate( - f_dynamics, self.state, u_np, self.time_step, *[self.params['mu'], + f_dynamics, self.state, u_np, self.time_step, self.params['mu'], self.params['C_Sf'], self.params['C_Sr'], self.params['lf'], @@ -336,16 +337,19 @@ def update_pose(self, raw_steer, vel): self.params['v_min'], self.params['v_max'], self.params['width'], - self.params['length']] + self.params['length'] ) # bound yaw angle self.state[4] %= 2 * np.pi # TODO: This is a problem waiting to happen - # update scan - current_scan = RaceCar.scan_simulator.scan( - np.append(self.state[0:2], self.state[4]), self.scan_rng - ) + if self.config['enable_scan']: + # update scan + current_scan = RaceCar.scan_simulator.scan( + np.append(self.state[0:2], self.state[4]), self.scan_rng + ) + else: + current_scan = np.zeros((self.num_beams,)) return current_scan @@ -364,7 +368,7 @@ def update_opp_poses(self, opp_poses): def update_scan(self, agent_scans, agent_index): """ Steps the vehicle's laser scan simulation - Separated from update_pose because needs to update scan based on NEW poses of agents in the environment + Separated from update_dynamic because needs to update scan based on NEW poses of agents in the environment Args: agent scans list (modified in-place), @@ -418,6 +422,7 @@ class Simulator(object): def __init__( self, + config, params, num_agents, seed, @@ -447,6 +452,7 @@ def __init__( self.time_step = time_step self.ego_idx = ego_idx self.params = params + self.config = config self.agent_poses = np.empty((self.num_agents, 3)) self.agent_steerings = np.empty((self.num_agents,)) self.agents: list[RaceCar] = [] @@ -457,6 +463,7 @@ def __init__( # initializing agents for i in range(self.num_agents): car = RaceCar( + config, params, self.seed, is_ego=bool(i == ego_idx), @@ -542,15 +549,16 @@ def step(self, control_inputs): # looping over agents for i, agent in enumerate(self.agents): # update each agent's pose - current_scan = agent.update_pose(control_inputs[i, 0], control_inputs[i, 1]) + current_scan = agent.update_dynamic(control_inputs[i, 0], control_inputs[i, 1]) self.agent_scans[i, :] = current_scan # update sim's information of agent poses self.agent_poses[i, :] = np.append(agent.state[0:2], agent.state[4]) self.agent_steerings[i] = agent.state[2] - - # check collisions between all agents - self.check_collision() + + if self.config['enable_scan']: + # check collisions between all agents + self.check_collision() for i, agent in enumerate(self.agents): # update agent's information on other agents @@ -560,11 +568,12 @@ def step(self, control_inputs): agent.update_opp_poses(opp_poses) # update each agent's current scan based on other agents - agent.update_scan(self.agent_scans, i) + if self.config['enable_scan']: + agent.update_scan(self.agent_scans, i) - # update agent collision with environment - if agent.in_collision: - self.collisions[i] = 1.0 + # update agent collision with environment + if agent.in_collision: + self.collisions[i] = 1.0 def reset(self, poses): """ diff --git a/f1tenth_gym/envs/f110_env.py b/f1tenth_gym/envs/f110_env.py index 07aef22b..532beb3a 100644 --- a/f1tenth_gym/envs/f110_env.py +++ b/f1tenth_gym/envs/f110_env.py @@ -101,9 +101,6 @@ def __init__(self, config: dict = None, render_mode=None, **kwargs): self.observation_config = self.config["observation_config"] self.action_type = CarAction(self.config["control_input"], params=self.params) - # radius to consider done - self.start_thresh = 0.5 # 10cm - # env states self.poses_x = [] self.poses_y = [] @@ -131,6 +128,7 @@ def __init__(self, config: dict = None, render_mode=None, **kwargs): # initiate stuff self.sim = Simulator( + self.config, self.params, self.num_agents, self.seed, @@ -139,14 +137,14 @@ def __init__(self, config: dict = None, render_mode=None, **kwargs): model=self.model, action_type=self.action_type, ) - self.sim.set_map(self.map, self.config["scale"]) + self.sim.set_map(self.map, self.config["map_scale"]) if isinstance(self.map, Track): self.track = self.map else: self.track = Track.from_track_name( self.map, - track_scale=self.config["scale"], + track_scale=self.config["map_scale"], ) # load track in gym env for convenience # observations @@ -389,19 +387,19 @@ def default_config(cls) -> dict: return { "seed": 12345, "map": "Spielberg", - "scale": 1.0, + "map_scale": 1.0, "params": cls.f1tenth_vehicle_params(), "num_agents": 2, "timestep": 0.01, "integrator_timestep": 0.01, "ego_idx": 0, "integrator": "rk4", - "model": "st", + "model": "st", # "ks", "st", "mb" "control_input": ["speed", "steering_angle"], "observation_config": {"type": None}, "reset_config": {"type": None}, "enable_rendering": True, - "enable_scan": True, + "enable_scan": True, # no lidar scan and collision if False "control_delay_buffer_size": 0, } diff --git a/f1tenth_gym/envs/utils.py b/f1tenth_gym/envs/utils.py index 4bed0ca9..3152e8d6 100644 --- a/f1tenth_gym/envs/utils.py +++ b/f1tenth_gym/envs/utils.py @@ -1,4 +1,7 @@ from typing import Any, Dict, TypeVar +# import yaml +# from pathlib import Path +# import numpy as np KeyType = TypeVar("KeyType") @@ -21,4 +24,4 @@ def deep_update( updated_mapping[k] = deep_update(updated_mapping[k], v) else: updated_mapping[k] = v - return updated_mapping + return updated_mapping \ No newline at end of file From d191714a1b15749192fece13fd84d29bf91c983e Mon Sep 17 00:00:00 2001 From: zzangupenn Date: Sat, 7 Jun 2025 22:15:19 -0400 Subject: [PATCH 06/54] update todo --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index d59476b6..4940d372 100644 --- a/README.md +++ b/README.md @@ -12,8 +12,7 @@ Zirui branch TODO list: - [x] simplify std_state and observation - [ ] simplify reset - [ ] control_buffer_size in config -- [ ] use class attribute for config, not dict -- [ ] save dynamic param and default gym config in separate yaml file +- [ ] double check dynamics result ## Quickstart We recommend installing the simulation inside a virtualenv. You can install the environment by running: From bb9997915bd6f4d4cc1ec7acc5069bcad74ef1d3 Mon Sep 17 00:00:00 2001 From: zzangupenn Date: Sun, 8 Jun 2025 00:10:17 -0400 Subject: [PATCH 07/54] integrator_timestep, lidar config --- README.md | 4 +- examples/waypoint_follow.py | 9 +++-- f1tenth_gym/envs/base_classes.py | 64 ++++++++++++++++---------------- f1tenth_gym/envs/f110_env.py | 12 ++++-- f1tenth_gym/envs/integrator.py | 50 +++++++++++++++---------- f1tenth_gym/envs/laser_models.py | 8 ++-- 6 files changed, 83 insertions(+), 64 deletions(-) diff --git a/README.md b/README.md index 4940d372..adb51461 100644 --- a/README.md +++ b/README.md @@ -6,12 +6,12 @@ Zirui branch TODO list: - [x] toggle renderer - [ ] verify collision - [x] scan toggle -- [ ] separate time step and integrater time step +- [x] separate time step and integrater time step - [ ] add frenet - [ ] use correct loop count - [x] simplify std_state and observation - [ ] simplify reset -- [ ] control_buffer_size in config +- [x] control_buffer_size, lidar fov, lidar nums in config - [ ] double check dynamics result ## Quickstart diff --git a/examples/waypoint_follow.py b/examples/waypoint_follow.py index 7698c275..815edba4 100644 --- a/examples/waypoint_follow.py +++ b/examples/waypoint_follow.py @@ -302,7 +302,7 @@ def main(): "mass": 3.463388126201571, "lf": 0.15597534362552312, "tlad": 0.82461887897713965 * 10, - "vgain": 1.0, + "vgain": 0.5, } num_agents = 1 @@ -312,6 +312,7 @@ def main(): "map": "Spielberg_blank", "num_agents": num_agents, "timestep": 0.01, + "integrator_timestep": 0.005, "integrator": "rk4", "control_input": ["speed", "steering_angle"], "model": "st", # "ks", "st", "mb" @@ -319,9 +320,9 @@ def main(): "params": F110Env.f1tenth_vehicle_params(), # "params": F110Env.fullscale_vehicle_params(), "reset_config": {"type": "rl_random_static"}, - "map_scale": 10.0, - "enable_rendering": 0, - "enable_scan": 0, + "map_scale": 1.0, + "enable_rendering": 1, + "enable_scan": 1, }, render_mode="human", ) diff --git a/f1tenth_gym/envs/base_classes.py b/f1tenth_gym/envs/base_classes.py index 4c7f1203..e96c73ba 100644 --- a/f1tenth_gym/envs/base_classes.py +++ b/f1tenth_gym/envs/base_classes.py @@ -66,12 +66,10 @@ def __init__( params, seed, action_type: CarAction, - integrator=EulerIntegrator(), + integrator, model=DynamicModel.ST, is_ego=False, time_step=0.01, - num_beams=1080, - fov=4.7, ): """ @@ -94,12 +92,14 @@ def __init__( # initialization self.params = params + self.config = config self.seed = seed self.is_ego = is_ego self.time_step = time_step - self.num_beams = num_beams - self.config = config - self.fov = fov # TODO + self.num_beams = config['lidar_num_beams'] + self.fov = config['lidar_fov'] + self.lidar_noise = config['lidar_noise_std'] + self.lidar_max_range = config['lidar_range'] self.integrator = integrator self.action_type = action_type self.model = model @@ -122,7 +122,7 @@ def __init__( # steering delay buffer self.steer_buffer = np.empty((0,)) - self.steer_buffer_size = 2 + self.steer_buffer_size = self.config['control_delay_buffer_size'] # collision identifier self.in_collision = False @@ -133,20 +133,20 @@ def __init__( # initialize scan sim if RaceCar.scan_simulator is None: self.scan_rng = np.random.default_rng(seed=self.seed) - RaceCar.scan_simulator = ScanSimulator2D(num_beams, fov) + RaceCar.scan_simulator = ScanSimulator2D(self.num_beams, self.fov, std_dev=self.lidar_noise, max_range=self.lidar_max_range) scan_ang_incr = RaceCar.scan_simulator.get_increment() # angles of each scan beam, distance from lidar to edge of car at each beam, and precomputed cosines of each angle - RaceCar.cosines = np.zeros((num_beams,)) - RaceCar.scan_angles = np.zeros((num_beams,)) - RaceCar.side_distances = np.zeros((num_beams,)) + RaceCar.cosines = np.zeros((self.num_beams,)) + RaceCar.scan_angles = np.zeros((self.num_beams,)) + RaceCar.side_distances = np.zeros((self.num_beams,)) dist_sides = params["width"] / 2.0 dist_fr = (params["lf"] + params["lr"]) / 2.0 - for i in range(num_beams): - angle = -fov / 2.0 + i * scan_ang_incr + for i in range(self.num_beams): + angle = -self.fov / 2.0 + i * scan_ang_incr RaceCar.scan_angles[i] = angle RaceCar.cosines[i] = np.cos(angle) @@ -316,28 +316,28 @@ def update_dynamic(self, raw_steer, vel): f_dynamics = self.model.f_dynamics if self.model == DynamicModel.MB: self.state = self.integrator.integrate( - f_dynamics, self.state, u_np, self.time_step, [self.params[key] for key in self.sequential_param_keys] + f_dynamics, self.state, u_np, [self.params[key] for key in self.sequential_param_keys] ) else: self.state = self.integrator.integrate( - f_dynamics, self.state, u_np, self.time_step, self.params['mu'], - self.params['C_Sf'], - self.params['C_Sr'], - self.params['lf'], - self.params['lr'], - self.params['h'], - self.params['m'], - self.params['I'], - self.params['s_min'], - self.params['s_max'], - self.params['sv_min'], - self.params['sv_max'], - self.params['v_switch'], - self.params['a_max'], - self.params['v_min'], - self.params['v_max'], - self.params['width'], - self.params['length'] + f_dynamics, self.state, u_np, self.params['mu'], + self.params['C_Sf'], + self.params['C_Sr'], + self.params['lf'], + self.params['lr'], + self.params['h'], + self.params['m'], + self.params['I'], + self.params['s_min'], + self.params['s_max'], + self.params['sv_min'], + self.params['sv_max'], + self.params['v_switch'], + self.params['a_max'], + self.params['v_min'], + self.params['v_max'], + self.params['width'], + self.params['length'] ) # bound yaw angle diff --git a/f1tenth_gym/envs/f110_env.py b/f1tenth_gym/envs/f110_env.py index 532beb3a..fcac3a55 100644 --- a/f1tenth_gym/envs/f110_env.py +++ b/f1tenth_gym/envs/f110_env.py @@ -96,7 +96,9 @@ def __init__(self, config: dict = None, render_mode=None, **kwargs): self.num_agents = self.config["num_agents"] self.timestep = self.config["timestep"] self.ego_idx = self.config["ego_idx"] - self.integrator = IntegratorType.from_string(self.config["integrator"]) + self.integrator = IntegratorType.from_string(self.config["integrator"], + self.timestep, + self.config["integrator_timestep"]) self.model = DynamicModel.from_string(self.config["model"]) self.observation_config = self.config["observation_config"] self.action_type = CarAction(self.config["control_input"], params=self.params) @@ -399,8 +401,12 @@ def default_config(cls) -> dict: "observation_config": {"type": None}, "reset_config": {"type": None}, "enable_rendering": True, - "enable_scan": True, # no lidar scan and collision if False - "control_delay_buffer_size": 0, + "enable_scan": True, # NOTE no lidar scan and collision if False + "lidar_fov" : 4.712389, + "lidar_num_beams": 360, + "lidar_range": 30.0, + "lidar_noise_std": 0.01, + "control_delay_buffer_size": 1 } def configure(self, config: dict) -> None: diff --git a/f1tenth_gym/envs/integrator.py b/f1tenth_gym/envs/integrator.py index bdb5ed6d..86caa441 100644 --- a/f1tenth_gym/envs/integrator.py +++ b/f1tenth_gym/envs/integrator.py @@ -6,11 +6,11 @@ class IntegratorType(Enum): Euler = 2 @staticmethod - def from_string(integrator: str): + def from_string(integrator: str, *args): if integrator == "rk4": - return RK4Integrator() + return RK4Integrator(*args) elif integrator == "euler": - return EulerIntegrator() + return EulerIntegrator(*args) else: raise ValueError(f"Unknown integrator type {integrator}") @@ -20,7 +20,7 @@ def __init__(self) -> None: self._integrator_type = None @abstractmethod - def integrate(self, f, x, u, dt, *args): + def integrate(self, f, x, u, *args): raise NotImplementedError("integrate method not implemented") @property @@ -29,32 +29,44 @@ def type(self) -> str: class RK4Integrator(Integrator): - def __init__(self) -> None: + def __init__(self, dt, integrator_dt=0.01) -> None: super().__init__() self._integrator_type = "rk4" + self.integrator_dt = integrator_dt + self.dt = dt + self.n_steps = int(dt / integrator_dt) + if self.n_steps < 1: + raise ValueError("Integrator dt must be smaller than the total dt.") - def integrate(self, f, x, u, dt, *args): - k1 = f(x, u, *args) + def integrate(self, f, x, u, *args): + for _ in range(self.n_steps): + k1 = f(x, u, *args) - k2_state = x + dt * (k1 / 2) - k2 = f(k2_state, u, *args) + k2_state = x + self.integrator_dt * (k1 / 2) + k2 = f(k2_state, u, *args) - k3_state = x + dt * (k2 / 2) - k3 = f(k3_state, u, *args) + k3_state = x + self.integrator_dt * (k2 / 2) + k3 = f(k3_state, u, *args) - k4_state = x + dt * k3 - k4 = f(k4_state, u, *args) + k4_state = x + self.integrator_dt * k3 + k4 = f(k4_state, u, *args) - # dynamics integration - x = x + dt * (1 / 6) * (k1 + 2 * k2 + 2 * k3 + k4) + # dynamics integration + x = x + self.integrator_dt * (1 / 6) * (k1 + 2 * k2 + 2 * k3 + k4) return x class EulerIntegrator(Integrator): - def __init__(self) -> None: + def __init__(self, dt, integrator_dt=0.01) -> None: super().__init__() self._integrator_type = "euler" - - def integrate(self, f, x, u, dt, *args): - x = x + dt * f(x, u, *args) + self.integrator_dt = integrator_dt + self.dt = dt + self.n_steps = int(dt / integrator_dt) + if self.n_steps < 1: + raise ValueError("Integrator dt must be smaller than the total dt.") + + def integrate(self, f, x, u, *args): + for _ in range(self.n_steps): + x = x + self.integrator_dt * f(x, u, *args) return x diff --git a/f1tenth_gym/envs/laser_models.py b/f1tenth_gym/envs/laser_models.py index d3d81bac..7f2febe1 100644 --- a/f1tenth_gym/envs/laser_models.py +++ b/f1tenth_gym/envs/laser_models.py @@ -432,11 +432,12 @@ class ScanSimulator2D(object): max_range (float, default=30.0): maximum range of the laser """ - def __init__(self, num_beams, fov, eps=0.0001, theta_dis=2000, max_range=30.0): + def __init__(self, num_beams, fov, eps=0.0001, theta_dis=2000, std_dev=0.01, max_range=30.0): # initialization self.num_beams = num_beams self.fov = fov self.eps = eps + self.std_dev = std_dev self.theta_dis = theta_dis self.max_range = max_range self.angle_increment = self.fov / (self.num_beams - 1) @@ -493,14 +494,13 @@ def set_map(self, map: str | Track, map_scale: float = 1.0) -> bool: return True - def scan(self, pose, rng, std_dev=0.01): + def scan(self, pose, rng): """ Perform simulated 2D scan by pose on the given map Args: pose (numpy.ndarray (3, )): pose of the scan frame (x, y, theta) rng (numpy.random.Generator): random number generator to use for whitenoise in scan, or None - std_dev (float, default=0.01): standard deviation of the generated whitenoise in the scan Returns: scan (numpy.ndarray (n, )): data array of the laserscan, n=num_beams @@ -534,7 +534,7 @@ def scan(self, pose, rng, std_dev=0.01): ) if rng is not None: - scan = scan + rng.normal(0.0, std_dev, size=self.num_beams) + scan = scan + rng.normal(0.0, self.std_dev, size=self.num_beams) return np.clip(scan, 0.0, self.max_range) From 75276136b38328f73d0c66477af751f7baf6f008 Mon Sep 17 00:00:00 2001 From: zzangupenn Date: Sun, 8 Jun 2025 01:00:35 -0400 Subject: [PATCH 08/54] add option state in reset, add state in obs --- README.md | 2 +- examples/waypoint_follow.py | 20 ++++++++++-------- f1tenth_gym/envs/base_classes.py | 15 ++++++++------ f1tenth_gym/envs/f110_env.py | 35 +++++++++++++++++++++++--------- f1tenth_gym/envs/observation.py | 7 ++++--- 5 files changed, 50 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index adb51461..baaad140 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Zirui branch TODO list: - [ ] add frenet - [ ] use correct loop count - [x] simplify std_state and observation -- [ ] simplify reset +- [x] add option "state" in reset - [x] control_buffer_size, lidar fov, lidar nums in config - [ ] double check dynamics result diff --git a/examples/waypoint_follow.py b/examples/waypoint_follow.py index 815edba4..c27ae0f2 100644 --- a/examples/waypoint_follow.py +++ b/examples/waypoint_follow.py @@ -312,15 +312,15 @@ def main(): "map": "Spielberg_blank", "num_agents": num_agents, "timestep": 0.01, - "integrator_timestep": 0.005, + "integrator_timestep": 0.01, "integrator": "rk4", "control_input": ["speed", "steering_angle"], - "model": "st", # "ks", "st", "mb" + "model": "mb", # "ks", "st", "mb" "observation_config": {"type": "direct"}, - "params": F110Env.f1tenth_vehicle_params(), - # "params": F110Env.fullscale_vehicle_params(), + # "params": F110Env.f1tenth_vehicle_params(), + "params": F110Env.fullscale_vehicle_params(), "reset_config": {"type": "rl_random_static"}, - "map_scale": 1.0, + "map_scale": 10.0, "enable_rendering": 1, "enable_scan": 1, }, @@ -331,10 +331,10 @@ def main(): planner = PurePursuitPlanner( track=track, wb=( - F110Env.f1tenth_vehicle_params()["lf"] - + F110Env.f1tenth_vehicle_params()["lr"] - # F110Env.fullscale_vehicle_params()["lf"] - # + F110Env.fullscale_vehicle_params()["lr"] + # F110Env.f1tenth_vehicle_params()["lf"] + # + F110Env.f1tenth_vehicle_params()["lr"] + F110Env.fullscale_vehicle_params()["lf"] + + F110Env.fullscale_vehicle_params()["lr"] ), ) @@ -353,6 +353,7 @@ def main(): while not done: action = env.action_space.sample() for i, agent_id in enumerate(obs.keys()): + print('agent_id', agent_id) speed, steer = planner.plan( obs[agent_id]["std_state"][0], obs[agent_id]["std_state"][1], @@ -363,6 +364,7 @@ def main(): action[i] = np.array([steer, speed]) t1 = time.time() obs, step_reward, done, truncated, info = env.step(action) + print(obs['agent_0']['state']) times.append(1/(time.time() - t1)) if len(times) > 10000: print("FPS:", np.mean(times)) diff --git a/f1tenth_gym/envs/base_classes.py b/f1tenth_gym/envs/base_classes.py index e96c73ba..5c43adfa 100644 --- a/f1tenth_gym/envs/base_classes.py +++ b/f1tenth_gym/envs/base_classes.py @@ -122,7 +122,7 @@ def __init__( # steering delay buffer self.steer_buffer = np.empty((0,)) - self.steer_buffer_size = self.config['control_delay_buffer_size'] + self.steer_buffer_size = self.config['steer_delay_buffer_size'] # collision identifier self.in_collision = False @@ -196,7 +196,7 @@ def set_map(self, map: str | Track, map_scale: float = 1.0): """ RaceCar.scan_simulator.set_map(map, map_scale) - def reset(self, pose): + def reset(self, pose, option='pose'): """ Resets the vehicle to a pose @@ -211,8 +211,11 @@ def reset(self, pose): self.steer_angle_vel = 0.0 # clear collision indicator self.in_collision = False - # init state from pose - self.state = self.model.get_initial_state(pose=pose, params=self.params) + if option == 'pose': + # init state from pose + self.state = self.model.get_initial_state(pose=pose, params=self.params) + elif option == 'state': + self.state = pose self.steer_buffer = np.empty((0,)) # reset scan random generator @@ -575,7 +578,7 @@ def step(self, control_inputs): if agent.in_collision: self.collisions[i] = 1.0 - def reset(self, poses): + def reset(self, poses, option='pose'): """ Resets the simulation environment by given poses @@ -593,4 +596,4 @@ def reset(self, poses): # loop over poses to reset for i in range(self.num_agents): - self.agents[i].reset(poses[i, :]) + self.agents[i].reset(poses[i, :], option=option) diff --git a/f1tenth_gym/envs/f110_env.py b/f1tenth_gym/envs/f110_env.py index fcac3a55..97932023 100644 --- a/f1tenth_gym/envs/f110_env.py +++ b/f1tenth_gym/envs/f110_env.py @@ -406,7 +406,7 @@ def default_config(cls) -> dict: "lidar_num_beams": 360, "lidar_range": 30.0, "lidar_noise_std": 0.01, - "control_delay_buffer_size": 1 + "steer_delay_buffer_size": 1 } def configure(self, config: dict) -> None: @@ -556,13 +556,31 @@ def reset(self, seed=None, options=None): # states after reset if options is not None and "poses" in options: poses = options["poses"] + option = "pose" + elif options is not None and "state" in options: + poses = options["state"] + option = "state" else: poses = self.reset_fn.sample() - - assert isinstance(poses, np.ndarray) and poses.shape == ( - self.num_agents, - 3, - ), "Initial poses must be a numpy array of shape (num_agents, 3)" + option = "pose" + + if option == 'pose': + assert isinstance(poses, np.ndarray) and poses.shape == ( + self.num_agents, + 3, + ), "Initial poses must be a numpy array of shape (num_agents, 3)" + elif option == 'state': + assert isinstance(poses, np.ndarray) and poses.shape == ( + self.num_agents, + self.model.state_dim, + ), f"Initial full state must be a numpy array of shape (num_agents, {self.model.state_dim})" + else: + raise ValueError( + "Invalid reset option." + ) + + # call reset to simulator + self.sim.reset(poses, option=option) self.start_xs = poses[:, 0] self.start_ys = poses[:, 1] @@ -580,11 +598,8 @@ def reset(self, seed=None, options=None): ] ) - # call reset to simulator - self.sim.reset(poses) - # get no input observations - action = np.zeros((self.num_agents, 2)) + action = np.zeros((self.num_agents, self.model.control_dim)) obs, _, _, _, info = self.step(action) return obs, info diff --git a/f1tenth_gym/envs/observation.py b/f1tenth_gym/envs/observation.py index b0f3fde8..6d72f9c3 100644 --- a/f1tenth_gym/envs/observation.py +++ b/f1tenth_gym/envs/observation.py @@ -45,9 +45,9 @@ def space(self): "std_state": gym.spaces.Box( low=-large_num, high=large_num, shape=(7,), dtype=np.float32 ), - # "dyna_state": gym.spaces.Box( - # low=-large_num, high=large_num, shape=(int(self.env.model.state_dim),), dtype=np.float32 - # ), + "state": gym.spaces.Box( + low=-large_num, high=large_num, shape=(int(self.env.model.state_dim),), dtype=np.float32 + ), # "frenet_state": gym.spaces.Box( # low=-large_num, high=large_num, shape=(7,), dtype=np.float32 # ), @@ -81,6 +81,7 @@ def observe(self): agent_obs = { "scan": scan, "std_state": agent.standard_state, + "state": agent.state, "collision": agent.in_collision, "lap_time": lap_time, "lap_count": lap_count, From f33fa3c7ba8a15a8e8998e26edf395529add1c26 Mon Sep 17 00:00:00 2001 From: zzangupenn Date: Mon, 9 Jun 2025 01:39:53 -0400 Subject: [PATCH 09/54] implemented zoom_in_factor --- examples/waypoint_follow.py | 24 ++++++++------------ f1tenth_gym/envs/f110_env.py | 3 ++- f1tenth_gym/envs/rendering/rendering.yaml | 2 +- f1tenth_gym/envs/rendering/rendering_pyqt.py | 16 +++++++------ f1tenth_gym/envs/track/raceline.py | 2 +- 5 files changed, 23 insertions(+), 24 deletions(-) diff --git a/examples/waypoint_follow.py b/examples/waypoint_follow.py index c27ae0f2..80bde66a 100644 --- a/examples/waypoint_follow.py +++ b/examples/waypoint_follow.py @@ -301,7 +301,7 @@ def main(): work = { "mass": 3.463388126201571, "lf": 0.15597534362552312, - "tlad": 0.82461887897713965 * 10, + "tlad": 0.82461887897713965, "vgain": 0.5, } @@ -315,26 +315,26 @@ def main(): "integrator_timestep": 0.01, "integrator": "rk4", "control_input": ["speed", "steering_angle"], - "model": "mb", # "ks", "st", "mb" + "model": "st", # "ks", "st", "mb" "observation_config": {"type": "direct"}, - # "params": F110Env.f1tenth_vehicle_params(), - "params": F110Env.fullscale_vehicle_params(), + "params": F110Env.f1tenth_vehicle_params(), + # "params": F110Env.fullscale_vehicle_params(), "reset_config": {"type": "rl_random_static"}, - "map_scale": 10.0, + "map_scale": 1.0, "enable_rendering": 1, "enable_scan": 1, }, - render_mode="human", + render_mode="human_fast", ) track = env.unwrapped.track planner = PurePursuitPlanner( track=track, wb=( - # F110Env.f1tenth_vehicle_params()["lf"] - # + F110Env.f1tenth_vehicle_params()["lr"] - F110Env.fullscale_vehicle_params()["lf"] - + F110Env.fullscale_vehicle_params()["lr"] + F110Env.f1tenth_vehicle_params()["lf"] + + F110Env.f1tenth_vehicle_params()["lr"] + # F110Env.fullscale_vehicle_params()["lf"] + # + F110Env.fullscale_vehicle_params()["lr"] ), ) @@ -353,7 +353,6 @@ def main(): while not done: action = env.action_space.sample() for i, agent_id in enumerate(obs.keys()): - print('agent_id', agent_id) speed, steer = planner.plan( obs[agent_id]["std_state"][0], obs[agent_id]["std_state"][1], @@ -364,7 +363,6 @@ def main(): action[i] = np.array([steer, speed]) t1 = time.time() obs, step_reward, done, truncated, info = env.step(action) - print(obs['agent_0']['state']) times.append(1/(time.time() - t1)) if len(times) > 10000: print("FPS:", np.mean(times)) @@ -384,5 +382,3 @@ def main(): "tlad": 0.82461887897713965 * 10, "vgain": 1, } - -num_agents = 1 diff --git a/f1tenth_gym/envs/f110_env.py b/f1tenth_gym/envs/f110_env.py index 97932023..37890ecc 100644 --- a/f1tenth_gym/envs/f110_env.py +++ b/f1tenth_gym/envs/f110_env.py @@ -406,7 +406,8 @@ def default_config(cls) -> dict: "lidar_num_beams": 360, "lidar_range": 30.0, "lidar_noise_std": 0.01, - "steer_delay_buffer_size": 1 + "steer_delay_buffer_size": 1, + "compute_frenet": False, } def configure(self, config: dict) -> None: diff --git a/f1tenth_gym/envs/rendering/rendering.yaml b/f1tenth_gym/envs/rendering/rendering.yaml index f434c3f4..556761ae 100644 --- a/f1tenth_gym/envs/rendering/rendering.yaml +++ b/f1tenth_gym/envs/rendering/rendering.yaml @@ -1,6 +1,6 @@ window_size: 800 # [px] width and height of the window focus_on: agent_0 # [str] agent id to focus on (e.g., agent_0) or null for map view -zoom_in_factor: 1.5 # [float] zoom in factor. 1.0 is no zoom, >1.0 is zoom in, <1.0 is zoom out +zoom_in_factor: 0.5 # [float] zoom in factor. 1.0 is no zoom, >1.0 is zoom in, <1.0 is zoom out show_wheels: True # [bool] it toggles the visualization of the vehicle wheels car_tickness: 1 # [px] thickness of the car show_info: True # [bool] it toggles the visualization of the instruction text diff --git a/f1tenth_gym/envs/rendering/rendering_pyqt.py b/f1tenth_gym/envs/rendering/rendering_pyqt.py index 0aa685fe..2cb5ee47 100644 --- a/f1tenth_gym/envs/rendering/rendering_pyqt.py +++ b/f1tenth_gym/envs/rendering/rendering_pyqt.py @@ -93,7 +93,7 @@ def __init__( self.render_spec = render_spec self.render_mode = render_mode self.render_fps = render_fps - + # create the canvas self.app = QtWidgets.QApplication.instance() or QtWidgets.QApplication([]) self.window = pg.GraphicsLayoutWidget() @@ -104,7 +104,7 @@ def __init__( self.canvas: pg.PlotItem = self.window.addPlot() # Disable interactivity - self.canvas.setMouseEnabled(x=False, y=False) # Disable mouse panning & zooming + self.canvas.setMouseEnabled(x=True, y=True) # Disable mouse panning & zooming self.canvas.hideButtons() # Disable corner auto-scale button self.canvas.setMenuEnabled(False) # Disable right-click context menu @@ -293,18 +293,20 @@ def render(self) -> Optional[np.ndarray]: Optional[np.ndarray] if render_mode is "rgb_array", returns the rendered frame as an array """ - # draw cars - for i in range(len(self.agent_ids)): - self.cars[i].render() + # call callbacks for callback_fn in self.callbacks: callback_fn(self) + + # draw cars + for i in range(len(self.agent_ids)): + self.cars[i].render() if self.follow_agent_flag: ego_x, ego_y = self.cars[self.agent_to_follow].pose[:2] - self.canvas.setXRange(ego_x - 10, ego_x + 10) - self.canvas.setYRange(ego_y - 10, ego_y + 10) + self.canvas.setXRange(ego_x - 10 / self.render_spec.zoom_in_factor, ego_x + 10 / self.render_spec.zoom_in_factor) + self.canvas.setYRange(ego_y - 10 / self.render_spec.zoom_in_factor, ego_y + 10 / self.render_spec.zoom_in_factor) else: self.canvas.autoRange() diff --git a/f1tenth_gym/envs/track/raceline.py b/f1tenth_gym/envs/track/raceline.py index f6bb997b..fa2410ad 100644 --- a/f1tenth_gym/envs/track/raceline.py +++ b/f1tenth_gym/envs/track/raceline.py @@ -192,6 +192,6 @@ def render_waypoints(self, e: EnvRenderer) -> None: """ points = np.stack([self.xs, self.ys], axis=1) if self.waypoint_render is None: - self.waypoint_render = e.render_closed_lines(points, color=(0, 128, 0), size=1) + self.waypoint_render = e.render_closed_lines(points, color=(0, 128, 0), size=2) else: self.waypoint_render.updateItems(points) From b030c5ad78abd83637da59190f1daa2edb31d432 Mon Sep 17 00:00:00 2001 From: Ahmad Amine Date: Mon, 9 Jun 2025 02:23:23 -0400 Subject: [PATCH 10/54] Fix S_key not stopping rendering --- f1tenth_gym/envs/rendering/rendering_pyqt.py | 94 +++++++++++--------- 1 file changed, 54 insertions(+), 40 deletions(-) diff --git a/f1tenth_gym/envs/rendering/rendering_pyqt.py b/f1tenth_gym/envs/rendering/rendering_pyqt.py index 2cb5ee47..12a76916 100644 --- a/f1tenth_gym/envs/rendering/rendering_pyqt.py +++ b/f1tenth_gym/envs/rendering/rendering_pyqt.py @@ -293,54 +293,68 @@ def render(self) -> Optional[np.ndarray]: Optional[np.ndarray] if render_mode is "rgb_array", returns the rendered frame as an array """ - + if self.draw_flag: + # call callbacks + for callback_fn in self.callbacks: + callback_fn(self) + + # draw cars + for i in range(len(self.agent_ids)): + self.cars[i].render() + + if self.follow_agent_flag: + ego_x, ego_y = self.cars[self.agent_to_follow].pose[:2] + self.canvas.setXRange(ego_x - 10 / self.render_spec.zoom_in_factor, ego_x + 10 / self.render_spec.zoom_in_factor) + self.canvas.setYRange(ego_y - 10 / self.render_spec.zoom_in_factor, ego_y + 10 / self.render_spec.zoom_in_factor) + else: + self.canvas.autoRange() + + agent_to_follow_id = ( + self.agent_ids[self.agent_to_follow] + if self.agent_to_follow is not None + else None + ) + self.bottom_info_renderer.render( + text=f"Focus on: {agent_to_follow_id}" + ) - # call callbacks - for callback_fn in self.callbacks: - callback_fn(self) - - # draw cars - for i in range(len(self.agent_ids)): - self.cars[i].render() + if self.render_spec.show_info: + self.top_info_renderer.render(text=INSTRUCTION_TEXT) - if self.follow_agent_flag: - ego_x, ego_y = self.cars[self.agent_to_follow].pose[:2] - self.canvas.setXRange(ego_x - 10 / self.render_spec.zoom_in_factor, ego_x + 10 / self.render_spec.zoom_in_factor) - self.canvas.setYRange(ego_y - 10 / self.render_spec.zoom_in_factor, ego_y + 10 / self.render_spec.zoom_in_factor) - else: - self.canvas.autoRange() - - agent_to_follow_id = ( - self.agent_ids[self.agent_to_follow] - if self.agent_to_follow is not None - else None - ) - self.bottom_info_renderer.render( - text=f"Focus on: {agent_to_follow_id}" - ) + self.time_renderer.render(text=f"{self.sim_time:.2f}") + self.clock.update() + self.app.processEvents() - if self.render_spec.show_info: - self.top_info_renderer.render(text=INSTRUCTION_TEXT) + if self.render_mode in ["human", "human_fast"]: + assert self.window is not None - self.time_renderer.render(text=f"{self.sim_time:.2f}") - self.clock.update() - self.app.processEvents() + else: + # rgb_array mode => extract the frame from the canvas + qImage = self.exporter.export(toBytes=True) - if self.render_mode in ["human", "human_fast"]: - assert self.window is not None + width = qImage.width() + height = qImage.height() - else: - # rgb_array mode => extract the frame from the canvas - qImage = self.exporter.export(toBytes=True) + ptr = qImage.bits() + ptr.setsize(height * width * 4) + frame = np.array(ptr).reshape(height, width, 4) # Copies the data + + return frame[:, :, :3] # remove alpha channel + else: + self.clock.update() + self.app.processEvents() - width = qImage.width() - height = qImage.height() + # if draw_flag is False, we just return the current frame without rendering anything + if self.render_mode == "rgb_array": + qImage = self.exporter.export(toBytes=True) - ptr = qImage.bits() - ptr.setsize(height * width * 4) - frame = np.array(ptr).reshape(height, width, 4) # Copies the data - - return frame[:, :, :3] # remove alpha channel + width = qImage.width() + height = qImage.height() + + ptr = qImage.bits() + ptr.setsize(height * width * 4) + frame = np.array(ptr).reshape(height, width, 4) + return frame[:, :, :3] # remove alpha channel def render_points( self, From c9d1d230acf52360b6c5e0a2268ebc2e665490ee Mon Sep 17 00:00:00 2001 From: zzangupenn Date: Mon, 9 Jun 2025 05:40:09 -0400 Subject: [PATCH 11/54] changed renderer class structure --- examples/test_pyqtopengl.py | 116 ++++++ examples/waypoint_follow.py | 17 +- f1tenth_gym/envs/f110_env.py | 40 +- f1tenth_gym/envs/observation.py | 18 +- f1tenth_gym/envs/rendering/__init__.py | 6 +- f1tenth_gym/envs/rendering/pyqt_objects.py | 91 ++++- f1tenth_gym/envs/rendering/pyqtgl_objects.py | 373 ++++++++++++++++++ f1tenth_gym/envs/rendering/renderer.py | 67 ++-- f1tenth_gym/envs/rendering/rendering.yaml | 2 +- f1tenth_gym/envs/rendering/rendering_pyqt.py | 118 ++---- .../envs/rendering/rendering_pyqtgl.py | 104 +++++ f1tenth_gym/envs/track/raceline.py | 8 +- 12 files changed, 785 insertions(+), 175 deletions(-) create mode 100644 examples/test_pyqtopengl.py create mode 100644 f1tenth_gym/envs/rendering/pyqtgl_objects.py create mode 100644 f1tenth_gym/envs/rendering/rendering_pyqtgl.py diff --git a/examples/test_pyqtopengl.py b/examples/test_pyqtopengl.py new file mode 100644 index 00000000..6d1e4690 --- /dev/null +++ b/examples/test_pyqtopengl.py @@ -0,0 +1,116 @@ +import sys +import time +import numpy as np +from PyQt6 import QtWidgets, QtCore, QtGui +import pyqtgraph.opengl as gl + + +class OpenGLRectangleWithFPS(QtWidgets.QMainWindow): + def __init__(self): + super().__init__() + self.setWindowTitle("OpenGL Filled Rectangle with FPS") + + # Set up GL view widget + self.view = gl.GLViewWidget() + self.setCentralWidget(self.view) + + # Fix camera to XY view + self.view.opts['elevation'] = 90 # Top-down + self.view.opts['azimuth'] = 0 # Facing +Y + self.view.setCameraPosition(distance=40) + + # 🔧 Replace mouse drag behavior: allow pan (right drag), disable rotation + self._enable_pan_only() + + # Define rectangle corners (XY plane, z=0) + rectangle = np.array([ + [0, 0, 0], + [5, 0, 0], + [5, 3, 0], + [0, 3, 0] + ], dtype=np.float32) + + # Line outline + outline = np.vstack([rectangle, rectangle[0]]) + rect_item = gl.GLLinePlotItem(pos=outline, color=(1, 0, 0, 1), width=2, mode='line_strip') + self.view.addItem(rect_item) + + # Fill with GLMeshItem + faces = np.array([ + [0, 1, 2], + [0, 2, 3] + ]) + mesh_item = gl.GLMeshItem( + vertexes=rectangle, + faces=faces, + faceColors=np.array([[0, 0.7, 0.9, 0.6], [0, 0.7, 0.9, 0.6]]), + smooth=False, + drawEdges=False + ) + self.view.addItem(mesh_item) + + # FPS label + self.fps_label = QtWidgets.QLabel(self) + self.fps_label.setStyleSheet("color: white; background-color: black; padding: 2px;") + self.fps_label.move(10, 10) + self.fps_label.resize(100, 20) + self.fps_label.setAttribute(QtCore.Qt.WidgetAttribute.WA_TransparentForMouseEvents) + + # Frame timer + self.last_time = time.time() + self.frame_count = 0 + + self.timer = QtCore.QTimer() + self.timer.timeout.connect(self.update_fps) + self.timer.start(0) + + def _enable_pan_only(self): + """Override GLViewWidget events to disable rotation and allow right-click panning.""" + self.view.pan_active = False + self.view.pan_start = QtCore.QPoint() + + def mousePressEvent(event): + if event.button() == QtCore.Qt.MouseButton.LeftButton: + self.view.pan_active = True + self.view.pan_start = event.pos() + event.accept() + else: + event.ignore() + + def mouseMoveEvent(event): + if self.view.pan_active: + delta = event.pos() - self.view.pan_start + dx = -delta.y() * 0.01 + dy = -delta.x() * 0.01 + self.view.pan(dx, dy, 0) + self.view.pan_start = event.pos() + event.accept() + else: + event.ignore() + + def mouseReleaseEvent(event): + self.view.pan_active = False + event.accept() + + self.view.mousePressEvent = mousePressEvent + self.view.mouseMoveEvent = mouseMoveEvent + self.view.mouseReleaseEvent = mouseReleaseEvent + + def update_fps(self): + self.frame_count += 1 + now = time.time() + elapsed = now - self.last_time + if elapsed >= 1.0: + fps = self.frame_count / elapsed + self.fps_label.setText(f"FPS: {fps:.1f}") + self.last_time = now + self.frame_count = 0 + self.view.update() + + +if __name__ == "__main__": + app = QtWidgets.QApplication(sys.argv) + window = OpenGLRectangleWithFPS() + window.resize(800, 600) + window.show() + sys.exit(app.exec()) diff --git a/examples/waypoint_follow.py b/examples/waypoint_follow.py index 80bde66a..19a0ba10 100644 --- a/examples/waypoint_follow.py +++ b/examples/waypoint_follow.py @@ -207,11 +207,11 @@ def render_lookahead_point(self, e): if self.lookahead_point is not None: points = self.lookahead_point[:2][None] # shape (1, 2)~ if self.lookahead_point_render is None: - self.lookahead_point_render = e.render_points( - points, color=(0, 0, 128), size=2 + self.lookahead_point_render = e.get_points_renderer( + points, color=(200, 0, 0), size=5 ) else: - self.lookahead_point_render.setData(points) + self.lookahead_point_render.update(points) def render_local_plan(self, e): """ @@ -220,11 +220,14 @@ def render_local_plan(self, e): if self.current_index is not None: points = self.waypoints[self.current_index : self.current_index + 10, :2] if self.local_plan_render is None: - self.local_plan_render = e.render_lines( + self.local_plan_render = e.get_lines_renderer( points, color=(0, 128, 0), size=1 ) else: - self.local_plan_render.updateItems(points) + self.local_plan_render.update(points) + + def get_render_callbacks(self): + return [self.render_lookahead_point, self.render_local_plan] def _get_current_waypoint( self, waypoints, lookahead_distance, position, theta @@ -339,8 +342,8 @@ def main(): ) env.unwrapped.add_render_callback(track.raceline.render_waypoints) - env.unwrapped.add_render_callback(planner.render_local_plan) - env.unwrapped.add_render_callback(planner.render_lookahead_point) + for r in planner.get_render_callbacks(): + env.unwrapped.add_render_callback(r) obs, info = env.reset() done = False diff --git a/f1tenth_gym/envs/f110_env.py b/f1tenth_gym/envs/f110_env.py index 37890ecc..0a51c19a 100644 --- a/f1tenth_gym/envs/f110_env.py +++ b/f1tenth_gym/envs/f110_env.py @@ -116,7 +116,7 @@ def __init__(self, config: dict = None, render_mode=None, **kwargs): # race info self.lap_times = np.zeros((self.num_agents,)) self.lap_counts = np.zeros((self.num_agents,)) - self.current_time = 0.0 + self.sim_time = 0.0 # finish line info self.num_toggles = 0 @@ -170,7 +170,7 @@ def __init__(self, config: dict = None, render_mode=None, **kwargs): # stateful observations for rendering # add choice of colors (same, random, ...) - self.render_obs = None + self.obs = None self.render_mode = render_mode # match render_fps to integration timestep @@ -465,7 +465,7 @@ def _check_done(self): self.toggle_list[i] += 1 self.lap_counts[i] = self.toggle_list[i] // 2 if self.toggle_list[i] < 4: - self.lap_times[i] = self.current_time + self.lap_times[i] = self.sim_time done = (self.collisions[self.ego_idx]) or np.all(self.toggle_list >= 4) @@ -498,35 +498,35 @@ def step(self, action): self.sim.step(action) # observation - obs = self.observation_type.observe() + self.obs = self.observation_type.observe() # times reward = self.timestep - self.current_time = self.current_time + self.timestep + self.sim_time = self.sim_time + self.timestep # update data member self._update_state() # rendering observation - if self.config["enable_rendering"]: - self.render_obs = { - "ego_idx": self.sim.ego_idx, - "poses_x": self.sim.agent_poses[:, 0], - "poses_y": self.sim.agent_poses[:, 1], - "poses_theta": self.sim.agent_poses[:, 2], - "steering_angles": self.sim.agent_steerings, - "lap_times": self.lap_times, - "lap_counts": self.lap_counts, - "collisions": self.sim.collisions, - "sim_time": self.current_time, - } + # if self.config["enable_rendering"]: + # self.render_obs = { + # "ego_idx": self.sim.ego_idx, + # "poses_x": self.sim.agent_poses[:, 0], + # "poses_y": self.sim.agent_poses[:, 1], + # "poses_theta": self.sim.agent_poses[:, 2], + # "steering_angles": self.sim.agent_steerings, + # "lap_times": self.lap_times, + # "lap_counts": self.lap_counts, + # "collisions": self.sim.collisions, + # "sim_time": self.sim_time, + # } # check done done, toggle_list = self._check_done() truncated = False info = {"checkpoint_done": toggle_list} - return obs, reward, done, truncated, info + return self.obs, reward, done, truncated, info def reset(self, seed=None, options=None): """ @@ -547,7 +547,7 @@ def reset(self, seed=None, options=None): super().reset(seed=seed) # reset counters and data members - self.current_time = 0.0 + self.sim_time = 0.0 self.collisions = np.zeros((self.num_agents,)) self.num_toggles = 0 self.near_start = True @@ -658,7 +658,7 @@ def render(self, mode="human"): if self.render_mode not in self.metadata["render_modes"] or not self.config["enable_rendering"]: return - self.renderer.update(state=self.render_obs) + self.renderer.update(obs=self.obs) return self.renderer.render() def close(self): diff --git a/f1tenth_gym/envs/observation.py b/f1tenth_gym/envs/observation.py index 6d72f9c3..d7ba792f 100644 --- a/f1tenth_gym/envs/observation.py +++ b/f1tenth_gym/envs/observation.py @@ -60,6 +60,9 @@ def space(self): "lap_count": gym.spaces.Box( low=0.0, high=large_num, shape=(), dtype=np.float32 ), + "sim_time": gym.spaces.Box( + low=0.0, high=large_num, shape=(), dtype=np.float32 + ), } complete_space[agent_id] = gym.spaces.Dict( agent_dict @@ -74,8 +77,6 @@ def observe(self): for i, agent_id in enumerate(self.env.unwrapped.agent_ids): scan = self.env.unwrapped.sim.agent_scans[i] agent = self.env.unwrapped.sim.agents[i] - lap_time = self.env.unwrapped.lap_times[i] - lap_count = self.env.unwrapped.lap_counts[i] # create agent's observation dict agent_obs = { @@ -83,17 +84,17 @@ def observe(self): "std_state": agent.standard_state, "state": agent.state, "collision": agent.in_collision, - "lap_time": lap_time, - "lap_count": lap_count, + "lap_time": self.env.unwrapped.lap_times[i], + "lap_count": self.env.unwrapped.lap_counts[i], + "sim_time": self.env.unwrapped.sim_time, } # add agent's observation to multi-agent observation obs[agent_id] = agent_obs - + # cast to match observation space for key in obs[agent_id].keys(): obs[agent_id][key] = np.array(obs[agent_id][key], dtype=np.float32) - return obs class OriginalObservation(Observation): @@ -162,6 +163,9 @@ def space(self): "lap_counts": gym.spaces.Box( low=0.0, high=large_num, shape=(num_agents,), dtype=np.float32 ), + "sim_time": gym.spaces.Box( + low=0.0, high=large_num, shape=(), dtype=np.float32 + ), } ) @@ -185,6 +189,7 @@ def observe(self): "collisions": [], "lap_times": [], "lap_counts": [], + "sim_time": [], } for i, agent in enumerate(self.env.unwrapped.sim.agents): @@ -209,6 +214,7 @@ def observe(self): observations["collisions"].append(collision) observations["lap_times"].append(lap_time) observations["lap_counts"].append(lap_count) + observations["sim_time"].append(self.env.unwrapped.sim_time) # cast to match observation space for key in observations.keys(): diff --git a/f1tenth_gym/envs/rendering/__init__.py b/f1tenth_gym/envs/rendering/__init__.py index 2325a937..28e3238e 100644 --- a/f1tenth_gym/envs/rendering/__init__.py +++ b/f1tenth_gym/envs/rendering/__init__.py @@ -32,12 +32,16 @@ def make_renderer( cfg_file = pathlib.Path(__file__).parent.absolute() / "rendering.yaml" render_spec = RenderSpec.from_yaml(cfg_file) - if render_spec.render_type == "pygame": + if render_spec.render_type == "pygame": from .rendering_pygame import PygameEnvRenderer as EnvRenderer elif render_spec.render_type == "pyqt6": if render_mode in ["rgb_array", "rgb_array_list"]: os.environ["QT_QPA_PLATFORM"] = "offscreen" from .rendering_pyqt import PyQtEnvRenderer as EnvRenderer + # elif render_spec.render_type == "pyqt6gl": + # if render_mode in ["rgb_array", "rgb_array_list"]: + # os.environ["QT_QPA_PLATFORM"] = "offscreen" + # from .rendering_pyqtgl import PyQtEnvRendererGL as EnvRenderer else: raise ValueError(f"Unknown render type: {render_spec.render_type}") diff --git a/f1tenth_gym/envs/rendering/pyqt_objects.py b/f1tenth_gym/envs/rendering/pyqt_objects.py index 7f437252..fe0d2e06 100644 --- a/f1tenth_gym/envs/rendering/pyqt_objects.py +++ b/f1tenth_gym/envs/rendering/pyqt_objects.py @@ -2,16 +2,75 @@ import numpy as np import pyqtgraph as pg -from PyQt6.QtWidgets import QGraphicsRectItem, QGraphicsPolygonItem -from PyQt6 import QtGui +# from PyQt6.QtWidgets import QGraphicsRectItem, QGraphicsPolygonItem +# from PyQt6 import QtGui -from .renderer import RenderSpec +from .renderer import RenderSpec, EnvRenderer, ObjectRenderer from ..collision_models import get_vertices, get_trmtx +from typing import Optional, Any from numba import njit -class TextObject: +class LinesRenderer(ObjectRenderer): + def __init__( + self, + env_renderer: EnvRenderer, + points: list | np.ndarray, + color: Optional[tuple[int, int, int]] = (0, 0, 255), + size: Optional[int] = 1 + ): + pen = pg.mkPen(color=pg.mkColor(*color), width=size) + self.renderer = env_renderer.canvas.plot( + points[:, 0], points[:, 1], pen=pen, fillLevel=None, antialias=True + ) + + def update(self, points: list | np.ndarray) -> None: + self.renderer.updateItems(points) + +class ClosedLinesRenderer(ObjectRenderer): + def __init__( + self, + env_renderer: EnvRenderer, + points: list | np.ndarray, + color: Optional[tuple[int, int, int]] = (0, 0, 255), + size: Optional[int] = 1 + ): + # Append the first point to the end to close the loop + points = np.vstack([points, points[0]]) + pen = pg.mkPen(color=pg.mkColor(*color), width=size) + pen.setCapStyle(pg.QtCore.Qt.PenCapStyle.RoundCap) + pen.setJoinStyle(pg.QtCore.Qt.PenJoinStyle.RoundJoin) + self.renderer = env_renderer.canvas.plot( + points[:, 0], points[:, 1], pen=pen, cosmetic=True, antialias=True + ) ## setting pen=None disables line drawing + + def update(self, points: list | np.ndarray) -> None: + self.renderer.updateItems(points) + +class PointsRenderer(ObjectRenderer): + def __init__( + self, + env_renderer: EnvRenderer, + points: list | np.ndarray, + color: Optional[tuple[int, int, int]] = (0, 0, 255), + size: Optional[int] = 1 + ): + self.renderer = env_renderer.canvas.plot( + points[:, 0], + points[:, 1], + pen=None, + symbol="o", + symbolPen=pg.mkPen(color=color, width=0), + symbolBrush=pg.mkBrush(color=color, width=0), + symbolSize=size, + ) + + def update(self, points: list | np.ndarray) -> None: + self.renderer.setData(points) + + +class TextRenderer(ObjectRenderer): """ Class to display text on the screen at a given position. @@ -24,7 +83,6 @@ class TextObject: text : pygame.Surface text surface to be displayed """ - def __init__( self, position: str | tuple, @@ -45,7 +103,6 @@ def __init__( font name, by default "Arial" """ self.position = position - self.text_label = pg.LabelItem("", parent=parent, size=str(relative_font_size) + 'pt', family=font_name, color=(125, 125, 125)) # create text label # Get the position and offset of the text position_tuple = self._position_resolver(self.position) @@ -146,6 +203,9 @@ def _offset_resolver( raise ValueError( f"Position expected to be a tuple[int, int] or a string. Got {position}." ) + + def update(self) -> None: + pass def render(self, text: str) -> None: """ @@ -213,11 +273,10 @@ def _get_tire_vertices(pose, length, width, tire_width, tire_length, index, stee return vertices -class Car: +class CarRenderer(ObjectRenderer): """ Class to display the car. """ - def __init__( self, render_spec: RenderSpec, @@ -275,14 +334,15 @@ def __init__( brush=(0,0,0), # Rubber tire => Black ) - def update(self, state: dict[str, np.ndarray], idx: int): + def update(self, obs: dict[str, np.ndarray], id: str): + state = obs[id]["std_state"].astype(float) self.pose = ( - state["poses_x"][idx], - state["poses_y"][idx], - state["poses_theta"][idx], + state[0], + state[1], + state[4], ) - self.color = (255, 0, 0) if state["collisions"][idx] > 0 else self.color - self.steering = state["steering_angles"][idx] + self.color = (255, 0, 0) if obs[id]["collision"] > 0 else self.color + self.steering = state[2] def render(self): vertices = get_vertices(self.pose, self.car_length, self.car_width) @@ -305,3 +365,6 @@ def render(self): + + + \ No newline at end of file diff --git a/f1tenth_gym/envs/rendering/pyqtgl_objects.py b/f1tenth_gym/envs/rendering/pyqtgl_objects.py new file mode 100644 index 00000000..092fabdf --- /dev/null +++ b/f1tenth_gym/envs/rendering/pyqtgl_objects.py @@ -0,0 +1,373 @@ +from __future__ import annotations +import numpy as np +# from PyQt6.QtWidgets import QGraphicsRectItem, QGraphicsPolygonItem +# from PyQt6 import QtGui +from pyqtgraph.opengl import GLLinePlotItem + +from .renderer import RenderSpec, EnvRenderer, ObjectRenderer +from ..collision_models import get_vertices, get_trmtx +from typing import Optional, Any + +from numba import njit + + +class LinesRenderer(ObjectRenderer): + def __init__( + self, + env_renderer: EnvRenderer, + points: list | np.ndarray, + color: Optional[tuple[int, int, int]] = (0, 0, 255), + size: Optional[int] = 1 + ): + pen = pg.mkPen(color=pg.mkColor(*color), width=size) + self.renderer = env_renderer.canvas.plot( + points[:, 0], points[:, 1], pen=pen, fillLevel=None, antialias=True + ) + + def update(self, points: list | np.ndarray) -> None: + self.renderer.updateItems(points) + +class ClosedLinesRenderer(ObjectRenderer): + def __init__( + self, + env_renderer: EnvRenderer, + points: list | np.ndarray, + color: Optional[tuple[int, int, int]] = (0, 0, 255), + size: Optional[int] = 1 + ): + # Append the first point to the end to close the loop + points = np.vstack([points, points[0]]) + pen = pg.mkPen(color=pg.mkColor(*color), width=size) + pen.setCapStyle(pg.QtCore.Qt.PenCapStyle.RoundCap) + pen.setJoinStyle(pg.QtCore.Qt.PenJoinStyle.RoundJoin) + self.renderer = env_renderer.canvas.plot( + points[:, 0], points[:, 1], pen=pen, cosmetic=True, antialias=True + ) ## setting pen=None disables line drawing + + def update(self, points: list | np.ndarray) -> None: + self.renderer.updateItems(points) + +class PointsRenderer(ObjectRenderer): + def __init__( + self, + env_renderer: EnvRenderer, + points: list | np.ndarray, + color: Optional[tuple[int, int, int]] = (0, 0, 255), + size: Optional[int] = 1 + ): + self.renderer = env_renderer.canvas.plot( + points[:, 0], + points[:, 1], + pen=None, + symbol="o", + symbolPen=pg.mkPen(color=color, width=0), + symbolBrush=pg.mkBrush(color=color, width=0), + symbolSize=size, + ) + + def update(self, points: list | np.ndarray) -> None: + self.renderer.setData(points) + + +class TextRenderer(ObjectRenderer): + """ + Class to display text on the screen at a given position. + + Attributes + ---------- + font : pygame.font.Font + font object + position : str | tuple + position of the text on the screen + text : pygame.Surface + text surface to be displayed + """ + def __init__( + self, + position: str | tuple, + relative_font_size: int = 16, + font_name: str = "Arial", + parent: pg.PlotWidget = None, + ) -> None: + """ + Initialize text object. + + Parameters + ---------- + position : str | tuple + position of the text on the screen + relative_font_size : int, optional + font size relative to the window shape, by default 32 + font_name : str, optional + font name, by default "Arial" + """ + self.position = position + self.text_label = pg.LabelItem("", parent=parent, size=str(relative_font_size) + 'pt', family=font_name, color=(125, 125, 125)) # create text label + # Get the position and offset of the text + position_tuple = self._position_resolver(self.position) + offset_tuple = self._offset_resolver(self.position, self.text_label) + # Set the position and offset of the text + self.text_label.anchor(itemPos=position_tuple, parentPos=position_tuple, offset=offset_tuple) + + def _position_resolver( + self, position: str | tuple[int, int] + ) -> tuple[int, int]: + """ + This function takes strings like "bottom center" and converts them into a location for the text to be displayed. + If position is tuple, then passthrough. + + Parameters + ---------- + position : str | tuple + position of the text on the screen + + Returns + ------- + tuple + position of the text on the screen + + Raises + ------ + ValueError + if position is not a tuple or a string + NotImplementedError + if position is a string but not implemented + """ + if isinstance(position, tuple) and len(position) == 2: + return int(position[0]), int(position[1]) + elif isinstance(position, str): + position = position.lower() + if position == "bottom_right": + return (1, 1) + elif position == "bottom_left": + return (0, 1) + elif position == "bottom_center": + return (0.5, 1) + elif position == "top_right": + return (1, 0) + elif position == "top_left": + return (0, 0) + elif position == "top_center": + return (0.5, 0) + else: + raise NotImplementedError(f"Position {position} not implemented.") + else: + raise ValueError( + f"Position expected to be a tuple[int, int] or a string. Got {position}." + ) + + def _offset_resolver( + self, position: str | tuple[int, int], text_label: pg.LabelItem + ) -> tuple[int, int]: + """ + This function takes strings like "bottom center" and converts them into a location for the text to be displayed. + If position is tuple, then passthrough. + + Parameters + ---------- + position : str | tuple + position of the text on the screen + + Returns + ------- + tuple + position of the text on the screen + + Raises + ------ + ValueError + if position is not a tuple or a string + NotImplementedError + if position is a string but not implemented + """ + if isinstance(position, tuple) and len(position) == 2: + return int(position[0]), int(position[1]) + elif isinstance(position, str): + position = position.lower() + if position == "bottom_right": + return (-text_label.width(), 0) + elif position == "bottom_left": + return (0, 0) + elif position == "bottom_center": + return (-text_label.width()/2, 0) + elif position == "top_right": + return (-text_label.width(), 0) + elif position == "top_left": + return (0, 0) + elif position == "top_center": + return (-text_label.width()/2, 0) + else: + raise NotImplementedError(f"Position {position} not implemented.") + else: + raise ValueError( + f"Position expected to be a tuple[int, int] or a string. Got {position}." + ) + + def update(self) -> None: + pass + + def render(self, text: str) -> None: + """ + Render text on the screen. + + Parameters + ---------- + text : str + text to be displayed + """ + self.text_label.setText(text) + +class CarRendererGL: + """ + Car renderer using PyQtGraph OpenGL backend. + """ + def __init__( + self, + render_spec, + map_origin: tuple[float, float], + resolution: float, + car_length: float, + car_width: float, + color: Optional[list[int]] = None, + wheel_size: float = 0.2, + parent=None, # parent is GLViewWidget + ): + self.car_length = car_length + self.car_width = car_width + self.wheel_size = wheel_size + self.car_thickness = render_spec.car_tickness + self.show_wheels = render_spec.show_wheels + + self.origin = map_origin + self.resolution = resolution + self.color = color or (0, 0, 0) + self.pose = (0, 0, 0) + self.steering = 0 + + self.tire_width = 0.1 + self.tire_length = self.wheel_size + + # Construct chassis + vertices = self._get_chassis_vertices(self.pose) + self.chassis = GLLinePlotItem( + pos=vertices, + color=self._color_rgba(self.color), + width=self.car_thickness, + antialias=True, + mode='line_strip' + ) + parent.addItem(self.chassis) + + # Optional wheels + if self.show_wheels: + fl = self._get_tire_vertices(self.pose, 'fl', self.steering) + self.fl_wheel = GLLinePlotItem( + pos=fl, + color=(0, 0, 0, 1), + width=self.car_thickness, + antialias=True, + mode='line_strip' + ) + parent.addItem(self.fl_wheel) + + fr = self._get_tire_vertices(self.pose, 'fr', self.steering) + self.fr_wheel = GLLinePlotItem( + pos=fr, + color=(0, 0, 0, 1), + width=self.car_thickness, + antialias=True, + mode='line_strip' + ) + parent.addItem(self.fr_wheel) + + def update(self, obs: dict, agent_id: str): + state = obs[agent_id]["std_state"].astype(float) + self.pose = (state[0], state[1], state[4]) + if obs[agent_id]["collision"] > 0: + self.color = (255, 0, 0) + self.steering = state[2] + + def render(self): + vertices = self._get_chassis_vertices(self.pose) + self.chassis.setData(pos=vertices) + + if self.show_wheels: + self.fl_wheel.setData(pos=self._get_tire_vertices(self.pose, 'fl', self.steering)) + self.fr_wheel.setData(pos=self._get_tire_vertices(self.pose, 'fr', self.steering)) + + def _get_chassis_vertices(self, pose): + verts = get_vertices(pose, self.car_length, self.car_width) + verts = np.array([verts[0], verts[3], verts[2], verts[1], verts[0]]) # closed loop + verts = np.hstack([verts, np.zeros((verts.shape[0], 1))]) # z=0 + return verts + + def _get_tire_vertices(self, pose, wheel_pos, steering): + verts = _get_tire_vertices( + pose, self.car_length, self.car_width, + self.tire_width, self.tire_length, + wheel_pos, steering + ) + verts = np.vstack([verts, verts[0]]) # close loop + verts = np.hstack([verts, np.zeros((verts.shape[0], 1))]) + return verts + + def _color_rgba(self, rgb): + return (rgb[0] / 255, rgb[1] / 255, rgb[2] / 255, 1.0) + + + + +@njit(cache=True) +def _get_tire_vertices(pose, length, width, tire_width, tire_length, index, steering): + """ + Utility function to return vertices of the car's tire given pose and size + + Args: + pose (np.ndarray, (3, )): current world coordinate pose of the vehicle + length (float): car length + width (float): car width + + Returns: + vertices (np.ndarray, (4, 2)): corner vertices of the vehicle body + """ + pose_arr = np.array(pose) + if index == 'fl': + # Shift back, rotate + H_shift = get_trmtx(np.array([-(length/2 - tire_length/2), -(width/2 - tire_width/2), 0])) + H_steer = get_trmtx(np.array([0, 0, steering])) + H_back = get_trmtx(np.array([length/2 - tire_length/2, width/2 - tire_width/2, 0])) + H = get_trmtx(pose_arr) + H = H.dot(H_back).dot(H_steer).dot(H_shift) + fl = H.dot(np.asarray([[length / 2], [width / 2], [0.0], [1.0]])).flatten() + fr = H.dot(np.asarray([[length / 2], [width / 2 - tire_width], [0.0], [1.0]])).flatten() + rr = H.dot(np.asarray([[length / 2 - tire_length], [width / 2 - tire_width], [0.0], [1.0]])).flatten() + rl = H.dot(np.asarray([[length / 2 - tire_length], [width / 2], [0.0], [1.0]])).flatten() + rl = rl / rl[3] + rr = rr / rr[3] + fl = fl / fl[3] + fr = fr / fr[3] + vertices = np.asarray( + [[rl[0], rl[1]], [fl[0], fl[1]], [fr[0], fr[1]], [rr[0], rr[1]], [rl[0], rl[1]]] + ) + elif index == 'fr': + # Shift back, rotate + H_shift = get_trmtx(np.array([-(length/2 - tire_length/2), -(-width/2 + tire_width/2), 0])) + H_steer = get_trmtx(np.array([0, 0, steering])) + H_back = get_trmtx(np.array([length/2 - tire_length/2, -width/2 + tire_width/2, 0])) + H = get_trmtx(pose_arr) + H = H.dot(H_back).dot(H_steer).dot(H_shift) + + fl = H.dot(np.asarray([[length / 2], [-width / 2 + tire_width], [0.0], [1.0]])).flatten() + fr = H.dot(np.asarray([[length / 2], [-width / 2], [0.0], [1.0]])).flatten() + rr = H.dot(np.asarray([[length / 2 - tire_length], [-width / 2], [0.0], [1.0]])).flatten() + rl = H.dot(np.asarray([[length / 2 - tire_length], [-width / 2 + tire_width], [0.0], [1.0]])).flatten() + rl = rl / rl[3] + rr = rr / rr[3] + fl = fl / fl[3] + fr = fr / fr[3] + # As it is only used for rendering, we can reorder the vertices and append the first point to close the polygon + vertices = np.asarray( + [[rl[0], rl[1]], [fl[0], fl[1]], [fr[0], fr[1]], [rr[0], rr[1]], [rl[0], rl[1]]] + ) + + return vertices \ No newline at end of file diff --git a/f1tenth_gym/envs/rendering/renderer.py b/f1tenth_gym/envs/rendering/renderer.py index a936ed08..d4bd81a1 100644 --- a/f1tenth_gym/envs/rendering/renderer.py +++ b/f1tenth_gym/envs/rendering/renderer.py @@ -86,19 +86,30 @@ class EnvRenderer(ABC): """ Abstract class for rendering the environment. """ + @abstractmethod + def add_renderer_callback(self, callback_fn): + """ + Add a custom callback for visualization. + Parameters + ---------- + callback_fn : Callable[[EnvRenderer], None] + callback function to be called at every rendering step + """ + raise NotImplementedError() + @abstractmethod - def update(self, state: Any) -> None: + def update(self, obs: dict) -> None: """ Update the state to be rendered. This is called at every rendering call. Parameters ---------- - state : Any - state to be rendered, e.g. a list of vehicle states + obs : dict + observations from the env to be rendered """ - raise NotImplementedError() + raise NotImplementedError() @abstractmethod def render(self): @@ -108,50 +119,26 @@ def render(self): raise NotImplementedError() @abstractmethod - def render_lines( - self, - points: list | np.ndarray, - color: Optional[tuple[int, int, int]] = (0, 0, 255), - size: Optional[int] = 1, - ): + def close(self): """ - Render a sequence of lines segments. - - Parameters - ---------- - points : list | np.ndarray - list of points to render - color : tuple[int, int, int], optional - color as rgb tuple, by default blue (0, 0, 255) - size : int, optional - size of the line, by default 1 + Close the rendering window. """ raise NotImplementedError() +class ObjectRenderer(ABC): + @abstractmethod - def render_closed_lines( - self, - points: list | np.ndarray, - color: Optional[tuple[int, int, int]] = (0, 0, 255), - size: Optional[int] = 1, - ): + def __init__(self): """ - Render a closed loop of lines (draw a line between the last and the first point). - - Parameters - ---------- - points : list | np.ndarray - list of points to render - color : tuple[int, int, int], optional - color as rgb tuple, by default blue (0, 0, 255) - size : int, optional - size of the line, by default 1 + Initialize the point renderer. + This should set up the necessary parameters for rendering points. """ raise NotImplementedError() - + @abstractmethod - def close(self): + def update(self): """ - Close the rendering window. + Update the point renderer with new data. + This is called at every rendering call. """ - raise NotImplementedError() + raise NotImplementedError() \ No newline at end of file diff --git a/f1tenth_gym/envs/rendering/rendering.yaml b/f1tenth_gym/envs/rendering/rendering.yaml index 556761ae..3c7c783c 100644 --- a/f1tenth_gym/envs/rendering/rendering.yaml +++ b/f1tenth_gym/envs/rendering/rendering.yaml @@ -4,7 +4,7 @@ zoom_in_factor: 0.5 # [float] zoom in factor. 1.0 is no zoom, >1.0 is zoom in, show_wheels: True # [bool] it toggles the visualization of the vehicle wheels car_tickness: 1 # [px] thickness of the car show_info: True # [bool] it toggles the visualization of the instruction text -render_type: "pyqt6" # [str] rendering type. Options: "pygame", "pyqt6" +render_type: "pyqt6" # [str] rendering type. Options: "pygame", "pyqt6" NOTE: pygame not supported until reimplemented vehicle_palette: # [list] cyclic list of colors for the vehicles - "#984ea3" - "#e41a1c" diff --git a/f1tenth_gym/envs/rendering/rendering_pyqt.py b/f1tenth_gym/envs/rendering/rendering_pyqt.py index 12a76916..c4a73e09 100644 --- a/f1tenth_gym/envs/rendering/rendering_pyqt.py +++ b/f1tenth_gym/envs/rendering/rendering_pyqt.py @@ -12,16 +12,24 @@ from pyqtgraph.exporters import ImageExporter from PIL import ImageColor -from .pyqt_objects import ( - Car, - TextObject, -) +from .pyqt_objects import * from ..track import Track -from .renderer import EnvRenderer, RenderSpec +from .renderer import EnvRenderer, ObjectRenderer, RenderSpec # one-line instructions visualized at the top of the screen (if show_info=True) INSTRUCTION_TEXT = "Mouse click (L/M/R): Change POV - 'S' key: On/Off" +# import sys +# import warnings + +# def warn_with_traceback(message, category, filename, lineno, file=None, line=None): +# import traceback +# log = file if hasattr(file, 'write') else sys.stderr +# traceback.print_stack(file=log) +# warnings.defaultaction = 'always' +# return warnings.showwarning(message, category, filename, lineno, file, line) + +# warnings.showwarning = warn_with_traceback # Replicated from pyqtgraphs' example utils for ci pipelines to pass from time import perf_counter @@ -125,12 +133,12 @@ def __init__( # fps and time renderer self.clock = FrameCounter() - self.fps_renderer = TextObject(parent=self.canvas, position="bottom_left") - self.time_renderer = TextObject(parent=self.canvas, position="bottom_right") - self.bottom_info_renderer = TextObject( + self.fps_renderer = TextRenderer(parent=self.canvas, position="bottom_left") + self.time_renderer = TextRenderer(parent=self.canvas, position="bottom_right") + self.bottom_info_renderer = TextRenderer( parent=self.canvas, position="bottom_center" ) - self.top_info_renderer = TextObject(parent=self.canvas, position="top_center") + self.top_info_renderer = TextRenderer(parent=self.canvas, position="top_center") if self.render_mode in ["human", "human_fast"]: self.clock.sigFpsUpdate.connect( @@ -191,17 +199,17 @@ def __init__( elif self.render_mode == "rgb_array": self.exporter = ImageExporter(self.canvas) - def update(self, state: dict) -> None: + def update(self, obs: dict) -> None: """ - Update the simulation state to be rendered. + Update the simulation obs to be rendered. Parameters ---------- - state: simulation state as dictionary + obs: simulation obs as dictionary """ if self.cars is None: self.cars = [ - Car( + CarRenderer( car_length=self.params["length"], car_width=self.params["width"], color=self.car_colors[ic], @@ -213,12 +221,12 @@ def update(self, state: dict) -> None: for ic in range(len(self.agent_ids)) ] - # update cars state and zoom level (updating points-per-unit) - for i in range(len(self.agent_ids)): - self.cars[i].update(state, i) + # update cars obs and zoom level (updating points-per-unit) + for i, id in enumerate(self.agent_ids): + self.cars[i].update(obs, id) # update time - self.sim_time = state["sim_time"] + self.sim_time = obs[self.agent_ids[0]]["sim_time"] def add_renderer_callback(self, callback_fn: Callable[[EnvRenderer], None]) -> None: """ @@ -356,85 +364,29 @@ def render(self) -> Optional[np.ndarray]: frame = np.array(ptr).reshape(height, width, 4) return frame[:, :, :3] # remove alpha channel - def render_points( + def get_points_renderer( self, points: list | np.ndarray, color: Optional[tuple[int, int, int]] = (0, 0, 255), size: Optional[int] = 1, - ) -> pg.PlotDataItem: - """ - Render a sequence of xy points on screen. + ) -> ObjectRenderer: + return PointsRenderer(self, points, color, size) - Parameters - ---------- - points : list | np.ndarray - list of points to render - color : Optional[tuple[int, int, int]], optional - color as rgb tuple, by default blue (0, 0, 255) - size : Optional[int], optional - size of the points in pixels, by default 1 - """ - return self.canvas.plot( - points[:, 0], - points[:, 1], - pen=None, - symbol="o", - symbolPen=pg.mkPen(color=color, width=0), - symbolBrush=pg.mkBrush(color=color, width=0), - symbolSize=size, - ) - - def render_lines( + def get_lines_renderer( self, points: list | np.ndarray, color: Optional[tuple[int, int, int]] = (0, 0, 255), size: Optional[int] = 1, - ) -> pg.PlotDataItem: - """ - Render a sequence of lines segments. - - Parameters - ---------- - points : list | np.ndarray - list of points to render - color : Optional[tuple[int, int, int]], optional - color as rgb tuple, by default blue (0, 0, 255) - size : Optional[int], optional - size of the line, by default 1 - """ - pen = pg.mkPen(color=pg.mkColor(*color), width=size) - return self.canvas.plot( - points[:, 0], points[:, 1], pen=pen, fillLevel=None, antialias=True - ) ## setting pen=None disables line drawing + ) -> ObjectRenderer: + return LinesRenderer(self, points, color, size) - def render_closed_lines( + def get_closed_lines_renderer( self, points: list | np.ndarray, color: Optional[tuple[int, int, int]] = (0, 0, 255), size: Optional[int] = 1, - ) -> pg.PlotDataItem: - """ - Render a sequence of lines segments forming a closed loop (draw a line between the last and the first point). - - Parameters - ---------- - points : list | np.ndarray - list of 2d points to render - color : Optional[tuple[int, int, int]], optional - color as rgb tuple, by default blue (0, 0, 255) - size : Optional[int], optional - size of the line, by default 1 - """ - # Append the first point to the end to close the loop - points = np.vstack([points, points[0]]) - - pen = pg.mkPen(color=pg.mkColor(*color), width=size) - pen.setCapStyle(pg.QtCore.Qt.PenCapStyle.RoundCap) - pen.setJoinStyle(pg.QtCore.Qt.PenJoinStyle.RoundJoin) - - return self.canvas.plot( - points[:, 0], points[:, 1], pen=pen, cosmetic=True, antialias=True - ) ## setting pen=None disables line drawing + ) -> ObjectRenderer: + return ClosedLinesRenderer(self, points, color, size) def close(self) -> None: """ @@ -442,3 +394,5 @@ def close(self) -> None: """ self.app.exit() + + diff --git a/f1tenth_gym/envs/rendering/rendering_pyqtgl.py b/f1tenth_gym/envs/rendering/rendering_pyqtgl.py new file mode 100644 index 00000000..fc80b18d --- /dev/null +++ b/f1tenth_gym/envs/rendering/rendering_pyqtgl.py @@ -0,0 +1,104 @@ +import pyqtgraph.opengl as gl +from pyqtgraph.Qt import QtWidgets, QtGui +from PyQt6 import QtCore +import numpy as np +from ..track import Track +from .renderer import EnvRenderer, RenderSpec +from PIL import ImageColor + +class PyQtEnvRendererGL(EnvRenderer): + def __init__(self, params, track, agent_ids, render_spec, render_mode, render_fps): + super().__init__() + self.params = params + self.agent_ids = agent_ids + self.render_spec = render_spec + self.render_mode = render_mode + self.render_fps = render_fps + + self.app = QtWidgets.QApplication.instance() or QtWidgets.QApplication([]) + self.window = gl.GLViewWidget() + self.window.setWindowTitle("F1Tenth Gym - OpenGL") + self.window.setGeometry(0, 0, self.render_spec.window_size, self.render_spec.window_size) + self.window.setCameraPosition(distance=40) + self.window.opts['center'] = QtGui.QVector3D(0, 0, 0) + self.window.show() + + self.cars = [] + self.sim_time = None + self.callbacks = [] + + # Load and transform map + self._init_map(track) + + # Colors + self.car_colors = [ + tuple(ImageColor.getcolor(c, "RGB")) for c in render_spec.vehicle_palette + ] + + def _init_map(self, track): + img = track.occupancy_map + img = np.stack([img]*3, axis=-1) + img = np.rot90(img, k=1) + img = np.flip(img, axis=0) + + # Normalize image for OpenGL + img = img.astype(np.float32) / 255.0 + w, h = img.shape[:2] + self.map_origin = track.spec.origin + px, py = self.map_origin[0], self.map_origin[1] + res = self.map_resolution = track.spec.resolution + + self.map_item = gl.GLImageItem(img) + self.map_item.translate(px, py, 0) + self.map_item.scale(res, res, 1) + self.window.addItem(self.map_item) + + def update(self, state): + if not self.cars: + for i in range(len(self.agent_ids)): + color = self.car_colors[i % len(self.car_colors)] + car_item = gl.GLScatterPlotItem(pos=np.zeros((1, 3)), color=color + (1.0,), size=5) + self.window.addItem(car_item) + self.cars.append(car_item) + + for i, car in enumerate(self.cars): + x, y, _ = state["poses_x"][i], state["poses_y"][i], state["poses_theta"][i] + car.setData(pos=np.array([[x, y, 0]])) + + self.sim_time = state["sim_time"] + + def render(self): + for callback in self.callbacks: + callback(self) + self.app.processEvents() + + def add_renderer_callback(self, callback_fn): + """ + Add a custom callback for visualization. + + Parameters + ---------- + callback_fn : Callable[[EnvRenderer], None] + callback function to be called at every rendering step + """ + self.callbacks.append(callback_fn) + + def render_points(self, points, color=(0, 0, 255), size=3): + color = [c / 255 for c in color] + [1.0] + pts = np.hstack([points, np.zeros((len(points), 1))]) + item = gl.GLScatterPlotItem(pos=pts, color=color, size=size) + self.window.addItem(item) + return item + + def render_lines(self, points, color=(0, 0, 255), size=2): + color = [c / 255 for c in color] + [1.0] + pts = np.hstack([points, np.zeros((len(points), 1))]) + item = gl.GLLinePlotItem(pos=pts, color=color, width=size, mode='line_strip') + self.window.addItem(item) + return item + + def render_closed_lines(self, points, color=(0, 0, 255), size=2): + return self.render_lines(np.vstack([points, points[0]]), color, size) + + def close(self): + self.window.close() diff --git a/f1tenth_gym/envs/track/raceline.py b/f1tenth_gym/envs/track/raceline.py index fa2410ad..bb7558f5 100644 --- a/f1tenth_gym/envs/track/raceline.py +++ b/f1tenth_gym/envs/track/raceline.py @@ -65,7 +65,7 @@ def __init__( # compute spline through waypoints if not provided self.spline = spline or CubicSpline2D(x=xs, y=ys) - self.waypoint_render = None + self.waypoint_renderer = None @staticmethod def from_centerline_file( @@ -191,7 +191,7 @@ def render_waypoints(self, e: EnvRenderer) -> None: Environment renderer object. """ points = np.stack([self.xs, self.ys], axis=1) - if self.waypoint_render is None: - self.waypoint_render = e.render_closed_lines(points, color=(0, 128, 0), size=2) + if self.waypoint_renderer is None: + self.waypoint_renderer = e.get_closed_lines_renderer(points, color=(0, 128, 0), size=2) else: - self.waypoint_render.updateItems(points) + self.waypoint_renderer.update(points) From 28d3da736f284d3677b95e66197c34cf2b7adfe1 Mon Sep 17 00:00:00 2001 From: zzangupenn Date: Mon, 9 Jun 2025 19:30:57 -0400 Subject: [PATCH 12/54] implemented pyqtgl rendering --- examples/test.py | 68 +++ examples/test_pyqtopengl.py | 38 +- examples/waypoint_follow.py | 2 +- f1tenth_gym/envs/rendering/__init__.py | 8 +- f1tenth_gym/envs/rendering/pyqtgl_objects.py | 478 ++++++------------ f1tenth_gym/envs/rendering/rendering.yaml | 2 +- f1tenth_gym/envs/rendering/rendering_pyqt.py | 14 +- .../envs/rendering/rendering_pyqtgl.py | 255 +++++++--- f1tenth_gym/envs/track/raceline.py | 2 +- 9 files changed, 444 insertions(+), 423 deletions(-) create mode 100644 examples/test.py diff --git a/examples/test.py b/examples/test.py new file mode 100644 index 00000000..7c039325 --- /dev/null +++ b/examples/test.py @@ -0,0 +1,68 @@ +import sys +import time +import numpy as np +from PyQt6 import QtWidgets, QtCore, QtGui +import pyqtgraph.opengl as gl + + +class OpenGLRectangleWithFPS(QtWidgets.QMainWindow): + def __init__(self): + super().__init__() + self.setWindowTitle("OpenGL Rectangle with FPS") + + # Set up GL view widget + self.view = gl.GLViewWidget() + self.setCentralWidget(self.view) + self.view.setCameraPosition(distance=20, elevation=90, azimuth=0) + + # Rectangle + rectangle = np.array([ + [0, 0, 0], + [5, 0, 0], + [5, 3, 0], + [0, 3, 0], + [0, 0, 0] + ], dtype=np.float32) + + rect_item = gl.GLLinePlotItem(pos=rectangle, color=(1, 0, 0, 1), width=2, mode='line_strip') + self.view.addItem(rect_item) + + # FPS label (parent is the main window, not GL view!) + self.fps_label = QtWidgets.QLabel(self) + self.fps_label.setText("FPS: ...") + self.fps_label.setStyleSheet("color: white; background-color: rgba(0,0,0,180); padding: 4px;") + self.fps_label.setFont(QtGui.QFont("Courier", 14, QtGui.QFont.Weight.Bold)) + self.fps_label.setGeometry(10, 10, 150, 30) + self.fps_label.setAttribute(QtCore.Qt.WidgetAttribute.WA_TransparentForMouseEvents) + self.fps_label.raise_() # Ensure it's on top + + # Timing + self.last_time = time.time() + self.frame_count = 0 + + # Timer for render loop + self.timer = QtCore.QTimer() + self.timer.timeout.connect(self.render) + self.timer.start(0) + + def render(self): + self._update_fps() + self.view.update() + + def _update_fps(self): + self.frame_count += 1 + current_time = time.time() + elapsed = current_time - self.last_time + if elapsed >= 1.0: + fps = self.frame_count / elapsed + self.fps_label.setText(f"FPS: {fps:.1f}") + self.last_time = current_time + self.frame_count = 0 + + +if __name__ == "__main__": + app = QtWidgets.QApplication(sys.argv) + window = OpenGLRectangleWithFPS() + window.resize(800, 600) + window.show() + sys.exit(app.exec()) diff --git a/examples/test_pyqtopengl.py b/examples/test_pyqtopengl.py index 6d1e4690..07097415 100644 --- a/examples/test_pyqtopengl.py +++ b/examples/test_pyqtopengl.py @@ -3,13 +3,17 @@ import numpy as np from PyQt6 import QtWidgets, QtCore, QtGui import pyqtgraph.opengl as gl +from PyQt6.QtGui import QSurfaceFormat + +fmt = QSurfaceFormat() +fmt.setSwapInterval(0) # 0 = no vsync, 1 = vsync +QSurfaceFormat.setDefaultFormat(fmt) class OpenGLRectangleWithFPS(QtWidgets.QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("OpenGL Filled Rectangle with FPS") - # Set up GL view widget self.view = gl.GLViewWidget() self.setCentralWidget(self.view) @@ -22,6 +26,18 @@ def __init__(self): # 🔧 Replace mouse drag behavior: allow pan (right drag), disable rotation self._enable_pan_only() + # Add 2D background using GLImageItem + map_img = np.zeros((200, 300), dtype=np.uint8) + map_img[50:150, 100:200] = 255 + map_rgb = np.stack([map_img]*3, axis=-1) + alpha = np.ones((map_rgb.shape[0], map_rgb.shape[1], 1), dtype=np.uint8) * 255 + map_rgba = np.concatenate((map_rgb, alpha), axis=-1) + map_rgba = np.flip(np.rot90(map_rgba, k=1), axis=0) + image_item = gl.GLImageItem(map_rgba) + image_item.translate(0, 0, -0.01) + image_item.scale(0.1, 0.1, 1) + # self.view.addItem(image_item) + # Define rectangle corners (XY plane, z=0) rectangle = np.array([ [0, 0, 0], @@ -31,9 +47,9 @@ def __init__(self): ], dtype=np.float32) # Line outline - outline = np.vstack([rectangle, rectangle[0]]) - rect_item = gl.GLLinePlotItem(pos=outline, color=(1, 0, 0, 1), width=2, mode='line_strip') - self.view.addItem(rect_item) + # outline = np.vstack([rectangle, rectangle[0]]) + # rect_item = gl.GLLinePlotItem(pos=outline, color=(1, 0, 0, 1), width=2, mode='line_strip') + # self.view.addItem(rect_item) # Fill with GLMeshItem faces = np.array([ @@ -43,7 +59,7 @@ def __init__(self): mesh_item = gl.GLMeshItem( vertexes=rectangle, faces=faces, - faceColors=np.array([[0, 0.7, 0.9, 0.6], [0, 0.7, 0.9, 0.6]]), + faceColors=np.array([[0, 0.7, 0.9, 1.0], [0, 0.7, 0.9, 1.0]]), smooth=False, drawEdges=False ) @@ -51,6 +67,8 @@ def __init__(self): # FPS label self.fps_label = QtWidgets.QLabel(self) + font = QtGui.QFont("Courier New", 14, QtGui.QFont.Weight.Bold) + self.fps_label.setFont(font) self.fps_label.setStyleSheet("color: white; background-color: black; padding: 2px;") self.fps_label.move(10, 10) self.fps_label.resize(100, 20) @@ -59,10 +77,9 @@ def __init__(self): # Frame timer self.last_time = time.time() self.frame_count = 0 - - self.timer = QtCore.QTimer() - self.timer.timeout.connect(self.update_fps) - self.timer.start(0) + # self.timer = QtCore.QTimer() + # self.timer.timeout.connect(self._update_fps) + # self.timer.start(0) def _enable_pan_only(self): """Override GLViewWidget events to disable rotation and allow right-click panning.""" @@ -96,10 +113,11 @@ def mouseReleaseEvent(event): self.view.mouseMoveEvent = mouseMoveEvent self.view.mouseReleaseEvent = mouseReleaseEvent - def update_fps(self): + def _update_fps(self): self.frame_count += 1 now = time.time() elapsed = now - self.last_time + if elapsed >= 1.0: fps = self.frame_count / elapsed self.fps_label.setText(f"FPS: {fps:.1f}") diff --git a/examples/waypoint_follow.py b/examples/waypoint_follow.py index 19a0ba10..c17f3431 100644 --- a/examples/waypoint_follow.py +++ b/examples/waypoint_follow.py @@ -312,7 +312,7 @@ def main(): env = gym.make( "f1tenth_gym:f1tenth-v0", config={ - "map": "Spielberg_blank", + "map": "Spielberg", "num_agents": num_agents, "timestep": 0.01, "integrator_timestep": 0.01, diff --git a/f1tenth_gym/envs/rendering/__init__.py b/f1tenth_gym/envs/rendering/__init__.py index 28e3238e..f64d51d9 100644 --- a/f1tenth_gym/envs/rendering/__init__.py +++ b/f1tenth_gym/envs/rendering/__init__.py @@ -38,10 +38,10 @@ def make_renderer( if render_mode in ["rgb_array", "rgb_array_list"]: os.environ["QT_QPA_PLATFORM"] = "offscreen" from .rendering_pyqt import PyQtEnvRenderer as EnvRenderer - # elif render_spec.render_type == "pyqt6gl": - # if render_mode in ["rgb_array", "rgb_array_list"]: - # os.environ["QT_QPA_PLATFORM"] = "offscreen" - # from .rendering_pyqtgl import PyQtEnvRendererGL as EnvRenderer + elif render_spec.render_type == "pyqt6gl": + if render_mode in ["rgb_array", "rgb_array_list"]: + os.environ["QT_QPA_PLATFORM"] = "offscreen" + from .rendering_pyqtgl import PyQtEnvRendererGL as EnvRenderer else: raise ValueError(f"Unknown render type: {render_spec.render_type}") diff --git a/f1tenth_gym/envs/rendering/pyqtgl_objects.py b/f1tenth_gym/envs/rendering/pyqtgl_objects.py index 092fabdf..beb4e434 100644 --- a/f1tenth_gym/envs/rendering/pyqtgl_objects.py +++ b/f1tenth_gym/envs/rendering/pyqtgl_objects.py @@ -1,373 +1,183 @@ from __future__ import annotations import numpy as np -# from PyQt6.QtWidgets import QGraphicsRectItem, QGraphicsPolygonItem -# from PyQt6 import QtGui -from pyqtgraph.opengl import GLLinePlotItem +import pyqtgraph.opengl as gl from .renderer import RenderSpec, EnvRenderer, ObjectRenderer -from ..collision_models import get_vertices, get_trmtx from typing import Optional, Any -from numba import njit - -class LinesRenderer(ObjectRenderer): - def __init__( - self, - env_renderer: EnvRenderer, - points: list | np.ndarray, - color: Optional[tuple[int, int, int]] = (0, 0, 255), - size: Optional[int] = 1 - ): - pen = pg.mkPen(color=pg.mkColor(*color), width=size) - self.renderer = env_renderer.canvas.plot( - points[:, 0], points[:, 1], pen=pen, fillLevel=None, antialias=True - ) - - def update(self, points: list | np.ndarray) -> None: - self.renderer.updateItems(points) - -class ClosedLinesRenderer(ObjectRenderer): - def __init__( - self, - env_renderer: EnvRenderer, - points: list | np.ndarray, - color: Optional[tuple[int, int, int]] = (0, 0, 255), - size: Optional[int] = 1 - ): - # Append the first point to the end to close the loop - points = np.vstack([points, points[0]]) - pen = pg.mkPen(color=pg.mkColor(*color), width=size) - pen.setCapStyle(pg.QtCore.Qt.PenCapStyle.RoundCap) - pen.setJoinStyle(pg.QtCore.Qt.PenJoinStyle.RoundJoin) - self.renderer = env_renderer.canvas.plot( - points[:, 0], points[:, 1], pen=pen, cosmetic=True, antialias=True - ) ## setting pen=None disables line drawing - - def update(self, points: list | np.ndarray) -> None: - self.renderer.updateItems(points) - -class PointsRenderer(ObjectRenderer): - def __init__( - self, - env_renderer: EnvRenderer, - points: list | np.ndarray, - color: Optional[tuple[int, int, int]] = (0, 0, 255), - size: Optional[int] = 1 - ): - self.renderer = env_renderer.canvas.plot( - points[:, 0], - points[:, 1], - pen=None, - symbol="o", - symbolPen=pg.mkPen(color=color, width=0), - symbolBrush=pg.mkBrush(color=color, width=0), - symbolSize=size, - ) - - def update(self, points: list | np.ndarray) -> None: - self.renderer.setData(points) - - -class TextRenderer(ObjectRenderer): - """ - Class to display text on the screen at a given position. - - Attributes - ---------- - font : pygame.font.Font - font object - position : str | tuple - position of the text on the screen - text : pygame.Surface - text surface to be displayed - """ - def __init__( - self, - position: str | tuple, - relative_font_size: int = 16, - font_name: str = "Arial", - parent: pg.PlotWidget = None, - ) -> None: - """ - Initialize text object. - - Parameters - ---------- - position : str | tuple - position of the text on the screen - relative_font_size : int, optional - font size relative to the window shape, by default 32 - font_name : str, optional - font name, by default "Arial" - """ - self.position = position - self.text_label = pg.LabelItem("", parent=parent, size=str(relative_font_size) + 'pt', family=font_name, color=(125, 125, 125)) # create text label - # Get the position and offset of the text - position_tuple = self._position_resolver(self.position) - offset_tuple = self._offset_resolver(self.position, self.text_label) - # Set the position and offset of the text - self.text_label.anchor(itemPos=position_tuple, parentPos=position_tuple, offset=offset_tuple) - - def _position_resolver( - self, position: str | tuple[int, int] - ) -> tuple[int, int]: - """ - This function takes strings like "bottom center" and converts them into a location for the text to be displayed. - If position is tuple, then passthrough. - - Parameters - ---------- - position : str | tuple - position of the text on the screen - - Returns - ------- - tuple - position of the text on the screen - - Raises - ------ - ValueError - if position is not a tuple or a string - NotImplementedError - if position is a string but not implemented - """ - if isinstance(position, tuple) and len(position) == 2: - return int(position[0]), int(position[1]) - elif isinstance(position, str): - position = position.lower() - if position == "bottom_right": - return (1, 1) - elif position == "bottom_left": - return (0, 1) - elif position == "bottom_center": - return (0.5, 1) - elif position == "top_right": - return (1, 0) - elif position == "top_left": - return (0, 0) - elif position == "top_center": - return (0.5, 0) - else: - raise NotImplementedError(f"Position {position} not implemented.") - else: - raise ValueError( - f"Position expected to be a tuple[int, int] or a string. Got {position}." - ) - - def _offset_resolver( - self, position: str | tuple[int, int], text_label: pg.LabelItem - ) -> tuple[int, int]: - """ - This function takes strings like "bottom center" and converts them into a location for the text to be displayed. - If position is tuple, then passthrough. - - Parameters - ---------- - position : str | tuple - position of the text on the screen - - Returns - ------- - tuple - position of the text on the screen - - Raises - ------ - ValueError - if position is not a tuple or a string - NotImplementedError - if position is a string but not implemented - """ - if isinstance(position, tuple) and len(position) == 2: - return int(position[0]), int(position[1]) - elif isinstance(position, str): - position = position.lower() - if position == "bottom_right": - return (-text_label.width(), 0) - elif position == "bottom_left": - return (0, 0) - elif position == "bottom_center": - return (-text_label.width()/2, 0) - elif position == "top_right": - return (-text_label.width(), 0) - elif position == "top_left": - return (0, 0) - elif position == "top_center": - return (-text_label.width()/2, 0) - else: - raise NotImplementedError(f"Position {position} not implemented.") - else: - raise ValueError( - f"Position expected to be a tuple[int, int] or a string. Got {position}." - ) - - def update(self) -> None: - pass - - def render(self, text: str) -> None: - """ - Render text on the screen. - - Parameters - ---------- - text : str - text to be displayed - """ - self.text_label.setText(text) - -class CarRendererGL: +class CarRenderer(ObjectRenderer): """ - Car renderer using PyQtGraph OpenGL backend. + Class to display the car. """ def __init__( self, - render_spec, + env_renderer: EnvRenderer, + render_spec: RenderSpec, map_origin: tuple[float, float], resolution: float, car_length: float, car_width: float, - color: Optional[list[int]] = None, - wheel_size: float = 0.2, - parent=None, # parent is GLViewWidget + color: list[int] | None = None, + wheel_size: float = 0.2 ): self.car_length = car_length self.car_width = car_width self.wheel_size = wheel_size self.car_thickness = render_spec.car_tickness self.show_wheels = render_spec.show_wheels + self.rgba = [c / 255 for c in color] + [1.0] + self.rgba = np.array([self.rgba] * 2) + + # Define centered rectangle in local coords + hl = self.car_length / 2 # half-length + hw = self.car_width / 2 # half-width + self.base_rect = np.array([ + [-hl, -hw, 0], + [ hl, -hw, 0], + [ hl, hw, 0], + [-hl, hw, 0], + ], dtype=np.float32) + self.faces = np.array([[0, 1, 2], [0, 2, 3]]) + self.mesh = gl.GLMeshItem( + vertexes=self.base_rect, + faces=self.faces, + faceColors=self.rgba, + smooth=False, + drawEdges=False, + edgeColor=(0, 0, 0, 1) + ) + env_renderer.view.addItem(self.mesh) self.origin = map_origin self.resolution = resolution - self.color = color or (0, 0, 0) + + self.color = color self.pose = (0, 0, 0) self.steering = 0 + # Tire params need to be updated self.tire_width = 0.1 self.tire_length = self.wheel_size - - # Construct chassis - vertices = self._get_chassis_vertices(self.pose) - self.chassis = GLLinePlotItem( - pos=vertices, - color=self._color_rgba(self.color), - width=self.car_thickness, - antialias=True, - mode='line_strip' + + def apply_pose(self, pose): + x, y, yaw = pose + c, s = np.cos(yaw), np.sin(yaw) + R = np.array([ + [c, -s, 0], + [s, c, 0], + [0, 0, 1] + ]) + return (self.base_rect @ R.T) + np.array([x, y, 0.01]) + + def update(self, obs: dict[str, np.ndarray], id: str): + state = obs[id]["std_state"].astype(float) + self.pose = ( + state[0], + state[1], + state[4], ) - parent.addItem(self.chassis) - - # Optional wheels - if self.show_wheels: - fl = self._get_tire_vertices(self.pose, 'fl', self.steering) - self.fl_wheel = GLLinePlotItem( - pos=fl, - color=(0, 0, 0, 1), - width=self.car_thickness, - antialias=True, - mode='line_strip' - ) - parent.addItem(self.fl_wheel) - - fr = self._get_tire_vertices(self.pose, 'fr', self.steering) - self.fr_wheel = GLLinePlotItem( - pos=fr, - color=(0, 0, 0, 1), - width=self.car_thickness, - antialias=True, - mode='line_strip' - ) - parent.addItem(self.fr_wheel) - - def update(self, obs: dict, agent_id: str): - state = obs[agent_id]["std_state"].astype(float) - self.pose = (state[0], state[1], state[4]) - if obs[agent_id]["collision"] > 0: - self.color = (255, 0, 0) + if obs[id]["collision"] > 0: + color = (255, 0, 0) + self.rgba = [c / 255 for c in color] + [1.0] + self.rgba = np.array([self.rgba] * 2) self.steering = state[2] - + def render(self): - vertices = self._get_chassis_vertices(self.pose) - self.chassis.setData(pos=vertices) - - if self.show_wheels: - self.fl_wheel.setData(pos=self._get_tire_vertices(self.pose, 'fl', self.steering)) - self.fr_wheel.setData(pos=self._get_tire_vertices(self.pose, 'fr', self.steering)) + # pass + transformed = self.apply_pose(self.pose) + self.mesh.setMeshData(vertexes=transformed, + faces=self.faces, + faceColors=self.rgba, + smooth=False, + drawEdges=False,) - def _get_chassis_vertices(self, pose): - verts = get_vertices(pose, self.car_length, self.car_width) - verts = np.array([verts[0], verts[3], verts[2], verts[1], verts[0]]) # closed loop - verts = np.hstack([verts, np.zeros((verts.shape[0], 1))]) # z=0 - return verts - - def _get_tire_vertices(self, pose, wheel_pos, steering): - verts = _get_tire_vertices( - pose, self.car_length, self.car_width, - self.tire_width, self.tire_length, - wheel_pos, steering +class LinesRenderer(ObjectRenderer): + def __init__( + self, + env_renderer: EnvRenderer, + points: list | np.ndarray, + color: Optional[tuple[int, int, int]] = (0, 0, 255), + size: Optional[int] = 1 + ): + # Convert to 3D (z=0) + self.points3d = np.hstack([points, np.zeros((points.shape[0], 1))]) + + # Normalize color + rgba = tuple([c / 255 for c in color] + [1.0]) + + # Create the OpenGL line loop + self.line = gl.GLLinePlotItem( + pos=self.points3d, + color=rgba, + width=size, + mode='line_strip', + antialias=False, ) - verts = np.vstack([verts, verts[0]]) # close loop - verts = np.hstack([verts, np.zeros((verts.shape[0], 1))]) - return verts - - def _color_rgba(self, rgb): - return (rgb[0] / 255, rgb[1] / 255, rgb[2] / 255, 1.0) - - + self.line.setGLOptions('translucent') + env_renderer.view.addItem(self.line) - -@njit(cache=True) -def _get_tire_vertices(pose, length, width, tire_width, tire_length, index, steering): - """ - Utility function to return vertices of the car's tire given pose and size - - Args: - pose (np.ndarray, (3, )): current world coordinate pose of the vehicle - length (float): car length - width (float): car width - - Returns: - vertices (np.ndarray, (4, 2)): corner vertices of the vehicle body - """ - pose_arr = np.array(pose) - if index == 'fl': - # Shift back, rotate - H_shift = get_trmtx(np.array([-(length/2 - tire_length/2), -(width/2 - tire_width/2), 0])) - H_steer = get_trmtx(np.array([0, 0, steering])) - H_back = get_trmtx(np.array([length/2 - tire_length/2, width/2 - tire_width/2, 0])) - H = get_trmtx(pose_arr) - H = H.dot(H_back).dot(H_steer).dot(H_shift) - fl = H.dot(np.asarray([[length / 2], [width / 2], [0.0], [1.0]])).flatten() - fr = H.dot(np.asarray([[length / 2], [width / 2 - tire_width], [0.0], [1.0]])).flatten() - rr = H.dot(np.asarray([[length / 2 - tire_length], [width / 2 - tire_width], [0.0], [1.0]])).flatten() - rl = H.dot(np.asarray([[length / 2 - tire_length], [width / 2], [0.0], [1.0]])).flatten() - rl = rl / rl[3] - rr = rr / rr[3] - fl = fl / fl[3] - fr = fr / fr[3] - vertices = np.asarray( - [[rl[0], rl[1]], [fl[0], fl[1]], [fr[0], fr[1]], [rr[0], rr[1]], [rl[0], rl[1]]] + def update(self, points: np.ndarray): + self.points3d = np.hstack([points, np.zeros((points.shape[0], 1))]) + self.line.setData(pos=self.points3d) + +class ClosedLinesRenderer(ObjectRenderer): + def __init__( + self, + env_renderer: EnvRenderer, + points: np.ndarray, + color: tuple[int, int, int] = (0, 0, 255), + size: float = 2.0 + ): + # Ensure loop is closed + if not np.array_equal(points[0], points[-1]): + points = np.vstack([points, points[0]]) + + # Convert to 3D (z=0) + self.points3d = np.hstack([points, np.ones((points.shape[0], 1)) * 0.01]) + + # Normalize color + rgba = tuple([c / 255 for c in color] + [1.0]) + + # Create the OpenGL line loop + self.line = gl.GLLinePlotItem( + pos=self.points3d, + color=rgba, + width=size, + mode='line_strip', + antialias=False, ) - elif index == 'fr': - # Shift back, rotate - H_shift = get_trmtx(np.array([-(length/2 - tire_length/2), -(-width/2 + tire_width/2), 0])) - H_steer = get_trmtx(np.array([0, 0, steering])) - H_back = get_trmtx(np.array([length/2 - tire_length/2, -width/2 + tire_width/2, 0])) - H = get_trmtx(pose_arr) - H = H.dot(H_back).dot(H_steer).dot(H_shift) + self.line.setGLOptions('translucent') + env_renderer.view.addItem(self.line) + + def update(self, points: np.ndarray): + if not np.array_equal(points[0], points[-1]): + points = np.vstack([points, points[0]]) + self.points3d = np.hstack([points, np.ones((points.shape[0], 1)) * 0.01]) + self.line.setData(pos=self.points3d) - fl = H.dot(np.asarray([[length / 2], [-width / 2 + tire_width], [0.0], [1.0]])).flatten() - fr = H.dot(np.asarray([[length / 2], [-width / 2], [0.0], [1.0]])).flatten() - rr = H.dot(np.asarray([[length / 2 - tire_length], [-width / 2], [0.0], [1.0]])).flatten() - rl = H.dot(np.asarray([[length / 2 - tire_length], [-width / 2 + tire_width], [0.0], [1.0]])).flatten() - rl = rl / rl[3] - rr = rr / rr[3] - fl = fl / fl[3] - fr = fr / fr[3] - # As it is only used for rendering, we can reorder the vertices and append the first point to close the polygon - vertices = np.asarray( - [[rl[0], rl[1]], [fl[0], fl[1]], [fr[0], fr[1]], [rr[0], rr[1]], [rl[0], rl[1]]] +class PointsRenderer(ObjectRenderer): + def __init__( + self, + env_renderer: EnvRenderer, + points: np.ndarray, + color: tuple[int, int, int] = (0, 0, 255), + size: int = 5 + ): + # Normalize color to (0–1) + color_rgba = tuple([c / 255 for c in color] + [1.0]) + + # Convert to 3D + self.points = np.hstack([points, np.ones((points.shape[0], 1)) * 0.01]) # z = 0 + self.scatter = gl.GLScatterPlotItem( + pos=self.points, + color=color_rgba, + size=size, + pxMode=True, # Use pixel-based sizing ) + self.scatter.setGLOptions('translucent') + env_renderer.view.addItem(self.scatter) - return vertices \ No newline at end of file + def update(self, points: np.ndarray): + self.points = np.hstack([points, np.ones((points.shape[0], 1)) * 0.01]) + self.scatter.setData(pos=self.points) diff --git a/f1tenth_gym/envs/rendering/rendering.yaml b/f1tenth_gym/envs/rendering/rendering.yaml index 3c7c783c..911b9df8 100644 --- a/f1tenth_gym/envs/rendering/rendering.yaml +++ b/f1tenth_gym/envs/rendering/rendering.yaml @@ -4,7 +4,7 @@ zoom_in_factor: 0.5 # [float] zoom in factor. 1.0 is no zoom, >1.0 is zoom in, show_wheels: True # [bool] it toggles the visualization of the vehicle wheels car_tickness: 1 # [px] thickness of the car show_info: True # [bool] it toggles the visualization of the instruction text -render_type: "pyqt6" # [str] rendering type. Options: "pygame", "pyqt6" NOTE: pygame not supported until reimplemented +render_type: "pyqt6gl" # [str] rendering type. Options: "pygame", "pyqt6" NOTE: pygame not supported until reimplemented vehicle_palette: # [list] cyclic list of colors for the vehicles - "#984ea3" - "#e41a1c" diff --git a/f1tenth_gym/envs/rendering/rendering_pyqt.py b/f1tenth_gym/envs/rendering/rendering_pyqt.py index c4a73e09..14b08904 100644 --- a/f1tenth_gym/envs/rendering/rendering_pyqt.py +++ b/f1tenth_gym/envs/rendering/rendering_pyqt.py @@ -19,18 +19,6 @@ # one-line instructions visualized at the top of the screen (if show_info=True) INSTRUCTION_TEXT = "Mouse click (L/M/R): Change POV - 'S' key: On/Off" -# import sys -# import warnings - -# def warn_with_traceback(message, category, filename, lineno, file=None, line=None): -# import traceback -# log = file if hasattr(file, 'write') else sys.stderr -# traceback.print_stack(file=log) -# warnings.defaultaction = 'always' -# return warnings.showwarning(message, category, filename, lineno, file, line) - -# warnings.showwarning = warn_with_traceback - # Replicated from pyqtgraphs' example utils for ci pipelines to pass from time import perf_counter class FrameCounter(QtCore.QObject): @@ -252,7 +240,7 @@ def key_pressed(self, event: QtGui.QKeyEvent) -> None: if event.key() == QtCore.Qt.Key.Key_S: logging.debug("Pressed S key -> Enable/disable rendering") self.draw_flag = not self.draw_flag - self.draw_flag_changed = True + # self.draw_flag_changed = True def mouse_clicked(self, event: QtGui.QMouseEvent) -> None: """ diff --git a/f1tenth_gym/envs/rendering/rendering_pyqtgl.py b/f1tenth_gym/envs/rendering/rendering_pyqtgl.py index fc80b18d..3ad2e5ee 100644 --- a/f1tenth_gym/envs/rendering/rendering_pyqtgl.py +++ b/f1tenth_gym/envs/rendering/rendering_pyqtgl.py @@ -1,76 +1,194 @@ +import time import pyqtgraph.opengl as gl -from pyqtgraph.Qt import QtWidgets, QtGui -from PyQt6 import QtCore +from PyQt6 import QtWidgets, QtCore, QtGui import numpy as np from ..track import Track -from .renderer import EnvRenderer, RenderSpec +from .renderer import EnvRenderer, RenderSpec, ObjectRenderer from PIL import ImageColor +from typing import Any, Callable, Optional +from .pyqtgl_objects import PointsRenderer, LinesRenderer, ClosedLinesRenderer, CarRenderer class PyQtEnvRendererGL(EnvRenderer): - def __init__(self, params, track, agent_ids, render_spec, render_mode, render_fps): + def __init__( + self, + params: dict[str, Any], + track: Track, + agent_ids: list[str], + render_spec: RenderSpec, + render_mode: str, + render_fps: int, + ): super().__init__() self.params = params self.agent_ids = agent_ids self.render_spec = render_spec self.render_mode = render_mode self.render_fps = render_fps - + + fmt = QtGui.QSurfaceFormat() + fmt.setSwapInterval(0) # 0 = no vsync, 1 = vsync + QtGui.QSurfaceFormat.setDefaultFormat(fmt) self.app = QtWidgets.QApplication.instance() or QtWidgets.QApplication([]) - self.window = gl.GLViewWidget() + self.view = gl.GLViewWidget() + camera_position = QtGui.QVector3D(0, 0, 0) + self.view.setCameraPosition(pos=camera_position, distance=40, elevation=90, azimuth=0) + self.window = QtWidgets.QMainWindow() + self.window.setCentralWidget(self.view) self.window.setWindowTitle("F1Tenth Gym - OpenGL") self.window.setGeometry(0, 0, self.render_spec.window_size, self.render_spec.window_size) - self.window.setCameraPosition(distance=40) - self.window.opts['center'] = QtGui.QVector3D(0, 0, 0) - self.window.show() - - self.cars = [] + + self._enable_pan_only() + self._init_map(track) + self._center_camera_on_map() + + # FPS label + text_rgb = (140, 140, 140) + self.fps_label = QtWidgets.QLabel(self.window) + font = QtGui.QFont("Arial", 14) + self.fps_label.setFont(font) + self.fps_label.setStyleSheet( + f"color: rgb({text_rgb[0]}, {text_rgb[1]}, {text_rgb[2]}); background-color: transparent; padding: 2px;" + ) + self.fps_label.move(10, 10) + self.fps_label.resize(100, 20) + self.fps_label.setAttribute(QtCore.Qt.WidgetAttribute.WA_TransparentForMouseEvents) + # self.fps_label.raise_() + self.fps_label.show() + + # Frame timer + self.last_time = time.time() + self.frame_count = 0 + + self.cars = None self.sim_time = None self.callbacks = [] - - # Load and transform map - self._init_map(track) + self.draw_flag = True + self.window.show() # Colors self.car_colors = [ tuple(ImageColor.getcolor(c, "RGB")) for c in render_spec.vehicle_palette ] - + def _init_map(self, track): - img = track.occupancy_map - img = np.stack([img]*3, axis=-1) - img = np.rot90(img, k=1) - img = np.flip(img, axis=0) + map_image = track.occupancy_map + map_image = np.rot90(map_image, k=1) + map_image = np.flip(map_image, axis=0) + self.map_image = map_image # Normalize image for OpenGL - img = img.astype(np.float32) / 255.0 - w, h = img.shape[:2] self.map_origin = track.spec.origin px, py = self.map_origin[0], self.map_origin[1] res = self.map_resolution = track.spec.resolution + + map_rgb = np.stack([map_image]*3, axis=-1) + alpha = np.ones((map_rgb.shape[0], map_rgb.shape[1], 1), dtype=np.uint8) * 255 + map_rgba = np.concatenate((map_rgb, alpha), axis=-1) + image_item = gl.GLImageItem(map_rgba) + image_item.translate(px, py, -0.01) # Slightly below the map + image_item.scale(res, res, 1) + image_item.setGLOptions('translucent') + self.view.addItem(image_item) + + def _get_map_bounds(self): + h, w = self.map_image.shape[:2] + sx, sy = self.map_resolution, self.map_resolution + ox, oy = self.map_origin[0], self.map_origin[1] + + min_xy = np.array([ox, oy]) + max_xy = np.array([ox + w * sx, oy + h * sy]) + return min_xy, max_xy + + def _center_camera_on_map(self): + min_xy, max_xy = self._get_map_bounds() + # Compute center and extent + center = (min_xy + max_xy) / 2 + extent = max(max_xy - min_xy) + # Fixed height above map + z = extent / 2 # or a constant like 30 + x, y = center + self.view.setCameraPosition( + pos=QtGui.QVector3D(x, y, z), # camera position + elevation=90, # top-down + azimuth=0 # no rotation + ) + + def _enable_pan_only(self): + """Override GLViewWidget events to disable rotation and allow right-click panning.""" + self.view.pan_active = False + self.view.pan_start = QtCore.QPoint() + + def mousePressEvent(event): + if event.button() == QtCore.Qt.MouseButton.LeftButton: + self.view.pan_active = True + self.view.pan_start = event.pos() + event.accept() + else: + event.ignore() + + def mouseMoveEvent(event): + if self.view.pan_active: + delta = event.pos() - self.view.pan_start + dx = -delta.y() * 0.08 + dy = -delta.x() * 0.08 + self.view.pan(dx, dy, 0) + self.view.pan_start = event.pos() + event.accept() + else: + event.ignore() + + def mouseReleaseEvent(event): + self.view.pan_active = False + event.accept() + + self.view.mousePressEvent = mousePressEvent + self.view.mouseMoveEvent = mouseMoveEvent + self.view.mouseReleaseEvent = mouseReleaseEvent + + def update(self, obs: dict) -> None: + """ + Update the simulation obs to be rendered. - self.map_item = gl.GLImageItem(img) - self.map_item.translate(px, py, 0) - self.map_item.scale(res, res, 1) - self.window.addItem(self.map_item) - - def update(self, state): - if not self.cars: - for i in range(len(self.agent_ids)): - color = self.car_colors[i % len(self.car_colors)] - car_item = gl.GLScatterPlotItem(pos=np.zeros((1, 3)), color=color + (1.0,), size=5) - self.window.addItem(car_item) - self.cars.append(car_item) - - for i, car in enumerate(self.cars): - x, y, _ = state["poses_x"][i], state["poses_y"][i], state["poses_theta"][i] - car.setData(pos=np.array([[x, y, 0]])) - - self.sim_time = state["sim_time"] + Parameters + ---------- + obs: simulation obs as dictionary + """ + if self.cars is None: + self.cars = [ + CarRenderer( + env_renderer=self, + car_length=self.params["length"], + car_width=self.params["width"], + color=self.car_colors[ic], + render_spec=self.render_spec, + map_origin=self.map_origin[:2], + resolution=self.map_resolution, + ) + for ic in range(len(self.agent_ids)) + ] + + # update cars obs and zoom level (updating points-per-unit) + for i, id in enumerate(self.agent_ids): + self.cars[i].update(obs, id) + + # update time + self.sim_time = obs[self.agent_ids[0]]["sim_time"] def render(self): - for callback in self.callbacks: - callback(self) - self.app.processEvents() + if self.draw_flag: + start_time = time.time() + self._update_fps() + # call callbacks + for callback_fn in self.callbacks: + callback_fn(self) + + # draw cars + for i in range(len(self.agent_ids)): + self.cars[i].render() + self.app.processEvents() + # elapsed = time.time() - start_time + # sleep_time = max(0.0, 1/self.render_fps - elapsed) + # time.sleep(sleep_time) def add_renderer_callback(self, callback_fn): """ @@ -82,23 +200,42 @@ def add_renderer_callback(self, callback_fn): callback function to be called at every rendering step """ self.callbacks.append(callback_fn) - - def render_points(self, points, color=(0, 0, 255), size=3): - color = [c / 255 for c in color] + [1.0] - pts = np.hstack([points, np.zeros((len(points), 1))]) - item = gl.GLScatterPlotItem(pos=pts, color=color, size=size) - self.window.addItem(item) - return item - - def render_lines(self, points, color=(0, 0, 255), size=2): - color = [c / 255 for c in color] + [1.0] - pts = np.hstack([points, np.zeros((len(points), 1))]) - item = gl.GLLinePlotItem(pos=pts, color=color, width=size, mode='line_strip') - self.window.addItem(item) - return item - - def render_closed_lines(self, points, color=(0, 0, 255), size=2): - return self.render_lines(np.vstack([points, points[0]]), color, size) + + def _update_fps(self): + self.frame_count += 1 + now = time.time() + elapsed = now - self.last_time + + if elapsed >= 1.0: + fps = self.frame_count / elapsed + self.fps_label.setText(f"FPS: {fps:.0f}") + self.last_time = now + self.frame_count = 0 + self.view.update() + + def get_points_renderer( + self, + points: list | np.ndarray, + color: Optional[tuple[int, int, int]] = (0, 0, 255), + size: Optional[int] = 1, + ) -> ObjectRenderer: + return PointsRenderer(self, points, color, size) + + def get_lines_renderer( + self, + points: list | np.ndarray, + color: Optional[tuple[int, int, int]] = (0, 0, 255), + size: Optional[int] = 1, + ) -> ObjectRenderer: + return LinesRenderer(self, points, color, size) + + def get_closed_lines_renderer( + self, + points: list | np.ndarray, + color: Optional[tuple[int, int, int]] = (0, 0, 255), + size: Optional[int] = 1, + ) -> ObjectRenderer: + return ClosedLinesRenderer(self, points, color, size) def close(self): self.window.close() diff --git a/f1tenth_gym/envs/track/raceline.py b/f1tenth_gym/envs/track/raceline.py index bb7558f5..d2dc18fb 100644 --- a/f1tenth_gym/envs/track/raceline.py +++ b/f1tenth_gym/envs/track/raceline.py @@ -192,6 +192,6 @@ def render_waypoints(self, e: EnvRenderer) -> None: """ points = np.stack([self.xs, self.ys], axis=1) if self.waypoint_renderer is None: - self.waypoint_renderer = e.get_closed_lines_renderer(points, color=(0, 128, 0), size=2) + self.waypoint_renderer = e.get_closed_lines_renderer(points, color=(0, 255, 0), size=2) else: self.waypoint_renderer.update(points) From 886ff482308127296f4044ffea53460618563039 Mon Sep 17 00:00:00 2001 From: zzangupenn Date: Tue, 10 Jun 2025 01:15:03 -0400 Subject: [PATCH 13/54] add middle and right button event --- f1tenth_gym/envs/rendering/__init__.py | 4 +- f1tenth_gym/envs/rendering/pyqtgl_objects.py | 13 +-- f1tenth_gym/envs/rendering/renderer.py | 75 ++++++++------- f1tenth_gym/envs/rendering/rendering.yaml | 5 +- .../envs/rendering/rendering_pyqtgl.py | 91 +++++++++++++------ 5 files changed, 118 insertions(+), 70 deletions(-) diff --git a/f1tenth_gym/envs/rendering/__init__.py b/f1tenth_gym/envs/rendering/__init__.py index f64d51d9..1de8b0b5 100644 --- a/f1tenth_gym/envs/rendering/__init__.py +++ b/f1tenth_gym/envs/rendering/__init__.py @@ -30,7 +30,9 @@ def make_renderer( rendering frames per second, by default 100 """ cfg_file = pathlib.Path(__file__).parent.absolute() / "rendering.yaml" - render_spec = RenderSpec.from_yaml(cfg_file) + + render_spec = RenderSpec() + render_spec.from_yaml(cfg_file) if render_spec.render_type == "pygame": from .rendering_pygame import PygameEnvRenderer as EnvRenderer diff --git a/f1tenth_gym/envs/rendering/pyqtgl_objects.py b/f1tenth_gym/envs/rendering/pyqtgl_objects.py index beb4e434..8c1eb9ee 100644 --- a/f1tenth_gym/envs/rendering/pyqtgl_objects.py +++ b/f1tenth_gym/envs/rendering/pyqtgl_objects.py @@ -30,8 +30,8 @@ def __init__( self.rgba = np.array([self.rgba] * 2) # Define centered rectangle in local coords - hl = self.car_length / 2 # half-length - hw = self.car_width / 2 # half-width + hl = self.car_length / 2 # half-length + hw = self.car_width / 2 # half-width self.base_rect = np.array([ [-hl, -hw, 0], [ hl, -hw, 0], @@ -59,8 +59,9 @@ def __init__( # Tire params need to be updated self.tire_width = 0.1 self.tire_length = self.wheel_size + - def apply_pose(self, pose): + def apply_pose(self, pose, scale=1.0): x, y, yaw = pose c, s = np.cos(yaw), np.sin(yaw) R = np.array([ @@ -68,7 +69,7 @@ def apply_pose(self, pose): [s, c, 0], [0, 0, 1] ]) - return (self.base_rect @ R.T) + np.array([x, y, 0.01]) + return ((self.base_rect * scale) @ R.T) + np.array([x, y, 0.01]) def update(self, obs: dict[str, np.ndarray], id: str): state = obs[id]["std_state"].astype(float) @@ -83,9 +84,9 @@ def update(self, obs: dict[str, np.ndarray], id: str): self.rgba = np.array([self.rgba] * 2) self.steering = state[2] - def render(self): + def render(self, scale=1.0): # pass - transformed = self.apply_pose(self.pose) + transformed = self.apply_pose(self.pose, scale) self.mesh.setMeshData(vertexes=transformed, faces=self.faces, faceColors=self.rgba, diff --git a/f1tenth_gym/envs/rendering/renderer.py b/f1tenth_gym/envs/rendering/renderer.py index d4bd81a1..7ac101f9 100644 --- a/f1tenth_gym/envs/rendering/renderer.py +++ b/f1tenth_gym/envs/rendering/renderer.py @@ -7,18 +7,50 @@ import numpy as np import yaml +class ConfigYAML: + """ + Config class for yaml file + Able to load and save yaml file to and from python object + """ + def __init__(self) -> None: + pass + + def load_file(self, filename): + self.d = yaml.safe_load(pathlib.Path(filename).read_text()) + for key in self.d: + setattr(self, key, self.d[key]) + + def from_yaml(self, filename): + self.d = yaml.safe_load(pathlib.Path(filename).read_text()) + for key in self.d: + setattr(self, key, self.d[key]) + + def save_file(self, filename): + d = vars(self) + class_d = vars(self.__class__) + d_out = {} + for key in list(class_d.keys()): + if not (key.startswith('__') or \ + key.startswith('load_file') or \ + key.startswith('save_file')): + if isinstance(class_d[key], np.ndarray): + d_out[key] = class_d[key].tolist() + else: + d_out[key] = class_d[key] + for key in list(d.keys()): + if not (key.startswith('__') or \ + key.startswith('load_file') or \ + key.startswith('save_file')): + if isinstance(d[key], np.ndarray): + d_out[key] = d[key].tolist() + else: + d_out[key] = d[key] + with open(filename, 'w+') as ff: + yaml.dump_all([d_out], ff) -@dataclass -class RenderSpec: - window_size: int - zoom_in_factor: float - focus_on: str - car_tickness: int - show_wheels: bool - show_info: Optional[bool] = True - vehicle_palette: Optional[list[str]] = None - render_type: Optional[str] = "pygame" +@dataclass +class RenderSpec(ConfigYAML): def __init__( self, window_size: int = 800, @@ -59,29 +91,6 @@ def __init__( self.vehicle_palette = vehicle_palette or ["#984ea3"] self.render_type = render_type - @staticmethod - def from_yaml(yaml_file: str | pathlib.Path): - """ - Load rendering specification from a yaml file. - - Parameters - ---------- - yaml_file : str | pathlib.Path - path to the yaml file - - Returns - ------- - RenderSpec - rendering specification object - """ - with open(yaml_file, "r") as yaml_stream: - try: - config = yaml.safe_load(yaml_stream) - except yaml.YAMLError as ex: - print(ex) - return RenderSpec(**config) - - class EnvRenderer(ABC): """ Abstract class for rendering the environment. diff --git a/f1tenth_gym/envs/rendering/rendering.yaml b/f1tenth_gym/envs/rendering/rendering.yaml index 911b9df8..d10e7946 100644 --- a/f1tenth_gym/envs/rendering/rendering.yaml +++ b/f1tenth_gym/envs/rendering/rendering.yaml @@ -1,11 +1,14 @@ window_size: 800 # [px] width and height of the window focus_on: agent_0 # [str] agent id to focus on (e.g., agent_0) or null for map view zoom_in_factor: 0.5 # [float] zoom in factor. 1.0 is no zoom, >1.0 is zoom in, <1.0 is zoom out +bigger_car_when_map_centered: True # [bool] it toggles the size of the car when centered in the map show_wheels: True # [bool] it toggles the visualization of the vehicle wheels car_tickness: 1 # [px] thickness of the car show_info: True # [bool] it toggles the visualization of the instruction text -render_type: "pyqt6gl" # [str] rendering type. Options: "pygame", "pyqt6" NOTE: pygame not supported until reimplemented +render_type: "pyqt6gl" # [str] rendering type. Options: "pyqt6gl", "pyqt6" NOTE: pygame not supported until reimplemented vehicle_palette: # [list] cyclic list of colors for the vehicles + - "#FD3754" + - "#377eb8" - "#984ea3" - "#e41a1c" - "#ff7f00" diff --git a/f1tenth_gym/envs/rendering/rendering_pyqtgl.py b/f1tenth_gym/envs/rendering/rendering_pyqtgl.py index 3ad2e5ee..2ec6b497 100644 --- a/f1tenth_gym/envs/rendering/rendering_pyqtgl.py +++ b/f1tenth_gym/envs/rendering/rendering_pyqtgl.py @@ -1,4 +1,4 @@ -import time +import time, logging import pyqtgraph.opengl as gl from PyQt6 import QtWidgets, QtCore, QtGui import numpy as np @@ -24,14 +24,20 @@ def __init__( self.render_spec = render_spec self.render_mode = render_mode self.render_fps = render_fps + if render_spec.focus_on: + self.agent_to_follow_setting = self.agent_ids.index(render_spec.focus_on) + self.agent_to_follow = self.agent_ids.index(render_spec.focus_on) + else: + self.agent_to_follow = None + self.car_scale = 1.0 fmt = QtGui.QSurfaceFormat() fmt.setSwapInterval(0) # 0 = no vsync, 1 = vsync QtGui.QSurfaceFormat.setDefaultFormat(fmt) self.app = QtWidgets.QApplication.instance() or QtWidgets.QApplication([]) self.view = gl.GLViewWidget() - camera_position = QtGui.QVector3D(0, 0, 0) - self.view.setCameraPosition(pos=camera_position, distance=40, elevation=90, azimuth=0) + self.view.setCameraPosition(pos=QtGui.QVector3D(0, 0, 0), distance=20, elevation=90, azimuth=0) + self.view.setBackgroundColor((25, 25, 25)) self.window = QtWidgets.QMainWindow() self.window.setCentralWidget(self.view) self.window.setWindowTitle("F1Tenth Gym - OpenGL") @@ -39,21 +45,20 @@ def __init__( self._enable_pan_only() self._init_map(track) - self._center_camera_on_map() # FPS label - text_rgb = (140, 140, 140) - self.fps_label = QtWidgets.QLabel(self.window) - font = QtGui.QFont("Arial", 14) - self.fps_label.setFont(font) - self.fps_label.setStyleSheet( - f"color: rgb({text_rgb[0]}, {text_rgb[1]}, {text_rgb[2]}); background-color: transparent; padding: 2px;" - ) - self.fps_label.move(10, 10) - self.fps_label.resize(100, 20) - self.fps_label.setAttribute(QtCore.Qt.WidgetAttribute.WA_TransparentForMouseEvents) - # self.fps_label.raise_() - self.fps_label.show() + if self.render_mode in ["human", "human_fast"]: + text_rgb = (140, 140, 140) + self.fps_label = QtWidgets.QLabel(self.window) + font = QtGui.QFont("Arial", 14) + self.fps_label.setFont(font) + self.fps_label.setStyleSheet( + f"color: rgb({text_rgb[0]}, {text_rgb[1]}, {text_rgb[2]}); background-color: transparent; padding: 2px;" + ) + self.fps_label.move(10, 10) + self.fps_label.resize(100, 20) + self.fps_label.setAttribute(QtCore.Qt.WidgetAttribute.WA_TransparentForMouseEvents) + self.fps_label.show() # Frame timer self.last_time = time.time() @@ -88,13 +93,12 @@ def _init_map(self, track): image_item.translate(px, py, -0.01) # Slightly below the map image_item.scale(res, res, 1) image_item.setGLOptions('translucent') - self.view.addItem(image_item) + # self.view.addItem(image_item) def _get_map_bounds(self): h, w = self.map_image.shape[:2] sx, sy = self.map_resolution, self.map_resolution ox, oy = self.map_origin[0], self.map_origin[1] - min_xy = np.array([ox, oy]) max_xy = np.array([ox + w * sx, oy + h * sy]) return min_xy, max_xy @@ -104,11 +108,26 @@ def _center_camera_on_map(self): # Compute center and extent center = (min_xy + max_xy) / 2 extent = max(max_xy - min_xy) + # if self.config + self.car_scale = extent/self.params['width'] / 100 # Fixed height above map - z = extent / 2 # or a constant like 30 x, y = center self.view.setCameraPosition( - pos=QtGui.QVector3D(x, y, z), # camera position + pos=QtGui.QVector3D(x, y, 1), # camera position + distance=extent * 0.8, # zoom level + elevation=90, # top-down + azimuth=0 # no rotation + ) + + def _center_camera_on_car(self, car_idx=0, distance_reset=False): + x, y = self.cars[car_idx].pose[:2] # Get car position + self.car_scale = 1.0 + if distance_reset: + self.view.setCameraPosition( + distance=self.params['width'] * 50, # zoom level + ) + self.view.setCameraPosition( + pos=QtGui.QVector3D(x, y, 1), # camera position elevation=90, # top-down azimuth=0 # no rotation ) @@ -119,12 +138,21 @@ def _enable_pan_only(self): self.view.pan_start = QtCore.QPoint() def mousePressEvent(event): - if event.button() == QtCore.Qt.MouseButton.LeftButton: + if event.button() == QtCore.Qt.MouseButton.LeftButton: # NOTE: left button is used for panning self.view.pan_active = True self.view.pan_start = event.pos() event.accept() - else: - event.ignore() + if event.button() == QtCore.Qt.MouseButton.RightButton: + logging.debug("Pressed right button -> Follow Next agent") + if self.agent_to_follow is None: + self.agent_to_follow = 0 + else: + self.agent_to_follow = (self.agent_to_follow + 1) % len(self.agent_ids) + self._center_camera_on_car(self.agent_to_follow, distance_reset=True) + elif event.button() == QtCore.Qt.MouseButton.MiddleButton: + logging.debug("Pressed middle button -> Change to Map View") + self._center_camera_on_map() + self.agent_to_follow = None def mouseMoveEvent(event): if self.view.pan_active: @@ -177,18 +205,23 @@ def update(self, obs: dict) -> None: def render(self): if self.draw_flag: start_time = time.time() - self._update_fps() + # call callbacks for callback_fn in self.callbacks: callback_fn(self) - + if self.agent_to_follow is not None: + self._center_camera_on_car(self.agent_to_follow) # draw cars for i in range(len(self.agent_ids)): - self.cars[i].render() + self.cars[i].render(self.car_scale) + self.app.processEvents() - # elapsed = time.time() - start_time - # sleep_time = max(0.0, 1/self.render_fps - elapsed) - # time.sleep(sleep_time) + + if self.render_mode in ["human", "human_fast"]: + self._update_fps() + # elapsed = time.time() - start_time + # sleep_time = max(0.0, 1/self.render_fps - elapsed) + # time.sleep(sleep_time) def add_renderer_callback(self, callback_fn): """ From 56e6501d0fa781077b30e11df0184e1c515acb8c Mon Sep 17 00:00:00 2001 From: zzangupenn Date: Tue, 10 Jun 2025 01:21:47 -0400 Subject: [PATCH 14/54] can rotate --- f1tenth_gym/envs/rendering/rendering_pyqtgl.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/f1tenth_gym/envs/rendering/rendering_pyqtgl.py b/f1tenth_gym/envs/rendering/rendering_pyqtgl.py index 2ec6b497..670ccb90 100644 --- a/f1tenth_gym/envs/rendering/rendering_pyqtgl.py +++ b/f1tenth_gym/envs/rendering/rendering_pyqtgl.py @@ -43,7 +43,7 @@ def __init__( self.window.setWindowTitle("F1Tenth Gym - OpenGL") self.window.setGeometry(0, 0, self.render_spec.window_size, self.render_spec.window_size) - self._enable_pan_only() + # self._enable_pan_only() self._init_map(track) # FPS label @@ -93,7 +93,7 @@ def _init_map(self, track): image_item.translate(px, py, -0.01) # Slightly below the map image_item.scale(res, res, 1) image_item.setGLOptions('translucent') - # self.view.addItem(image_item) + self.view.addItem(image_item) def _get_map_bounds(self): h, w = self.map_image.shape[:2] @@ -209,8 +209,8 @@ def render(self): # call callbacks for callback_fn in self.callbacks: callback_fn(self) - if self.agent_to_follow is not None: - self._center_camera_on_car(self.agent_to_follow) + # if self.agent_to_follow is not None: + # self._center_camera_on_car(self.agent_to_follow) # draw cars for i in range(len(self.agent_ids)): self.cars[i].render(self.car_scale) From a11180985ef3537485b8fbbaab0a20cf33587bf2 Mon Sep 17 00:00:00 2001 From: zzangupenn Date: Tue, 10 Jun 2025 01:34:30 -0400 Subject: [PATCH 15/54] used ConfigYAML for RenderSpec --- f1tenth_gym/envs/rendering/rendering.yaml | 1 + f1tenth_gym/envs/rendering/rendering_pyqtgl.py | 15 ++++++++------- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/f1tenth_gym/envs/rendering/rendering.yaml b/f1tenth_gym/envs/rendering/rendering.yaml index d10e7946..a5d4ed6d 100644 --- a/f1tenth_gym/envs/rendering/rendering.yaml +++ b/f1tenth_gym/envs/rendering/rendering.yaml @@ -2,6 +2,7 @@ window_size: 800 # [px] width and height of the window focus_on: agent_0 # [str] agent id to focus on (e.g., agent_0) or null for map view zoom_in_factor: 0.5 # [float] zoom in factor. 1.0 is no zoom, >1.0 is zoom in, <1.0 is zoom out bigger_car_when_map_centered: True # [bool] it toggles the size of the car when centered in the map +render_map_img: True # [bool] it toggles the visualization of the map image show_wheels: True # [bool] it toggles the visualization of the vehicle wheels car_tickness: 1 # [px] thickness of the car show_info: True # [bool] it toggles the visualization of the instruction text diff --git a/f1tenth_gym/envs/rendering/rendering_pyqtgl.py b/f1tenth_gym/envs/rendering/rendering_pyqtgl.py index 670ccb90..0ac19655 100644 --- a/f1tenth_gym/envs/rendering/rendering_pyqtgl.py +++ b/f1tenth_gym/envs/rendering/rendering_pyqtgl.py @@ -43,7 +43,7 @@ def __init__( self.window.setWindowTitle("F1Tenth Gym - OpenGL") self.window.setGeometry(0, 0, self.render_spec.window_size, self.render_spec.window_size) - # self._enable_pan_only() + self._enable_pan_only() self._init_map(track) # FPS label @@ -89,11 +89,12 @@ def _init_map(self, track): map_rgb = np.stack([map_image]*3, axis=-1) alpha = np.ones((map_rgb.shape[0], map_rgb.shape[1], 1), dtype=np.uint8) * 255 map_rgba = np.concatenate((map_rgb, alpha), axis=-1) - image_item = gl.GLImageItem(map_rgba) + image_item = gl.GLImageItem(map_rgba, smooth=True) image_item.translate(px, py, -0.01) # Slightly below the map image_item.scale(res, res, 1) image_item.setGLOptions('translucent') - self.view.addItem(image_item) + if self.render_spec.render_map_img: + self.view.addItem(image_item) def _get_map_bounds(self): h, w = self.map_image.shape[:2] @@ -108,8 +109,8 @@ def _center_camera_on_map(self): # Compute center and extent center = (min_xy + max_xy) / 2 extent = max(max_xy - min_xy) - # if self.config - self.car_scale = extent/self.params['width'] / 100 + if self.render_spec.bigger_car_when_map_centered: + self.car_scale = extent/self.params['width'] / 120 # Fixed height above map x, y = center self.view.setCameraPosition( @@ -209,8 +210,8 @@ def render(self): # call callbacks for callback_fn in self.callbacks: callback_fn(self) - # if self.agent_to_follow is not None: - # self._center_camera_on_car(self.agent_to_follow) + if self.agent_to_follow is not None: + self._center_camera_on_car(self.agent_to_follow) # draw cars for i in range(len(self.agent_ids)): self.cars[i].render(self.car_scale) From de310ec2c88c645c40ee7d7a217a23c804c0e3ea Mon Sep 17 00:00:00 2001 From: zzangupenn Date: Wed, 11 Jun 2025 04:02:11 -0400 Subject: [PATCH 16/54] remove pygame, rewrote cubicspline2d init --- examples/waypoint_follow.py | 1 + f1tenth_gym/envs/f110_env.py | 2 +- f1tenth_gym/envs/rendering/__init__.py | 6 +- f1tenth_gym/envs/rendering/objects.py | 249 ----------- .../envs/rendering/rendering_pygame.py | 399 ------------------ f1tenth_gym/envs/track/cubic_spline.py | 85 +--- f1tenth_gym/envs/track/raceline.py | 2 + f1tenth_gym/envs/track/track.py | 13 +- pyproject.toml | 8 +- 9 files changed, 37 insertions(+), 728 deletions(-) delete mode 100644 f1tenth_gym/envs/rendering/objects.py delete mode 100644 f1tenth_gym/envs/rendering/rendering_pygame.py diff --git a/examples/waypoint_follow.py b/examples/waypoint_follow.py index c17f3431..5c9c6862 100644 --- a/examples/waypoint_follow.py +++ b/examples/waypoint_follow.py @@ -326,6 +326,7 @@ def main(): "map_scale": 1.0, "enable_rendering": 1, "enable_scan": 1, + "compute_frenet": 1, }, render_mode="human_fast", ) diff --git a/f1tenth_gym/envs/f110_env.py b/f1tenth_gym/envs/f110_env.py index 0a51c19a..c469627e 100644 --- a/f1tenth_gym/envs/f110_env.py +++ b/f1tenth_gym/envs/f110_env.py @@ -139,7 +139,6 @@ def __init__(self, config: dict = None, render_mode=None, **kwargs): model=self.model, action_type=self.action_type, ) - self.sim.set_map(self.map, self.config["map_scale"]) if isinstance(self.map, Track): self.track = self.map @@ -148,6 +147,7 @@ def __init__(self, config: dict = None, render_mode=None, **kwargs): self.map, track_scale=self.config["map_scale"], ) # load track in gym env for convenience + self.sim.set_map(self.track, self.config["map_scale"]) # observations self.agent_ids = [f"agent_{i}" for i in range(self.num_agents)] diff --git a/f1tenth_gym/envs/rendering/__init__.py b/f1tenth_gym/envs/rendering/__init__.py index 1de8b0b5..dee8db9c 100644 --- a/f1tenth_gym/envs/rendering/__init__.py +++ b/f1tenth_gym/envs/rendering/__init__.py @@ -34,9 +34,9 @@ def make_renderer( render_spec = RenderSpec() render_spec.from_yaml(cfg_file) - if render_spec.render_type == "pygame": - from .rendering_pygame import PygameEnvRenderer as EnvRenderer - elif render_spec.render_type == "pyqt6": + # if render_spec.render_type == "pygame": + # from .rendering_pygame import PygameEnvRenderer as EnvRenderer + if render_spec.render_type == "pyqt6": if render_mode in ["rgb_array", "rgb_array_list"]: os.environ["QT_QPA_PLATFORM"] = "offscreen" from .rendering_pyqt import PyQtEnvRenderer as EnvRenderer diff --git a/f1tenth_gym/envs/rendering/objects.py b/f1tenth_gym/envs/rendering/objects.py deleted file mode 100644 index 57f156d9..00000000 --- a/f1tenth_gym/envs/rendering/objects.py +++ /dev/null @@ -1,249 +0,0 @@ -from __future__ import annotations -import cv2 -import numpy as np -import pygame - -from ..collision_models import get_vertices -from . import RenderSpec - - -class TextObject: - """ - Class to display text on the screen at a given position. - - Attributes - ---------- - font : pygame.font.Font - font object - position : str | tuple - position of the text on the screen - text : pygame.Surface - text surface to be displayed - """ - - def __init__( - self, - window_shape: tuple[int, int], - position: str | tuple, - relative_font_size: int = 32, - font_name: str = "Arial", - ) -> None: - """ - Initialize text object. - - Parameters - ---------- - window_shape : tuple - shape of the window (width, height) in pixels - position : str | tuple - position of the text on the screen - relative_font_size : int, optional - font size relative to the window shape, by default 32 - font_name : str, optional - font name, by default "Arial" - """ - font_size = int(relative_font_size * window_shape[0] / 1000) - self.font = pygame.font.SysFont(font_name, font_size) - self.position = position - - self.text = self.font.render("", True, (125, 125, 125)) - - def _position_resolver( - self, position: str | tuple[int, int], display: pygame.Surface - ) -> tuple[int, int]: - """ - This function takes strings like "bottom center" and converts them into a location for the text to be displayed. - If position is tuple, then passthrough. - - Parameters - ---------- - position : str | tuple - position of the text on the screen - display : pygame.Surface - display surface - - Returns - ------- - tuple - position of the text on the screen - - Raises - ------ - ValueError - if position is not a tuple or a string - NotImplementedError - if position is a string but not implemented - """ - if isinstance(position, tuple) and len(position) == 2: - return int(position[0]), int(position[1]) - elif isinstance(position, str): - position = position.lower() - if position == "bottom_right": - display_width, display_height = ( - display.get_width(), - display.get_height(), - ) - text_width, text_height = self.text.get_width(), self.text.get_height() - bottom_right = ( - display_width - text_width, - display_height - text_height, - ) - return bottom_right - elif position == "bottom_left": - display_height = display.get_height() - text_height = self.text.get_height() - bottom_left = (0, display_height - text_height) - return bottom_left - elif position == "bottom_center": - display_width, display_height = ( - display.get_width(), - display.get_height(), - ) - text_width, text_height = self.text.get_width(), self.text.get_height() - bottom_center = ( - (display_width - text_width) // 2, - display_height - text_height, - ) - return bottom_center - elif position == "top_right": - display_width = display.get_width() - text_width = self.text.get_width() - top_right = (display_width - text_width, 0) - return top_right - elif position == "top_left": - top_left = (0, 0) - return top_left - elif position == "top_center": - display_width = display.get_width() - text_width = self.text.get_width() - top_center = ((display_width - text_width) // 2, 0) - return top_center - else: - raise NotImplementedError(f"Position {position} not implemented.") - else: - raise ValueError( - f"Position expected to be a tuple[int, int] or a string. Got {position}." - ) - - def render(self, text: str, display: pygame.Surface) -> None: - """ - Render text on the screen. - - Parameters - ---------- - text : str - text to be displayed - display : pygame.Surface - display surface - """ - self.text = self.font.render(text, True, (125, 125, 125)) - position_tuple = self._position_resolver(self.position, display) - display.blit(self.text, position_tuple) - - -class Map: - """ - Class to display the track map according to the desired zoom level. - """ - - def __init__(self, map_img: np.ndarray, zoom_level: float): - orig_width, orig_height = map_img.shape - scaled_width = int(orig_width * zoom_level) - scaled_height = int(orig_height * zoom_level) - map_img = cv2.resize( - map_img, dsize=(scaled_width, scaled_height), interpolation=cv2.INTER_AREA - ) - - # convert shape from (W, H) to (W, H, 3) - track_map = np.stack([map_img, map_img, map_img], axis=-1) - - # rotate and flip to match the track orientation - track_map = np.rot90(track_map, k=1) # rotate clockwise - track_map = np.flip(track_map, axis=0) # flip vertically - - self.track_map = track_map - self.map_surface = pygame.surfarray.make_surface(self.track_map) - - def render(self, display: pygame.Surface): - display.blit(self.map_surface, (0, 0)) - - -class Car: - """ - Class to display the car. - """ - - def __init__( - self, - render_spec: RenderSpec, - map_origin: tuple[float, float], - resolution: float, - ppu: float, - car_length: float, - car_width: float, - color: list[int] | None = None, - wheel_size: float = 0.2, - ): - self.car_length = car_length - self.car_width = car_width - self.wheel_size = wheel_size - self.car_tickness = render_spec.car_tickness - self.show_wheels = render_spec.show_wheels - - self.origin = map_origin - self.resolution = resolution - self.ppu = ppu - - self.color = color or (0, 0, 0) - self.pose = None - self.steering = None - self.rect = None - - def update(self, state: dict[str, np.ndarray], idx: int): - self.pose = ( - state["poses_x"][idx], - state["poses_y"][idx], - state["poses_theta"][idx], - ) - self.color = (255, 0, 0) if state["collisions"][idx] > 0 else self.color - self.steering = self.pose[2] + state["steering_angles"][idx] - - def render(self, display: pygame.Surface): - vertices = get_vertices(self.pose, self.car_length, self.car_width) - vertices[:, 0] = (vertices[:, 0] - self.origin[0]) / ( - self.resolution * self.ppu - ) - vertices[:, 1] = (vertices[:, 1] - self.origin[1]) / ( - self.resolution * self.ppu - ) - - self.rect = pygame.draw.polygon(display, self.color, vertices) - - pygame.draw.lines(display, (0, 0, 0), True, vertices, self.car_tickness) - - # draw two lines in proximity of the front wheels - # to indicate the steering angle - if self.show_wheels: - # percentage along the car length to draw the wheels segments - lam = 0.15 - - # find point at perc between front and back vertices - front_left = (vertices[0] * lam + vertices[3] * (1 - lam)).astype(int) - front_right = (vertices[1] * lam + vertices[2] * (1 - lam)).astype(int) - arrow_length = self.wheel_size / self.resolution - - for mid_point in [front_left, front_right]: - end_point = mid_point + 0.5 * arrow_length * np.array( - [np.cos(self.steering), np.sin(self.steering)] - ) - base_point = mid_point - 0.5 * arrow_length * np.array( - [np.cos(self.steering), np.sin(self.steering)] - ) - - pygame.draw.line( - display, - (0, 0, 0), - base_point.astype(int), - end_point.astype(int), - self.car_tickness + 1, - ) diff --git a/f1tenth_gym/envs/rendering/rendering_pygame.py b/f1tenth_gym/envs/rendering/rendering_pygame.py deleted file mode 100644 index e443b2d0..00000000 --- a/f1tenth_gym/envs/rendering/rendering_pygame.py +++ /dev/null @@ -1,399 +0,0 @@ -from __future__ import annotations -import logging -import math -from typing import Any, Callable, Optional - -import cv2 -import numpy as np -import pygame -from PIL import ImageColor - -from .objects import ( - Map, - Car, - TextObject, -) -from ..track import Track -from .renderer import EnvRenderer, RenderSpec - -# one-line instructions visualized at the top of the screen (if show_info=True) -INSTRUCTION_TEXT = "Mouse click (L/M/R): Change POV - 'S' key: On/Off" - - -class PygameEnvRenderer(EnvRenderer): - """ - Renderer of the environment using Pygame. - """ - - def __init__( - self, - params: dict[str, Any], - track: Track, - agent_ids: list[str], - render_spec: RenderSpec, - render_mode: str, - render_fps: int, - ): - """ - Initialize the Pygame renderer. - - Parameters - ---------- - params : dict - dictionary of simulation parameters (including vehicle dimensions, etc.) - track : Track - track object - agent_ids : list - list of agent ids to render - render_spec : RenderSpec - rendering specification - render_mode : str - rendering mode in ["human", "human_fast", "rgb_array"] - render_fps : int - number of frames per second - """ - super().__init__() - self.params = params - self.agent_ids = agent_ids - - self.cars = None - self.sim_time = None - self.window = None - self.canvas = None - - self.render_spec = render_spec - self.render_mode = render_mode - self.render_fps = render_fps - - colors_rgb = [ - [rgb for rgb in ImageColor.getcolor(c, "RGB")] - for c in render_spec.vehicle_palette - ] - self.car_colors = [ - colors_rgb[i % len(colors_rgb)] for i in range(len(self.agent_ids)) - ] - - width, height = render_spec.window_size, render_spec.window_size - - pygame.init() - if self.render_mode in ["human", "human_fast"]: - pygame.display.init() - pygame.event.set_allowed([]) - self.window = pygame.display.set_mode((width, height)) - self.window.fill((255, 255, 255)) # white background - - self.canvas = pygame.Surface((width, height)) - self.map_canvas = None - - # map metadata - self.map_origin = track.spec.origin - self.map_resolution = track.spec.resolution - - # fps and time renderer - self.clock = pygame.time.Clock() - self.fps_renderer = TextObject( - window_shape=(width, height), position="bottom_left" - ) - self.time_renderer = TextObject( - window_shape=(width, height), position="bottom_right" - ) - self.bottom_info_renderer = TextObject( - window_shape=(width, height), position="bottom_center" - ) - self.top_info_renderer = TextObject( - window_shape=(width, height), position="top_center" - ) - - # load map image - original_img = track.occupancy_map - - self.map_renderers = { - "map": Map(map_img=original_img, zoom_level=0.4), - "car": Map(map_img=original_img, zoom_level=render_spec.zoom_in_factor), - } - self.map_canvases = { - k: pygame.Surface((map_r.track_map.shape[0], map_r.track_map.shape[1])) - for k, map_r in self.map_renderers.items() - } - self.ppus = { - k: original_img.shape[0] / map_r.track_map.shape[0] - for k, map_r in self.map_renderers.items() - } - - # callbacks for custom visualization, called at every rendering step - self.callbacks = [] - - # event handling flags - self.draw_flag: bool = True - if render_spec.focus_on: - self.active_map_renderer = "car" - self.follow_agent_flag: bool = True - self.agent_to_follow: int = self.agent_ids.index(render_spec.focus_on) - else: - self.active_map_renderer = "map" - self.follow_agent_flag: bool = False - self.agent_to_follow: int = None - - def update(self, state: dict) -> None: - """ - Update the simulation state to be rendered. - - Parameters - ---------- - state: simulation state as dictionary - """ - if self.cars is None: - self.cars = [ - Car( - car_length=self.params["length"], - car_width=self.params["width"], - color=self.car_colors[ic], - render_spec=self.render_spec, - map_origin=self.map_origin[:2], - resolution=self.map_resolution, - ppu=self.ppus[self.active_map_renderer], - ) - for ic in range(len(self.agent_ids)) - ] - - # update cars state and zoom level (updating points-per-unit) - for i in range(len(self.agent_ids)): - self.cars[i].update(state, i) - self.cars[i].ppu = self.ppus[self.active_map_renderer] - - # update time - self.sim_time = state["sim_time"] - - def add_renderer_callback(self, callback_fn: Callable[[EnvRenderer], None]) -> None: - """ - Add a custom callback for visualization. - All the callbacks are called at every rendering step, after having rendered the map and the cars. - - Parameters - ---------- - callback_fn : Callable[[EnvRenderer], None] - callback function to be called at every rendering step - """ - self.callbacks.append(callback_fn) - - def render(self) -> Optional[np.ndarray]: - """ - Render the current state in a frame. - It renders in the order: map, cars, callbacks, info text. - - Returns - ------- - Optional[np.ndarray] - if render_mode is "rgb_array", returns the rendered frame as an array - """ - self.event_handling() - - self.canvas.fill((255, 255, 255)) # white background - self.map_canvas = self.map_canvases[self.active_map_renderer] - self.map_canvas.fill((255, 255, 255)) # white background - - if self.draw_flag: - self.map_renderers[self.active_map_renderer].render(self.map_canvas) - - # draw cars - for i in range(len(self.agent_ids)): - self.cars[i].render(self.map_canvas) - - # call callbacks - for callback_fn in self.callbacks: - callback_fn(self) - - surface_mod_rect = self.map_canvas.get_rect() - screen_rect = self.canvas.get_rect() - - if self.follow_agent_flag: - origin = self.map_origin - resolution = self.map_resolution * self.ppus[self.active_map_renderer] - ego_x, ego_y = self.cars[self.agent_to_follow].pose[:2] - cx = (ego_x - origin[0]) / resolution - cy = (ego_y - origin[1]) / resolution - else: - cx = self.map_canvas.get_width() / 2 - cy = self.map_canvas.get_height() / 2 - - surface_mod_rect.x = screen_rect.centerx - cx - surface_mod_rect.y = screen_rect.centery - cy - - self.canvas.blit(self.map_canvas, surface_mod_rect) - - agent_to_follow_id = ( - self.agent_ids[self.agent_to_follow] - if self.agent_to_follow is not None - else None - ) - self.bottom_info_renderer.render( - text=f"Focus on: {agent_to_follow_id}", display=self.canvas - ) - - if self.render_spec.show_info: - self.top_info_renderer.render(text=INSTRUCTION_TEXT, display=self.canvas) - self.time_renderer.render(text=f"{self.sim_time:.2f}", display=self.canvas) - - if self.render_mode in ["human", "human_fast"]: - assert self.window is not None - - self.fps_renderer.render( - text=f"FPS: {self.clock.get_fps():.2f}", display=self.canvas - ) - - self.window.blit(self.canvas, self.canvas.get_rect()) - - pygame.event.pump() - pygame.display.update() - - # We need to ensure that human-rendering occurs at the predefined framerate. - # The following line will automatically add a delay to keep the framerate stable. - self.clock.tick(self.render_fps) - else: # rgb_array - frame = np.transpose( - np.array(pygame.surfarray.pixels3d(self.canvas)), axes=(1, 0, 2) - ) - if frame.shape[0] > 2000: - frame = cv2.resize( - frame, dsize=(2000, 2000), interpolation=cv2.INTER_AREA - ) - return frame - - def event_handling(self) -> None: - """ - Handle interaction events to change point-of-view. - - Events: - - Left mouse button: follow next agent (according to agent_ids order) - - Right mouse button: follow previous agent - - Middle mouse button: change to map view - - S key: enable/disable rendering - """ - for event in pygame.event.get(): - if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1: - logging.debug("Pressed left button -> Follow Next agent") - - self.follow_agent_flag = True - if self.agent_to_follow is None: - self.agent_to_follow = 0 - else: - self.agent_to_follow = (self.agent_to_follow + 1) % len( - self.agent_ids - ) - - self.active_map_renderer = "car" - - elif event.type == pygame.MOUSEBUTTONDOWN and event.button == 3: - logging.debug("Pressed right button -> Follow Previous agent") - - self.follow_agent_flag = True - if self.agent_to_follow is None: - self.agent_to_follow = 0 - else: - self.agent_to_follow = (self.agent_to_follow - 1) % len( - self.agent_ids - ) - - self.active_map_renderer = "car" - - elif event.type == pygame.MOUSEBUTTONDOWN and event.button == 2: - logging.debug("Pressed middle button -> Change to Map View") - - self.follow_agent_flag = False - self.agent_to_follow = None - - self.active_map_renderer = "map" - - elif event.type == pygame.KEYDOWN and event.key == pygame.K_s: - logging.debug("Pressed S key -> Enable/disable rendering") - self.draw_flag = not (self.draw_flag) - - def render_points( - self, - points: list | np.ndarray, - color: Optional[tuple[int, int, int]] = (0, 0, 255), - size: Optional[int] = 1, - ) -> None: - """ - Render a sequence of xy points on screen. - - Parameters - ---------- - points : list | np.ndarray - list of points to render - color : Optional[tuple[int, int, int]], optional - color as rgb tuple, by default blue (0, 0, 255) - size : Optional[int], optional - size of the points in pixels, by default 1 - """ - origin = self.map_origin - ppu = self.ppus[self.active_map_renderer] - resolution = self.map_resolution * ppu - points = ((points - origin[:2]) / resolution).astype(int) - size = math.ceil(size / ppu) - - for point in points: - pygame.draw.circle(self.map_canvas, color, point, size) - - def render_lines( - self, - points: list | np.ndarray, - color: Optional[tuple[int, int, int]] = (0, 0, 255), - size: Optional[int] = 1, - ) -> None: - """ - Render a sequence of lines segments. - - Parameters - ---------- - points : list | np.ndarray - list of points to render - color : Optional[tuple[int, int, int]], optional - color as rgb tuple, by default blue (0, 0, 255) - size : Optional[int], optional - size of the line, by default 1 - """ - origin = self.map_origin - ppu = self.ppus[self.active_map_renderer] - resolution = self.map_resolution * ppu - points = ((points - origin[:2]) / resolution).astype(int) - size = math.ceil(size / ppu) - - pygame.draw.lines( - self.map_canvas, color, closed=False, points=points, width=size - ) - - def render_closed_lines( - self, - points: list | np.ndarray, - color: Optional[tuple[int, int, int]] = (0, 0, 255), - size: Optional[int] = 1, - ) -> None: - """ - Render a sequence of lines segments forming a closed loop (draw a line between the last and the first point). - - Parameters - ---------- - points : list | np.ndarray - list of 2d points to render - color : Optional[tuple[int, int, int]], optional - color as rgb tuple, by default blue (0, 0, 255) - size : Optional[int], optional - size of the line, by default 1 - """ - origin = self.map_origin - ppu = self.ppus[self.active_map_renderer] - resolution = self.map_resolution * ppu - points = ((points - origin[:2]) / resolution).astype(int) - size = math.ceil(size / ppu) - - pygame.draw.lines( - self.map_canvas, color, closed=True, points=points, width=size - ) - - def close(self) -> None: - """ - Close the rendering environment. - """ - if self.render_mode in ["human", "human_fast"]: - pygame.quit() diff --git a/f1tenth_gym/envs/track/cubic_spline.py b/f1tenth_gym/envs/track/cubic_spline.py index c1b030e7..a06fc512 100644 --- a/f1tenth_gym/envs/track/cubic_spline.py +++ b/f1tenth_gym/envs/track/cubic_spline.py @@ -33,83 +33,32 @@ def __init__(self, x, y, vxs: Optional[np.ndarray] = None, axs: Optional[np.ndarray] = None, ss: Optional[np.ndarray] = None, - ): - self.xs = x - self.ys = y - input_vals = [x, y, psis, ks, vxs, axs, ss] - - # Only close the path if for the input values from the user, - # the first and last points are not the same => the path is not closed - # Otherwise, the constructed values can mess up the s calculation and closure - need_closure = False - for input_val in input_vals: - if input_val is not None: - if not (input_val[-1] == input_val[0]): - need_closure = True - break - - def close_with_constructor(input_val, constructor, closed_path): - ''' - If the input value is not None, return it. - Otherwise, return the constructor, with closure if necessary. - - Parameters - ---------- - input_val : np.ndarray | None - The input value from the user. - constructor : np.ndarray - The constructor to use if the input value is None. - closed_path : bool - Indicator whether the orirignal path is closed. - ''' - if input_val is not None: - return input_val - else: - temp_ret = constructor - if closed_path: - temp_ret[-1] = temp_ret[0] - return temp_ret - - self.psis = close_with_constructor(psis, self._calc_yaw_from_xy(x, y), not need_closure) - self.ks = close_with_constructor(ks, self._calc_kappa_from_xy(x, y), not need_closure) - self.vxs = close_with_constructor(vxs, np.ones_like(x), not need_closure) - self.axs = close_with_constructor(axs, np.zeros_like(x), not need_closure) - self.ss = close_with_constructor(ss, self.__calc_s(x, y), not need_closure) - psis_spline = close_with_constructor(psis, self._calc_yaw_from_xy(x, y), not need_closure) - - # If yaw is provided, interpolate cosines and sines of yaw for continuity - cosines_spline = np.cos(psis_spline) - sines_spline = np.sin(psis_spline) + ): + psis = psis if psis is not None else self._calc_yaw_from_xy(x, y) + ks = ks if ks is not None else self._calc_kappa_from_xy(x, y) + vxs = vxs if vxs is not None else np.ones_like(x) + axs = axs if axs is not None else np.zeros_like(x) + + self.points = np.c_[x, y, + np.cos(psis), np.sin(psis), + ks, vxs, axs] - ks_spline = close_with_constructor(ks, self._calc_kappa_from_xy(x, y), not need_closure) - vxs_spline = close_with_constructor(vxs, np.zeros_like(x), not need_closure) - axs_spline = close_with_constructor(axs, np.zeros_like(x), not need_closure) - - self.points = np.c_[self.xs, self.ys, - cosines_spline, sines_spline, - ks_spline, vxs_spline, axs_spline] - - if need_closure: - self.points = np.vstack( - (self.points, self.points[0]) - ) # Ensure the path is closed - - if ss is not None: - self.s = ss + if np.any(self.points[-1, :2] != self.points[0, :2]): + self.points = np.vstack((self.points, self.points[0])) else: - self.s = self.__calc_s(self.points[:, 0], self.points[:, 1]) - self.s_interval = (self.s[-1] - self.s[0]) / len(self.s) + self.points[-1] = self.points[0] + self.s = ss if ss is not None else self.__calc_s(self.points[:, 0], self.points[:, 1]) + # self.s_interval = (self.s[-1] - self.s[0]) / len(self.s) # Use scipy CubicSpline to interpolate the points with periodic boundary conditions - # This is necesaxsry to ensure the path is continuous + # This is necessary to ensure the path is continuous self.spline = interpolate.CubicSpline(self.s, self.points, bc_type="periodic") self.spline_x = np.array(self.spline.x) - self.spline_c = np.array(self.spline.c) - def find_segment_for_s(self, x): # Find the segment of the spline that x is in - return (x / (self.spline.x[-1] + self.s_interval) * (len(self.spline_x) - 1)).astype(int) + # return (x / (self.spline.x[-1] + self.s_interval) * (len(self.spline_x) - 1)).astype(int) + return (x / (self.spline.x[-1]) * (len(self.spline_x) - 2)).astype(int) def predict_with_spline(self, point, segment, state_index=0): # A (4, 100) array, where the rows contain (x-x[i])**3, (x-x[i])**2 etc. diff --git a/f1tenth_gym/envs/track/raceline.py b/f1tenth_gym/envs/track/raceline.py index d2dc18fb..fe05116a 100644 --- a/f1tenth_gym/envs/track/raceline.py +++ b/f1tenth_gym/envs/track/raceline.py @@ -64,6 +64,8 @@ def __init__( # compute spline through waypoints if not provided self.spline = spline or CubicSpline2D(x=xs, y=ys) + self.s_frame_max = self.spline.s[-1] + self.s_guess = 0.0 self.waypoint_renderer = None diff --git a/f1tenth_gym/envs/track/track.py b/f1tenth_gym/envs/track/track.py index 6aaf751f..929e56df 100644 --- a/f1tenth_gym/envs/track/track.py +++ b/f1tenth_gym/envs/track/track.py @@ -416,8 +416,9 @@ def frenet_to_cartesian(self, s, ey, ephi, use_raceline=False): psi: yaw angle """ line = self.raceline if use_raceline else self.centerline - x, y = line.spline.calc_position(s) - psi = line.spline.calc_yaw(s) + s = s % self.s_frame_max + x, y = self.centerline.calc_position(s) + psi = self.centerline.calc_yaw(s) # Adjust x,y by shifting along the normal vector x -= ey * np.sin(psi) @@ -425,10 +426,9 @@ def frenet_to_cartesian(self, s, ey, ephi, use_raceline=False): # Adjust psi by adding the heading deviation psi += ephi + return x, y, psi % (2 * np.pi) - return x, y, psi - - def cartesian_to_frenet(self, x, y, phi, use_raceline=False, s_guess=0): + def cartesian_to_frenet(self, x, y, phi, use_raceline=False, s_guess=None): """ Convert Cartesian coordinates to Frenet coordinates. @@ -441,11 +441,14 @@ def cartesian_to_frenet(self, x, y, phi, use_raceline=False, s_guess=0): ey: lateral deviation ephi: heading deviation """ + if s_guess is None: + s_guess = self.s_guess line = self.raceline if use_raceline else self.centerline # s, ey = line.spline.calc_arclength_inaccurate(x, y) # inaccurate, but much faster s, ey = line.spline.calc_arclength(x, y, s_guess) # Wrap around s = s % line.spline.s[-1] + self.s_guess = s # Use the normal to calculate the signed lateral deviation yaw = line.spline.calc_yaw(s) diff --git a/pyproject.toml b/pyproject.toml index d5580c7a..38000254 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,13 +39,15 @@ pillow = ">=9.0.1" scipy = ">=1.7.3" numba = ">=0.55.2" PyYAML = ">=5.3.1" -pygame = "^2.5.2" +PyOpenGL = "==3.1.9" +PyOpenGL-accelerate = "==3.1.9" +# pygame = "^2.5.2" opencv-python = "^4.9.0.80" yamldataclassconfig = "^1.5.0" requests = "^2.31.0" -shapely = "^2.0.2" +# shapely = "^2.0.2" pyqtgraph = "^0.13.7" -PyQt6 = "^6.7.1" +PyQt6 = "==6.9.0" [tool.poetry.group.dev.dependencies] pytest = "^7.4.4" From 5781d1182edb9440d998530072fac021d50150fa Mon Sep 17 00:00:00 2001 From: zzangupenn Date: Wed, 11 Jun 2025 04:40:33 -0400 Subject: [PATCH 17/54] fuck scipy.optimization --- f1tenth_gym/envs/f110_env.py | 4 +- f1tenth_gym/envs/track/cubic_spline.py | 91 ++++++++++++++++++++------ f1tenth_gym/envs/track/track.py | 1 + 3 files changed, 75 insertions(+), 21 deletions(-) diff --git a/f1tenth_gym/envs/f110_env.py b/f1tenth_gym/envs/f110_env.py index c469627e..c885390e 100644 --- a/f1tenth_gym/envs/f110_env.py +++ b/f1tenth_gym/envs/f110_env.py @@ -40,7 +40,7 @@ from .reset import make_reset_fn from .track import Track from .utils import deep_update - +import time class F110Env(gym.Env): """ @@ -148,7 +148,7 @@ def __init__(self, config: dict = None, render_mode=None, **kwargs): track_scale=self.config["map_scale"], ) # load track in gym env for convenience self.sim.set_map(self.track, self.config["map_scale"]) - + # observations self.agent_ids = [f"agent_{i}" for i in range(self.num_agents)] diff --git a/f1tenth_gym/envs/track/cubic_spline.py b/f1tenth_gym/envs/track/cubic_spline.py index a06fc512..9695af85 100644 --- a/f1tenth_gym/envs/track/cubic_spline.py +++ b/f1tenth_gym/envs/track/cubic_spline.py @@ -6,12 +6,64 @@ import math import numpy as np -import scipy.optimize as so from scipy import interpolate from typing import Union, Optional - +import time from f1tenth_gym.envs.track.utils import nearest_point_on_trajectory +from numba import njit +@njit(fastmath=False, cache=True) +def nearest_point_on_trajectory(point: np.ndarray, trajectory: np.ndarray) -> tuple: + """ + Return the nearest point along the given piecewise linear trajectory. + + Same as nearest_point_on_line_segment, but vectorized. This method is quite fast, time constraints should + not be an issue so long as trajectories are not insanely long. + + Order of magnitude: trajectory length: 1000 --> 0.0002 second computation (5000fps) + + Parameters + ---------- + point: np.ndarray + The 2d point to project onto the trajectory + trajectory: np.ndarray + The trajectory to project the point onto, shape (N, 2) + The points must be unique. If they are not unique, a divide by 0 error will destroy the world + + Returns + ------- + nearest_point: np.ndarray + The nearest point on the trajectory + distance: float + The distance from the point to the nearest point on the trajectory + t: float + min_dist_segment: int + The index of the nearest point on the trajectory + """ + diffs = trajectory[1:, :] - trajectory[:-1, :] + l2s = diffs[:, 0] ** 2 + diffs[:, 1] ** 2 + # this is equivalent to the elementwise dot product + # dots = np.sum((point - trajectory[:-1,:]) * diffs[:,:], axis=1) + dots = np.empty((trajectory.shape[0] - 1,)) + for i in range(dots.shape[0]): + dots[i] = np.dot((point - trajectory[i, :]), diffs[i, :]) + t = dots / l2s + t[t < 0.0] = 0.0 + t[t > 1.0] = 1.0 + # t = np.clip(dots / l2s, 0.0, 1.0) + projections = trajectory[:-1, :] + (t * diffs.T).T + # dists = np.linalg.norm(point - projections, axis=1) + dists = np.empty((projections.shape[0],)) + for i in range(dists.shape[0]): + temp = point - projections[i] + dists[i] = np.sqrt(np.sum(temp * temp)) + min_dist_segment = np.argmin(dists) + return ( + dists[min_dist_segment], + t[min_dist_segment], + min_dist_segment, + ) + class CubicSpline2D: """ @@ -48,23 +100,25 @@ def __init__(self, x, y, else: self.points[-1] = self.points[0] self.s = ss if ss is not None else self.__calc_s(self.points[:, 0], self.points[:, 1]) - # self.s_interval = (self.s[-1] - self.s[0]) / len(self.s) + self.s_interval = (self.s[-1] - self.s[0]) / len(self.s) # Use scipy CubicSpline to interpolate the points with periodic boundary conditions # This is necessary to ensure the path is continuous self.spline = interpolate.CubicSpline(self.s, self.points, bc_type="periodic") self.spline_x = np.array(self.spline.x) + self.spline_c = np.array(self.spline.c) def find_segment_for_s(self, x): # Find the segment of the spline that x is in - # return (x / (self.spline.x[-1] + self.s_interval) * (len(self.spline_x) - 1)).astype(int) - return (x / (self.spline.x[-1]) * (len(self.spline_x) - 2)).astype(int) + # print(x, self.spline.x[-1], self.s_interval, len(self.spline_x)) + return (x / (self.spline.x[-1] + self.s_interval) * (len(self.spline_x) - 1)).astype(int) + # return (x / (self.spline.x[-1]) * (len(self.spline_x) - 2)).astype(int) def predict_with_spline(self, point, segment, state_index=0): # A (4, 100) array, where the rows contain (x-x[i])**3, (x-x[i])**2 etc. # exp_x = (point - self.spline.x[[segment]])[None, :] ** np.arange(4)[::-1, None] exp_x = ((point - self.spline.x[segment % len(self.spline.x)]) ** np.arange(4)[::-1])[:, None] - vec = self.spline.c[:, segment % self.spline.c.shape[1], state_index] + vec = self.spline_c[:, segment % self.spline_c.shape[1], state_index] # Sum over the rows of exp_x weighted by coefficients in the ith column of s.c point = vec.dot(exp_x) return np.asarray(point) @@ -88,14 +142,12 @@ def __calc_s(self, x: np.ndarray, y: np.ndarray) -> np.ndarray: dx = np.diff(x) dy = np.diff(y) self.ds = np.hypot(dx, dy) - s = [0] - s.extend(np.cumsum(self.ds)) - return np.array(s) + return np.concatenate([np.array([0]), np.cumsum(self.ds)]) def _calc_yaw_from_xy(self, x, y): dx_dt = np.gradient(x, edge_order=2) dy_dt = np.gradient(y, edge_order=2) - heading = np.arctan2(dy_dt, dx_dt) + heading = (np.arctan2(dy_dt, dx_dt) + 2 * math.pi) % (2 * math.pi) return heading def _calc_kappa_from_xy(self, x, y): @@ -191,7 +243,7 @@ def calc_yaw(self, s: float) -> Optional[float]: return yaw def calc_arclength( - self, x: float, y: float, s_guess: float = 0.0 + self, x: float, y: float, s_guess: float = 0.0, ) -> tuple[float, float]: """ Calculate arclength for a given point (x, y) on the trajectory. @@ -212,15 +264,16 @@ def calc_arclength( ey : float lateral deviation for given x, y. """ + ey, t, min_dist_segment = nearest_point_on_trajectory( + np.array([x, y]).astype(np.float32), self.points[:, :2] + ) + # s = s at closest_point + t + s = float( + self.s[min_dist_segment] + + t * (self.s[min_dist_segment + 1] - self.s[min_dist_segment]) + ) - def distance_to_spline(s): - x_eval, y_eval = self.spline(s)[0, :2] - return np.sqrt((x - x_eval) ** 2 + (y - y_eval) ** 2) - - output = so.fmin(distance_to_spline, s_guess, full_output=True, disp=False) - closest_s = float(output[0][0]) - absolute_distance = output[1] - return closest_s, absolute_distance + return s, ey def calc_arclength_inaccurate(self, x: float, y: float, s_inds=None) -> tuple[float, float]: """ diff --git a/f1tenth_gym/envs/track/track.py b/f1tenth_gym/envs/track/track.py index 929e56df..eb89dc2a 100644 --- a/f1tenth_gym/envs/track/track.py +++ b/f1tenth_gym/envs/track/track.py @@ -69,6 +69,7 @@ def __init__( self.occupancy_map = occupancy_map self.centerline = centerline self.raceline = raceline + self.s_guess = None @staticmethod def load_spec(track: str, filespec: str) -> TrackSpec: From 6a23a610031ae0357fc6b59713dec79e0467bb50 Mon Sep 17 00:00:00 2001 From: zzangupenn Date: Thu, 12 Jun 2025 04:33:45 -0400 Subject: [PATCH 18/54] add frenet --- README.md | 3 +- examples/test.py | 68 ------------ examples/test_pyqtopengl.py | 134 ----------------------- examples/waypoint_follow.py | 7 +- f1tenth_gym/envs/base_classes.py | 26 +++-- f1tenth_gym/envs/f110_env.py | 108 +++++++++---------- f1tenth_gym/envs/laser_models.py | 24 +++-- f1tenth_gym/envs/observation.py | 9 +- f1tenth_gym/envs/track/cubic_spline.py | 144 ++++++++----------------- f1tenth_gym/envs/track/track.py | 36 ++++--- f1tenth_gym/envs/track/utils.py | 7 +- tests/test_observation.py | 6 +- 12 files changed, 171 insertions(+), 401 deletions(-) delete mode 100644 examples/test.py delete mode 100644 examples/test_pyqtopengl.py diff --git a/README.md b/README.md index baaad140..736305eb 100644 --- a/README.md +++ b/README.md @@ -7,12 +7,13 @@ Zirui branch TODO list: - [ ] verify collision - [x] scan toggle - [x] separate time step and integrater time step -- [ ] add frenet +- [x] add frenet - [ ] use correct loop count - [x] simplify std_state and observation - [x] add option "state" in reset - [x] control_buffer_size, lidar fov, lidar nums in config - [ ] double check dynamics result +- [x] implemented new rendering with pyqtgraph.opengl ## Quickstart We recommend installing the simulation inside a virtualenv. You can install the environment by running: diff --git a/examples/test.py b/examples/test.py deleted file mode 100644 index 7c039325..00000000 --- a/examples/test.py +++ /dev/null @@ -1,68 +0,0 @@ -import sys -import time -import numpy as np -from PyQt6 import QtWidgets, QtCore, QtGui -import pyqtgraph.opengl as gl - - -class OpenGLRectangleWithFPS(QtWidgets.QMainWindow): - def __init__(self): - super().__init__() - self.setWindowTitle("OpenGL Rectangle with FPS") - - # Set up GL view widget - self.view = gl.GLViewWidget() - self.setCentralWidget(self.view) - self.view.setCameraPosition(distance=20, elevation=90, azimuth=0) - - # Rectangle - rectangle = np.array([ - [0, 0, 0], - [5, 0, 0], - [5, 3, 0], - [0, 3, 0], - [0, 0, 0] - ], dtype=np.float32) - - rect_item = gl.GLLinePlotItem(pos=rectangle, color=(1, 0, 0, 1), width=2, mode='line_strip') - self.view.addItem(rect_item) - - # FPS label (parent is the main window, not GL view!) - self.fps_label = QtWidgets.QLabel(self) - self.fps_label.setText("FPS: ...") - self.fps_label.setStyleSheet("color: white; background-color: rgba(0,0,0,180); padding: 4px;") - self.fps_label.setFont(QtGui.QFont("Courier", 14, QtGui.QFont.Weight.Bold)) - self.fps_label.setGeometry(10, 10, 150, 30) - self.fps_label.setAttribute(QtCore.Qt.WidgetAttribute.WA_TransparentForMouseEvents) - self.fps_label.raise_() # Ensure it's on top - - # Timing - self.last_time = time.time() - self.frame_count = 0 - - # Timer for render loop - self.timer = QtCore.QTimer() - self.timer.timeout.connect(self.render) - self.timer.start(0) - - def render(self): - self._update_fps() - self.view.update() - - def _update_fps(self): - self.frame_count += 1 - current_time = time.time() - elapsed = current_time - self.last_time - if elapsed >= 1.0: - fps = self.frame_count / elapsed - self.fps_label.setText(f"FPS: {fps:.1f}") - self.last_time = current_time - self.frame_count = 0 - - -if __name__ == "__main__": - app = QtWidgets.QApplication(sys.argv) - window = OpenGLRectangleWithFPS() - window.resize(800, 600) - window.show() - sys.exit(app.exec()) diff --git a/examples/test_pyqtopengl.py b/examples/test_pyqtopengl.py deleted file mode 100644 index 07097415..00000000 --- a/examples/test_pyqtopengl.py +++ /dev/null @@ -1,134 +0,0 @@ -import sys -import time -import numpy as np -from PyQt6 import QtWidgets, QtCore, QtGui -import pyqtgraph.opengl as gl -from PyQt6.QtGui import QSurfaceFormat - -fmt = QSurfaceFormat() -fmt.setSwapInterval(0) # 0 = no vsync, 1 = vsync -QSurfaceFormat.setDefaultFormat(fmt) - - -class OpenGLRectangleWithFPS(QtWidgets.QMainWindow): - def __init__(self): - super().__init__() - self.setWindowTitle("OpenGL Filled Rectangle with FPS") - # Set up GL view widget - self.view = gl.GLViewWidget() - self.setCentralWidget(self.view) - - # Fix camera to XY view - self.view.opts['elevation'] = 90 # Top-down - self.view.opts['azimuth'] = 0 # Facing +Y - self.view.setCameraPosition(distance=40) - - # 🔧 Replace mouse drag behavior: allow pan (right drag), disable rotation - self._enable_pan_only() - - # Add 2D background using GLImageItem - map_img = np.zeros((200, 300), dtype=np.uint8) - map_img[50:150, 100:200] = 255 - map_rgb = np.stack([map_img]*3, axis=-1) - alpha = np.ones((map_rgb.shape[0], map_rgb.shape[1], 1), dtype=np.uint8) * 255 - map_rgba = np.concatenate((map_rgb, alpha), axis=-1) - map_rgba = np.flip(np.rot90(map_rgba, k=1), axis=0) - image_item = gl.GLImageItem(map_rgba) - image_item.translate(0, 0, -0.01) - image_item.scale(0.1, 0.1, 1) - # self.view.addItem(image_item) - - # Define rectangle corners (XY plane, z=0) - rectangle = np.array([ - [0, 0, 0], - [5, 0, 0], - [5, 3, 0], - [0, 3, 0] - ], dtype=np.float32) - - # Line outline - # outline = np.vstack([rectangle, rectangle[0]]) - # rect_item = gl.GLLinePlotItem(pos=outline, color=(1, 0, 0, 1), width=2, mode='line_strip') - # self.view.addItem(rect_item) - - # Fill with GLMeshItem - faces = np.array([ - [0, 1, 2], - [0, 2, 3] - ]) - mesh_item = gl.GLMeshItem( - vertexes=rectangle, - faces=faces, - faceColors=np.array([[0, 0.7, 0.9, 1.0], [0, 0.7, 0.9, 1.0]]), - smooth=False, - drawEdges=False - ) - self.view.addItem(mesh_item) - - # FPS label - self.fps_label = QtWidgets.QLabel(self) - font = QtGui.QFont("Courier New", 14, QtGui.QFont.Weight.Bold) - self.fps_label.setFont(font) - self.fps_label.setStyleSheet("color: white; background-color: black; padding: 2px;") - self.fps_label.move(10, 10) - self.fps_label.resize(100, 20) - self.fps_label.setAttribute(QtCore.Qt.WidgetAttribute.WA_TransparentForMouseEvents) - - # Frame timer - self.last_time = time.time() - self.frame_count = 0 - # self.timer = QtCore.QTimer() - # self.timer.timeout.connect(self._update_fps) - # self.timer.start(0) - - def _enable_pan_only(self): - """Override GLViewWidget events to disable rotation and allow right-click panning.""" - self.view.pan_active = False - self.view.pan_start = QtCore.QPoint() - - def mousePressEvent(event): - if event.button() == QtCore.Qt.MouseButton.LeftButton: - self.view.pan_active = True - self.view.pan_start = event.pos() - event.accept() - else: - event.ignore() - - def mouseMoveEvent(event): - if self.view.pan_active: - delta = event.pos() - self.view.pan_start - dx = -delta.y() * 0.01 - dy = -delta.x() * 0.01 - self.view.pan(dx, dy, 0) - self.view.pan_start = event.pos() - event.accept() - else: - event.ignore() - - def mouseReleaseEvent(event): - self.view.pan_active = False - event.accept() - - self.view.mousePressEvent = mousePressEvent - self.view.mouseMoveEvent = mouseMoveEvent - self.view.mouseReleaseEvent = mouseReleaseEvent - - def _update_fps(self): - self.frame_count += 1 - now = time.time() - elapsed = now - self.last_time - - if elapsed >= 1.0: - fps = self.frame_count / elapsed - self.fps_label.setText(f"FPS: {fps:.1f}") - self.last_time = now - self.frame_count = 0 - self.view.update() - - -if __name__ == "__main__": - app = QtWidgets.QApplication(sys.argv) - window = OpenGLRectangleWithFPS() - window.resize(800, 600) - window.show() - sys.exit(app.exec()) diff --git a/examples/waypoint_follow.py b/examples/waypoint_follow.py index 5c9c6862..0102ff14 100644 --- a/examples/waypoint_follow.py +++ b/examples/waypoint_follow.py @@ -305,7 +305,7 @@ def main(): "mass": 3.463388126201571, "lf": 0.15597534362552312, "tlad": 0.82461887897713965, - "vgain": 0.5, + "vgain": 0.2, } num_agents = 1 @@ -326,6 +326,7 @@ def main(): "map_scale": 1.0, "enable_rendering": 1, "enable_scan": 1, + "lidar_num_beams": 270, "compute_frenet": 1, }, render_mode="human_fast", @@ -365,10 +366,12 @@ def main(): work["vgain"], ) action[i] = np.array([steer, speed]) + # print("frenet_pose", obs[agent_id]["frenet_pose"]) t1 = time.time() obs, step_reward, done, truncated, info = env.step(action) + times.append(1/(time.time() - t1)) - if len(times) > 10000: + if len(times) > 2000: print("FPS:", np.mean(times)) times = [] laptime += step_reward diff --git a/f1tenth_gym/envs/base_classes.py b/f1tenth_gym/envs/base_classes.py index 5c43adfa..b9fb7262 100644 --- a/f1tenth_gym/envs/base_classes.py +++ b/f1tenth_gym/envs/base_classes.py @@ -48,6 +48,7 @@ class RaceCar(object): num_beams (int): number of beams in laser fov (float): field of view of laser state (np.ndarray (7, )): state vector [x, y, theta, vel, steer_angle, ang_vel, slip_angle] + frenet_pose (np.ndarray (3, )): frenet pose vector [s, d, theta] odom (np.ndarray(13, )): odometry vector [x, y, z, qx, qy, qz, qw, linear_x, linear_y, linear_z, angular_x, angular_y, angular_z] accel (float): current acceleration input steer_angle_vel (float): current steering velocity input @@ -70,6 +71,7 @@ def __init__( model=DynamicModel.ST, is_ego=False, time_step=0.01, + track = None, ): """ @@ -103,6 +105,7 @@ def __init__( self.integrator = integrator self.action_type = action_type self.model = model + self.track = track if self.model == DynamicModel.MB: from .dynamic_models.multi_body.multi_body import sequential_param_keys self.sequential_param_keys = sequential_param_keys @@ -112,6 +115,8 @@ def __init__( # state of the vehicle self.state = self.model.get_initial_state(params=self.params) + if self.config['compute_frenet'] and self.track is not None: + self.frenet_pose = self.track.cartesian_to_frenet(self.state[0], self.state[1], self.state[4], use_s_guess=False) # pose of opponents in the world self.opp_poses = None @@ -216,6 +221,8 @@ def reset(self, pose, option='pose'): self.state = self.model.get_initial_state(pose=pose, params=self.params) elif option == 'state': self.state = pose + if self.config['compute_frenet'] and self.track is not None: + self.frenet_pose = self.track.cartesian_to_frenet(self.state[0], self.state[1], self.state[4], use_s_guess=False) self.steer_buffer = np.empty((0,)) # reset scan random generator @@ -344,7 +351,7 @@ def update_dynamic(self, raw_steer, vel): ) # bound yaw angle - self.state[4] %= 2 * np.pi # TODO: This is a problem waiting to happen + self.state[4] = (self.state[4] + 2 * np.pi) % (2 * np.pi) # TODO: This is a problem waiting to happen if self.config['enable_scan']: # update scan @@ -353,6 +360,10 @@ def update_dynamic(self, raw_steer, vel): ) else: current_scan = np.zeros((self.num_beams,)) + + if self.config['compute_frenet'] and self.track is not None: + # update frenet poses for all agents + self.frenet_pose = self.track.cartesian_to_frenet(self.state[0], self.state[1], self.state[4]) return current_scan @@ -399,9 +410,7 @@ def standard_state(self) -> np.ndarray: Returns: np.ndarray (7, ): state of the vehicle """ - # t1 = time.time() standard_state = self.standard_state_fn(self.state) - # print(time.time() - t1) return standard_state @@ -434,6 +443,7 @@ def __init__( model=DynamicModel.ST, time_step=0.01, ego_idx=0, + track : Track | None = None, ): """ Init function @@ -462,6 +472,7 @@ def __init__( self.collisions = np.zeros((self.num_agents,)) self.collision_idx = -1 * np.ones((self.num_agents,)) self.model = model + self.track = track # initializing agents for i in range(self.num_agents): @@ -474,6 +485,7 @@ def __init__( integrator=integrator, model=model, action_type=action_type, + track=self.track, ) self.agents.append(car) @@ -559,10 +571,10 @@ def step(self, control_inputs): self.agent_poses[i, :] = np.append(agent.state[0:2], agent.state[4]) self.agent_steerings[i] = agent.state[2] - if self.config['enable_scan']: - # check collisions between all agents - self.check_collision() - + + # check collisions between all agents + self.check_collision() + for i, agent in enumerate(self.agents): # update agent's information on other agents opp_poses = np.concatenate( diff --git a/f1tenth_gym/envs/f110_env.py b/f1tenth_gym/envs/f110_env.py index c885390e..3a35d447 100644 --- a/f1tenth_gym/envs/f110_env.py +++ b/f1tenth_gym/envs/f110_env.py @@ -40,7 +40,6 @@ from .reset import make_reset_fn from .track import Track from .utils import deep_update -import time class F110Env(gym.Env): """ @@ -128,6 +127,14 @@ def __init__(self, config: dict = None, render_mode=None, **kwargs): self.start_thetas = np.zeros((self.num_agents,)) self.start_rot = np.eye(2) + if isinstance(self.map, Track): + self.track = self.map + else: + self.track = Track.from_track_name( + self.map, + track_scale=self.config["map_scale"], + ) # load track in gym env for convenience + # initiate stuff self.sim = Simulator( self.config, @@ -138,15 +145,8 @@ def __init__(self, config: dict = None, render_mode=None, **kwargs): integrator=self.integrator, model=self.model, action_type=self.action_type, + track=self.track, ) - - if isinstance(self.map, Track): - self.track = self.map - else: - self.track = Track.from_track_name( - self.map, - track_scale=self.config["map_scale"], - ) # load track in gym env for convenience self.sim.set_map(self.track, self.config["map_scale"]) # observations @@ -185,6 +185,45 @@ def __init__(self, config: dict = None, render_mode=None, **kwargs): render_mode=render_mode, render_fps=self.metadata["render_fps"], ) + + @classmethod + def default_config(cls) -> dict: + """ + Default environment configuration. + + Can be overloaded in environment implementations, or by calling configure(). + + Args: + None + + Returns: + a configuration dict + """ + return { + "seed": 12345, + "map": "Spielberg", + "map_scale": 1.0, + "params": cls.f1tenth_vehicle_params(), + "num_agents": 2, + "timestep": 0.01, + "integrator_timestep": 0.01, + "ego_idx": 0, + "integrator": "rk4", + "model": "st", # "ks", "st", "mb" + "control_input": ["speed", "steering_angle"], + "observation_config": {"type": "direct"}, + "reset_config": {"type": None}, + "enable_rendering": True, + "enable_scan": True, # NOTE no lidar scan and collision if False + "lidar_fov" : 4.712389, + "lidar_num_beams": 1080, + "lidar_range": 30.0, + "lidar_noise_std": 0.01, + "steer_delay_buffer_size": 1, + "compute_frenet": True, # NOTE: currently always true + "collision_check_method": "bounding_box", # "lidar_scan", "bounding_box" + "loop_counting_method": "s_based", # "toggle", "s_based", "winding_angle" + } @classmethod def fullscale_vehicle_params(cls) -> dict: @@ -373,43 +412,6 @@ def f1tenth_vehicle_params(cls) -> dict: } return params - @classmethod - def default_config(cls) -> dict: - """ - Default environment configuration. - - Can be overloaded in environment implementations, or by calling configure(). - - Args: - None - - Returns: - a configuration dict - """ - return { - "seed": 12345, - "map": "Spielberg", - "map_scale": 1.0, - "params": cls.f1tenth_vehicle_params(), - "num_agents": 2, - "timestep": 0.01, - "integrator_timestep": 0.01, - "ego_idx": 0, - "integrator": "rk4", - "model": "st", # "ks", "st", "mb" - "control_input": ["speed", "steering_angle"], - "observation_config": {"type": None}, - "reset_config": {"type": None}, - "enable_rendering": True, - "enable_scan": True, # NOTE no lidar scan and collision if False - "lidar_fov" : 4.712389, - "lidar_num_beams": 360, - "lidar_range": 30.0, - "lidar_noise_std": 0.01, - "steer_delay_buffer_size": 1, - "compute_frenet": False, - } - def configure(self, config: dict) -> None: if config: self.config = deep_update(self.config, config) @@ -507,20 +509,6 @@ def step(self, action): # update data member self._update_state() - # rendering observation - # if self.config["enable_rendering"]: - # self.render_obs = { - # "ego_idx": self.sim.ego_idx, - # "poses_x": self.sim.agent_poses[:, 0], - # "poses_y": self.sim.agent_poses[:, 1], - # "poses_theta": self.sim.agent_poses[:, 2], - # "steering_angles": self.sim.agent_steerings, - # "lap_times": self.lap_times, - # "lap_counts": self.lap_counts, - # "collisions": self.sim.collisions, - # "sim_time": self.sim_time, - # } - # check done done, toggle_list = self._check_done() truncated = False diff --git a/f1tenth_gym/envs/laser_models.py b/f1tenth_gym/envs/laser_models.py index 7f2febe1..1e10efa8 100644 --- a/f1tenth_gym/envs/laser_models.py +++ b/f1tenth_gym/envs/laser_models.py @@ -265,17 +265,19 @@ def check_ttc_jit(scan, vel, scan_angles, cosines, side_distances, ttc_thresh): in_collision (bool): whether vehicle is in collision with environment collision_angle (float): at which angle the collision happened """ - in_collision = False - if vel != 0.0: - num_beams = scan.shape[0] - for i in range(num_beams): - proj_vel = vel * cosines[i] - ttc = (scan[i] - side_distances[i]) / proj_vel - if (ttc < ttc_thresh) and (ttc >= 0.0): - in_collision = True - break - else: - in_collision = False + ttc = scan - side_distances + in_collision = np.any(ttc <= ttc_thresh) + # in_collision = False + # if vel != 0.0: + # num_beams = scan.shape[0] + # for i in range(num_beams): + # proj_vel = vel * cosines[i] + # ttc = (scan[i] - side_distances[i]) / proj_vel + # if (ttc < ttc_thresh) and (ttc >= 0.0): + # in_collision = True + # break + # else: + # in_collision = False return in_collision diff --git a/f1tenth_gym/envs/observation.py b/f1tenth_gym/envs/observation.py index d7ba792f..c43ef64d 100644 --- a/f1tenth_gym/envs/observation.py +++ b/f1tenth_gym/envs/observation.py @@ -48,9 +48,6 @@ def space(self): "state": gym.spaces.Box( low=-large_num, high=large_num, shape=(int(self.env.model.state_dim),), dtype=np.float32 ), - # "frenet_state": gym.spaces.Box( - # low=-large_num, high=large_num, shape=(7,), dtype=np.float32 - # ), "collision": gym.spaces.Box( low=0.0, high=1.0, shape=(), dtype=np.float32 ), @@ -64,6 +61,10 @@ def space(self): low=0.0, high=large_num, shape=(), dtype=np.float32 ), } + if self.env.unwrapped.config["compute_frenet"]: + agent_dict["frenet_pose"] = gym.spaces.Box( + low=-large_num, high=large_num, shape=(3,), dtype=np.float32 + ) complete_space[agent_id] = gym.spaces.Dict( agent_dict ) @@ -88,6 +89,8 @@ def observe(self): "lap_count": self.env.unwrapped.lap_counts[i], "sim_time": self.env.unwrapped.sim_time, } + if self.env.unwrapped.config["compute_frenet"]: + agent_obs["frenet_pose"] = agent.frenet_pose if hasattr(agent, 'frenet_pose') else np.zeros(3, dtype=np.float32) # add agent's observation to multi-agent observation obs[agent_id] = agent_obs diff --git a/f1tenth_gym/envs/track/cubic_spline.py b/f1tenth_gym/envs/track/cubic_spline.py index 9695af85..6e7852c5 100644 --- a/f1tenth_gym/envs/track/cubic_spline.py +++ b/f1tenth_gym/envs/track/cubic_spline.py @@ -8,62 +8,9 @@ import numpy as np from scipy import interpolate from typing import Union, Optional -import time +# import scipy.optimize as so from f1tenth_gym.envs.track.utils import nearest_point_on_trajectory - from numba import njit -@njit(fastmath=False, cache=True) -def nearest_point_on_trajectory(point: np.ndarray, trajectory: np.ndarray) -> tuple: - """ - Return the nearest point along the given piecewise linear trajectory. - - Same as nearest_point_on_line_segment, but vectorized. This method is quite fast, time constraints should - not be an issue so long as trajectories are not insanely long. - - Order of magnitude: trajectory length: 1000 --> 0.0002 second computation (5000fps) - - Parameters - ---------- - point: np.ndarray - The 2d point to project onto the trajectory - trajectory: np.ndarray - The trajectory to project the point onto, shape (N, 2) - The points must be unique. If they are not unique, a divide by 0 error will destroy the world - - Returns - ------- - nearest_point: np.ndarray - The nearest point on the trajectory - distance: float - The distance from the point to the nearest point on the trajectory - t: float - min_dist_segment: int - The index of the nearest point on the trajectory - """ - diffs = trajectory[1:, :] - trajectory[:-1, :] - l2s = diffs[:, 0] ** 2 + diffs[:, 1] ** 2 - # this is equivalent to the elementwise dot product - # dots = np.sum((point - trajectory[:-1,:]) * diffs[:,:], axis=1) - dots = np.empty((trajectory.shape[0] - 1,)) - for i in range(dots.shape[0]): - dots[i] = np.dot((point - trajectory[i, :]), diffs[i, :]) - t = dots / l2s - t[t < 0.0] = 0.0 - t[t > 1.0] = 1.0 - # t = np.clip(dots / l2s, 0.0, 1.0) - projections = trajectory[:-1, :] + (t * diffs.T).T - # dists = np.linalg.norm(point - projections, axis=1) - dists = np.empty((projections.shape[0],)) - for i in range(dists.shape[0]): - temp = point - projections[i] - dists[i] = np.sqrt(np.sum(temp * temp)) - min_dist_segment = np.argmin(dists) - return ( - dists[min_dist_segment], - t[min_dist_segment], - min_dist_segment, - ) - class CubicSpline2D: """ @@ -107,6 +54,8 @@ def __init__(self, x, y, self.spline = interpolate.CubicSpline(self.s, self.points, bc_type="periodic") self.spline_x = np.array(self.spline.x) self.spline_c = np.array(self.spline.c) + self.diffs = self.points[1:, :2] - self.points[:, :2][:-1, :2] + self.l2s = self.diffs[:, 0] ** 2 + self.diffs[:, 1] ** 2 def find_segment_for_s(self, x): # Find the segment of the spline that x is in @@ -162,7 +111,7 @@ def _calc_kappa_from_xy(self, x, y): curvature = (dx_dt * d2y_dt2 - d2x_dt2 * dy_dt) / (dx_dt * dx_dt + dy_dt * dy_dt)**1.5 return curvature[2:-2] - def calc_position(self, s: float) -> np.ndarray: + def calc_position(self, s: float, segment=None) -> np.ndarray: """ Calc position at the given s. @@ -179,7 +128,7 @@ def calc_position(self, s: float) -> np.ndarray: y : float | None y position for given s. """ - segment = self.find_segment_for_s(s) + segment = segment or self.find_segment_for_s(s) x = self.predict_with_spline(s, segment, 0)[0] y = self.predict_with_spline(s, segment, 1)[0] return x,y @@ -222,7 +171,7 @@ def find_curvature(self, s: float) -> Optional[float]: k = self.points[segment, 4] return k - def calc_yaw(self, s: float) -> Optional[float]: + def calc_yaw(self, s: float, segment=None) -> Optional[float]: """ Calc yaw angle at the given s. @@ -236,44 +185,40 @@ def calc_yaw(self, s: float) -> Optional[float]: yaw : float yaw angle (tangent vector) for given s. """ - segment = self.find_segment_for_s(s) + segment = segment or self.find_segment_for_s(s) cos = self.predict_with_spline(s, segment, 2)[0] sin = self.predict_with_spline(s, segment, 3)[0] yaw = (math.atan2(sin, cos) + 2 * math.pi) % (2 * math.pi) return yaw - def calc_arclength( - self, x: float, y: float, s_guess: float = 0.0, - ) -> tuple[float, float]: - """ - Calculate arclength for a given point (x, y) on the trajectory. - - Parameters - ---------- - x : float - x position. - y : float - y position. - s_guess : float - initial guess for s. - - Returns - ------- - s : float - distance from the start point for given x, y. - ey : float - lateral deviation for given x, y. - """ - ey, t, min_dist_segment = nearest_point_on_trajectory( - np.array([x, y]).astype(np.float32), self.points[:, :2] - ) - # s = s at closest_point + t - s = float( - self.s[min_dist_segment] - + t * (self.s[min_dist_segment + 1] - self.s[min_dist_segment]) - ) - - return s, ey + # def calc_arclength( + # self, x: float, y: float, s_guess: float = 0.0 + # ) -> tuple[float, float]: + # """ + # Calculate arclength for a given point (x, y) on the trajectory. + + # Parameters + # ---------- + # x : float + # x position. + # y : float + # y position. + # s_guess : float + # initial guess for s. + # Returns + # ------- + # s : float + # distance from the start point for given x, y. + # ey : float + # lateral deviation for given x, y. + # """ + # def distance_to_spline(s): + # x_eval, y_eval = self.spline(s)[0, :2] + # return np.sqrt((x - x_eval) ** 2 + (y - y_eval) ** 2) + # output = so.fmin(distance_to_spline, s_guess, full_output=True, disp=False) + # closest_s = float(output[0][0]) + # absolute_distance = output[1] + # return closest_s, absolute_distance def calc_arclength_inaccurate(self, x: float, y: float, s_inds=None) -> tuple[float, float]: """ @@ -296,14 +241,17 @@ def calc_arclength_inaccurate(self, x: float, y: float, s_inds=None) -> tuple[fl lateral deviation for given x, y. """ if s_inds is None: - s_inds = np.arange(self.points.shape[0]) - _, ey, t, min_dist_segment = nearest_point_on_trajectory( - np.array([x, y]).astype(np.float32), self.points[s_inds, :2] - ) - min_dist_segment_s_ind = s_inds[min_dist_segment] + ey, t, min_dist_segment = nearest_point_on_trajectory( + np.asarray([x, y]).astype(np.float32), self.points[:, :2] + ) + else: + ey, t, min_dist_segment = nearest_point_on_trajectory( + np.asarray([x, y]).astype(np.float32), self.points[s_inds, :2] + ) + min_dist_segment = s_inds[min_dist_segment] s = float( - self.s[min_dist_segment_s_ind] - + t * (self.s[min_dist_segment_s_ind + 1] - self.s[min_dist_segment_s_ind]) + self.s[min_dist_segment] + + t * (self.s[min_dist_segment + 1] - self.s[min_dist_segment]) ) return s, ey @@ -343,4 +291,4 @@ def _calc_normal(self, s: float) -> np.ndarray: """ dx, dy = self.spline(s, 1)[:2] normal = np.array([-dy, dx]) - return normal + return normal \ No newline at end of file diff --git a/f1tenth_gym/envs/track/track.py b/f1tenth_gym/envs/track/track.py index eb89dc2a..699a9ffd 100644 --- a/f1tenth_gym/envs/track/track.py +++ b/f1tenth_gym/envs/track/track.py @@ -70,6 +70,7 @@ def __init__( self.centerline = centerline self.raceline = raceline self.s_guess = None + self.frenet_search_range = 10 # meters @staticmethod def load_spec(track: str, filespec: str) -> TrackSpec: @@ -417,9 +418,9 @@ def frenet_to_cartesian(self, s, ey, ephi, use_raceline=False): psi: yaw angle """ line = self.raceline if use_raceline else self.centerline - s = s % self.s_frame_max - x, y = self.centerline.calc_position(s) - psi = self.centerline.calc_yaw(s) + s = s % line.s_frame_max + x, y = line.spline.calc_position(s) + psi = line.spline.calc_yaw(s) # Adjust x,y by shifting along the normal vector x -= ey * np.sin(psi) @@ -427,38 +428,47 @@ def frenet_to_cartesian(self, s, ey, ephi, use_raceline=False): # Adjust psi by adding the heading deviation psi += ephi - return x, y, psi % (2 * np.pi) + return x, y, (psi + (2 * np.pi)) % (2 * np.pi) - def cartesian_to_frenet(self, x, y, phi, use_raceline=False, s_guess=None): + def cartesian_to_frenet(self, x, y, psi, use_raceline=False, s_guess=None, use_s_guess=True): """ Convert Cartesian coordinates to Frenet coordinates. x: x-coordinate y: y-coordinate - phi: yaw angle + psi: yaw angle returns: s: distance along the centerline ey: lateral deviation ephi: heading deviation """ + line = self.raceline if use_raceline else self.centerline if s_guess is None: s_guess = self.s_guess - line = self.raceline if use_raceline else self.centerline - # s, ey = line.spline.calc_arclength_inaccurate(x, y) # inaccurate, but much faster - s, ey = line.spline.calc_arclength(x, y, s_guess) + + if use_s_guess and s_guess is not None: + s_inds = line.spline.find_segment_for_s(s_guess) + extend_length = int(self.frenet_search_range / 2 / line.spline.s_interval) # extend search range + s_inds = np.arange(s_inds - extend_length, s_inds + extend_length) % (len(line.spline.s)-1) # search around the guess + else: + s_inds = None + # print(max(line.spline.s[s_inds]), min(line.spline.s[s_inds])) + s, ey = line.spline.calc_arclength_inaccurate(x, y, s_inds) # inaccurate, but much faster + # s, ey = line.spline.calc_arclength(x, y, s_guess) # Wrap around s = s % line.spline.s[-1] self.s_guess = s + segment = line.spline.find_segment_for_s(s) # Use the normal to calculate the signed lateral deviation - yaw = line.spline.calc_yaw(s) + yaw = line.spline.calc_yaw(s, segment) normal = np.asarray([-np.sin(yaw), np.cos(yaw)]) - x_eval, y_eval = line.spline.calc_position(s) + x_eval, y_eval = line.spline.calc_position(s, segment) dx = x - x_eval dy = y - y_eval distance_sign = np.sign(np.dot([dx, dy], normal)) ey = ey * distance_sign - phi = phi - yaw - return s, ey, np.arctan2(np.sin(phi), np.cos(phi)) + psi = psi - yaw + return s, ey, (psi + (2 * np.pi)) % (2 * np.pi) diff --git a/f1tenth_gym/envs/track/utils.py b/f1tenth_gym/envs/track/utils.py index 6c8a0bf4..9d80863f 100644 --- a/f1tenth_gym/envs/track/utils.py +++ b/f1tenth_gym/envs/track/utils.py @@ -99,8 +99,13 @@ def nearest_point_on_trajectory(point: np.ndarray, trajectory: np.ndarray) -> tu temp = point - projections[i] dists[i] = np.sqrt(np.sum(temp * temp)) min_dist_segment = np.argmin(dists) + # return ( + # projections[min_dist_segment], + # dists[min_dist_segment], + # t[min_dist_segment], + # min_dist_segment, + # ) return ( - projections[min_dist_segment], dists[min_dist_segment], t[min_dist_segment], min_dist_segment, diff --git a/tests/test_observation.py b/tests/test_observation.py index 2a161236..1872786f 100644 --- a/tests/test_observation.py +++ b/tests/test_observation.py @@ -160,7 +160,7 @@ def test_dynamic_obs_space(self): """ Check the dynamic state observation space contains the correct features. """ - env = self._make_env(config={"observation_config": {"type": "dynamic_state"}}) + env = self._make_env(config={"observation_config": {"type": "original"}}) kinematic_features = [ "pose_x", @@ -204,7 +204,7 @@ def test_dynamic_obs_space(self): self.assertTrue(np.allclose(ground_truth, observed)) def test_consistency_observe_space(self): - obs_type_ids = ["kinematic_state", "dynamic_state", "original"] + obs_type_ids = ["direct", "original"] env = self._make_env() env.reset() @@ -222,7 +222,7 @@ def test_consistency_observe_space(self): def test_gymnasium_api(self): from gymnasium.utils.env_checker import check_env - obs_type_ids = ["kinematic_state", "dynamic_state", "original"] + obs_type_ids = ["direct", "original"] for obs_type_id in obs_type_ids: env = self._make_env(config={"observation_config": {"type": obs_type_id}}) From 40da4eea3badd5e06d517ccb437abf76216480bf Mon Sep 17 00:00:00 2001 From: zzangupenn Date: Thu, 12 Jun 2025 05:17:44 -0400 Subject: [PATCH 19/54] implement s_based loop check --- examples/waypoint_follow.py | 6 +- f1tenth_gym/envs/f110_env.py | 95 +++++++++++--------------- f1tenth_gym/envs/track/cubic_spline.py | 1 + 3 files changed, 44 insertions(+), 58 deletions(-) diff --git a/examples/waypoint_follow.py b/examples/waypoint_follow.py index 0102ff14..dd92c095 100644 --- a/examples/waypoint_follow.py +++ b/examples/waypoint_follow.py @@ -305,7 +305,7 @@ def main(): "mass": 3.463388126201571, "lf": 0.15597534362552312, "tlad": 0.82461887897713965, - "vgain": 0.2, + "vgain": 0.5, } num_agents = 1 @@ -325,9 +325,10 @@ def main(): "reset_config": {"type": "rl_random_static"}, "map_scale": 1.0, "enable_rendering": 1, - "enable_scan": 1, + "enable_scan": 0, "lidar_num_beams": 270, "compute_frenet": 1, + "max_laps": 10, # 'inf' for infinite laps, or a positive integer }, render_mode="human_fast", ) @@ -371,6 +372,7 @@ def main(): obs, step_reward, done, truncated, info = env.step(action) times.append(1/(time.time() - t1)) + # print(info) if len(times) > 2000: print("FPS:", np.mean(times)) times = [] diff --git a/f1tenth_gym/envs/f110_env.py b/f1tenth_gym/envs/f110_env.py index 3a35d447..8daa394c 100644 --- a/f1tenth_gym/envs/f110_env.py +++ b/f1tenth_gym/envs/f110_env.py @@ -41,6 +41,15 @@ from .track import Track from .utils import deep_update +# class WindingAngleLoopCounter: +# def __init__(self, track: Track): +# self.start_point_curvature = track.centerline.calc_curvature(0.0) +# self.winding_point = np.array( +# track.frenet_to_cartesian( +# s=0.0, ey=np.sign(self.start_point_curvature) * 1.5, ephi=0.0 +# ) +# )[:2] + class F110Env(gym.Env): """ OpenAI gym environment for F1TENTH @@ -112,20 +121,13 @@ def __init__(self, config: dict = None, render_mode=None, **kwargs): self.near_start = True self.num_toggles = 0 - # race info - self.lap_times = np.zeros((self.num_agents,)) - self.lap_counts = np.zeros((self.num_agents,)) - self.sim_time = 0.0 - # finish line info - self.num_toggles = 0 - self.near_start = True - self.near_starts = np.array([True] * self.num_agents) - self.toggle_list = np.zeros((self.num_agents,)) - self.start_xs = np.zeros((self.num_agents,)) - self.start_ys = np.zeros((self.num_agents,)) - self.start_thetas = np.zeros((self.num_agents,)) - self.start_rot = np.eye(2) + if self.config["loop_counting_method"] == "frenet_based": + self.agents_prev_s = np.array([None] * self.num_agents) + self.lap_times = np.zeros((self.num_agents, )) + self.lap_times_finish = np.zeros((self.num_agents, )) + self.lap_counts = np.zeros((self.num_agents, )) + self.sim_time = 0.0 if isinstance(self.map, Track): self.track = self.map @@ -208,6 +210,7 @@ def default_config(cls) -> dict: "timestep": 0.01, "integrator_timestep": 0.01, "ego_idx": 0, + "max_laps": 'inf', # 'inf' for infinite laps, or a positive integer "integrator": "rk4", "model": "st", # "ks", "st", "mb" "control_input": ["speed", "steering_angle"], @@ -220,9 +223,9 @@ def default_config(cls) -> dict: "lidar_range": 30.0, "lidar_noise_std": 0.01, "steer_delay_buffer_size": 1, - "compute_frenet": True, # NOTE: currently always true + "compute_frenet": True, "collision_check_method": "bounding_box", # "lidar_scan", "bounding_box" - "loop_counting_method": "s_based", # "toggle", "s_based", "winding_angle" + "loop_counting_method": "frenet_based", # "toggle", "frenet_based", "winding_angle" } @classmethod @@ -432,46 +435,24 @@ def configure(self, config: dict) -> None: def _check_done(self): """ Check if the current rollout is done - - Args: - None - - Returns: - done (bool): whether the rollout is done - toggle_list (list[int]): each agent's toggle list for crossing the finish zone """ - - # this is assuming 2 agents - # TODO: switch to maybe s-based - left_t = 2 - right_t = 2 - - poses_x = np.array(self.poses_x) - self.start_xs - poses_y = np.array(self.poses_y) - self.start_ys - delta_pt = np.dot(self.start_rot, np.stack((poses_x, poses_y), axis=0)) - temp_y = delta_pt[1, :] - idx1 = temp_y > left_t - idx2 = temp_y < -right_t - temp_y[idx1] -= left_t - temp_y[idx2] = -right_t - temp_y[idx2] - temp_y[np.invert(np.logical_or(idx1, idx2))] = 0 - - dist2 = delta_pt[0, :] ** 2 + temp_y**2 - closes = dist2 <= 0.1 - for i in range(self.num_agents): - if closes[i] and not self.near_starts[i]: - self.near_starts[i] = True - self.toggle_list[i] += 1 - elif not closes[i] and self.near_starts[i]: - self.near_starts[i] = False - self.toggle_list[i] += 1 - self.lap_counts[i] = self.toggle_list[i] // 2 - if self.toggle_list[i] < 4: - self.lap_times[i] = self.sim_time - - done = (self.collisions[self.ego_idx]) or np.all(self.toggle_list >= 4) - - return bool(done), self.toggle_list >= 4 + if self.config['loop_counting_method'] == "frenet_based": + for ind, agent_id in enumerate(self.agent_ids): + if self.agents_prev_s[ind] is None: + self.agents_prev_s[ind] = self.obs[agent_id]['frenet_pose'][0] + else: + agent_curr_s = self.obs[agent_id]['frenet_pose'][0] + if self.agents_prev_s[ind] - agent_curr_s > self.sim.track.centerline.spline.s_frame_max * 0.85 \ + and self.sim_time > self.timestep: + self.lap_counts[ind] += 1 + self.lap_times[ind] = self.sim_time - self.lap_times_finish[ind] + self.lap_times_finish[ind] = self.sim_time + self.agents_prev_s[ind] = agent_curr_s + self.obs[agent_id]['lap_time'] = self.lap_times[ind] + self.obs[agent_id]['lap_count'] = [ind] + + done = (self.collisions[self.ego_idx]) or self.lap_counts >= float(self.config["max_laps"]) + return bool(done) def _update_state(self): """ @@ -510,9 +491,11 @@ def step(self, action): self._update_state() # check done - done, toggle_list = self._check_done() + done = self._check_done() truncated = False - info = {"checkpoint_done": toggle_list} + info = {"lap_times": self.lap_times, + "lap_counts": self.lap_counts, + "sim_time": self.sim_time} return self.obs, reward, done, truncated, info diff --git a/f1tenth_gym/envs/track/cubic_spline.py b/f1tenth_gym/envs/track/cubic_spline.py index 6e7852c5..dccaf59f 100644 --- a/f1tenth_gym/envs/track/cubic_spline.py +++ b/f1tenth_gym/envs/track/cubic_spline.py @@ -48,6 +48,7 @@ def __init__(self, x, y, self.points[-1] = self.points[0] self.s = ss if ss is not None else self.__calc_s(self.points[:, 0], self.points[:, 1]) self.s_interval = (self.s[-1] - self.s[0]) / len(self.s) + self.s_frame_max = self.s[-1] # Use scipy CubicSpline to interpolate the points with periodic boundary conditions # This is necessary to ensure the path is continuous From c2a9ef3dc7406c5dc273982967156eaa8070dd94 Mon Sep 17 00:00:00 2001 From: zzangupenn Date: Thu, 12 Jun 2025 05:19:01 -0400 Subject: [PATCH 20/54] frenet_based loop check --- README.md | 3 ++- f1tenth_gym/envs/f110_env.py | 9 --------- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 736305eb..d7cbc9aa 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,8 @@ Zirui branch TODO list: - [x] scan toggle - [x] separate time step and integrater time step - [x] add frenet -- [ ] use correct loop count +- [x] use correct loop count frenet_based +- [ ] also add winding_angle - [x] simplify std_state and observation - [x] add option "state" in reset - [x] control_buffer_size, lidar fov, lidar nums in config diff --git a/f1tenth_gym/envs/f110_env.py b/f1tenth_gym/envs/f110_env.py index 8daa394c..b8f55ca4 100644 --- a/f1tenth_gym/envs/f110_env.py +++ b/f1tenth_gym/envs/f110_env.py @@ -41,15 +41,6 @@ from .track import Track from .utils import deep_update -# class WindingAngleLoopCounter: -# def __init__(self, track: Track): -# self.start_point_curvature = track.centerline.calc_curvature(0.0) -# self.winding_point = np.array( -# track.frenet_to_cartesian( -# s=0.0, ey=np.sign(self.start_point_curvature) * 1.5, ephi=0.0 -# ) -# )[:2] - class F110Env(gym.Env): """ OpenAI gym environment for F1TENTH From a32d68f0ab1a5f15168205760dbe6fb86baa260b Mon Sep 17 00:00:00 2001 From: zzangupenn Date: Wed, 18 Jun 2025 01:57:20 -0400 Subject: [PATCH 21/54] 3d mesh rendering --- README.md | 3 +- examples/waypoint_follow.py | 4 +- .../envs/rendering/example_mesh_cyber.obj | 30239 ++++++++++++++++ f1tenth_gym/envs/rendering/mesh_renderer.py | 162 + f1tenth_gym/envs/rendering/renderer.py | 2 +- f1tenth_gym/envs/rendering/rendering.yaml | 1 + .../envs/rendering/rendering_pyqtgl.py | 40 +- f1tenth_gym/envs/track/cubic_spline.py | 1 + 8 files changed, 30435 insertions(+), 17 deletions(-) create mode 100644 f1tenth_gym/envs/rendering/example_mesh_cyber.obj create mode 100644 f1tenth_gym/envs/rendering/mesh_renderer.py diff --git a/README.md b/README.md index d7cbc9aa..06e13087 100644 --- a/README.md +++ b/README.md @@ -8,13 +8,14 @@ Zirui branch TODO list: - [x] scan toggle - [x] separate time step and integrater time step - [x] add frenet -- [x] use correct loop count frenet_based +- [x] use correct loop count frenet_based, added max loop num - [ ] also add winding_angle - [x] simplify std_state and observation - [x] add option "state" in reset - [x] control_buffer_size, lidar fov, lidar nums in config - [ ] double check dynamics result - [x] implemented new rendering with pyqtgraph.opengl +- [x] added 3d mesh renderering for proof of concept ## Quickstart We recommend installing the simulation inside a virtualenv. You can install the environment by running: diff --git a/examples/waypoint_follow.py b/examples/waypoint_follow.py index dd92c095..9402769a 100644 --- a/examples/waypoint_follow.py +++ b/examples/waypoint_follow.py @@ -325,10 +325,10 @@ def main(): "reset_config": {"type": "rl_random_static"}, "map_scale": 1.0, "enable_rendering": 1, - "enable_scan": 0, + "enable_scan": 1, "lidar_num_beams": 270, "compute_frenet": 1, - "max_laps": 10, # 'inf' for infinite laps, or a positive integer + "max_laps": 2, # 'inf' for infinite laps, or a positive integer }, render_mode="human_fast", ) diff --git a/f1tenth_gym/envs/rendering/example_mesh_cyber.obj b/f1tenth_gym/envs/rendering/example_mesh_cyber.obj new file mode 100644 index 00000000..1597ff8d --- /dev/null +++ b/f1tenth_gym/envs/rendering/example_mesh_cyber.obj @@ -0,0 +1,30239 @@ +# Blender v2.91.0 OBJ File: 'cybertruck (final).blend' +# www.blender.org +mtllib cybertruck (final).mtl +o WGT-CarRig.DriftHandle +v 0.560017 0.000000 -0.000000 +v 0.547273 0.000000 -0.051213 +v 0.517388 0.000000 -0.099737 +v 0.464317 0.000000 -0.143449 +v 0.395991 0.000000 -0.184290 +v 0.311128 0.000000 -0.216702 +v 0.214308 0.000000 -0.240786 +v 0.109253 0.000000 -0.255617 +v 0.555120 0.000000 -0.025475 +v 0.534870 0.000000 -0.076445 +v 0.491512 0.000000 -0.122266 +v 0.430814 0.000000 -0.164543 +v 0.353560 0.000000 -0.200496 +v 0.262718 0.000000 -0.228744 +v 0.161781 0.000000 -0.248202 +v 0.054627 0.000000 -0.258121 +v 0.468305 0.000000 -0.000000 +v 0.460162 0.000000 -0.032401 +v 0.433464 0.000000 -0.060593 +v 0.389381 0.000000 -0.085429 +v 0.331141 0.000000 -0.110313 +v 0.260176 0.000000 -0.131034 +v 0.179212 0.000000 -0.146527 +v 0.091361 0.000000 -0.156096 +v 0.464991 0.000000 -0.015659 +v 0.450432 0.000000 -0.047986 +v 0.411785 0.000000 -0.073472 +v 0.360261 0.000000 -0.097484 +v 0.295659 0.000000 -0.120367 +v 0.219694 0.000000 -0.138512 +v 0.135287 0.000000 -0.151063 +v 0.045681 0.000000 -0.157473 +v -0.560017 0.000000 -0.000000 +v -0.547273 0.000000 -0.051213 +v -0.517388 0.000000 -0.099737 +v -0.464970 0.000000 -0.143641 +v -0.395991 0.000000 -0.184290 +v -0.311128 0.000000 -0.216702 +v -0.214308 0.000000 -0.240786 +v -0.109253 0.000000 -0.255617 +v -0.555120 0.000000 -0.025475 +v -0.534870 0.000000 -0.076445 +v -0.491512 0.000000 -0.122266 +v -0.430814 0.000000 -0.164543 +v -0.353560 0.000000 -0.200496 +v -0.262718 0.000000 -0.228744 +v -0.161781 0.000000 -0.248202 +v -0.054627 0.000000 -0.258121 +v -0.468305 0.000000 -0.000000 +v -0.460162 0.000000 -0.032401 +v -0.433464 0.000000 -0.060593 +v -0.389381 0.000000 -0.085429 +v -0.331141 0.000000 -0.110313 +v -0.260176 0.000000 -0.131034 +v -0.179212 0.000000 -0.146527 +v -0.091361 0.000000 -0.156096 +v -0.464991 0.000000 -0.015659 +v -0.450432 0.000000 -0.047986 +v -0.411785 0.000000 -0.073472 +v -0.360261 0.000000 -0.097484 +v -0.295659 0.000000 -0.120367 +v -0.219694 0.000000 -0.138512 +v -0.135287 0.000000 -0.151063 +v -0.045681 0.000000 -0.157473 +v 0.000000 0.000000 -0.260625 +v 0.000000 0.000000 -0.159330 +l 9 1 +l 10 2 +l 11 3 +l 12 4 +l 13 5 +l 14 6 +l 15 7 +l 16 8 +l 2 9 +l 3 10 +l 4 11 +l 5 12 +l 6 13 +l 7 14 +l 8 15 +l 65 16 +l 25 17 +l 26 18 +l 27 19 +l 28 20 +l 29 21 +l 30 22 +l 31 23 +l 32 24 +l 18 25 +l 19 26 +l 20 27 +l 21 28 +l 22 29 +l 23 30 +l 24 31 +l 66 32 +l 1 17 +l 25 9 +l 2 18 +l 26 10 +l 41 33 +l 42 34 +l 43 35 +l 44 36 +l 45 37 +l 46 38 +l 47 39 +l 48 40 +l 34 41 +l 35 42 +l 36 43 +l 37 44 +l 38 45 +l 39 46 +l 40 47 +l 65 48 +l 57 49 +l 58 50 +l 59 51 +l 60 52 +l 61 53 +l 62 54 +l 63 55 +l 64 56 +l 50 57 +l 51 58 +l 52 59 +l 53 60 +l 54 61 +l 55 62 +l 56 63 +l 66 64 +l 33 49 +l 57 41 +l 34 50 +l 58 42 +o WGT-CarRig.Root +v -0.500000 0.000000 0.884438 +v -0.384438 0.000000 1.000000 +v -0.491203 0.000000 0.928662 +v -0.466153 0.000000 0.966153 +v -0.428662 0.000000 0.991203 +v 0.384438 0.000000 1.000000 +v 0.500000 0.000000 0.884438 +v 0.428662 0.000000 0.991203 +v 0.466153 0.000000 0.966153 +v 0.491203 0.000000 0.928662 +v -0.500000 0.000000 -0.884438 +v -0.384438 0.000000 -1.000000 +v -0.491203 0.000000 -0.928662 +v -0.466153 0.000000 -0.966153 +v -0.428662 0.000000 -0.991203 +v 0.500000 0.000000 -0.884438 +v 0.384438 0.000000 -1.000000 +v 0.491203 0.000000 -0.928662 +v 0.466153 0.000000 -0.966153 +v 0.428662 0.000000 -0.991203 +v 0.123415 0.000000 1.000000 +v -0.123415 0.000000 1.000000 +v 0.123415 0.000000 1.097190 +v -0.123415 0.000000 1.097190 +v 0.303126 0.000000 1.097190 +v -0.303126 0.000000 1.097190 +v 0.000000 0.000000 1.250000 +l 67 69 +l 69 70 +l 70 71 +l 71 68 +l 72 74 +l 74 75 +l 75 76 +l 76 73 +l 77 79 +l 79 80 +l 80 81 +l 81 78 +l 82 84 +l 84 85 +l 85 86 +l 86 83 +l 67 77 +l 73 82 +l 78 83 +l 87 72 +l 88 68 +l 89 87 +l 90 88 +l 91 89 +l 92 90 +l 93 91 +l 93 92 +o WGT-CarRig.GroundSensor +v -0.500000 0.000000 0.822192 +v -0.322192 0.000000 1.000000 +v -0.476178 0.000000 0.911096 +v -0.411096 0.000000 0.976178 +v 0.322192 0.000000 1.000000 +v 0.500000 0.000000 0.822192 +v 0.411096 0.000000 0.976178 +v 0.476178 0.000000 0.911096 +v -0.500000 0.000000 -0.822192 +v -0.322192 0.000000 -1.000000 +v -0.476178 0.000000 -0.911096 +v -0.411096 0.000000 -0.976178 +v 0.500000 0.000000 -0.822192 +v 0.322192 0.000000 -1.000000 +v 0.476178 0.000000 -0.911096 +v 0.411096 0.000000 -0.976178 +l 94 96 +l 96 97 +l 97 95 +l 98 100 +l 100 101 +l 101 99 +l 102 104 +l 104 105 +l 105 103 +l 106 108 +l 108 109 +l 109 107 +l 94 102 +l 95 98 +l 99 106 +l 103 107 +o WGT-CarRig.GroundSensor.Axle +v 0.000000 0.000000 -0.500000 +v -0.191342 0.000000 -0.461940 +v -0.353553 0.000000 -0.353553 +v -0.461940 0.000000 -0.191342 +v -0.500000 0.000000 0.000000 +v -0.461940 0.000000 0.191342 +v -0.353553 0.000000 0.353553 +v -0.191342 0.000000 0.461940 +v -0.000000 0.000000 0.500000 +v 0.191342 0.000000 0.461940 +v 0.353553 0.000000 0.353554 +v 0.461940 0.000000 0.191342 +v 0.500000 0.000000 -0.000000 +v 0.461940 0.000000 -0.191342 +v 0.353553 0.000000 -0.353554 +v 0.191341 0.000000 -0.461940 +v 0.000000 0.000000 -0.286619 +v -0.109684 0.000000 -0.264801 +v -0.202670 0.000000 -0.202670 +v -0.264801 0.000000 -0.109684 +v -0.286619 0.000000 0.000000 +v -0.264801 0.000000 0.109684 +v -0.202670 0.000000 0.202670 +v -0.109684 0.000000 0.264801 +v -0.000000 0.000000 0.286619 +v 0.109684 0.000000 0.264801 +v 0.202670 0.000000 0.202670 +v 0.264801 0.000000 0.109684 +v 0.286619 0.000000 -0.000000 +v 0.264801 0.000000 -0.109684 +v 0.202670 0.000000 -0.202670 +v 0.109684 0.000000 -0.264801 +v -0.000000 0.000000 0.000000 +l 111 110 +l 112 111 +l 113 112 +l 114 113 +l 115 114 +l 116 115 +l 117 116 +l 118 117 +l 119 118 +l 120 119 +l 121 120 +l 122 121 +l 123 122 +l 124 123 +l 125 124 +l 110 125 +l 127 126 +l 128 127 +l 129 128 +l 130 129 +l 131 130 +l 132 131 +l 133 132 +l 134 133 +l 135 134 +l 136 135 +l 137 136 +l 138 137 +l 139 138 +l 140 139 +l 141 140 +l 126 141 +l 142 134 +l 126 142 +l 130 142 +l 138 142 +o WGT-CarRig.Wheel +v 0.000000 -0.000000 -1.000000 +v 0.000000 0.195090 -0.980785 +v 0.000000 0.382683 -0.923879 +v 0.000000 0.555570 -0.831470 +v 0.000000 0.707107 -0.707107 +v 0.000000 0.831470 -0.555570 +v 0.000000 0.923879 -0.382683 +v 0.000000 0.980785 -0.195090 +v 0.000000 1.000000 -0.000000 +v 0.000000 0.980785 0.195090 +v 0.000000 0.923879 0.382683 +v 0.000000 0.831470 0.555570 +v 0.000000 0.707107 0.707107 +v 0.000000 0.555570 0.831470 +v 0.000000 0.382683 0.923880 +v 0.000000 0.195090 0.980785 +v 0.000000 -0.000000 1.000000 +v 0.000000 -0.195091 0.980785 +v 0.000000 -0.382684 0.923879 +v 0.000000 -0.555571 0.831469 +v 0.000000 -0.707107 0.707106 +v 0.000000 -0.831470 0.555570 +v 0.000000 -0.923880 0.382683 +v 0.000000 -0.980786 0.195089 +v 0.000000 -1.000000 -0.000001 +v 0.000000 -0.980785 -0.195091 +v 0.000000 -0.923879 -0.382684 +v 0.000000 -0.831469 -0.555571 +v 0.000000 -0.707106 -0.707108 +v 0.000000 -0.555569 -0.831470 +v 0.000000 -0.382682 -0.923880 +v 0.000000 -0.195089 -0.980785 +v 0.000000 -0.000000 -0.943993 +v 0.000000 0.184164 -0.925855 +v 0.000000 0.361250 -0.872136 +v 0.000000 0.524454 -0.784902 +v 0.000000 0.667504 -0.667504 +v 0.000000 0.784902 -0.524454 +v 0.000000 0.872136 -0.361251 +v 0.000000 0.925854 -0.184164 +v 0.000000 0.943993 -0.000000 +v 0.000000 0.925855 0.184164 +v 0.000000 0.872136 0.361250 +v 0.000000 0.784902 0.524454 +v 0.000000 0.667504 0.667504 +v 0.000000 0.524454 0.784902 +v 0.000000 0.361250 0.872136 +v 0.000000 0.184164 0.925855 +v 0.000000 -0.000000 0.943993 +v 0.000000 -0.184164 0.925854 +v 0.000000 -0.361251 0.872136 +v 0.000000 -0.524455 0.784901 +v 0.000000 -0.667505 0.667503 +v 0.000000 -0.784902 0.524454 +v 0.000000 -0.872136 0.361250 +v 0.000000 -0.925855 0.184163 +v 0.000000 -0.943993 -0.000001 +v 0.000000 -0.925855 -0.184165 +v 0.000000 -0.872136 -0.361252 +v 0.000000 -0.784901 -0.524455 +v 0.000000 -0.667503 -0.667505 +v 0.000000 -0.524454 -0.784902 +v 0.000000 -0.361249 -0.872136 +v 0.000000 -0.184163 -0.925855 +l 144 143 +l 145 144 +l 146 145 +l 147 146 +l 148 147 +l 149 148 +l 150 149 +l 151 150 +l 152 151 +l 153 152 +l 154 153 +l 155 154 +l 156 155 +l 157 156 +l 158 157 +l 159 158 +l 160 159 +l 161 160 +l 162 161 +l 163 162 +l 164 163 +l 165 164 +l 166 165 +l 167 166 +l 168 167 +l 169 168 +l 170 169 +l 171 170 +l 172 171 +l 173 172 +l 174 173 +l 143 174 +l 176 175 +l 177 176 +l 178 177 +l 179 178 +l 180 179 +l 181 180 +l 182 181 +l 183 182 +l 184 183 +l 185 184 +l 186 185 +l 187 186 +l 188 187 +l 189 188 +l 190 189 +l 191 190 +l 192 191 +l 193 192 +l 194 193 +l 195 194 +l 196 195 +l 197 196 +l 198 197 +l 199 198 +l 200 199 +l 201 200 +l 202 201 +l 203 202 +l 204 203 +l 205 204 +l 206 205 +l 175 206 +o WGT-CarRig.WheelBrake +v 0.000000 -0.000000 -0.875901 +v 0.000000 0.170880 -0.859071 +v 0.000000 0.486624 -0.728285 +v 0.000000 0.619355 -0.619355 +v 0.000000 0.728285 -0.486624 +v 0.000000 0.859071 -0.170880 +v 0.000000 0.875901 -0.000000 +v 0.000000 0.859071 0.170880 +v 0.000000 0.728285 0.486624 +v 0.000000 0.619355 0.619355 +v 0.000000 0.486624 0.728285 +v 0.000000 0.170879 0.859071 +v 0.000000 -0.000000 0.875901 +v 0.000000 -0.170880 0.859071 +v 0.000000 -0.486625 0.728285 +v 0.000000 -0.619356 0.619355 +v 0.000000 -0.728285 0.486624 +v 0.000000 -0.859071 0.170879 +v 0.000000 -0.875901 -0.000001 +v 0.000000 -0.859071 -0.170881 +v 0.000000 -0.728285 -0.486625 +v 0.000000 -0.619355 -0.619356 +v 0.000000 -0.486624 -0.728286 +v 0.000000 -0.170879 -0.859071 +v 0.000000 -0.000000 -0.727651 +v 0.000000 0.141958 -0.713670 +v 0.000000 0.404261 -0.605020 +v 0.000000 0.514527 -0.514527 +v 0.000000 0.605020 -0.404261 +v 0.000000 0.713670 -0.141958 +v 0.000000 0.727651 -0.000000 +v 0.000000 0.713670 0.141958 +v 0.000000 0.605020 0.404261 +v 0.000000 0.514527 0.514527 +v 0.000000 0.404261 0.605020 +v 0.000000 0.141957 0.713670 +v 0.000000 -0.000000 0.727651 +v 0.000000 -0.141958 0.713670 +v 0.000000 -0.404262 0.605020 +v 0.000000 -0.514528 0.514527 +v 0.000000 -0.605020 0.404261 +v 0.000000 -0.713670 0.141957 +v 0.000000 -0.727652 -0.000001 +v 0.000000 -0.713670 -0.141959 +v 0.000000 -0.605020 -0.404262 +v 0.000000 -0.514527 -0.514528 +v 0.000000 -0.404261 -0.605021 +v 0.000000 -0.141957 -0.713670 +v 0.000000 -0.000000 -0.695227 +v 0.000000 0.135632 -0.681869 +v 0.000000 0.386248 -0.578060 +v 0.000000 0.491600 -0.491600 +v 0.000000 0.578060 -0.386248 +v 0.000000 0.681869 -0.135632 +v 0.000000 0.695227 -0.000000 +v 0.000000 0.681869 0.135632 +v 0.000000 0.578060 0.386248 +v 0.000000 0.491600 0.491600 +v 0.000000 0.386248 0.578060 +v 0.000000 0.135632 0.681869 +v 0.000000 -0.000000 0.695227 +v 0.000000 -0.135633 0.681869 +v 0.000000 -0.386248 0.578060 +v 0.000000 -0.491600 0.491600 +v 0.000000 -0.578061 0.386247 +v 0.000000 -0.681869 0.135632 +v 0.000000 -0.695228 -0.000001 +v 0.000000 -0.681869 -0.135633 +v 0.000000 -0.578060 -0.386248 +v 0.000000 -0.491599 -0.491601 +v 0.000000 -0.386247 -0.578061 +v 0.000000 -0.135631 -0.681869 +v 0.000000 -0.000000 -0.670252 +v 0.000000 0.130760 -0.657373 +v 0.000000 0.372372 -0.557294 +v 0.000000 0.473939 -0.473940 +v 0.000000 0.557294 -0.372372 +v 0.000000 0.657373 -0.130760 +v 0.000000 0.670252 -0.000000 +v 0.000000 0.657373 0.130760 +v 0.000000 0.557294 0.372372 +v 0.000000 0.473939 0.473939 +v 0.000000 0.372372 0.557294 +v 0.000000 0.130759 0.657373 +v 0.000000 -0.000000 0.670252 +v 0.000000 -0.130760 0.657373 +v 0.000000 -0.372372 0.557294 +v 0.000000 -0.473940 0.473939 +v 0.000000 -0.557294 0.372371 +v 0.000000 -0.657373 0.130759 +v 0.000000 -0.670252 -0.000001 +v 0.000000 -0.657373 -0.130760 +v 0.000000 -0.557294 -0.372373 +v 0.000000 -0.473939 -0.473940 +v 0.000000 -0.372371 -0.557294 +v 0.000000 -0.130759 -0.657373 +l 208 207 +l 210 209 +l 211 210 +l 213 212 +l 214 213 +l 216 215 +l 217 216 +l 219 218 +l 220 219 +l 222 221 +l 223 222 +l 225 224 +l 226 225 +l 228 227 +l 229 228 +l 207 230 +l 232 231 +l 234 233 +l 235 234 +l 237 236 +l 238 237 +l 240 239 +l 241 240 +l 243 242 +l 244 243 +l 246 245 +l 247 246 +l 249 248 +l 250 249 +l 252 251 +l 253 252 +l 231 254 +l 241 217 +l 253 229 +l 218 242 +l 232 208 +l 230 254 +l 244 220 +l 209 233 +l 221 245 +l 235 211 +l 247 223 +l 212 236 +l 224 248 +l 238 214 +l 250 226 +l 215 239 +l 227 251 +l 256 255 +l 258 257 +l 259 258 +l 261 260 +l 262 261 +l 264 263 +l 265 264 +l 267 266 +l 268 267 +l 270 269 +l 271 270 +l 273 272 +l 274 273 +l 276 275 +l 277 276 +l 255 278 +l 280 279 +l 282 281 +l 283 282 +l 285 284 +l 286 285 +l 288 287 +l 289 288 +l 291 290 +l 292 291 +l 294 293 +l 295 294 +l 297 296 +l 298 297 +l 300 299 +l 301 300 +l 279 302 +o WGT-CarRig.Steering +v 0.729678 0.000000 -0.070342 +v 0.057004 0.000000 0.070342 +v 0.729678 0.000000 0.070342 +v 0.057004 0.000000 -0.070342 +v 0.729678 0.000000 -0.166650 +v 0.729678 0.000000 0.166650 +v 0.999900 0.000000 0.000000 +v -0.729678 0.000000 -0.070342 +v -0.057004 0.000000 0.070342 +v -0.729678 0.000000 0.070342 +v -0.057004 0.000000 -0.070342 +v -0.729678 0.000000 -0.166650 +v -0.729678 0.000000 0.166650 +v -0.999900 0.000000 0.000000 +l 305 304 +l 306 303 +l 304 306 +l 303 307 +l 308 305 +l 307 309 +l 309 308 +l 312 311 +l 313 310 +l 311 313 +l 310 314 +l 315 312 +l 314 316 +l 316 315 +o WGT-CarRig.Suspension +v -0.427285 -0.044050 0.129288 +v -0.069093 0.000000 -0.257859 +v -0.133478 0.000000 -0.231190 +v -0.188766 0.000000 -0.188766 +v -0.231190 0.000000 -0.133478 +v -0.257859 0.000000 -0.069093 +v -0.427285 -0.025838 0.069093 +v -0.257859 0.000000 0.069093 +v -0.231190 0.000000 0.133477 +v -0.188766 0.000000 0.188766 +v -0.133478 0.000000 0.231190 +v -0.069093 0.000000 0.257859 +v -0.427285 -0.025838 -0.069093 +v 0.069093 0.000000 0.257859 +v 0.133477 0.000000 0.231190 +v 0.188766 0.000000 0.188766 +v 0.231190 0.000000 0.133478 +v 0.257859 0.000000 0.069093 +v 0.427285 -0.025838 0.069093 +v 0.257859 0.000000 -0.069093 +v 0.231190 0.000000 -0.133477 +v 0.188766 0.000000 -0.188766 +v 0.133478 0.000000 -0.231190 +v 0.069093 0.000000 -0.257859 +v 0.427285 -0.025838 -0.069093 +v 0.427285 -0.044050 0.129288 +v 0.427285 -0.044050 -0.129288 +v 0.601184 -0.120043 0.000000 +v -0.427285 -0.044050 -0.129288 +v -0.601184 -0.120043 0.000000 +v -0.069093 -0.025838 0.427285 +v 0.069093 -0.025838 0.427285 +v -0.129288 -0.044050 0.427285 +v 0.129288 -0.044050 0.427285 +v -0.000000 -0.120043 0.601184 +v -0.069093 -0.025838 -0.427285 +v 0.069093 -0.025838 -0.427285 +v -0.129288 -0.044050 -0.427285 +v 0.129288 -0.044050 -0.427285 +v -0.000000 -0.120043 -0.601184 +v 0.000000 0.000000 -0.159577 +v -0.079788 0.000000 -0.138198 +v -0.138198 0.000000 -0.079788 +v -0.159577 0.000000 0.000000 +v -0.138198 0.000000 0.079788 +v -0.079788 0.000000 0.138198 +v -0.000000 0.000000 0.159577 +v 0.079788 0.000000 0.138198 +v 0.138198 0.000000 0.079789 +v 0.159577 0.000000 0.000000 +v 0.138198 0.000000 -0.079788 +v 0.079789 0.000000 -0.138198 +v 0.300215 -0.001860 -0.069093 +v 0.342572 -0.007113 -0.069093 +v 0.384929 -0.015269 -0.069093 +v 0.384929 -0.015269 0.069093 +v 0.342572 -0.007113 0.069093 +v 0.300215 -0.001860 0.069093 +v -0.300215 -0.001860 -0.069093 +v -0.342572 -0.007113 -0.069093 +v -0.384929 -0.015269 -0.069093 +v -0.384929 -0.015269 0.069093 +v -0.342572 -0.007113 0.069093 +v -0.300215 -0.001860 0.069093 +v -0.069093 -0.001860 0.300215 +v -0.069093 -0.007113 0.342572 +v -0.069093 -0.015269 0.384929 +v 0.069093 -0.001860 0.300215 +v 0.069093 -0.007113 0.342572 +v 0.069093 -0.015269 0.384929 +v -0.069093 -0.001860 -0.300215 +v -0.069093 -0.007113 -0.342572 +v -0.069093 -0.015269 -0.384929 +v 0.069093 -0.001860 -0.300215 +v 0.069093 -0.007113 -0.342572 +v 0.069093 -0.015269 -0.384929 +l 319 318 +l 320 319 +l 321 320 +l 322 321 +l 329 345 +l 317 323 +l 325 324 +l 326 325 +l 327 326 +l 328 327 +l 345 346 +l 346 317 +l 331 330 +l 332 331 +l 333 332 +l 334 333 +l 371 341 +l 374 334 +l 337 336 +l 338 337 +l 339 338 +l 340 339 +l 377 329 +l 342 335 +l 341 343 +l 344 342 +l 343 344 +l 380 324 +l 349 347 +l 348 350 +l 351 349 +l 350 351 +l 383 347 +l 386 348 +l 354 352 +l 353 355 +l 356 354 +l 355 356 +l 389 352 +l 392 353 +l 358 357 +l 359 358 +l 360 359 +l 361 360 +l 362 361 +l 363 362 +l 364 363 +l 365 364 +l 366 365 +l 367 366 +l 368 367 +l 357 368 +l 336 369 +l 369 370 +l 370 371 +l 335 372 +l 372 373 +l 373 374 +l 322 375 +l 375 376 +l 376 377 +l 323 378 +l 378 379 +l 379 380 +l 328 381 +l 381 382 +l 382 383 +l 330 384 +l 384 385 +l 385 386 +l 318 387 +l 387 388 +l 388 389 +l 340 390 +l 390 391 +l 391 392 +o WGT-CarRig.WheelDamper +v -0.177704 0.140301 0.091927 +v -0.177704 0.233836 0.091927 +v -0.107933 0.132507 0.168463 +v -0.107933 0.226041 0.168463 +v -0.009241 0.124712 0.199860 +v -0.009241 0.218247 0.199860 +v 0.091927 0.116918 0.177704 +v 0.091927 0.210452 0.177704 +v 0.168463 0.109123 0.107933 +v 0.168463 0.202658 0.107933 +v 0.199860 0.101329 0.009241 +v 0.199860 0.194863 0.009241 +v 0.177704 0.093534 -0.091927 +v 0.177704 0.187069 -0.091927 +v 0.107933 0.085740 -0.168463 +v 0.107933 0.179274 -0.168463 +v 0.009241 0.077945 -0.199860 +v 0.009241 0.171480 -0.199860 +v -0.091927 0.070151 -0.177704 +v -0.091927 0.163685 -0.177704 +v -0.168463 0.062356 -0.107933 +v -0.168463 0.155891 -0.107933 +v -0.199860 0.054562 -0.009241 +v -0.199860 0.148096 -0.009241 +v -0.177704 0.046767 0.091927 +v -0.177704 0.140302 0.091927 +v -0.107933 0.038973 0.168463 +v -0.107933 0.132507 0.168463 +v -0.009241 0.031178 0.199860 +v -0.009241 0.124712 0.199860 +v 0.091927 0.023383 0.177704 +v 0.091927 0.116918 0.177704 +v 0.168463 0.015589 0.107933 +v 0.168463 0.109123 0.107933 +v 0.199860 0.007794 0.009241 +v 0.199860 0.101329 0.009241 +v 0.177704 -0.000000 -0.091927 +v 0.177704 0.093534 -0.091927 +v 0.107933 -0.007795 -0.168463 +v 0.107933 0.085740 -0.168463 +v 0.009241 -0.015589 -0.199859 +v 0.009241 0.077945 -0.199860 +v -0.091927 -0.023384 -0.177704 +v -0.091927 0.070151 -0.177704 +v -0.168463 -0.031178 -0.107933 +v -0.168463 0.062356 -0.107933 +v -0.199859 -0.038973 -0.009241 +v -0.199860 0.054562 -0.009241 +v -0.177704 -0.046767 0.091927 +v -0.177704 0.046767 0.091927 +v -0.107933 -0.054562 0.168463 +v -0.107933 0.038973 0.168463 +v -0.009241 -0.062356 0.199859 +v -0.009241 0.031178 0.199860 +v 0.091927 -0.070151 0.177704 +v 0.091927 0.023383 0.177704 +v 0.168463 -0.077945 0.107933 +v 0.168463 0.015589 0.107933 +v 0.199859 -0.085740 0.009241 +v 0.199860 0.007794 0.009241 +v 0.177704 -0.093534 -0.091927 +v 0.177704 -0.000000 -0.091927 +v 0.107933 -0.101329 -0.168463 +v 0.107933 -0.007795 -0.168463 +v 0.009241 -0.109123 -0.199859 +v 0.009241 -0.015589 -0.199860 +v -0.091927 -0.116918 -0.177704 +v -0.091927 -0.023384 -0.177704 +v -0.168463 -0.124713 -0.107933 +v -0.168463 -0.031178 -0.107933 +v -0.199859 -0.132507 -0.009241 +v -0.199860 -0.038973 -0.009241 +v -0.177704 -0.140302 0.091927 +v -0.177704 -0.046767 0.091927 +v -0.107933 -0.148096 0.168463 +v -0.107933 -0.054562 0.168463 +v -0.009241 -0.155891 0.199859 +v -0.009241 -0.062356 0.199860 +v 0.091927 -0.163685 0.177704 +v 0.091927 -0.070151 0.177704 +v 0.168463 -0.171480 0.107933 +v 0.168463 -0.077945 0.107933 +v 0.199859 -0.179274 0.009241 +v 0.199860 -0.085740 0.009241 +v 0.177704 -0.187069 -0.091927 +v 0.177704 -0.093534 -0.091927 +v 0.107933 -0.194863 -0.168463 +v 0.107933 -0.101329 -0.168463 +v 0.009241 -0.202658 -0.199859 +v 0.009241 -0.109123 -0.199860 +v -0.091927 -0.210452 -0.177704 +v -0.091927 -0.116918 -0.177704 +v -0.168463 -0.218247 -0.107933 +v -0.168463 -0.124713 -0.107933 +v -0.199859 -0.226041 -0.009241 +v -0.199860 -0.132507 -0.009241 +v -0.177704 -0.233836 0.091927 +v -0.177704 -0.140302 0.091927 +v -0.213711 0.247729 0.213711 +v 0.213711 0.247729 0.213711 +v -0.213711 0.247729 -0.213711 +v 0.213711 0.247729 -0.213711 +v -0.213711 -0.247729 0.213711 +v 0.213711 -0.247729 0.213711 +v -0.213711 -0.247729 -0.213711 +v 0.213711 -0.247729 -0.213711 +l 394 396 +l 395 393 +l 396 398 +l 397 395 +l 398 400 +l 399 397 +l 400 402 +l 401 399 +l 402 404 +l 403 401 +l 404 406 +l 405 403 +l 406 408 +l 407 405 +l 408 410 +l 409 407 +l 410 412 +l 411 409 +l 412 414 +l 413 411 +l 414 416 +l 415 413 +l 416 418 +l 417 415 +l 418 420 +l 419 417 +l 420 422 +l 421 419 +l 422 424 +l 423 421 +l 424 426 +l 425 423 +l 426 428 +l 427 425 +l 428 430 +l 429 427 +l 430 432 +l 431 429 +l 432 434 +l 433 431 +l 434 436 +l 435 433 +l 436 438 +l 437 435 +l 438 440 +l 439 437 +l 440 442 +l 441 439 +l 442 444 +l 443 441 +l 444 446 +l 445 443 +l 446 448 +l 447 445 +l 448 450 +l 449 447 +l 450 452 +l 451 449 +l 452 454 +l 453 451 +l 454 456 +l 455 453 +l 456 458 +l 457 455 +l 458 460 +l 459 457 +l 460 462 +l 461 459 +l 462 464 +l 463 461 +l 464 466 +l 465 463 +l 466 468 +l 467 465 +l 468 470 +l 469 467 +l 470 472 +l 471 469 +l 472 474 +l 473 471 +l 474 476 +l 475 473 +l 476 478 +l 477 475 +l 478 480 +l 479 477 +l 480 482 +l 481 479 +l 482 484 +l 483 481 +l 484 486 +l 485 483 +l 486 488 +l 487 485 +l 488 490 +l 489 487 +l 493 491 +l 491 492 +l 492 494 +l 494 493 +l 497 495 +l 495 496 +l 496 498 +l 498 497 +o Plane.002 +v -25.801891 -0.400000 -25.801888 +v 12.900944 -0.400000 -25.801889 +v -0.000001 -0.400000 -25.801889 +v -12.900946 -0.400000 -25.801889 +v -25.801889 -0.400000 -12.900944 +v -25.801889 -0.400000 0.000001 +v -25.801889 -0.400000 12.900946 +v 12.900944 -0.400000 -12.900946 +v 12.900945 -0.400000 -0.000001 +v 12.900946 -0.400000 12.900944 +v -0.000001 -0.400000 -12.900945 +v 0.000000 -0.400000 0.000000 +v 0.000001 -0.400000 12.900945 +v -12.900946 -0.400000 -12.900944 +v -12.900945 -0.400000 0.000001 +v -12.900944 -0.400000 12.900946 +v 25.801891 29.600000 25.801888 +v 25.801888 29.600000 -25.801891 +v -25.801888 29.600000 25.801891 +v -12.900944 29.600000 25.801889 +v 0.000001 29.600000 25.801889 +v 12.900946 29.600000 25.801889 +v 25.801889 29.600000 12.900944 +v 25.801889 29.600000 -0.000001 +v 25.801889 29.600000 -12.900946 +v 25.801891 9.454705 25.801888 +v 15.947186 -0.400000 15.947184 +v 25.319571 6.409433 25.319567 +v 23.919813 3.662254 23.919809 +v 21.739637 1.482081 21.739637 +v 18.992458 0.082323 18.992458 +v 15.947184 -0.400000 -25.801889 +v 25.801888 9.454705 -25.801891 +v 18.992456 0.082323 -25.801889 +v 21.739635 1.482081 -25.801889 +v 23.919809 3.662254 -25.801891 +v 25.319567 6.409433 -25.801891 +v -25.801888 9.454705 25.801891 +v -25.801889 -0.400000 15.947186 +v -25.801888 6.409433 25.319571 +v -25.801888 3.662254 23.919813 +v -25.801889 1.482081 21.739639 +v -25.801889 0.082323 18.992460 +v -12.900944 9.454705 25.801889 +v -12.900944 -0.400000 15.947186 +v -12.900944 6.409433 25.319569 +v -12.900944 3.662254 23.919811 +v -12.900944 1.482081 21.739637 +v -12.900944 0.082323 18.992458 +v 0.000001 9.454705 25.801889 +v 0.000001 -0.400000 15.947185 +v 0.000001 6.409433 25.319569 +v 0.000001 3.662254 23.919811 +v 0.000001 1.482081 21.739637 +v 0.000001 0.082323 18.992458 +v 12.900946 -0.400000 15.947184 +v 12.900946 9.454705 25.801889 +v 12.900946 0.082323 18.992458 +v 12.900946 1.482081 21.739637 +v 12.900946 3.662254 23.919811 +v 12.900946 6.409433 25.319569 +v 25.801889 9.454705 12.900944 +v 15.947186 -0.400000 12.900944 +v 25.319569 6.409433 12.900944 +v 23.919811 3.662254 12.900944 +v 21.739637 1.482081 12.900944 +v 18.992458 0.082323 12.900944 +v 25.801889 9.454705 -0.000001 +v 15.947185 -0.400000 -0.000001 +v 25.319569 6.409433 -0.000001 +v 23.919811 3.662254 -0.000001 +v 21.739637 1.482081 -0.000001 +v 18.992458 0.082323 -0.000001 +v 15.947184 -0.400000 -12.900946 +v 25.801889 9.454705 -12.900946 +v 18.992458 0.082323 -12.900946 +v 21.739637 1.482081 -12.900946 +v 23.919811 3.662254 -12.900946 +v 25.319569 6.409433 -12.900946 +vt 0.750000 0.750000 +vt 1.000000 0.750000 +vt 1.000000 1.000000 +vt 0.750000 1.000000 +vt 0.190969 0.750000 +vt 0.250000 0.750000 +vt 0.250000 1.000000 +vt 0.190969 1.000000 +vt 0.750000 0.250000 +vt 1.000000 0.250000 +vt 1.000000 0.500000 +vt 0.750000 0.500000 +vt 0.000000 0.250000 +vt 0.000000 0.500000 +vt 0.000000 0.500000 +vt 0.000000 0.250000 +vt 0.250000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.750000 +vt 0.500000 0.000000 +vt 0.250000 0.000000 +vt 0.250000 0.000000 +vt 0.500000 0.000000 +vt 0.250000 0.250000 +vt 0.500000 0.250000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.750000 0.000000 +vt 0.750000 0.000000 +vt 0.000000 0.750000 +vt 0.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.750000 +vt 0.500000 1.000000 +vt 0.750000 0.190969 +vt 1.000000 0.190969 +vt 0.190969 0.250000 +vt 0.190969 0.500000 +vt 0.500000 0.190969 +vt 1.000000 0.000000 +vt 1.000000 0.000000 +vt 0.190969 0.190969 +vt 0.250000 0.190969 +vt 0.004673 0.004673 +vt 0.000000 0.250000 +vt 0.018236 0.018236 +vt 0.000000 0.250000 +vt 0.078720 0.078720 +vt 0.078720 0.250000 +vt 0.131956 0.131956 +vt 0.131956 0.250000 +vt 1.000000 0.000000 +vt 0.750000 0.000000 +vt 1.000000 0.000000 +vt 0.750000 0.000000 +vt 1.000000 0.078720 +vt 0.750000 0.078720 +vt 1.000000 0.131956 +vt 0.750000 0.131956 +vt 0.000000 0.750000 +vt 0.000000 1.000000 +vt 0.000000 0.750000 +vt 0.000000 1.000000 +vt 0.078720 0.750000 +vt 0.078720 1.000000 +vt 0.131956 0.750000 +vt 0.131956 1.000000 +vt 0.000000 0.500000 +vt 0.000000 0.500000 +vt 0.078720 0.500000 +vt 0.131956 0.500000 +vt 0.250000 0.000000 +vt 0.250000 0.000000 +vt 0.250000 0.078720 +vt 0.250000 0.131956 +vt 0.500000 0.000000 +vt 0.500000 0.000000 +vt 0.500000 0.078720 +vt 0.500000 0.131956 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.9969 -0.0784 +vn 0.0000 0.0784 -0.9969 +vn 0.0000 0.0000 -1.0000 +vn -0.9969 0.0784 0.0000 +vn -1.0000 0.0000 0.0000 +vn -0.7032 0.1049 -0.7032 +vn -0.7071 0.0000 -0.7071 +vn -0.0784 0.9969 0.0000 +vn -0.0590 0.9965 -0.0590 +vn -0.6543 0.3792 -0.6543 +vn 0.0000 0.3090 -0.9510 +vn -0.5226 0.6736 -0.5226 +vn 0.0000 0.5878 -0.8090 +vn -0.3610 0.8599 -0.3610 +vn 0.0000 0.8090 -0.5878 +vn -0.1980 0.9600 -0.1980 +vn 0.0000 0.9510 -0.3090 +vn -0.9510 0.3090 0.0000 +vn -0.8090 0.5878 0.0000 +vn -0.5878 0.8090 0.0000 +vn -0.3090 0.9510 0.0000 +usemtl Material +s 1 +f 512/1/1 502/2/1 499/3/1 503/4/1 +f 543/5/2 514/6/1 505/7/1 537/8/2 +f 506/9/1 500/10/1 501/11/1 509/12/1 +f 509/12/1 501/11/1 502/2/1 512/1/1 +f 555/13/3 548/14/3 519/15/4 520/16/4 +f 511/17/1 510/18/1 513/19/1 514/6/1 +f 510/18/1 509/12/1 512/1/1 513/19/1 +f 566/20/5 560/21/5 521/22/6 522/23/6 +f 508/24/1 507/25/1 510/18/1 511/17/1 +f 507/25/1 506/9/1 509/12/1 510/18/1 +f 560/21/5 524/26/7 515/27/8 521/22/6 +f 573/28/5 566/20/5 522/23/6 523/29/6 +f 542/30/3 536/31/3 517/32/4 518/33/4 +f 514/6/1 513/19/1 504/34/1 505/7/1 +f 513/19/1 512/1/1 503/4/1 504/34/1 +f 572/35/9 530/36/9 500/10/1 506/9/1 +f 554/37/2 508/24/1 511/17/1 549/38/2 +f 567/39/9 572/35/9 506/9/1 507/25/1 +f 548/14/3 542/30/3 518/33/4 519/15/4 +f 531/40/5 573/28/5 523/29/6 516/41/6 +f 525/42/10 561/43/9 508/24/1 554/37/2 +f 549/38/2 511/17/1 514/6/1 543/5/2 +f 561/43/9 567/39/9 507/25/1 508/24/1 +f 555/13/3 524/26/7 526/44/11 559/45/12 +f 559/45/12 526/44/11 527/46/13 558/47/14 +f 558/47/14 527/46/13 528/48/15 557/49/16 +f 557/49/16 528/48/15 529/50/17 556/51/18 +f 556/51/18 529/50/17 525/42/10 554/37/2 +f 573/28/5 531/40/5 535/52/19 577/53/19 +f 577/53/19 535/52/19 534/54/20 576/55/20 +f 576/55/20 534/54/20 533/56/21 575/57/21 +f 575/57/21 533/56/21 532/58/22 574/59/22 +f 574/59/22 532/58/22 530/36/9 572/35/9 +f 536/31/3 542/30/3 544/60/12 538/61/12 +f 538/61/12 544/60/12 545/62/14 539/63/14 +f 539/63/14 545/62/14 546/64/16 540/65/16 +f 540/65/16 546/64/16 547/66/18 541/67/18 +f 541/67/18 547/66/18 543/5/2 537/8/2 +f 542/30/3 548/14/3 550/68/12 544/60/12 +f 544/60/12 550/68/12 551/69/14 545/62/14 +f 545/62/14 551/69/14 552/70/16 546/64/16 +f 546/64/16 552/70/16 553/71/18 547/66/18 +f 547/66/18 553/71/18 549/38/2 543/5/2 +f 548/14/3 555/13/3 559/45/12 550/68/12 +f 550/68/12 559/45/12 558/47/14 551/69/14 +f 551/69/14 558/47/14 557/49/16 552/70/16 +f 552/70/16 557/49/16 556/51/18 553/71/18 +f 553/71/18 556/51/18 554/37/2 549/38/2 +f 524/26/7 560/21/5 562/72/19 526/44/11 +f 526/44/11 562/72/19 563/73/20 527/46/13 +f 527/46/13 563/73/20 564/74/21 528/48/15 +f 528/48/15 564/74/21 565/75/22 529/50/17 +f 529/50/17 565/75/22 561/43/9 525/42/10 +f 560/21/5 566/20/5 568/76/19 562/72/19 +f 562/72/19 568/76/19 569/77/20 563/73/20 +f 563/73/20 569/77/20 570/78/21 564/74/21 +f 564/74/21 570/78/21 571/79/22 565/75/22 +f 565/75/22 571/79/22 567/39/9 561/43/9 +f 566/20/5 573/28/5 577/53/19 568/76/19 +f 568/76/19 577/53/19 576/55/20 569/77/20 +f 569/77/20 576/55/20 575/57/21 570/78/21 +f 570/78/21 575/57/21 574/59/22 571/79/22 +f 571/79/22 574/59/22 572/35/9 567/39/9 +f 524/26/7 555/13/3 520/16/4 515/27/8 +o body_Cube +v 0.254235 0.327547 1.149074 +v 0.384619 0.726253 1.094295 +v 0.455137 0.605927 1.149073 +v 1.077077 0.725436 1.094294 +v 1.014290 0.605074 1.149073 +v 1.402693 0.293766 1.098267 +v 1.279222 0.248284 1.108287 +v -0.352483 1.028352 1.215657 +v -0.219826 1.028388 1.080882 +v 1.565054 1.294242 1.046329 +v 1.707399 1.309945 1.127201 +v 2.831782 1.457678 1.071917 +v 4.510339 0.896502 1.223162 +v 4.559797 0.880964 0.967660 +v 4.579226 0.874860 0.771405 +v 4.593357 0.870420 0.582556 +v 4.454253 0.914123 0.572001 +v 4.439533 0.918747 0.754061 +v 4.417454 0.925684 0.950007 +v 4.388015 0.934932 1.139782 +v 2.949706 1.425077 1.001572 +v 5.263300 0.678921 0.618622 +v 5.244689 0.678861 0.797696 +v 5.221634 0.680342 0.991729 +v 4.996798 0.762851 1.261154 +v 1.576513 0.927209 1.287802 +v 3.771742 0.824724 1.307131 +v 1.622407 1.232344 1.180735 +v 1.587437 1.036264 1.234268 +v 2.548180 1.365010 1.126986 +v 2.604917 1.371316 1.119272 +v 2.664722 1.377962 1.116186 +v 2.832326 1.397782 1.105385 +v 3.536223 1.170398 1.189848 +v 3.653987 1.130439 1.194291 +v 4.451669 0.873089 1.245391 +v 3.735366 0.916463 1.266720 +v 2.600415 0.978593 1.242381 +v 2.680100 0.974402 1.250494 +v 2.749085 0.970209 1.258608 +v 3.639179 0.919220 1.262664 +v 1.687667 1.241620 1.175412 +v 1.683235 1.030481 1.237318 +v -0.255171 0.386820 1.215657 +v -0.101397 0.394856 1.077283 +v 5.238618 0.635602 0.997901 +v 1.634828 0.286088 1.287802 +v -0.281382 0.317383 1.215657 +v -0.267463 0.198584 1.215657 +v 0.059343 0.011148 1.231419 +v 2.702816 0.874627 1.297719 +v 2.755715 0.269050 1.297719 +v 2.768016 0.062904 1.273429 +v 5.261674 0.632578 0.797696 +v 5.280285 0.631096 0.618622 +v 4.997093 0.698811 1.261154 +v 5.163749 0.112542 1.005257 +v 5.196130 0.125036 0.818790 +v 5.205837 0.128320 0.618437 +v 5.238953 0.318674 1.005257 +v 5.261794 0.318732 0.818790 +v 5.279871 0.318789 0.618437 +v 4.988680 0.316875 1.214330 +v 4.765780 0.629295 1.269970 +v 4.088126 0.643504 1.295840 +v 3.775736 0.242911 1.306232 +v 3.775164 0.059680 1.306167 +v 1.400848 0.296212 1.278235 +v 1.404960 0.066031 1.240691 +v 1.404960 0.066031 1.103692 +v 1.077077 0.725436 1.267940 +v 1.657492 0.064350 1.257060 +v 1.404960 0.066031 1.103692 +v 1.283393 0.065856 1.103695 +v 0.384619 0.726253 1.241718 +v 0.254321 0.011202 1.149074 +v 0.109859 0.366091 1.149074 +v 0.109859 0.366091 1.231795 +v 0.058252 0.011148 1.149074 +v 5.204175 0.223350 1.005257 +v 5.231428 0.229159 0.818790 +v 5.245635 0.230708 0.618437 +v 4.913964 0.077288 1.230531 +v 4.988680 0.316875 1.214330 +v 4.913926 0.219354 1.251986 +v 1.558159 0.385476 1.017171 +v -0.341555 0.983909 1.215657 +v 4.989118 0.317418 1.214915 +v 4.765759 0.705684 1.269973 +v 4.088105 0.719893 1.295571 +v 3.779895 0.249970 1.306096 +v 3.779845 0.248180 1.306095 +v 0.059666 0.298867 1.231795 +v 0.058174 0.298869 1.149074 +v -0.255171 0.386820 1.215657 +v -0.281382 0.317383 1.215657 +v -0.175824 0.382211 1.091985 +v -0.177360 0.312028 1.095234 +v 0.254235 0.327547 -0.402370 +v 0.384619 0.726253 -0.347591 +v 0.455137 0.605927 -0.402370 +v 1.077077 0.725436 -0.347591 +v 1.014290 0.605074 -0.402370 +v 1.402692 0.293766 -0.351564 +v 1.279221 0.248284 -0.361584 +v -0.352592 1.028104 0.373352 +v -0.352484 1.028352 -0.468953 +v -0.225355 1.028386 0.373352 +v -0.219826 1.028388 -0.334178 +v 1.565054 1.294242 -0.299626 +v 1.563203 1.294242 0.373352 +v 1.707399 1.309945 -0.380499 +v 2.831782 1.457678 -0.325215 +v 2.831782 1.457678 0.373351 +v 4.510339 0.896502 -0.476461 +v 4.559796 0.880964 -0.220959 +v 4.579226 0.874860 -0.024703 +v 4.593357 0.870420 0.164146 +v 4.596890 0.869310 0.373351 +v 4.457196 0.913198 0.373351 +v 4.454253 0.914123 0.174701 +v 4.439533 0.918747 -0.007359 +v 4.417454 0.925684 -0.203306 +v 4.388015 0.934932 -0.393081 +v 2.949706 1.425077 -0.254870 +v 2.949706 1.425077 0.373351 +v 5.280077 0.680339 0.373351 +v 5.263300 0.678921 0.128079 +v 5.244689 0.678861 -0.050994 +v 5.221634 0.680342 -0.245028 +v 4.996798 0.762851 -0.514453 +v 1.576512 0.927209 -0.541099 +v 3.771742 0.824724 -0.560429 +v 1.709933 1.306721 0.373351 +v 1.622407 1.232344 -0.434032 +v 1.587437 1.036264 -0.487565 +v 2.548180 1.365010 -0.380283 +v 2.604917 1.371316 -0.372569 +v 2.664722 1.377962 -0.369483 +v 2.832325 1.397782 -0.358683 +v 3.536223 1.170398 -0.443146 +v 3.653987 1.130439 -0.447589 +v 4.451669 0.873089 -0.498690 +v 3.735366 0.916463 -0.520019 +v 2.600415 0.978593 -0.495679 +v 2.680099 0.974402 -0.503792 +v 2.749084 0.970209 -0.511905 +v 3.639179 0.919220 -0.515962 +v 1.687666 1.241620 -0.428709 +v 1.683235 1.030481 -0.490615 +v -0.255170 0.386822 0.373352 +v -0.255172 0.386820 -0.468953 +v -0.122551 0.390906 0.373352 +v -0.101397 0.394856 -0.330579 +v 5.238618 0.635602 -0.251200 +v 1.634828 0.286088 -0.541099 +v -0.281382 0.317383 -0.468953 +v -0.267906 0.198585 0.373352 +v -0.267463 0.198584 -0.468953 +v 0.058252 0.011171 0.373352 +v 0.059342 0.011148 -0.484715 +v 0.249460 0.011006 0.373352 +v 2.702815 0.874627 -0.551016 +v 2.755715 0.269050 -0.551016 +v 2.768016 0.062904 -0.526726 +v 1.404959 0.067243 0.373352 +v 5.261674 0.632578 -0.050994 +v 5.280285 0.631096 0.128079 +v 5.297062 0.630612 0.373351 +v 4.997092 0.698811 -0.514453 +v 5.213069 0.131025 0.373351 +v 5.296334 0.319142 0.373351 +v 5.163749 0.112542 -0.258556 +v 5.196130 0.125036 -0.072089 +v 5.205837 0.128320 0.128264 +v 5.238953 0.318674 -0.258556 +v 5.261794 0.318732 -0.072089 +v 5.279871 0.318789 0.128264 +v 4.988679 0.316875 -0.467629 +v 4.765780 0.629295 -0.523268 +v 4.088126 0.643504 -0.549138 +v 3.775736 0.242911 -0.559530 +v 3.775164 0.059680 -0.559465 +v 1.400847 0.296212 -0.531532 +v 1.404960 0.066031 -0.493988 +v 1.404959 0.066031 -0.356989 +v 1.077077 0.725436 -0.521237 +v 1.657492 0.064350 -0.510357 +v 1.404959 0.066031 -0.356989 +v 1.283392 0.065856 -0.356991 +v 0.384619 0.726253 -0.495015 +v 0.254321 0.011202 -0.402370 +v 0.109859 0.366091 -0.402370 +v 0.109859 0.366091 -0.485091 +v 0.058252 0.011148 -0.402370 +v 5.257829 0.232149 0.373351 +v 5.204175 0.223350 -0.258556 +v 5.231428 0.229159 -0.072089 +v 5.245635 0.230708 0.128264 +v 4.913964 0.077288 -0.483830 +v 4.988679 0.316875 -0.467629 +v 4.913925 0.219354 -0.505285 +v 1.558159 0.385476 -0.270468 +v 1.556493 0.385738 0.373352 +v -0.341411 0.983849 0.373352 +v -0.173953 0.709646 0.373352 +v -0.341555 0.983909 -0.468953 +v 4.989117 0.317418 -0.468214 +v 4.765759 0.705684 -0.523271 +v 4.088105 0.719893 -0.548869 +v 3.779895 0.249970 -0.559394 +v 3.779845 0.248180 -0.559393 +v 0.059666 0.298867 -0.485091 +v 0.058174 0.298869 -0.402370 +v -0.255170 0.386822 0.373352 +v -0.255172 0.386820 -0.468953 +v -0.281382 0.317383 -0.468953 +v -0.175913 0.382508 0.373352 +v -0.175824 0.382211 -0.345281 +v -0.177402 0.312277 0.373352 +v -0.177360 0.312028 -0.348530 +v 2.768016 0.062904 0.373351 +v 3.775164 0.059680 0.373351 +v 3.775164 0.059680 1.022508 +v 3.775164 0.059680 -0.275807 +v 4.921788 0.086235 1.022508 +v 4.921788 0.086235 -0.275807 +v 1.404960 0.066637 1.016522 +v 1.404959 0.066637 -0.269818 +v 0.058797 0.011159 1.016522 +v 0.058797 0.011159 -0.269818 +v -0.177381 0.312153 0.212411 +v -0.175868 0.382360 0.214035 +v -0.281382 0.317383 0.152199 +v -0.281382 0.317383 0.152199 +v -0.267684 0.198584 0.152199 +v -0.281382 0.317383 0.594505 +v -0.281382 0.317383 0.594505 +v -0.175868 0.382360 0.532668 +v -0.177381 0.312153 0.534293 +v -0.267684 0.198584 0.594505 +v -0.267906 0.198585 0.373352 +v -0.267684 0.198584 0.594505 +v -0.281382 0.317383 0.152199 +v -0.267684 0.198584 0.152199 +v -0.281382 0.317383 0.594505 +v -0.267906 0.198585 0.373352 +v -0.267684 0.198584 0.594505 +v -0.281382 0.317383 0.152199 +v -0.267684 0.198584 0.152199 +v -0.281382 0.317383 0.594505 +v -0.198964 0.198585 0.373352 +v -0.212439 0.317384 0.373352 +v -0.198743 0.198584 0.594505 +v -0.212440 0.317383 0.152199 +v -0.198743 0.198584 0.152199 +v -0.212440 0.317383 0.594505 +vt 0.625000 0.250000 +vt 0.625000 0.250000 +vt 0.625000 0.000000 +vt 0.625000 0.000000 +vt 0.624771 0.000000 +vt 0.625000 0.250000 +vt 0.625000 0.250000 +vt 0.625000 0.000000 +vt 0.625000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 0.832051 +vt 0.625000 0.857413 +vt 0.625000 0.250000 +vt 0.625000 0.242972 +vt 0.625000 0.000000 +vt 0.625000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 0.857094 +vt 0.625000 0.820979 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.625000 0.819858 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.501892 0.875440 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.625000 0.250000 +vt 0.625000 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.250000 +vt 0.625000 0.250000 +vt 0.624771 0.000000 +vt 0.625000 0.250000 +vt 0.625000 0.000000 +vt 0.625000 1.000000 +vt 0.625000 0.857413 +vt 0.625000 0.832051 +vt 0.625000 1.000000 +vt 0.625000 0.000000 +vt 0.625000 0.242972 +vt 0.625000 0.250000 +vt 0.625000 1.000000 +vt 0.625000 0.820979 +vt 0.625000 0.857094 +vt 0.625000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.625000 0.819858 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.501892 0.875440 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.312500 0.121486 +vt 0.000000 0.000000 +vt 0.312500 0.121486 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vn 0.0006 0.4143 0.9101 +vn -0.1207 0.1738 0.9774 +vn 0.2258 0.1240 0.9663 +vn -0.0012 -1.0000 0.0000 +vn 0.0404 0.0027 0.9992 +vn -0.9999 -0.0135 -0.0057 +vn 0.0964 -0.9953 0.0023 +vn 0.1319 -0.9913 0.0024 +vn -0.2665 -0.9638 0.0000 +vn -0.3173 -0.9480 -0.0269 +vn -0.2997 -0.9540 -0.0000 +vn -0.2703 -0.9627 -0.0127 +vn -0.2781 -0.9605 -0.0133 +vn -0.2859 -0.9582 -0.0125 +vn -0.2810 -0.9592 0.0323 +vn 0.0537 0.4081 0.9113 +vn 0.0114 0.4322 0.9017 +vn -0.0186 0.3933 0.9192 +vn -0.1427 0.9876 -0.0653 +vn 0.0317 -0.5748 -0.8177 +vn -0.1310 -0.6148 -0.7777 +vn -0.0234 -0.3064 -0.9516 +vn 0.0430 -0.3140 -0.9484 +vn 0.0074 -0.2992 -0.9542 +vn 0.0077 0.2720 0.9623 +vn -0.6892 -0.1146 -0.7155 +vn 0.0013 -1.0000 0.0002 +vn 0.7951 -0.6065 -0.0000 +vn -0.0089 -0.0008 1.0000 +vn 0.0000 0.0000 1.0000 +vn -0.0211 -0.1051 0.9942 +vn -0.9977 0.0018 -0.0676 +vn -0.9930 -0.0060 -0.1178 +vn -0.0386 -0.0043 0.9992 +vn 0.0598 0.0008 0.9982 +vn -0.7983 -0.6022 -0.0000 +vn 0.0338 -0.0005 0.9994 +vn -0.9385 0.3413 -0.0519 +vn -0.9348 0.3293 -0.1333 +vn -0.9229 0.3835 -0.0333 +vn -0.6557 0.1672 -0.7363 +vn 0.0031 -0.0072 1.0000 +vn -0.9954 -0.0027 -0.0962 +vn -0.6895 0.0487 -0.7227 +vn -0.6312 0.2129 -0.7458 +vn -0.9363 0.3299 -0.1206 +vn -0.9372 0.3408 -0.0741 +vn -0.9222 0.3832 -0.0525 +vn 0.0485 0.0025 -0.9988 +vn 0.9999 -0.0004 -0.0156 +vn -0.0547 -0.9985 -0.0013 +vn -0.0566 -0.9984 0.0005 +vn 0.0568 0.9984 0.0002 +vn -0.2017 0.1011 0.9742 +vn 0.9998 -0.0217 -0.0001 +vn 0.0006 0.4143 -0.9101 +vn -0.1207 0.1738 -0.9774 +vn 0.2258 0.1240 -0.9663 +vn 0.0404 0.0027 -0.9992 +vn -0.9999 -0.0135 0.0057 +vn 0.0964 -0.9953 -0.0023 +vn 0.1319 -0.9913 -0.0024 +vn -0.3173 -0.9480 0.0269 +vn -0.2703 -0.9627 0.0127 +vn -0.2781 -0.9605 0.0133 +vn -0.2859 -0.9582 0.0125 +vn -0.2810 -0.9592 -0.0323 +vn 0.0537 0.4081 -0.9113 +vn 0.0114 0.4322 -0.9017 +vn -0.0186 0.3933 -0.9192 +vn -0.1427 0.9876 0.0653 +vn 0.0317 -0.5748 0.8177 +vn -0.1310 -0.6148 0.7777 +vn -0.0234 -0.3064 0.9516 +vn 0.0430 -0.3140 0.9484 +vn 0.0074 -0.2992 0.9542 +vn 0.0077 0.2720 -0.9623 +vn -0.6892 -0.1146 0.7155 +vn 0.0013 -1.0000 -0.0002 +vn -0.0089 -0.0008 -1.0000 +vn 0.9933 0.1155 0.0002 +vn -0.0211 -0.1051 -0.9942 +vn -0.9977 0.0018 0.0676 +vn -0.9930 -0.0060 0.1178 +vn -0.0386 -0.0043 -0.9992 +vn 0.0598 0.0008 -0.9982 +vn 0.0338 -0.0005 -0.9994 +vn -0.9385 0.3413 0.0519 +vn -0.9348 0.3293 0.1333 +vn -0.9229 0.3835 0.0333 +vn -0.6557 0.1672 0.7363 +vn -0.0000 0.0000 -1.0000 +vn 0.9897 0.1431 -0.0000 +vn 0.0031 -0.0072 -1.0000 +vn -0.9954 -0.0027 0.0962 +vn -0.6895 0.0487 0.7227 +vn -0.6312 0.2129 0.7458 +vn -0.9363 0.3299 0.1206 +vn -0.9372 0.3408 0.0741 +vn -0.9222 0.3832 0.0525 +vn 0.0485 0.0025 0.9988 +vn 0.9999 -0.0004 0.0156 +vn -0.0547 -0.9985 0.0013 +vn 0.9998 -0.0217 0.0001 +vn -0.0566 -0.9984 -0.0005 +vn 0.0568 0.9984 -0.0002 +vn -0.2017 0.1011 -0.9742 +vn -0.0028 -1.0000 0.0000 +vn -0.0032 -1.0000 0.0000 +vn -0.0459 0.9989 0.0000 +vn -0.1053 0.9937 0.0388 +vn -0.1053 0.9937 -0.0388 +vn 0.4981 0.8671 0.0004 +vn 0.4981 0.8671 -0.0004 +vn 0.0414 -0.9991 -0.0058 +vn 0.0414 -0.9991 0.0058 +vn 0.0000 1.0000 0.0000 +vn -0.0509 -0.9987 0.0001 +vn 0.9998 -0.0214 0.0002 +vn -0.0509 -0.9987 -0.0001 +vn 0.9998 -0.0214 -0.0002 +vn 0.9933 0.1155 -0.0002 +vn -0.0000 -1.0000 0.0000 +vn 0.9935 0.1136 -0.0005 +vn 0.9935 0.1136 0.0005 +vn -0.9850 -0.1715 0.0191 +vn 1.0000 -0.0074 -0.0027 +vn -0.0289 0.0191 -0.9994 +vn -0.0043 -1.0000 0.0028 +vn -0.0119 -0.2853 -0.9584 +vn -0.0047 -0.3181 -0.9481 +vn -0.0484 -0.3367 -0.9404 +vn -0.3218 -0.9468 -0.0012 +vn -0.1472 0.9891 0.0008 +vn -0.9850 -0.1715 -0.0191 +vn 1.0000 -0.0074 0.0027 +vn -0.0289 0.0191 0.9994 +vn -0.0043 -1.0000 -0.0028 +vn -0.0119 -0.2853 0.9584 +vn -0.0047 -0.3181 0.9481 +vn -0.0484 -0.3367 0.9404 +vn -0.3218 -0.9468 0.0012 +vn -0.1472 0.9891 -0.0008 +vn -0.7639 -0.1569 -0.6259 +vn -0.9294 -0.3539 -0.1047 +vn -0.9363 -0.3379 -0.0960 +vn -0.9424 -0.3282 -0.0651 +vn -0.7639 -0.1569 0.6259 +vn -0.9294 -0.3539 0.1047 +vn -0.9363 -0.3379 0.0960 +vn -0.9424 -0.3282 0.0651 +vn 0.9703 0.2419 -0.0000 +usemtl body +s off +f 580/80/23 582/81/23 581/82/23 579/83/23 +f 580/80/24 579/83/24 654/84/24 578/85/24 +f 584/86/25 583/87/25 581/82/25 582/81/25 +f 579/88/26 581/89/26 648/90/26 652/91/26 +f 584/86/27 651/92/27 650/93/27 647/94/27 583/87/27 +f 583/95/28 647/96/28 646/97/28 645/98/28 +f 688/99/29 711/100/29 588/101/29 587/102/29 +f 589/103/30 588/101/30 711/100/30 691/104/30 +f 691/104/31 703/105/31 598/106/31 589/103/31 +f 589/103/32 598/106/32 597/107/32 590/108/32 +f 597/107/33 596/109/33 595/110/33 594/111/33 697/112/33 696/113/33 593/114/33 592/115/33 591/116/33 590/108/33 +f 704/117/34 599/118/34 593/114/34 696/113/34 +f 592/115/35 593/114/35 599/118/35 600/119/35 +f 591/116/36 592/115/36 600/119/36 601/120/36 +f 590/108/37 591/116/37 601/120/37 602/121/37 +f 604/122/38 602/121/38 613/123/38 614/124/38 +f 604/122/39 614/124/39 618/125/39 617/126/39 616/127/39 615/128/39 620/129/39 606/130/39 603/131/39 628/132/39 +f 585/133/40 603/131/40 606/130/40 605/134/40 588/101/40 +f 587/102/41 586/135/41 585/133/41 588/101/41 +f 589/103/42 610/136/42 609/137/42 608/138/42 607/139/42 619/140/42 605/134/42 588/101/42 +f 590/108/43 602/121/43 613/123/43 612/141/43 611/142/43 610/136/43 589/103/43 +f 612/141/44 614/124/44 618/125/44 611/142/44 +f 609/137/45 617/126/45 616/127/45 608/138/45 +f 608/138/46 616/127/46 615/128/46 607/139/46 +f 606/130/47 620/129/47 619/140/47 605/134/47 +f 585/133/48 586/135/48 622/143/48 621/144/48 664/145/48 +f 683/146/49 685/147/49 586/135/49 585/133/49 +f 652/91/50 655/148/50 654/84/50 579/83/50 +f 628/132/51 603/131/51 624/149/51 629/150/51 +f 814/151/52 818/152/52 820/153/52 823/154/52 +f 644/155/53 643/156/53 629/150/53 624/149/53 645/157/53 646/158/53 649/159/53 630/160/53 +f 639/161/54 632/162/54 746/163/54 749/164/54 +f 638/165/55 637/166/55 623/167/55 631/168/55 +f 585/133/56 664/145/56 621/144/56 655/148/56 652/169/56 648/170/56 645/157/56 624/149/56 603/131/56 +f 642/171/57 641/172/57 640/173/57 665/174/57 666/175/57 667/176/57 668/177/57 669/178/57 +f 581/89/58 583/95/58 645/179/58 648/90/58 +f 642/171/59 669/178/59 643/156/59 644/155/59 +f 659/180/60 636/181/60 635/182/60 658/183/60 +f 657/184/61 658/183/61 635/182/61 634/185/61 +f 748/186/62 636/181/62 659/180/62 773/187/62 +f 662/188/63 657/184/63 634/185/63 660/189/63 +f 669/178/64 668/177/64 667/176/64 666/175/64 665/174/64 633/190/64 602/121/64 604/122/64 628/132/64 629/150/64 643/156/64 +f 632/162/65 639/161/65 638/165/65 631/168/65 +f 623/167/66 637/166/66 661/191/66 665/174/66 633/190/66 +f 662/188/67 661/191/67 637/166/67 657/184/67 +f 637/166/68 638/165/68 658/183/68 657/184/68 +f 638/165/69 639/161/69 659/180/69 658/183/69 +f 749/164/70 773/187/70 659/180/70 639/161/70 +f 656/192/52 653/193/52 578/85/52 654/84/52 671/194/52 +f 625/195/71 670/196/71 627/197/71 626/198/71 +f 627/197/72 656/192/72 671/194/72 670/196/72 +f 675/199/73 671/194/73 670/200/73 625/195/73 673/201/73 +f 654/84/74 655/148/74 672/202/74 674/203/74 +f 728/204/52 621/144/52 672/202/52 792/205/52 +f 792/205/75 672/202/75 674/203/75 816/206/75 795/207/75 +f 671/194/76 654/84/76 674/203/76 675/199/76 +f 816/206/77 674/203/77 675/199/77 817/208/77 +f 678/209/78 677/210/78 679/211/78 680/212/78 +f 678/209/79 676/213/79 770/214/79 677/210/79 +f 682/215/80 680/212/80 679/211/80 681/216/80 +f 677/217/26 768/218/26 764/219/26 679/220/26 +f 682/215/81 681/216/81 763/221/81 766/222/81 767/223/81 +f 681/224/82 761/225/82 762/226/82 763/227/82 +f 688/99/83 687/228/83 689/229/83 711/100/83 +f 690/230/84 691/104/84 711/100/84 689/229/84 +f 691/104/31 690/230/31 702/231/31 703/105/31 +f 690/230/85 692/232/85 701/233/85 702/231/85 +f 701/233/33 692/232/33 693/234/33 694/235/33 695/236/33 696/113/33 697/112/33 698/237/33 699/238/33 700/239/33 +f 704/117/86 696/113/86 695/236/86 705/240/86 +f 694/235/87 706/241/87 705/240/87 695/236/87 +f 693/234/88 707/242/88 706/241/88 694/235/88 +f 692/232/89 708/243/89 707/242/89 693/234/89 +f 710/244/90 721/245/90 720/246/90 708/243/90 +f 710/244/91 740/247/91 709/248/91 713/249/91 727/250/91 722/251/91 723/252/91 724/253/91 725/254/91 721/245/91 +f 684/255/92 689/229/92 712/256/92 713/249/92 709/248/92 +f 687/228/93 689/229/93 684/255/93 686/257/93 +f 690/230/94 689/229/94 712/256/94 726/258/94 714/259/94 715/260/94 716/261/94 717/262/94 +f 692/232/95 690/230/95 717/262/95 718/263/95 719/264/95 720/246/95 708/243/95 +f 719/264/96 718/263/96 725/254/96 721/245/96 +f 716/261/97 715/260/97 723/252/97 724/253/97 +f 715/260/98 714/259/98 722/251/98 723/252/98 +f 713/249/99 712/256/99 726/258/99 727/250/99 +f 684/255/100 784/265/100 729/266/100 731/267/100 686/257/100 +f 683/146/101 684/255/101 686/257/101 685/147/101 +f 768/218/50 677/210/50 770/214/50 771/268/50 +f 740/247/102 741/269/102 733/270/102 709/248/102 +f 813/271/103 736/272/103 734/273/103 812/274/103 +f 760/275/104 742/276/104 765/277/104 762/278/104 761/279/104 733/270/104 741/269/104 759/280/104 +f 755/281/105 749/164/105 746/163/105 745/282/105 +f 754/283/106 744/284/106 732/285/106 753/286/106 +f 684/255/107 709/248/107 733/270/107 761/279/107 764/287/107 768/288/107 771/268/107 729/266/107 784/265/107 +f 758/289/108 789/290/108 788/291/108 787/292/108 786/293/108 785/294/108 756/295/108 757/296/108 +f 679/220/58 764/219/58 761/297/58 681/224/58 +f 758/289/109 760/275/109 759/280/109 789/290/109 +f 776/298/110 775/299/110 751/300/110 752/301/110 +f 774/302/111 750/303/111 751/300/111 775/299/111 +f 748/186/112 773/187/112 776/298/112 752/301/112 +f 779/304/113 777/305/113 750/303/113 774/302/113 +f 685/147/114 783/306/114 782/307/114 683/146/114 +f 664/145/115 621/144/115 672/202/115 792/205/115 793/308/115 729/266/115 784/265/115 782/307/115 +f 789/290/116 759/280/116 741/269/116 740/247/116 710/244/116 708/243/116 747/309/116 785/294/116 786/293/116 787/292/116 788/291/116 +f 745/282/117 744/284/117 754/283/117 755/281/117 +f 732/285/118 747/309/118 785/294/118 778/310/118 753/286/118 +f 779/304/119 774/302/119 753/286/119 778/310/119 +f 753/286/120 774/302/120 775/299/120 754/283/120 +f 754/283/121 775/299/121 776/298/121 755/281/121 +f 749/164/122 755/281/122 776/298/122 773/187/122 +f 772/311/114 791/312/114 770/214/114 676/213/114 769/313/114 +f 734/273/123 736/272/123 738/314/123 790/315/123 +f 738/314/124 790/315/124 791/312/124 772/311/124 +f 798/316/125 794/317/125 734/273/125 790/318/125 791/312/125 +f 810/319/126 809/320/126 798/316/126 796/321/126 +f 770/214/127 796/321/127 793/308/127 771/268/127 +f 728/204/52 792/205/52 793/308/52 729/266/52 +f 792/205/128 795/207/128 810/319/128 796/321/128 793/308/128 +f 791/312/129 798/316/129 796/321/129 770/214/129 +f 646/97/130 647/96/130 650/93/130 805/322/130 743/323/130 806/324/130 766/222/130 763/221/130 762/226/130 765/277/130 742/276/130 799/325/130 630/160/130 649/159/130 +f 630/160/131 799/325/131 742/276/131 760/275/131 802/326/131 800/327/131 801/328/131 644/155/131 +f 751/300/132 750/303/132 804/329/132 802/326/132 800/327/132 801/328/132 803/330/132 634/185/132 635/182/132 636/181/132 748/186/132 752/301/132 +f 660/189/133 634/185/133 803/330/133 +f 777/305/134 804/329/134 750/303/134 +f 737/331/135 808/332/135 738/314/135 736/272/135 813/271/135 735/333/135 +f 807/334/136 737/331/136 735/333/136 818/152/136 626/198/136 627/197/136 +f 808/332/137 806/324/137 743/323/137 739/335/137 737/331/137 +f 737/331/138 739/335/138 743/323/138 805/322/138 807/334/138 +f 734/273/139 794/317/139 811/336/139 812/274/139 +f 794/317/140 798/316/140 809/320/140 811/336/140 +f 795/207/141 797/337/141 809/320/141 810/319/141 +f 813/271/52 812/274/52 821/338/52 822/339/52 +f 673/201/142 815/340/142 817/208/142 675/199/142 +f 795/207/143 816/206/143 817/208/143 797/337/143 +f 625/195/52 814/151/52 815/340/52 673/201/52 +f 625/195/144 626/198/144 818/152/144 814/151/144 +f 823/154/52 820/153/52 825/341/52 828/342/52 +f 820/153/52 819/343/52 824/344/52 825/341/52 +f 735/333/52 813/271/52 822/339/52 819/343/52 +f 818/152/52 735/333/52 819/343/52 820/153/52 +f 824/344/145 827/345/145 833/346/145 829/347/145 +f 822/339/52 821/338/52 826/348/52 827/345/52 +f 819/343/52 822/339/52 827/345/52 824/344/52 +f 834/349/146 831/350/146 829/347/146 830/351/146 +f 829/347/147 833/346/147 832/352/147 830/351/147 +f 825/341/145 824/344/145 829/347/145 831/350/145 +f 828/342/52 825/341/52 831/350/52 834/349/52 +f 827/345/114 826/348/114 832/352/114 833/346/114 +usemtl wheel +f 586/135/148 685/147/148 783/306/148 730/353/148 622/143/148 +f 688/99/149 587/102/149 663/354/149 781/355/149 +f 586/135/150 587/102/150 663/354/150 622/143/150 +f 622/143/151 730/353/151 781/355/151 663/354/151 +f 607/139/152 615/128/152 620/129/152 619/140/152 +f 609/137/153 610/136/153 611/142/153 618/125/153 617/126/153 +f 613/123/154 614/124/154 612/141/154 +f 697/112/155 594/111/155 595/110/155 596/109/155 597/107/155 598/106/155 703/105/155 +f 586/135/156 587/102/156 688/99/156 685/147/156 +f 686/257/157 731/267/157 730/353/157 783/306/157 685/147/157 +f 688/99/158 781/355/158 780/356/158 687/228/158 +f 686/257/159 731/267/159 780/356/159 687/228/159 +f 731/267/160 780/356/160 781/355/160 730/353/160 +f 714/259/161 726/258/161 727/250/161 722/251/161 +f 716/261/162 724/253/162 725/254/162 718/263/162 717/262/162 +f 720/246/163 719/264/163 721/245/163 +f 697/112/164 703/105/164 702/231/164 701/233/164 700/239/164 699/238/164 698/237/164 +f 686/257/165 685/147/165 688/99/165 687/228/165 +usemtl light +f 602/121/166 601/120/166 623/167/166 633/190/166 +f 601/120/167 600/119/167 631/168/167 623/167/167 +f 600/119/168 599/118/168 632/162/168 631/168/168 +f 599/118/169 704/117/169 746/163/169 632/162/169 +f 708/243/170 747/309/170 732/285/170 707/242/170 +f 707/242/171 732/285/171 744/284/171 706/241/171 +f 706/241/172 744/284/172 745/282/172 705/240/172 +f 705/240/173 745/282/173 746/163/173 704/117/173 +usemtl stop_light +f 683/146/174 585/133/174 664/145/174 782/307/174 +f 683/146/174 782/307/174 784/265/174 684/255/174 +l 629 630 +l 616 628 +l 604 643 +l 624 649 +l 741 742 +l 723 740 +l 710 759 +l 733 765 +o bamper_r_Cube.010 +v 0.058253 0.011148 1.149074 +v 0.058156 0.366374 1.149074 +v 0.254321 0.011202 1.149073 +v 0.254235 0.327547 1.149073 +v 0.133846 0.011169 1.356133 +v 0.133749 0.366395 1.356133 +v 0.254321 0.011202 1.407554 +v 0.254235 0.327547 1.407554 +v 0.384619 0.726253 1.149073 +v 0.455138 0.605927 1.149073 +v 0.384619 0.726253 1.356133 +v 0.455138 0.605927 1.407554 +v 1.077077 0.725436 1.149073 +v 1.014290 0.605074 1.149073 +v 1.077077 0.725436 1.356132 +v 1.014290 0.605074 1.407553 +v 1.402693 0.293766 1.153046 +v 1.279222 0.248284 1.153046 +v 1.279222 0.248284 1.403580 +v 1.402693 0.293766 1.352159 +v 1.405018 0.082249 1.158623 +v 1.279310 0.080228 1.158623 +v 1.279310 0.080228 1.398004 +v 1.405018 0.082249 1.353086 +v 1.406955 -0.038222 1.158623 +v 1.281247 -0.040244 1.158623 +v 1.281247 -0.040244 1.398004 +v 1.406955 -0.038222 1.398004 +v 3.901107 0.081650 1.398003 +v 3.901107 0.081650 1.158623 +v 3.903044 -0.038821 1.398003 +v 3.903044 -0.038821 1.158623 +v 3.775158 0.081681 1.346582 +v 3.775158 0.081681 1.158623 +v 3.777095 -0.038791 1.398003 +v 3.777095 -0.038791 1.158623 +v 3.896440 0.202218 1.398003 +v 3.896440 0.202218 1.158623 +v 3.779895 0.249970 1.346582 +v 3.779895 0.249970 1.158623 +v 4.150678 0.599145 1.398003 +v 4.150678 0.599145 1.158623 +v 4.088105 0.719893 1.346582 +v 4.088105 0.719893 1.158623 +v 4.715717 0.588927 1.398003 +v 4.715717 0.588927 1.158622 +v 4.765759 0.705684 1.346582 +v 4.765759 0.705684 1.158622 +v 4.929092 0.311883 1.312100 +v 4.909438 0.311878 1.262495 +v 5.001042 0.311805 1.247520 +v 4.987175 0.313003 1.203194 +v 0.254321 0.011202 1.256588 +v 0.254235 0.327547 1.256588 +v 0.059343 0.011148 1.231419 +v 0.059246 0.366374 1.231419 +v 0.455138 0.605927 1.256588 +v 0.384619 0.726253 1.235200 +v 1.014290 0.605074 1.256588 +v 1.077077 0.725436 1.235200 +v 1.279222 0.248284 1.257256 +v 1.402693 0.293766 1.235868 +v 1.279310 0.080228 1.258194 +v 1.405018 0.082249 1.239510 +v 1.281247 -0.040244 1.258194 +v 1.406955 -0.038222 1.258194 +v 3.901107 0.081650 1.258193 +v 3.903044 -0.038821 1.258193 +v 3.777095 -0.038791 1.258193 +v 3.775158 0.081681 1.236804 +v 3.896440 0.202218 1.258193 +v 3.779895 0.249970 1.236804 +v 4.150678 0.599145 1.258193 +v 4.088105 0.719893 1.236804 +v 4.715717 0.588927 1.258193 +v 4.765759 0.705684 1.236804 +v 4.917613 0.311880 1.283129 +v 4.992943 0.312505 1.221632 +vt 0.125000 0.500000 +vt 0.125000 0.750000 +vt 0.625000 0.000000 +vt 0.625000 0.250000 +vt 0.625000 0.896012 +vt 0.625000 1.000000 +vt 0.228988 0.750000 +vt 0.228988 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.625000 0.500000 +vt 0.625000 0.500000 +vt 0.625000 0.750000 +vt 0.625000 0.250000 +vt 0.625000 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.250000 +vt 0.625000 0.896012 +vt 0.625000 0.353988 +vt 0.625000 0.353988 +vt 0.625000 0.896012 +vt 0.625000 0.750000 +vt 0.625000 0.750000 +vt 0.625000 0.896012 +vt 0.625000 0.353988 +vt 0.625000 0.500000 +vt 0.625000 0.500000 +vt 0.625000 0.500000 +vt 0.625000 0.750000 +vt 0.625000 0.250000 +vt 0.625000 0.353988 +vt 0.625000 0.000000 +vt 0.625000 0.750000 +vt 0.625000 0.750000 +vt 0.625000 0.750000 +vt 0.625000 0.750000 +vt 0.625000 0.000000 +vt 0.625000 0.250000 +vt 0.625000 0.896012 +vt 0.625000 0.353988 +vt 0.771012 0.500000 +vt 0.875000 0.500000 +vt 0.875000 0.750000 +vt 0.771012 0.750000 +vt 0.625000 0.250000 +vt 0.625000 0.353988 +vt 0.625000 0.500000 +vt 0.625000 0.750000 +vt 0.625000 0.000000 +vt 0.625000 0.896012 +vt 0.625000 0.750000 +vt 0.625000 0.896012 +vt 0.625000 0.750000 +vt 0.625000 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.000000 +vt 0.771012 0.750000 +vt 0.875000 0.750000 +vt 0.875000 0.750000 +vt 0.771012 0.750000 +vt 0.625000 0.896012 +vt 0.625000 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.896012 +vt 0.625000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 0.896012 +vt 0.625000 0.000000 +vt 0.625000 0.000000 +vt 0.625000 1.000000 +vt 0.625000 0.896012 +vt 0.625000 0.750000 +vt 0.625000 0.896012 +vt 0.625000 0.750000 +vt 0.625000 0.896012 +vt 0.625000 0.750000 +vt 0.625000 0.750000 +vt 0.625000 0.896012 +vt 0.625000 1.000000 +vt 0.625000 0.896012 +vt 0.625000 0.750000 +vt 0.625000 0.750000 +vt 0.625000 0.000000 +vt 0.625000 0.000000 +vt 0.625000 1.000000 +vt 0.625000 0.896012 +vt 0.625000 0.317551 +vt 0.625000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 1.000000 +vn -0.0000 -0.0000 -1.0000 +vn -0.9999 -0.0003 0.0132 +vn 0.0003 -1.0000 0.0000 +vn -0.3128 0.2214 0.9237 +vn -0.7602 0.6074 0.2305 +vn 0.8109 -0.5852 0.0000 +vn 0.7983 0.6022 0.0000 +vn 0.0012 1.0000 0.0000 +vn -0.0015 -1.0000 0.0000 +vn 0.0005 0.3929 0.9196 +vn 0.3621 -0.0091 0.9321 +vn -0.8029 -0.5962 0.0000 +vn 0.3110 0.2236 0.9237 +vn 0.0054 -0.0060 -1.0000 +vn -0.3904 0.0001 0.9206 +vn 0.0056 -0.0293 -0.9996 +vn 0.9999 0.0110 0.0000 +vn -1.0000 -0.0005 0.0000 +vn 0.0161 -0.9999 0.0000 +vn -0.9999 -0.0161 0.0000 +vn 0.1700 0.1832 0.9683 +vn 0.9999 0.0161 0.0000 +vn -0.1959 0.2017 0.9597 +vn -0.0002 -1.0000 0.0000 +vn 0.0014 0.3713 0.9285 +vn 0.0002 1.0000 0.0000 +vn -0.9996 0.0281 0.0000 +vn 0.9993 0.0387 0.0000 +vn 0.8421 -0.5394 0.0000 +vn -0.8362 0.5484 0.0000 +vn -0.3281 0.2129 0.9203 +vn 0.8581 0.5112 -0.0486 +vn -0.0181 -0.9998 0.0000 +vn 0.0210 0.9998 0.0000 +vn 0.0078 0.3977 0.9175 +vn 0.5862 0.1738 0.7913 +vn -0.1552 -0.3045 -0.9398 +vn -0.8187 -0.5716 0.0557 +vn -0.0055 -0.9999 -0.0107 +vn -0.3926 -0.0001 0.9197 +vn 1.0000 0.0003 0.0000 +vn 0.0011 -0.9999 -0.0131 +vn -0.7962 -0.6027 0.0542 +vn 0.8682 0.4938 -0.0493 +vn -0.7412 0.6712 0.0048 +vn -0.8585 -0.0002 0.5128 +usemtl Material.002 +s off +f 837/357/175 835/358/175 836/359/175 838/360/175 +f 890/361/176 836/362/176 835/358/176 889/363/176 +f 887/364/177 841/365/177 839/366/177 889/363/177 +f 840/367/178 842/368/178 846/369/178 845/370/178 +f 844/371/175 843/372/175 847/373/175 848/374/175 +f 838/360/175 836/359/175 843/372/175 844/371/175 +f 890/361/179 840/367/179 845/370/179 892/375/179 +f 888/376/180 838/360/180 844/371/180 891/377/180 +f 894/378/181 849/379/181 854/380/181 896/381/181 +f 892/375/182 845/370/182 849/379/182 894/378/182 +f 891/377/183 844/371/183 848/374/183 893/382/183 +f 845/370/184 846/369/184 850/383/184 849/379/184 +f 854/380/185 853/384/185 857/385/185 858/386/185 +f 893/382/186 848/374/186 852/387/186 895/388/186 +f 849/379/187 850/383/187 853/384/187 854/380/187 +f 848/374/188 847/373/188 851/389/188 852/387/188 +f 867/390/189 863/391/189 871/392/189 873/393/189 +f 852/387/190 851/389/190 855/394/190 856/395/190 +f 896/381/191 854/380/191 858/386/191 898/396/191 +f 895/388/192 852/387/192 856/395/192 897/397/192 +f 899/398/193 860/399/193 859/400/193 900/401/193 +f 897/397/194 856/395/194 860/402/194 899/403/194 +f 858/386/195 857/385/195 861/404/195 862/405/195 +f 856/395/175 855/394/175 859/406/175 860/402/175 +f 901/407/196 863/391/196 865/408/196 902/409/196 +f 867/390/197 869/410/197 865/408/197 863/391/197 +f 870/411/175 868/412/175 864/413/175 866/414/175 +f 903/415/198 870/416/198 866/417/198 902/418/198 +f 900/401/198 859/400/198 870/416/198 903/415/198 +f 859/406/175 855/394/175 868/412/175 870/411/175 +f 858/386/199 862/405/199 869/410/199 867/390/199 +f 898/396/200 858/386/200 867/390/200 904/419/200 +f 872/420/175 874/421/175 878/422/175 876/423/175 +f 904/419/201 867/390/201 873/393/201 906/424/201 +f 901/407/202 864/425/202 872/426/202 905/427/202 +f 864/413/175 868/412/175 874/421/175 872/420/175 +f 876/423/175 878/422/175 882/428/175 880/429/175 +f 905/427/203 872/426/203 876/430/203 907/431/203 +f 906/424/204 873/393/204 877/432/204 908/433/204 +f 873/393/205 871/392/205 875/434/205 877/432/205 +f 910/435/206 881/436/206 885/437/206 912/438/206 +f 907/431/207 876/430/207 880/439/207 909/440/207 +f 908/433/208 877/432/208 881/436/208 910/435/208 +f 877/432/209 875/434/209 879/441/209 881/436/209 +f 881/436/210 879/441/210 883/442/210 885/437/210 +f 880/429/211 882/428/211 886/443/211 884/444/211 +f 909/440/212 880/439/212 884/445/212 911/446/212 +f 911/447/213 912/438/213 885/437/213 883/442/213 +f 839/366/214 841/365/214 842/368/214 840/367/214 +f 887/364/215 837/357/215 838/360/215 888/376/215 +f 841/365/215 887/364/215 888/376/215 842/368/215 +f 884/444/216 886/448/216 912/438/216 911/447/216 +f 879/441/217 909/440/217 911/446/217 883/442/217 +f 878/449/208 908/433/208 910/435/208 882/450/208 +f 875/434/207 907/431/207 909/440/207 879/441/207 +f 882/450/218 910/435/218 912/438/218 886/448/218 +f 874/451/204 906/424/204 908/433/204 878/449/204 +f 871/392/203 905/427/203 907/431/203 875/434/203 +f 863/391/202 901/407/202 905/427/202 871/392/202 +f 868/452/201 904/419/201 906/424/201 874/451/201 +f 855/453/200 898/396/200 904/419/200 868/452/200 +f 862/405/198 900/401/198 903/415/198 869/410/198 +f 869/410/198 903/415/198 902/418/198 865/408/198 +f 864/425/196 901/407/196 902/409/196 866/454/196 +f 857/385/194 897/397/194 899/403/194 861/404/194 +f 861/404/193 899/398/193 900/401/193 862/405/193 +f 853/384/192 895/388/192 897/397/192 857/385/192 +f 851/455/191 896/381/191 898/396/191 855/453/191 +f 850/383/186 893/382/186 895/388/186 853/384/186 +f 846/369/183 891/377/183 893/382/183 850/383/183 +f 843/456/182 892/375/182 894/378/182 847/457/182 +f 847/457/181 894/378/181 896/381/181 851/455/181 +f 842/368/180 888/376/180 891/377/180 846/369/180 +f 836/362/219 890/361/219 892/375/219 843/456/219 +f 837/357/177 887/364/177 889/363/177 835/358/177 +f 840/367/220 890/361/220 889/363/220 839/366/220 +o bamper_l_Cube.001 +v 5.238954 0.318674 1.005257 +v 5.261794 0.318732 0.818790 +v 5.279871 0.318789 0.618437 +v 5.204175 0.223350 1.005257 +v 5.231428 0.229159 0.818790 +v 5.245634 0.230708 0.618437 +v 4.913898 0.317040 1.278038 +v 4.913925 0.219354 1.251986 +v 5.302251 0.310065 0.619957 +v 5.284346 0.310656 0.821122 +v 5.259512 0.311524 1.015525 +v 5.223902 0.216516 1.017232 +v 5.253980 0.221090 0.821152 +v 5.268020 0.222002 0.619966 +v 4.929119 0.214197 1.269925 +v 4.929092 0.311883 1.312100 +v 5.296334 0.319142 0.373351 +v 5.238954 0.318674 -0.258556 +v 5.261794 0.318732 -0.072089 +v 5.279871 0.318789 0.128264 +v 5.257829 0.232149 0.373351 +v 5.204175 0.223350 -0.258556 +v 5.231428 0.229159 -0.072089 +v 5.245634 0.230708 0.128264 +v 4.913898 0.317040 -0.531337 +v 4.913925 0.219354 -0.505285 +v 5.318529 0.309921 0.373351 +v 5.302251 0.310065 0.126744 +v 5.284346 0.310656 -0.074420 +v 5.259512 0.311524 -0.268824 +v 5.223902 0.216516 -0.270531 +v 5.253980 0.221090 -0.074451 +v 5.268020 0.222002 0.126735 +v 5.280024 0.222927 0.373351 +v 4.929119 0.214197 -0.523224 +v 4.929092 0.311883 -0.565399 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vn -0.3228 -0.9457 -0.0384 +vn 0.1604 0.9665 0.2002 +vn 0.3097 0.9481 0.0722 +vn -0.9222 0.3832 -0.0523 +vn -0.9343 0.3327 -0.1282 +vn -0.9372 0.3408 -0.0741 +vn -0.6361 0.2693 -0.7231 +vn 0.3473 0.9373 0.0302 +vn 0.8654 0.1654 -0.4729 +vn 0.3723 0.9278 0.0228 +vn -0.3726 -0.9276 -0.0252 +vn -0.3478 -0.9371 -0.0299 +vn -0.3228 -0.9457 0.0384 +vn 0.1604 0.9665 -0.2002 +vn 0.3097 0.9481 -0.0722 +vn -0.9222 0.3832 0.0523 +vn -0.9343 0.3327 0.1282 +vn -0.9372 0.3408 0.0741 +vn -0.6361 0.2693 0.7231 +vn 0.3473 0.9373 -0.0302 +vn 0.8654 0.1654 0.4729 +vn 0.3723 0.9278 -0.0228 +vn -0.3726 -0.9276 0.0252 +vn -0.0000 0.0000 -1.0000 +vn -0.3478 -0.9371 0.0299 +vn -0.1375 -0.9774 -0.1605 +vn -0.1375 -0.9774 0.1605 +usemtl body +s off +f 913/458/221 914/459/221 922/460/221 923/461/221 +f 916/462/222 920/463/222 927/464/222 924/465/222 +f 917/466/223 916/462/223 924/465/223 925/467/223 +f 946/468/224 926/469/224 921/470/224 939/471/224 +f 923/461/225 922/460/225 925/467/225 924/465/225 +f 921/470/226 926/469/226 925/467/226 922/460/226 +f 923/461/227 924/465/227 927/464/227 928/472/227 +f 918/473/228 917/466/228 925/467/228 926/469/228 +f 919/474/229 928/472/229 927/464/229 920/463/229 +f 933/475/230 918/473/230 926/469/230 946/468/230 +f 915/476/231 929/477/231 939/471/231 921/470/231 +f 914/459/232 915/476/232 921/470/232 922/460/232 +f 930/478/233 942/479/233 941/480/233 931/481/233 +f 934/482/234 943/483/234 947/484/234 938/485/234 +f 935/486/235 944/487/235 943/483/235 934/482/235 +f 946/468/236 939/471/236 940/488/236 945/489/236 +f 942/479/237 943/483/237 944/487/237 941/480/237 +f 940/488/238 941/480/238 944/487/238 945/489/238 +f 942/479/239 948/490/239 947/484/239 943/483/239 +f 936/491/240 945/489/240 944/487/240 935/486/240 +f 937/492/241 938/485/241 947/484/241 948/490/241 +f 933/475/242 946/468/242 945/489/242 936/491/242 +f 932/493/243 940/488/243 939/471/243 929/477/243 +f 929/477/244 939/471/244 946/468/244 933/475/244 +f 931/481/245 941/480/245 940/488/245 932/493/245 +usemtl riting +f 919/474/246 913/458/246 923/461/246 928/472/246 +f 937/492/247 948/490/247 942/479/247 930/478/247 +o bamper_d_Cube.005 +v 0.058252 0.011148 -0.402369 +v 0.058155 0.366374 -0.402369 +v 0.254321 0.011202 -0.402370 +v 0.254235 0.327547 -0.402370 +v 0.133846 0.011169 -0.609429 +v 0.133749 0.366395 -0.609429 +v 0.254321 0.011202 -0.660850 +v 0.254235 0.327547 -0.660850 +v 0.384618 0.726253 -0.402370 +v 0.455137 0.605927 -0.402370 +v 0.384618 0.726253 -0.609429 +v 0.455137 0.605927 -0.660850 +v 1.077077 0.725436 -0.402370 +v 1.014290 0.605074 -0.402370 +v 1.077077 0.725436 -0.609429 +v 1.014290 0.605074 -0.660850 +v 1.402692 0.293766 -0.406343 +v 1.279221 0.248284 -0.406343 +v 1.279221 0.248284 -0.656877 +v 1.402692 0.293766 -0.605456 +v 1.405017 0.082249 -0.411920 +v 1.279310 0.080228 -0.411920 +v 1.279310 0.080228 -0.651300 +v 1.405017 0.082249 -0.606382 +v 1.406954 -0.038222 -0.411920 +v 1.281247 -0.040244 -0.411920 +v 1.281247 -0.040244 -0.651300 +v 1.406954 -0.038222 -0.651300 +v 3.901106 0.081651 -0.651301 +v 3.901106 0.081651 -0.411920 +v 3.903043 -0.038821 -0.651301 +v 3.903043 -0.038821 -0.411920 +v 3.775157 0.081681 -0.599880 +v 3.775158 0.081681 -0.411920 +v 3.777095 -0.038790 -0.651301 +v 3.777095 -0.038790 -0.411920 +v 3.896439 0.202218 -0.651301 +v 3.896439 0.202218 -0.411920 +v 3.779894 0.249971 -0.599880 +v 3.779894 0.249971 -0.411920 +v 4.150677 0.599145 -0.651301 +v 4.150677 0.599145 -0.411920 +v 4.088104 0.719893 -0.599880 +v 4.088104 0.719893 -0.411920 +v 4.715716 0.588928 -0.651301 +v 4.715716 0.588928 -0.411921 +v 4.765759 0.705684 -0.599880 +v 4.765759 0.705684 -0.411921 +v 4.929091 0.311884 -0.565398 +v 4.909437 0.311878 -0.515794 +v 5.001041 0.311805 -0.500818 +v 4.987174 0.313003 -0.456493 +v 0.254321 0.011202 -0.509885 +v 0.254235 0.327547 -0.509885 +v 0.059342 0.011148 -0.484715 +v 0.059245 0.366374 -0.484715 +v 0.455137 0.605927 -0.509885 +v 0.384618 0.726253 -0.488496 +v 1.014290 0.605074 -0.509885 +v 1.077077 0.725436 -0.488496 +v 1.279221 0.248284 -0.510553 +v 1.402692 0.293766 -0.489164 +v 1.279310 0.080228 -0.511490 +v 1.405017 0.082249 -0.492807 +v 1.281247 -0.040244 -0.511490 +v 1.406954 -0.038222 -0.511490 +v 3.901106 0.081651 -0.511491 +v 3.903043 -0.038821 -0.511491 +v 3.777095 -0.038790 -0.511491 +v 3.775157 0.081681 -0.490102 +v 3.896439 0.202218 -0.511491 +v 3.779894 0.249971 -0.490102 +v 4.150677 0.599145 -0.511491 +v 4.088104 0.719893 -0.490102 +v 4.715716 0.588928 -0.511491 +v 4.765759 0.705684 -0.490103 +v 4.917613 0.311880 -0.536427 +v 4.992942 0.312505 -0.474930 +vt 0.125000 0.500000 +vt 0.625000 0.250000 +vt 0.625000 0.000000 +vt 0.125000 0.750000 +vt 0.625000 0.896012 +vt 0.228988 0.750000 +vt 0.625000 1.000000 +vt 0.228988 0.500000 +vt 0.375000 0.750000 +vt 0.375000 0.500000 +vt 0.625000 0.750000 +vt 0.625000 0.750000 +vt 0.625000 0.500000 +vt 0.625000 0.500000 +vt 0.625000 0.250000 +vt 0.625000 0.250000 +vt 0.625000 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.896012 +vt 0.625000 0.353988 +vt 0.625000 0.353988 +vt 0.625000 0.896012 +vt 0.625000 0.896012 +vt 0.625000 0.750000 +vt 0.625000 0.750000 +vt 0.625000 0.353988 +vt 0.625000 0.500000 +vt 0.625000 0.750000 +vt 0.625000 0.500000 +vt 0.625000 0.500000 +vt 0.625000 0.353988 +vt 0.625000 0.250000 +vt 0.625000 0.000000 +vt 0.625000 0.750000 +vt 0.625000 0.750000 +vt 0.625000 0.750000 +vt 0.625000 0.750000 +vt 0.625000 0.250000 +vt 0.625000 0.000000 +vt 0.625000 0.896012 +vt 0.625000 0.353988 +vt 0.771012 0.500000 +vt 0.771012 0.750000 +vt 0.875000 0.750000 +vt 0.875000 0.500000 +vt 0.625000 0.353988 +vt 0.625000 0.250000 +vt 0.625000 0.750000 +vt 0.625000 0.500000 +vt 0.625000 0.000000 +vt 0.625000 0.896012 +vt 0.625000 0.896012 +vt 0.625000 0.750000 +vt 0.625000 0.750000 +vt 0.625000 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.000000 +vt 0.771012 0.750000 +vt 0.771012 0.750000 +vt 0.875000 0.750000 +vt 0.875000 0.750000 +vt 0.625000 0.896012 +vt 0.625000 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.896012 +vt 0.625000 0.896012 +vt 0.625000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.896012 +vt 0.625000 1.000000 +vt 0.625000 0.896012 +vt 0.625000 0.750000 +vt 0.625000 0.750000 +vt 0.625000 0.896012 +vt 0.625000 0.896012 +vt 0.625000 0.750000 +vt 0.625000 0.750000 +vt 0.625000 0.896012 +vt 0.625000 1.000000 +vt 0.625000 0.750000 +vt 0.625000 0.750000 +vt 0.625000 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.896012 +vt 0.625000 1.000000 +vt 0.625000 0.317551 +vt 0.625000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 1.000000 +vn 0.0000 0.0000 1.0000 +vn -0.9999 -0.0003 -0.0132 +vn 0.0003 -1.0000 0.0000 +vn -0.3128 0.2214 -0.9237 +vn -0.7602 0.6074 -0.2305 +vn 0.8109 -0.5852 0.0000 +vn 0.7983 0.6022 0.0000 +vn 0.0012 1.0000 0.0000 +vn -0.0015 -1.0000 0.0000 +vn 0.0005 0.3929 -0.9196 +vn 0.3621 -0.0091 -0.9321 +vn -0.8029 -0.5962 0.0000 +vn 0.3110 0.2236 -0.9237 +vn 0.0054 -0.0060 1.0000 +vn -0.3904 0.0001 -0.9206 +vn 0.0056 -0.0293 0.9996 +vn 0.9999 0.0110 0.0000 +vn -1.0000 -0.0005 0.0000 +vn 0.0161 -0.9999 0.0000 +vn -0.9999 -0.0161 0.0000 +vn 0.1700 0.1832 -0.9683 +vn 0.9999 0.0161 0.0000 +vn -0.1959 0.2017 -0.9597 +vn -0.0002 -1.0000 0.0000 +vn 0.0014 0.3713 -0.9285 +vn 0.0002 1.0000 0.0000 +vn -0.9996 0.0281 0.0000 +vn 0.9993 0.0387 0.0000 +vn 0.8421 -0.5394 0.0000 +vn -0.8362 0.5484 0.0000 +vn -0.3281 0.2129 -0.9203 +vn 0.8581 0.5112 0.0486 +vn -0.0181 -0.9998 0.0000 +vn 0.0210 0.9998 0.0000 +vn 0.0078 0.3977 -0.9175 +vn 0.5862 0.1738 -0.7913 +vn -0.1552 -0.3045 0.9398 +vn -0.8187 -0.5716 -0.0557 +vn -0.0055 -0.9999 0.0107 +vn -0.3926 -0.0001 -0.9197 +vn 1.0000 0.0003 0.0000 +vn 0.0011 -0.9999 0.0131 +vn -0.7962 -0.6027 -0.0542 +vn 0.8682 0.4938 0.0493 +vn -0.7412 0.6712 -0.0048 +vn -0.8585 -0.0002 -0.5129 +usemtl Material.002 +s off +f 951/494/248 952/495/248 950/496/248 949/497/248 +f 1004/498/249 1003/499/249 949/497/249 950/500/249 +f 1001/501/250 1003/499/250 953/502/250 955/503/250 +f 954/504/251 959/505/251 960/506/251 956/507/251 +f 958/508/248 962/509/248 961/510/248 957/511/248 +f 952/495/248 958/508/248 957/511/248 950/496/248 +f 1004/498/252 1006/512/252 959/505/252 954/504/252 +f 1002/513/253 1005/514/253 958/508/253 952/495/253 +f 1008/515/254 1010/516/254 968/517/254 963/518/254 +f 1006/512/255 1008/515/255 963/518/255 959/505/255 +f 1005/514/256 1007/519/256 962/509/256 958/508/256 +f 959/505/257 963/518/257 964/520/257 960/506/257 +f 968/517/258 972/521/258 971/522/258 967/523/258 +f 1007/519/259 1009/524/259 966/525/259 962/509/259 +f 963/518/260 968/517/260 967/523/260 964/520/260 +f 962/509/261 966/525/261 965/526/261 961/510/261 +f 981/527/262 987/528/262 985/529/262 977/530/262 +f 966/525/263 970/531/263 969/532/263 965/526/263 +f 1010/516/264 1012/533/264 972/521/264 968/517/264 +f 1009/524/265 1011/534/265 970/531/265 966/525/265 +f 1013/535/266 1014/536/266 973/537/266 974/538/266 +f 1011/534/267 1013/539/267 974/540/267 970/531/267 +f 972/521/268 976/541/268 975/542/268 971/522/268 +f 970/531/248 974/540/248 973/543/248 969/532/248 +f 1015/544/269 1016/545/269 979/546/269 977/530/269 +f 981/527/270 977/530/270 979/546/270 983/547/270 +f 984/548/248 980/549/248 978/550/248 982/551/248 +f 1017/552/271 1016/553/271 980/554/271 984/555/271 +f 1014/536/271 1017/552/271 984/555/271 973/537/271 +f 973/543/248 984/548/248 982/551/248 969/532/248 +f 972/521/272 981/527/272 983/547/272 976/541/272 +f 1012/533/273 1018/556/273 981/527/273 972/521/273 +f 986/557/248 990/558/248 992/559/248 988/560/248 +f 1018/556/274 1020/561/274 987/528/274 981/527/274 +f 1015/544/275 1019/562/275 986/563/275 978/564/275 +f 978/550/248 986/557/248 988/560/248 982/551/248 +f 990/558/248 994/565/248 996/566/248 992/559/248 +f 1019/562/276 1021/567/276 990/568/276 986/563/276 +f 1020/561/277 1022/569/277 991/570/277 987/528/277 +f 987/528/278 991/570/278 989/571/278 985/529/278 +f 1024/572/279 1026/573/279 999/574/279 995/575/279 +f 1021/567/280 1023/576/280 994/577/280 990/568/280 +f 1022/569/281 1024/572/281 995/575/281 991/570/281 +f 991/570/282 995/575/282 993/578/282 989/571/282 +f 995/575/283 999/574/283 997/579/283 993/578/283 +f 994/565/284 998/580/284 1000/581/284 996/566/284 +f 1023/576/285 1025/582/285 998/583/285 994/577/285 +f 1025/584/286 997/579/286 999/574/286 1026/573/286 +f 953/502/287 954/504/287 956/507/287 955/503/287 +f 1001/501/288 1002/513/288 952/495/288 951/494/288 +f 955/503/288 956/507/288 1002/513/288 1001/501/288 +f 998/580/289 1025/584/289 1026/573/289 1000/585/289 +f 993/578/290 997/579/290 1025/582/290 1023/576/290 +f 992/586/281 996/587/281 1024/572/281 1022/569/281 +f 989/571/280 993/578/280 1023/576/280 1021/567/280 +f 996/587/291 1000/585/291 1026/573/291 1024/572/291 +f 988/588/277 992/586/277 1022/569/277 1020/561/277 +f 985/529/276 989/571/276 1021/567/276 1019/562/276 +f 977/530/275 985/529/275 1019/562/275 1015/544/275 +f 982/589/274 988/588/274 1020/561/274 1018/556/274 +f 969/590/273 982/589/273 1018/556/273 1012/533/273 +f 976/541/271 983/547/271 1017/552/271 1014/536/271 +f 983/547/271 979/546/271 1016/553/271 1017/552/271 +f 978/564/269 980/591/269 1016/545/269 1015/544/269 +f 971/522/267 975/542/267 1013/539/267 1011/534/267 +f 975/542/266 976/541/266 1014/536/266 1013/535/266 +f 967/523/265 971/522/265 1011/534/265 1009/524/265 +f 965/592/264 969/590/264 1012/533/264 1010/516/264 +f 964/520/259 967/523/259 1009/524/259 1007/519/259 +f 960/506/256 964/520/256 1007/519/256 1005/514/256 +f 957/593/255 961/594/255 1008/515/255 1006/512/255 +f 961/594/254 965/592/254 1010/516/254 1008/515/254 +f 956/507/253 960/506/253 1005/514/253 1002/513/253 +f 950/500/292 957/593/292 1006/512/292 1004/498/292 +f 951/494/250 949/497/250 1003/499/250 1001/501/250 +f 954/504/293 953/502/293 1003/499/293 1004/498/293 +o WBL_b1_Cylinder.020 +v 0.368343 0.079860 -0.329276 +v 0.332480 0.079850 -0.332450 +v 0.306226 0.079843 -0.341119 +v 0.332480 0.079850 -0.633065 +v 0.306226 0.079843 -0.624395 +v 0.375873 0.003621 -0.329276 +v 0.340701 -0.003385 -0.332450 +v 0.314953 -0.008514 -0.341119 +v 0.340701 -0.003385 -0.633065 +v 0.314953 -0.008514 -0.624395 +v 0.398132 -0.069685 -0.329276 +v 0.365003 -0.083418 -0.332450 +v 0.340750 -0.093472 -0.341119 +v 0.365003 -0.083418 -0.633065 +v 0.340750 -0.093472 -0.624395 +v 0.434264 -0.137239 -0.329276 +v 0.404450 -0.157172 -0.332450 +v 0.382625 -0.171764 -0.341119 +v 0.404450 -0.157172 -0.633065 +v 0.382625 -0.171764 -0.624395 +v 0.482881 -0.196447 -0.329276 +v 0.457529 -0.221813 -0.332450 +v 0.438970 -0.240382 -0.341119 +v 0.457529 -0.221813 -0.633065 +v 0.438970 -0.240382 -0.624395 +v 0.542115 -0.245031 -0.329276 +v 0.522199 -0.274856 -0.332450 +v 0.507619 -0.296689 -0.341120 +v 0.958475 -0.332860 -0.555456 +v 0.522199 -0.274856 -0.633065 +v 0.507619 -0.296689 -0.624395 +v 0.609689 -0.281127 -0.329276 +v 0.934695 -0.343520 -0.491009 +v 0.595974 -0.314264 -0.332450 +v 0.585934 -0.338522 -0.341120 +v 0.958475 -0.332861 -0.426562 +v 0.595974 -0.314264 -0.633065 +v 0.585934 -0.338522 -0.624395 +v 0.683007 -0.303346 -0.329276 +v 0.933321 -0.340205 -0.482757 +v 0.676020 -0.338522 -0.332450 +v 0.670906 -0.364272 -0.341120 +v 0.934695 -0.343520 -0.474506 +v 0.676020 -0.338522 -0.633065 +v 0.670906 -0.364272 -0.624395 +v 0.759250 -0.310834 -0.329276 +v 0.956915 -0.329629 -0.546701 +v 0.759261 -0.346697 -0.332450 +v 0.759268 -0.372951 -0.341120 +v 0.958475 -0.332861 -0.538953 +v 0.759260 -0.346697 -0.633065 +v 0.759268 -0.372951 -0.624395 +v 0.835490 -0.303304 -0.329276 +v 0.956915 -0.329629 -0.418814 +v 0.842496 -0.338476 -0.332450 +v 0.847625 -0.364224 -0.341120 +v 0.958475 -0.332860 -0.410058 +v 0.842496 -0.338476 -0.633065 +v 0.847625 -0.364224 -0.624395 +v 0.908796 -0.281045 -0.329276 +v 0.934694 -0.343520 -0.611652 +v 0.922529 -0.314174 -0.332450 +v 0.932582 -0.338427 -0.341120 +v 0.934694 -0.343520 -0.353863 +v 0.922529 -0.314174 -0.633065 +v 0.932582 -0.338427 -0.624395 +v 0.976350 -0.244913 -0.329276 +v 1.035184 -0.286040 -0.555456 +v 0.996282 -0.274726 -0.332450 +v 1.010874 -0.296552 -0.341120 +v 1.013940 -0.301135 -0.491009 +v 0.996282 -0.274726 -0.633065 +v 1.010874 -0.296552 -0.624395 +v 1.035557 -0.196295 -0.329276 +v 1.035184 -0.286040 -0.426562 +v 1.060924 -0.221647 -0.332450 +v 1.079493 -0.240206 -0.341120 +v 1.033023 -0.283175 -0.418814 +v 1.060923 -0.221647 -0.633065 +v 1.079493 -0.240206 -0.624395 +v 1.084142 -0.137061 -0.329276 +v 1.035184 -0.286040 -0.410058 +v 1.113967 -0.156977 -0.332450 +v 1.135800 -0.171557 -0.341120 +v 1.033023 -0.283175 -0.546701 +v 1.113967 -0.156977 -0.633065 +v 1.135800 -0.171558 -0.624395 +v 1.120238 -0.069487 -0.329276 +v 1.035184 -0.286040 -0.538953 +v 1.153374 -0.083202 -0.332450 +v 1.177633 -0.093242 -0.341120 +v 1.011945 -0.298152 -0.482757 +v 1.153374 -0.083202 -0.633065 +v 1.177633 -0.093242 -0.624395 +v 1.142456 0.003831 -0.329276 +v 1.013940 -0.301135 -0.474506 +v 1.177632 -0.003156 -0.332450 +v 1.203383 -0.008271 -0.341120 +v 1.013940 -0.301135 -0.611652 +v 1.177632 -0.003156 -0.633065 +v 1.203383 -0.008271 -0.624395 +v 1.149945 0.080074 -0.329276 +v 1.013940 -0.301135 -0.353863 +v 1.185808 0.080084 -0.332450 +v 1.212062 0.080091 -0.341120 +v 1.101284 -0.225155 -0.555456 +v 1.185808 0.080084 -0.633065 +v 1.212062 0.080091 -0.624395 +v 1.142414 0.156314 -0.329276 +v 1.083393 -0.244104 -0.491009 +v 1.177587 0.163320 -0.332450 +v 1.203335 0.168449 -0.341120 +v 1.101284 -0.225155 -0.426562 +v 1.177587 0.163320 -0.633065 +v 1.203335 0.168449 -0.624395 +v 1.120156 0.229619 -0.329276 +v 1.098606 -0.222766 -0.546701 +v 1.153285 0.243352 -0.332450 +v 1.177538 0.253406 -0.341120 +v 1.101284 -0.225155 -0.538953 +v 1.153285 0.243353 -0.633065 +v 1.177538 0.253406 -0.624395 +v 1.084023 0.297174 -0.329276 +v 1.080855 -0.241567 -0.482757 +v 1.113837 0.317107 -0.332450 +v 1.135662 0.331698 -0.341120 +v 1.083393 -0.244104 -0.474506 +v 1.113837 0.317107 -0.633065 +v 1.135662 0.331698 -0.624395 +v 1.035405 0.356381 -0.329276 +v 1.098606 -0.222767 -0.418814 +v 1.060758 0.381748 -0.332450 +v 1.079317 0.400316 -0.341120 +v 1.101284 -0.225155 -0.410058 +v 1.060758 0.381748 -0.633065 +v 1.079317 0.400316 -0.624395 +v 0.976172 0.404966 -0.329276 +v 1.083393 -0.244104 -0.611652 +v 0.996088 0.434791 -0.332450 +v 1.010668 0.456624 -0.341120 +v 1.083393 -0.244104 -0.353863 +v 0.996088 0.434791 -0.633065 +v 1.010668 0.456624 -0.624395 +v 0.908597 0.441061 -0.329276 +v 1.154237 -0.152544 -0.555456 +v 0.922312 0.474198 -0.332450 +v 0.932353 0.498456 -0.341120 +v 1.140386 -0.174619 -0.491009 +v 0.922312 0.474198 -0.633065 +v 0.932353 0.498456 -0.624395 +v 0.835280 0.463280 -0.329276 +v 1.154237 -0.152543 -0.426562 +v 0.842266 0.498456 -0.332450 +v 0.847381 0.524207 -0.341120 +v 1.137402 -0.172626 -0.482757 +v 0.842266 0.498456 -0.633065 +v 0.847381 0.524207 -0.624395 +v 0.759036 0.470768 -0.329276 +v 1.140386 -0.174619 -0.474506 +v 0.759026 0.506631 -0.332450 +v 0.759019 0.532885 -0.341120 +v 1.151144 -0.150724 -0.546701 +v 0.759026 0.506631 -0.633065 +v 0.759019 0.532885 -0.624395 +v 0.682797 0.463238 -0.329276 +v 1.154237 -0.152543 -0.538953 +v 0.675790 0.498410 -0.332450 +v 0.670661 0.524158 -0.341120 +v 1.151144 -0.150724 -0.418814 +v 0.675790 0.498410 -0.633065 +v 0.670661 0.524158 -0.624395 +v 0.609491 0.440979 -0.329276 +v 1.154237 -0.152544 -0.410058 +v 0.595758 0.474108 -0.332450 +v 0.585704 0.498361 -0.341119 +v 1.140385 -0.174619 -0.611652 +v 0.595758 0.474108 -0.633065 +v 0.585704 0.498361 -0.624395 +v 0.541937 0.404846 -0.329276 +v 1.140385 -0.174619 -0.353863 +v 0.522004 0.434660 -0.332450 +v 0.507412 0.456485 -0.341119 +v 1.192005 -0.070997 -0.555456 +v 0.522004 0.434660 -0.633065 +v 0.507412 0.456485 -0.624395 +v 0.482730 0.356229 -0.329276 +v 1.182728 -0.095350 -0.491009 +v 0.457363 0.381581 -0.332450 +v 0.438794 0.400141 -0.341119 +v 1.192005 -0.070997 -0.426562 +v 0.457363 0.381581 -0.633065 +v 0.438794 0.400141 -0.624395 +v 0.434145 0.296995 -0.329276 +v 1.188617 -0.069815 -0.418814 +v 0.404320 0.316912 -0.332450 +v 0.382487 0.331491 -0.341119 +v 1.192005 -0.070997 -0.410058 +v 0.404320 0.316912 -0.633065 +v 0.382487 0.331491 -0.624395 +v 0.398049 0.229420 -0.329276 +v 1.188617 -0.069815 -0.546701 +v 0.364913 0.243136 -0.332450 +v 0.340654 0.253176 -0.341119 +v 1.192005 -0.070997 -0.538953 +v 0.364913 0.243136 -0.633065 +v 0.340654 0.253176 -0.624395 +v 0.375831 0.156103 -0.329276 +v 1.179412 -0.093978 -0.482757 +v 0.340655 0.163090 -0.332450 +v 0.314904 0.168205 -0.341119 +v 1.182728 -0.095350 -0.474506 +v 0.340655 0.163090 -0.633065 +v 0.314904 0.168205 -0.624395 +v 1.182727 -0.095350 -0.611652 +v 1.182727 -0.095350 -0.353863 +v 1.213140 0.016351 -0.555456 +v 1.208791 -0.009344 -0.491009 +v 1.213140 0.016351 -0.426562 +v 1.205272 -0.008645 -0.482757 +v 1.208791 -0.009344 -0.474506 +v 1.209586 0.016849 -0.418814 +v 1.213140 0.016351 -0.410058 +v 1.209586 0.016849 -0.546701 +v 1.213140 0.016351 -0.538953 +v 1.208791 -0.009344 -0.611652 +v 1.208791 -0.009344 -0.353863 +v 1.216827 0.106144 -0.555456 +v 1.217575 0.080094 -0.491009 +v 1.216827 0.106144 -0.426562 +v 1.213245 0.105939 -0.418814 +v 1.216827 0.106144 -0.410058 +v 1.213245 0.105939 -0.546701 +v 1.216827 0.106144 -0.538953 +v 1.213987 0.080093 -0.482757 +v 1.217575 0.080094 -0.474506 +v 1.217575 0.080093 -0.611652 +v 1.217575 0.080093 -0.353863 +v 1.202926 0.194930 -0.555456 +v 1.208742 0.169527 -0.491009 +v 1.202926 0.194930 -0.426562 +v 1.205223 0.168826 -0.482757 +v 1.208742 0.169527 -0.474506 +v 1.199453 0.194030 -0.546701 +v 1.202926 0.194930 -0.538953 +v 1.199453 0.194030 -0.418814 +v 1.202926 0.194930 -0.410058 +v 1.208742 0.169527 -0.611652 +v 1.208742 0.169527 -0.353863 +v 1.171971 0.279299 -0.555456 +v 1.182631 0.255518 -0.491009 +v 1.171971 0.279299 -0.426562 +v 1.168740 0.277739 -0.418814 +v 1.171971 0.279299 -0.410058 +v 1.168740 0.277739 -0.546701 +v 1.171971 0.279299 -0.538953 +v 1.179316 0.254144 -0.482757 +v 1.182631 0.255518 -0.474506 +v 1.182631 0.255518 -0.611652 +v 1.182631 0.255518 -0.353863 +v 1.125151 0.356008 -0.555456 +v 1.140245 0.334764 -0.491009 +v 1.125151 0.356008 -0.426562 +v 1.122286 0.353847 -0.546701 +v 1.125151 0.356008 -0.538952 +v 1.137262 0.332769 -0.482757 +v 1.140245 0.334764 -0.474506 +v 1.122286 0.353847 -0.418814 +v 1.125151 0.356008 -0.410058 +v 1.140245 0.334763 -0.611652 +v 1.140245 0.334763 -0.353863 +v 1.064265 0.422108 -0.555456 +v 1.083214 0.404217 -0.491009 +v 1.064265 0.422108 -0.426562 +v 1.080678 0.401679 -0.482757 +v 1.083214 0.404217 -0.474505 +v 1.061877 0.419430 -0.546701 +v 1.064265 0.422108 -0.538952 +v 1.061877 0.419430 -0.418814 +v 1.064265 0.422108 -0.410058 +v 1.083214 0.404217 -0.611651 +v 1.083214 0.404217 -0.353863 +v 0.991654 0.475060 -0.555456 +v 1.013729 0.461210 -0.491009 +v 0.991654 0.475060 -0.426562 +v 0.989834 0.471968 -0.418814 +v 0.991654 0.475060 -0.410058 +v 0.989834 0.471968 -0.546701 +v 0.991654 0.475060 -0.538952 +v 1.011736 0.458226 -0.482757 +v 1.013729 0.461210 -0.474505 +v 1.013729 0.461209 -0.611651 +v 1.013729 0.461209 -0.353863 +v 0.910107 0.512829 -0.555456 +v 0.934460 0.503551 -0.491009 +v 0.910107 0.512829 -0.426562 +v 0.933089 0.500236 -0.482757 +v 0.934460 0.503551 -0.474505 +v 0.908926 0.509441 -0.418814 +v 0.910107 0.512829 -0.410058 +v 0.908926 0.509441 -0.546701 +v 0.910107 0.512829 -0.538952 +v 0.934461 0.503551 -0.611651 +v 0.934461 0.503551 -0.353863 +v 0.822759 0.533964 -0.555456 +v 0.848455 0.529615 -0.491009 +v 0.822760 0.533964 -0.426562 +v 0.822262 0.530410 -0.418814 +v 0.822759 0.533964 -0.410058 +v 0.822262 0.530410 -0.546701 +v 0.822760 0.533964 -0.538952 +v 0.847756 0.526095 -0.482757 +v 0.848455 0.529615 -0.474505 +v 0.848455 0.529615 -0.611651 +v 0.848455 0.529615 -0.353863 +v 0.732967 0.537651 -0.555456 +v 0.759016 0.538399 -0.491009 +v 0.732967 0.537651 -0.426562 +v 0.759018 0.534811 -0.482757 +v 0.759016 0.538399 -0.474505 +v 0.733172 0.534069 -0.546701 +v 0.732967 0.537651 -0.538952 +v 0.733172 0.534069 -0.418814 +v 0.732967 0.537651 -0.410058 +v 0.759017 0.538399 -0.611651 +v 0.759017 0.538399 -0.353863 +v 0.644180 0.523750 -0.555456 +v 0.669584 0.529565 -0.491009 +v 0.644180 0.523750 -0.426562 +v 0.645080 0.520276 -0.418814 +v 0.644180 0.523750 -0.410058 +v 0.645080 0.520276 -0.546701 +v 0.644180 0.523750 -0.538952 +v 0.670284 0.526046 -0.482757 +v 0.669584 0.529565 -0.474505 +v 0.669584 0.529565 -0.611651 +v 0.669584 0.529565 -0.353863 +v 0.559811 0.492795 -0.555456 +v 0.583592 0.503455 -0.491009 +v 0.559811 0.492795 -0.426562 +v 0.561372 0.489563 -0.546701 +v 0.559811 0.492795 -0.538952 +v 0.584966 0.500139 -0.482757 +v 0.583592 0.503455 -0.474505 +v 0.561372 0.489563 -0.418814 +v 0.559811 0.492795 -0.410058 +v 0.583592 0.503454 -0.611651 +v 0.583592 0.503454 -0.353863 +v 0.483103 0.445974 -0.555456 +v 0.504347 0.461069 -0.491009 +v 0.483103 0.445974 -0.426562 +v 0.506341 0.458086 -0.482757 +v 0.504347 0.461069 -0.474505 +v 0.485264 0.443109 -0.546701 +v 0.483103 0.445974 -0.538952 +v 0.485264 0.443109 -0.418813 +v 0.483103 0.445974 -0.410058 +v 0.504347 0.461069 -0.611651 +v 0.504347 0.461069 -0.353863 +v 0.417003 0.385088 -0.555456 +v 0.434894 0.404037 -0.491009 +v 0.417003 0.385089 -0.426562 +v 0.419681 0.382700 -0.418813 +v 0.417003 0.385088 -0.410058 +v 0.419681 0.382700 -0.546701 +v 0.417003 0.385089 -0.538952 +v 0.437432 0.401501 -0.482757 +v 0.434894 0.404037 -0.474505 +v 0.434894 0.404038 -0.611651 +v 0.434894 0.404038 -0.353863 +v 0.364051 0.312477 -0.555456 +v 0.377901 0.334553 -0.491009 +v 0.364051 0.312478 -0.426562 +v 0.380885 0.332560 -0.482757 +v 0.377901 0.334553 -0.474505 +v 0.367143 0.310657 -0.418813 +v 0.364051 0.312477 -0.410058 +v 0.367143 0.310657 -0.546701 +v 0.364051 0.312478 -0.538952 +v 0.377902 0.334553 -0.611651 +v 0.377902 0.334553 -0.353863 +v 0.326282 0.230931 -0.555456 +v 0.335559 0.255284 -0.491009 +v 0.326282 0.230931 -0.426562 +v 0.338875 0.253912 -0.482757 +v 0.335559 0.255284 -0.474505 +v 0.329669 0.229749 -0.546701 +v 0.326282 0.230931 -0.538952 +v 0.329669 0.229749 -0.418813 +v 0.326282 0.230931 -0.410058 +v 0.335560 0.255284 -0.611651 +v 0.335560 0.255284 -0.353863 +v 0.305147 0.143583 -0.538952 +v 0.309496 0.169278 -0.474505 +v 0.305147 0.143583 -0.410058 +v 0.308701 0.143085 -0.418813 +v 0.305147 0.143583 -0.426562 +v 0.308701 0.143085 -0.546701 +v 0.305147 0.143583 -0.555456 +v 0.313015 0.168579 -0.482757 +v 0.309496 0.169278 -0.491009 +v 0.309496 0.169278 -0.611651 +v 0.309496 0.169278 -0.353863 +v 0.301460 0.053791 -0.555456 +v 0.300712 0.079841 -0.491009 +v 0.301460 0.053791 -0.426562 +v 0.304300 0.079842 -0.482757 +v 0.300712 0.079841 -0.474505 +v 0.305042 0.053996 -0.418813 +v 0.301460 0.053791 -0.410058 +v 0.305042 0.053996 -0.546701 +v 0.301460 0.053791 -0.538952 +v 0.300713 0.079841 -0.611651 +v 0.300713 0.079841 -0.353863 +v 0.315361 -0.034996 -0.538952 +v 0.309545 -0.009593 -0.474505 +v 0.315361 -0.034996 -0.410058 +v 0.318835 -0.034096 -0.546701 +v 0.315361 -0.034996 -0.555456 +v 0.313065 -0.008891 -0.482757 +v 0.309545 -0.009593 -0.491009 +v 0.318835 -0.034096 -0.418813 +v 0.315361 -0.034996 -0.426562 +v 0.309546 -0.009592 -0.611651 +v 0.309546 -0.009592 -0.353863 +v 0.346316 -0.119365 -0.538952 +v 0.335657 -0.095584 -0.474505 +v 0.346316 -0.119365 -0.410058 +v 0.349547 -0.117804 -0.418813 +v 0.346316 -0.119365 -0.426562 +v 0.349547 -0.117804 -0.546701 +v 0.346316 -0.119365 -0.555456 +v 0.338971 -0.094210 -0.482757 +v 0.335657 -0.095584 -0.491009 +v 0.335657 -0.095584 -0.611651 +v 0.335657 -0.095584 -0.353863 +v 0.393137 -0.196073 -0.555456 +v 0.378042 -0.174829 -0.491009 +v 0.393137 -0.196073 -0.426562 +v 0.381025 -0.172835 -0.482757 +v 0.378042 -0.174829 -0.474505 +v 0.396001 -0.193913 -0.546701 +v 0.393137 -0.196073 -0.538952 +v 0.396001 -0.193913 -0.418813 +v 0.393137 -0.196073 -0.410058 +v 0.378042 -0.174829 -0.611651 +v 0.378042 -0.174829 -0.353863 +v 0.454022 -0.262174 -0.555456 +v 0.435073 -0.244282 -0.491009 +v 0.454021 -0.262173 -0.426562 +v 0.456410 -0.259496 -0.418813 +v 0.454022 -0.262174 -0.410058 +v 0.456410 -0.259496 -0.546701 +v 0.454021 -0.262173 -0.538952 +v 0.437609 -0.241745 -0.482757 +v 0.435073 -0.244282 -0.474505 +v 0.435073 -0.244282 -0.611651 +v 0.435073 -0.244282 -0.353863 +v 0.526633 -0.315126 -0.555456 +v 0.504558 -0.301275 -0.491009 +v 0.526633 -0.315126 -0.426562 +v 0.528453 -0.312033 -0.546701 +v 0.526633 -0.315126 -0.538952 +v 0.506551 -0.298291 -0.482757 +v 0.504558 -0.301275 -0.474505 +v 0.528453 -0.312033 -0.418814 +v 0.526633 -0.315126 -0.410058 +v 0.504557 -0.301275 -0.611651 +v 0.504558 -0.301275 -0.353863 +v 0.785320 -0.377716 -0.555456 +v 0.759270 -0.378465 -0.491009 +v 0.785320 -0.377717 -0.426562 +v 0.759269 -0.374876 -0.482757 +v 0.759270 -0.378465 -0.474505 +v 0.785115 -0.374134 -0.418814 +v 0.785320 -0.377716 -0.410058 +v 0.785115 -0.374134 -0.546701 +v 0.785320 -0.377717 -0.538952 +v 0.759270 -0.378465 -0.611651 +v 0.759270 -0.378464 -0.353863 +v 0.695527 -0.374029 -0.555456 +v 0.669832 -0.369681 -0.491009 +v 0.695527 -0.374029 -0.426562 +v 0.696025 -0.370476 -0.418814 +v 0.695527 -0.374029 -0.410058 +v 0.696025 -0.370476 -0.546701 +v 0.695527 -0.374029 -0.538952 +v 0.670531 -0.366161 -0.482757 +v 0.669832 -0.369681 -0.474505 +v 0.669832 -0.369681 -0.611651 +v 0.669832 -0.369681 -0.353863 +v 0.608179 -0.352895 -0.555456 +v 0.583826 -0.343617 -0.491009 +v 0.608179 -0.352895 -0.426562 +v 0.585199 -0.340302 -0.482757 +v 0.583826 -0.343617 -0.474505 +v 0.609361 -0.349507 -0.546701 +v 0.608179 -0.352895 -0.538952 +v 0.609361 -0.349507 -0.418814 +v 0.608179 -0.352895 -0.410058 +v 0.583826 -0.343617 -0.611651 +v 0.583826 -0.343617 -0.353863 +v 0.297508 0.088917 -0.352963 +v 0.297513 0.070763 -0.352963 +v 0.298974 0.079841 -0.350057 +v 0.297513 0.070763 -0.612552 +v 0.297508 0.088917 -0.612552 +v 0.298974 0.079841 -0.615457 +v 0.304632 -0.001315 -0.352963 +v 0.308179 -0.019120 -0.352963 +v 0.307841 -0.009931 -0.350057 +v 0.308179 -0.019120 -0.612552 +v 0.304632 -0.001315 -0.612552 +v 0.307841 -0.009931 -0.615457 +v 0.329223 -0.088425 -0.352963 +v 0.336175 -0.105195 -0.352963 +v 0.334051 -0.096249 -0.350057 +v 0.336175 -0.105195 -0.612552 +v 0.329223 -0.088425 -0.612552 +v 0.334051 -0.096249 -0.615457 +v 0.370335 -0.169062 -0.352963 +v 0.380425 -0.184155 -0.352963 +v 0.376597 -0.175794 -0.350057 +v 0.380425 -0.184155 -0.612552 +v 0.370335 -0.169062 -0.612552 +v 0.376597 -0.175794 -0.615457 +v 0.426389 -0.240130 -0.352963 +v 0.439230 -0.252964 -0.352963 +v 0.433843 -0.245511 -0.350057 +v 0.439230 -0.252964 -0.612552 +v 0.426389 -0.240130 -0.612552 +v 0.433843 -0.245511 -0.615457 +v 0.495231 -0.298897 -0.352963 +v 0.510329 -0.308979 -0.352963 +v 0.503592 -0.302720 -0.350057 +v 0.510329 -0.308978 -0.612552 +v 0.495230 -0.298897 -0.612552 +v 0.503592 -0.302720 -0.615457 +v 0.574214 -0.343104 -0.352963 +v 0.590989 -0.350047 -0.352963 +v 0.583161 -0.345223 -0.350057 +v 0.590989 -0.350047 -0.612552 +v 0.574214 -0.343104 -0.612552 +v 0.583161 -0.345223 -0.615457 +v 0.660305 -0.371053 -0.352963 +v 0.678112 -0.374589 -0.352963 +v 0.669492 -0.371385 -0.350057 +v 0.678111 -0.374589 -0.612552 +v 0.660305 -0.371053 -0.612552 +v 0.669492 -0.371385 -0.615457 +v 0.750194 -0.381669 -0.352963 +v 0.768348 -0.381664 -0.352963 +v 0.759270 -0.380203 -0.350057 +v 0.768348 -0.381664 -0.612552 +v 0.750193 -0.381669 -0.612552 +v 0.759269 -0.380203 -0.615457 +v 0.840426 -0.374545 -0.352963 +v 0.858231 -0.370998 -0.352963 +v 0.849042 -0.371336 -0.350057 +v 0.858231 -0.370998 -0.612552 +v 0.840426 -0.374545 -0.612552 +v 0.849042 -0.371336 -0.615457 +v 0.927535 -0.349954 -0.352963 +v 0.944306 -0.343002 -0.352963 +v 0.935359 -0.345126 -0.350057 +v 0.944306 -0.343002 -0.612552 +v 0.927535 -0.349954 -0.612552 +v 0.935359 -0.345126 -0.615457 +v 1.008173 -0.308842 -0.352963 +v 1.023265 -0.298751 -0.352963 +v 1.014905 -0.302580 -0.350057 +v 1.023265 -0.298751 -0.612552 +v 1.008173 -0.308842 -0.612552 +v 1.014905 -0.302580 -0.615457 +v 1.079241 -0.252788 -0.352963 +v 1.092074 -0.239947 -0.352963 +v 1.084622 -0.245333 -0.350057 +v 1.092074 -0.239947 -0.612552 +v 1.079241 -0.252788 -0.612552 +v 1.084622 -0.245333 -0.615457 +v 1.138007 -0.183946 -0.352963 +v 1.148089 -0.168848 -0.352963 +v 1.141831 -0.175585 -0.350057 +v 1.148089 -0.168848 -0.612552 +v 1.138007 -0.183946 -0.612552 +v 1.141831 -0.175585 -0.615457 +v 1.182214 -0.104962 -0.352963 +v 1.189157 -0.088188 -0.352963 +v 1.184333 -0.096016 -0.350057 +v 1.189157 -0.088188 -0.612552 +v 1.182214 -0.104962 -0.612552 +v 1.184333 -0.096016 -0.615457 +v 1.210163 -0.018872 -0.352963 +v 1.213700 -0.001065 -0.352963 +v 1.210496 -0.009684 -0.350057 +v 1.213700 -0.001065 -0.612552 +v 1.210163 -0.018872 -0.612552 +v 1.210496 -0.009684 -0.615457 +v 1.220779 0.071017 -0.352963 +v 1.220774 0.089172 -0.352963 +v 1.219313 0.080093 -0.350057 +v 1.220774 0.089172 -0.612552 +v 1.220779 0.071017 -0.612552 +v 1.219313 0.080093 -0.615457 +v 1.213655 0.161250 -0.352963 +v 1.210109 0.179054 -0.352963 +v 1.210447 0.169866 -0.350057 +v 1.210109 0.179054 -0.612552 +v 1.213655 0.161250 -0.612552 +v 1.210447 0.169866 -0.615457 +v 1.189064 0.248359 -0.352963 +v 1.182112 0.265129 -0.352963 +v 1.184237 0.256183 -0.350057 +v 1.182112 0.265130 -0.612552 +v 1.189064 0.248359 -0.612552 +v 1.184237 0.256183 -0.615457 +v 1.147952 0.328997 -0.352963 +v 1.137861 0.344089 -0.352963 +v 1.141690 0.335729 -0.350057 +v 1.137861 0.344089 -0.612552 +v 1.147952 0.328997 -0.612552 +v 1.141690 0.335729 -0.615457 +v 1.091898 0.400065 -0.352963 +v 1.079057 0.412898 -0.352963 +v 1.084443 0.405446 -0.350057 +v 1.079057 0.412898 -0.612552 +v 1.091898 0.400064 -0.612552 +v 1.084443 0.405446 -0.615457 +v 1.023056 0.458831 -0.352963 +v 1.007958 0.468913 -0.352963 +v 1.014695 0.462655 -0.350057 +v 1.007958 0.468913 -0.612552 +v 1.023056 0.458831 -0.612552 +v 1.014695 0.462655 -0.615457 +v 0.944072 0.503038 -0.352963 +v 0.927298 0.509981 -0.352963 +v 0.935126 0.505157 -0.350057 +v 0.927298 0.509981 -0.612552 +v 0.944072 0.503038 -0.612552 +v 0.935126 0.505157 -0.615457 +v 0.857982 0.530987 -0.352963 +v 0.840175 0.534524 -0.352963 +v 0.848794 0.531320 -0.350057 +v 0.840175 0.534524 -0.612552 +v 0.857982 0.530987 -0.612552 +v 0.848794 0.531320 -0.615457 +v 0.768093 0.541603 -0.352963 +v 0.749939 0.541598 -0.352963 +v 0.759017 0.540137 -0.350057 +v 0.749939 0.541598 -0.612552 +v 0.768093 0.541603 -0.612552 +v 0.759017 0.540137 -0.615457 +v 0.677860 0.534479 -0.352963 +v 0.660056 0.530932 -0.352963 +v 0.669245 0.531270 -0.350057 +v 0.660056 0.530932 -0.612552 +v 0.677860 0.534479 -0.612552 +v 0.669245 0.531270 -0.615457 +v 0.590751 0.509888 -0.352963 +v 0.573981 0.502936 -0.352963 +v 0.582927 0.505060 -0.350057 +v 0.573981 0.502936 -0.612552 +v 0.590751 0.509888 -0.612552 +v 0.582927 0.505060 -0.615457 +v 0.510113 0.468775 -0.352963 +v 0.495022 0.458685 -0.352963 +v 0.503381 0.462514 -0.350057 +v 0.495022 0.458685 -0.612552 +v 0.510113 0.468775 -0.612552 +v 0.503381 0.462514 -0.615457 +v 0.439046 0.412721 -0.352963 +v 0.426213 0.399881 -0.352963 +v 0.433665 0.405267 -0.350057 +v 0.426213 0.399881 -0.612552 +v 0.439046 0.412721 -0.612552 +v 0.433665 0.405267 -0.615457 +v 0.380280 0.343880 -0.352963 +v 0.370198 0.328782 -0.352963 +v 0.376456 0.335519 -0.350057 +v 0.370198 0.328782 -0.612552 +v 0.380280 0.343880 -0.612552 +v 0.376456 0.335519 -0.615457 +v 0.336072 0.264896 -0.352963 +v 0.329130 0.248121 -0.352963 +v 0.333954 0.255950 -0.350057 +v 0.329130 0.248121 -0.612552 +v 0.336072 0.264896 -0.612552 +v 0.333954 0.255950 -0.615457 +v 0.308124 0.178805 -0.352963 +v 0.304587 0.160999 -0.352963 +v 0.307792 0.169617 -0.350057 +v 0.304587 0.160999 -0.612552 +v 0.308124 0.178805 -0.612552 +v 0.307792 0.169617 -0.615457 +v 0.388002 -0.188582 -0.418367 +v 0.398928 -0.203069 -0.418367 +v 0.447524 -0.255828 -0.418367 +v 0.461067 -0.267906 -0.418367 +v 0.519022 -0.310169 -0.418367 +v 0.534661 -0.319373 -0.418367 +v 0.599748 -0.349519 -0.418367 +v 0.616881 -0.355494 -0.418367 +v 0.686599 -0.372363 -0.418367 +v 0.704570 -0.374881 -0.418367 +v 0.776238 -0.377824 -0.418367 +v 0.794354 -0.376788 -0.418367 +v 0.865221 -0.365693 -0.418367 +v 0.882786 -0.361142 -0.418367 +v 0.950126 -0.336435 -0.418367 +v 0.966467 -0.328545 -0.418367 +v 1.027692 -0.291175 -0.418367 +v 1.042180 -0.280249 -0.418367 +v 1.094939 -0.231652 -0.418367 +v 1.107016 -0.218110 -0.418367 +v 1.149280 -0.160154 -0.418367 +v 1.158484 -0.144515 -0.418367 +v 1.188629 -0.079428 -0.418367 +v 1.194605 -0.062295 -0.418367 +v 1.211474 0.007423 -0.418367 +v 1.213992 0.025393 -0.418367 +v 1.216935 0.097062 -0.418367 +v 1.215899 0.115178 -0.418367 +v 1.204803 0.186044 -0.418367 +v 1.200253 0.203610 -0.418367 +v 1.175545 0.270950 -0.418367 +v 1.167655 0.287290 -0.418367 +v 1.130286 0.348516 -0.418367 +v 1.119359 0.363004 -0.418367 +v 1.070763 0.415762 -0.418367 +v 1.057220 0.427840 -0.418367 +v 0.999264 0.470104 -0.418367 +v 0.983626 0.479308 -0.418367 +v 0.918539 0.509453 -0.418367 +v 0.901405 0.515428 -0.418367 +v 0.831687 0.532297 -0.418367 +v 0.813717 0.534815 -0.418367 +v 0.742048 0.537758 -0.418367 +v 0.723932 0.536722 -0.418367 +v 0.653066 0.525627 -0.418367 +v 0.635500 0.521076 -0.418367 +v 0.568161 0.496369 -0.418367 +v 0.551820 0.488479 -0.418367 +v 0.490594 0.451109 -0.418367 +v 0.476107 0.440183 -0.418367 +v 0.423348 0.391586 -0.418367 +v 0.411271 0.378044 -0.418367 +v 0.369007 0.320088 -0.418367 +v 0.359803 0.304449 -0.418367 +v 0.304296 0.134541 -0.418367 +v 0.306814 0.152511 -0.418367 +v 0.329658 0.239362 -0.418367 +v 0.323682 0.222228 -0.418367 +v 0.350632 -0.127356 -0.418367 +v 0.342742 -0.111015 -0.418367 +v 0.318035 -0.043676 -0.418367 +v 0.313484 -0.026110 -0.418367 +v 0.301353 0.062872 -0.418367 +v 0.302389 0.044756 -0.418367 +v 0.373342 -0.167059 -0.482757 +v 0.383426 -0.182142 -0.482757 +v 0.428947 -0.237578 -0.482757 +v 0.441780 -0.250405 -0.482757 +v 0.497241 -0.295895 -0.482757 +v 0.512331 -0.305971 -0.482757 +v 0.575601 -0.339768 -0.482757 +v 0.592366 -0.346706 -0.482757 +v 0.661013 -0.367510 -0.482757 +v 0.678811 -0.371044 -0.482757 +v 0.750198 -0.378056 -0.482757 +v 0.768342 -0.378051 -0.482757 +v 0.839725 -0.371000 -0.482757 +v 0.857520 -0.367455 -0.482757 +v 0.926156 -0.346614 -0.482757 +v 0.942918 -0.339666 -0.482757 +v 1.006169 -0.305835 -0.482757 +v 1.021253 -0.295750 -0.482757 +v 1.076689 -0.250230 -0.482757 +v 1.089515 -0.237396 -0.482757 +v 1.135005 -0.181935 -0.482757 +v 1.145082 -0.166846 -0.482757 +v 1.178878 -0.103576 -0.482757 +v 1.185817 -0.086810 -0.482757 +v 1.206620 -0.018163 -0.482757 +v 1.210155 -0.000365 -0.482757 +v 1.217167 0.071021 -0.482757 +v 1.217161 0.089166 -0.482757 +v 1.210111 0.160549 -0.482757 +v 1.206566 0.178344 -0.482757 +v 1.185725 0.246980 -0.482757 +v 1.178777 0.263742 -0.482757 +v 1.144946 0.326993 -0.482757 +v 1.134861 0.342077 -0.482757 +v 1.089340 0.397513 -0.482757 +v 1.076507 0.410339 -0.482757 +v 1.021046 0.455830 -0.482757 +v 1.005956 0.465906 -0.482757 +v 0.942686 0.499702 -0.482757 +v 0.925920 0.506641 -0.482757 +v 0.857273 0.527444 -0.482757 +v 0.839476 0.530979 -0.482757 +v 0.768089 0.537990 -0.482757 +v 0.749944 0.537985 -0.482757 +v 0.678561 0.530935 -0.482757 +v 0.660766 0.527390 -0.482757 +v 0.592130 0.506549 -0.482757 +v 0.575369 0.499600 -0.482757 +v 0.512118 0.465769 -0.482757 +v 0.497034 0.455684 -0.482757 +v 0.441598 0.410164 -0.482757 +v 0.428771 0.397330 -0.482757 +v 0.383281 0.341869 -0.482757 +v 0.373205 0.326779 -0.482757 +v 0.308132 0.160299 -0.482757 +v 0.311667 0.178097 -0.482757 +v 0.339409 0.263509 -0.482757 +v 0.332470 0.246744 -0.482757 +v 0.339511 -0.103807 -0.482757 +v 0.332562 -0.087046 -0.482757 +v 0.311721 -0.018410 -0.482757 +v 0.308177 -0.000615 -0.482757 +v 0.301121 0.088913 -0.482757 +v 0.301126 0.070769 -0.482757 +v 0.388002 -0.188582 -0.547147 +v 0.398928 -0.203069 -0.547147 +v 0.447524 -0.255828 -0.547147 +v 0.461067 -0.267906 -0.547147 +v 0.519022 -0.310169 -0.547148 +v 0.534661 -0.319373 -0.547148 +v 0.599748 -0.349519 -0.547148 +v 0.616881 -0.355494 -0.547148 +v 0.686599 -0.372363 -0.547148 +v 0.704570 -0.374881 -0.547148 +v 0.776238 -0.377824 -0.547148 +v 0.794354 -0.376788 -0.547148 +v 0.865220 -0.365693 -0.547148 +v 0.882786 -0.361142 -0.547148 +v 0.950126 -0.336435 -0.547148 +v 0.966467 -0.328545 -0.547148 +v 1.027692 -0.291175 -0.547148 +v 1.042180 -0.280249 -0.547148 +v 1.094939 -0.231652 -0.547148 +v 1.107016 -0.218110 -0.547148 +v 1.149280 -0.160154 -0.547148 +v 1.158484 -0.144515 -0.547148 +v 1.188629 -0.079428 -0.547148 +v 1.194605 -0.062295 -0.547148 +v 1.211473 0.007423 -0.547148 +v 1.213991 0.025393 -0.547148 +v 1.216935 0.097062 -0.547148 +v 1.215898 0.115178 -0.547148 +v 1.204803 0.186044 -0.547148 +v 1.200253 0.203610 -0.547148 +v 1.175545 0.270950 -0.547148 +v 1.167655 0.287290 -0.547148 +v 1.130286 0.348516 -0.547148 +v 1.119359 0.363004 -0.547148 +v 1.070763 0.415762 -0.547148 +v 1.057220 0.427840 -0.547148 +v 0.999264 0.470104 -0.547148 +v 0.983626 0.479308 -0.547148 +v 0.918539 0.509453 -0.547148 +v 0.901405 0.515428 -0.547148 +v 0.831687 0.532297 -0.547148 +v 0.813717 0.534815 -0.547148 +v 0.742048 0.537758 -0.547148 +v 0.723932 0.536722 -0.547148 +v 0.653066 0.525627 -0.547148 +v 0.635500 0.521076 -0.547148 +v 0.568161 0.496369 -0.547147 +v 0.551820 0.488479 -0.547147 +v 0.490594 0.451109 -0.547147 +v 0.476107 0.440183 -0.547147 +v 0.423348 0.391586 -0.547147 +v 0.411271 0.378044 -0.547147 +v 0.369007 0.320088 -0.547147 +v 0.359803 0.304449 -0.547147 +v 0.304296 0.134541 -0.547147 +v 0.306814 0.152511 -0.547147 +v 0.329658 0.239362 -0.547147 +v 0.323682 0.222228 -0.547147 +v 0.350632 -0.127356 -0.547147 +v 0.342742 -0.111016 -0.547147 +v 0.318035 -0.043676 -0.547147 +v 0.313484 -0.026110 -0.547147 +v 0.301353 0.062872 -0.547147 +v 0.302389 0.044756 -0.547147 +v 0.298782 0.044548 -0.409550 +v 0.297746 0.062668 -0.409550 +v 0.297745 0.062668 -0.426170 +v 0.298781 0.044548 -0.426170 +v 0.297513 0.070765 -0.474448 +v 0.297507 0.088914 -0.474448 +v 0.297507 0.088914 -0.491067 +v 0.297513 0.070765 -0.491067 +v 0.298781 0.044548 -0.539345 +v 0.297745 0.062668 -0.539345 +v 0.297746 0.062668 -0.555964 +v 0.298782 0.044548 -0.555964 +v 0.309986 -0.027013 -0.555964 +v 0.314538 -0.044584 -0.555964 +v 0.314537 -0.044583 -0.539345 +v 0.309986 -0.027014 -0.539345 +v 0.304632 -0.001319 -0.491067 +v 0.308178 -0.019118 -0.491067 +v 0.308178 -0.019118 -0.474448 +v 0.304632 -0.001319 -0.474448 +v 0.309986 -0.027014 -0.426170 +v 0.314537 -0.044583 -0.426170 +v 0.314538 -0.044584 -0.409550 +v 0.309986 -0.027013 -0.409550 +v 0.303236 0.153014 -0.426170 +v 0.300717 0.135040 -0.426170 +v 0.300717 0.135040 -0.409550 +v 0.303236 0.153015 -0.409550 +v 0.308123 0.178802 -0.491067 +v 0.304588 0.161002 -0.491067 +v 0.304588 0.161002 -0.474448 +v 0.308123 0.178802 -0.474448 +v 0.303236 0.153015 -0.555964 +v 0.300717 0.135040 -0.555964 +v 0.300717 0.135040 -0.539345 +v 0.303236 0.153014 -0.539345 +v 0.339487 -0.112585 -0.555964 +v 0.347379 -0.128929 -0.555964 +v 0.347379 -0.128929 -0.539345 +v 0.339487 -0.112585 -0.539345 +v 0.329224 -0.088428 -0.491067 +v 0.336174 -0.105193 -0.491067 +v 0.336174 -0.105193 -0.474448 +v 0.329224 -0.088428 -0.474448 +v 0.339487 -0.112585 -0.426170 +v 0.347379 -0.128929 -0.426170 +v 0.347379 -0.128929 -0.409550 +v 0.339487 -0.112585 -0.409550 +v 0.396044 -0.205246 -0.539345 +v 0.385116 -0.190756 -0.539345 +v 0.385116 -0.190756 -0.555964 +v 0.396045 -0.205247 -0.555964 +v 0.380424 -0.184152 -0.474448 +v 0.370337 -0.169066 -0.474448 +v 0.370337 -0.169066 -0.491067 +v 0.380424 -0.184152 -0.491067 +v 0.396045 -0.205247 -0.409550 +v 0.385116 -0.190756 -0.409550 +v 0.385116 -0.190756 -0.426170 +v 0.396044 -0.205246 -0.426170 +v 0.458663 -0.270603 -0.539345 +v 0.445118 -0.258523 -0.539345 +v 0.445118 -0.258523 -0.555964 +v 0.458664 -0.270603 -0.555964 +v 0.439228 -0.252962 -0.474448 +v 0.426391 -0.240133 -0.474448 +v 0.426391 -0.240133 -0.491067 +v 0.439228 -0.252962 -0.491067 +v 0.458664 -0.270603 -0.409550 +v 0.445118 -0.258523 -0.409550 +v 0.445118 -0.258524 -0.426170 +v 0.458663 -0.270603 -0.426170 +v 0.532830 -0.322488 -0.539345 +v 0.517188 -0.313283 -0.539345 +v 0.517188 -0.313283 -0.555964 +v 0.532830 -0.322488 -0.555964 +v 0.510326 -0.308978 -0.474448 +v 0.495233 -0.298899 -0.474448 +v 0.495233 -0.298899 -0.491067 +v 0.510326 -0.308978 -0.491067 +v 0.532830 -0.322488 -0.409550 +v 0.517188 -0.313283 -0.409550 +v 0.517188 -0.313283 -0.426170 +v 0.532830 -0.322488 -0.426170 +v 0.615693 -0.358907 -0.539345 +v 0.598556 -0.352930 -0.539345 +v 0.598556 -0.352930 -0.555964 +v 0.615694 -0.358907 -0.555964 +v 0.590986 -0.350046 -0.474448 +v 0.574217 -0.343106 -0.474448 +v 0.574217 -0.343106 -0.491067 +v 0.590986 -0.350046 -0.491067 +v 0.615694 -0.358907 -0.409550 +v 0.598556 -0.352930 -0.409550 +v 0.598556 -0.352930 -0.426170 +v 0.615693 -0.358907 -0.426170 +v 0.704069 -0.378459 -0.539345 +v 0.686096 -0.375941 -0.539345 +v 0.686096 -0.375941 -0.555964 +v 0.704070 -0.378460 -0.555964 +v 0.678109 -0.374589 -0.474448 +v 0.660308 -0.371054 -0.474448 +v 0.660308 -0.371054 -0.491067 +v 0.678109 -0.374589 -0.491067 +v 0.704070 -0.378460 -0.409550 +v 0.686096 -0.375941 -0.409550 +v 0.686096 -0.375941 -0.426170 +v 0.704069 -0.378459 -0.426170 +v 0.794562 -0.380395 -0.539345 +v 0.776443 -0.381432 -0.539345 +v 0.776442 -0.381431 -0.555964 +v 0.794563 -0.380395 -0.555964 +v 0.768345 -0.381664 -0.474448 +v 0.750197 -0.381669 -0.474448 +v 0.750197 -0.381669 -0.491067 +v 0.768345 -0.381664 -0.491067 +v 0.794563 -0.380395 -0.409550 +v 0.776442 -0.381432 -0.409550 +v 0.776443 -0.381432 -0.426170 +v 0.794562 -0.380395 -0.426170 +v 0.883694 -0.364640 -0.539345 +v 0.866125 -0.369191 -0.539345 +v 0.866124 -0.369191 -0.555964 +v 0.883694 -0.364639 -0.555964 +v 0.858228 -0.370999 -0.474448 +v 0.840429 -0.374544 -0.474448 +v 0.840429 -0.374544 -0.491067 +v 0.858228 -0.370999 -0.491067 +v 0.883694 -0.364639 -0.409550 +v 0.866124 -0.369191 -0.409550 +v 0.866125 -0.369191 -0.426170 +v 0.883694 -0.364640 -0.426170 +v 0.968039 -0.331798 -0.539345 +v 0.951696 -0.339689 -0.539345 +v 0.951695 -0.339690 -0.555964 +v 0.968040 -0.331798 -0.555964 +v 0.944303 -0.343003 -0.474448 +v 0.927538 -0.349953 -0.474448 +v 0.927538 -0.349953 -0.491067 +v 0.944303 -0.343003 -0.491067 +v 0.968040 -0.331798 -0.409551 +v 0.951695 -0.339690 -0.409551 +v 0.951696 -0.339689 -0.426170 +v 0.968039 -0.331798 -0.426170 +v 1.044357 -0.283133 -0.539345 +v 1.029867 -0.294061 -0.539345 +v 1.029866 -0.294061 -0.555964 +v 1.044358 -0.283132 -0.555964 +v 1.023263 -0.298753 -0.474448 +v 1.008176 -0.308840 -0.474448 +v 1.008176 -0.308840 -0.491067 +v 1.023263 -0.298753 -0.491067 +v 1.044358 -0.283132 -0.409551 +v 1.029866 -0.294061 -0.409551 +v 1.029867 -0.294061 -0.426170 +v 1.044357 -0.283133 -0.426170 +v 1.109714 -0.220513 -0.539345 +v 1.097634 -0.234058 -0.539345 +v 1.097634 -0.234059 -0.555964 +v 1.109714 -0.220513 -0.555964 +v 1.092073 -0.239949 -0.474448 +v 1.079243 -0.252786 -0.474448 +v 1.079243 -0.252786 -0.491067 +v 1.092073 -0.239949 -0.491067 +v 1.109714 -0.220513 -0.409551 +v 1.097634 -0.234059 -0.409551 +v 1.097634 -0.234058 -0.426170 +v 1.109714 -0.220513 -0.426170 +v 1.161598 -0.146347 -0.539345 +v 1.152393 -0.161988 -0.539345 +v 1.152393 -0.161989 -0.555964 +v 1.161598 -0.146346 -0.555964 +v 1.148088 -0.168850 -0.474448 +v 1.138009 -0.183943 -0.474448 +v 1.138009 -0.183943 -0.491067 +v 1.148088 -0.168850 -0.491067 +v 1.161599 -0.146346 -0.409551 +v 1.152393 -0.161989 -0.409551 +v 1.152393 -0.161988 -0.426170 +v 1.161598 -0.146347 -0.426170 +v 1.198017 -0.063483 -0.539345 +v 1.192040 -0.080620 -0.539345 +v 1.192040 -0.080620 -0.555964 +v 1.198017 -0.063483 -0.555964 +v 1.189156 -0.088190 -0.474448 +v 1.182216 -0.104959 -0.474448 +v 1.182216 -0.104959 -0.491067 +v 1.189156 -0.088190 -0.491067 +v 1.198017 -0.063483 -0.409551 +v 1.192040 -0.080620 -0.409551 +v 1.192040 -0.080620 -0.426170 +v 1.198017 -0.063483 -0.426170 +v 1.217570 0.024893 -0.539345 +v 1.215051 0.006920 -0.539345 +v 1.215051 0.006919 -0.555964 +v 1.217570 0.024894 -0.555964 +v 1.213700 -0.001067 -0.474448 +v 1.210164 -0.018868 -0.474448 +v 1.210164 -0.018868 -0.491067 +v 1.213700 -0.001067 -0.491067 +v 1.217570 0.024894 -0.409551 +v 1.215051 0.006919 -0.409551 +v 1.215051 0.006920 -0.426170 +v 1.217570 0.024893 -0.426170 +v 1.219506 0.115386 -0.539345 +v 1.220542 0.097267 -0.539345 +v 1.220542 0.097266 -0.555964 +v 1.219506 0.115387 -0.555964 +v 1.220775 0.089169 -0.474448 +v 1.220780 0.071021 -0.474448 +v 1.220780 0.071021 -0.491067 +v 1.220775 0.089169 -0.491067 +v 1.219506 0.115387 -0.409551 +v 1.220542 0.097266 -0.409551 +v 1.220542 0.097267 -0.426170 +v 1.219506 0.115386 -0.426170 +v 1.203750 0.204518 -0.539345 +v 1.208302 0.186949 -0.539345 +v 1.208302 0.186948 -0.555964 +v 1.203750 0.204518 -0.555964 +v 1.210109 0.179052 -0.474448 +v 1.213655 0.161253 -0.474448 +v 1.213655 0.161253 -0.491067 +v 1.210109 0.179052 -0.491067 +v 1.203750 0.204518 -0.409551 +v 1.208302 0.186948 -0.409551 +v 1.208302 0.186949 -0.426170 +v 1.203750 0.204518 -0.426170 +v 1.170909 0.288863 -0.539345 +v 1.178800 0.272520 -0.539345 +v 1.178800 0.272519 -0.555964 +v 1.170908 0.288864 -0.555964 +v 1.182114 0.265127 -0.474448 +v 1.189063 0.248362 -0.474448 +v 1.189063 0.248362 -0.491067 +v 1.182114 0.265127 -0.491067 +v 1.170908 0.288864 -0.409551 +v 1.178800 0.272519 -0.409551 +v 1.178800 0.272520 -0.426170 +v 1.170909 0.288863 -0.426170 +v 1.122243 0.365181 -0.539345 +v 1.133171 0.350691 -0.539345 +v 1.133172 0.350690 -0.555964 +v 1.122243 0.365181 -0.555964 +v 1.137863 0.344087 -0.474448 +v 1.147950 0.329000 -0.474448 +v 1.147950 0.329000 -0.491067 +v 1.137863 0.344087 -0.491067 +v 1.122243 0.365181 -0.409551 +v 1.133172 0.350690 -0.409551 +v 1.133171 0.350691 -0.426170 +v 1.122243 0.365181 -0.426170 +v 1.059624 0.430538 -0.539345 +v 1.073169 0.418458 -0.539345 +v 1.073169 0.418458 -0.555964 +v 1.059623 0.430538 -0.555964 +v 1.079059 0.412897 -0.474448 +v 1.091896 0.400067 -0.474448 +v 1.091896 0.400067 -0.491067 +v 1.079059 0.412897 -0.491067 +v 1.059623 0.430538 -0.409551 +v 1.073169 0.418458 -0.409551 +v 1.073169 0.418458 -0.426170 +v 1.059624 0.430538 -0.426170 +v 0.985457 0.482422 -0.539345 +v 1.001099 0.473217 -0.539345 +v 1.001099 0.473217 -0.555964 +v 0.985457 0.482423 -0.555964 +v 1.007961 0.468912 -0.474448 +v 1.023053 0.458833 -0.474448 +v 1.023053 0.458833 -0.491067 +v 1.007961 0.468912 -0.491067 +v 0.985457 0.482423 -0.409551 +v 1.001099 0.473217 -0.409551 +v 1.001099 0.473217 -0.426170 +v 0.985457 0.482422 -0.426170 +v 0.902594 0.518841 -0.539345 +v 0.919730 0.512864 -0.539345 +v 0.919731 0.512864 -0.555964 +v 0.902593 0.518841 -0.555964 +v 0.927300 0.509980 -0.474448 +v 0.944070 0.503040 -0.474448 +v 0.944070 0.503040 -0.491067 +v 0.927300 0.509980 -0.491067 +v 0.902593 0.518841 -0.409551 +v 0.919731 0.512864 -0.409551 +v 0.919730 0.512864 -0.426170 +v 0.902594 0.518841 -0.426170 +v 0.814217 0.538394 -0.539345 +v 0.832191 0.535875 -0.539345 +v 0.832191 0.535875 -0.555964 +v 0.814216 0.538394 -0.555964 +v 0.840178 0.534523 -0.474448 +v 0.857979 0.530988 -0.474448 +v 0.857979 0.530988 -0.491067 +v 0.840178 0.534523 -0.491067 +v 0.814216 0.538394 -0.409551 +v 0.832191 0.535875 -0.409551 +v 0.832191 0.535875 -0.426170 +v 0.814217 0.538394 -0.426170 +v 0.723724 0.540330 -0.539345 +v 0.741844 0.541366 -0.539345 +v 0.741844 0.541366 -0.555964 +v 0.723723 0.540330 -0.555964 +v 0.749941 0.541598 -0.474448 +v 0.768090 0.541603 -0.474448 +v 0.768090 0.541603 -0.491067 +v 0.749941 0.541598 -0.491067 +v 0.723723 0.540330 -0.409551 +v 0.741844 0.541366 -0.409551 +v 0.741844 0.541366 -0.426170 +v 0.723724 0.540330 -0.426170 +v 0.634593 0.524574 -0.539345 +v 0.652162 0.529125 -0.539345 +v 0.652162 0.529125 -0.555964 +v 0.634592 0.524574 -0.555964 +v 0.660059 0.530933 -0.474448 +v 0.677857 0.534479 -0.474448 +v 0.677857 0.534479 -0.491067 +v 0.660059 0.530933 -0.491067 +v 0.634592 0.524574 -0.409551 +v 0.652162 0.529125 -0.409551 +v 0.652162 0.529125 -0.426170 +v 0.634593 0.524574 -0.426170 +v 0.550247 0.491732 -0.539345 +v 0.566591 0.499623 -0.539345 +v 0.566592 0.499624 -0.555964 +v 0.550246 0.491732 -0.555964 +v 0.573983 0.502937 -0.474448 +v 0.590748 0.509887 -0.474448 +v 0.590748 0.509887 -0.491067 +v 0.573983 0.502937 -0.491067 +v 0.550246 0.491732 -0.409551 +v 0.566592 0.499624 -0.409551 +v 0.566591 0.499623 -0.426170 +v 0.550247 0.491732 -0.426170 +v 0.473930 0.443066 -0.539345 +v 0.488420 0.453995 -0.539345 +v 0.488420 0.453995 -0.555964 +v 0.473930 0.443066 -0.555964 +v 0.495024 0.458687 -0.474448 +v 0.510111 0.468774 -0.474448 +v 0.510111 0.468774 -0.491067 +v 0.495024 0.458687 -0.491067 +v 0.473930 0.443066 -0.409550 +v 0.488420 0.453995 -0.409550 +v 0.488420 0.453995 -0.426169 +v 0.473930 0.443066 -0.426169 +v 0.408573 0.380447 -0.539345 +v 0.420652 0.393992 -0.539345 +v 0.420653 0.393993 -0.555964 +v 0.408573 0.380447 -0.555964 +v 0.426214 0.399883 -0.474448 +v 0.439043 0.412719 -0.474448 +v 0.439043 0.412719 -0.491067 +v 0.426214 0.399883 -0.491067 +v 0.408573 0.380447 -0.409550 +v 0.420653 0.393993 -0.409550 +v 0.420652 0.393992 -0.426169 +v 0.408573 0.380447 -0.426169 +v 0.356689 0.306281 -0.539345 +v 0.365893 0.321922 -0.539345 +v 0.365894 0.321922 -0.555964 +v 0.356688 0.306280 -0.555964 +v 0.370199 0.328784 -0.474448 +v 0.380278 0.343877 -0.474448 +v 0.380278 0.343877 -0.491067 +v 0.370199 0.328784 -0.491067 +v 0.356688 0.306280 -0.409550 +v 0.365894 0.321922 -0.409550 +v 0.365893 0.321922 -0.426169 +v 0.356689 0.306281 -0.426169 +v 0.320270 0.223417 -0.539345 +v 0.326246 0.240553 -0.539345 +v 0.326247 0.240554 -0.555964 +v 0.320270 0.223416 -0.555964 +v 0.329130 0.248124 -0.474448 +v 0.336071 0.264893 -0.474448 +v 0.336071 0.264893 -0.491067 +v 0.329130 0.248124 -0.491067 +v 0.320270 0.223416 -0.409550 +v 0.326247 0.240554 -0.409550 +v 0.326246 0.240553 -0.426169 +v 0.320270 0.223417 -0.426170 +v 0.848703 -0.369631 -0.353863 +v 0.848703 -0.369631 -0.611651 +v 0.848703 -0.369631 -0.474505 +v 0.848002 -0.366112 -0.482757 +v 0.874106 -0.363816 -0.538952 +v 0.873207 -0.360342 -0.546701 +v 0.874107 -0.363816 -0.410058 +v 0.873207 -0.360342 -0.418814 +v 0.874106 -0.363816 -0.426562 +v 0.848703 -0.369631 -0.491009 +v 0.874106 -0.363816 -0.555456 +v 0.368343 0.079860 -0.636238 +v 0.375873 0.003621 -0.636238 +v 0.398132 -0.069685 -0.636238 +v 0.434264 -0.137239 -0.636238 +v 0.482881 -0.196447 -0.636238 +v 0.542115 -0.245031 -0.636238 +v 0.609689 -0.281127 -0.636238 +v 0.683007 -0.303346 -0.636238 +v 0.759250 -0.310834 -0.636238 +v 0.835490 -0.303304 -0.636238 +v 0.908796 -0.281045 -0.636238 +v 0.976350 -0.244912 -0.636238 +v 1.035557 -0.196295 -0.636238 +v 1.084142 -0.137061 -0.636238 +v 1.120238 -0.069487 -0.636238 +v 1.142456 0.003831 -0.636238 +v 1.149945 0.080074 -0.636238 +v 1.142414 0.156314 -0.636238 +v 1.120156 0.229619 -0.636238 +v 1.084023 0.297174 -0.636238 +v 1.035405 0.356381 -0.636238 +v 0.976172 0.404966 -0.636238 +v 0.908597 0.441061 -0.636238 +v 0.835280 0.463280 -0.636238 +v 0.759036 0.470768 -0.636238 +v 0.682797 0.463238 -0.636238 +v 0.609491 0.440979 -0.636238 +v 0.541937 0.404846 -0.636238 +v 0.482730 0.356229 -0.636238 +v 0.434145 0.296995 -0.636238 +v 0.398049 0.229420 -0.636238 +v 0.375831 0.156103 -0.636238 +v 0.426639 0.013733 -0.629995 +v 0.629486 -0.233298 -0.629995 +v 0.477193 0.268248 -0.629995 +v 0.400843 0.124315 -0.662300 +v 0.416263 0.194730 -0.662300 +v 0.636127 0.072792 -0.650100 +v 0.651546 0.143206 -0.650100 +v 0.453122 0.112867 -0.676623 +v 0.468542 0.183281 -0.676623 +v 0.416263 0.194730 -0.632906 +v 0.400843 0.124315 -0.632845 +v 0.570172 0.391686 -0.662300 +v 0.634792 0.423628 -0.662300 +v 0.676901 0.175766 -0.650100 +v 0.741521 0.207707 -0.650100 +v 0.593887 0.343709 -0.676623 +v 0.658507 0.375651 -0.676623 +v 0.634792 0.423628 -0.633335 +v 0.570172 0.391686 -0.633218 +v 0.892692 0.426628 -0.662300 +v 0.957571 0.395216 -0.662300 +v 0.787733 0.209840 -0.650100 +v 0.852612 0.178429 -0.650100 +v 0.869371 0.378458 -0.676623 +v 0.934250 0.347047 -0.676623 +v 0.957571 0.395216 -0.634134 +v 0.892692 0.426628 -0.634005 +v 1.113355 0.198867 -0.662301 +v 1.130000 0.128732 -0.662301 +v 0.879005 0.143251 -0.650100 +v 0.895650 0.073116 -0.650100 +v 1.061283 0.186510 -0.676623 +v 1.077928 0.116375 -0.676623 +v 1.130000 0.128732 -0.634413 +v 1.113355 0.198867 -0.634367 +v 1.075331 -0.117869 -0.662301 +v 1.030957 -0.174676 -0.662301 +v 0.885516 0.030399 -0.650100 +v 0.841143 -0.026407 -0.650100 +v 1.033155 -0.084925 -0.676623 +v 0.988781 -0.141731 -0.676623 +v 1.030957 -0.174676 -0.634146 +v 1.075331 -0.117869 -0.634200 +v 0.805522 -0.286395 -0.662300 +v 0.733440 -0.286531 -0.662300 +v 0.805065 -0.045536 -0.650100 +v 0.732982 -0.045673 -0.650100 +v 0.805421 -0.232877 -0.676623 +v 0.733338 -0.233013 -0.676623 +v 0.733440 -0.286531 -0.633613 +v 0.805522 -0.286395 -0.633842 +v 0.500894 -0.176611 -0.662300 +v 0.456057 -0.120170 -0.662300 +v 0.689488 -0.026794 -0.650100 +v 0.644651 0.029647 -0.650100 +v 0.542799 -0.143322 -0.676623 +v 0.497962 -0.086881 -0.676623 +v 0.457354 -0.121802 -0.632888 +v 0.456057 -0.120170 -0.632933 +v 0.500894 -0.176611 -0.633025 +v 0.395279 0.161011 -0.646398 +v 0.471701 -0.158824 -0.646398 +v 0.769407 -0.298489 -0.646398 +v 1.064218 -0.152813 -0.646398 +v 1.134135 0.168507 -0.646398 +v 0.926510 0.423511 -0.646398 +v 0.597688 0.420175 -0.646398 +v 1.100132 0.012237 -0.631034 +v 1.048637 0.273515 -0.631104 +v 1.093406 0.218531 -0.632746 +v 1.005516 0.326475 -0.631138 +v 0.960598 0.381644 -0.632856 +v 0.827180 0.422503 -0.631224 +v 0.759050 0.421811 -0.630333 +v 0.691186 0.421123 -0.631059 +v 0.519244 0.319735 -0.630011 +v 0.562129 0.374645 -0.631856 +v 0.515669 0.315157 -0.629995 +v 0.436333 0.213576 -0.631241 +v 0.473213 0.260797 -0.629995 +v 0.490607 -0.031350 -0.629995 +v 0.444616 -0.045466 -0.629995 +v 0.477418 0.023848 -0.629995 +v 0.430296 0.014462 -0.629995 +v 0.596120 -0.164159 -0.629995 +v 0.648023 -0.188509 -0.629995 +v 0.629642 -0.232920 -0.629995 +v 0.622557 -0.229596 -0.629995 +v 0.700890 -0.213311 -0.629995 +v 0.632198 -0.234119 -0.629995 +v 0.872673 -0.193907 -0.629995 +v 0.924971 -0.168065 -0.629995 +v 1.053031 0.021593 -0.629995 +v 1.040402 -0.036444 -0.629995 +v 1.008546 0.246711 -0.629995 +v 0.971397 0.292337 -0.629995 +v 0.817624 0.374390 -0.629995 +v 0.759063 0.373796 -0.629995 +v 0.478402 0.267441 -0.629995 +v 0.518441 0.240704 -0.629995 +v 0.553458 0.285539 -0.629995 +v 0.395279 0.161011 -0.634155 +v 0.414178 0.185208 -0.632813 +v 0.397480 0.151803 -0.633576 +v 0.420833 0.193729 -0.632341 +v 0.414667 0.079873 -0.630651 +v 0.423941 0.041059 -0.629995 +v 0.445691 -0.049970 -0.630028 +v 0.402375 0.131313 -0.632743 +v 0.569153 -0.204543 -0.630366 +v 0.404224 0.123575 -0.632428 +v 0.691254 -0.261825 -0.631132 +v 0.464029 0.079886 -0.629995 +v 0.828695 -0.269193 -0.632043 +v 0.891100 -0.238357 -0.630665 +v 0.482372 0.194520 -0.629995 +v 0.951885 -0.208320 -0.630929 +v 1.015927 -0.176675 -0.632891 +v 0.472856 0.182337 -0.629995 +v 1.085480 -0.055101 -0.631701 +v 1.114891 0.080065 -0.632010 +v 0.456315 0.112168 -0.629995 +v 1.073422 0.115305 -0.629995 +v 1.077928 0.116375 -0.631421 +v 1.061283 0.186510 -0.630981 +v 1.058165 0.185770 -0.629995 +v 1.069738 -0.127443 -0.634149 +v 1.037863 -0.165836 -0.634113 +v 0.414178 0.185208 -0.646398 +v 1.064218 -0.152813 -0.635582 +v 1.026701 -0.171351 -0.633491 +v 0.402375 0.131313 -0.646398 +v 1.070467 -0.124096 -0.634036 +v 0.404224 0.123575 -0.646398 +v 0.453122 0.112867 -0.631000 +v 1.072331 -0.115527 -0.633746 +v 0.420833 0.193729 -0.646398 +v 0.468542 0.183281 -0.631355 +v 0.980070 -0.140838 -0.629995 +v 0.984706 -0.138547 -0.629995 +v 1.030333 -0.082720 -0.629995 +v 0.618030 0.420381 -0.633549 +v 0.628436 0.420486 -0.633195 +v 0.636305 0.420566 -0.632927 +v 0.572213 0.387557 -0.632660 +v 1.037863 -0.165836 -0.646398 +v 1.070467 -0.124096 -0.646398 +v 0.578751 0.395927 -0.633181 +v 0.597688 0.420175 -0.634690 +v 0.700731 0.373204 -0.629995 +v 1.072331 -0.115527 -0.646398 +v 1.033155 -0.084925 -0.631097 +v 0.659920 0.372790 -0.629995 +v 1.026701 -0.171351 -0.646398 +v 0.590227 0.332618 -0.629995 +v 0.595826 0.339787 -0.629995 +v 0.988781 -0.141731 -0.631587 +v 0.628436 0.420486 -0.646398 +v 0.743876 -0.286512 -0.633487 +v 0.759246 -0.293722 -0.634174 +v 0.733430 -0.281611 -0.633019 +v 0.578751 0.395927 -0.646398 +v 0.805512 -0.280649 -0.633149 +v 0.572213 0.387557 -0.646398 +v 0.769407 -0.298489 -0.634870 +v 0.793839 -0.286417 -0.633705 +v 0.733329 -0.228529 -0.629995 +v 0.818983 -0.220437 -0.629995 +v 0.805410 -0.227144 -0.629995 +v 0.593887 0.343709 -0.631342 +v 0.636305 0.420566 -0.646398 +v 0.658507 0.375651 -0.630977 +v 0.743876 -0.286512 -0.646398 +v 0.926510 0.423511 -0.635385 +v 0.901227 0.423254 -0.633914 +v 0.944326 0.401629 -0.634063 +v 0.954579 0.389036 -0.633302 +v 0.793839 -0.286417 -0.646398 +v 0.805512 -0.280649 -0.646398 +v 0.891008 0.423150 -0.633542 +v 0.805421 -0.232877 -0.631752 +v 0.899693 0.423238 -0.633858 +v 0.733430 -0.281611 -0.646398 +v 0.733338 -0.233013 -0.631380 +v 0.461443 -0.115892 -0.632113 +v 0.932699 0.339865 -0.629995 +v 0.504911 -0.174404 -0.632479 +v 0.504132 -0.174039 -0.632524 +v 0.931491 0.341349 -0.629995 +v 0.867646 0.374897 -0.629995 +v 0.465222 -0.131706 -0.632913 +v 0.495713 -0.170089 -0.633009 +v 0.471701 -0.158824 -0.634392 +v 0.944326 0.401629 -0.646398 +v 0.899693 0.423238 -0.646398 +v 0.918155 0.414300 -0.643281 +v 0.891008 0.423150 -0.646398 +v 0.869371 0.378458 -0.631205 +v 0.502932 -0.082933 -0.629995 +v 0.546106 -0.140696 -0.629995 +v 0.954579 0.389036 -0.646398 +v 0.934250 0.347047 -0.631955 +v 1.127642 0.138666 -0.634246 +v 1.130987 0.154038 -0.634833 +v 0.465222 -0.131706 -0.646398 +v 1.125234 0.127602 -0.633824 +v 1.134135 0.168507 -0.635708 +v 1.114976 0.192039 -0.634314 +v 1.110054 0.198084 -0.633956 +v 0.495713 -0.170089 -0.646398 +v 0.483094 -0.154205 -0.643316 +v 1.065751 0.080051 -0.629995 +v 0.504132 -0.174039 -0.646398 +v 1.047115 0.199341 -0.629995 +v 0.542799 -0.143322 -0.631287 +v 0.461443 -0.115892 -0.646398 +v 0.497962 -0.086881 -0.631960 +v 1.127642 0.138666 -0.646398 +v 1.114976 0.192039 -0.646398 +v 1.110054 0.198084 -0.646398 +v 1.125234 0.127602 -0.646398 +v 0.654733 0.167065 -0.632188 +v 0.874678 0.169214 -0.632188 +v 0.903001 0.050480 -0.632188 +v 0.705771 -0.046887 -0.632188 +v 0.713080 -0.046815 -0.632188 +v 0.628736 0.047800 -0.632188 +v 0.827831 -0.045694 -0.632188 +v 0.764188 0.221099 -0.632188 +v 0.931312 0.340979 -0.629995 +v 0.932482 0.339541 -0.629995 +v 0.817549 0.374016 -0.629995 +v 0.867465 0.374523 -0.629995 +v 0.931312 0.340979 -0.658711 +v 0.853065 0.179363 -0.632188 +v 0.826372 0.289648 -0.644010 +v 0.867465 0.374523 -0.658711 +v 0.787813 0.210005 -0.632188 +v 1.065370 0.080051 -0.629995 +v 1.052665 0.021666 -0.629995 +v 1.073020 0.115210 -0.629995 +v 1.057762 0.185674 -0.629995 +v 1.046755 0.199192 -0.629995 +v 1.008234 0.246503 -0.629995 +v 1.073020 0.115210 -0.658711 +v 0.897497 0.073554 -0.632188 +v 1.057762 0.185674 -0.658711 +v 0.477784 0.023921 -0.629995 +v 0.880771 0.143670 -0.632188 +v 0.490956 -0.031206 -0.629995 +v 0.924762 -0.167752 -0.629995 +v 0.979792 -0.140560 -0.629995 +v 0.984380 -0.138293 -0.629995 +v 1.040053 -0.036299 -0.629995 +v 0.596330 -0.163846 -0.629995 +v 1.030007 -0.082466 -0.629995 +v 0.648166 -0.188165 -0.629995 +v 0.700965 -0.212935 -0.629995 +v 0.872531 -0.193562 -0.629995 +v 0.984380 -0.138293 -0.658711 +v 0.971132 0.292072 -0.629995 +v 0.759063 0.373423 -0.629995 +v 0.518752 0.240495 -0.629995 +v 0.553724 0.285274 -0.629995 +v 0.464411 0.079886 -0.629995 +v 0.482729 0.194372 -0.629995 +v 0.842237 -0.027262 -0.632188 +v 0.473260 0.182248 -0.629995 +v 1.030007 -0.082466 -0.658711 +v 0.886628 0.029531 -0.632188 +v 0.733328 -0.228117 -0.629995 +v 0.456719 0.112079 -0.629995 +v 0.805409 -0.226729 -0.629995 +v 0.818907 -0.220058 -0.629995 +v 0.473260 0.182248 -0.658711 +v 0.733328 -0.228117 -0.658711 +v 0.649625 0.143627 -0.632188 +v 0.634272 0.073198 -0.632188 +v 0.456719 0.112079 -0.658711 +v 0.700805 0.372832 -0.629995 +v 0.732984 -0.046621 -0.632188 +v 0.805066 -0.045916 -0.632188 +v 0.805409 -0.226729 -0.658711 +v 0.660104 0.372419 -0.629995 +v 0.590445 0.332292 -0.629995 +v 0.596009 0.339416 -0.629995 +v 0.503255 -0.082677 -0.629995 +v 0.546431 -0.140437 -0.629995 +v 0.660104 0.372419 -0.658711 +v 0.740646 0.209477 -0.632188 +v 0.503255 -0.082677 -0.658711 +v 0.596009 0.339416 -0.658711 +v 0.643955 0.029094 -0.632188 +v 0.689449 -0.026825 -0.632188 +v 0.620841 -0.081327 -0.643895 +v 0.546431 -0.140437 -0.658711 +v 0.676010 0.177568 -0.632188 +v 0.706945 0.126255 -0.643568 +v 0.693195 0.063176 -0.643568 +v 0.733939 0.013096 -0.643568 +v 0.798496 0.013727 -0.643568 +v 0.838254 0.064594 -0.643568 +v 0.823274 0.127392 -0.643568 +v 0.764836 0.154834 -0.643568 +v 0.671382 0.057973 -0.654297 +v 0.689277 0.140065 -0.654297 +v 0.724407 -0.007202 -0.654297 +v 0.808423 -0.006381 -0.654297 +v 0.860164 0.059817 -0.654297 +v 0.840668 0.141544 -0.654297 +v 0.764616 0.177258 -0.654297 +v 0.678618 0.059699 -0.654297 +v 0.695138 0.135484 -0.654297 +v 0.727569 -0.000469 -0.654297 +v 0.805130 0.000290 -0.654297 +v 0.852896 0.061402 -0.654297 +v 0.834898 0.136850 -0.654297 +v 0.764689 0.169820 -0.654297 +v 0.732984 -0.046621 -0.623654 +v 0.636127 0.072792 -0.625127 +v 0.732982 -0.045673 -0.624390 +v 0.805065 -0.045536 -0.623950 +v 0.651546 0.143206 -0.625180 +v 0.805066 -0.045916 -0.623654 +v 0.676901 0.175766 -0.625214 +v 0.643955 0.029094 -0.623654 +v 0.741521 0.207707 -0.625186 +v 0.644651 0.029647 -0.624345 +v 0.787733 0.209840 -0.623796 +v 0.689488 -0.026794 -0.623693 +v 0.852612 0.178429 -0.624459 +v 0.689449 -0.026825 -0.623654 +v 0.879005 0.143251 -0.625062 +v 0.895650 0.073116 -0.625127 +v 0.654734 0.167064 -0.623654 +v 0.654733 0.167065 -0.623654 +v 0.649625 0.143627 -0.623654 +v 0.885516 0.030399 -0.624748 +v 0.634272 0.073198 -0.623654 +v 0.841143 -0.026407 -0.624732 +v 0.628736 0.047800 -0.623654 +v 0.628736 0.047800 -0.623654 +v 0.705771 -0.046887 -0.623654 +v 0.827831 -0.045694 -0.623654 +v 0.827831 -0.045694 -0.623654 +v 0.740646 0.209477 -0.623654 +v 0.705771 -0.046887 -0.623654 +v 0.886628 0.029531 -0.623654 +v 0.676010 0.177568 -0.623654 +v 0.853065 0.179363 -0.623654 +v 0.903001 0.050480 -0.623654 +v 0.903001 0.050480 -0.623654 +v 0.842237 -0.027262 -0.623654 +v 0.880771 0.143670 -0.623654 +v 0.787813 0.210005 -0.623654 +v 0.897497 0.073554 -0.623654 +v 0.874678 0.169214 -0.623654 +v 0.874678 0.169214 -0.623654 +v 0.764188 0.221099 -0.623654 +v 0.764188 0.221099 -0.623654 +vt 0.750000 0.452782 +vt 0.789561 0.448886 +vt 0.827601 0.437346 +vt 0.862660 0.418607 +vt 0.893388 0.393388 +vt 0.918607 0.362660 +vt 0.937346 0.327601 +vt 0.948886 0.289561 +vt 0.952782 0.250000 +vt 0.948886 0.210439 +vt 0.937346 0.172399 +vt 0.918607 0.137340 +vt 0.893388 0.106612 +vt 0.862660 0.081393 +vt 0.827601 0.062654 +vt 0.789561 0.051114 +vt 0.750000 0.047218 +vt 0.710439 0.051114 +vt 0.672399 0.062654 +vt 0.637340 0.081393 +vt 0.606611 0.106612 +vt 0.581393 0.137341 +vt 0.562654 0.172399 +vt 0.551114 0.210439 +vt 0.547218 0.250000 +vt 0.551114 0.289561 +vt 0.562654 0.327601 +vt 0.581393 0.362660 +vt 0.606612 0.393389 +vt 0.637341 0.418607 +vt 0.672399 0.437346 +vt 0.710439 0.448886 +vt 0.375000 0.055549 +vt 0.625000 0.055549 +vt 0.625000 0.250000 +vt 0.375000 0.250000 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.055549 +vt 0.625000 0.055549 +vt 0.625000 0.250000 +vt 0.375000 0.250000 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.055549 +vt 0.625000 0.055549 +vt 0.625000 0.250000 +vt 0.375000 0.250000 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.055549 +vt 0.625000 0.055549 +vt 0.625000 0.250000 +vt 0.375000 0.250000 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.055549 +vt 0.625000 0.055549 +vt 0.625000 0.250000 +vt 0.375000 0.250000 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.055549 +vt 0.625000 0.055549 +vt 0.625000 0.250000 +vt 0.375000 0.250000 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.055549 +vt 0.625000 0.055549 +vt 0.625000 0.250000 +vt 0.375000 0.250000 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.412335 0.317241 +vt 0.412531 0.317322 +vt 0.410609 0.320917 +vt 0.412958 0.315915 +vt 0.152263 0.396274 +vt 0.127928 0.376303 +vt 0.152682 0.395647 +vt 0.156129 0.398340 +vt 0.591195 0.984481 +vt 0.591195 0.971224 +vt 0.625000 0.971315 +vt 0.625000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 0.971255 +vt 0.399843 0.971155 +vt 0.399843 0.984481 +vt 0.153745 0.750000 +vt 0.125000 0.750000 +vt 0.125000 0.694451 +vt 0.167165 0.694451 +vt 0.141327 0.746407 +vt 0.154903 0.746407 +vt 0.833163 0.694451 +vt 0.875000 0.694451 +vt 0.875000 0.750000 +vt 0.846315 0.750000 +vt 0.844748 0.745144 +vt 0.858389 0.745144 +vt 0.600410 0.984481 +vt 0.600410 0.971596 +vt 0.625000 0.971733 +vt 0.625000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 0.971619 +vt 0.408190 0.971582 +vt 0.408190 0.984481 +vt 0.153381 0.750000 +vt 0.125000 0.750000 +vt 0.125000 0.694451 +vt 0.166849 0.694451 +vt 0.141595 0.745218 +vt 0.154928 0.745218 +vt 0.832813 0.694451 +vt 0.875000 0.694451 +vt 0.875000 0.750000 +vt 0.846733 0.750000 +vt 0.845591 0.746455 +vt 0.858683 0.746455 +vt 0.573964 0.984481 +vt 0.573964 0.972443 +vt 0.625000 0.972512 +vt 0.625000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 0.972387 +vt 0.401976 0.972243 +vt 0.401976 0.984481 +vt 0.473116 0.981439 +vt 0.152613 0.750000 +vt 0.125000 0.750000 +vt 0.125000 0.694451 +vt 0.166976 0.694451 +vt 0.141422 0.745990 +vt 0.153908 0.745990 +vt 0.833717 0.694451 +vt 0.875000 0.694451 +vt 0.875000 0.750000 +vt 0.847513 0.750000 +vt 0.845202 0.742873 +vt 0.857878 0.742873 +vt 0.589589 0.984481 +vt 0.589589 0.972622 +vt 0.625000 0.972784 +vt 0.625000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 0.972740 +vt 0.399342 0.972688 +vt 0.399342 0.984481 +vt 0.152260 0.750000 +vt 0.125000 0.750000 +vt 0.125000 0.694451 +vt 0.167183 0.694451 +vt 0.141312 0.746478 +vt 0.153402 0.746478 +vt 0.833224 0.694451 +vt 0.875000 0.694451 +vt 0.875000 0.750000 +vt 0.847784 0.750000 +vt 0.846141 0.744916 +vt 0.858337 0.744916 +vt 0.586096 0.984481 +vt 0.586097 0.972492 +vt 0.625000 0.972524 +vt 0.625000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 0.972577 +vt 0.402404 0.972417 +vt 0.402404 0.984481 +vt 0.152423 0.750000 +vt 0.125000 0.750000 +vt 0.125000 0.694451 +vt 0.167076 0.694451 +vt 0.141408 0.746050 +vt 0.153697 0.746050 +vt 0.833377 0.694451 +vt 0.875000 0.694451 +vt 0.875000 0.750000 +vt 0.847524 0.750000 +vt 0.845706 0.744394 +vt 0.858220 0.744394 +vt 0.588803 0.984481 +vt 0.588803 0.971881 +vt 0.625000 0.972004 +vt 0.625000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 0.972228 +vt 0.415522 0.972094 +vt 0.415522 0.984481 +vt 0.152772 0.750000 +vt 0.125000 0.750000 +vt 0.125000 0.694451 +vt 0.166470 0.694451 +vt 0.141861 0.744036 +vt 0.154703 0.744036 +vt 0.833186 0.694451 +vt 0.875000 0.694451 +vt 0.875000 0.750000 +vt 0.847004 0.750000 +vt 0.845352 0.744893 +vt 0.858332 0.744893 +vt 0.573901 0.984481 +vt 0.573901 0.971321 +vt 0.617771 0.971297 +vt 0.625000 0.971341 +vt 0.625000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 0.971431 +vt 0.403890 0.971415 +vt 0.403890 0.984481 +vt 0.474247 0.981473 +vt 0.153569 0.750000 +vt 0.125000 0.750000 +vt 0.125000 0.694451 +vt 0.166900 0.694451 +vt 0.141484 0.745707 +vt 0.154943 0.745707 +vt 0.833722 0.694451 +vt 0.875000 0.694451 +vt 0.875000 0.750000 +vt 0.846341 0.750000 +vt 0.844047 0.742861 +vt 0.857876 0.742861 +vt 1.000000 1.000000 +vt 0.986735 1.000000 +vt 0.986735 0.975180 +vt 0.995887 0.976695 +vt 1.000000 0.977747 +vt 0.907775 0.970185 +vt 0.934543 0.970185 +vt 0.946423 0.970185 +vt 0.963759 0.971378 +vt 0.983279 0.974608 +vt 0.983279 1.000000 +vt 0.876319 1.000000 +vt 0.876319 0.974036 +vt 0.905764 0.970247 +vt 0.869255 1.000000 +vt 0.857143 1.000000 +vt 0.857143 0.978177 +vt 0.869255 0.975489 +vt 0.719162 0.977782 +vt 0.726537 0.976532 +vt 0.726537 1.000000 +vt 0.714286 1.000000 +vt 0.714286 0.979047 +vt 0.845621 1.000000 +vt 0.845621 0.975664 +vt 0.841207 0.974701 +vt 0.841581 0.974783 +vt 0.841581 1.000000 +vt 0.731550 1.000000 +vt 0.731550 0.975683 +vt 0.751788 0.972253 +vt 0.780127 0.970185 +vt 0.781354 0.970185 +vt 0.784754 0.970185 +vt 0.810380 0.970860 +vt 0.589608 1.000000 +vt 0.589608 0.976540 +vt 0.594829 0.975449 +vt 0.625862 0.971884 +vt 0.655317 0.971403 +vt 0.685556 0.973908 +vt 0.696791 0.975918 +vt 0.696791 1.000000 +vt 0.571429 1.000000 +vt 0.571429 0.980340 +vt 0.584200 0.977671 +vt 0.584200 1.000000 +vt 0.702447 1.000000 +vt 0.702447 0.976930 +vt 0.446758 1.000000 +vt 0.446758 0.977145 +vt 0.467892 0.973849 +vt 0.498048 0.972073 +vt 0.527986 0.973287 +vt 0.554851 0.977003 +vt 0.554851 1.000000 +vt 0.428571 1.000000 +vt 0.428571 0.980569 +vt 0.435005 0.978979 +vt 0.441838 0.977913 +vt 0.441838 1.000000 +vt 0.558661 0.977531 +vt 0.560149 0.977736 +vt 0.558661 1.000000 +vt 0.415389 1.000000 +vt 0.415389 0.978036 +vt 0.309169 0.975385 +vt 0.340075 0.972264 +vt 0.369744 0.972202 +vt 0.400548 0.975185 +vt 0.412002 0.977386 +vt 0.412002 1.000000 +vt 0.305027 1.000000 +vt 0.305027 0.976197 +vt 0.297973 1.000000 +vt 0.285714 1.000000 +vt 0.285714 0.979982 +vt 0.297973 0.977580 +vt 0.416059 0.357087 +vt 0.423064 0.325372 +vt 0.430581 0.291701 +vt 0.438297 0.257223 +vt 0.443039 0.236044 +vt 0.445992 0.234885 +vt 0.478382 0.221132 +vt 0.442688 0.377519 +vt 0.418109 0.358843 +vt 0.437640 0.399638 +vt 0.433246 0.393209 +vt 0.441377 0.383261 +vt 0.184488 0.071792 +vt 0.183417 0.068541 +vt 0.172381 0.033767 +vt 0.329965 0.033767 +vt 0.313923 0.069442 +vt 0.312784 0.071960 +vt 0.283013 0.071276 +vt 0.245500 0.070956 +vt 0.207513 0.071256 +vt 0.335519 0.033767 +vt 0.354132 0.033767 +vt 0.365740 0.048324 +vt 0.432525 0.191471 +vt 0.426641 0.183685 +vt 0.403170 0.153489 +vt 0.380082 0.124766 +vt 0.355564 0.095101 +vt 0.353492 0.092633 +vt 0.355136 0.088999 +vt 0.370656 0.054488 +vt 0.468080 0.176654 +vt 0.436311 0.189957 +vt 0.473222 0.183101 +vt 0.483983 0.196595 +vt 0.480008 0.214008 +vt 0.022842 0.200525 +vt 0.016017 0.196595 +vt 0.027160 0.182623 +vt 0.136101 0.099156 +vt 0.112362 0.128229 +vt 0.089426 0.156450 +vt 0.065503 0.185941 +vt 0.064758 0.186857 +vt 0.061005 0.185471 +vt 0.033572 0.174582 +vt 0.130807 0.052653 +vt 0.142141 0.088637 +vt 0.142886 0.090878 +vt 0.145868 0.033767 +vt 0.165209 0.033767 +vt 0.133885 0.048793 +vt 0.274063 0.977207 +vt 0.274730 0.977308 +vt 0.274063 1.000000 +vt 0.183477 0.972119 +vt 0.212961 0.970801 +vt 0.242560 0.972419 +vt 0.270291 0.976634 +vt 0.270291 1.000000 +vt 0.159634 1.000000 +vt 0.159634 0.975514 +vt 0.156216 1.000000 +vt 0.142857 1.000000 +vt 0.142857 0.978718 +vt 0.151695 0.976645 +vt 0.156216 0.976001 +vt 0.129491 1.000000 +vt 0.129492 0.975976 +vt 0.000000 0.977747 +vt 0.013338 0.975309 +vt 0.013338 1.000000 +vt 0.000000 1.000000 +vt 0.018035 0.974450 +vt 0.028975 0.972450 +vt 0.055005 0.970185 +vt 0.058667 0.970185 +vt 0.084969 0.970185 +vt 0.087492 0.970216 +vt 0.117760 0.973569 +vt 0.124878 0.975029 +vt 0.124878 1.000000 +vt 0.018035 1.000000 +vt 0.019797 0.213154 +vt 0.051909 0.224916 +vt 0.054327 0.225559 +vt 0.062090 0.254257 +vt 0.070975 0.288475 +vt 0.079806 0.322620 +vt 0.086020 0.346400 +vt 0.084307 0.348069 +vt 0.056918 0.375792 +vt 0.021021 0.218517 +vt 0.250000 0.490000 +vt 0.232480 0.481563 +vt 0.267423 0.481609 +vt 0.274590 0.439780 +vt 0.274738 0.437263 +vt 0.293364 0.429104 +vt 0.325828 0.414536 +vt 0.357919 0.399840 +vt 0.387945 0.385993 +vt 0.390902 0.389016 +vt 0.412452 0.411767 +vt 0.271963 0.479423 +vt 0.062360 0.399638 +vt 0.058027 0.380651 +vt 0.079916 0.408092 +vt 0.112684 0.384040 +vt 0.115045 0.381715 +vt 0.120154 0.384464 +vt 0.153938 0.401805 +vt 0.186405 0.417424 +vt 0.220119 0.432677 +vt 0.229066 0.436538 +vt 0.228861 0.439953 +vt 0.226311 0.478592 +vt 0.085976 0.411010 +vt 0.421730 0.407299 +vt 0.307648 0.389175 +vt 0.307723 0.389356 +vt 0.279079 0.396192 +vt 0.279042 0.396002 +vt 0.389114 0.307623 +vt 0.389293 0.307697 +vt 0.376651 0.334626 +vt 0.376489 0.334517 +vt 0.401975 0.280230 +vt 0.402170 0.280269 +vt 0.378724 0.163989 +vt 0.392126 0.191130 +vt 0.391947 0.191204 +vt 0.378562 0.164098 +vt 0.280294 0.097703 +vt 0.280331 0.097514 +vt 0.310444 0.104075 +vt 0.310369 0.104256 +vt 0.139971 0.139972 +vt 0.139834 0.139834 +vt 0.163514 0.120565 +vt 0.163622 0.120726 +vt 0.097536 0.250000 +vt 0.097236 0.219613 +vt 0.097430 0.219652 +vt 0.097729 0.250000 +vt 0.166562 0.374875 +vt 0.143302 0.356698 +vt 0.143440 0.356561 +vt 0.166669 0.374714 +vt 0.250000 0.403132 +vt 0.250000 0.402933 +vt 0.190597 0.393412 +vt 0.190520 0.393597 +vt 0.196887 0.398327 +vt 0.196841 0.398536 +vt 0.233248 0.407130 +vt 0.233294 0.406920 +vt 0.098028 0.280229 +vt 0.097835 0.280268 +vt 0.098236 0.301349 +vt 0.098044 0.301444 +vt 0.119048 0.337500 +vt 0.118879 0.337613 +vt 0.115160 0.334707 +vt 0.115352 0.334612 +vt 0.115335 0.160020 +vt 0.115167 0.159907 +vt 0.114589 0.160627 +vt 0.114397 0.160534 +vt 0.096980 0.193657 +vt 0.097174 0.193751 +vt 0.250000 0.091103 +vt 0.250000 0.090905 +vt 0.231758 0.087128 +vt 0.231708 0.086920 +vt 0.188176 0.100745 +vt 0.188099 0.100558 +vt 0.195143 0.094826 +vt 0.195193 0.095035 +vt 0.364605 0.135395 +vt 0.364460 0.135540 +vt 0.363417 0.132989 +vt 0.363285 0.133159 +vt 0.334455 0.109306 +vt 0.334323 0.109475 +vt 0.409858 0.263439 +vt 0.410071 0.263439 +vt 0.405885 0.218993 +vt 0.409363 0.226037 +vt 0.409147 0.226037 +vt 0.405688 0.219032 +vt 0.334358 0.382801 +vt 0.334490 0.382968 +vt 0.364469 0.360574 +vt 0.364335 0.360405 +vt 0.879125 0.952094 +vt 0.905911 0.952094 +vt 0.934599 0.952094 +vt 0.963724 0.952094 +vt 0.980478 0.952094 +vt 0.980478 1.000000 +vt 0.879125 1.000000 +vt 0.734152 0.952094 +vt 0.752247 0.952094 +vt 0.781767 0.952094 +vt 0.810748 0.952094 +vt 0.838646 0.952094 +vt 0.838646 1.000000 +vt 0.734153 1.000000 +vt 0.592608 0.952094 +vt 0.595198 0.952094 +vt 0.626267 0.952094 +vt 0.655756 0.952094 +vt 0.686031 0.952094 +vt 0.693652 0.952094 +vt 0.693652 1.000000 +vt 0.592608 1.000000 +vt 0.449715 0.952094 +vt 0.467927 0.952094 +vt 0.498171 0.952094 +vt 0.528197 0.952094 +vt 0.552112 0.952094 +vt 0.552112 1.000000 +vt 0.449715 1.000000 +vt 0.307849 0.952094 +vt 0.308788 0.952094 +vt 0.339771 0.952094 +vt 0.369515 0.952094 +vt 0.400396 0.952094 +vt 0.409220 0.952094 +vt 0.409220 1.000000 +vt 0.307849 1.000000 +vt 0.389345 0.328970 +vt 0.351188 0.273135 +vt 0.349989 0.267876 +vt 0.346726 0.253555 +vt 0.477538 0.224832 +vt 0.443640 0.373348 +vt 0.334909 0.201692 +vt 0.331177 0.185313 +vt 0.315627 0.177817 +vt 0.373383 0.057907 +vt 0.465228 0.173077 +vt 0.148795 0.273060 +vt 0.089612 0.238977 +vt 0.153088 0.254285 +vt 0.186333 0.176851 +vt 0.168871 0.185252 +vt 0.164944 0.202428 +vt 0.036137 0.171366 +vt 0.128278 0.055824 +vt 0.267712 0.154721 +vt 0.250039 0.146201 +vt 0.234265 0.153790 +vt 0.176691 0.033767 +vt 0.325971 0.033767 +vt 0.162409 0.952094 +vt 0.183011 0.952094 +vt 0.212500 0.952094 +vt 0.242106 0.952094 +vt 0.267372 0.952094 +vt 0.267372 1.000000 +vt 0.162409 1.000000 +vt 0.028760 0.952094 +vt 0.058382 0.952094 +vt 0.087140 0.952094 +vt 0.117337 0.952094 +vt 0.121913 0.952094 +vt 0.121913 1.000000 +vt 0.020973 1.000000 +vt 0.020973 0.952094 +vt 0.056018 0.371849 +vt 0.021967 0.222664 +vt 0.160868 0.288211 +vt 0.194017 0.329809 +vt 0.204928 0.343503 +vt 0.222629 0.343509 +vt 0.222452 0.476734 +vt 0.089871 0.412886 +vt 0.275820 0.343529 +vt 0.295002 0.343536 +vt 0.306102 0.329628 +vt 0.408767 0.413542 +vt 0.275642 0.477652 +vt 0.339283 0.288052 +vt 0.348645 0.328667 +vt 0.250000 0.376172 +vt 0.151355 0.328667 +vt 0.126992 0.221924 +vt 0.195256 0.136323 +vt 0.304744 0.136323 +vt 0.373008 0.221924 +vt 0.250000 0.401586 +vt 0.368515 0.344513 +vt 0.378377 0.352378 +vt 0.250000 0.414201 +vt 0.397786 0.216269 +vt 0.410084 0.213462 +vt 0.315771 0.113425 +vt 0.321244 0.102060 +vt 0.184229 0.113425 +vt 0.178756 0.102060 +vt 0.102214 0.216269 +vt 0.089916 0.213462 +vt 0.131485 0.344513 +vt 0.121623 0.352378 +vt 0.375000 0.275590 +vt 0.625000 0.275535 +vt 0.375000 0.275500 +vt 0.625000 0.275529 +vt 0.375000 0.276953 +vt 0.625000 0.276274 +vt 0.375000 0.275656 +vt 0.625000 0.275590 +vt 0.375000 0.275978 +vt 0.625000 0.275995 +vt 0.375000 0.276796 +vt 0.625000 0.276345 +vt 0.375000 0.277059 +vt 0.625000 0.276391 +vt 0.856398 0.502042 +vt 0.847674 0.502042 +vt 0.849465 0.500000 +vt 0.875000 0.500000 +vt 0.832412 0.689867 +vt 0.832459 0.689438 +vt 0.859050 0.689438 +vt 0.167652 0.690629 +vt 0.167701 0.691059 +vt 0.125000 0.500000 +vt 0.150590 0.500000 +vt 0.152318 0.501971 +vt 0.143593 0.501971 +vt 0.141088 0.690629 +vt 0.856398 0.502049 +vt 0.847676 0.502049 +vt 0.849471 0.500000 +vt 0.875000 0.500000 +vt 0.832290 0.691138 +vt 0.832340 0.690709 +vt 0.858902 0.690709 +vt 0.167557 0.689479 +vt 0.167604 0.689909 +vt 0.125000 0.500000 +vt 0.150500 0.500000 +vt 0.152330 0.502087 +vt 0.143607 0.502087 +vt 0.140957 0.689479 +vt 0.848726 0.500000 +vt 0.875000 0.500000 +vt 0.832534 0.687880 +vt 0.832575 0.687453 +vt 0.859288 0.687453 +vt 0.856517 0.501077 +vt 0.847785 0.501077 +vt 0.167566 0.689913 +vt 0.167616 0.690344 +vt 0.125000 0.500000 +vt 0.151953 0.500000 +vt 0.152119 0.500190 +vt 0.143377 0.500190 +vt 0.142774 0.592035 +vt 0.141000 0.689913 +vt 0.849410 0.500000 +vt 0.875000 0.500000 +vt 0.832463 0.689644 +vt 0.832513 0.689215 +vt 0.859085 0.689215 +vt 0.856410 0.501970 +vt 0.847690 0.501970 +vt 0.167672 0.690694 +vt 0.167720 0.691124 +vt 0.125000 0.500000 +vt 0.150656 0.500000 +vt 0.152302 0.501884 +vt 0.143580 0.501884 +vt 0.141100 0.690694 +vt 0.849005 0.500000 +vt 0.875000 0.500000 +vt 0.832460 0.689083 +vt 0.832504 0.688653 +vt 0.859141 0.688654 +vt 0.856473 0.501441 +vt 0.847746 0.501441 +vt 0.167612 0.690305 +vt 0.167662 0.690735 +vt 0.125000 0.500000 +vt 0.150978 0.500000 +vt 0.152256 0.501464 +vt 0.143529 0.501464 +vt 0.141048 0.690305 +vt 0.856527 0.500984 +vt 0.847793 0.500984 +vt 0.848655 0.500000 +vt 0.875000 0.500000 +vt 0.832447 0.689797 +vt 0.832497 0.689369 +vt 0.859066 0.689369 +vt 0.167396 0.688069 +vt 0.167443 0.688500 +vt 0.125000 0.500000 +vt 0.151796 0.500000 +vt 0.152141 0.500395 +vt 0.143402 0.500395 +vt 0.140785 0.688069 +vt 0.856534 0.500924 +vt 0.847799 0.500924 +vt 0.848609 0.500000 +vt 0.875000 0.500000 +vt 0.832672 0.687862 +vt 0.832721 0.687435 +vt 0.859303 0.687435 +vt 0.167534 0.689636 +vt 0.167585 0.690068 +vt 0.125000 0.500000 +vt 0.152059 0.500000 +vt 0.152104 0.500052 +vt 0.143360 0.500052 +vt 0.142767 0.590999 +vt 0.140966 0.689636 +vt 0.971926 0.953202 +vt 0.971926 0.970060 +vt 1.000000 0.970060 +vt 1.000000 0.953202 +vt 1.000000 0.953202 +vt 0.857143 0.953202 +vt 0.857143 0.970060 +vt 0.887565 0.970060 +vt 0.887565 0.953202 +vt 0.828921 0.953202 +vt 0.828921 0.970060 +vt 0.857143 0.953202 +vt 0.714286 0.953202 +vt 0.714286 0.970060 +vt 0.744554 0.970060 +vt 0.744554 0.953202 +vt 0.571429 0.970060 +vt 0.598072 0.970059 +vt 0.598072 0.953202 +vt 0.571429 0.953202 +vt 0.571429 0.953202 +vt 0.682436 0.953202 +vt 0.682436 0.970060 +vt 0.705731 0.970059 +vt 0.714286 0.953202 +vt 0.428571 0.970060 +vt 0.459688 0.970060 +vt 0.459688 0.953202 +vt 0.428572 0.953202 +vt 0.428571 0.953202 +vt 0.544050 0.953202 +vt 0.544050 0.970060 +vt 0.285714 0.953202 +vt 0.285714 0.970060 +vt 0.316448 0.970060 +vt 0.316448 0.953202 +vt 0.285714 0.953202 +vt 0.400809 0.953202 +vt 0.400809 0.970060 +vt 0.257770 0.953202 +vt 0.257770 0.970060 +vt 0.142857 0.953202 +vt 0.142857 0.970060 +vt 0.173403 0.970060 +vt 0.173403 0.953202 +vt 0.112131 0.953202 +vt 0.112131 0.970060 +vt 0.142857 0.953202 +vt 0.000000 0.953202 +vt 0.000000 0.970060 +vt 0.027770 0.970060 +vt 0.027770 0.953202 +vt 0.436509 0.398736 +vt 0.436509 0.398736 +vt 0.396791 0.417863 +vt 0.395397 0.414961 +vt 0.285207 0.467896 +vt 0.286652 0.470904 +vt 0.250000 0.488554 +vt 0.472813 0.239678 +vt 0.472731 0.239658 +vt 0.444141 0.358513 +vt 0.445609 0.358866 +vt 0.482573 0.196917 +vt 0.482573 0.196917 +vt 0.377577 0.065256 +vt 0.377069 0.065654 +vt 0.452533 0.161826 +vt 0.453798 0.160833 +vt 0.353505 0.035070 +vt 0.353505 0.035070 +vt 0.146495 0.035070 +vt 0.191586 0.035070 +vt 0.191586 0.037462 +vt 0.313831 0.037425 +vt 0.313830 0.035070 +vt 0.146495 0.035070 +vt 0.017427 0.196917 +vt 0.045194 0.162098 +vt 0.047598 0.164020 +vt 0.123927 0.068533 +vt 0.121412 0.066523 +vt 0.017427 0.196917 +vt 0.063491 0.398736 +vt 0.063491 0.398736 +vt 0.053641 0.355583 +vt 0.053944 0.355518 +vt 0.028158 0.236023 +vt 0.026437 0.236395 +vt 0.213745 0.471095 +vt 0.215223 0.468022 +vt 0.105057 0.415037 +vt 0.103606 0.418055 +vt 0.250000 0.488554 +vt 0.937420 0.533849 +vt 0.934356 0.538582 +vt 0.909393 0.538582 +vt 0.906330 0.533849 +vt 0.906575 0.519291 +vt 0.937175 0.519291 +vt 0.934358 0.657826 +vt 0.934357 0.736465 +vt 0.909392 0.736465 +vt 0.909393 0.657826 +vt 0.903108 0.657826 +vt 0.903107 0.736465 +vt 0.878142 0.736465 +vt 0.878143 0.657826 +vt 0.871858 0.657826 +vt 0.871857 0.736465 +vt 0.846892 0.736465 +vt 0.846893 0.657826 +vt 0.840608 0.657826 +vt 0.840607 0.736465 +vt 0.815642 0.736465 +vt 0.815643 0.657826 +vt 0.809358 0.657826 +vt 0.809357 0.736465 +vt 0.784392 0.736465 +vt 0.784393 0.657826 +vt 0.778108 0.657826 +vt 0.778107 0.736465 +vt 0.753142 0.736465 +vt 0.753143 0.657826 +vt 0.746858 0.657826 +vt 0.746857 0.736465 +vt 0.721892 0.736465 +vt 0.721893 0.657826 +vt 0.715608 0.657826 +vt 0.715607 0.736465 +vt 0.690642 0.736465 +vt 0.690643 0.657826 +vt 0.684358 0.657826 +vt 0.684357 0.736465 +vt 0.659392 0.736465 +vt 0.659393 0.657826 +vt 0.653108 0.657826 +vt 0.653107 0.736465 +vt 0.628142 0.736465 +vt 0.628143 0.657826 +vt 0.621858 0.657826 +vt 0.621857 0.736465 +vt 0.596892 0.736465 +vt 0.596893 0.657826 +vt 0.590608 0.657826 +vt 0.590607 0.736465 +vt 0.565642 0.736465 +vt 0.565643 0.657826 +vt 0.559358 0.657826 +vt 0.559357 0.736465 +vt 0.534392 0.736465 +vt 0.534393 0.657826 +vt 0.528108 0.657826 +vt 0.528107 0.736465 +vt 0.503142 0.736465 +vt 0.503143 0.657826 +vt 0.496858 0.657826 +vt 0.496857 0.736465 +vt 0.471892 0.736465 +vt 0.471893 0.657826 +vt 0.465608 0.657826 +vt 0.465607 0.736465 +vt 0.440642 0.736465 +vt 0.440643 0.657826 +vt 0.434358 0.657826 +vt 0.434357 0.736465 +vt 0.409392 0.736465 +vt 0.409393 0.657826 +vt 0.403108 0.657826 +vt 0.403107 0.736465 +vt 0.378142 0.736465 +vt 0.378143 0.657826 +vt 0.371858 0.657826 +vt 0.371857 0.736465 +vt 0.346892 0.736465 +vt 0.346893 0.657826 +vt 0.340608 0.657826 +vt 0.340607 0.736465 +vt 0.315642 0.736465 +vt 0.315643 0.657826 +vt 0.309358 0.657826 +vt 0.309357 0.736465 +vt 0.284392 0.736465 +vt 0.284393 0.657826 +vt 0.278108 0.657826 +vt 0.278107 0.736465 +vt 0.253142 0.736465 +vt 0.253143 0.657826 +vt 0.246858 0.657826 +vt 0.246857 0.736465 +vt 0.221892 0.736465 +vt 0.221893 0.657826 +vt 0.215608 0.657826 +vt 0.215607 0.736465 +vt 0.190642 0.736465 +vt 0.190643 0.657826 +vt 0.184358 0.657826 +vt 0.184357 0.736465 +vt 0.159392 0.736465 +vt 0.159393 0.657826 +vt 0.153108 0.657826 +vt 0.153107 0.736465 +vt 0.128142 0.736465 +vt 0.128143 0.657826 +vt 0.121858 0.657826 +vt 0.121857 0.736465 +vt 0.096892 0.736465 +vt 0.096893 0.657826 +vt 0.090608 0.657826 +vt 0.090607 0.736465 +vt 0.065642 0.736465 +vt 0.065643 0.657826 +vt 0.906170 0.533849 +vt 0.903106 0.538582 +vt 0.878143 0.538582 +vt 0.875080 0.533849 +vt 0.875325 0.519291 +vt 0.905925 0.519291 +vt 0.965608 0.657826 +vt 0.965607 0.736465 +vt 0.940642 0.736465 +vt 0.940643 0.657826 +vt 0.968670 0.533849 +vt 0.965606 0.538582 +vt 0.940643 0.538582 +vt 0.937580 0.533849 +vt 0.937825 0.519291 +vt 0.968425 0.519291 +vt 0.028106 0.538582 +vt 0.028107 0.630756 +vt 0.003143 0.630756 +vt 0.003143 0.538582 +vt 0.999675 0.519291 +vt 0.969075 0.519291 +vt 0.969962 0.500000 +vt 0.998788 0.500000 +vt 0.750000 0.471391 +vt 0.793191 0.467137 +vt 0.000080 0.966151 +vt 0.003143 0.961418 +vt 0.028106 0.961418 +vt 0.031170 0.966151 +vt 0.030925 0.980709 +vt 0.000325 0.980709 +vt 0.969075 0.980709 +vt 0.999675 0.980709 +vt 0.998788 1.000000 +vt 0.969962 1.000000 +vt 0.293191 0.467137 +vt 0.250000 0.471391 +vt 0.250000 0.452782 +vt 0.289561 0.448886 +vt 0.965607 0.630756 +vt 0.940643 0.630756 +vt 0.938712 0.500000 +vt 0.967538 0.500000 +vt 0.834722 0.454539 +vt 0.965607 0.869244 +vt 0.965606 0.961418 +vt 0.940643 0.961418 +vt 0.940643 0.869244 +vt 0.937825 0.980709 +vt 0.968425 0.980709 +vt 0.967538 1.000000 +vt 0.938712 1.000000 +vt 0.334723 0.454539 +vt 0.327601 0.437346 +vt 0.934357 0.630756 +vt 0.909393 0.630756 +vt 0.907461 0.500000 +vt 0.936288 0.500000 +vt 0.872998 0.434080 +vt 0.934357 0.869244 +vt 0.934356 0.961418 +vt 0.909393 0.961418 +vt 0.909393 0.869244 +vt 0.906575 0.980709 +vt 0.937175 0.980709 +vt 0.936288 1.000000 +vt 0.907462 1.000000 +vt 0.372998 0.434080 +vt 0.362660 0.418607 +vt 0.903107 0.630756 +vt 0.878143 0.630756 +vt 0.876212 0.500000 +vt 0.905038 0.500000 +vt 0.906547 0.406547 +vt 0.903107 0.869244 +vt 0.903106 0.961418 +vt 0.878143 0.961418 +vt 0.878143 0.869244 +vt 0.875325 0.980709 +vt 0.905925 0.980709 +vt 0.905038 1.000000 +vt 0.876212 1.000000 +vt 0.406547 0.406547 +vt 0.393388 0.393388 +vt 0.871856 0.538582 +vt 0.871857 0.630756 +vt 0.846893 0.630756 +vt 0.846893 0.538582 +vt 0.874675 0.519291 +vt 0.844075 0.519291 +vt 0.844962 0.500000 +vt 0.873788 0.500000 +vt 0.934080 0.372998 +vt 0.871857 0.869244 +vt 0.871856 0.961418 +vt 0.846893 0.961418 +vt 0.846893 0.869244 +vt 0.844075 0.980709 +vt 0.874675 0.980709 +vt 0.873788 1.000000 +vt 0.844962 1.000000 +vt 0.434080 0.372998 +vt 0.418607 0.362660 +vt 0.840606 0.538582 +vt 0.840607 0.630756 +vt 0.815643 0.630756 +vt 0.815643 0.538582 +vt 0.843425 0.519291 +vt 0.812825 0.519291 +vt 0.813712 0.500000 +vt 0.842538 0.500000 +vt 0.954539 0.334723 +vt 0.840607 0.869244 +vt 0.840606 0.961418 +vt 0.815643 0.961418 +vt 0.815643 0.869244 +vt 0.812825 0.980709 +vt 0.843425 0.980709 +vt 0.842538 1.000000 +vt 0.813712 1.000000 +vt 0.454539 0.334723 +vt 0.437346 0.327601 +vt 0.809356 0.538582 +vt 0.809357 0.630756 +vt 0.784393 0.630756 +vt 0.784393 0.538582 +vt 0.812175 0.519291 +vt 0.781575 0.519291 +vt 0.782462 0.500000 +vt 0.811288 0.500000 +vt 0.967137 0.293191 +vt 0.809357 0.869244 +vt 0.809356 0.961418 +vt 0.784393 0.961418 +vt 0.784393 0.869244 +vt 0.781575 0.980709 +vt 0.812175 0.980709 +vt 0.811288 1.000000 +vt 0.782462 1.000000 +vt 0.467137 0.293191 +vt 0.448886 0.289561 +vt 0.778106 0.538582 +vt 0.778107 0.630756 +vt 0.753143 0.630756 +vt 0.753143 0.538582 +vt 0.780925 0.519291 +vt 0.750325 0.519291 +vt 0.751211 0.500000 +vt 0.780038 0.500000 +vt 0.971391 0.250000 +vt 0.778107 0.869244 +vt 0.778106 0.961418 +vt 0.753143 0.961418 +vt 0.753143 0.869244 +vt 0.750325 0.980709 +vt 0.780925 0.980709 +vt 0.780038 1.000000 +vt 0.751212 1.000000 +vt 0.471391 0.250000 +vt 0.452782 0.250000 +vt 0.746856 0.538582 +vt 0.746857 0.630756 +vt 0.721893 0.630756 +vt 0.721893 0.538582 +vt 0.749675 0.519291 +vt 0.719075 0.519291 +vt 0.719962 0.500000 +vt 0.748788 0.500000 +vt 0.967137 0.206809 +vt 0.746857 0.869244 +vt 0.746856 0.961418 +vt 0.721893 0.961418 +vt 0.721893 0.869244 +vt 0.719075 0.980709 +vt 0.749675 0.980709 +vt 0.748788 1.000000 +vt 0.719962 1.000000 +vt 0.467137 0.206809 +vt 0.448886 0.210439 +vt 0.715606 0.538582 +vt 0.715607 0.630756 +vt 0.690643 0.630756 +vt 0.690643 0.538582 +vt 0.718425 0.519291 +vt 0.687825 0.519291 +vt 0.688712 0.500000 +vt 0.717538 0.500000 +vt 0.954539 0.165277 +vt 0.715607 0.869244 +vt 0.715606 0.961418 +vt 0.690643 0.961418 +vt 0.690643 0.869244 +vt 0.687825 0.980709 +vt 0.718425 0.980709 +vt 0.717538 1.000000 +vt 0.688712 1.000000 +vt 0.454539 0.165277 +vt 0.437346 0.172399 +vt 0.684356 0.538582 +vt 0.684357 0.630756 +vt 0.659393 0.630756 +vt 0.659393 0.538582 +vt 0.687175 0.519291 +vt 0.656575 0.519291 +vt 0.657462 0.500000 +vt 0.686288 0.500000 +vt 0.934080 0.127002 +vt 0.684357 0.869244 +vt 0.684356 0.961418 +vt 0.659393 0.961418 +vt 0.659393 0.869244 +vt 0.656575 0.980709 +vt 0.687175 0.980709 +vt 0.686288 1.000000 +vt 0.657462 1.000000 +vt 0.434080 0.127002 +vt 0.418607 0.137340 +vt 0.653106 0.538582 +vt 0.653107 0.630756 +vt 0.628143 0.630756 +vt 0.628143 0.538582 +vt 0.655925 0.519291 +vt 0.625325 0.519291 +vt 0.626212 0.500000 +vt 0.655039 0.500000 +vt 0.906547 0.093453 +vt 0.653107 0.869244 +vt 0.653106 0.961418 +vt 0.628143 0.961418 +vt 0.628143 0.869244 +vt 0.625325 0.980709 +vt 0.655925 0.980709 +vt 0.655038 1.000000 +vt 0.626212 1.000000 +vt 0.406547 0.093453 +vt 0.393389 0.106612 +vt 0.621856 0.538582 +vt 0.621857 0.630756 +vt 0.596893 0.630756 +vt 0.596893 0.538582 +vt 0.624675 0.519291 +vt 0.594075 0.519291 +vt 0.594962 0.500000 +vt 0.623788 0.500000 +vt 0.872998 0.065920 +vt 0.621857 0.869244 +vt 0.621856 0.961418 +vt 0.596893 0.961418 +vt 0.596893 0.869244 +vt 0.594075 0.980709 +vt 0.624675 0.980709 +vt 0.623788 1.000000 +vt 0.594962 1.000000 +vt 0.372998 0.065920 +vt 0.362660 0.081393 +vt 0.590606 0.538582 +vt 0.590607 0.630756 +vt 0.565643 0.630756 +vt 0.565643 0.538582 +vt 0.593425 0.519291 +vt 0.562825 0.519291 +vt 0.563712 0.500000 +vt 0.592538 0.500000 +vt 0.834723 0.045461 +vt 0.590607 0.869244 +vt 0.590606 0.961418 +vt 0.565643 0.961418 +vt 0.565643 0.869244 +vt 0.562825 0.980709 +vt 0.593425 0.980709 +vt 0.592538 1.000000 +vt 0.563712 1.000000 +vt 0.334723 0.045461 +vt 0.327601 0.062654 +vt 0.559356 0.538582 +vt 0.559357 0.630756 +vt 0.534393 0.630756 +vt 0.534393 0.538582 +vt 0.562175 0.519291 +vt 0.531575 0.519291 +vt 0.532462 0.500000 +vt 0.561288 0.500000 +vt 0.793191 0.032863 +vt 0.559357 0.869244 +vt 0.559356 0.961418 +vt 0.534393 0.961418 +vt 0.534393 0.869244 +vt 0.531575 0.980709 +vt 0.562175 0.980709 +vt 0.561289 1.000000 +vt 0.532462 1.000000 +vt 0.293191 0.032863 +vt 0.289561 0.051114 +vt 0.528106 0.538582 +vt 0.528107 0.630756 +vt 0.503143 0.630756 +vt 0.503143 0.538582 +vt 0.530925 0.519291 +vt 0.500325 0.519291 +vt 0.501212 0.500000 +vt 0.530038 0.500000 +vt 0.750000 0.028609 +vt 0.528107 0.869244 +vt 0.528106 0.961418 +vt 0.503143 0.961418 +vt 0.503143 0.869244 +vt 0.500325 0.980709 +vt 0.530925 0.980709 +vt 0.530038 1.000000 +vt 0.501212 1.000000 +vt 0.250000 0.028609 +vt 0.250000 0.047218 +vt 0.496856 0.538582 +vt 0.496857 0.630756 +vt 0.471893 0.630756 +vt 0.471893 0.538582 +vt 0.499675 0.519291 +vt 0.469075 0.519291 +vt 0.469962 0.500000 +vt 0.498788 0.500000 +vt 0.706809 0.032863 +vt 0.496857 0.869244 +vt 0.496856 0.961418 +vt 0.471893 0.961418 +vt 0.471893 0.869244 +vt 0.469075 0.980709 +vt 0.499675 0.980709 +vt 0.498789 1.000000 +vt 0.469962 1.000000 +vt 0.206809 0.032863 +vt 0.210439 0.051114 +vt 0.465606 0.538582 +vt 0.465607 0.630756 +vt 0.440643 0.630756 +vt 0.440643 0.538582 +vt 0.468425 0.519291 +vt 0.437825 0.519291 +vt 0.438712 0.500000 +vt 0.467538 0.500000 +vt 0.665277 0.045461 +vt 0.465607 0.869244 +vt 0.465606 0.961418 +vt 0.440643 0.961418 +vt 0.440643 0.869244 +vt 0.437825 0.980709 +vt 0.468425 0.980709 +vt 0.467538 1.000000 +vt 0.438712 1.000000 +vt 0.165277 0.045461 +vt 0.172399 0.062654 +vt 0.434356 0.538582 +vt 0.434357 0.630756 +vt 0.409393 0.630756 +vt 0.409393 0.538582 +vt 0.437175 0.519291 +vt 0.406575 0.519291 +vt 0.407461 0.500000 +vt 0.436288 0.500000 +vt 0.627002 0.065920 +vt 0.434357 0.869244 +vt 0.434356 0.961418 +vt 0.409393 0.961418 +vt 0.409393 0.869244 +vt 0.406575 0.980709 +vt 0.437175 0.980709 +vt 0.436289 1.000000 +vt 0.407462 1.000000 +vt 0.127002 0.065920 +vt 0.137340 0.081393 +vt 0.403106 0.538582 +vt 0.403107 0.630756 +vt 0.378143 0.630756 +vt 0.378143 0.538582 +vt 0.405925 0.519291 +vt 0.375325 0.519291 +vt 0.376212 0.500000 +vt 0.405038 0.500000 +vt 0.593453 0.093453 +vt 0.403107 0.869244 +vt 0.403106 0.961418 +vt 0.378143 0.961418 +vt 0.378143 0.869244 +vt 0.375325 0.980709 +vt 0.405925 0.980709 +vt 0.405038 1.000000 +vt 0.376212 1.000000 +vt 0.093453 0.093453 +vt 0.106611 0.106612 +vt 0.371856 0.538582 +vt 0.371857 0.630756 +vt 0.346893 0.630756 +vt 0.346893 0.538582 +vt 0.374675 0.519291 +vt 0.344075 0.519291 +vt 0.344962 0.500000 +vt 0.373788 0.500000 +vt 0.565920 0.127002 +vt 0.371857 0.869244 +vt 0.371856 0.961418 +vt 0.346893 0.961418 +vt 0.346893 0.869244 +vt 0.344075 0.980709 +vt 0.374675 0.980709 +vt 0.373788 1.000000 +vt 0.344962 1.000000 +vt 0.065920 0.127002 +vt 0.081393 0.137341 +vt 0.340606 0.538582 +vt 0.340607 0.630756 +vt 0.315643 0.630756 +vt 0.315643 0.538582 +vt 0.343425 0.519291 +vt 0.312825 0.519291 +vt 0.313711 0.500000 +vt 0.342539 0.500000 +vt 0.545461 0.165278 +vt 0.340607 0.869244 +vt 0.340606 0.961418 +vt 0.315643 0.961418 +vt 0.315643 0.869244 +vt 0.312825 0.980709 +vt 0.343425 0.980709 +vt 0.342539 1.000000 +vt 0.313712 1.000000 +vt 0.045461 0.165278 +vt 0.062654 0.172399 +vt 0.309356 0.538582 +vt 0.309357 0.630756 +vt 0.284393 0.630756 +vt 0.284393 0.538582 +vt 0.312175 0.519291 +vt 0.281575 0.519291 +vt 0.282462 0.500000 +vt 0.311288 0.500000 +vt 0.532863 0.206809 +vt 0.309357 0.869244 +vt 0.309356 0.961418 +vt 0.284393 0.961418 +vt 0.284393 0.869244 +vt 0.281575 0.980709 +vt 0.312175 0.980709 +vt 0.311288 1.000000 +vt 0.282462 1.000000 +vt 0.032863 0.206809 +vt 0.051114 0.210439 +vt 0.278106 0.538582 +vt 0.278107 0.630756 +vt 0.253143 0.630756 +vt 0.253143 0.538582 +vt 0.280925 0.519291 +vt 0.250325 0.519291 +vt 0.251212 0.500000 +vt 0.280038 0.500000 +vt 0.528609 0.250000 +vt 0.278107 0.869244 +vt 0.278106 0.961418 +vt 0.253143 0.961418 +vt 0.253143 0.869244 +vt 0.250325 0.980709 +vt 0.280925 0.980709 +vt 0.280038 1.000000 +vt 0.251212 1.000000 +vt 0.028609 0.250000 +vt 0.047218 0.250000 +vt 0.246856 0.538582 +vt 0.246857 0.630756 +vt 0.221893 0.630756 +vt 0.221893 0.538582 +vt 0.249675 0.519291 +vt 0.219075 0.519291 +vt 0.219962 0.500000 +vt 0.248788 0.500000 +vt 0.532863 0.293191 +vt 0.246857 0.869244 +vt 0.246856 0.961418 +vt 0.221893 0.961418 +vt 0.221893 0.869244 +vt 0.219075 0.980709 +vt 0.249675 0.980709 +vt 0.248788 1.000000 +vt 0.219962 1.000000 +vt 0.032863 0.293191 +vt 0.051115 0.289561 +vt 0.215606 0.538582 +vt 0.215607 0.630756 +vt 0.190643 0.630756 +vt 0.190643 0.538582 +vt 0.218425 0.519291 +vt 0.187825 0.519291 +vt 0.188712 0.500000 +vt 0.217538 0.500000 +vt 0.545462 0.334723 +vt 0.215607 0.869244 +vt 0.215606 0.961418 +vt 0.190643 0.961418 +vt 0.190643 0.869244 +vt 0.187825 0.980709 +vt 0.218425 0.980709 +vt 0.217538 1.000000 +vt 0.188712 1.000000 +vt 0.045462 0.334723 +vt 0.062654 0.327601 +vt 0.184356 0.538582 +vt 0.184357 0.630756 +vt 0.159393 0.630756 +vt 0.159393 0.538582 +vt 0.187175 0.519291 +vt 0.156575 0.519291 +vt 0.157462 0.500000 +vt 0.186288 0.500000 +vt 0.565920 0.372998 +vt 0.184357 0.869244 +vt 0.184356 0.961418 +vt 0.159393 0.961418 +vt 0.159393 0.869244 +vt 0.156575 0.980709 +vt 0.187175 0.980709 +vt 0.186288 1.000000 +vt 0.157462 1.000000 +vt 0.065920 0.372998 +vt 0.081393 0.362660 +vt 0.153106 0.538582 +vt 0.153107 0.630756 +vt 0.128143 0.630756 +vt 0.128143 0.538582 +vt 0.155925 0.519291 +vt 0.125325 0.519291 +vt 0.126212 0.500000 +vt 0.155038 0.500000 +vt 0.593453 0.406547 +vt 0.153107 0.869244 +vt 0.153106 0.961418 +vt 0.128143 0.961418 +vt 0.128143 0.869244 +vt 0.125325 0.980709 +vt 0.155925 0.980709 +vt 0.155038 1.000000 +vt 0.126212 1.000000 +vt 0.093453 0.406547 +vt 0.106612 0.393389 +vt 0.121856 0.538582 +vt 0.121857 0.630756 +vt 0.096893 0.630756 +vt 0.096893 0.538582 +vt 0.124675 0.519291 +vt 0.094075 0.519291 +vt 0.094962 0.500000 +vt 0.123788 0.500000 +vt 0.627002 0.434080 +vt 0.121857 0.869244 +vt 0.121856 0.961418 +vt 0.096893 0.961418 +vt 0.096893 0.869244 +vt 0.094075 0.980709 +vt 0.124675 0.980709 +vt 0.123788 1.000000 +vt 0.094962 1.000000 +vt 0.127002 0.434080 +vt 0.137341 0.418607 +vt 0.090606 0.538582 +vt 0.090607 0.630756 +vt 0.065643 0.630756 +vt 0.065643 0.538582 +vt 0.093425 0.519291 +vt 0.062825 0.519291 +vt 0.063712 0.500000 +vt 0.092538 0.500000 +vt 0.665278 0.454539 +vt 0.090607 0.869244 +vt 0.090606 0.961418 +vt 0.065643 0.961418 +vt 0.065643 0.869244 +vt 0.062825 0.980709 +vt 0.093425 0.980709 +vt 0.092538 1.000000 +vt 0.063712 1.000000 +vt 0.165278 0.454539 +vt 0.172399 0.437346 +vt 0.059356 0.538582 +vt 0.059357 0.630756 +vt 0.034393 0.630756 +vt 0.034393 0.538582 +vt 0.062175 0.519291 +vt 0.031575 0.519291 +vt 0.032462 0.500000 +vt 0.061288 0.500000 +vt 0.706809 0.467137 +vt 0.059357 0.869244 +vt 0.059356 0.961418 +vt 0.034393 0.961418 +vt 0.034393 0.869244 +vt 0.031575 0.980709 +vt 0.062175 0.980709 +vt 0.061288 1.000000 +vt 0.032462 1.000000 +vt 0.206809 0.467137 +vt 0.210440 0.448886 +vt 0.999920 0.533849 +vt 0.996856 0.538582 +vt 0.971893 0.538582 +vt 0.968830 0.533849 +vt 0.030925 0.519291 +vt 0.000325 0.519291 +vt 0.001212 0.500000 +vt 0.030038 0.500000 +vt 0.028107 0.869244 +vt 0.003143 0.869244 +vt 0.030038 1.000000 +vt 0.001212 1.000000 +vt 0.996857 0.763535 +vt 0.996858 0.842174 +vt 0.971893 0.842174 +vt 0.971892 0.763535 +vt 0.996857 0.869244 +vt 0.996856 0.961418 +vt 0.971893 0.961418 +vt 0.971893 0.869244 +vt 0.968830 0.966151 +vt 0.999920 0.966151 +vt 0.031330 0.966151 +vt 0.062420 0.966151 +vt 0.937580 0.966151 +vt 0.968670 0.966151 +vt 0.059358 0.657826 +vt 0.059357 0.736465 +vt 0.034392 0.736465 +vt 0.034393 0.657826 +vt 0.059357 0.763535 +vt 0.059358 0.842174 +vt 0.034393 0.842174 +vt 0.034392 0.763535 +vt 0.934357 0.763535 +vt 0.934358 0.842174 +vt 0.909393 0.842174 +vt 0.909392 0.763535 +vt 0.934333 0.644291 +vt 0.909417 0.644291 +vt 0.028083 0.855709 +vt 0.003167 0.855709 +vt 0.003143 0.842174 +vt 0.028108 0.842174 +vt 0.062580 0.966151 +vt 0.093670 0.966151 +vt 0.812500 0.538582 +vt 0.812500 0.630756 +vt 0.062420 0.533849 +vt 0.031330 0.533849 +vt 0.093830 0.966151 +vt 0.124920 0.966151 +vt 0.090607 0.763535 +vt 0.090608 0.842174 +vt 0.065643 0.842174 +vt 0.065642 0.763535 +vt 0.093670 0.533849 +vt 0.062580 0.533849 +vt 0.125080 0.966151 +vt 0.156170 0.966151 +vt 0.121857 0.763535 +vt 0.121858 0.842174 +vt 0.096893 0.842174 +vt 0.096892 0.763535 +vt 0.124920 0.533849 +vt 0.093830 0.533849 +vt 0.156330 0.966151 +vt 0.187420 0.966151 +vt 0.153107 0.763535 +vt 0.153108 0.842174 +vt 0.128143 0.842174 +vt 0.128142 0.763535 +vt 0.156170 0.533849 +vt 0.125080 0.533849 +vt 0.187580 0.966151 +vt 0.218670 0.966151 +vt 0.184357 0.763535 +vt 0.184358 0.842174 +vt 0.159393 0.842174 +vt 0.159392 0.763535 +vt 0.187420 0.533849 +vt 0.156330 0.533849 +vt 0.218830 0.966151 +vt 0.249920 0.966151 +vt 0.215607 0.763535 +vt 0.215608 0.842174 +vt 0.190643 0.842174 +vt 0.190642 0.763535 +vt 0.218670 0.533849 +vt 0.187580 0.533849 +vt 0.250080 0.966151 +vt 0.281170 0.966151 +vt 0.246857 0.763535 +vt 0.246858 0.842174 +vt 0.221893 0.842174 +vt 0.221892 0.763535 +vt 0.249920 0.533849 +vt 0.218830 0.533849 +vt 0.281330 0.966151 +vt 0.312420 0.966151 +vt 0.278107 0.763535 +vt 0.278108 0.842174 +vt 0.253143 0.842174 +vt 0.253142 0.763535 +vt 0.281170 0.533849 +vt 0.250080 0.533849 +vt 0.312580 0.966151 +vt 0.343670 0.966151 +vt 0.309357 0.763535 +vt 0.309358 0.842174 +vt 0.284393 0.842174 +vt 0.284392 0.763535 +vt 0.312420 0.533849 +vt 0.281330 0.533849 +vt 0.343830 0.966151 +vt 0.374920 0.966151 +vt 0.340607 0.763535 +vt 0.340608 0.842174 +vt 0.315643 0.842174 +vt 0.315642 0.763535 +vt 0.343670 0.533849 +vt 0.312580 0.533849 +vt 0.375080 0.966151 +vt 0.406170 0.966151 +vt 0.371857 0.763535 +vt 0.371858 0.842174 +vt 0.346893 0.842174 +vt 0.346892 0.763535 +vt 0.374920 0.533849 +vt 0.343830 0.533849 +vt 0.406330 0.966151 +vt 0.437420 0.966151 +vt 0.403107 0.763535 +vt 0.403108 0.842174 +vt 0.378143 0.842174 +vt 0.378142 0.763535 +vt 0.406170 0.533849 +vt 0.375080 0.533849 +vt 0.437580 0.966151 +vt 0.468670 0.966151 +vt 0.434357 0.763535 +vt 0.434358 0.842174 +vt 0.409393 0.842174 +vt 0.409392 0.763535 +vt 0.437420 0.533849 +vt 0.406330 0.533849 +vt 0.468830 0.966151 +vt 0.499920 0.966151 +vt 0.465607 0.763535 +vt 0.465608 0.842174 +vt 0.440643 0.842174 +vt 0.440642 0.763535 +vt 0.468670 0.533849 +vt 0.437580 0.533849 +vt 0.500080 0.966151 +vt 0.531170 0.966151 +vt 0.496857 0.763535 +vt 0.496858 0.842174 +vt 0.471893 0.842174 +vt 0.471892 0.763535 +vt 0.499920 0.533849 +vt 0.468830 0.533849 +vt 0.531330 0.966151 +vt 0.562420 0.966151 +vt 0.528107 0.763535 +vt 0.528108 0.842174 +vt 0.503143 0.842174 +vt 0.503142 0.763535 +vt 0.531170 0.533849 +vt 0.500080 0.533849 +vt 0.562580 0.966151 +vt 0.593670 0.966151 +vt 0.559357 0.763535 +vt 0.559358 0.842174 +vt 0.534393 0.842174 +vt 0.534392 0.763535 +vt 0.562420 0.533849 +vt 0.531330 0.533849 +vt 0.593830 0.966151 +vt 0.624920 0.966151 +vt 0.590607 0.763535 +vt 0.590608 0.842174 +vt 0.565643 0.842174 +vt 0.565642 0.763535 +vt 0.593670 0.533849 +vt 0.562580 0.533849 +vt 0.625080 0.966151 +vt 0.656170 0.966151 +vt 0.621857 0.763535 +vt 0.621858 0.842174 +vt 0.596893 0.842174 +vt 0.596892 0.763535 +vt 0.624920 0.533849 +vt 0.593830 0.533849 +vt 0.656330 0.966151 +vt 0.687420 0.966151 +vt 0.653107 0.763535 +vt 0.653108 0.842174 +vt 0.628143 0.842174 +vt 0.628142 0.763535 +vt 0.656170 0.533849 +vt 0.625080 0.533849 +vt 0.687580 0.966151 +vt 0.718670 0.966151 +vt 0.684357 0.763535 +vt 0.684358 0.842174 +vt 0.659393 0.842174 +vt 0.659392 0.763535 +vt 0.687420 0.533849 +vt 0.656330 0.533849 +vt 0.718830 0.966151 +vt 0.749920 0.966151 +vt 0.715607 0.763535 +vt 0.715608 0.842174 +vt 0.690643 0.842174 +vt 0.690642 0.763535 +vt 0.718670 0.533849 +vt 0.687580 0.533849 +vt 0.750080 0.966151 +vt 0.781170 0.966151 +vt 0.746857 0.763535 +vt 0.746858 0.842174 +vt 0.721893 0.842174 +vt 0.721892 0.763535 +vt 0.749920 0.533849 +vt 0.718830 0.533849 +vt 0.781330 0.966151 +vt 0.812420 0.966151 +vt 0.778107 0.763535 +vt 0.778108 0.842174 +vt 0.753143 0.842174 +vt 0.753142 0.763535 +vt 0.781170 0.533849 +vt 0.750080 0.533849 +vt 0.812580 0.966151 +vt 0.843670 0.966151 +vt 0.809357 0.763535 +vt 0.809358 0.842174 +vt 0.784393 0.842174 +vt 0.784392 0.763535 +vt 0.812420 0.533849 +vt 0.781330 0.533849 +vt 0.843830 0.966151 +vt 0.874920 0.966151 +vt 0.840607 0.763535 +vt 0.840608 0.842174 +vt 0.815643 0.842174 +vt 0.815642 0.763535 +vt 0.843670 0.533849 +vt 0.812580 0.533849 +vt 0.875080 0.966151 +vt 0.906170 0.966151 +vt 0.871857 0.763535 +vt 0.871858 0.842174 +vt 0.846893 0.842174 +vt 0.846892 0.763535 +vt 0.874920 0.533849 +vt 0.843830 0.533849 +vt 0.906330 0.966151 +vt 0.937420 0.966151 +vt 0.903107 0.763535 +vt 0.903108 0.842174 +vt 0.878143 0.842174 +vt 0.878142 0.763535 +vt 0.028108 0.657826 +vt 0.028107 0.736465 +vt 0.003142 0.736465 +vt 0.003143 0.657826 +vt 0.965607 0.763535 +vt 0.965608 0.842174 +vt 0.940643 0.842174 +vt 0.940642 0.763535 +vt 0.028107 0.763535 +vt 0.003142 0.763535 +vt 0.878166 0.750000 +vt 0.903083 0.750000 +vt 0.909417 0.855709 +vt 0.934333 0.855709 +vt 0.996858 0.657826 +vt 0.996857 0.736465 +vt 0.971892 0.736465 +vt 0.971893 0.657826 +vt 0.971917 0.644291 +vt 0.996833 0.644291 +vt 0.971916 0.750000 +vt 0.996833 0.750000 +vt 0.971917 0.855709 +vt 0.996833 0.855709 +vt 0.940667 0.644291 +vt 0.965583 0.644291 +vt 0.028083 0.750000 +vt 0.003166 0.750000 +vt 0.940667 0.855709 +vt 0.965583 0.855709 +vt 0.065667 0.644291 +vt 0.090583 0.644291 +vt 0.065667 0.855709 +vt 0.090583 0.855709 +vt 0.096916 0.750000 +vt 0.121833 0.750000 +vt 0.128167 0.644291 +vt 0.153083 0.644291 +vt 0.096917 0.855709 +vt 0.121833 0.855709 +vt 0.128166 0.750000 +vt 0.153083 0.750000 +vt 0.159417 0.855709 +vt 0.184333 0.855709 +vt 0.159417 0.644291 +vt 0.184333 0.644291 +vt 0.190666 0.750000 +vt 0.215583 0.750000 +vt 0.221917 0.644291 +vt 0.246833 0.644291 +vt 0.221917 0.855709 +vt 0.246833 0.855709 +vt 0.253166 0.750000 +vt 0.278083 0.750000 +vt 0.284417 0.644291 +vt 0.309333 0.644291 +vt 0.284417 0.855709 +vt 0.309333 0.855709 +vt 0.315666 0.750000 +vt 0.340583 0.750000 +vt 0.346917 0.644291 +vt 0.371833 0.644291 +vt 0.315667 0.855709 +vt 0.340583 0.855709 +vt 0.346916 0.750000 +vt 0.371833 0.750000 +vt 0.378167 0.855709 +vt 0.403083 0.855709 +vt 0.378167 0.644291 +vt 0.403083 0.644291 +vt 0.409416 0.750000 +vt 0.434333 0.750000 +vt 0.440667 0.644291 +vt 0.465583 0.644291 +vt 0.440667 0.855709 +vt 0.465583 0.855709 +vt 0.471916 0.750000 +vt 0.496833 0.750000 +vt 0.503167 0.644291 +vt 0.528083 0.644291 +vt 0.503167 0.855709 +vt 0.528083 0.855709 +vt 0.534416 0.750000 +vt 0.559333 0.750000 +vt 0.565667 0.644291 +vt 0.590583 0.644291 +vt 0.534417 0.855709 +vt 0.559333 0.855709 +vt 0.565666 0.750000 +vt 0.590583 0.750000 +vt 0.596917 0.855709 +vt 0.621833 0.855709 +vt 0.596917 0.644291 +vt 0.621833 0.644291 +vt 0.628166 0.750000 +vt 0.653083 0.750000 +vt 0.659417 0.644291 +vt 0.684333 0.644291 +vt 0.659417 0.855709 +vt 0.684333 0.855709 +vt 0.690666 0.750000 +vt 0.715583 0.750000 +vt 0.721917 0.644291 +vt 0.746833 0.644291 +vt 0.721917 0.855709 +vt 0.746833 0.855709 +vt 0.753166 0.750000 +vt 0.778083 0.750000 +vt 0.784417 0.644291 +vt 0.809333 0.644291 +vt 0.753167 0.855709 +vt 0.778083 0.855709 +vt 0.784416 0.750000 +vt 0.809333 0.750000 +vt 0.815667 0.855709 +vt 0.840583 0.855709 +vt 0.815667 0.644291 +vt 0.840583 0.644291 +vt 0.846916 0.750000 +vt 0.871833 0.750000 +vt 0.878167 0.644291 +vt 0.903083 0.644291 +vt 0.934333 0.750000 +vt 0.909416 0.750000 +vt 0.878167 0.855709 +vt 0.903083 0.855709 +vt 0.059333 0.644291 +vt 0.034417 0.644291 +vt 0.940666 0.750000 +vt 0.965583 0.750000 +vt 0.059333 0.855709 +vt 0.034417 0.855709 +vt 0.996857 0.630756 +vt 0.971893 0.630756 +vt 0.846917 0.855709 +vt 0.871833 0.855709 +vt 0.784417 0.855709 +vt 0.809333 0.855709 +vt 0.690667 0.855709 +vt 0.715583 0.855709 +vt 0.628167 0.855709 +vt 0.653083 0.855709 +vt 0.565667 0.855709 +vt 0.590583 0.855709 +vt 0.471917 0.855709 +vt 0.496833 0.855709 +vt 0.409417 0.855709 +vt 0.434333 0.855709 +vt 0.346917 0.855709 +vt 0.371833 0.855709 +vt 0.253167 0.855709 +vt 0.278083 0.855709 +vt 0.190667 0.855709 +vt 0.215583 0.855709 +vt 0.128167 0.855709 +vt 0.153083 0.855709 +vt 0.034416 0.750000 +vt 0.059333 0.750000 +vt 0.815666 0.750000 +vt 0.840583 0.750000 +vt 0.721916 0.750000 +vt 0.746833 0.750000 +vt 0.659416 0.750000 +vt 0.684333 0.750000 +vt 0.596916 0.750000 +vt 0.621833 0.750000 +vt 0.503166 0.750000 +vt 0.528083 0.750000 +vt 0.440666 0.750000 +vt 0.465583 0.750000 +vt 0.378166 0.750000 +vt 0.403083 0.750000 +vt 0.284416 0.750000 +vt 0.309333 0.750000 +vt 0.221916 0.750000 +vt 0.246833 0.750000 +vt 0.159416 0.750000 +vt 0.184333 0.750000 +vt 0.065666 0.750000 +vt 0.090583 0.750000 +vt 0.028083 0.644291 +vt 0.003167 0.644291 +vt 0.846917 0.644291 +vt 0.871833 0.644291 +vt 0.753167 0.644291 +vt 0.778083 0.644291 +vt 0.690667 0.644291 +vt 0.715583 0.644291 +vt 0.628167 0.644291 +vt 0.653083 0.644291 +vt 0.534417 0.644291 +vt 0.559333 0.644291 +vt 0.471917 0.644291 +vt 0.496833 0.644291 +vt 0.409417 0.644291 +vt 0.434333 0.644291 +vt 0.315667 0.644291 +vt 0.340583 0.644291 +vt 0.253167 0.644291 +vt 0.278083 0.644291 +vt 0.190667 0.644291 +vt 0.215583 0.644291 +vt 0.096917 0.644291 +vt 0.121833 0.644291 +vt 0.001573 0.538522 +vt 0.000002 0.538461 +vt 0.000080 0.533849 +vt -0.003083 0.961658 +vt 0.000030 0.961538 +vt 0.968771 0.538582 +vt 0.968711 0.961418 +vt 0.971816 0.961418 +vt 0.937521 0.538582 +vt 0.937461 0.961418 +vt 0.906271 0.538582 +vt 0.906211 0.961418 +vt 0.909316 0.961418 +vt 0.875021 0.538582 +vt 0.874961 0.961418 +vt 0.843771 0.538582 +vt 0.843711 0.961418 +vt 0.846816 0.961418 +vt 0.812461 0.961418 +vt 0.781271 0.538582 +vt 0.781211 0.961418 +vt 0.784316 0.961418 +vt 0.750021 0.538582 +vt 0.749961 0.961418 +vt 0.718771 0.538582 +vt 0.718711 0.961418 +vt 0.721816 0.961418 +vt 0.687521 0.538582 +vt 0.687461 0.961418 +vt 0.656271 0.538582 +vt 0.656211 0.961418 +vt 0.659316 0.961418 +vt 0.625021 0.538582 +vt 0.624961 0.961418 +vt 0.593771 0.538582 +vt 0.593711 0.961418 +vt 0.596816 0.961418 +vt 0.562521 0.538582 +vt 0.562461 0.961418 +vt 0.531271 0.538582 +vt 0.531211 0.961418 +vt 0.534316 0.961418 +vt 0.500011 0.538582 +vt 0.499980 0.961418 +vt 0.468771 0.538582 +vt 0.468711 0.961418 +vt 0.471816 0.961418 +vt 0.437521 0.538582 +vt 0.437461 0.961418 +vt 0.406271 0.538582 +vt 0.406211 0.961418 +vt 0.409316 0.961418 +vt 0.375021 0.538582 +vt 0.374961 0.961418 +vt 0.343771 0.538582 +vt 0.343711 0.961418 +vt 0.346816 0.961418 +vt 0.312521 0.538582 +vt 0.312461 0.961418 +vt 0.281271 0.538582 +vt 0.281211 0.961418 +vt 0.284316 0.961418 +vt 0.250021 0.538582 +vt 0.249961 0.961418 +vt 0.218771 0.538582 +vt 0.218711 0.961418 +vt 0.221816 0.961418 +vt 0.187521 0.538582 +vt 0.187461 0.961418 +vt 0.156271 0.538582 +vt 0.156211 0.961418 +vt 0.159316 0.961418 +vt 0.125021 0.538582 +vt 0.124961 0.961418 +vt 0.093771 0.538582 +vt 0.093711 0.961418 +vt 0.096816 0.961418 +vt 0.062521 0.538582 +vt 0.062461 0.961418 +vt 0.031271 0.538582 +vt 0.031170 0.533849 +vt 0.031211 0.961418 +vt 0.034316 0.961418 +vt 0.906250 0.630756 +vt 0.906250 0.644291 +vt 0.687500 0.630756 +vt 0.687500 0.644291 +vt 0.468750 0.630756 +vt 0.468750 0.644291 +vt 0.250000 0.630756 +vt 0.250000 0.644291 +vt 0.062500 0.630756 +vt 0.062500 0.644291 +vt 0.718750 0.736465 +vt 0.718750 0.750000 +vt 0.500000 0.736465 +vt 0.500000 0.750000 +vt 0.281250 0.736465 +vt 0.281250 0.750000 +vt 0.031250 0.763535 +vt 0.031250 0.750000 +vt 0.750000 0.842174 +vt 0.750000 0.855709 +vt 0.531250 0.842174 +vt 0.531250 0.855709 +vt 0.312500 0.842174 +vt 0.312500 0.855709 +vt 0.093750 0.842174 +vt 0.093750 0.855709 +vt 0.001571 0.842212 +vt 0.001584 0.855709 +vt 0.000000 0.855709 +vt 0.000000 0.842251 +vt 0.843750 0.630756 +vt 0.843750 0.644291 +vt 0.812500 0.644291 +vt 0.750000 0.630756 +vt 0.750000 0.644291 +vt 0.625000 0.630756 +vt 0.625000 0.644291 +vt 0.593750 0.630756 +vt 0.593750 0.644291 +vt 0.531250 0.630756 +vt 0.531250 0.644291 +vt 0.406250 0.630756 +vt 0.406250 0.644291 +vt 0.375000 0.630756 +vt 0.375000 0.644291 +vt 0.312500 0.630756 +vt 0.312500 0.644291 +vt 0.187500 0.630756 +vt 0.187500 0.644291 +vt 0.156250 0.630756 +vt 0.156250 0.644291 +vt 0.093750 0.630756 +vt 0.093750 0.644291 +vt 0.968750 0.657826 +vt 0.968750 0.644291 +vt 0.001572 0.630786 +vt 0.001584 0.644291 +vt 0.000000 0.644291 +vt 0.000000 0.630817 +vt 0.875000 0.736465 +vt 0.875000 0.750000 +vt 0.843750 0.736465 +vt 0.843750 0.750000 +vt 0.781250 0.736465 +vt 0.781250 0.750000 +vt 0.656250 0.736465 +vt 0.656250 0.750000 +vt 0.625000 0.736465 +vt 0.625000 0.750000 +vt 0.562500 0.736465 +vt 0.562500 0.750000 +vt 0.437500 0.736465 +vt 0.437500 0.750000 +vt 0.406250 0.736465 +vt 0.406250 0.750000 +vt 0.343750 0.736465 +vt 0.343750 0.750000 +vt 0.218750 0.736465 +vt 0.218750 0.750000 +vt 0.187500 0.736465 +vt 0.187500 0.750000 +vt 0.125000 0.736465 +vt 0.125000 0.750000 +vt 0.937500 0.763535 +vt 0.937500 0.750000 +vt 0.968750 0.763535 +vt 0.968750 0.750000 +vt 0.906250 0.842174 +vt 0.906250 0.855709 +vt 0.875000 0.842174 +vt 0.875000 0.855709 +vt 0.812500 0.842174 +vt 0.812500 0.855709 +vt 0.687500 0.842174 +vt 0.687500 0.855709 +vt 0.656250 0.842174 +vt 0.656250 0.855709 +vt 0.593750 0.842174 +vt 0.593750 0.855709 +vt 0.468750 0.842174 +vt 0.468750 0.855709 +vt 0.437500 0.842174 +vt 0.437500 0.855709 +vt 0.375000 0.842174 +vt 0.375000 0.855709 +vt 0.250000 0.842174 +vt 0.250000 0.855709 +vt 0.218750 0.842174 +vt 0.218750 0.855709 +vt 0.156250 0.842174 +vt 0.156250 0.855709 +vt 0.062500 0.842174 +vt 0.062500 0.855709 +vt 0.937500 0.869244 +vt 0.937500 0.855709 +vt 0.968750 0.869244 +vt 0.968750 0.855709 +vt 0.031250 0.869244 +vt 0.031250 0.855709 +vt 0.125000 0.842174 +vt 0.125000 0.855709 +vt 0.187500 0.842174 +vt 0.187500 0.855709 +vt 0.281250 0.842174 +vt 0.281250 0.855709 +vt 0.343750 0.842174 +vt 0.343750 0.855709 +vt 0.406250 0.842174 +vt 0.406250 0.855709 +vt 0.500000 0.842174 +vt 0.500000 0.855709 +vt 0.562500 0.842174 +vt 0.562500 0.855709 +vt 0.625000 0.842174 +vt 0.625000 0.855709 +vt 0.718750 0.842174 +vt 0.718750 0.855709 +vt 0.781250 0.842174 +vt 0.781250 0.855709 +vt 0.843750 0.842174 +vt 0.843750 0.855709 +vt 0.001571 0.736499 +vt 0.001583 0.750000 +vt 0.000000 0.750000 +vt 0.000000 0.736533 +vt 0.062500 0.736465 +vt 0.062500 0.750000 +vt 0.093750 0.736465 +vt 0.093750 0.750000 +vt 0.156250 0.736465 +vt 0.156250 0.750000 +vt 0.250000 0.736465 +vt 0.250000 0.750000 +vt 0.312500 0.736465 +vt 0.312500 0.750000 +vt 0.375000 0.736465 +vt 0.375000 0.750000 +vt 0.468750 0.736465 +vt 0.468750 0.750000 +vt 0.531250 0.736465 +vt 0.531250 0.750000 +vt 0.593750 0.736465 +vt 0.593750 0.750000 +vt 0.687500 0.736465 +vt 0.687500 0.750000 +vt 0.750000 0.736465 +vt 0.750000 0.750000 +vt 0.812500 0.736465 +vt 0.812500 0.750000 +vt 0.906250 0.736465 +vt 0.906250 0.750000 +vt 0.937500 0.657826 +vt 0.937500 0.644291 +vt 0.031250 0.657826 +vt 0.031250 0.644291 +vt 0.125000 0.630756 +vt 0.125000 0.644291 +vt 0.218750 0.630756 +vt 0.218750 0.644291 +vt 0.281250 0.630756 +vt 0.281250 0.644291 +vt 0.343750 0.630756 +vt 0.343750 0.644291 +vt 0.437500 0.630756 +vt 0.437500 0.644291 +vt 0.500000 0.630756 +vt 0.500000 0.644291 +vt 0.562500 0.630756 +vt 0.562500 0.644291 +vt 0.656250 0.630756 +vt 0.656250 0.644291 +vt 0.718750 0.630756 +vt 0.718750 0.644291 +vt 0.781250 0.630756 +vt 0.781250 0.644291 +vt 0.875000 0.630756 +vt 0.875000 0.644291 +vt 0.001571 0.657788 +vt 0.000000 0.657749 +vt 0.968750 0.630756 +vt 0.001571 0.763501 +vt 0.000000 0.763467 +vt 0.968750 0.736465 +vt 0.001572 0.869214 +vt 0.000000 0.869183 +vt 0.968750 0.842174 +vt 0.937500 0.630756 +vt 0.937500 0.736465 +vt 0.937500 0.842174 +vt 0.062500 0.657826 +vt 0.031250 0.630756 +vt 0.062500 0.763535 +vt 0.031250 0.736465 +vt 0.062500 0.869244 +vt 0.031250 0.842174 +vt 0.093750 0.657826 +vt 0.093750 0.763535 +vt 0.093750 0.869244 +vt 0.125000 0.657826 +vt 0.125000 0.763535 +vt 0.125000 0.869244 +vt 0.156250 0.657826 +vt 0.156250 0.763535 +vt 0.156250 0.869244 +vt 0.187500 0.657826 +vt 0.187500 0.763535 +vt 0.187500 0.869244 +vt 0.218750 0.657826 +vt 0.218750 0.763535 +vt 0.218750 0.869244 +vt 0.250000 0.657826 +vt 0.250000 0.763535 +vt 0.250000 0.869244 +vt 0.281250 0.657826 +vt 0.281250 0.763535 +vt 0.281250 0.869244 +vt 0.312500 0.657826 +vt 0.312500 0.763535 +vt 0.312500 0.869244 +vt 0.343750 0.657826 +vt 0.343750 0.763535 +vt 0.343750 0.869244 +vt 0.375000 0.657826 +vt 0.375000 0.763535 +vt 0.375000 0.869244 +vt 0.406250 0.657826 +vt 0.406250 0.763535 +vt 0.406250 0.869244 +vt 0.437500 0.657826 +vt 0.437500 0.763535 +vt 0.437500 0.869244 +vt 0.468750 0.657826 +vt 0.468750 0.763535 +vt 0.468750 0.869244 +vt 0.500000 0.657826 +vt 0.500000 0.763535 +vt 0.500000 0.869244 +vt 0.531250 0.657826 +vt 0.531250 0.763535 +vt 0.531250 0.869244 +vt 0.562500 0.657826 +vt 0.562500 0.763535 +vt 0.562500 0.869244 +vt 0.593750 0.657826 +vt 0.593750 0.763535 +vt 0.593750 0.869244 +vt 0.625000 0.657826 +vt 0.625000 0.763535 +vt 0.625000 0.869244 +vt 0.656250 0.657826 +vt 0.656250 0.763535 +vt 0.656250 0.869244 +vt 0.687500 0.657826 +vt 0.687500 0.763535 +vt 0.687500 0.869244 +vt 0.718750 0.657826 +vt 0.718750 0.763535 +vt 0.718750 0.869244 +vt 0.750000 0.657826 +vt 0.750000 0.763535 +vt 0.750000 0.869244 +vt 0.781250 0.657826 +vt 0.781250 0.763535 +vt 0.781250 0.869244 +vt 0.812500 0.657826 +vt 0.812500 0.763535 +vt 0.812500 0.869244 +vt 0.843750 0.657826 +vt 0.843750 0.763535 +vt 0.843750 0.869244 +vt 0.875000 0.657826 +vt 0.875000 0.763535 +vt 0.875000 0.869244 +vt 0.906250 0.657826 +vt 0.906250 0.763535 +vt 0.906250 0.869244 +vt 0.031250 0.538582 +vt 0.001572 0.538953 +vt 0.001571 0.736035 +vt 0.000000 0.735604 +vt 0.000000 0.657826 +vt 0.968750 0.538582 +vt 0.001571 0.763965 +vt 0.001572 0.961047 +vt 0.000000 0.960677 +vt 0.906250 0.538582 +vt 0.843750 0.538582 +vt 0.781250 0.538582 +vt 0.718750 0.538582 +vt 0.656250 0.538582 +vt 0.593750 0.538582 +vt 0.531250 0.538582 +vt 0.468750 0.538582 +vt 0.406250 0.538582 +vt 0.343750 0.538582 +vt 0.281250 0.538582 +vt 0.218750 0.538582 +vt 0.156250 0.538582 +vt 0.093750 0.538582 +vt 0.000000 0.842174 +vt 0.000000 0.764396 +vt 0.000000 0.539323 +vt 0.270141 0.423938 +vt 0.284321 0.422542 +vt 0.250000 0.428745 +vt 0.317378 0.412665 +vt 0.315041 0.413223 +vt 0.397602 0.348624 +vt 0.427342 0.285275 +vt 0.431185 0.213960 +vt 0.415193 0.181575 +vt 0.399616 0.150030 +vt 0.383205 0.116795 +vt 0.285193 0.073075 +vt 0.320132 0.080687 +vt 0.250000 0.065407 +vt 0.149611 0.099758 +vt 0.178149 0.076536 +vt 0.122125 0.122125 +vt 0.093492 0.145425 +vt 0.072621 0.250000 +vt 0.072272 0.214648 +vt 0.072969 0.285214 +vt 0.125553 0.374447 +vt 0.097067 0.352187 +vt 0.180626 0.417484 +vt 0.283943 0.420644 +vt 0.190922 0.425529 +vt 0.190402 0.427900 +vt 0.195343 0.428984 +vt 0.207896 0.438793 +vt 0.212674 0.437653 +vt 0.223307 0.435116 +vt 0.226937 0.435912 +vt 0.227322 0.434157 +vt 0.073250 0.313691 +vt 0.071661 0.314476 +vt 0.073290 0.317774 +vt 0.073343 0.323174 +vt 0.086027 0.343559 +vt 0.088226 0.348011 +vt 0.090369 0.346952 +vt 0.073448 0.333729 +vt 0.089655 0.148547 +vt 0.086449 0.146994 +vt 0.083120 0.153865 +vt 0.071763 0.163107 +vt 0.071893 0.176226 +vt 0.071901 0.177022 +vt 0.070141 0.180654 +vt 0.071945 0.181528 +vt 0.225335 0.060033 +vt 0.224749 0.057560 +vt 0.219594 0.058782 +vt 0.211619 0.057044 +vt 0.191898 0.065347 +vt 0.188354 0.066187 +vt 0.188761 0.067900 +vt 0.204111 0.055409 +vt 0.380444 0.111203 +vt 0.382170 0.108995 +vt 0.377584 0.105411 +vt 0.370830 0.091733 +vt 0.357667 0.088865 +vt 0.355930 0.088487 +vt 0.352700 0.085962 +vt 0.351484 0.087518 +vt 0.437615 0.263394 +vt 0.440168 0.263390 +vt 0.440159 0.257974 +vt 0.443903 0.250000 +vt 0.440117 0.232049 +vt 0.440107 0.225987 +vt 0.437126 0.225992 +vt 0.446378 0.244728 +vt 0.353806 0.407296 +vt 0.354653 0.406624 +vt 0.351586 0.404501 +vt 0.379714 0.386727 +vt 0.383099 0.384039 +vt 0.381764 0.382359 +vt 0.381954 0.381954 +vt 0.359793 0.402543 +vt 0.373865 0.399184 +vn 0.0000 0.0000 1.0000 +vn 0.1369 -0.0300 -0.9901 +vn -0.2525 0.0553 -0.9660 +vn 0.0621 -0.1257 -0.9901 +vn -0.1146 0.2318 -0.9660 +vn -0.0611 -0.1262 -0.9901 +vn 0.1127 0.2327 -0.9660 +vn -0.1364 -0.0324 -0.9901 +vn 0.2515 0.0597 -0.9660 +vn -0.1105 0.0863 -0.9901 +vn 0.2037 -0.1591 -0.9660 +vn -0.0003 0.1402 -0.9901 +vn 0.0005 -0.2585 -0.9660 +vn 0.1098 0.0872 -0.9901 +vn -0.2024 -0.1608 -0.9660 +vn 0.0000 0.0000 -1.0000 +vn -0.9769 0.2139 -0.0000 +vn -0.2139 -0.9769 0.0000 +vn 0.2139 0.9769 0.0000 +vn -0.4431 0.8965 0.0000 +vn -0.8965 -0.4431 0.0000 +vn 0.8965 0.4431 0.0000 +vn 0.4358 0.9001 0.0000 +vn -0.9001 0.4358 0.0000 +vn 0.9001 -0.4358 -0.0000 +vn 0.9730 0.2309 0.0000 +vn -0.2309 0.9730 -0.0000 +vn 0.2309 -0.9730 0.0000 +vn 0.7881 -0.6156 -0.0000 +vn 0.6156 0.7881 0.0000 +vn -0.6156 -0.7881 0.0000 +vn 0.0019 -1.0000 -0.0000 +vn 1.0000 0.0019 -0.0000 +vn -1.0000 -0.0019 -0.0000 +vn -0.7830 -0.6220 0.0000 +vn 0.6220 -0.7830 0.0000 +vn -0.6220 0.7830 0.0000 +vn -0.9726 -0.2324 0.0000 +vn -0.4247 -0.9053 0.0000 +vn 0.4430 -0.8965 0.0000 +vn 0.9771 -0.2126 -0.0000 +vn 0.7755 0.6314 0.0000 +vn 0.1373 0.2927 -0.9463 +vn -0.3159 0.0687 -0.9463 +vn -0.1432 0.2898 -0.9463 +vn -0.1906 -0.1552 -0.9693 +vn -0.2507 -0.2041 -0.9463 +vn -0.0102 0.9999 -0.0000 +vn -0.0101 0.9999 -0.0000 +vn -0.7881 0.6155 0.0000 +vn 0.0033 -0.3233 -0.9463 +vn 0.3144 0.0751 -0.9463 +vn 0.2548 -0.1990 -0.9463 +vn 0.2391 0.0571 -0.9693 +vn 0.0002 0.0000 -1.0000 +vn 0.0001 0.0000 -1.0000 +vn -0.0001 0.0000 -1.0000 +vn 0.0635 0.1540 -0.9860 +vn -0.0723 0.1460 -0.9866 +vn -0.0563 -0.1199 -0.9912 +vn -0.1263 -0.1019 -0.9867 +vn -0.1584 0.0353 -0.9867 +vn 0.0094 -0.1664 -0.9860 +vn 0.1282 -0.1001 -0.9867 +vn 0.1580 0.0372 -0.9867 +vn 0.1027 0.0836 -0.9912 +vn 0.6079 -0.1325 -0.7829 +vn 0.4826 0.3926 -0.7829 +vn -0.0061 0.6221 -0.7829 +vn -0.4902 0.3831 -0.7829 +vn -0.6052 -0.1444 -0.7829 +vn -0.2644 -0.5631 -0.7829 +vn 0.2754 -0.5579 -0.7829 +vn 0.9769 -0.2139 0.0000 +vn 0.4431 -0.8965 0.0000 +vn -0.4358 -0.9001 0.0000 +vn -0.9730 -0.2309 0.0000 +vn -0.7881 0.6156 -0.0000 +vn -0.0019 1.0000 0.0000 +vn 0.7830 0.6220 -0.0000 +vn 0.9771 -0.2130 -0.0000 +vn 0.7757 0.6311 0.0000 +vn -0.0098 1.0000 0.0000 +vn -0.7879 0.6158 0.0000 +vn -0.9727 -0.2320 -0.0000 +vn -0.4251 -0.9052 0.0000 +vn 0.4427 -0.8967 0.0000 +vn -0.5989 0.1305 -0.7901 +vn -0.4755 -0.3868 -0.7901 +vn 0.0060 -0.6129 -0.7901 +vn 0.4829 -0.3775 -0.7901 +vn 0.5962 0.1422 -0.7901 +vn 0.2605 0.5548 -0.7901 +vn -0.2713 0.5496 -0.7901 +vn -0.6861 -0.3669 0.6282 +vn -0.8680 -0.4965 0.0000 +vn -0.7545 -0.6563 0.0000 +vn -0.6119 -0.7909 0.0000 +vn -0.4459 -0.8951 0.0000 +vn -0.2627 -0.9649 0.0000 +vn -0.0694 -0.9976 0.0000 +vn 0.1265 -0.9920 0.0000 +vn 0.3176 -0.9482 0.0000 +vn 0.4965 -0.8680 -0.0000 +vn 0.6563 -0.7545 0.0000 +vn 0.7909 -0.6119 0.0000 +vn 0.8951 -0.4459 0.0000 +vn 0.9649 -0.2627 0.0000 +vn 0.9976 -0.0694 0.0000 +vn 0.9920 0.1265 0.0000 +vn 0.9482 0.3176 -0.0000 +vn 0.8680 0.4965 -0.0000 +vn 0.7545 0.6563 0.0000 +vn 0.6119 0.7909 -0.0000 +vn 0.4459 0.8951 0.0000 +vn 0.2627 0.9649 0.0000 +vn 0.0694 0.9976 -0.0000 +vn -0.1265 0.9920 0.0000 +vn -0.3176 0.9482 0.0000 +vn -0.4965 0.8680 0.0000 +vn -0.6563 0.7545 0.0000 +vn -0.7909 0.6119 -0.0000 +vn -0.8951 0.4459 0.0000 +vn -0.6013 -0.4937 0.6282 +vn -0.9482 -0.3176 0.0000 +vn -0.7445 -0.2261 0.6282 +vn -0.9976 0.0694 -0.0000 +vn -0.3134 -0.0310 0.9491 +vn -0.0881 -0.0087 0.9961 +vn -0.7743 0.0760 -0.6282 +vn -0.3134 -0.0310 -0.9491 +vn -0.0881 -0.0087 -0.9961 +vn -0.3014 -0.0915 0.9491 +vn -0.0847 -0.0257 0.9961 +vn -0.3014 -0.0915 -0.9491 +vn -0.0847 -0.0257 -0.9961 +vn -0.2777 -0.1485 0.9491 +vn -0.0781 -0.0418 0.9961 +vn -0.2777 -0.1485 -0.9491 +vn -0.0781 -0.0418 -0.9961 +vn -0.2434 -0.1999 0.9491 +vn -0.0684 -0.0562 0.9961 +vn -0.2434 -0.1999 -0.9491 +vn -0.0684 -0.0562 -0.9961 +vn -0.1997 -0.2435 0.9491 +vn -0.0562 -0.0685 0.9961 +vn -0.1997 -0.2435 -0.9491 +vn -0.0562 -0.0685 -0.9961 +vn -0.1484 -0.2778 0.9491 +vn -0.0417 -0.0781 0.9961 +vn -0.1484 -0.2778 -0.9491 +vn -0.0417 -0.0781 -0.9961 +vn -0.0913 -0.3014 0.9491 +vn -0.0257 -0.0848 0.9961 +vn -0.0913 -0.3014 -0.9491 +vn -0.0257 -0.0848 -0.9961 +vn -0.0308 -0.3134 0.9491 +vn -0.0087 -0.0881 0.9961 +vn -0.0308 -0.3134 -0.9491 +vn -0.0087 -0.0881 -0.9961 +vn 0.0310 -0.3134 0.9491 +vn 0.0087 -0.0881 0.9961 +vn 0.0310 -0.3134 -0.9491 +vn 0.0087 -0.0881 -0.9961 +vn 0.0915 -0.3014 0.9491 +vn 0.0257 -0.0847 0.9961 +vn 0.0915 -0.3014 -0.9491 +vn 0.0257 -0.0847 -0.9961 +vn 0.1485 -0.2777 0.9491 +vn 0.0418 -0.0781 0.9961 +vn 0.1485 -0.2777 -0.9491 +vn 0.0418 -0.0781 -0.9961 +vn 0.1999 -0.2434 0.9491 +vn 0.0562 -0.0684 0.9961 +vn 0.1999 -0.2434 -0.9491 +vn 0.0562 -0.0684 -0.9961 +vn 0.2435 -0.1997 0.9491 +vn 0.0685 -0.0562 0.9961 +vn 0.2435 -0.1997 -0.9491 +vn 0.0685 -0.0562 -0.9961 +vn 0.2778 -0.1484 0.9491 +vn 0.0781 -0.0417 0.9961 +vn 0.2778 -0.1484 -0.9491 +vn 0.0781 -0.0417 -0.9961 +vn 0.3014 -0.0913 0.9491 +vn 0.0848 -0.0257 0.9961 +vn 0.3014 -0.0913 -0.9491 +vn 0.0848 -0.0257 -0.9961 +vn 0.3134 -0.0308 0.9491 +vn 0.0881 -0.0087 0.9961 +vn 0.3134 -0.0308 -0.9491 +vn 0.0881 -0.0087 -0.9961 +vn 0.3134 0.0310 0.9491 +vn 0.0881 0.0087 0.9961 +vn 0.3134 0.0310 -0.9491 +vn 0.0881 0.0087 -0.9961 +vn 0.3014 0.0915 0.9491 +vn 0.0847 0.0257 0.9961 +vn 0.3014 0.0915 -0.9491 +vn 0.0847 0.0257 -0.9961 +vn 0.2777 0.1485 0.9491 +vn 0.0781 0.0418 0.9961 +vn 0.2777 0.1485 -0.9491 +vn 0.0781 0.0418 -0.9961 +vn 0.2434 0.1999 0.9491 +vn 0.0684 0.0562 0.9961 +vn 0.2434 0.1999 -0.9491 +vn 0.0684 0.0562 -0.9961 +vn 0.1997 0.2435 0.9491 +vn 0.0562 0.0685 0.9961 +vn 0.1997 0.2435 -0.9491 +vn 0.0562 0.0685 -0.9961 +vn 0.1484 0.2778 0.9491 +vn 0.0417 0.0781 0.9961 +vn 0.1484 0.2778 -0.9491 +vn 0.0417 0.0781 -0.9961 +vn 0.0913 0.3014 0.9491 +vn 0.0257 0.0848 0.9961 +vn 0.0913 0.3014 -0.9491 +vn 0.0257 0.0848 -0.9961 +vn 0.0308 0.3134 0.9491 +vn 0.0087 0.0881 0.9961 +vn 0.0308 0.3134 -0.9491 +vn 0.0087 0.0881 -0.9961 +vn -0.0310 0.3134 0.9491 +vn -0.0087 0.0881 0.9961 +vn -0.0310 0.3134 -0.9491 +vn -0.0087 0.0881 -0.9961 +vn -0.0915 0.3014 0.9491 +vn -0.0257 0.0847 0.9961 +vn -0.0915 0.3014 -0.9491 +vn -0.0257 0.0847 -0.9961 +vn -0.1485 0.2777 0.9491 +vn -0.0418 0.0781 0.9961 +vn -0.1485 0.2777 -0.9491 +vn -0.0418 0.0781 -0.9961 +vn -0.1999 0.2434 0.9491 +vn -0.0562 0.0684 0.9961 +vn -0.1999 0.2434 -0.9491 +vn -0.0562 0.0684 -0.9961 +vn -0.2435 0.1997 0.9491 +vn -0.0685 0.0562 0.9961 +vn -0.2435 0.1997 -0.9491 +vn -0.0685 0.0562 -0.9961 +vn -0.2778 0.1484 0.9491 +vn -0.0781 0.0417 0.9961 +vn -0.2778 0.1484 -0.9491 +vn -0.0781 0.0417 -0.9961 +vn -0.9649 0.2627 0.0000 +vn -0.3014 0.0913 0.9491 +vn -0.0848 0.0257 0.9961 +vn -0.3014 0.0913 -0.9491 +vn -0.0848 0.0257 -0.9961 +vn -0.7743 -0.0765 0.6282 +vn -0.3134 0.0308 0.9491 +vn -0.0881 0.0087 0.9961 +vn -0.3134 0.0308 -0.9491 +vn -0.0881 0.0087 -0.9961 +vn -0.9920 -0.1265 -0.0000 +vn -0.7743 -0.0765 -0.6282 +vn -0.7446 0.2256 -0.6282 +vn -0.7445 -0.2261 -0.6282 +vn -0.7903 -0.4824 -0.3777 +vn -0.9074 0.0373 -0.4186 +vn -0.6863 0.3666 -0.6282 +vn -0.6306 -0.7611 -0.1519 +vn -0.7446 0.2256 0.6282 +vn -0.6016 0.4934 -0.6282 +vn -0.6863 0.3666 0.6282 +vn -0.4937 0.6013 -0.6282 +vn -0.6016 0.4934 0.6282 +vn -0.3669 0.6860 -0.6282 +vn -0.4937 0.6013 0.6282 +vn -0.2260 0.7444 -0.6283 +vn -0.3669 0.6860 0.6282 +vn -0.0765 0.7742 -0.6282 +vn -0.2260 0.7445 0.6282 +vn 0.0760 0.7743 -0.6283 +vn -0.0765 0.7743 0.6282 +vn 0.2256 0.7446 -0.6282 +vn 0.0760 0.7743 0.6283 +vn 0.3666 0.6863 -0.6282 +vn 0.2256 0.7446 0.6282 +vn 0.4934 0.6015 -0.6282 +vn 0.3666 0.6863 0.6282 +vn 0.6013 0.4937 -0.6282 +vn 0.4934 0.6015 0.6282 +vn 0.6861 0.3669 -0.6282 +vn 0.6013 0.4937 0.6282 +vn 0.7445 0.2261 -0.6282 +vn 0.6861 0.3669 0.6282 +vn 0.7743 0.0765 -0.6282 +vn 0.7445 0.2261 0.6282 +vn 0.7743 -0.0760 -0.6282 +vn 0.7743 0.0765 0.6282 +vn 0.7446 -0.2256 -0.6283 +vn 0.7743 -0.0760 0.6282 +vn 0.6862 -0.3666 -0.6283 +vn 0.7446 -0.2256 0.6282 +vn 0.6016 -0.4934 -0.6282 +vn 0.6862 -0.3666 0.6282 +vn 0.4937 -0.6013 -0.6282 +vn 0.6016 -0.4934 0.6282 +vn 0.3669 -0.6860 -0.6282 +vn 0.4937 -0.6013 0.6282 +vn 0.2260 -0.7445 -0.6282 +vn 0.3669 -0.6861 0.6282 +vn 0.0765 -0.7743 -0.6282 +vn 0.2261 -0.7445 0.6282 +vn -0.0760 -0.7743 -0.6282 +vn 0.0765 -0.7743 0.6282 +vn -0.2256 -0.7446 -0.6283 +vn -0.0760 -0.7743 0.6282 +vn -0.3666 -0.6862 -0.6282 +vn -0.2256 -0.7446 0.6283 +vn -0.4934 -0.6015 -0.6283 +vn -0.3666 -0.6862 0.6282 +vn -0.6013 -0.4937 -0.6282 +vn -0.4934 -0.6015 0.6282 +vn -0.6861 -0.3669 -0.6282 +vn -0.7093 -0.5824 0.3972 +vn -0.7903 -0.4824 0.3777 +vn -0.8973 -0.1405 0.4186 +vn -0.9133 -0.0902 0.3972 +vn -0.9148 -0.1432 0.3776 +vn -0.8526 -0.3128 0.4186 +vn -0.9133 0.0897 -0.3972 +vn -0.8693 -0.3189 0.3777 +vn -0.8241 0.3817 0.4185 +vn -0.9133 0.0897 0.3972 +vn -0.8402 0.3892 0.3776 +vn -0.8402 0.3892 -0.3776 +vn -0.7096 0.5820 0.3971 +vn -0.8241 0.3817 -0.4185 +vn -0.6153 0.6680 0.4186 +vn -0.7096 0.5820 -0.3972 +vn -0.7481 0.5456 0.3777 +vn -0.6273 0.6811 -0.3777 +vn -0.5824 0.7093 0.3972 +vn -0.4824 0.7903 0.3777 +vn -0.4732 0.7752 0.4186 +vn -0.2666 0.8782 0.3972 +vn -0.4732 0.7752 -0.4186 +vn -0.1405 0.8973 0.4186 +vn -0.2666 0.8782 -0.3972 +vn -0.1432 0.9148 0.3777 +vn -0.1432 0.9148 -0.3777 +vn 0.0897 0.9134 0.3972 +vn -0.1405 0.8972 -0.4186 +vn 0.2136 0.8827 0.4186 +vn 0.0897 0.9134 -0.3972 +vn 0.2178 0.9000 0.3777 +vn 0.2178 0.9000 -0.3777 +vn 0.4324 0.8095 0.3972 +vn 0.2136 0.8827 -0.4186 +vn 0.5351 0.7338 0.4186 +vn 0.4324 0.8095 -0.3972 +vn 0.3891 0.8402 0.3777 +vn 0.5456 0.7481 -0.3777 +vn 0.5820 0.7096 0.3972 +vn 0.6811 0.6273 0.3777 +vn 0.6680 0.6153 0.4185 +vn 0.8093 0.4328 0.3972 +vn 0.6680 0.6153 -0.4185 +vn 0.8526 0.3128 0.4186 +vn 0.8093 0.4328 -0.3972 +vn 0.8693 0.3189 0.3777 +vn 0.8693 0.3189 -0.3777 +vn 0.9133 0.0902 0.3972 +vn 0.8526 0.3128 -0.4186 +vn 0.9074 -0.0373 0.4186 +vn 0.9133 0.0902 -0.3972 +vn 0.9252 -0.0380 0.3777 +vn 0.9252 -0.0380 -0.3777 +vn 0.8783 -0.2662 0.3972 +vn 0.9074 -0.0373 -0.4186 +vn 0.8241 -0.3817 0.4186 +vn 0.8783 -0.2662 -0.3972 +vn 0.9000 -0.2178 0.3777 +vn 0.8402 -0.3891 -0.3777 +vn 0.8095 -0.4324 0.3972 +vn 0.7481 -0.5456 0.3777 +vn 0.7338 -0.5351 0.4186 +vn 0.5824 -0.7093 0.3972 +vn 0.7338 -0.5351 -0.4186 +vn 0.4731 -0.7752 0.4186 +vn 0.5824 -0.7093 -0.3972 +vn 0.4824 -0.7903 0.3777 +vn 0.4824 -0.7903 -0.3777 +vn 0.2666 -0.8781 0.3972 +vn 0.4731 -0.7752 -0.4186 +vn 0.1405 -0.8973 0.4186 +vn 0.2666 -0.8781 -0.3972 +vn 0.1432 -0.9148 0.3777 +vn 0.1432 -0.9148 -0.3777 +vn -0.0897 -0.9133 0.3972 +vn 0.1405 -0.8973 -0.4186 +vn -0.2136 -0.8827 0.4186 +vn -0.0897 -0.9133 -0.3972 +vn -0.0380 -0.9252 0.3777 +vn -0.2178 -0.9000 -0.3777 +vn -0.2662 -0.8783 0.3972 +vn -0.3891 -0.8402 0.3777 +vn -0.3817 -0.8241 0.4186 +vn -0.5820 -0.7096 0.3972 +vn -0.3817 -0.8241 -0.4186 +vn -0.6680 -0.6153 0.4186 +vn -0.8093 -0.4328 -0.3972 +vn -0.6811 -0.6273 0.3777 +vn -0.7752 -0.4731 0.4186 +vn -0.8093 -0.4328 0.3972 +vn -0.6680 -0.6153 -0.4186 +vn -0.9000 0.2177 -0.3777 +vn -0.8781 -0.2666 0.3972 +vn -0.8827 0.2136 -0.4186 +vn -0.7752 -0.4731 -0.4186 +vn -0.5456 -0.7481 0.3777 +vn -0.5351 -0.7338 -0.4186 +vn -0.2177 -0.9000 0.3777 +vn -0.2136 -0.8827 -0.4186 +vn -0.0373 -0.9074 -0.4186 +vn 0.3189 -0.8693 0.3777 +vn 0.3128 -0.8526 -0.4186 +vn 0.6273 -0.6811 0.3777 +vn 0.6153 -0.6680 -0.4186 +vn 0.8402 -0.3892 0.3776 +vn 0.8241 -0.3817 -0.4186 +vn 0.8827 -0.2136 -0.4185 +vn 0.9148 0.1432 0.3777 +vn 0.8973 0.1405 -0.4186 +vn 0.7903 0.4824 0.3777 +vn 0.7752 0.4731 -0.4186 +vn 0.5456 0.7481 0.3777 +vn 0.5351 0.7338 -0.4186 +vn 0.3817 0.8241 -0.4186 +vn 0.0380 0.9252 0.3777 +vn 0.0373 0.9074 -0.4186 +vn -0.3189 0.8693 0.3777 +vn -0.3128 0.8526 -0.4186 +vn -0.6273 0.6811 0.3777 +vn -0.6153 0.6680 -0.4186 +vn -0.7338 0.5351 -0.4186 +vn -0.9000 0.2177 0.3777 +vn -0.9252 0.0380 0.3776 +vn -0.8526 -0.3128 -0.4186 +vn -0.8973 -0.1405 -0.4186 +vn -0.8783 0.2662 0.3972 +vn -0.5820 -0.7096 -0.3972 +vn -0.7093 -0.5824 -0.3972 +vn -0.4324 -0.8095 0.3972 +vn -0.4324 -0.8095 -0.3972 +vn -0.2662 -0.8783 -0.3972 +vn 0.0902 -0.9133 0.3972 +vn 0.0902 -0.9133 -0.3972 +vn 0.4328 -0.8093 0.3972 +vn 0.4328 -0.8093 -0.3972 +vn 0.7096 -0.5820 0.3972 +vn 0.7096 -0.5820 -0.3972 +vn 0.8095 -0.4324 -0.3972 +vn 0.9134 -0.0897 0.3972 +vn 0.9134 -0.0897 -0.3972 +vn 0.8782 0.2667 0.3972 +vn 0.8782 0.2667 -0.3972 +vn 0.7093 0.5824 0.3972 +vn 0.7093 0.5824 -0.3972 +vn 0.5820 0.7096 -0.3971 +vn 0.2662 0.8783 0.3972 +vn 0.2662 0.8783 -0.3972 +vn -0.0902 0.9133 0.3972 +vn -0.0902 0.9133 -0.3972 +vn -0.4328 0.8092 0.3972 +vn -0.4328 0.8092 -0.3972 +vn -0.5824 0.7093 -0.3972 +vn -0.8095 0.4324 0.3972 +vn -0.8095 0.4324 -0.3972 +vn -0.8783 0.2662 -0.3972 +vn -0.8781 -0.2666 -0.3972 +vn -0.9133 -0.0902 -0.3972 +vn -0.9252 0.0380 -0.3776 +vn -0.6811 -0.6273 -0.3777 +vn -0.5351 -0.7338 0.4186 +vn -0.5456 -0.7481 -0.3777 +vn -0.3891 -0.8402 -0.3777 +vn -0.0373 -0.9074 0.4186 +vn -0.0380 -0.9252 -0.3777 +vn 0.3128 -0.8526 0.4186 +vn 0.3189 -0.8693 -0.3777 +vn 0.6153 -0.6680 0.4186 +vn 0.6273 -0.6811 -0.3777 +vn 0.7481 -0.5456 -0.3777 +vn 0.8827 -0.2136 0.4185 +vn 0.9000 -0.2178 -0.3776 +vn 0.8973 0.1405 0.4186 +vn 0.9148 0.1432 -0.3777 +vn 0.7752 0.4731 0.4186 +vn 0.7903 0.4824 -0.3777 +vn 0.6811 0.6273 -0.3777 +vn 0.3817 0.8241 0.4186 +vn 0.3891 0.8402 -0.3777 +vn 0.0373 0.9074 0.4186 +vn 0.0380 0.9252 -0.3777 +vn -0.3128 0.8526 0.4186 +vn -0.3189 0.8693 -0.3777 +vn -0.4824 0.7903 -0.3777 +vn -0.7338 0.5351 0.4186 +vn -0.7481 0.5456 -0.3777 +vn -0.8827 0.2136 0.4186 +vn -0.9074 0.0373 0.4186 +vn -0.8693 -0.3189 -0.3777 +vn -0.9148 -0.1432 -0.3776 +vn -0.9096 -0.0003 -0.4155 +vn -0.9096 -0.0003 0.4155 +vn -0.8921 -0.1777 -0.4154 +vn -0.8921 -0.1777 0.4154 +vn -0.8403 -0.3483 -0.4155 +vn -0.8403 -0.3483 0.4154 +vn -0.7562 -0.5056 -0.4154 +vn -0.7562 -0.5056 0.4154 +vn -0.6430 -0.6434 -0.4155 +vn -0.6430 -0.6434 0.4155 +vn -0.5051 -0.7565 -0.4154 +vn -0.5051 -0.7565 0.4155 +vn -0.3478 -0.8405 -0.4155 +vn -0.3478 -0.8405 0.4155 +vn -0.1772 -0.8922 -0.4155 +vn -0.1772 -0.8922 0.4155 +vn 0.0002 -0.9096 -0.4155 +vn 0.0003 -0.9096 0.4154 +vn 0.1777 -0.8921 -0.4155 +vn 0.1777 -0.8921 0.4155 +vn 0.3483 -0.8403 -0.4154 +vn 0.3483 -0.8403 0.4154 +vn 0.5056 -0.7562 -0.4155 +vn 0.5056 -0.7562 0.4155 +vn 0.6434 -0.6430 -0.4154 +vn 0.6434 -0.6430 0.4154 +vn 0.7565 -0.5051 -0.4155 +vn 0.7565 -0.5051 0.4155 +vn 0.8404 -0.3479 -0.4155 +vn 0.8405 -0.3478 0.4155 +vn 0.8922 -0.1772 -0.4154 +vn 0.8922 -0.1772 0.4154 +vn 0.9096 0.0003 -0.4155 +vn 0.9096 0.0002 0.4155 +vn 0.8921 0.1777 -0.4154 +vn 0.8921 0.1777 0.4155 +vn 0.8403 0.3483 -0.4155 +vn 0.8403 0.3483 0.4155 +vn 0.7562 0.5056 -0.4154 +vn 0.7562 0.5056 0.4154 +vn 0.6430 0.6434 -0.4154 +vn 0.6430 0.6434 0.4154 +vn 0.5051 0.7565 -0.4155 +vn 0.5051 0.7565 0.4155 +vn 0.3478 0.8405 -0.4155 +vn 0.3479 0.8405 0.4154 +vn 0.1772 0.8922 -0.4155 +vn 0.1772 0.8922 0.4155 +vn -0.0003 0.9096 -0.4156 +vn -0.0003 0.9096 0.4155 +vn -0.1777 0.8921 -0.4155 +vn -0.1777 0.8921 0.4155 +vn -0.3483 0.8403 -0.4155 +vn -0.3483 0.8402 0.4155 +vn -0.5056 0.7562 -0.4154 +vn -0.5056 0.7562 0.4154 +vn -0.6434 0.6430 -0.4155 +vn -0.6434 0.6430 0.4155 +vn -0.7565 0.5051 -0.4155 +vn -0.7565 0.5051 0.4155 +vn -0.8405 0.3478 -0.4155 +vn -0.8405 0.3478 0.4155 +vn -0.8922 0.1772 -0.4154 +vn -0.8922 0.1772 0.4154 +vn -0.8824 -0.2998 -0.3626 +vn 0.1219 -0.9239 -0.3627 +vn 0.9299 -0.0607 -0.3627 +vn 0.2410 0.9002 -0.3627 +vn -0.7395 0.5671 -0.3627 +vn -0.1292 -0.9160 -0.3797 +vn 0.8732 -0.3055 -0.3797 +vn 0.4700 0.7969 -0.3797 +vn -0.9160 -0.1298 0.3797 +vn -0.2710 -0.8764 -0.3980 +vn 0.8068 -0.4367 -0.3980 +vn 0.5857 0.7061 -0.3980 +vn -0.5782 0.7122 -0.3980 +vn -0.8765 0.2710 -0.3980 +vn -0.7005 -0.6146 -0.3627 +vn -0.5671 -0.7395 -0.3626 +vn -0.2410 -0.9002 -0.3627 +vn 0.4662 -0.8070 -0.3627 +vn 0.6146 -0.7005 -0.3627 +vn 0.8359 -0.4120 -0.3627 +vn 0.8824 0.2998 -0.3627 +vn 0.8070 0.4661 -0.3627 +vn 0.5671 0.7395 -0.3627 +vn -0.1219 0.9239 -0.3627 +vn -0.2998 0.8824 -0.3627 +vn -0.6146 0.7005 -0.3626 +vn -0.7517 -0.5258 0.3980 +vn -0.9002 0.2410 -0.3626 +vn -0.8335 -0.4015 -0.3796 +vn -0.7391 -0.5564 -0.3797 +vn -0.4700 -0.7969 -0.3797 +vn 0.2312 -0.8958 -0.3796 +vn 0.4015 -0.8335 -0.3796 +vn 0.6899 -0.6164 -0.3796 +vn 0.9237 0.0519 -0.3797 +vn 0.8958 0.2312 -0.3797 +vn 0.7392 0.5564 -0.3796 +vn 0.1293 0.9160 -0.3797 +vn -0.0520 0.9237 -0.3797 +vn -0.4015 0.8335 -0.3796 +vn -0.6895 -0.6168 0.3797 +vn -0.7966 -0.4704 0.3797 +vn -0.8793 -0.2617 -0.3980 +vn -0.8113 -0.4282 -0.3980 +vn -0.5857 -0.7060 -0.3980 +vn 0.0851 -0.9134 -0.3981 +vn 0.2616 -0.8793 -0.3980 +vn 0.5782 -0.7122 -0.3980 +vn 0.9125 -0.0947 -0.3980 +vn 0.9134 0.0851 -0.3981 +vn 0.8113 0.4281 -0.3980 +vn 0.2710 0.8765 -0.3980 +vn 0.0948 0.9125 -0.3980 +vn -0.2617 0.8793 -0.3980 +vn -0.7061 0.5857 -0.3980 +vn -0.6700 -0.6477 0.3627 +vn -0.7835 -0.5046 0.3627 +vn -0.9170 -0.1663 0.3627 +vn -0.4281 0.8113 -0.3980 +vn -0.0851 0.9134 -0.3980 +vn 0.4367 0.8068 -0.3980 +vn 0.7122 0.5782 -0.3980 +vn 0.8793 0.2617 -0.3980 +vn 0.8765 -0.2709 -0.3980 +vn 0.7060 -0.5857 -0.3980 +vn 0.4282 -0.8113 -0.3980 +vn -0.0947 -0.9125 -0.3980 +vn -0.4367 -0.8067 -0.3980 +vn -0.7122 -0.5782 -0.3980 +vn -0.8733 0.3055 -0.3796 +vn -0.6899 0.6164 -0.3797 +vn -0.5564 0.7391 -0.3797 +vn -0.2312 0.8958 -0.3796 +vn 0.3055 0.8733 -0.3796 +vn 0.6164 0.6899 -0.3796 +vn 0.8335 0.4015 -0.3796 +vn 0.9161 -0.1293 -0.3797 +vn 0.7969 -0.4699 -0.3796 +vn 0.5564 -0.7391 -0.3797 +vn 0.0519 -0.9237 -0.3796 +vn -0.3055 -0.8732 -0.3796 +vn -0.6164 -0.6899 -0.3797 +vn -0.8958 -0.2311 -0.3796 +vn -0.6347 -0.6624 0.3980 +vn -0.8957 -0.1981 0.3980 +vn -0.4661 0.8070 -0.3627 +vn 0.0607 0.9299 -0.3627 +vn 0.4120 0.8359 -0.3626 +vn 0.7005 0.6146 -0.3627 +vn 0.9239 0.1219 -0.3627 +vn 0.9002 -0.2410 -0.3627 +vn 0.7395 -0.5672 -0.3626 +vn 0.2997 -0.8824 -0.3627 +vn -0.0607 -0.9299 -0.3627 +vn -0.4120 -0.8359 -0.3627 +vn -0.8070 -0.4661 -0.3627 +vn -0.8765 0.2710 0.3980 +vn -0.7835 -0.5046 -0.3627 +vn -0.8733 0.3055 0.3796 +vn -0.7966 -0.4704 -0.3797 +vn -0.9002 0.2410 0.3626 +vn -0.7517 -0.5258 -0.3980 +vn -0.6700 -0.6477 -0.3627 +vn -0.6895 -0.6168 -0.3796 +vn -0.6347 -0.6624 -0.3980 +vn -0.7061 0.5857 0.3980 +vn -0.9170 -0.1663 -0.3627 +vn -0.6899 0.6164 0.3796 +vn -0.9160 -0.1298 -0.3797 +vn -0.7395 0.5671 0.3627 +vn -0.8957 -0.1981 -0.3980 +vn -0.5782 0.7122 0.3980 +vn -0.5564 0.7391 0.3796 +vn -0.6146 0.7005 0.3626 +vn -0.4281 0.8113 0.3980 +vn -0.4015 0.8335 0.3796 +vn -0.4661 0.8070 0.3627 +vn -0.2617 0.8793 0.3980 +vn -0.2312 0.8958 0.3796 +vn -0.2998 0.8824 0.3627 +vn -0.0851 0.9134 0.3980 +vn -0.0519 0.9237 0.3797 +vn -0.1218 0.9239 0.3627 +vn 0.0948 0.9125 0.3980 +vn 0.1293 0.9160 0.3797 +vn 0.0607 0.9299 0.3627 +vn 0.2710 0.8765 0.3980 +vn 0.3055 0.8733 0.3796 +vn 0.2410 0.9002 0.3626 +vn 0.4367 0.8068 0.3980 +vn 0.4700 0.7969 0.3797 +vn 0.4120 0.8359 0.3626 +vn 0.5857 0.7061 0.3980 +vn 0.6164 0.6899 0.3796 +vn 0.5671 0.7395 0.3627 +vn 0.7122 0.5782 0.3980 +vn 0.7392 0.5564 0.3796 +vn 0.7005 0.6146 0.3627 +vn 0.8113 0.4281 0.3980 +vn 0.8335 0.4015 0.3796 +vn 0.8070 0.4661 0.3627 +vn 0.8793 0.2617 0.3980 +vn 0.8958 0.2312 0.3797 +vn 0.8824 0.2998 0.3627 +vn 0.9134 0.0851 0.3980 +vn 0.9237 0.0520 0.3797 +vn 0.9239 0.1219 0.3627 +vn 0.9125 -0.0947 0.3980 +vn 0.9161 -0.1293 0.3796 +vn 0.9299 -0.0607 0.3627 +vn 0.8765 -0.2709 0.3980 +vn 0.8732 -0.3055 0.3797 +vn 0.9002 -0.2410 0.3627 +vn 0.8068 -0.4367 0.3980 +vn 0.7969 -0.4700 0.3796 +vn 0.8359 -0.4120 0.3627 +vn 0.7061 -0.5857 0.3980 +vn 0.6899 -0.6164 0.3796 +vn 0.7395 -0.5672 0.3626 +vn 0.5782 -0.7122 0.3980 +vn 0.5564 -0.7391 0.3796 +vn 0.6146 -0.7005 0.3627 +vn 0.4282 -0.8113 0.3980 +vn 0.4015 -0.8335 0.3797 +vn 0.4662 -0.8070 0.3627 +vn 0.2616 -0.8793 0.3980 +vn 0.2312 -0.8958 0.3796 +vn 0.2997 -0.8824 0.3627 +vn 0.0851 -0.9134 0.3980 +vn 0.0519 -0.9237 0.3796 +vn 0.1219 -0.9239 0.3627 +vn -0.0947 -0.9125 0.3980 +vn -0.1292 -0.9160 0.3797 +vn -0.0607 -0.9299 0.3626 +vn -0.2710 -0.8765 0.3980 +vn -0.3055 -0.8732 0.3796 +vn -0.2410 -0.9002 0.3626 +vn -0.4367 -0.8067 0.3980 +vn -0.4700 -0.7969 0.3797 +vn -0.4120 -0.8359 0.3627 +vn -0.5857 -0.7061 0.3980 +vn -0.6164 -0.6899 0.3797 +vn -0.5672 -0.7395 0.3626 +vn -0.7122 -0.5782 0.3980 +vn -0.7391 -0.5564 0.3797 +vn -0.7005 -0.6146 0.3627 +vn -0.8113 -0.4282 0.3980 +vn -0.8335 -0.4015 0.3796 +vn -0.8070 -0.4661 0.3627 +vn -0.8793 -0.2617 0.3980 +vn -0.8958 -0.2311 0.3797 +vn -0.8824 -0.2998 0.3626 +vn -0.8695 0.4700 -0.1519 +vn -0.9165 -0.3659 0.1617 +vn -0.9344 0.3044 0.1849 +vn -0.8333 -0.5224 -0.1807 +vn -0.8275 -0.5376 0.1616 +vn -0.8571 0.4808 0.1849 +vn -0.8571 0.4808 -0.1849 +vn -0.9192 -0.3498 0.1807 +vn -0.8333 -0.5224 0.1807 +vn -0.9445 0.2913 0.1519 +vn -0.8275 -0.5376 -0.1616 +vn -0.8695 0.4700 0.1519 +vn -0.7067 -0.6888 -0.1617 +vn -0.7154 -0.6750 0.1807 +vn -0.7154 -0.6750 -0.1807 +vn -0.7067 -0.6888 0.1617 +vn -0.7611 0.6306 -0.1519 +vn -0.7468 0.6388 0.1849 +vn -0.7468 0.6388 -0.1849 +vn -0.7611 0.6306 0.1519 +vn -0.5587 -0.8134 -0.1617 +vn -0.5699 -0.8016 0.1807 +vn -0.5699 -0.8016 -0.1807 +vn -0.5587 -0.8134 0.1617 +vn -0.3893 -0.9068 -0.1617 +vn -0.4026 -0.8974 0.1807 +vn -0.4026 -0.8974 -0.1807 +vn -0.3893 -0.9068 0.1617 +vn -0.2049 -0.9653 -0.1617 +vn -0.2199 -0.9587 0.1807 +vn -0.2199 -0.9587 -0.1807 +vn -0.2049 -0.9653 0.1617 +vn -0.0127 -0.9868 -0.1617 +vn -0.0286 -0.9831 0.1807 +vn -0.0286 -0.9831 -0.1807 +vn -0.0126 -0.9868 0.1617 +vn 0.1801 -0.9703 -0.1617 +vn 0.1638 -0.9698 0.1807 +vn 0.1638 -0.9698 -0.1807 +vn 0.1801 -0.9703 0.1617 +vn 0.3659 -0.9165 -0.1617 +vn 0.3498 -0.9192 0.1807 +vn 0.3498 -0.9192 -0.1807 +vn 0.3659 -0.9165 0.1617 +vn 0.5377 -0.8275 -0.1617 +vn 0.5224 -0.8333 0.1807 +vn 0.5224 -0.8333 -0.1807 +vn 0.5377 -0.8275 0.1617 +vn 0.6888 -0.7067 -0.1617 +vn 0.6750 -0.7154 0.1807 +vn 0.6750 -0.7154 -0.1807 +vn 0.6888 -0.7067 0.1617 +vn 0.8134 -0.5588 -0.1617 +vn 0.8016 -0.5700 0.1807 +vn 0.8016 -0.5700 -0.1807 +vn 0.8134 -0.5588 0.1617 +vn 0.9068 -0.3894 -0.1617 +vn 0.8973 -0.4026 0.1807 +vn 0.8973 -0.4026 -0.1807 +vn 0.9068 -0.3893 0.1617 +vn 0.9653 -0.2050 -0.1617 +vn 0.9586 -0.2199 0.1807 +vn 0.9587 -0.2199 -0.1807 +vn 0.9653 -0.2050 0.1617 +vn 0.9868 -0.0127 -0.1617 +vn 0.9831 -0.0286 0.1807 +vn 0.9831 -0.0286 -0.1807 +vn 0.9868 -0.0127 0.1617 +vn 0.9703 0.1801 -0.1617 +vn 0.9698 0.1637 0.1807 +vn 0.9698 0.1637 -0.1807 +vn 0.9703 0.1801 0.1617 +vn 0.9165 0.3659 -0.1617 +vn 0.9192 0.3498 0.1807 +vn 0.9192 0.3498 -0.1807 +vn 0.9165 0.3659 0.1617 +vn 0.8275 0.5377 -0.1617 +vn 0.8333 0.5224 0.1807 +vn 0.8333 0.5224 -0.1807 +vn 0.8275 0.5377 0.1617 +vn 0.7067 0.6888 -0.1617 +vn 0.7154 0.6749 0.1807 +vn 0.7154 0.6749 -0.1807 +vn 0.7067 0.6888 0.1617 +vn 0.5588 0.8134 -0.1617 +vn 0.5700 0.8015 0.1807 +vn 0.5700 0.8015 -0.1807 +vn 0.5588 0.8134 0.1617 +vn 0.3894 0.9068 -0.1617 +vn 0.4026 0.8973 0.1807 +vn 0.4026 0.8973 -0.1807 +vn 0.3893 0.9068 0.1617 +vn 0.2049 0.9653 -0.1617 +vn 0.2198 0.9587 0.1807 +vn 0.2198 0.9587 -0.1807 +vn 0.2049 0.9653 0.1617 +vn 0.0127 0.9868 -0.1617 +vn 0.0286 0.9831 0.1807 +vn 0.0286 0.9831 -0.1807 +vn 0.0127 0.9868 0.1617 +vn -0.1801 0.9703 -0.1617 +vn -0.1637 0.9698 0.1807 +vn -0.1637 0.9698 -0.1807 +vn -0.1801 0.9703 0.1617 +vn -0.3659 0.9165 -0.1617 +vn -0.3498 0.9192 0.1807 +vn -0.3498 0.9192 -0.1807 +vn -0.3659 0.9165 0.1617 +vn -0.5377 0.8275 -0.1617 +vn -0.5224 0.8333 0.1807 +vn -0.5224 0.8333 -0.1807 +vn -0.5377 0.8275 0.1617 +vn -0.6888 0.7067 -0.1617 +vn -0.6749 0.7154 0.1807 +vn -0.6749 0.7154 -0.1807 +vn -0.6888 0.7067 0.1617 +vn -0.8134 0.5588 -0.1617 +vn -0.8015 0.5700 0.1807 +vn -0.8015 0.5700 -0.1807 +vn -0.8134 0.5588 0.1617 +vn -0.9068 0.3893 -0.1617 +vn -0.8974 0.4026 0.1807 +vn -0.8974 0.4026 -0.1807 +vn -0.9068 0.3893 0.1617 +vn -0.9653 0.2049 -0.1617 +vn -0.9587 0.2198 0.1807 +vn -0.9587 0.2198 -0.1807 +vn -0.9653 0.2049 0.1617 +vn -0.7743 0.0760 0.6282 +vn -0.6388 -0.7468 0.1849 +vn -0.6388 -0.7468 -0.1849 +vn -0.6306 -0.7611 0.1519 +vn -0.0157 -0.9318 0.3627 +vn -0.0514 -0.9237 0.3797 +vn 0.0196 -0.9172 0.3980 +vn -0.0514 -0.9237 -0.3797 +vn 0.0196 -0.9172 -0.3980 +vn -0.0157 -0.9318 -0.3627 +vn -0.4700 -0.8695 -0.1519 +vn -0.4809 -0.8571 0.1849 +vn -0.4809 -0.8571 -0.1849 +vn -0.4700 -0.8695 0.1519 +vn 0.1664 -0.9170 0.3627 +vn 0.1298 -0.9160 0.3796 +vn 0.1981 -0.8957 0.3980 +vn 0.1663 -0.9169 -0.3627 +vn 0.1982 -0.8957 -0.3980 +vn 0.1298 -0.9160 -0.3796 +vn -0.2914 -0.9445 -0.1519 +vn -0.3044 -0.9344 0.1849 +vn -0.3044 -0.9344 -0.1849 +vn -0.2913 -0.9445 0.1519 +vn 0.3421 -0.8669 0.3626 +vn 0.3060 -0.8731 0.3797 +vn 0.3691 -0.8398 0.3980 +vn 0.3060 -0.8731 -0.3797 +vn 0.3421 -0.8669 -0.3626 +vn 0.3691 -0.8398 -0.3980 +vn -0.7670 -0.6235 -0.1519 +vn -0.7722 -0.6078 0.1849 +vn -0.7722 -0.6078 -0.1849 +vn -0.7670 -0.6235 0.1519 +vn -0.1972 -0.9108 0.3627 +vn -0.2307 -0.8959 0.3796 +vn -0.1597 -0.9034 0.3980 +vn -0.1597 -0.9034 -0.3980 +vn -0.2307 -0.8959 -0.3796 +vn -0.1972 -0.9108 -0.3627 +vn -0.8739 -0.4618 -0.1519 +vn -0.8760 -0.4455 0.1849 +vn -0.8760 -0.4455 -0.1849 +vn -0.8739 -0.4618 0.1519 +vn -0.3711 -0.8548 0.3627 +vn -0.4010 -0.8337 0.3796 +vn -0.3329 -0.8549 0.3980 +vn -0.3711 -0.8548 -0.3627 +vn -0.3329 -0.8548 -0.3980 +vn -0.4010 -0.8337 -0.3796 +vn -0.9472 -0.2825 -0.1519 +vn -0.9461 -0.2660 0.1849 +vn -0.9461 -0.2660 -0.1849 +vn -0.9472 -0.2825 0.1519 +vn -0.5308 -0.7660 0.3626 +vn -0.5559 -0.7395 0.3797 +vn -0.4932 -0.7735 0.3980 +vn -0.5559 -0.7395 -0.3797 +vn -0.4932 -0.7735 -0.3980 +vn -0.5308 -0.7660 -0.3626 +vn -0.9841 -0.0923 -0.1519 +vn -0.9798 -0.0764 0.1849 +vn -0.9798 -0.0764 -0.1849 +vn -0.9841 -0.0923 0.1519 +vn -0.9134 -0.0851 -0.3980 +vn -0.9237 -0.0520 -0.3796 +vn -0.9239 -0.1219 -0.3627 +vn -0.9134 -0.0851 0.3980 +vn -0.9239 -0.1219 0.3627 +vn -0.9237 -0.0520 0.3796 +vn -0.9832 0.1015 0.1519 +vn -0.9759 0.1162 -0.1849 +vn -0.9832 0.1015 -0.1519 +vn -0.9759 0.1162 0.1849 +vn -0.9125 0.0947 -0.3980 +vn -0.9161 0.1292 -0.3797 +vn -0.9299 0.0607 -0.3627 +vn -0.9299 0.0607 0.3627 +vn -0.9161 0.1292 0.3797 +vn -0.9125 0.0947 0.3980 +vn -0.9165 -0.3659 -0.1617 +vn -0.9344 0.3044 -0.1849 +vn -0.9192 -0.3498 -0.1807 +vn -0.9445 0.2913 -0.1519 +vn -0.8669 -0.3421 0.3626 +vn -0.8731 -0.3060 0.3797 +vn -0.8399 -0.3691 0.3980 +vn -0.8731 -0.3060 -0.3796 +vn -0.8669 -0.3421 -0.3626 +vn -0.8399 -0.3691 -0.3980 +vn -0.9703 -0.1801 -0.1617 +vn -0.9698 -0.1638 0.1807 +vn -0.9698 -0.1638 -0.1807 +vn -0.9703 -0.1800 0.1617 +vn -0.8068 0.4367 -0.3980 +vn -0.7969 0.4699 -0.3796 +vn -0.8359 0.4119 -0.3627 +vn -0.8068 0.4367 0.3980 +vn -0.8359 0.4119 0.3627 +vn -0.7969 0.4699 0.3796 +vn -0.9868 0.0127 -0.1617 +vn -0.9831 0.0286 0.1807 +vn -0.9831 0.0286 -0.1807 +vn -0.9868 0.0127 0.1617 +vn -0.9318 0.0157 0.3626 +vn -0.9237 0.0514 0.3796 +vn -0.9172 -0.0196 0.3980 +vn -0.9237 0.0514 -0.3796 +vn -0.9172 -0.0196 -0.3980 +vn -0.9318 0.0158 -0.3626 +vn -0.6235 0.7670 -0.1519 +vn -0.6079 0.7722 0.1849 +vn -0.6079 0.7722 -0.1849 +vn -0.6235 0.7670 0.1519 +vn -0.9108 0.1972 0.3626 +vn -0.8959 0.2307 0.3796 +vn -0.9034 0.1597 0.3980 +vn -0.8959 0.2307 -0.3796 +vn -0.9108 0.1972 -0.3626 +vn -0.9034 0.1597 -0.3980 +vn -0.4618 0.8739 -0.1519 +vn -0.4455 0.8760 0.1849 +vn -0.4455 0.8760 -0.1849 +vn -0.4618 0.8739 0.1519 +vn -0.8548 0.3711 0.3626 +vn -0.8337 0.4010 0.3796 +vn -0.8549 0.3328 0.3980 +vn -0.8548 0.3711 -0.3626 +vn -0.8549 0.3328 -0.3980 +vn -0.8337 0.4010 -0.3796 +vn -0.2825 0.9472 -0.1519 +vn -0.2661 0.9461 0.1849 +vn -0.2661 0.9461 -0.1849 +vn -0.2825 0.9472 0.1519 +vn -0.7660 0.5307 0.3627 +vn -0.7394 0.5559 0.3797 +vn -0.7735 0.4932 0.3980 +vn -0.7394 0.5560 -0.3797 +vn -0.7735 0.4932 -0.3980 +vn -0.7660 0.5307 -0.3627 +vn -0.0923 0.9841 -0.1519 +vn -0.0764 0.9798 0.1849 +vn -0.0764 0.9798 -0.1849 +vn -0.0923 0.9841 0.1519 +vn -0.6477 0.6700 0.3627 +vn -0.6168 0.6895 0.3797 +vn -0.6624 0.6347 0.3980 +vn -0.6624 0.6347 -0.3980 +vn -0.6168 0.6895 -0.3797 +vn -0.6477 0.6700 -0.3627 +vn 0.1015 0.9832 -0.1519 +vn 0.1163 0.9758 0.1849 +vn 0.1163 0.9758 -0.1849 +vn 0.1015 0.9832 0.1519 +vn -0.5046 0.7835 0.3627 +vn -0.4704 0.7966 0.3797 +vn -0.5258 0.7517 0.3980 +vn -0.5046 0.7835 -0.3627 +vn -0.5258 0.7517 -0.3980 +vn -0.4704 0.7966 -0.3797 +vn 0.2914 0.9445 -0.1519 +vn 0.3044 0.9344 0.1849 +vn 0.3044 0.9344 -0.1849 +vn 0.2914 0.9445 0.1519 +vn -0.3420 0.8669 0.3627 +vn -0.3060 0.8731 0.3797 +vn -0.3691 0.8399 0.3980 +vn -0.3060 0.8731 -0.3797 +vn -0.3691 0.8398 -0.3980 +vn -0.3420 0.8669 -0.3627 +vn 0.4700 0.8695 -0.1519 +vn 0.4808 0.8571 0.1849 +vn 0.4808 0.8571 -0.1849 +vn 0.4700 0.8695 0.1519 +vn -0.1664 0.9170 0.3626 +vn -0.1298 0.9160 0.3797 +vn -0.1982 0.8957 0.3980 +vn -0.1664 0.9170 -0.3626 +vn -0.1982 0.8957 -0.3980 +vn -0.1298 0.9160 -0.3797 +vn 0.6306 0.7611 -0.1519 +vn 0.6388 0.7468 0.1849 +vn 0.6388 0.7468 -0.1849 +vn 0.6306 0.7611 0.1519 +vn 0.0157 0.9318 0.3627 +vn 0.0514 0.9237 0.3796 +vn -0.0196 0.9172 0.3980 +vn 0.0514 0.9237 -0.3796 +vn 0.0157 0.9318 -0.3627 +vn -0.0196 0.9172 -0.3980 +vn 0.7670 0.6235 -0.1519 +vn 0.7722 0.6078 0.1849 +vn 0.7722 0.6078 -0.1849 +vn 0.7670 0.6235 0.1519 +vn 0.1972 0.9108 0.3627 +vn 0.2306 0.8959 0.3796 +vn 0.1597 0.9034 0.3980 +vn 0.1972 0.9108 -0.3627 +vn 0.1597 0.9034 -0.3980 +vn 0.2306 0.8959 -0.3796 +vn 0.8739 0.4618 -0.1519 +vn 0.8760 0.4455 0.1849 +vn 0.8760 0.4455 -0.1850 +vn 0.8739 0.4618 0.1519 +vn 0.3711 0.8548 0.3627 +vn 0.4010 0.8337 0.3796 +vn 0.3329 0.8549 0.3980 +vn 0.4010 0.8337 -0.3796 +vn 0.3329 0.8549 -0.3980 +vn 0.3711 0.8548 -0.3627 +vn 0.9472 0.2825 -0.1519 +vn 0.9461 0.2661 0.1849 +vn 0.9461 0.2660 -0.1849 +vn 0.9472 0.2825 0.1519 +vn 0.5308 0.7660 0.3627 +vn 0.5560 0.7395 0.3796 +vn 0.4933 0.7735 0.3980 +vn 0.4933 0.7735 -0.3980 +vn 0.5559 0.7395 -0.3796 +vn 0.5307 0.7660 -0.3627 +vn 0.9841 0.0923 -0.1519 +vn 0.9798 0.0764 0.1849 +vn 0.9798 0.0764 -0.1849 +vn 0.9841 0.0923 0.1519 +vn 0.6700 0.6478 0.3626 +vn 0.6895 0.6168 0.3796 +vn 0.6347 0.6624 0.3980 +vn 0.6700 0.6477 -0.3627 +vn 0.6347 0.6624 -0.3980 +vn 0.6895 0.6168 -0.3796 +vn 0.9832 -0.1015 -0.1519 +vn 0.9759 -0.1163 0.1849 +vn 0.9759 -0.1162 -0.1849 +vn 0.9832 -0.1015 0.1519 +vn 0.7835 0.5046 0.3627 +vn 0.7966 0.4704 0.3796 +vn 0.7517 0.5259 0.3980 +vn 0.7966 0.4704 -0.3796 +vn 0.7517 0.5258 -0.3980 +vn 0.7835 0.5046 -0.3627 +vn 0.9445 -0.2914 -0.1519 +vn 0.9344 -0.3044 0.1849 +vn 0.9344 -0.3044 -0.1849 +vn 0.9445 -0.2913 0.1519 +vn 0.8669 0.3420 0.3627 +vn 0.8731 0.3060 0.3797 +vn 0.8398 0.3691 0.3980 +vn 0.8669 0.3421 -0.3627 +vn 0.8398 0.3691 -0.3980 +vn 0.8731 0.3060 -0.3797 +vn 0.8695 -0.4700 -0.1519 +vn 0.8571 -0.4808 0.1849 +vn 0.8571 -0.4808 -0.1849 +vn 0.8695 -0.4700 0.1519 +vn 0.9170 0.1663 0.3626 +vn 0.9160 0.1298 0.3797 +vn 0.8957 0.1982 0.3980 +vn 0.9160 0.1298 -0.3797 +vn 0.9170 0.1664 -0.3626 +vn 0.8957 0.1981 -0.3980 +vn 0.7611 -0.6306 -0.1519 +vn 0.7468 -0.6388 0.1849 +vn 0.7468 -0.6388 -0.1849 +vn 0.7611 -0.6306 0.1519 +vn 0.9318 -0.0157 0.3626 +vn 0.9237 -0.0514 0.3796 +vn 0.9172 0.0196 0.3980 +vn 0.9318 -0.0157 -0.3626 +vn 0.9172 0.0196 -0.3980 +vn 0.9237 -0.0514 -0.3796 +vn 0.6235 -0.7670 -0.1519 +vn 0.6078 -0.7722 0.1849 +vn 0.6078 -0.7722 -0.1849 +vn 0.6235 -0.7670 0.1519 +vn 0.9108 -0.1972 0.3627 +vn 0.8959 -0.2307 0.3796 +vn 0.9034 -0.1597 0.3980 +vn 0.8959 -0.2307 -0.3796 +vn 0.9034 -0.1597 -0.3980 +vn 0.9108 -0.1972 -0.3627 +vn 0.4618 -0.8739 -0.1519 +vn 0.4455 -0.8760 0.1849 +vn 0.4455 -0.8760 -0.1849 +vn 0.4618 -0.8739 0.1519 +vn 0.8548 -0.3711 0.3626 +vn 0.8337 -0.4010 0.3796 +vn 0.8549 -0.3329 0.3980 +vn 0.8549 -0.3329 -0.3980 +vn 0.8337 -0.4010 -0.3796 +vn 0.8548 -0.3711 -0.3627 +vn 0.2825 -0.9472 -0.1519 +vn 0.2660 -0.9461 0.1849 +vn 0.2660 -0.9461 -0.1849 +vn 0.2825 -0.9472 0.1519 +vn 0.7660 -0.5307 0.3627 +vn 0.7394 -0.5560 0.3796 +vn 0.7735 -0.4932 0.3980 +vn 0.7660 -0.5308 -0.3627 +vn 0.7735 -0.4932 -0.3980 +vn 0.7394 -0.5560 -0.3796 +vn 0.0923 -0.9841 -0.1519 +vn 0.0764 -0.9798 0.1849 +vn 0.0764 -0.9798 -0.1849 +vn 0.0923 -0.9841 0.1519 +vn 0.6478 -0.6700 0.3627 +vn 0.6168 -0.6895 0.3796 +vn 0.6624 -0.6347 0.3980 +vn 0.6168 -0.6895 -0.3796 +vn 0.6624 -0.6347 -0.3980 +vn 0.6477 -0.6700 -0.3626 +vn -0.1015 -0.9832 -0.1519 +vn -0.1162 -0.9759 0.1849 +vn -0.1162 -0.9759 -0.1849 +vn -0.1015 -0.9832 0.1519 +vn 0.5046 -0.7835 0.3627 +vn 0.4704 -0.7966 0.3797 +vn 0.5258 -0.7517 0.3980 +vn 0.5046 -0.7835 -0.3627 +vn 0.5258 -0.7517 -0.3980 +vn 0.4704 -0.7966 -0.3797 +vn 0.1197 0.0118 -0.9927 +vn 0.1151 0.0350 -0.9927 +vn 0.0567 0.1061 -0.9927 +vn 0.0349 0.1151 -0.9927 +vn -0.0350 0.1151 -0.9927 +vn -0.0567 0.1061 -0.9927 +vn -0.0764 0.0930 -0.9927 +vn -0.1151 0.0349 -0.9927 +vn -0.1197 0.0118 -0.9927 +vn -0.1061 -0.0567 -0.9927 +vn -0.0930 -0.0764 -0.9927 +vn -0.0763 -0.0930 -0.9927 +vn -0.0118 -0.1197 -0.9927 +vn 0.0118 -0.1197 -0.9927 +vn 0.0764 -0.0930 -0.9927 +vn 0.0930 -0.0763 -0.9927 +vn 0.1061 -0.0567 -0.9927 +vn 0.1151 -0.0349 -0.9927 +vn 0.1197 -0.0118 -0.9927 +vn 0.0350 -0.1151 -0.9927 +vn 0.0567 -0.1061 -0.9927 +vn -0.0567 -0.1061 -0.9927 +vn -0.0349 -0.1152 -0.9927 +vn -0.1197 -0.0118 -0.9927 +vn -0.1151 -0.0350 -0.9927 +vn -0.0930 0.0763 -0.9927 +vn -0.1061 0.0567 -0.9927 +vn 0.0118 0.1197 -0.9927 +vn -0.0118 0.1197 -0.9927 +vn 0.1061 0.0567 -0.9927 +vn 0.0930 0.0764 -0.9927 +vn 0.0763 0.0930 -0.9927 +usemtl besi_roda +s off +f 1027/595/294 1032/596/294 1037/597/294 1042/598/294 1047/599/294 1052/600/294 1058/601/294 1065/602/294 1072/603/294 1079/604/294 1086/605/294 1093/606/294 1100/607/294 1107/608/294 1114/609/294 1121/610/294 1128/611/294 1135/612/294 1142/613/294 1149/614/294 1156/615/294 1163/616/294 1170/617/294 1177/618/294 1184/619/294 1191/620/294 1198/621/294 1205/622/294 1212/623/294 1219/624/294 1226/625/294 1233/626/294 +f 2346/627/295 2347/628/295 2345/629/295 2344/630/295 +f 2342/631/296 2343/632/296 2347/628/296 2346/627/296 +f 2354/633/297 2355/634/297 2353/635/297 2352/636/297 +f 2350/637/298 2351/638/298 2355/634/298 2354/633/298 +f 2362/639/299 2363/640/299 2361/641/299 2360/642/299 +f 2358/643/300 2359/644/300 2363/640/300 2362/639/300 +f 2370/645/301 2371/646/301 2369/647/301 2368/648/301 +f 2366/649/302 2367/650/302 2371/646/302 2370/645/302 +f 2378/651/303 2379/652/303 2377/653/303 2376/654/303 +f 2374/655/304 2375/656/304 2379/652/304 2378/651/304 +f 2386/657/305 2387/658/305 2385/659/305 2384/660/305 +f 2382/661/306 2383/662/306 2387/658/306 2386/657/306 +f 2394/663/307 2395/664/307 2393/665/307 2392/666/307 +f 2390/667/308 2391/668/308 2395/664/308 2394/663/308 +f 2425/669/309 2340/670/309 2426/671/309 +f 2340/670/309 2425/669/309 2428/672/309 +f 2341/673/309 2416/674/309 2437/675/309 +f 2341/673/309 2437/675/309 2418/676/309 +f 2467/677/310 2441/678/310 2348/679/310 2343/680/310 2342/681/310 2349/682/310 2447/683/310 2470/684/310 +f 2349/685/311 2342/686/311 2346/687/311 2473/688/311 2472/689/311 2449/690/311 +f 2476/691/312 2347/692/312 2343/693/312 2348/694/312 2443/695/312 2475/696/312 +f 2496/697/313 2481/698/313 2356/699/313 2351/700/313 2350/701/313 2357/702/313 2486/703/313 2500/704/313 +f 2357/705/314 2350/706/314 2354/707/314 2508/708/314 2502/709/314 2483/710/314 +f 2510/711/315 2355/712/315 2351/713/315 2356/714/315 2482/715/315 2509/716/315 +f 2532/717/316 2514/718/316 2364/719/316 2359/720/316 2358/721/316 2365/722/316 2520/723/316 2533/724/316 2534/725/316 +f 2365/726/317 2358/727/317 2362/728/317 2536/729/317 2535/730/317 2518/731/317 +f 2540/732/318 2363/733/318 2359/734/318 2364/735/318 2515/736/318 2539/737/318 +f 2556/738/319 2541/739/319 2372/740/319 2367/741/319 2366/742/319 2373/743/319 2546/744/319 2557/745/319 +f 2373/746/320 2366/747/320 2370/748/320 2463/749/320 2558/750/320 2547/751/320 +f 2462/752/321 2371/753/321 2367/754/321 2372/755/321 2544/756/321 2559/757/321 +f 2484/758/322 2466/759/322 2380/760/322 2375/761/322 2374/762/322 2381/763/322 2471/764/322 2485/765/322 +f 2381/766/323 2374/767/323 2378/768/323 2490/769/323 2489/770/323 2474/771/323 +f 2495/772/324 2379/773/324 2375/774/324 2380/775/324 2469/776/324 2492/777/324 +f 2511/778/325 2497/779/325 2388/780/325 2383/781/325 2382/782/325 2389/783/325 2504/784/325 2516/785/325 +f 2389/786/326 2382/787/326 2386/788/326 2519/789/326 2517/790/326 2501/791/326 +f 2522/792/327 2387/793/327 2383/794/327 2388/795/327 2499/796/327 2521/797/327 +f 2543/798/328 2529/799/328 2396/800/328 2397/801/328 2391/802/328 2390/803/328 2398/804/328 2530/805/328 2548/806/328 2549/807/328 +f 2398/808/329 2390/809/329 2394/810/329 2553/811/329 2551/812/329 2526/813/329 +f 2555/814/330 2395/815/330 2391/816/330 2397/817/330 2523/818/330 2554/819/330 +f 2399/820/331 2470/821/331 2447/822/331 2442/823/331 2440/824/331 +f 2420/825/331 2422/826/331 2445/827/331 2444/828/331 2449/829/331 2472/830/331 2554/831/331 2523/832/331 2446/833/331 +f 2543/834/331 2400/835/331 2531/836/331 2529/837/331 +f 2498/838/332 2497/839/332 2511/840/332 2401/841/332 2503/842/332 +f 2548/843/332 2530/844/332 2531/836/332 2400/835/332 +f 2525/845/332 2526/846/332 2551/847/332 2521/848/332 2499/849/332 2450/850/332 2428/851/332 2425/852/332 2426/853/332 2448/854/332 +f 2492/855/333 2469/856/333 2456/857/333 2455/858/333 2453/859/333 2452/860/333 2501/861/333 2517/862/333 +f 2402/863/333 2468/864/333 2466/865/333 2484/866/333 +f 2503/842/333 2401/841/333 2516/867/333 2504/868/333 +f 2559/869/334 2544/870/334 2459/871/334 2406/872/334 2458/873/334 2474/874/334 2489/875/334 +f 2403/876/334 2545/877/334 2542/878/334 2541/879/334 2556/880/334 +f 2471/881/334 2465/882/334 2468/864/334 2402/863/334 2485/883/334 +f 2403/876/335 2557/884/335 2546/885/335 2545/877/335 +f 2410/886/335 2409/887/335 2407/888/335 2408/889/335 2547/890/335 2558/891/335 2539/892/335 2515/893/335 +f 2532/894/335 2404/895/335 2512/896/335 2514/897/335 +f 2538/898/336 2423/899/336 2424/900/336 2427/901/336 2505/902/336 2522/903/336 2521/904/336 2551/905/336 2553/906/336 +f 2400/907/336 2549/908/336 2548/909/336 +f 2461/910/337 2462/911/337 2559/912/337 2489/913/337 2490/914/337 2479/915/337 2432/916/337 2431/917/337 2550/918/337 +f 2485/919/309 2402/920/309 2484/921/309 +f 2507/922/338 2506/923/338 2429/924/338 2430/925/338 2477/926/338 2478/927/338 2495/928/338 2492/929/338 2517/930/338 2519/931/338 +f 2516/932/309 2401/933/309 2511/934/309 +f 2534/935/339 2404/936/339 2532/937/339 +f 2552/938/340 2433/939/340 2434/940/340 2524/941/340 2527/942/340 2540/943/340 2539/944/340 2558/945/340 2463/946/340 2464/947/340 +f 2403/948/309 2556/949/309 2557/950/309 +f 2520/951/341 2513/952/341 2512/896/341 2404/895/341 2533/953/341 +f 2413/954/342 2412/955/342 2411/956/342 2518/957/342 2535/958/342 2509/959/342 2482/960/342 +f 2496/961/342 2405/962/342 2487/963/342 2480/964/342 2481/965/342 +f 2487/963/343 2405/962/343 2500/966/343 2486/967/343 +f 2440/968/343 2441/969/343 2467/970/343 2399/971/343 +f 2443/972/343 2417/973/343 2418/974/343 2437/975/343 2416/976/343 2414/977/343 2415/978/343 2483/979/343 2502/980/343 2475/981/343 +f 2533/982/344 2404/936/344 2534/935/344 +f 2536/983/344 2528/984/344 2435/985/344 2436/986/344 2488/987/344 2491/988/344 2510/989/344 2509/990/344 2535/991/344 +f 2399/992/309 2467/993/309 2470/994/309 +f 2473/995/345 2460/996/345 2451/997/345 2421/998/345 2419/999/345 2537/1000/345 2555/1001/345 2554/1002/345 2472/1003/345 +f 2405/1004/309 2496/1005/309 2500/1006/309 +f 2508/1007/346 2494/1008/346 2493/1009/346 2439/1010/346 2438/1011/346 2454/1012/346 2457/1013/346 2476/1014/346 2475/1015/346 2502/1016/346 +f 2549/908/347 2400/907/347 2543/1017/347 +f 2588/1018/309 2419/1019/309 2421/1020/309 2586/1021/309 +f 2595/1022/309 2424/1023/309 2423/1024/309 2593/1025/309 +f 2424/1023/309 2595/1022/309 2596/1026/309 2427/1027/309 +f 2430/1028/309 2429/1029/309 2597/1030/309 2589/1031/309 +f 2578/1032/309 2431/1033/309 2432/1034/309 2592/1035/309 +f 2599/1036/309 2434/1037/309 2433/1038/309 2582/1039/309 +f 2436/1040/309 2435/1041/309 2570/1042/309 2600/1043/309 +f 2438/1044/309 2439/1045/309 2602/1046/309 2601/1047/309 +f 2586/1021/309 2421/1020/309 2451/1048/309 2603/1049/309 +f 2604/1050/309 2454/1051/309 2438/1044/309 2601/1047/309 +f 2606/1052/309 2457/1053/309 2454/1051/309 2604/1050/309 +f 2603/1049/348 2451/1048/348 2460/1054/348 2610/1055/348 +f 2618/1056/309 2488/1057/309 2436/1040/309 2600/1043/309 +f 2622/1058/309 2491/1059/309 2488/1057/309 2618/1056/309 +f 2623/1060/309 2493/1061/309 2494/1062/309 2624/1063/309 +f 2602/1046/309 2439/1045/309 2493/1061/309 2623/1060/309 +f 2569/1064/349 2524/1065/349 2434/1037/349 2599/1036/349 +f 2568/1066/349 2527/1067/349 2524/1065/349 2569/1064/349 +f 2435/1041/309 2528/1068/309 2571/1069/309 2570/1042/309 +f 2577/1070/309 2550/1071/309 2431/1033/309 2578/1032/309 +f 2579/1072/309 2461/1073/309 2550/1071/309 2577/1070/309 +f 2581/1074/350 2552/1075/350 2464/1076/350 2580/1077/350 +f 2582/1039/350 2433/1038/350 2552/1075/350 2581/1074/350 +f 2477/1078/309 2430/1028/309 2589/1031/309 2590/1079/309 +f 2478/1080/350 2477/1078/350 2590/1079/350 2591/1081/350 +f 2592/1035/349 2432/1034/349 2479/1082/349 2594/1083/349 +f 2427/1027/309 2596/1026/309 2609/1084/309 2505/1085/309 +f 2506/1086/350 2507/1087/350 2611/1088/350 2612/1089/350 +f 2597/1030/349 2429/1029/349 2506/1086/349 2612/1089/349 +f 2419/1019/309 2588/1018/309 2625/1090/309 2537/1091/309 +f 2593/1025/309 2423/1024/309 2538/1092/309 2626/1093/309 +f 2625/1094/331 2588/1095/331 2586/1096/331 2603/1097/331 2610/1098/331 2617/1099/331 2629/1100/331 +f 2609/1101/332 2596/1102/332 2595/1103/332 2593/1104/332 2626/1105/332 2634/1106/332 2614/1107/332 +f 2591/1108/333 2590/1109/333 2589/1110/333 2597/1111/333 2612/1112/333 2611/1113/333 2621/1114/333 2598/1115/333 +f 2579/1116/334 2577/1117/334 2578/1118/334 2592/1119/334 2594/1120/334 2607/1121/334 2583/1122/334 +f 2568/1123/335 2569/1124/335 2599/1125/335 2582/1126/335 2581/1127/335 2580/1128/335 2585/1129/335 2572/1130/335 +f 2633/1131/351 2563/1132/351 2564/1133/351 2619/1134/351 2614/1135/351 2634/1136/351 +f 2620/1137/352 2566/1138/352 2605/1139/352 2598/1140/352 2621/1141/352 +f 2567/1142/353 2574/1143/353 2576/1144/353 +f 2587/1145/354 2561/1146/354 2573/1147/354 2572/1148/354 2585/1149/354 +f 2608/1150/355 2562/1151/355 2584/1152/355 2583/1153/355 2607/1154/355 +f 2622/1155/342 2618/1156/342 2600/1157/342 2570/1158/342 2571/1159/342 2575/1160/342 2627/1161/342 +f 2604/1162/343 2601/1163/343 2602/1164/343 2623/1165/343 2624/1166/343 2630/1167/343 2613/1168/343 2606/1169/343 +f 2627/1170/356 2575/1171/356 2574/1143/356 2567/1142/356 2628/1172/356 +f 2635/1173/357 2560/1174/357 2615/1175/357 2613/1176/357 2630/1177/357 +f 2616/1178/358 2565/1179/358 2631/1180/358 2629/1181/358 2617/1182/358 +f 2563/1132/359 2633/1131/359 2632/1183/359 +f 2637/1184/309 2636/1185/309 2642/1186/309 2641/1187/309 2640/1188/309 2639/1189/309 2638/1190/309 +f 2651/1191/309 2650/1192/309 2643/1193/309 2644/1194/309 +f 2650/1192/309 2652/1195/309 2645/1196/309 2643/1193/309 +f 2652/1195/309 2653/1197/309 2646/1198/309 2645/1196/309 +f 2653/1197/309 2654/1199/309 2647/1200/309 2646/1198/309 +f 2654/1199/309 2655/1201/309 2648/1202/309 2647/1200/309 +f 2655/1201/309 2656/1203/309 2649/1204/309 2648/1202/309 +f 2656/1203/309 2651/1191/309 2644/1194/309 2649/1204/309 +f 2636/1185/360 2637/1184/360 2650/1192/360 2651/1191/360 +f 2637/1184/361 2638/1190/361 2652/1195/361 2650/1192/361 +f 2638/1190/362 2639/1189/362 2653/1197/362 2652/1195/362 +f 2639/1189/363 2640/1188/363 2654/1199/363 2653/1197/363 +f 2640/1188/364 2641/1187/364 2655/1201/364 2654/1199/364 +f 2641/1187/365 2642/1186/365 2656/1203/365 2655/1201/365 +f 2642/1186/366 2636/1185/366 2651/1191/366 2656/1203/366 +f 2658/1205/367 2344/630/367 2345/629/367 2661/1206/367 +f 2663/1207/368 2352/636/368 2353/635/368 2665/1208/368 +f 2667/1209/369 2360/642/369 2361/641/369 2669/1210/369 +f 2671/1211/370 2368/648/370 2369/647/370 2672/1212/370 +f 2676/1213/371 2376/654/371 2377/653/371 2678/1214/371 +f 2660/1215/372 2384/660/372 2385/659/372 2659/1216/372 +f 2668/1217/373 2392/666/373 2393/665/373 2666/1218/373 +f 2615/1219/312 2675/1220/312 2661/1221/312 2345/1222/312 2347/692/312 2476/691/312 2457/1223/312 2606/1224/312 2613/1225/312 +f 2610/1226/311 2460/1227/311 2473/688/311 2346/687/311 2344/1228/311 2658/1229/311 2677/1230/311 2616/1231/311 2617/1232/311 +f 2628/1233/315 2684/1234/315 2665/1235/315 2353/1236/315 2355/712/315 2510/711/315 2491/1237/315 2622/1238/315 2627/1239/315 +f 2624/1240/314 2494/1241/314 2508/708/314 2354/707/314 2352/1242/314 2663/1243/314 2687/1244/314 2635/1245/314 2630/1246/314 +f 2669/1247/318 2361/1248/318 2363/733/318 2540/732/318 2527/1249/318 2568/1250/318 2572/1251/318 2573/1252/318 2688/1253/318 +f 2571/1254/317 2528/1255/317 2536/729/317 2362/728/317 2360/1256/317 2667/1257/317 2693/1258/317 2576/1259/317 2574/1260/317 2575/1261/317 +f 2672/1262/321 2369/1263/321 2371/753/321 2462/752/321 2461/1264/321 2579/1265/321 2583/1266/321 2584/1267/321 2694/1268/321 +f 2580/1269/320 2464/1270/320 2463/749/320 2370/748/320 2368/1271/320 2671/1272/320 2692/1273/320 2587/1274/320 2585/1275/320 +f 2678/1276/324 2377/1277/324 2379/773/324 2495/772/324 2478/1278/324 2591/1279/324 2598/1280/324 2605/1281/324 2691/1282/324 +f 2594/1283/323 2479/1284/323 2490/769/323 2378/768/323 2376/1285/323 2676/1286/323 2686/1287/323 2608/1288/323 2607/1289/323 +f 2619/1290/327 2657/1291/327 2659/1292/327 2385/1293/327 2387/793/327 2522/792/327 2505/1294/327 2609/1295/327 2614/1296/327 +f 2611/1297/326 2507/1298/326 2519/789/326 2386/788/326 2384/1299/326 2660/1300/326 2662/1301/326 2620/1302/326 2621/1303/326 +f 2631/1304/330 2664/1305/330 2666/1306/330 2393/1307/330 2395/815/330 2555/814/330 2537/1308/330 2625/1309/330 2629/1310/330 +f 2626/1311/329 2538/1312/329 2553/811/329 2394/810/329 2392/1313/329 2668/1314/329 2670/1315/329 2632/1316/329 2633/1317/329 2634/1318/329 +f 2675/1319/374 2615/1320/374 2560/1321/374 2674/1322/374 2673/1323/374 +f 2679/1324/374 2565/1325/374 2616/1326/374 2677/1327/374 +f 2664/1328/375 2631/1329/375 2565/1325/375 2679/1324/375 2680/1330/375 +f 2681/1331/375 2563/1332/375 2632/1333/375 2670/1334/375 +f 2566/1335/376 2620/1336/376 2662/1337/376 2683/1338/376 2682/1339/376 +f 2657/1340/376 2619/1341/376 2564/1342/376 2563/1332/376 2681/1331/376 2685/1343/376 +f 2562/1344/377 2608/1345/377 2686/1346/377 2689/1347/377 2690/1348/377 +f 2691/1349/377 2605/1350/377 2566/1335/377 2682/1339/377 +f 2695/1351/378 2561/1352/378 2587/1353/378 2692/1354/378 2696/1355/378 +f 2694/1356/378 2584/1357/378 2562/1344/378 2690/1348/378 +f 2688/1358/379 2573/1359/379 2561/1352/379 2695/1351/379 +f 2697/1360/379 2567/1361/379 2576/1362/379 2693/1363/379 +f 2684/1364/380 2628/1365/380 2567/1361/380 2697/1360/380 2698/1366/380 +f 2674/1367/380 2560/1368/380 2635/1369/380 2687/1370/380 +f 2680/1371/381 2679/1372/381 2677/1373/381 2658/1374/381 2661/1375/381 2675/1376/381 2673/1377/381 2644/1194/381 2643/1193/381 +f 2670/1378/382 2668/1379/382 2666/1380/382 2664/1381/382 2680/1371/382 2643/1193/382 2645/1196/382 2685/1382/382 2681/1383/382 +f 2662/1384/383 2660/1385/383 2659/1386/383 2657/1387/383 2685/1382/383 2645/1196/383 2646/1198/383 2683/1388/383 +f 2682/1389/384 2683/1388/384 2646/1198/384 2647/1200/384 2689/1390/384 2686/1391/384 2676/1392/384 2678/1393/384 2691/1394/384 +f 2690/1395/385 2689/1390/385 2647/1200/385 2648/1202/385 2696/1396/385 2692/1397/385 2671/1398/385 2672/1399/385 2694/1400/385 +f 2695/1401/386 2696/1396/386 2648/1202/386 2649/1204/386 2698/1402/386 2697/1403/386 2693/1404/386 2667/1405/386 2669/1406/386 2688/1407/386 +f 2687/1408/387 2663/1409/387 2665/1410/387 2684/1411/387 2698/1402/387 2649/1204/387 2644/1194/387 2673/1377/387 2674/1412/387 +usemtl Material.004 +f 1542/1413/388 1541/1414/388 1546/1415/388 1548/1416/388 1044/1417/388 1039/1418/388 +f 1957/1419/389 1954/1420/389 1965/1421/389 1970/1422/389 +f 1971/1423/390 1964/1424/390 1977/1425/390 1982/1426/390 +f 1983/1427/391 1976/1428/391 1989/1429/391 1994/1430/391 +f 1995/1431/392 1988/1432/392 2001/1433/392 2006/1434/392 +f 2007/1435/393 2000/1436/393 2013/1437/393 2018/1438/393 +f 2019/1439/394 2012/1440/394 2025/1441/394 2030/1442/394 +f 2031/1443/395 2024/1444/395 2037/1445/395 2042/1446/395 +f 2043/1447/396 2036/1448/396 2049/1449/396 2054/1450/396 +f 2055/1451/397 2048/1452/397 2061/1453/397 2066/1454/397 +f 2067/1455/398 2060/1456/398 2073/1457/398 2078/1458/398 +f 2079/1459/399 2072/1460/399 2085/1461/399 2090/1462/399 +f 2091/1463/400 2084/1464/400 2097/1465/400 2102/1466/400 +f 2103/1467/401 2096/1468/401 2109/1469/401 2114/1470/401 +f 2115/1471/402 2108/1472/402 2121/1473/402 2126/1474/402 +f 2127/1475/403 2120/1476/403 2133/1477/403 2138/1478/403 +f 2139/1479/404 2132/1480/404 2145/1481/404 2150/1482/404 +f 2151/1483/405 2144/1484/405 2157/1485/405 2162/1486/405 +f 2163/1487/406 2156/1488/406 2169/1489/406 2174/1490/406 +f 2175/1491/407 2168/1492/407 2181/1493/407 2186/1494/407 +f 2187/1495/408 2180/1496/408 2193/1497/408 2198/1498/408 +f 2199/1499/409 2192/1500/409 2205/1501/409 2210/1502/409 +f 2211/1503/410 2204/1504/410 2217/1505/410 2222/1506/410 +f 2223/1507/411 2216/1508/411 2229/1509/411 2234/1510/411 +f 2235/1511/412 2228/1512/412 2241/1513/412 2246/1514/412 +f 2247/1515/413 2240/1516/413 2253/1517/413 2258/1518/413 +f 2259/1519/414 2252/1520/414 2265/1521/414 2270/1522/414 +f 2271/1523/415 2264/1524/415 2277/1525/415 2282/1526/415 +f 2283/1527/416 2276/1528/416 2289/1529/416 2294/1530/416 +f 1548/1531/417 1547/1532/417 1552/1533/417 1554/1534/417 1049/1535/417 1044/1536/417 +f 1933/1537/418 1930/1538/418 1955/1539/418 1956/1540/418 +f 1536/1541/419 1535/1542/419 1540/1543/419 1542/1544/419 1039/1545/419 1034/1546/419 +f 1715/1547/420 1938/1548/420 1913/1549/420 1528/1550/420 +f 1029/1551/421 1034/1552/421 1033/1553/421 1028/1554/421 +f 1028/1555/422 1033/1556/422 1032/596/422 1027/595/422 +f 1533/1557/423 1532/1558/423 1717/1559/423 1719/1560/423 1239/1561/423 1031/1562/423 +f 1036/1563/424 1031/1564/424 1030/1565/424 1035/1566/424 +f 1035/1567/425 1030/1568/425 2307/1569/425 2308/1570/425 +f 1535/1542/418 1934/1571/418 1959/1572/418 1540/1543/418 +f 1034/1546/426 1039/1545/426 1038/1573/426 1033/1574/426 +f 1033/1556/427 1038/1575/427 1037/597/427 1032/596/427 +f 1925/1576/418 1537/1577/418 1544/1578/418 1948/1579/418 +f 1041/1580/428 1036/1581/428 1035/1582/428 1040/1583/428 +f 1040/1584/429 1035/1567/429 2308/1570/429 2309/1585/429 +f 1541/1414/389 1958/1586/389 1969/1587/389 1546/1415/389 +f 1039/1418/430 1044/1417/430 1043/1588/430 1038/1589/430 +f 1038/1575/431 1043/1590/431 1042/598/431 1037/597/431 +f 1949/1591/389 1543/1592/389 1550/1593/389 1962/1594/389 +f 1046/1595/432 1041/1596/432 1040/1597/432 1045/1598/432 +f 1045/1599/433 1040/1584/433 2309/1585/433 2310/1600/433 +f 1547/1532/390 1968/1601/390 1981/1602/390 1552/1533/390 +f 1044/1536/434 1049/1535/434 1048/1603/434 1043/1604/434 +f 1043/1590/435 1048/1605/435 1047/599/435 1042/598/435 +f 1963/1606/390 1549/1607/390 1556/1608/390 1974/1609/390 +f 1051/1610/436 1046/1611/436 1045/1612/436 1050/1613/436 +f 1050/1614/437 1045/1599/437 2310/1600/437 2311/1615/437 +f 1553/1616/391 1980/1617/391 1993/1618/391 1558/1619/391 +f 1049/1620/438 1054/1621/438 1053/1622/438 1048/1623/438 +f 1048/1605/439 1053/1624/439 1052/600/439 1047/599/439 +f 1975/1625/391 1555/1626/391 1562/1627/391 1986/1628/391 +f 1057/1629/440 1051/1630/440 1050/1631/440 1056/1632/440 +f 1056/1633/441 1050/1614/441 2311/1615/441 2312/1634/441 +f 1559/1635/392 1992/1636/392 2005/1637/392 1564/1638/392 +f 1054/1639/442 1061/1640/442 1060/1641/442 1053/1642/442 +f 1053/1624/443 1060/1643/443 1058/601/443 1052/600/443 +f 1987/1644/392 1561/1645/392 1568/1646/392 1998/1647/392 +f 1064/1648/444 1057/1649/444 1056/1650/444 1063/1651/444 +f 1063/1652/445 1056/1633/445 2312/1634/445 2313/1653/445 +f 1565/1654/393 2004/1655/393 2017/1656/393 1570/1657/393 +f 1061/1658/446 1068/1659/446 1067/1660/446 1060/1661/446 +f 1060/1643/447 1067/1662/447 1065/602/447 1058/601/447 +f 1999/1663/393 1567/1664/393 1574/1665/393 2010/1666/393 +f 1071/1667/448 1064/1668/448 1063/1669/448 1070/1670/448 +f 1070/1671/449 1063/1652/449 2313/1653/449 2314/1672/449 +f 1571/1673/394 2016/1674/394 2029/1675/394 1576/1676/394 +f 1068/1677/450 1075/1678/450 1074/1679/450 1067/1680/450 +f 1067/1662/451 1074/1681/451 1072/603/451 1065/602/451 +f 2011/1682/394 1573/1683/394 1580/1684/394 2022/1685/394 +f 1078/1686/452 1071/1687/452 1070/1688/452 1077/1689/452 +f 1077/1690/453 1070/1671/453 2314/1672/453 2315/1691/453 +f 1577/1692/395 2028/1693/395 2041/1694/395 1582/1695/395 +f 1075/1696/454 1082/1697/454 1081/1698/454 1074/1699/454 +f 1074/1681/455 1081/1700/455 1079/604/455 1072/603/455 +f 2023/1701/395 1579/1702/395 1586/1703/395 2034/1704/395 +f 1085/1705/456 1078/1706/456 1077/1707/456 1084/1708/456 +f 1084/1709/457 1077/1690/457 2315/1691/457 2316/1710/457 +f 1583/1711/396 2040/1712/396 2053/1713/396 1588/1714/396 +f 1082/1715/458 1089/1716/458 1088/1717/458 1081/1718/458 +f 1081/1700/459 1088/1719/459 1086/605/459 1079/604/459 +f 2035/1720/396 1585/1721/396 1592/1722/396 2046/1723/396 +f 1092/1724/460 1085/1725/460 1084/1726/460 1091/1727/460 +f 1091/1728/461 1084/1709/461 2316/1710/461 2317/1729/461 +f 1589/1730/397 2052/1731/397 2065/1732/397 1594/1733/397 +f 1089/1734/462 1096/1735/462 1095/1736/462 1088/1737/462 +f 1088/1719/463 1095/1738/463 1093/606/463 1086/605/463 +f 2047/1739/397 1591/1740/397 1598/1741/397 2058/1742/397 +f 1099/1743/464 1092/1744/464 1091/1745/464 1098/1746/464 +f 1098/1747/465 1091/1728/465 2317/1729/465 2318/1748/465 +f 1595/1749/398 2064/1750/398 2077/1751/398 1600/1752/398 +f 1096/1753/466 1103/1754/466 1102/1755/466 1095/1756/466 +f 1095/1738/467 1102/1757/467 1100/607/467 1093/606/467 +f 2059/1758/398 1597/1759/398 1604/1760/398 2070/1761/398 +f 1106/1762/468 1099/1763/468 1098/1764/468 1105/1765/468 +f 1105/1766/469 1098/1747/469 2318/1748/469 2319/1767/469 +f 1601/1768/399 2076/1769/399 2089/1770/399 1606/1771/399 +f 1103/1772/470 1110/1773/470 1109/1774/470 1102/1775/470 +f 1102/1757/471 1109/1776/471 1107/608/471 1100/607/471 +f 2071/1777/399 1603/1778/399 1610/1779/399 2082/1780/399 +f 1113/1781/472 1106/1782/472 1105/1783/472 1112/1784/472 +f 1112/1785/473 1105/1766/473 2319/1767/473 2320/1786/473 +f 1607/1787/400 2088/1788/400 2101/1789/400 1612/1790/400 +f 1110/1791/474 1117/1792/474 1116/1793/474 1109/1794/474 +f 1109/1776/475 1116/1795/475 1114/609/475 1107/608/475 +f 2083/1796/400 1609/1797/400 1616/1798/400 2094/1799/400 +f 1120/1800/476 1113/1801/476 1112/1802/476 1119/1803/476 +f 1119/1804/477 1112/1785/477 2320/1786/477 2321/1805/477 +f 1613/1806/401 2100/1807/401 2113/1808/401 1618/1809/401 +f 1117/1810/478 1124/1811/478 1123/1812/478 1116/1813/478 +f 1116/1795/479 1123/1814/479 1121/610/479 1114/609/479 +f 2095/1815/401 1615/1816/401 1622/1817/401 2106/1818/401 +f 1127/1819/480 1120/1820/480 1119/1821/480 1126/1822/480 +f 1126/1823/481 1119/1804/481 2321/1805/481 2322/1824/481 +f 1619/1825/402 2112/1826/402 2125/1827/402 1624/1828/402 +f 1124/1829/482 1131/1830/482 1130/1831/482 1123/1832/482 +f 1123/1814/483 1130/1833/483 1128/611/483 1121/610/483 +f 2107/1834/402 1621/1835/402 1628/1836/402 2118/1837/402 +f 1134/1838/484 1127/1839/484 1126/1840/484 1133/1841/484 +f 1133/1842/485 1126/1823/485 2322/1824/485 2323/1843/485 +f 1625/1844/403 2124/1845/403 2137/1846/403 1630/1847/403 +f 1131/1848/486 1138/1849/486 1137/1850/486 1130/1851/486 +f 1130/1833/487 1137/1852/487 1135/612/487 1128/611/487 +f 2119/1853/403 1627/1854/403 1634/1855/403 2130/1856/403 +f 1141/1857/488 1134/1858/488 1133/1859/488 1140/1860/488 +f 1140/1861/489 1133/1842/489 2323/1843/489 2324/1862/489 +f 1631/1863/404 2136/1864/404 2149/1865/404 1636/1866/404 +f 1138/1867/490 1145/1868/490 1144/1869/490 1137/1870/490 +f 1137/1852/491 1144/1871/491 1142/613/491 1135/612/491 +f 2131/1872/404 1633/1873/404 1640/1874/404 2142/1875/404 +f 1148/1876/492 1141/1877/492 1140/1878/492 1147/1879/492 +f 1147/1880/493 1140/1861/493 2324/1862/493 2325/1881/493 +f 1637/1882/405 2148/1883/405 2161/1884/405 1642/1885/405 +f 1145/1886/494 1152/1887/494 1151/1888/494 1144/1889/494 +f 1144/1871/495 1151/1890/495 1149/614/495 1142/613/495 +f 2143/1891/405 1639/1892/405 1646/1893/405 2154/1894/405 +f 1155/1895/496 1148/1896/496 1147/1897/496 1154/1898/496 +f 1154/1899/497 1147/1880/497 2325/1881/497 2326/1900/497 +f 1643/1901/406 2160/1902/406 2173/1903/406 1648/1904/406 +f 1152/1905/498 1159/1906/498 1158/1907/498 1151/1908/498 +f 1151/1890/499 1158/1909/499 1156/615/499 1149/614/499 +f 2155/1910/406 1645/1911/406 1652/1912/406 2166/1913/406 +f 1162/1914/500 1155/1915/500 1154/1916/500 1161/1917/500 +f 1161/1918/501 1154/1899/501 2326/1900/501 2327/1919/501 +f 1649/1920/407 2172/1921/407 2185/1922/407 1654/1923/407 +f 1159/1924/502 1166/1925/502 1165/1926/502 1158/1927/502 +f 1158/1909/503 1165/1928/503 1163/616/503 1156/615/503 +f 2167/1929/407 1651/1930/407 1658/1931/407 2178/1932/407 +f 1169/1933/504 1162/1934/504 1161/1935/504 1168/1936/504 +f 1168/1937/505 1161/1918/505 2327/1919/505 2328/1938/505 +f 1655/1939/408 2184/1940/408 2197/1941/408 1660/1942/408 +f 1166/1943/506 1173/1944/506 1172/1945/506 1165/1946/506 +f 1165/1928/507 1172/1947/507 1170/617/507 1163/616/507 +f 2179/1948/408 1657/1949/408 1664/1950/408 2190/1951/408 +f 1176/1952/508 1169/1953/508 1168/1954/508 1175/1955/508 +f 1175/1956/509 1168/1937/509 2328/1938/509 2329/1957/509 +f 1661/1958/409 2196/1959/409 2209/1960/409 1666/1961/409 +f 1173/1962/510 1180/1963/510 1179/1964/510 1172/1965/510 +f 1172/1947/511 1179/1966/511 1177/618/511 1170/617/511 +f 2191/1967/409 1663/1968/409 1670/1969/409 2202/1970/409 +f 1183/1971/512 1176/1972/512 1175/1973/512 1182/1974/512 +f 1182/1975/513 1175/1956/513 2329/1957/513 2330/1976/513 +f 1667/1977/410 2208/1978/410 2221/1979/410 1672/1980/410 +f 1180/1981/514 1187/1982/514 1186/1983/514 1179/1984/514 +f 1179/1966/515 1186/1985/515 1184/619/515 1177/618/515 +f 2203/1986/410 1669/1987/410 1676/1988/410 2214/1989/410 +f 1190/1990/516 1183/1991/516 1182/1992/516 1189/1993/516 +f 1189/1994/517 1182/1975/517 2330/1976/517 2331/1995/517 +f 1673/1996/411 2220/1997/411 2233/1998/411 1678/1999/411 +f 1187/2000/518 1194/2001/518 1193/2002/518 1186/2003/518 +f 1186/1985/519 1193/2004/519 1191/620/519 1184/619/519 +f 2215/2005/411 1675/2006/411 1682/2007/411 2226/2008/411 +f 1197/2009/520 1190/2010/520 1189/2011/520 1196/2012/520 +f 1196/2013/521 1189/1994/521 2331/1995/521 2332/2014/521 +f 1679/2015/412 2232/2016/412 2245/2017/412 1684/2018/412 +f 1194/2019/522 1201/2020/522 1200/2021/522 1193/2022/522 +f 1193/2004/523 1200/2023/523 1198/621/523 1191/620/523 +f 2227/2024/412 1681/2025/412 1688/2026/412 2238/2027/412 +f 1204/2028/524 1197/2029/524 1196/2030/524 1203/2031/524 +f 1203/2032/525 1196/2013/525 2332/2014/525 2333/2033/525 +f 1685/2034/413 2244/2035/413 2257/2036/413 1690/2037/413 +f 1201/2038/526 1208/2039/526 1207/2040/526 1200/2041/526 +f 1200/2023/527 1207/2042/527 1205/622/527 1198/621/527 +f 2239/2043/413 1687/2044/413 1694/2045/413 2250/2046/413 +f 1211/2047/528 1204/2048/528 1203/2049/528 1210/2050/528 +f 1210/2051/529 1203/2032/529 2333/2033/529 2334/2052/529 +f 1691/2053/414 2256/2054/414 2269/2055/414 1696/2056/414 +f 1208/2057/530 1215/2058/530 1214/2059/530 1207/2060/530 +f 1207/2042/531 1214/2061/531 1212/623/531 1205/622/531 +f 2251/2062/414 1693/2063/414 1700/2064/414 2262/2065/414 +f 1218/2066/532 1211/2067/532 1210/2068/532 1217/2069/532 +f 1217/2070/533 1210/2051/533 2334/2052/533 2335/2071/533 +f 1697/2072/415 2268/2073/415 2281/2074/415 1702/2075/415 +f 1215/2076/534 1222/2077/534 1221/2078/534 1214/2079/534 +f 1214/2061/535 1221/2080/535 1219/624/535 1212/623/535 +f 2263/2081/415 1699/2082/415 1706/2083/415 2274/2084/415 +f 1225/2085/536 1218/2086/536 1217/2087/536 1224/2088/536 +f 1224/2089/537 1217/2070/537 2335/2071/537 2336/2090/537 +f 1703/2091/416 2280/2092/416 2293/2093/416 1708/2094/416 +f 1222/2095/538 1229/2096/538 1228/2097/538 1221/2098/538 +f 1221/2080/539 1228/2099/539 1226/625/539 1219/624/539 +f 2275/2100/416 1705/2101/416 1712/2102/416 2286/2103/416 +f 1232/2104/540 1225/2105/540 1224/2106/540 1231/2107/540 +f 1231/2108/541 1224/2089/541 2336/2090/541 2337/2109/541 +f 1709/2110/542 2292/2111/542 1939/2112/542 1714/2113/542 +f 1229/2114/543 1236/2115/543 1235/2116/543 1228/2117/543 +f 1228/2099/544 1235/2118/544 1233/626/544 1226/625/544 +f 2287/2119/542 1711/2120/542 1718/2121/542 1944/2122/542 +f 1239/2123/545 1232/2124/545 1231/2125/545 1238/2126/545 +f 1238/2127/546 1231/2108/546 2337/2109/546 2338/2128/546 +f 1530/2129/547 1529/2130/547 1534/2131/547 1536/2132/547 1034/1552/547 1029/1551/547 +f 1236/2133/548 1029/2134/548 1028/2135/548 1235/2136/548 +f 1235/2118/549 1028/1555/549 1027/595/549 1233/626/549 +f 1945/2137/420 1717/1559/420 1532/1558/420 1922/2138/420 +f 1031/1562/550 1239/1561/550 1238/2139/550 1030/2140/550 +f 1030/1568/551 1238/2127/551 2338/2128/551 2307/1569/551 +f 1919/2141/552 1920/2142/552 1927/2143/552 1928/2144/552 +f 1923/2145/552 1531/2146/552 1538/2147/552 1924/2148/552 +f 1539/2149/553 1538/2147/553 1531/2146/553 1533/2150/553 1031/1564/553 1036/1563/553 +f 1719/2151/554 1718/2121/554 1711/2120/554 1713/2152/554 1232/2124/554 1239/2123/554 +f 1545/2153/555 1544/1578/555 1537/1577/555 1539/2154/555 1036/1581/555 1041/1580/555 +f 2295/2155/542 2288/2156/542 1943/2157/542 1936/2158/542 +f 2291/2159/542 2284/2160/542 1947/2161/542 1940/2162/542 +f 1953/2163/389 1950/2164/389 1961/2165/389 1966/2166/389 +f 1778/2167/556 1720/2168/556 1969/1587/556 1958/1586/556 +f 1902/2169/557 1910/2170/557 1921/2171/557 1946/2172/557 +f 1713/2173/558 1712/2102/558 1705/2101/558 1707/2174/558 1225/2105/558 1232/2104/558 +f 2004/1655/559 1565/1654/559 1527/2175/559 1525/2176/559 +f 1710/2177/560 1709/2110/560 1714/2113/560 1716/2178/560 1236/2115/560 1229/2114/560 +f 1707/2179/561 1706/2083/561 1699/2082/561 1701/2180/561 1218/2086/561 1225/2085/561 +f 2279/2181/416 2272/2182/416 2285/2183/416 2290/2184/416 +f 1704/2185/562 1703/2091/562 1708/2094/562 1710/2186/562 1229/2096/562 1222/2095/562 +f 1701/2187/563 1700/2064/563 1693/2063/563 1695/2188/563 1211/2067/563 1218/2066/563 +f 2267/2189/415 2260/2190/415 2273/2191/415 2278/2192/415 +f 1698/2193/564 1697/2072/564 1702/2075/564 1704/2194/564 1222/2077/564 1215/2076/564 +f 1695/2195/565 1694/2045/565 1687/2044/565 1689/2196/565 1204/2048/565 1211/2047/565 +f 2255/2197/414 2248/2198/414 2261/2199/414 2266/2200/414 +f 1692/2201/566 1691/2053/566 1696/2056/566 1698/2202/566 1215/2058/566 1208/2057/566 +f 1689/2203/567 1688/2026/567 1681/2025/567 1683/2204/567 1197/2029/567 1204/2028/567 +f 2243/2205/413 2236/2206/413 2249/2207/413 2254/2208/413 +f 1686/2209/568 1685/2034/568 1690/2037/568 1692/2210/568 1208/2039/568 1201/2038/568 +f 1683/2211/569 1682/2007/569 1675/2006/569 1677/2212/569 1190/2010/569 1197/2009/569 +f 2231/2213/412 2224/2214/412 2237/2215/412 2242/2216/412 +f 1680/2217/570 1679/2015/570 1684/2018/570 1686/2218/570 1201/2020/570 1194/2019/570 +f 1677/2219/571 1676/1988/571 1669/1987/571 1671/2220/571 1183/1991/571 1190/1990/571 +f 2219/2221/411 2212/2222/411 2225/2223/411 2230/2224/411 +f 1674/2225/572 1673/1996/572 1678/1999/572 1680/2226/572 1194/2001/572 1187/2000/572 +f 1671/2227/573 1670/1969/573 1663/1968/573 1665/2228/573 1176/1972/573 1183/1971/573 +f 2207/2229/410 2200/2230/410 2213/2231/410 2218/2232/410 +f 1668/2233/574 1667/1977/574 1672/1980/574 1674/2234/574 1187/1982/574 1180/1981/574 +f 1665/2235/575 1664/1950/575 1657/1949/575 1659/2236/575 1169/1953/575 1176/1952/575 +f 2195/2237/409 2188/2238/409 2201/2239/409 2206/2240/409 +f 1662/2241/576 1661/1958/576 1666/1961/576 1668/2242/576 1180/1963/576 1173/1962/576 +f 1659/2243/577 1658/1931/577 1651/1930/577 1653/2244/577 1162/1934/577 1169/1933/577 +f 2183/2245/408 2176/2246/408 2189/2247/408 2194/2248/408 +f 1656/2249/578 1655/1939/578 1660/1942/578 1662/2250/578 1173/1944/578 1166/1943/578 +f 1653/2251/579 1652/1912/579 1645/1911/579 1647/2252/579 1155/1915/579 1162/1914/579 +f 2171/2253/407 2164/2254/407 2177/2255/407 2182/2256/407 +f 1650/2257/580 1649/1920/580 1654/1923/580 1656/2258/580 1166/1925/580 1159/1924/580 +f 1647/2259/581 1646/1893/581 1639/1892/581 1641/2260/581 1148/1896/581 1155/1895/581 +f 2159/2261/406 2152/2262/406 2165/2263/406 2170/2264/406 +f 1644/2265/582 1643/1901/582 1648/1904/582 1650/2266/582 1159/1906/582 1152/1905/582 +f 1641/2267/583 1640/1874/583 1633/1873/583 1635/2268/583 1141/1877/583 1148/1876/583 +f 2147/2269/405 2140/2270/405 2153/2271/405 2158/2272/405 +f 1638/2273/584 1637/1882/584 1642/1885/584 1644/2274/584 1152/1887/584 1145/1886/584 +f 1635/2275/585 1634/1855/585 1627/1854/585 1629/2276/585 1134/1858/585 1141/1857/585 +f 2135/2277/404 2128/2278/404 2141/2279/404 2146/2280/404 +f 1632/2281/586 1631/1863/586 1636/1866/586 1638/2282/586 1145/1868/586 1138/1867/586 +f 1629/2283/587 1628/1836/587 1621/1835/587 1623/2284/587 1127/1839/587 1134/1838/587 +f 2123/2285/403 2116/2286/403 2129/2287/403 2134/2288/403 +f 1626/2289/588 1625/1844/588 1630/1847/588 1632/2290/588 1138/1849/588 1131/1848/588 +f 1623/2291/589 1622/1817/589 1615/1816/589 1617/2292/589 1120/1820/589 1127/1819/589 +f 2111/2293/402 2104/2294/402 2117/2295/402 2122/2296/402 +f 1620/2297/590 1619/1825/590 1624/1828/590 1626/2298/590 1131/1830/590 1124/1829/590 +f 1617/2299/591 1616/1798/591 1609/1797/591 1611/2300/591 1113/1801/591 1120/1800/591 +f 2099/2301/401 2092/2302/401 2105/2303/401 2110/2304/401 +f 1614/2305/592 1613/1806/592 1618/1809/592 1620/2306/592 1124/1811/592 1117/1810/592 +f 1611/2307/593 1610/1779/593 1603/1778/593 1605/2308/593 1106/1782/593 1113/1781/593 +f 2087/2309/400 2080/2310/400 2093/2311/400 2098/2312/400 +f 1608/2313/594 1607/1787/594 1612/1790/594 1614/2314/594 1117/1792/594 1110/1791/594 +f 1605/2315/595 1604/1760/595 1597/1759/595 1599/2316/595 1099/1763/595 1106/1762/595 +f 2075/2317/399 2068/2318/399 2081/2319/399 2086/2320/399 +f 1602/2321/596 1601/1768/596 1606/1771/596 1608/2322/596 1110/1773/596 1103/1772/596 +f 1599/2323/597 1598/1741/597 1591/1740/597 1593/2324/597 1092/1744/597 1099/1743/597 +f 2063/2325/398 2056/2326/398 2069/2327/398 2074/2328/398 +f 1596/2329/598 1595/1749/598 1600/1752/598 1602/2330/598 1103/1754/598 1096/1753/598 +f 1593/2331/599 1592/1722/599 1585/1721/599 1587/2332/599 1085/1725/599 1092/1724/599 +f 2051/2333/397 2044/2334/397 2057/2335/397 2062/2336/397 +f 1590/2337/600 1589/1730/600 1594/1733/600 1596/2338/600 1096/1735/600 1089/1734/600 +f 1587/2339/601 1586/1703/601 1579/1702/601 1581/2340/601 1078/1706/601 1085/1705/601 +f 2039/2341/396 2032/2342/396 2045/2343/396 2050/2344/396 +f 1584/2345/602 1583/1711/602 1588/1714/602 1590/2346/602 1089/1716/602 1082/1715/602 +f 1581/2347/603 1580/1684/603 1573/1683/603 1575/2348/603 1071/1687/603 1078/1686/603 +f 2027/2349/395 2020/2350/395 2033/2351/395 2038/2352/395 +f 1578/2353/604 1577/1692/604 1582/1695/604 1584/2354/604 1082/1697/604 1075/1696/604 +f 1575/2355/605 1574/1665/605 1567/1664/605 1569/2356/605 1064/1668/605 1071/1667/605 +f 2015/2357/394 2008/2358/394 2021/2359/394 2026/2360/394 +f 1572/2361/606 1571/1673/606 1576/1676/606 1578/2362/606 1075/1678/606 1068/1677/606 +f 1569/2363/607 1568/1646/607 1561/1645/607 1563/2364/607 1057/1649/607 1064/1648/607 +f 2003/2365/393 1996/2366/393 2009/2367/393 2014/2368/393 +f 1566/2369/608 1565/1654/608 1570/1657/608 1572/2370/608 1068/1659/608 1061/1658/608 +f 1563/2371/609 1562/1627/609 1555/1626/609 1557/2372/609 1051/1630/609 1057/1629/609 +f 1991/2373/392 1984/2374/392 1997/2375/392 2002/2376/392 +f 1560/2377/610 1559/1635/610 1564/1638/610 1566/2378/610 1061/1640/610 1054/1639/610 +f 1557/2379/611 1556/1608/611 1549/1607/611 1551/2380/611 1046/1611/611 1051/1610/611 +f 1979/2381/391 1972/2382/391 1985/2383/391 1990/2384/391 +f 1554/2385/612 1553/1616/612 1558/1619/612 1560/2386/612 1054/1621/612 1049/1620/612 +f 1551/2387/613 1550/1593/613 1543/1592/613 1545/2388/613 1041/1596/613 1046/1595/613 +f 1967/2389/390 1960/2390/390 1973/2391/390 1978/2392/390 +f 1937/2393/420 1942/2394/420 1917/2395/420 1914/2396/420 +f 1929/2397/418 1926/2398/418 1951/2399/418 1952/2400/418 +f 1941/2401/420 1946/2172/420 1921/2171/420 1918/2402/420 +f 1967/2389/614 1978/2392/614 1786/2403/614 1785/2404/614 +f 1949/1591/615 1962/1594/615 1848/2405/615 1906/2406/615 +f 1915/2407/552 1916/2408/552 1931/2409/552 1932/2410/552 +f 1915/2407/616 1932/2410/616 1781/2411/616 1783/2412/616 +f 1919/2141/617 1928/2144/617 1845/2413/617 1847/2414/617 +f 1923/2145/618 1924/2148/618 1909/2415/618 1911/2416/618 +f 1933/1537/619 1956/1540/619 1779/2417/619 1780/2418/619 +f 1838/2419/620 1846/2420/620 1917/2395/620 1942/2394/620 +f 1925/1576/621 1948/1579/621 1907/2421/621 1908/2422/621 +f 2283/1527/622 2294/1530/622 1776/2423/622 1773/2424/622 +f 1941/2401/623 1918/2402/623 1846/2420/623 1838/2419/623 +f 2275/2100/624 2286/2103/624 1904/2425/624 1901/2426/624 +f 1773/2424/625 1776/2423/625 2293/2093/625 2280/2092/625 +f 2267/2189/626 2278/2192/626 1836/2427/626 1835/2428/626 +f 1901/2426/627 1904/2425/627 2285/2183/627 2272/2182/627 +f 2259/1519/628 2270/1522/628 1770/2429/628 1769/2430/628 +f 1835/2428/629 1836/2427/629 2277/1525/629 2264/1524/629 +f 2263/2081/630 2274/2084/630 1900/2431/630 1899/2432/630 +f 1769/2430/631 1770/2429/631 2269/2055/631 2256/2054/631 +f 2255/2197/632 2266/2200/632 1834/2433/632 1833/2434/632 +f 2239/2043/633 2250/2046/633 1896/2435/633 1895/2436/633 +f 2247/1515/634 2258/1518/634 1768/2437/634 1767/2438/634 +f 2231/2213/635 2242/2216/635 1830/2439/635 1829/2440/635 +f 1895/2436/636 1896/2435/636 2249/2207/636 2236/2206/636 +f 2223/1507/637 2234/1510/637 1764/2441/637 1763/2442/637 +f 1829/2440/638 1830/2439/638 2241/1513/638 2228/1512/638 +f 2215/2005/639 2226/2008/639 1892/2443/639 1891/2444/639 +f 1763/2442/640 1764/2441/640 2233/1998/640 2220/1997/640 +f 2207/2229/641 2218/2232/641 1826/2445/641 1825/2446/641 +f 1891/2444/642 1892/2443/642 2225/2223/642 2212/2222/642 +f 2199/1499/643 2210/1502/643 1760/2447/643 1759/2448/643 +f 1825/2446/644 1826/2445/644 2217/1505/644 2204/1504/644 +f 2191/1967/645 2202/1970/645 1888/2449/645 1887/2450/645 +f 1759/2448/646 1760/2447/646 2209/1960/646 2196/1959/646 +f 2183/2245/647 2194/2248/647 1822/2451/647 1821/2452/647 +f 1887/2450/648 1888/2449/648 2201/2239/648 2188/2238/648 +f 2175/1491/649 2186/1494/649 1756/2453/649 1755/2454/649 +f 1821/2452/650 1822/2451/650 2193/1497/650 2180/1496/650 +f 2179/1948/651 2190/1951/651 1886/2455/651 1885/2456/651 +f 1755/2454/652 1756/2453/652 2185/1922/652 2172/1921/652 +f 2171/2253/653 2182/2256/653 1820/2457/653 1819/2458/653 +f 2155/1910/654 2166/1913/654 1882/2459/654 1881/2460/654 +f 2163/1487/655 2174/1490/655 1754/2461/655 1753/2462/655 +f 2147/2269/656 2158/2272/656 1816/2463/656 1815/2464/656 +f 1881/2460/657 1882/2459/657 2165/2263/657 2152/2262/657 +f 2139/1479/658 2150/1482/658 1750/2465/658 1749/2466/658 +f 1815/2464/659 1816/2463/659 2157/1485/659 2144/1484/659 +f 2131/1872/660 2142/1875/660 1878/2467/660 1877/2468/660 +f 1749/2466/661 1750/2465/661 2149/1865/661 2136/1864/661 +f 2123/2285/662 2134/2288/662 1812/2469/662 1811/2470/662 +f 1877/2468/663 1878/2467/663 2141/2279/663 2128/2278/663 +f 2115/1471/664 2126/1474/664 1746/2471/664 1745/2472/664 +f 1811/2470/665 1812/2469/665 2133/1477/665 2120/1476/665 +f 2107/1834/666 2118/1837/666 1874/2473/666 1873/2474/666 +f 1745/2472/667 1746/2471/667 2125/1827/667 2112/1826/667 +f 2099/2301/668 2110/2304/668 1808/2475/668 1807/2476/668 +f 1873/2474/669 1874/2473/669 2117/2295/669 2104/2294/669 +f 2091/1463/670 2102/1466/670 1742/2477/670 1741/2478/670 +f 1807/2476/671 1808/2475/671 2109/1469/671 2096/1468/671 +f 2095/1815/672 2106/1818/672 1872/2479/672 1871/2480/672 +f 1741/2478/673 1742/2477/673 2101/1789/673 2088/1788/673 +f 2087/2309/674 2098/2312/674 1806/2481/674 1805/2482/674 +f 2071/1777/675 2082/1780/675 1868/2483/675 1867/2484/675 +f 2079/1459/676 2090/1462/676 1740/2485/676 1739/2486/676 +f 2063/2325/677 2074/2328/677 1802/2487/677 1801/2488/677 +f 1867/2484/678 1868/2483/678 2081/2319/678 2068/2318/678 +f 2055/1451/679 2066/1454/679 1736/2489/679 1735/2490/679 +f 1801/2488/680 1802/2487/680 2073/1457/680 2060/1456/680 +f 2047/1739/681 2058/1742/681 1864/2491/681 1863/2492/681 +f 1735/2490/682 1736/2489/682 2065/1732/682 2052/1731/682 +f 2039/2341/683 2050/2344/683 1798/2493/683 1797/2494/683 +f 1863/2492/684 1864/2491/684 2057/2335/684 2044/2334/684 +f 2031/1443/685 2042/1446/685 1732/2495/685 1731/2496/685 +f 1797/2494/686 1798/2493/686 2049/1449/686 2036/1448/686 +f 2023/1701/687 2034/1704/687 1860/2497/687 1859/2498/687 +f 1731/2496/688 1732/2495/688 2041/1694/688 2028/1693/688 +f 2015/2357/689 2026/2360/689 1794/2499/689 1793/2500/689 +f 1859/2498/690 1860/2497/690 2033/2351/690 2020/2350/690 +f 2007/1435/691 2018/1438/691 1728/2501/691 1727/2502/691 +f 1793/2500/692 1794/2499/692 2025/1441/692 2012/1440/692 +f 2011/1682/693 2022/1685/693 1858/2503/693 1857/2504/693 +f 1727/2502/694 1728/2501/694 2017/1656/694 2004/1655/694 +f 2003/2365/695 2014/2368/695 1792/2505/695 1791/2506/695 +f 1987/1644/696 1998/1647/696 1854/2507/696 1853/2508/696 +f 1995/1431/697 2006/1434/697 1726/2509/697 1725/2510/697 +f 1979/2381/698 1990/2384/698 1788/2511/698 1787/2512/698 +f 1853/2508/699 1854/2507/699 1997/2375/699 1984/2374/699 +f 1971/1423/700 1982/1426/700 1722/2513/700 1721/2514/700 +f 1842/2515/701 1784/2516/701 1965/1421/701 1954/1420/701 +f 1963/1606/702 1974/1609/702 1850/2517/702 1849/2518/702 +f 1957/1419/703 1970/1422/703 1720/2168/703 1778/2167/703 +f 1953/2163/704 1966/2166/704 1784/2516/704 1842/2515/704 +f 1849/2518/705 1850/2517/705 1973/2391/705 1960/2390/705 +f 1777/2519/706 1775/2520/706 1939/2112/706 2292/2111/706 +f 1929/2397/707 1952/2400/707 1843/2521/707 1844/2522/707 +f 1905/2523/708 1903/2524/708 1947/2161/708 2284/2160/708 +f 1529/2130/552 1912/2525/552 1935/2526/552 1534/2131/552 +f 1906/2406/709 1848/2405/709 1961/2165/709 1950/2164/709 +f 1975/1625/710 1986/1628/710 1852/2527/710 1851/2528/710 +f 1851/2528/711 1852/2527/711 1985/2383/711 1972/2382/711 +f 1999/1663/712 2010/1666/712 1856/2529/712 1855/2530/712 +f 1855/2530/713 1856/2529/713 2009/2367/713 1996/2366/713 +f 1857/2504/714 1858/2503/714 2021/2359/714 2008/2358/714 +f 2035/1720/715 2046/1723/715 1862/2531/715 1861/2532/715 +f 1861/2532/716 1862/2531/716 2045/2343/716 2032/2342/716 +f 2059/1758/717 2070/1761/717 1866/2533/717 1865/2534/717 +f 1865/2534/718 1866/2533/718 2069/2327/718 2056/2326/718 +f 2083/1796/719 2094/1799/719 1870/2535/719 1869/2536/719 +f 1869/2536/720 1870/2535/720 2093/2311/720 2080/2310/720 +f 1871/2480/721 1872/2479/721 2105/2303/721 2092/2302/721 +f 2119/1853/722 2130/1856/722 1876/2537/722 1875/2538/722 +f 1875/2538/723 1876/2537/723 2129/2287/723 2116/2286/723 +f 2143/1891/724 2154/1894/724 1880/2539/724 1879/2540/724 +f 1879/2540/725 1880/2539/725 2153/2271/725 2140/2270/725 +f 2167/1929/726 2178/1932/726 1884/2541/726 1883/2542/726 +f 1883/2542/727 1884/2541/727 2177/2255/727 2164/2254/727 +f 1885/2456/728 1886/2455/728 2189/2247/728 2176/2246/728 +f 2203/1986/729 2214/1989/729 1890/2543/729 1889/2544/729 +f 1889/2544/730 1890/2543/730 2213/2231/730 2200/2230/730 +f 2227/2024/731 2238/2027/731 1894/2545/731 1893/2546/731 +f 1893/2546/732 1894/2545/732 2237/2215/732 2224/2214/732 +f 2251/2062/733 2262/2065/733 1898/2547/733 1897/2548/733 +f 1897/2548/734 1898/2547/734 2261/2199/734 2248/2198/734 +f 1899/2432/735 1900/2431/735 2273/2191/735 2260/2190/735 +f 2287/2119/736 1944/2122/736 1903/2524/736 1905/2523/736 +f 1945/2137/737 1922/2138/737 1910/2170/737 1902/2169/737 +f 1908/2422/738 1907/2421/738 1951/2399/738 1926/2398/738 +f 1911/2416/739 1909/2415/739 1927/2143/739 1920/2142/739 +f 2291/2159/740 1940/2162/740 1839/2549/740 1841/2550/740 +f 1787/2512/741 1788/2511/741 1989/1429/741 1976/1428/741 +f 1785/2404/742 1786/2403/742 1977/1425/742 1964/1424/742 +f 1991/2373/743 2002/2376/743 1790/2551/743 1789/2552/743 +f 1789/2552/744 1790/2551/744 2001/1433/744 1988/1432/744 +f 1791/2506/745 1792/2505/745 2013/1437/745 2000/1436/745 +f 2027/2349/746 2038/2352/746 1796/2553/746 1795/2554/746 +f 1795/2554/747 1796/2553/747 2037/1445/747 2024/1444/747 +f 2051/2333/748 2062/2336/748 1800/2555/748 1799/2556/748 +f 1799/2556/749 1800/2555/749 2061/1453/749 2048/1452/749 +f 2075/2317/750 2086/2320/750 1804/2557/750 1803/2558/750 +f 1803/2558/751 1804/2557/751 2085/1461/751 2072/1460/751 +f 1805/2482/752 1806/2481/752 2097/1465/752 2084/1464/752 +f 2111/2293/753 2122/2296/753 1810/2559/753 1809/2560/753 +f 1809/2560/754 1810/2559/754 2121/1473/754 2108/1472/754 +f 2135/2277/755 2146/2280/755 1814/2561/755 1813/2562/755 +f 1813/2562/756 1814/2561/756 2145/1481/756 2132/1480/756 +f 2159/2261/757 2170/2264/757 1818/2563/757 1817/2564/757 +f 1817/2564/758 1818/2563/758 2169/1489/758 2156/1488/758 +f 1819/2458/759 1820/2457/759 2181/1493/759 2168/1492/759 +f 2195/2237/760 2206/2240/760 1824/2565/760 1823/2566/760 +f 1823/2566/761 1824/2565/761 2205/1501/761 2192/1500/761 +f 2219/2221/762 2230/2224/762 1828/2567/762 1827/2568/762 +f 1827/2568/763 1828/2567/763 2229/1509/763 2216/1508/763 +f 2243/2205/764 2254/2208/764 1832/2569/764 1831/2570/764 +f 1831/2570/765 1832/2569/765 2253/1517/765 2240/1516/765 +f 1833/2434/766 1834/2433/766 2265/1521/766 2252/1520/766 +f 2279/2181/767 2290/2184/767 1840/2571/767 1837/2572/767 +f 1837/2572/768 1840/2571/768 2289/1529/768 2276/1528/768 +f 1841/2550/769 1839/2549/769 1943/2157/769 2288/2156/769 +f 1844/2522/770 1843/2521/770 1955/1539/770 1930/1538/770 +f 1847/2414/771 1845/2413/771 1931/2409/771 1916/2408/771 +f 1774/2573/772 1782/2574/772 1913/1549/772 1938/1548/772 +f 1721/2514/773 1722/2513/773 1981/1602/773 1968/1601/773 +f 1983/1427/774 1994/1430/774 1724/2575/774 1723/2576/774 +f 1723/2576/775 1724/2575/775 1993/1618/775 1980/1617/775 +f 1725/2510/776 1726/2509/776 2005/1637/776 1992/1636/776 +f 2019/1439/777 2030/1442/777 1730/2577/777 1729/2578/777 +f 1729/2578/778 1730/2577/778 2029/1675/778 2016/1674/778 +f 2043/1447/779 2054/1450/779 1734/2579/779 1733/2580/779 +f 1733/2580/780 1734/2579/780 2053/1713/780 2040/1712/780 +f 2067/1455/781 2078/1458/781 1738/2581/781 1737/2582/781 +f 1737/2582/782 1738/2581/782 2077/1751/782 2064/1750/782 +f 1739/2486/783 1740/2485/783 2089/1770/783 2076/1769/783 +f 2103/1467/784 2114/1470/784 1744/2583/784 1743/2584/784 +f 1743/2584/785 1744/2583/785 2113/1808/785 2100/1807/785 +f 2127/1475/786 2138/1478/786 1748/2585/786 1747/2586/786 +f 1747/2586/787 1748/2585/787 2137/1846/787 2124/1845/787 +f 2151/1483/788 2162/1486/788 1752/2587/788 1751/2588/788 +f 1751/2588/789 1752/2587/789 2161/1884/789 2148/1883/789 +f 1753/2462/790 1754/2461/790 2173/1903/790 2160/1902/790 +f 2187/1495/791 2198/1498/791 1758/2589/791 1757/2590/791 +f 1757/2590/792 1758/2589/792 2197/1941/792 2184/1940/792 +f 2211/1503/793 2222/1506/793 1762/2591/793 1761/2592/793 +f 1761/2592/794 1762/2591/794 2221/1979/794 2208/1978/794 +f 2235/1511/795 2246/1514/795 1766/2593/795 1765/2594/795 +f 1765/2594/796 1766/2593/796 2245/2017/796 2232/2016/796 +f 1767/2438/797 1768/2437/797 2257/2036/797 2244/2035/797 +f 2271/1523/798 2282/1526/798 1772/2595/798 1771/2596/798 +f 1771/2596/799 1772/2595/799 2281/2074/799 2268/2073/799 +f 2295/2155/800 1936/2158/800 1775/2520/800 1777/2519/800 +f 1937/2393/801 1914/2396/801 1782/2574/801 1774/2573/801 +f 1780/2418/802 1779/2417/802 1959/1572/802 1934/1571/802 +f 1783/2412/803 1781/2411/803 1935/2526/803 1912/2525/803 +f 1528/1550/804 1439/2597/804 1529/2598/804 1530/2599/804 +f 1531/2600/805 1438/2601/805 1532/1558/805 1533/1557/805 +f 1534/2131/806 1450/2602/806 1535/1542/806 1536/1541/806 +f 1537/1577/807 1449/2603/807 1538/2604/807 1539/2149/807 +f 1540/1543/808 1461/2605/808 1541/1414/808 1542/1413/808 +f 1543/1592/809 1460/2606/809 1544/1578/809 1545/2153/809 +f 1546/1415/810 1472/2607/810 1547/1532/810 1548/1531/810 +f 1549/1607/811 1471/2608/811 1550/2609/811 1551/2387/811 +f 1552/1533/812 1483/2610/812 1553/1616/812 1554/2385/812 +f 1555/1626/813 1482/2611/813 1556/1608/813 1557/2379/813 +f 1558/1619/814 1494/2612/814 1559/1635/814 1560/2377/814 +f 1561/1645/815 1493/2613/815 1562/2614/815 1563/2371/815 +f 1564/1638/816 1527/2175/816 1565/1654/816 1566/2369/816 +f 1567/1664/817 1526/2615/817 1568/1646/817 1569/2363/817 +f 1570/1657/818 1516/2616/818 1571/1673/818 1572/2361/818 +f 1573/1683/819 1515/2617/819 1574/2618/819 1575/2355/819 +f 1576/1676/820 1505/2619/820 1577/1692/820 1578/2353/820 +f 1579/1702/821 1504/2620/821 1580/1684/821 1581/2347/821 +f 1582/1695/822 2296/2621/822 1583/1711/822 1584/2345/822 +f 1585/1721/823 2297/2622/823 1586/2623/823 1587/2339/823 +f 1588/1714/824 1090/2624/824 1589/1730/824 1590/2337/824 +f 1591/1740/825 1087/2625/825 1592/1722/825 1593/2331/825 +f 1594/1733/826 1129/2626/826 1595/1749/826 1596/2329/826 +f 1597/1759/827 1125/2627/827 1598/2628/827 1599/2323/827 +f 1600/1752/828 1167/2629/828 1601/1768/828 1602/2321/828 +f 1603/1778/829 1164/2630/829 1604/1760/829 1605/2315/829 +f 1606/1771/830 1206/2631/830 1607/1787/830 1608/2313/830 +f 1609/1797/831 1202/2632/831 1610/2633/831 1611/2307/831 +f 1612/1790/832 1241/2634/832 1613/1806/832 1614/2305/832 +f 1615/1816/833 1240/2635/833 1616/1798/833 1617/2299/833 +f 1618/1809/834 1252/2636/834 1619/1825/834 1620/2297/834 +f 1621/1835/835 1251/2637/835 1622/2638/835 1623/2291/835 +f 1624/1828/836 1263/2639/836 1625/1844/836 1626/2289/836 +f 1627/1854/837 1262/2640/837 1628/1836/837 1629/2283/837 +f 1630/1847/838 1274/2641/838 1631/1863/838 1632/2281/838 +f 1633/1873/839 1273/2642/839 1634/2643/839 1635/2275/839 +f 1636/1866/840 1285/2644/840 1637/1882/840 1638/2273/840 +f 1639/1892/841 1284/2645/841 1640/1874/841 1641/2267/841 +f 1642/1885/842 1296/2646/842 1643/1901/842 1644/2265/842 +f 1645/1911/843 1295/2647/843 1646/2648/843 1647/2259/843 +f 1648/1904/844 1307/2649/844 1649/1920/844 1650/2257/844 +f 1651/1930/845 1306/2650/845 1652/1912/845 1653/2251/845 +f 1654/1923/846 1318/2651/846 1655/1939/846 1656/2249/846 +f 1657/1949/847 1317/2652/847 1658/2653/847 1659/2243/847 +f 1660/1942/848 1329/2654/848 1661/1958/848 1662/2241/848 +f 1663/1968/849 1328/2655/849 1664/1950/849 1665/2235/849 +f 1666/1961/850 1340/2656/850 1667/1977/850 1668/2233/850 +f 1669/1987/851 1339/2657/851 1670/2658/851 1671/2227/851 +f 1672/1980/852 1351/2659/852 1673/1996/852 1674/2225/852 +f 1675/2006/853 1350/2660/853 1676/1988/853 1677/2219/853 +f 1678/1999/854 1362/2661/854 1679/2015/854 1680/2217/854 +f 1681/2025/855 1361/2662/855 1682/2663/855 1683/2211/855 +f 1684/2018/856 1373/2664/856 1685/2034/856 1686/2209/856 +f 1687/2044/857 1372/2665/857 1688/2026/857 1689/2203/857 +f 1690/2037/858 1384/2666/858 1691/2053/858 1692/2201/858 +f 1693/2063/859 1383/2667/859 1694/2668/859 1695/2195/859 +f 1696/2056/860 1395/2669/860 1697/2072/860 1698/2193/860 +f 1699/2082/861 1394/2670/861 1700/2064/861 1701/2187/861 +f 1702/2075/862 1406/2671/862 1703/2091/862 1704/2185/862 +f 1705/2101/863 1405/2672/863 1706/2673/863 1707/2179/863 +f 1708/2094/864 1417/2674/864 1709/2110/864 1710/2177/864 +f 1711/2120/865 1416/2675/865 1712/2102/865 1713/2173/865 +f 1714/2113/866 1428/2676/866 1715/1547/866 1716/2677/866 +f 1717/1559/867 1427/2678/867 1718/2679/867 1719/2151/867 +f 1470/2680/868 1469/2681/868 1721/2514/868 1968/1601/868 +f 1083/2682/869 1080/2683/869 1735/2490/869 2052/1731/869 +f 1272/2684/870 1271/2685/870 1749/2466/870 2136/1864/870 +f 1349/2686/871 1348/2687/871 1763/2442/871 2220/1997/871 +f 1415/2688/872 1414/2689/872 1777/2519/872 2292/2111/872 +f 2298/2690/873 2299/2691/873 1797/2494/873 2036/1448/873 +f 1261/2692/874 1260/2693/874 1811/2470/874 2120/1476/874 +f 1338/2694/875 1337/2695/875 1825/2446/875 2204/1504/875 +f 1426/2696/876 1425/2697/876 1839/2549/876 1940/2162/876 +f 1503/2698/877 1502/2699/877 1859/2498/877 2020/2350/877 +f 1250/2700/878 1249/2701/878 1873/2474/878 2104/2294/878 +f 1327/2702/879 1326/2703/879 1887/2450/879 2188/2238/879 +f 1404/2704/880 1403/2705/880 1901/2426/880 2272/2182/880 +f 1437/2706/881 1436/2707/881 1911/2708/881 1920/2709/881 +f 1492/2710/882 1491/2711/882 1725/2510/882 1992/1636/882 +f 1525/2176/883 1524/2712/883 1727/2502/883 2004/1655/883 +f 1501/2713/884 1500/2714/884 1731/2496/884 2028/1693/884 +f 1160/2715/885 1157/2716/885 1739/2486/885 2076/1769/885 +f 1199/2717/886 1195/2718/886 1741/2478/886 2088/1788/886 +f 1248/2719/887 1247/2720/887 1745/2472/887 2112/1826/887 +f 1294/2721/888 1293/2722/888 1753/2462/888 2160/1902/888 +f 1305/2723/889 1304/2724/889 1755/2454/889 2172/1921/889 +f 1325/2725/890 1324/2726/890 1759/2448/890 2196/1959/890 +f 1371/2727/891 1370/2728/891 1767/2438/891 2244/2035/891 +f 1382/2729/892 1381/2730/892 1769/2430/892 2256/2054/892 +f 1402/2731/893 1401/2732/893 1773/2424/893 2280/2092/893 +f 1448/2733/894 1447/2734/894 1781/2411/894 1932/2410/894 +f 1435/2735/895 1434/2736/895 1783/2737/895 1912/2738/895 +f 1481/2739/896 1480/2740/896 1787/2512/896 1976/1428/896 +f 1490/2741/897 1489/2742/897 1789/2552/897 1988/1432/897 +f 1514/2743/898 1513/2744/898 1793/2500/898 2012/1440/898 +f 1122/2745/899 1118/2746/899 1801/2488/899 2060/1456/899 +f 1153/2747/900 1150/2748/900 1803/2558/900 2072/1460/900 +f 1237/2749/901 1234/2750/901 1807/2476/901 2096/1468/901 +f 1283/2751/902 1282/2752/902 1815/2464/902 2144/1484/902 +f 1292/2753/903 1291/2754/903 1817/2564/903 2156/1488/903 +f 1316/2755/904 1315/2756/904 1821/2452/904 2180/1496/904 +f 1360/2757/905 1359/2758/905 1829/2440/905 2228/1512/905 +f 1369/2759/906 1368/2760/906 1831/2570/906 2240/1516/906 +f 1393/2761/907 1392/2762/907 1835/2428/907 2264/1524/907 +f 1459/2763/908 1458/2764/908 1843/2521/908 1952/2400/908 +f 1446/2765/909 1445/2766/909 1845/2413/909 1928/2144/909 +f 1468/2767/910 1467/2768/910 1849/2518/910 1960/2390/910 +f 1479/2769/911 1478/2770/911 1851/2528/911 1972/2382/911 +f 1523/2771/912 1522/2772/912 1855/2530/912 1996/2366/912 +f 1076/2773/913 1073/2774/913 1863/2492/913 2044/2334/913 +f 1115/2775/914 1111/2776/914 1865/2534/914 2056/2326/914 +f 1192/2777/915 1188/2778/915 1869/2536/915 2080/2310/915 +f 1270/2779/916 1269/2780/916 1877/2468/916 2128/2278/916 +f 1281/2781/917 1280/2782/917 1879/2540/917 2140/2270/917 +f 1303/2783/918 1302/2784/918 1883/2542/918 2164/2254/918 +f 1347/2785/919 1346/2786/919 1891/2444/919 2212/2222/919 +f 1358/2787/920 1357/2788/920 1893/2546/920 2224/2214/920 +f 1380/2789/921 1379/2790/921 1897/2548/921 2248/2198/921 +f 1413/2791/922 1412/2792/922 1905/2523/922 2284/2160/922 +f 1457/2793/923 1456/2794/923 1907/2421/923 1948/1579/923 +f 1444/2795/924 1443/2796/924 1909/2415/924 1924/2148/924 +f 1424/2797/925 1423/2798/925 1903/2524/925 1944/2122/925 +f 1391/2799/926 1390/2800/926 1899/2432/926 2260/2190/926 +f 1367/2801/927 1366/2802/927 1895/2436/927 2236/2206/927 +f 1336/2803/928 1335/2804/928 1889/2544/928 2200/2230/928 +f 1314/2805/929 1313/2806/929 1885/2456/929 2176/2246/929 +f 1290/2807/930 1289/2808/930 1881/2460/930 2152/2262/930 +f 1259/2809/931 1258/2810/931 1875/2538/931 2116/2286/931 +f 1230/2811/932 1227/2812/932 1871/2480/932 2092/2302/932 +f 1146/2813/933 1143/2814/933 1867/2484/933 2068/2318/933 +f 2300/2815/934 2301/2816/934 1861/2532/934 2032/2342/934 +f 1512/2817/935 1511/2818/935 1857/2504/935 2008/2358/935 +f 1488/2819/936 1487/2820/936 1853/2508/936 1984/2374/936 +f 1433/2821/937 1432/2822/937 1847/2823/937 1916/2824/937 +f 1411/2825/938 1410/2826/938 1841/2550/938 2288/2156/938 +f 1400/2827/939 1399/2828/939 1837/2572/939 2276/1528/939 +f 1378/2829/940 1377/2830/940 1833/2434/940 2252/1520/940 +f 1345/2831/941 1344/2832/941 1827/2568/941 2216/1508/941 +f 1323/2833/942 1322/2834/942 1823/2566/942 2192/1500/942 +f 1301/2835/943 1300/2836/943 1819/2458/943 2168/1492/943 +f 1268/2837/944 1267/2838/944 1813/2562/944 2132/1480/944 +f 1246/2839/945 1245/2840/945 1809/2560/945 2108/1472/945 +f 1185/2841/946 1181/2842/946 1805/2482/946 2084/1464/946 +f 1069/2843/947 1066/2844/947 1799/2556/947 2048/1452/947 +f 1499/2845/948 1498/2846/948 1795/2554/948 2024/1444/948 +f 1521/2847/949 1520/2848/949 1791/2506/949 2000/1436/949 +f 1466/2849/950 1465/2850/950 1785/2404/950 1964/1424/950 +f 1455/2851/951 1454/2852/951 1779/2417/951 1956/1540/951 +f 1422/2853/952 1421/2854/952 1775/2520/952 1936/2158/952 +f 1389/2855/953 1388/2856/953 1771/2596/953 2268/2073/953 +f 1356/2857/954 1355/2858/954 1765/2594/954 2232/2016/954 +f 1334/2859/955 1333/2860/955 1761/2592/955 2208/1978/955 +f 1312/2861/956 1311/2862/956 1757/2590/956 2184/1940/956 +f 1279/2863/957 1278/2864/957 1751/2588/957 2148/1883/957 +f 1257/2865/958 1256/2866/958 1747/2586/958 2124/1845/958 +f 1223/2867/959 1220/2868/959 1743/2584/959 2100/1807/959 +f 1108/2869/960 1104/2870/960 1737/2582/960 2064/1750/960 +f 2302/2871/961 2303/2872/961 1733/2580/961 2040/1712/961 +f 1510/2873/962 1509/2874/962 1729/2578/962 2016/1674/962 +f 1477/2875/963 1476/2876/963 1723/2576/963 1980/1617/963 +f 1434/2736/964 1431/2877/964 1915/2878/964 1783/2737/964 +f 1447/2734/965 1442/2879/965 1935/2526/965 1781/2411/965 +f 1432/2822/966 1430/2880/966 1919/2881/966 1847/2823/966 +f 1445/2766/967 1441/2882/967 1931/2409/967 1845/2413/967 +f 1436/2707/968 1429/2883/968 1923/2884/968 1911/2708/968 +f 1443/2796/969 1440/2885/969 1927/2143/969 1909/2415/969 +f 1454/2852/970 1453/2886/970 1959/1572/970 1779/2417/970 +f 1458/2764/971 1452/2887/971 1955/1539/971 1843/2521/971 +f 1456/2794/972 1451/2888/972 1951/2399/972 1907/2421/972 +f 1414/2689/973 1409/2889/973 2295/2155/973 1777/2519/973 +f 1421/2854/974 1420/2890/974 1939/2112/974 1775/2520/974 +f 1410/2826/975 1408/2891/975 2291/2159/975 1841/2550/975 +f 1425/2697/976 1419/2892/976 1943/2157/976 1839/2549/976 +f 1412/2792/977 1407/2893/977 2287/2119/977 1905/2523/977 +f 1423/2798/978 1418/2894/978 1947/2161/978 1903/2524/978 +f 1401/2732/979 1398/2895/979 2283/1527/979 1773/2424/979 +f 1399/2828/980 1397/2896/980 2279/2181/980 1837/2572/980 +f 1403/2705/981 1396/2897/981 2275/2100/981 1901/2426/981 +f 1388/2856/982 1387/2898/982 2271/1523/982 1771/2596/982 +f 1392/2762/983 1386/2899/983 2267/2189/983 1835/2428/983 +f 1390/2800/984 1385/2900/984 2263/2081/984 1899/2432/984 +f 1381/2730/985 1376/2901/985 2259/1519/985 1769/2430/985 +f 1377/2830/986 1375/2902/986 2255/2197/986 1833/2434/986 +f 1379/2790/987 1374/2903/987 2251/2062/987 1897/2548/987 +f 1370/2728/988 1365/2904/988 2247/1515/988 1767/2438/988 +f 1368/2760/989 1364/2905/989 2243/2205/989 1831/2570/989 +f 1366/2802/990 1363/2906/990 2239/2043/990 1895/2436/990 +f 1355/2858/991 1354/2907/991 2235/1511/991 1765/2594/991 +f 1359/2758/992 1353/2908/992 2231/2213/992 1829/2440/992 +f 1357/2788/993 1352/2909/993 2227/2024/993 1893/2546/993 +f 1348/2687/994 1343/2910/994 2223/1507/994 1763/2442/994 +f 1344/2832/995 1342/2911/995 2219/2221/995 1827/2568/995 +f 1346/2786/996 1341/2912/996 2215/2005/996 1891/2444/996 +f 1333/2860/997 1332/2913/997 2211/1503/997 1761/2592/997 +f 1337/2695/998 1331/2914/998 2207/2229/998 1825/2446/998 +f 1335/2804/999 1330/2915/999 2203/1986/999 1889/2544/999 +f 1324/2726/1000 1321/2916/1000 2199/1499/1000 1759/2448/1000 +f 1322/2834/1001 1320/2917/1001 2195/2237/1001 1823/2566/1001 +f 1326/2703/1002 1319/2918/1002 2191/1967/1002 1887/2450/1002 +f 1311/2862/1003 1310/2919/1003 2187/1495/1003 1757/2590/1003 +f 1315/2756/1004 1309/2920/1004 2183/2245/1004 1821/2452/1004 +f 1313/2806/1005 1308/2921/1005 2179/1948/1005 1885/2456/1005 +f 1304/2724/1006 1299/2922/1006 2175/1491/1006 1755/2454/1006 +f 1300/2836/1007 1298/2923/1007 2171/2253/1007 1819/2458/1007 +f 1302/2784/1008 1297/2924/1008 2167/1929/1008 1883/2542/1008 +f 1293/2722/1009 1288/2925/1009 2163/1487/1009 1753/2462/1009 +f 1291/2754/1010 1287/2926/1010 2159/2261/1010 1817/2564/1010 +f 1289/2808/1011 1286/2927/1011 2155/1910/1011 1881/2460/1011 +f 1278/2864/1012 1277/2928/1012 2151/1483/1012 1751/2588/1012 +f 1282/2752/1013 1276/2929/1013 2147/2269/1013 1815/2464/1013 +f 1280/2782/1014 1275/2930/1014 2143/1891/1014 1879/2540/1014 +f 1271/2685/1015 1266/2931/1015 2139/1479/1015 1749/2466/1015 +f 1267/2838/1016 1265/2932/1016 2135/2277/1016 1813/2562/1016 +f 1269/2780/1017 1264/2933/1017 2131/1872/1017 1877/2468/1017 +f 1256/2866/1018 1255/2934/1018 2127/1475/1018 1747/2586/1018 +f 1260/2693/1019 1254/2935/1019 2123/2285/1019 1811/2470/1019 +f 1258/2810/1020 1253/2936/1020 2119/1853/1020 1875/2538/1020 +f 1247/2720/1021 1244/2937/1021 2115/1471/1021 1745/2472/1021 +f 1245/2840/1022 1243/2938/1022 2111/2293/1022 1809/2560/1022 +f 1249/2701/1023 1242/2939/1023 2107/1834/1023 1873/2474/1023 +f 1220/2868/1024 1216/2940/1024 2103/1467/1024 1743/2584/1024 +f 1234/2750/1025 1213/2941/1025 2099/2301/1025 1807/2476/1025 +f 1227/2812/1026 1209/2942/1026 2095/1815/1026 1871/2480/1026 +f 1195/2718/1027 1178/2943/1027 2091/1463/1027 1741/2478/1027 +f 1181/2842/1028 1174/2944/1028 2087/2309/1028 1805/2482/1028 +f 1188/2778/1029 1171/2945/1029 2083/1796/1029 1869/2536/1029 +f 1157/2716/1030 1139/2946/1030 2079/1459/1030 1739/2486/1030 +f 1150/2748/1031 1136/2947/1031 2075/2317/1031 1803/2558/1031 +f 1143/2814/1032 1132/2948/1032 2071/1777/1032 1867/2484/1032 +f 1104/2870/1033 1101/2949/1033 2067/1455/1033 1737/2582/1033 +f 1118/2746/1034 1097/2950/1034 2063/2325/1034 1801/2488/1034 +f 1111/2776/1035 1094/2951/1035 2059/1758/1035 1865/2534/1035 +f 1080/2683/1036 1062/2952/1036 2055/1451/1036 1735/2490/1036 +f 1066/2844/1037 1059/2953/1037 2051/2333/1037 1799/2556/1037 +f 1073/2774/1038 1055/2954/1038 2047/1739/1038 1863/2492/1038 +f 2303/2872/1039 2304/2955/1039 2043/1447/1039 1733/2580/1039 +f 2299/2691/1040 2305/2956/1040 2039/2341/1040 1797/2494/1040 +f 2301/2816/1041 2306/2957/1041 2035/1720/1041 1861/2532/1041 +f 1500/2714/1042 1497/2958/1042 2031/1443/1042 1731/2496/1042 +f 1498/2846/1043 1496/2959/1043 2027/2349/1043 1795/2554/1043 +f 1502/2699/1044 1495/2960/1044 2023/1701/1044 1859/2498/1044 +f 1509/2874/1045 1508/2961/1045 2019/1439/1045 1729/2578/1045 +f 1513/2744/1046 1507/2962/1046 2015/2357/1046 1793/2500/1046 +f 1511/2818/1047 1506/2963/1047 2011/1682/1047 1857/2504/1047 +f 1524/2712/1048 1519/2964/1048 2007/1435/1048 1727/2502/1048 +f 1520/2848/1049 1518/2965/1049 2003/2365/1049 1791/2506/1049 +f 1522/2772/1050 1517/2966/1050 1999/1663/1050 1855/2530/1050 +f 1491/2711/1051 1486/2967/1051 1995/1431/1051 1725/2510/1051 +f 1489/2742/1052 1485/2968/1052 1991/2373/1052 1789/2552/1052 +f 1487/2820/1053 1484/2969/1053 1987/1644/1053 1853/2508/1053 +f 1476/2876/1054 1475/2970/1054 1983/1427/1054 1723/2576/1054 +f 1480/2740/1055 1474/2971/1055 1979/2381/1055 1787/2512/1055 +f 1478/2770/1056 1473/2972/1056 1975/1625/1056 1851/2528/1056 +f 1469/2681/1057 1464/2973/1057 1971/1423/1057 1721/2514/1057 +f 1465/2850/1058 1463/2974/1058 1967/2389/1058 1785/2404/1058 +f 1467/2768/1059 1462/2975/1059 1963/1606/1059 1849/2518/1059 +f 1428/2976/1060 1420/2890/1060 1938/1548/1060 1715/1547/1060 +f 1435/2735/1061 1439/2977/1061 1528/1550/1061 1913/1549/1061 +f 1431/2877/1062 1433/2978/1062 1916/2979/1062 1915/2980/1062 +f 1441/2882/1063 1448/2733/1063 1932/2410/1063 1931/2409/1063 +f 1442/2879/1064 1450/2981/1064 1534/2131/1064 1935/2526/1064 +f 1422/2853/1065 1419/2892/1065 1942/2394/1065 1937/2393/1065 +f 1426/2696/1066 1418/2894/1066 1946/2172/1066 1941/2401/1066 +f 1437/2706/1067 1430/2982/1067 1918/2402/1067 1921/2171/1067 +f 1440/2885/1068 1446/2765/1068 1928/2144/1068 1927/2143/1068 +f 1429/2883/1069 1438/2983/1069 1531/2984/1069 1923/2884/1069 +f 1449/2603/1070 1444/2795/1070 1924/2148/1070 1538/2147/1070 +f 1424/2797/1071 1427/2678/1071 1717/1559/1071 1945/2137/1071 +f 1460/2606/1072 1457/2793/1072 1948/1579/1072 1544/1578/1072 +f 1451/2888/1073 1459/2763/1073 1952/2400/1073 1951/2399/1073 +f 1452/2887/1074 1455/2851/1074 1956/1540/1074 1955/1539/1074 +f 1453/2886/1075 1461/2605/1075 1540/1543/1075 1959/1572/1075 +f 1417/2674/1076 1415/2688/1076 2292/2111/1076 1709/2110/1076 +f 1409/2889/1077 1411/2825/1077 2288/2156/1077 2295/2155/1077 +f 1408/2891/1078 1413/2791/1078 2284/2160/1078 2291/2159/1078 +f 1407/2893/1079 1416/2675/1079 1711/2120/1079 2287/2119/1079 +f 1471/2608/1080 1462/2975/1080 1962/1594/1080 1550/1593/1080 +f 1468/2767/1081 1463/2974/1081 1966/2166/1081 1961/2165/1081 +f 1466/2849/1082 1464/2973/1082 1970/1422/1082 1965/1421/1082 +f 1470/2680/1083 1472/2985/1083 1546/1415/1083 1969/1587/1083 +f 1482/2611/1084 1473/2972/1084 1974/1609/1084 1556/1608/1084 +f 1479/2769/1085 1474/2971/1085 1978/2392/1085 1973/2391/1085 +f 1481/2739/1086 1475/2970/1086 1982/1426/1086 1977/1425/1086 +f 1477/2875/1087 1483/2610/1087 1552/1533/1087 1981/1602/1087 +f 1493/2613/1088 1484/2969/1088 1986/1628/1088 1562/1627/1088 +f 1488/2819/1089 1485/2968/1089 1990/2384/1089 1985/2383/1089 +f 1490/2741/1090 1486/2967/1090 1994/1430/1090 1989/1429/1090 +f 1492/2710/1091 1494/2986/1091 1558/1619/1091 1993/1618/1091 +f 1526/2615/1092 1517/2966/1092 1998/1647/1092 1568/1646/1092 +f 1523/2771/1093 1518/2965/1093 2002/2376/1093 1997/2375/1093 +f 1521/2847/1094 1519/2964/1094 2006/1434/1094 2001/1433/1094 +f 1525/2176/1095 1527/2175/1095 1564/1638/1095 2005/1637/1095 +f 1515/2617/1096 1506/2963/1096 2010/1666/1096 1574/1665/1096 +f 1512/2817/1097 1507/2962/1097 2014/2368/1097 2009/2367/1097 +f 1514/2743/1098 1508/2961/1098 2018/1438/1098 2013/1437/1098 +f 1510/2873/1099 1516/2987/1099 1570/1657/1099 2017/1656/1099 +f 1504/2620/1100 1495/2960/1100 2022/1685/1100 1580/1684/1100 +f 1503/2698/1101 1496/2959/1101 2026/2360/1101 2021/2359/1101 +f 1499/2845/1102 1497/2958/1102 2030/1442/1102 2025/1441/1102 +f 1501/2713/1103 1505/2619/1103 1576/1676/1103 2029/1675/1103 +f 2297/2622/1104 2306/2957/1104 2034/1704/1104 1586/1703/1104 +f 2300/2815/1105 2305/2956/1105 2038/2352/1105 2033/2351/1105 +f 2298/2690/1106 2304/2955/1106 2042/1446/1106 2037/1445/1106 +f 2302/2871/1107 2296/2988/1107 1582/1695/1107 2041/1694/1107 +f 1087/2625/1108 1055/2954/1108 2046/1723/1108 1592/1722/1108 +f 1076/2773/1109 1059/2953/1109 2050/2344/1109 2045/2343/1109 +f 1069/2843/1110 1062/2952/1110 2054/1450/1110 2049/1449/1110 +f 1083/2682/1111 1090/2624/1111 1588/1714/1111 2053/1713/1111 +f 1125/2627/1112 1094/2951/1112 2058/1742/1112 1598/1741/1112 +f 1115/2775/1113 1097/2950/1113 2062/2336/1113 2057/2335/1113 +f 1122/2745/1114 1101/2949/1114 2066/1454/1114 2061/1453/1114 +f 1108/2869/1115 1129/2989/1115 1594/1733/1115 2065/1732/1115 +f 1164/2630/1116 1132/2948/1116 2070/1761/1116 1604/1760/1116 +f 1146/2813/1117 1136/2947/1117 2074/2328/1117 2069/2327/1117 +f 1153/2747/1118 1139/2946/1118 2078/1458/1118 2073/1457/1118 +f 1160/2715/1119 1167/2629/1119 1600/1752/1119 2077/1751/1119 +f 1202/2632/1120 1171/2945/1120 2082/1780/1120 1610/1779/1120 +f 1192/2777/1121 1174/2944/1121 2086/2320/1121 2081/2319/1121 +f 1185/2841/1122 1178/2943/1122 2090/1462/1122 2085/1461/1122 +f 1199/2717/1123 1206/2990/1123 1606/1771/1123 2089/1770/1123 +f 1240/2635/1124 1209/2942/1124 2094/1799/1124 1616/1798/1124 +f 1230/2811/1125 1213/2941/1125 2098/2312/1125 2093/2311/1125 +f 1237/2749/1126 1216/2940/1126 2102/1466/1126 2097/1465/1126 +f 1223/2867/1127 1241/2634/1127 1612/1790/1127 2101/1789/1127 +f 1251/2637/1128 1242/2939/1128 2106/1818/1128 1622/1817/1128 +f 1250/2700/1129 1243/2938/1129 2110/2304/1129 2105/2303/1129 +f 1246/2839/1130 1244/2937/1130 2114/1470/1130 2109/1469/1130 +f 1248/2719/1131 1252/2991/1131 1618/1809/1131 2113/1808/1131 +f 1262/2640/1132 1253/2936/1132 2118/1837/1132 1628/1836/1132 +f 1259/2809/1133 1254/2935/1133 2122/2296/1133 2117/2295/1133 +f 1261/2692/1134 1255/2934/1134 2126/1474/1134 2121/1473/1134 +f 1257/2865/1135 1263/2639/1135 1624/1828/1135 2125/1827/1135 +f 1273/2642/1136 1264/2933/1136 2130/1856/1136 1634/1855/1136 +f 1270/2779/1137 1265/2932/1137 2134/2288/1137 2129/2287/1137 +f 1268/2837/1138 1266/2931/1138 2138/1478/1138 2133/1477/1138 +f 1272/2684/1139 1274/2992/1139 1630/1847/1139 2137/1846/1139 +f 1284/2645/1140 1275/2930/1140 2142/1875/1140 1640/1874/1140 +f 1281/2781/1141 1276/2929/1141 2146/2280/1141 2141/2279/1141 +f 1283/2751/1142 1277/2928/1142 2150/1482/1142 2145/1481/1142 +f 1279/2863/1143 1285/2644/1143 1636/1866/1143 2149/1865/1143 +f 1295/2647/1144 1286/2927/1144 2154/1894/1144 1646/1893/1144 +f 1290/2807/1145 1287/2926/1145 2158/2272/1145 2153/2271/1145 +f 1292/2753/1146 1288/2925/1146 2162/1486/1146 2157/1485/1146 +f 1294/2721/1147 1296/2993/1147 1642/1885/1147 2161/1884/1147 +f 1306/2650/1148 1297/2924/1148 2166/1913/1148 1652/1912/1148 +f 1303/2783/1149 1298/2923/1149 2170/2264/1149 2165/2263/1149 +f 1301/2835/1150 1299/2922/1150 2174/1490/1150 2169/1489/1150 +f 1305/2723/1151 1307/2649/1151 1648/1904/1151 2173/1903/1151 +f 1317/2652/1152 1308/2921/1152 2178/1932/1152 1658/1931/1152 +f 1314/2805/1153 1309/2920/1153 2182/2256/1153 2177/2255/1153 +f 1316/2755/1154 1310/2919/1154 2186/1494/1154 2181/1493/1154 +f 1312/2861/1155 1318/2994/1155 1654/1923/1155 2185/1922/1155 +f 1328/2655/1156 1319/2918/1156 2190/1951/1156 1664/1950/1156 +f 1327/2702/1157 1320/2917/1157 2194/2248/1157 2189/2247/1157 +f 1323/2833/1158 1321/2916/1158 2198/1498/1158 2193/1497/1158 +f 1325/2725/1159 1329/2654/1159 1660/1942/1159 2197/1941/1159 +f 1339/2657/1160 1330/2915/1160 2202/1970/1160 1670/1969/1160 +f 1336/2803/1161 1331/2914/1161 2206/2240/1161 2201/2239/1161 +f 1338/2694/1162 1332/2913/1162 2210/1502/1162 2205/1501/1162 +f 1334/2859/1163 1340/2995/1163 1666/1961/1163 2209/1960/1163 +f 1350/2660/1164 1341/2912/1164 2214/1989/1164 1676/1988/1164 +f 1347/2785/1165 1342/2911/1165 2218/2232/1165 2213/2231/1165 +f 1345/2831/1166 1343/2910/1166 2222/1506/1166 2217/1505/1166 +f 1349/2686/1167 1351/2659/1167 1672/1980/1167 2221/1979/1167 +f 1361/2662/1168 1352/2909/1168 2226/2008/1168 1682/2007/1168 +f 1358/2787/1169 1353/2908/1169 2230/2224/1169 2225/2223/1169 +f 1360/2757/1170 1354/2907/1170 2234/1510/1170 2229/1509/1170 +f 1356/2857/1171 1362/2996/1171 1678/1999/1171 2233/1998/1171 +f 1372/2665/1172 1363/2906/1172 2238/2027/1172 1688/2026/1172 +f 1367/2801/1173 1364/2905/1173 2242/2216/1173 2237/2215/1173 +f 1369/2759/1174 1365/2904/1174 2246/1514/1174 2241/1513/1174 +f 1371/2727/1175 1373/2664/1175 1684/2018/1175 2245/2017/1175 +f 1383/2667/1176 1374/2903/1176 2250/2046/1176 1694/2045/1176 +f 1380/2789/1177 1375/2902/1177 2254/2208/1177 2249/2207/1177 +f 1378/2829/1178 1376/2901/1178 2258/1518/1178 2253/1517/1178 +f 1382/2729/1179 1384/2997/1179 1690/2037/1179 2257/2036/1179 +f 1394/2670/1180 1385/2900/1180 2262/2065/1180 1700/2064/1180 +f 1391/2799/1181 1386/2899/1181 2266/2200/1181 2261/2199/1181 +f 1393/2761/1182 1387/2898/1182 2270/1522/1182 2265/1521/1182 +f 1389/2855/1183 1395/2669/1183 1696/2056/1183 2269/2055/1183 +f 1405/2672/1184 1396/2897/1184 2274/2084/1184 1706/2083/1184 +f 1404/2704/1185 1397/2896/1185 2278/2192/1185 2273/2191/1185 +f 1400/2827/1186 1398/2895/1186 2282/1526/1186 2277/1525/1186 +f 1402/2731/1187 1406/2998/1187 1702/2075/1187 2281/2074/1187 +f 1716/2677/1188 1715/1547/1188 1528/1550/1188 1530/2599/1188 1029/2134/1188 1236/2133/1188 +f 2000/1436/1189 2007/1435/1189 1519/2964/1189 1521/2847/1189 +f 1996/2366/1190 2003/2365/1190 1518/2965/1190 1523/2771/1190 +f 1567/1664/1191 1999/1663/1191 1517/2966/1191 1526/2615/1191 +f 1854/2507/1192 1998/1647/1192 1517/2966/1192 1522/2772/1192 +f 1790/2551/1193 2002/2376/1193 1518/2965/1193 1520/2848/1193 +f 1726/2509/1194 2006/1434/1194 1519/2964/1194 1524/2712/1194 +f 2001/1433/1195 1790/2551/1195 1520/2848/1195 1521/2847/1195 +f 1997/2375/1196 1854/2507/1196 1522/2772/1196 1523/2771/1196 +f 2005/1637/1197 1726/2509/1197 1524/2712/1197 1525/2176/1197 +f 2016/1674/1198 1571/1673/1198 1516/2987/1198 1510/2873/1198 +f 2012/1440/1199 2019/1439/1199 1508/2961/1199 1514/2743/1199 +f 2008/2358/1200 2015/2357/1200 1507/2962/1200 1512/2817/1200 +f 1573/1683/1201 2011/1682/1201 1506/2963/1201 1515/2617/1201 +f 1856/2529/1202 2010/1666/1202 1506/2963/1202 1511/2818/1202 +f 1792/2505/1203 2014/2368/1203 1507/2962/1203 1513/2744/1203 +f 1728/2501/1204 2018/1438/1204 1508/2961/1204 1509/2874/1204 +f 2017/1656/1205 1728/2501/1205 1509/2874/1205 1510/2873/1205 +f 2009/2367/1206 1856/2529/1206 1511/2818/1206 1512/2817/1206 +f 2013/1437/1207 1792/2505/1207 1513/2744/1207 1514/2743/1207 +f 2028/1693/1208 1577/1692/1208 1505/2619/1208 1501/2713/1208 +f 2024/1444/1209 2031/1443/1209 1497/2958/1209 1499/2845/1209 +f 2020/2350/1210 2027/2349/1210 1496/2959/1210 1503/2698/1210 +f 1579/1702/1211 2023/1701/1211 1495/2960/1211 1504/2620/1211 +f 1858/2503/1212 2022/1685/1212 1495/2960/1212 1502/2699/1212 +f 1794/2499/1213 2026/2360/1213 1496/2959/1213 1498/2846/1213 +f 1730/2577/1214 2030/1442/1214 1497/2958/1214 1500/2714/1214 +f 2025/1441/1215 1794/2499/1215 1498/2846/1215 1499/2845/1215 +f 2029/1675/1216 1730/2577/1216 1500/2714/1216 1501/2713/1216 +f 2021/2359/1217 1858/2503/1217 1502/2699/1217 1503/2698/1217 +f 1992/1636/1218 1559/1635/1218 1494/2986/1218 1492/2710/1218 +f 1988/1432/1219 1995/1431/1219 1486/2967/1219 1490/2741/1219 +f 1984/2374/1220 1991/2373/1220 1485/2968/1220 1488/2819/1220 +f 1561/1645/1221 1987/1644/1221 1484/2969/1221 1493/2613/1221 +f 1852/2527/1222 1986/1628/1222 1484/2969/1222 1487/2820/1222 +f 1788/2511/1223 1990/2384/1223 1485/2968/1223 1489/2742/1223 +f 1724/2575/1224 1994/1430/1224 1486/2967/1224 1491/2711/1224 +f 1985/2383/1225 1852/2527/1225 1487/2820/1225 1488/2819/1225 +f 1989/1429/1226 1788/2511/1226 1489/2742/1226 1490/2741/1226 +f 1993/1618/1227 1724/2575/1227 1491/2711/1227 1492/2710/1227 +f 1980/1617/1228 1553/1616/1228 1483/2610/1228 1477/2875/1228 +f 1976/1428/1229 1983/1427/1229 1475/2970/1229 1481/2739/1229 +f 1972/2382/1230 1979/2381/1230 1474/2971/1230 1479/2769/1230 +f 1555/1626/1231 1975/1625/1231 1473/2972/1231 1482/2611/1231 +f 1850/2517/1232 1974/1609/1232 1473/2972/1232 1478/2770/1232 +f 1786/2403/1233 1978/2392/1233 1474/2971/1233 1480/2740/1233 +f 1722/2513/1234 1982/1426/1234 1475/2970/1234 1476/2876/1234 +f 1981/1602/1235 1722/2513/1235 1476/2876/1235 1477/2875/1235 +f 1973/2391/1236 1850/2517/1236 1478/2770/1236 1479/2769/1236 +f 1977/1425/1237 1786/2403/1237 1480/2740/1237 1481/2739/1237 +f 1968/1601/1238 1547/1532/1238 1472/2985/1238 1470/2680/1238 +f 1964/1424/1239 1971/1423/1239 1464/2973/1239 1466/2849/1239 +f 1960/2390/1240 1967/2389/1240 1463/2974/1240 1468/2767/1240 +f 1549/1607/1241 1963/1606/1241 1462/2975/1241 1471/2608/1241 +f 1848/2405/1242 1962/1594/1242 1462/2975/1242 1467/2768/1242 +f 1784/2516/1243 1966/2166/1243 1463/2974/1243 1465/2850/1243 +f 1720/2168/1244 1970/1422/1244 1464/2973/1244 1469/2681/1244 +f 1965/1421/1245 1784/2516/1245 1465/2850/1245 1466/2849/1245 +f 1961/2165/1246 1848/2405/1246 1467/2768/1246 1468/2767/1246 +f 1969/1587/1247 1720/2168/1247 1469/2681/1247 1470/2680/1247 +f 1958/1586/1248 1541/1414/1248 1461/2605/1248 1453/2886/1248 +f 1954/1420/1249 1957/1419/1249 1455/2851/1249 1452/2887/1249 +f 1950/2164/1250 1953/2163/1250 1459/2763/1250 1451/2888/1250 +f 1543/1592/1251 1949/1591/1251 1457/2793/1251 1460/2606/1251 +f 1906/2406/1252 1950/2164/1252 1451/2888/1252 1456/2794/1252 +f 1842/2515/1253 1954/1420/1253 1452/2887/1253 1458/2764/1253 +f 1778/2167/1254 1958/1586/1254 1453/2886/1254 1454/2852/1254 +f 1957/1419/1255 1778/2167/1255 1454/2852/1255 1455/2851/1255 +f 1949/1591/1256 1906/2406/1256 1456/2794/1256 1457/2793/1256 +f 1953/2163/1257 1842/2515/1257 1458/2764/1257 1459/2763/1257 +f 1537/1577/1258 1925/1576/1258 1444/2795/1258 1449/2603/1258 +f 1926/2398/1259 1929/2397/1259 1446/2765/1259 1440/2885/1259 +f 1934/1571/1260 1535/1542/1260 1450/2981/1260 1442/2879/1260 +f 1930/1538/1261 1933/1537/1261 1448/2733/1261 1441/2882/1261 +f 1908/2422/1262 1926/2398/1262 1440/2885/1262 1443/2796/1262 +f 1844/2522/1263 1930/1538/1263 1441/2882/1263 1445/2766/1263 +f 1780/2418/1264 1934/1571/1264 1442/2879/1264 1447/2734/1264 +f 1925/1576/1265 1908/2422/1265 1443/2796/1265 1444/2795/1265 +f 1929/2397/1266 1844/2522/1266 1445/2766/1266 1446/2765/1266 +f 1933/1537/1267 1780/2418/1267 1447/2734/1267 1448/2733/1267 +f 1922/2138/1268 1532/1558/1268 1438/2983/1268 1429/2883/1268 +f 1920/2999/1269 1919/3000/1269 1430/2982/1269 1437/2706/1269 +f 1914/2396/1270 1917/2395/1270 1433/2978/1270 1431/2877/1270 +f 1912/2738/1271 1529/3001/1271 1439/2977/1271 1435/2735/1271 +f 1910/2170/1272 1922/2138/1272 1429/2883/1272 1436/2707/1272 +f 1846/2420/1273 1918/2402/1273 1430/2880/1273 1432/2822/1273 +f 1782/2574/1274 1914/2396/1274 1431/2877/1274 1434/2736/1274 +f 1917/2395/1275 1846/2420/1275 1432/2822/1275 1433/2821/1275 +f 1913/1549/1276 1782/2574/1276 1434/2736/1276 1435/2735/1276 +f 1921/2171/1277 1910/2170/1277 1436/2707/1277 1437/2706/1277 +f 1944/2122/1278 1718/2121/1278 1427/2678/1278 1424/2797/1278 +f 1940/2162/1279 1947/2161/1279 1418/2894/1279 1426/2696/1279 +f 1936/2158/1280 1943/2157/1280 1419/2892/1280 1422/2853/1280 +f 1714/2113/1281 1939/2112/1281 1420/2890/1281 1428/2976/1281 +f 1902/2169/1282 1946/2172/1282 1418/2894/1282 1423/2798/1282 +f 1838/2419/1283 1942/2394/1283 1419/2892/1283 1425/2697/1283 +f 1774/2573/1284 1938/1548/1284 1420/2890/1284 1421/2854/1284 +f 1937/2393/1285 1774/2573/1285 1421/2854/1285 1422/2853/1285 +f 1945/2137/1286 1902/2169/1286 1423/2798/1286 1424/2797/1286 +f 1941/2401/1287 1838/2419/1287 1425/2697/1287 1426/2696/1287 +f 2286/2103/1288 1712/2102/1288 1416/2675/1288 1407/2893/1288 +f 2290/2184/1289 2285/2183/1289 1413/2791/1289 1408/2891/1289 +f 2294/1530/1290 2289/1529/1290 1411/2825/1290 1409/2889/1290 +f 1708/2094/1291 2293/2093/1291 1415/2688/1291 1417/2674/1291 +f 1904/2425/1292 2286/2103/1292 1407/2893/1292 1412/2792/1292 +f 1840/2571/1293 2290/2184/1293 1408/2891/1293 1410/2826/1293 +f 1776/2423/1294 2294/1530/1294 1409/2889/1294 1414/2689/1294 +f 2289/1529/1295 1840/2571/1295 1410/2826/1295 1411/2825/1295 +f 2285/2183/1296 1904/2425/1296 1412/2792/1296 1413/2791/1296 +f 2293/2093/1297 1776/2423/1297 1414/2689/1297 1415/2688/1297 +f 2280/2092/1298 1703/2091/1298 1406/2998/1298 1402/2731/1298 +f 2276/1528/1299 2283/1527/1299 1398/2895/1299 1400/2827/1299 +f 2272/2182/1300 2279/2181/1300 1397/2896/1300 1404/2704/1300 +f 1705/2101/1301 2275/2100/1301 1396/2897/1301 1405/2672/1301 +f 1900/2431/1302 2274/2084/1302 1396/2897/1302 1403/2705/1302 +f 1836/2427/1303 2278/2192/1303 1397/2896/1303 1399/2828/1303 +f 1772/2595/1304 2282/1526/1304 1398/2895/1304 1401/2732/1304 +f 2277/1525/1305 1836/2427/1305 1399/2828/1305 1400/2827/1305 +f 2281/2074/1306 1772/2595/1306 1401/2732/1306 1402/2731/1306 +f 2273/2191/1307 1900/2431/1307 1403/2705/1307 1404/2704/1307 +f 2268/2073/1308 1697/2072/1308 1395/2669/1308 1389/2855/1308 +f 2264/1524/1309 2271/1523/1309 1387/2898/1309 1393/2761/1309 +f 2260/2190/1310 2267/2189/1310 1386/2899/1310 1391/2799/1310 +f 1699/2082/1311 2263/2081/1311 1385/2900/1311 1394/2670/1311 +f 1898/2547/1312 2262/2065/1312 1385/2900/1312 1390/2800/1312 +f 1834/2433/1313 2266/2200/1313 1386/2899/1313 1392/2762/1313 +f 1770/2429/1314 2270/1522/1314 1387/2898/1314 1388/2856/1314 +f 2269/2055/1315 1770/2429/1315 1388/2856/1315 1389/2855/1315 +f 2261/2199/1316 1898/2547/1316 1390/2800/1316 1391/2799/1316 +f 2265/1521/1317 1834/2433/1317 1392/2762/1317 1393/2761/1317 +f 2256/2054/1318 1691/2053/1318 1384/2997/1318 1382/2729/1318 +f 2252/1520/1319 2259/1519/1319 1376/2901/1319 1378/2829/1319 +f 2248/2198/1320 2255/2197/1320 1375/2902/1320 1380/2789/1320 +f 1693/2063/1321 2251/2062/1321 1374/2903/1321 1383/2667/1321 +f 1896/2435/1322 2250/2046/1322 1374/2903/1322 1379/2790/1322 +f 1832/2569/1323 2254/2208/1323 1375/2902/1323 1377/2830/1323 +f 1768/2437/1324 2258/1518/1324 1376/2901/1324 1381/2730/1324 +f 2253/1517/1325 1832/2569/1325 1377/2830/1325 1378/2829/1325 +f 2249/2207/1326 1896/2435/1326 1379/2790/1326 1380/2789/1326 +f 2257/2036/1327 1768/2437/1327 1381/2730/1327 1382/2729/1327 +f 2244/2035/1328 1685/2034/1328 1373/2664/1328 1371/2727/1328 +f 2240/1516/1329 2247/1515/1329 1365/2904/1329 1369/2759/1329 +f 2236/2206/1330 2243/2205/1330 1364/2905/1330 1367/2801/1330 +f 1687/2044/1331 2239/2043/1331 1363/2906/1331 1372/2665/1331 +f 1894/2545/1332 2238/2027/1332 1363/2906/1332 1366/2802/1332 +f 1830/2439/1333 2242/2216/1333 1364/2905/1333 1368/2760/1333 +f 1766/2593/1334 2246/1514/1334 1365/2904/1334 1370/2728/1334 +f 2237/2215/1335 1894/2545/1335 1366/2802/1335 1367/2801/1335 +f 2241/1513/1336 1830/2439/1336 1368/2760/1336 1369/2759/1336 +f 2245/2017/1337 1766/2593/1337 1370/2728/1337 1371/2727/1337 +f 2232/2016/1338 1679/2015/1338 1362/2996/1338 1356/2857/1338 +f 2228/1512/1339 2235/1511/1339 1354/2907/1339 1360/2757/1339 +f 2224/2214/1340 2231/2213/1340 1353/2908/1340 1358/2787/1340 +f 1681/2025/1341 2227/2024/1341 1352/2909/1341 1361/2662/1341 +f 1892/2443/1342 2226/2008/1342 1352/2909/1342 1357/2788/1342 +f 1828/2567/1343 2230/2224/1343 1353/2908/1343 1359/2758/1343 +f 1764/2441/1344 2234/1510/1344 1354/2907/1344 1355/2858/1344 +f 2233/1998/1345 1764/2441/1345 1355/2858/1345 1356/2857/1345 +f 2225/2223/1346 1892/2443/1346 1357/2788/1346 1358/2787/1346 +f 2229/1509/1347 1828/2567/1347 1359/2758/1347 1360/2757/1347 +f 2220/1997/1348 1673/1996/1348 1351/2659/1348 1349/2686/1348 +f 2216/1508/1349 2223/1507/1349 1343/2910/1349 1345/2831/1349 +f 2212/2222/1350 2219/2221/1350 1342/2911/1350 1347/2785/1350 +f 1675/2006/1351 2215/2005/1351 1341/2912/1351 1350/2660/1351 +f 1890/2543/1352 2214/1989/1352 1341/2912/1352 1346/2786/1352 +f 1826/2445/1353 2218/2232/1353 1342/2911/1353 1344/2832/1353 +f 1762/2591/1354 2222/1506/1354 1343/2910/1354 1348/2687/1354 +f 2217/1505/1355 1826/2445/1355 1344/2832/1355 1345/2831/1355 +f 2213/2231/1356 1890/2543/1356 1346/2786/1356 1347/2785/1356 +f 2221/1979/1357 1762/2591/1357 1348/2687/1357 1349/2686/1357 +f 2208/1978/1358 1667/1977/1358 1340/2995/1358 1334/2859/1358 +f 2204/1504/1359 2211/1503/1359 1332/2913/1359 1338/2694/1359 +f 2200/2230/1360 2207/2229/1360 1331/2914/1360 1336/2803/1360 +f 1669/1987/1361 2203/1986/1361 1330/2915/1361 1339/2657/1361 +f 1888/2449/1362 2202/1970/1362 1330/2915/1362 1335/2804/1362 +f 1824/2565/1363 2206/2240/1363 1331/2914/1363 1337/2695/1363 +f 1760/2447/1364 2210/1502/1364 1332/2913/1364 1333/2860/1364 +f 2209/1960/1365 1760/2447/1365 1333/2860/1365 1334/2859/1365 +f 2201/2239/1366 1888/2449/1366 1335/2804/1366 1336/2803/1366 +f 2205/1501/1367 1824/2565/1367 1337/2695/1367 1338/2694/1367 +f 2196/1959/1368 1661/1958/1368 1329/2654/1368 1325/2725/1368 +f 2192/1500/1369 2199/1499/1369 1321/2916/1369 1323/2833/1369 +f 2188/2238/1370 2195/2237/1370 1320/2917/1370 1327/2702/1370 +f 1663/1968/1371 2191/1967/1371 1319/2918/1371 1328/2655/1371 +f 1886/2455/1372 2190/1951/1372 1319/2918/1372 1326/2703/1372 +f 1822/2451/1373 2194/2248/1373 1320/2917/1373 1322/2834/1373 +f 1758/2589/1374 2198/1498/1374 1321/2916/1374 1324/2726/1374 +f 2193/1497/1375 1822/2451/1375 1322/2834/1375 1323/2833/1375 +f 2197/1941/1376 1758/2589/1376 1324/2726/1376 1325/2725/1376 +f 2189/2247/1377 1886/2455/1377 1326/2703/1377 1327/2702/1377 +f 2184/1940/1378 1655/1939/1378 1318/2994/1378 1312/2861/1378 +f 2180/1496/1379 2187/1495/1379 1310/2919/1379 1316/2755/1379 +f 2176/2246/1380 2183/2245/1380 1309/2920/1380 1314/2805/1380 +f 1657/1949/1381 2179/1948/1381 1308/2921/1381 1317/2652/1381 +f 1884/2541/1382 2178/1932/1382 1308/2921/1382 1313/2806/1382 +f 1820/2457/1383 2182/2256/1383 1309/2920/1383 1315/2756/1383 +f 1756/2453/1384 2186/1494/1384 1310/2919/1384 1311/2862/1384 +f 2185/1922/1385 1756/2453/1385 1311/2862/1385 1312/2861/1385 +f 2177/2255/1386 1884/2541/1386 1313/2806/1386 1314/2805/1386 +f 2181/1493/1387 1820/2457/1387 1315/2756/1387 1316/2755/1387 +f 2172/1921/1388 1649/1920/1388 1307/2649/1388 1305/2723/1388 +f 2168/1492/1389 2175/1491/1389 1299/2922/1389 1301/2835/1389 +f 2164/2254/1390 2171/2253/1390 1298/2923/1390 1303/2783/1390 +f 1651/1930/1391 2167/1929/1391 1297/2924/1391 1306/2650/1391 +f 1882/2459/1392 2166/1913/1392 1297/2924/1392 1302/2784/1392 +f 1818/2563/1393 2170/2264/1393 1298/2923/1393 1300/2836/1393 +f 1754/2461/1394 2174/1490/1394 1299/2922/1394 1304/2724/1394 +f 2169/1489/1395 1818/2563/1395 1300/2836/1395 1301/2835/1395 +f 2165/2263/1396 1882/2459/1396 1302/2784/1396 1303/2783/1396 +f 2173/1903/1397 1754/2461/1397 1304/2724/1397 1305/2723/1397 +f 2160/1902/1398 1643/1901/1398 1296/2993/1398 1294/2721/1398 +f 2156/1488/1399 2163/1487/1399 1288/2925/1399 1292/2753/1399 +f 2152/2262/1400 2159/2261/1400 1287/2926/1400 1290/2807/1400 +f 1645/1911/1401 2155/1910/1401 1286/2927/1401 1295/2647/1401 +f 1880/2539/1402 2154/1894/1402 1286/2927/1402 1289/2808/1402 +f 1816/2463/1403 2158/2272/1403 1287/2926/1403 1291/2754/1403 +f 1752/2587/1404 2162/1486/1404 1288/2925/1404 1293/2722/1404 +f 2153/2271/1405 1880/2539/1405 1289/2808/1405 1290/2807/1405 +f 2157/1485/1406 1816/2463/1406 1291/2754/1406 1292/2753/1406 +f 2161/1884/1407 1752/2587/1407 1293/2722/1407 1294/2721/1407 +f 2148/1883/1408 1637/1882/1408 1285/2644/1408 1279/2863/1408 +f 2144/1484/1409 2151/1483/1409 1277/2928/1409 1283/2751/1409 +f 2140/2270/1410 2147/2269/1410 1276/2929/1410 1281/2781/1410 +f 1639/1892/1411 2143/1891/1411 1275/2930/1411 1284/2645/1411 +f 1878/2467/1412 2142/1875/1412 1275/2930/1412 1280/2782/1412 +f 1814/2561/1413 2146/2280/1413 1276/2929/1413 1282/2752/1413 +f 1750/2465/1414 2150/1482/1414 1277/2928/1414 1278/2864/1414 +f 2149/1865/1415 1750/2465/1415 1278/2864/1415 1279/2863/1415 +f 2141/2279/1416 1878/2467/1416 1280/2782/1416 1281/2781/1416 +f 2145/1481/1417 1814/2561/1417 1282/2752/1417 1283/2751/1417 +f 2136/1864/1418 1631/1863/1418 1274/2992/1418 1272/2684/1418 +f 2132/1480/1419 2139/1479/1419 1266/2931/1419 1268/2837/1419 +f 2128/2278/1420 2135/2277/1420 1265/2932/1420 1270/2779/1420 +f 1633/1873/1421 2131/1872/1421 1264/2933/1421 1273/2642/1421 +f 1876/2537/1422 2130/1856/1422 1264/2933/1422 1269/2780/1422 +f 1812/2469/1423 2134/2288/1423 1265/2932/1423 1267/2838/1423 +f 1748/2585/1424 2138/1478/1424 1266/2931/1424 1271/2685/1424 +f 2133/1477/1425 1812/2469/1425 1267/2838/1425 1268/2837/1425 +f 2129/2287/1426 1876/2537/1426 1269/2780/1426 1270/2779/1426 +f 2137/1846/1427 1748/2585/1427 1271/2685/1427 1272/2684/1427 +f 2124/1845/1428 1625/1844/1428 1263/2639/1428 1257/2865/1428 +f 2120/1476/1429 2127/1475/1429 1255/2934/1429 1261/2692/1429 +f 2116/2286/1430 2123/2285/1430 1254/2935/1430 1259/2809/1430 +f 1627/1854/1431 2119/1853/1431 1253/2936/1431 1262/2640/1431 +f 1874/2473/1432 2118/1837/1432 1253/2936/1432 1258/2810/1432 +f 1810/2559/1433 2122/2296/1433 1254/2935/1433 1260/2693/1433 +f 1746/2471/1434 2126/1474/1434 1255/2934/1434 1256/2866/1434 +f 2125/1827/1435 1746/2471/1435 1256/2866/1435 1257/2865/1435 +f 2117/2295/1436 1874/2473/1436 1258/2810/1436 1259/2809/1436 +f 2121/1473/1437 1810/2559/1437 1260/2693/1437 1261/2692/1437 +f 2112/1826/1438 1619/1825/1438 1252/2991/1438 1248/2719/1438 +f 2108/1472/1439 2115/1471/1439 1244/2937/1439 1246/2839/1439 +f 2104/2294/1440 2111/2293/1440 1243/2938/1440 1250/2700/1440 +f 1621/1835/1441 2107/1834/1441 1242/2939/1441 1251/2637/1441 +f 1872/2479/1442 2106/1818/1442 1242/2939/1442 1249/2701/1442 +f 1808/2475/1443 2110/2304/1443 1243/2938/1443 1245/2840/1443 +f 1744/2583/1444 2114/1470/1444 1244/2937/1444 1247/2720/1444 +f 2109/1469/1445 1808/2475/1445 1245/2840/1445 1246/2839/1445 +f 2113/1808/1446 1744/2583/1446 1247/2720/1446 1248/2719/1446 +f 2105/2303/1447 1872/2479/1447 1249/2701/1447 1250/2700/1447 +f 2100/1807/1448 1613/1806/1448 1241/2634/1448 1223/2867/1448 +f 2096/1468/1449 2103/1467/1449 1216/2940/1449 1237/2749/1449 +f 2092/2302/1450 2099/2301/1450 1213/2941/1450 1230/2811/1450 +f 1615/1816/1451 2095/1815/1451 1209/2942/1451 1240/2635/1451 +f 1870/2535/1452 2094/1799/1452 1209/2942/1452 1227/2812/1452 +f 1806/2481/1453 2098/2312/1453 1213/2941/1453 1234/2750/1453 +f 1742/2477/1454 2102/1466/1454 1216/2940/1454 1220/2868/1454 +f 2101/1789/1455 1742/2477/1455 1220/2868/1455 1223/2867/1455 +f 2093/2311/1456 1870/2535/1456 1227/2812/1456 1230/2811/1456 +f 2097/1465/1457 1806/2481/1457 1234/2750/1457 1237/2749/1457 +f 2088/1788/1458 1607/1787/1458 1206/2990/1458 1199/2717/1458 +f 2084/1464/1459 2091/1463/1459 1178/2943/1459 1185/2841/1459 +f 2080/2310/1460 2087/2309/1460 1174/2944/1460 1192/2777/1460 +f 1609/1797/1461 2083/1796/1461 1171/2945/1461 1202/2632/1461 +f 1868/2483/1462 2082/1780/1462 1171/2945/1462 1188/2778/1462 +f 1804/2557/1463 2086/2320/1463 1174/2944/1463 1181/2842/1463 +f 1740/2485/1464 2090/1462/1464 1178/2943/1464 1195/2718/1464 +f 2085/1461/1465 1804/2557/1465 1181/2842/1465 1185/2841/1465 +f 2081/2319/1466 1868/2483/1466 1188/2778/1466 1192/2777/1466 +f 2089/1770/1467 1740/2485/1467 1195/2718/1467 1199/2717/1467 +f 2076/1769/1468 1601/1768/1468 1167/2629/1468 1160/2715/1468 +f 2072/1460/1469 2079/1459/1469 1139/2946/1469 1153/2747/1469 +f 2068/2318/1470 2075/2317/1470 1136/2947/1470 1146/2813/1470 +f 1603/1778/1471 2071/1777/1471 1132/2948/1471 1164/2630/1471 +f 1866/2533/1472 2070/1761/1472 1132/2948/1472 1143/2814/1472 +f 1802/2487/1473 2074/2328/1473 1136/2947/1473 1150/2748/1473 +f 1738/2581/1474 2078/1458/1474 1139/2946/1474 1157/2716/1474 +f 2069/2327/1475 1866/2533/1475 1143/2814/1475 1146/2813/1475 +f 2073/1457/1476 1802/2487/1476 1150/2748/1476 1153/2747/1476 +f 2077/1751/1477 1738/2581/1477 1157/2716/1477 1160/2715/1477 +f 2064/1750/1478 1595/1749/1478 1129/2989/1478 1108/2869/1478 +f 2060/1456/1479 2067/1455/1479 1101/2949/1479 1122/2745/1479 +f 2056/2326/1480 2063/2325/1480 1097/2950/1480 1115/2775/1480 +f 1597/1759/1481 2059/1758/1481 1094/2951/1481 1125/2627/1481 +f 1864/2491/1482 2058/1742/1482 1094/2951/1482 1111/2776/1482 +f 1800/2555/1483 2062/2336/1483 1097/2950/1483 1118/2746/1483 +f 1736/2489/1484 2066/1454/1484 1101/2949/1484 1104/2870/1484 +f 2065/1732/1485 1736/2489/1485 1104/2870/1485 1108/2869/1485 +f 2057/2335/1486 1864/2491/1486 1111/2776/1486 1115/2775/1486 +f 2061/1453/1487 1800/2555/1487 1118/2746/1487 1122/2745/1487 +f 2052/1731/1488 1589/1730/1488 1090/2624/1488 1083/2682/1488 +f 2048/1452/1489 2055/1451/1489 1062/2952/1489 1069/2843/1489 +f 2044/2334/1490 2051/2333/1490 1059/2953/1490 1076/2773/1490 +f 1591/1740/1491 2047/1739/1491 1055/2954/1491 1087/2625/1491 +f 1862/2531/1492 2046/1723/1492 1055/2954/1492 1073/2774/1492 +f 1798/2493/1493 2050/2344/1493 1059/2953/1493 1066/2844/1493 +f 1734/2579/1494 2054/1450/1494 1062/2952/1494 1080/2683/1494 +f 2049/1449/1495 1798/2493/1495 1066/2844/1495 1069/2843/1495 +f 2045/2343/1496 1862/2531/1496 1073/2774/1496 1076/2773/1496 +f 2053/1713/1497 1734/2579/1497 1080/2683/1497 1083/2682/1497 +f 2040/1712/1498 1583/1711/1498 2296/2988/1498 2302/2871/1498 +f 2036/1448/1499 2043/1447/1499 2304/2955/1499 2298/2690/1499 +f 2032/2342/1500 2039/2341/1500 2305/2956/1500 2300/2815/1500 +f 1585/1721/1501 2035/1720/1501 2306/2957/1501 2297/2622/1501 +f 1860/2497/1502 2034/1704/1502 2306/2957/1502 2301/2816/1502 +f 1796/2553/1503 2038/2352/1503 2305/2956/1503 2299/2691/1503 +f 1732/2495/1504 2042/1446/1504 2304/2955/1504 2303/2872/1504 +f 2041/1694/1505 1732/2495/1505 2303/2872/1505 2302/2871/1505 +f 2033/2351/1506 1860/2497/1506 2301/2816/1506 2300/2815/1506 +f 2037/1445/1507 1796/2553/1507 2299/2691/1507 2298/2690/1507 +f 2445/3002/1508 2339/3003/1508 2308/1570/1508 2307/1569/1508 2444/3004/1508 +f 2446/3005/1509 2309/1585/1509 2308/1570/1509 2339/3003/1509 2420/3006/1509 +f 2312/1634/1510 2448/3007/1510 2426/671/1510 2340/670/1510 2313/1653/1510 +f 2450/3008/1511 2314/1672/1511 2313/1653/1511 2340/670/1511 2428/672/1511 +f 2317/1729/1512 2316/1710/1512 2452/3009/1512 2453/3010/1512 +f 2318/1748/1513 2317/1729/1513 2453/3010/1513 2455/3011/1513 +f 2319/1767/1514 2318/1748/1514 2455/3011/1514 2456/3012/1514 +f 2406/3013/1515 2322/1824/1515 2321/1805/1515 2458/3014/1515 +f 2459/3015/1516 2323/1843/1516 2322/1824/1516 2406/3013/1516 +f 2407/3016/1517 2326/1900/1517 2325/1881/1517 2408/3017/1517 +f 2409/3018/1518 2327/1919/1518 2326/1900/1518 2407/3016/1518 +f 2410/3019/1519 2328/1938/1519 2327/1919/1519 2409/3018/1519 +f 2412/3020/1520 2331/1995/1520 2330/1976/1520 2411/3021/1520 +f 2413/3022/1521 2332/2014/1521 2331/1995/1521 2412/3020/1521 +f 2414/3023/1522 2335/2071/1522 2334/2052/1522 2415/3024/1522 +f 2336/2090/1523 2335/2071/1523 2414/3023/1523 2416/674/1523 2341/673/1523 +f 2417/3025/1524 2337/2109/1524 2336/2090/1524 2341/673/1524 2418/676/1524 +f 2420/3006/309 2339/3003/309 2422/3026/309 +f 2443/3027/1525 2348/3028/1525 2441/3029/1525 2440/3030/1525 2442/3031/1525 2338/2128/1525 2337/2109/1525 2417/3025/1525 +f 2444/3004/1526 2307/1569/1526 2338/2128/1526 2442/3031/1526 2447/3032/1526 2349/3033/1526 2449/3034/1526 +f 2422/3026/309 2339/3003/309 2445/3002/309 +f 2482/3035/1527 2356/3036/1527 2481/3037/1527 2480/3038/1527 2333/2033/1527 2332/2014/1527 2413/3022/1527 +f 2486/3039/1528 2357/3040/1528 2483/3041/1528 2415/3024/1528 2334/2052/1528 2333/2033/1528 2480/3038/1528 2487/3042/1528 +f 2515/3043/1529 2364/3044/1529 2514/3045/1529 2512/3046/1529 2513/3047/1529 2329/1957/1529 2328/1938/1529 2410/3019/1529 +f 2513/3047/1530 2520/3048/1530 2365/3049/1530 2518/3050/1530 2411/3021/1530 2330/1976/1530 2329/1957/1530 +f 2544/3051/1531 2372/3052/1531 2541/3053/1531 2542/3054/1531 2324/1862/1531 2323/1843/1531 2459/3015/1531 +f 2546/3055/1532 2373/3056/1532 2547/3057/1532 2408/3017/1532 2325/1881/1532 2324/1862/1532 2542/3054/1532 2545/3058/1532 +f 2469/3059/1533 2380/3060/1533 2466/3061/1533 2468/3062/1533 2465/3063/1533 2320/1786/1533 2319/1767/1533 2456/3012/1533 +f 2321/1805/1534 2320/1786/1534 2465/3063/1534 2471/3064/1534 2381/3065/1534 2474/3066/1534 2458/3014/1534 +f 2499/3067/1535 2388/3068/1535 2497/3069/1535 2498/3070/1535 2315/1691/1535 2314/1672/1535 2450/3008/1535 +f 2504/3071/1536 2389/3072/1536 2501/3073/1536 2452/3009/1536 2316/1710/1536 2315/1691/1536 2498/3070/1536 2503/3074/1536 +f 2397/3075/1537 2396/3076/1537 2310/1600/1537 2309/1585/1537 2446/3005/1537 2523/3077/1537 +f 2530/3078/1538 2398/3079/1538 2526/3080/1538 2525/3081/1538 2311/1615/1538 2310/1600/1538 2396/3076/1538 2529/3082/1538 2531/3083/1538 +f 2448/3007/1539 2312/1634/1539 2311/1615/1539 2525/3081/1539 +o WBL_b1.002_Cylinder.033 +v 4.018566 0.080861 -0.329277 +v 3.982703 0.080851 -0.332450 +v 3.956449 0.080844 -0.341120 +v 3.982702 0.080851 -0.633065 +v 3.956449 0.080844 -0.624396 +v 4.026096 0.004622 -0.329277 +v 3.990924 -0.002385 -0.332450 +v 3.965176 -0.007513 -0.341120 +v 3.990924 -0.002385 -0.633065 +v 3.965176 -0.007513 -0.624396 +v 4.048355 -0.068684 -0.329277 +v 4.015225 -0.082417 -0.332450 +v 3.990973 -0.092471 -0.341120 +v 4.015225 -0.082417 -0.633065 +v 3.990973 -0.092471 -0.624396 +v 4.084487 -0.136238 -0.329277 +v 4.054673 -0.156171 -0.332450 +v 4.032848 -0.170763 -0.341120 +v 4.054673 -0.156171 -0.633066 +v 4.032848 -0.170763 -0.624396 +v 4.133105 -0.195446 -0.329277 +v 4.107752 -0.220812 -0.332450 +v 4.089193 -0.239381 -0.341120 +v 4.107752 -0.220812 -0.633066 +v 4.089193 -0.239381 -0.624396 +v 4.192338 -0.244030 -0.329277 +v 4.172422 -0.273855 -0.332450 +v 4.157842 -0.295688 -0.341120 +v 4.608698 -0.331859 -0.555457 +v 4.172422 -0.273855 -0.633066 +v 4.157842 -0.295688 -0.624396 +v 4.259912 -0.280126 -0.329277 +v 4.584918 -0.342519 -0.491010 +v 4.246197 -0.313263 -0.332450 +v 4.236157 -0.337521 -0.341120 +v 4.608698 -0.331859 -0.426563 +v 4.246197 -0.313263 -0.633066 +v 4.236157 -0.337521 -0.624396 +v 4.333230 -0.302345 -0.329277 +v 4.583544 -0.339204 -0.482758 +v 4.326243 -0.337521 -0.332450 +v 4.321128 -0.363271 -0.341120 +v 4.584918 -0.342519 -0.474506 +v 4.326243 -0.337521 -0.633066 +v 4.321128 -0.363271 -0.624396 +v 4.409474 -0.309833 -0.329277 +v 4.607138 -0.328628 -0.546702 +v 4.409483 -0.345696 -0.332450 +v 4.409491 -0.371950 -0.341120 +v 4.608698 -0.331859 -0.538953 +v 4.409483 -0.345696 -0.633066 +v 4.409491 -0.371950 -0.624396 +v 4.485713 -0.302303 -0.329277 +v 4.607138 -0.328628 -0.418814 +v 4.492719 -0.337475 -0.332450 +v 4.497849 -0.363223 -0.341120 +v 4.608698 -0.331859 -0.410059 +v 4.492719 -0.337475 -0.633066 +v 4.497849 -0.363223 -0.624396 +v 4.559019 -0.280044 -0.329277 +v 4.584918 -0.342519 -0.611652 +v 4.572752 -0.313173 -0.332450 +v 4.582805 -0.337426 -0.341120 +v 4.584918 -0.342519 -0.353864 +v 4.572752 -0.313173 -0.633066 +v 4.582805 -0.337426 -0.624396 +v 4.626573 -0.243911 -0.329277 +v 4.685407 -0.285039 -0.555457 +v 4.646506 -0.273725 -0.332451 +v 4.661098 -0.295550 -0.341120 +v 4.664163 -0.300133 -0.491010 +v 4.646506 -0.273725 -0.633066 +v 4.661098 -0.295550 -0.624396 +v 4.685781 -0.195294 -0.329277 +v 4.685407 -0.285039 -0.426563 +v 4.711146 -0.220646 -0.332451 +v 4.729716 -0.239205 -0.341120 +v 4.683246 -0.282174 -0.418815 +v 4.711146 -0.220646 -0.633066 +v 4.729716 -0.239205 -0.624396 +v 4.734365 -0.136060 -0.329277 +v 4.685407 -0.285039 -0.410059 +v 4.764190 -0.155976 -0.332451 +v 4.786023 -0.170556 -0.341120 +v 4.683246 -0.282174 -0.546702 +v 4.764190 -0.155976 -0.633066 +v 4.786023 -0.170556 -0.624396 +v 4.770461 -0.068486 -0.329277 +v 4.685407 -0.285039 -0.538953 +v 4.803598 -0.082201 -0.332451 +v 4.827856 -0.092241 -0.341120 +v 4.662169 -0.297151 -0.482758 +v 4.803598 -0.082201 -0.633066 +v 4.827856 -0.092241 -0.624396 +v 4.792679 0.004832 -0.329277 +v 4.664163 -0.300133 -0.474506 +v 4.827856 -0.002155 -0.332451 +v 4.853606 -0.007270 -0.341120 +v 4.664162 -0.300134 -0.611652 +v 4.827856 -0.002155 -0.633066 +v 4.853606 -0.007270 -0.624396 +v 4.800168 0.081076 -0.329277 +v 4.664162 -0.300134 -0.353864 +v 4.836031 0.081085 -0.332451 +v 4.862285 0.081093 -0.341120 +v 4.751507 -0.224153 -0.555457 +v 4.836031 0.081085 -0.633066 +v 4.862285 0.081093 -0.624396 +v 4.792638 0.157315 -0.329277 +v 4.733616 -0.243103 -0.491010 +v 4.827810 0.164321 -0.332451 +v 4.853558 0.169450 -0.341120 +v 4.751507 -0.224154 -0.426563 +v 4.827810 0.164321 -0.633066 +v 4.853558 0.169450 -0.624396 +v 4.770379 0.230620 -0.329277 +v 4.748830 -0.221765 -0.546702 +v 4.803508 0.244354 -0.332451 +v 4.827761 0.254407 -0.341120 +v 4.751507 -0.224154 -0.538953 +v 4.803508 0.244354 -0.633066 +v 4.827761 0.254407 -0.624396 +v 4.734246 0.298175 -0.329277 +v 4.731079 -0.240566 -0.482758 +v 4.764060 0.318108 -0.332451 +v 4.785885 0.332699 -0.341120 +v 4.733616 -0.243103 -0.474506 +v 4.764060 0.318107 -0.633066 +v 4.785885 0.332699 -0.624396 +v 4.685629 0.357382 -0.329277 +v 4.748830 -0.221765 -0.418815 +v 4.710981 0.382748 -0.332451 +v 4.729540 0.401317 -0.341120 +v 4.751507 -0.224153 -0.410059 +v 4.710981 0.382748 -0.633066 +v 4.729540 0.401318 -0.624396 +v 4.626395 0.405967 -0.329277 +v 4.733616 -0.243102 -0.611652 +v 4.646311 0.435792 -0.332450 +v 4.660891 0.457625 -0.341120 +v 4.733616 -0.243102 -0.353864 +v 4.646311 0.435792 -0.633066 +v 4.660891 0.457625 -0.624396 +v 4.558820 0.442062 -0.329277 +v 4.804460 -0.151543 -0.555457 +v 4.572536 0.475199 -0.332450 +v 4.582576 0.499458 -0.341120 +v 4.790609 -0.173618 -0.491010 +v 4.572536 0.475199 -0.633066 +v 4.582576 0.499458 -0.624396 +v 4.485503 0.464281 -0.329277 +v 4.804460 -0.151542 -0.426563 +v 4.492489 0.499457 -0.332450 +v 4.497605 0.525208 -0.341120 +v 4.787625 -0.171625 -0.482758 +v 4.492489 0.499457 -0.633066 +v 4.497605 0.525208 -0.624396 +v 4.409259 0.471769 -0.329277 +v 4.790609 -0.173618 -0.474506 +v 4.409250 0.507632 -0.332450 +v 4.409242 0.533886 -0.341120 +v 4.801367 -0.149723 -0.546702 +v 4.409250 0.507632 -0.633066 +v 4.409242 0.533886 -0.624396 +v 4.333020 0.464239 -0.329277 +v 4.804460 -0.151542 -0.538953 +v 4.326014 0.499411 -0.332450 +v 4.320885 0.525159 -0.341120 +v 4.801367 -0.149723 -0.418815 +v 4.326014 0.499411 -0.633066 +v 4.320885 0.525159 -0.624396 +v 4.259715 0.441980 -0.329277 +v 4.804460 -0.151542 -0.410059 +v 4.245981 0.475110 -0.332450 +v 4.235928 0.499362 -0.341120 +v 4.790609 -0.173618 -0.611652 +v 4.245981 0.475110 -0.633065 +v 4.235928 0.499362 -0.624396 +v 4.192160 0.405847 -0.329277 +v 4.790609 -0.173618 -0.353864 +v 4.172227 0.435661 -0.332450 +v 4.157635 0.457486 -0.341120 +v 4.842228 -0.069996 -0.555457 +v 4.172227 0.435661 -0.633065 +v 4.157635 0.457486 -0.624396 +v 4.132953 0.357230 -0.329277 +v 4.832951 -0.094349 -0.491010 +v 4.107586 0.382582 -0.332450 +v 4.089017 0.401141 -0.341120 +v 4.842228 -0.069996 -0.426563 +v 4.107586 0.382582 -0.633065 +v 4.089017 0.401141 -0.624396 +v 4.084368 0.297996 -0.329277 +v 4.838840 -0.068814 -0.418815 +v 4.054543 0.317913 -0.332450 +v 4.032710 0.332492 -0.341120 +v 4.842228 -0.069996 -0.410059 +v 4.054543 0.317912 -0.633065 +v 4.032710 0.332492 -0.624396 +v 4.048273 0.230422 -0.329277 +v 4.838840 -0.068814 -0.546702 +v 4.015135 0.244137 -0.332450 +v 3.990877 0.254177 -0.341120 +v 4.842228 -0.069996 -0.538953 +v 4.015135 0.244137 -0.633065 +v 3.990877 0.254177 -0.624396 +v 4.026054 0.157104 -0.329277 +v 4.829636 -0.092977 -0.482758 +v 3.990878 0.164091 -0.332450 +v 3.965127 0.169206 -0.341120 +v 4.832951 -0.094349 -0.474506 +v 3.990878 0.164091 -0.633065 +v 3.965127 0.169206 -0.624396 +v 4.832951 -0.094349 -0.611652 +v 4.832951 -0.094349 -0.353864 +v 4.863363 0.017352 -0.555457 +v 4.859015 -0.008343 -0.491010 +v 4.863363 0.017352 -0.426563 +v 4.855495 -0.007644 -0.482758 +v 4.859015 -0.008343 -0.474506 +v 4.859809 0.017850 -0.418814 +v 4.863363 0.017352 -0.410059 +v 4.859809 0.017850 -0.546702 +v 4.863363 0.017352 -0.538953 +v 4.859014 -0.008343 -0.611652 +v 4.859014 -0.008343 -0.353864 +v 4.867051 0.107145 -0.555457 +v 4.867799 0.081095 -0.491010 +v 4.867051 0.107145 -0.426563 +v 4.863468 0.106940 -0.418814 +v 4.867051 0.107145 -0.410059 +v 4.863468 0.106940 -0.546702 +v 4.867051 0.107145 -0.538953 +v 4.864210 0.081094 -0.482758 +v 4.867799 0.081095 -0.474506 +v 4.867798 0.081095 -0.611652 +v 4.867798 0.081095 -0.353864 +v 4.853150 0.195932 -0.555457 +v 4.858965 0.170528 -0.491010 +v 4.853149 0.195931 -0.426563 +v 4.855446 0.169827 -0.482758 +v 4.858965 0.170528 -0.474506 +v 4.849676 0.195031 -0.546702 +v 4.853149 0.195931 -0.538953 +v 4.849676 0.195031 -0.418814 +v 4.853150 0.195932 -0.410059 +v 4.858964 0.170528 -0.611652 +v 4.858964 0.170528 -0.353864 +v 4.822195 0.280300 -0.555457 +v 4.832854 0.256520 -0.491010 +v 4.822195 0.280300 -0.426563 +v 4.818963 0.278740 -0.418814 +v 4.822195 0.280300 -0.410059 +v 4.818963 0.278740 -0.546702 +v 4.822195 0.280300 -0.538953 +v 4.829539 0.255146 -0.482758 +v 4.832854 0.256520 -0.474506 +v 4.832854 0.256519 -0.611652 +v 4.832854 0.256519 -0.353864 +v 4.775374 0.357009 -0.555457 +v 4.790469 0.335765 -0.491010 +v 4.775374 0.357009 -0.426563 +v 4.772509 0.354848 -0.546702 +v 4.775374 0.357009 -0.538953 +v 4.787486 0.333771 -0.482758 +v 4.790469 0.335765 -0.474506 +v 4.772509 0.354848 -0.418814 +v 4.775374 0.357009 -0.410059 +v 4.790468 0.335764 -0.611652 +v 4.790468 0.335764 -0.353864 +v 4.714489 0.423109 -0.555457 +v 4.733438 0.405218 -0.491010 +v 4.714489 0.423109 -0.426563 +v 4.730901 0.402680 -0.482758 +v 4.733438 0.405218 -0.474506 +v 4.712100 0.420432 -0.546702 +v 4.714489 0.423109 -0.538953 +v 4.712100 0.420432 -0.418814 +v 4.714489 0.423109 -0.410059 +v 4.733437 0.405217 -0.611652 +v 4.733437 0.405217 -0.353864 +v 4.641877 0.476062 -0.555457 +v 4.663952 0.462211 -0.491010 +v 4.641877 0.476062 -0.426563 +v 4.640058 0.472969 -0.418814 +v 4.641877 0.476062 -0.410059 +v 4.640058 0.472969 -0.546702 +v 4.641877 0.476062 -0.538953 +v 4.661960 0.459227 -0.482758 +v 4.663952 0.462211 -0.474506 +v 4.663952 0.462210 -0.611652 +v 4.663952 0.462210 -0.353864 +v 4.560330 0.513830 -0.555457 +v 4.584684 0.504553 -0.491010 +v 4.560331 0.513830 -0.426563 +v 4.583312 0.501237 -0.482758 +v 4.584684 0.504553 -0.474506 +v 4.559149 0.510442 -0.418814 +v 4.560330 0.513830 -0.410059 +v 4.559149 0.510442 -0.546702 +v 4.560331 0.513830 -0.538953 +v 4.584684 0.504552 -0.611652 +v 4.584684 0.504552 -0.353864 +v 4.472982 0.534964 -0.555457 +v 4.498678 0.530616 -0.491010 +v 4.472983 0.534965 -0.426563 +v 4.472485 0.531411 -0.418814 +v 4.472982 0.534964 -0.410059 +v 4.472485 0.531411 -0.546702 +v 4.472983 0.534965 -0.538953 +v 4.497979 0.527097 -0.482758 +v 4.498678 0.530616 -0.474506 +v 4.498678 0.530616 -0.611652 +v 4.498678 0.530616 -0.353864 +v 4.383190 0.538652 -0.555457 +v 4.409240 0.539400 -0.491010 +v 4.383190 0.538652 -0.426563 +v 4.409241 0.535812 -0.482758 +v 4.409240 0.539400 -0.474506 +v 4.383395 0.535070 -0.546702 +v 4.383190 0.538652 -0.538953 +v 4.383395 0.535070 -0.418814 +v 4.383190 0.538652 -0.410059 +v 4.409240 0.539400 -0.611652 +v 4.409240 0.539400 -0.353864 +v 4.294403 0.524751 -0.555457 +v 4.319807 0.530567 -0.491010 +v 4.294403 0.524751 -0.426563 +v 4.295303 0.521277 -0.418814 +v 4.294403 0.524751 -0.410059 +v 4.295303 0.521277 -0.546702 +v 4.294403 0.524751 -0.538953 +v 4.320508 0.527048 -0.482758 +v 4.319807 0.530567 -0.474506 +v 4.319807 0.530566 -0.611652 +v 4.319807 0.530566 -0.353864 +v 4.210034 0.493795 -0.555457 +v 4.233815 0.504455 -0.491010 +v 4.210034 0.493795 -0.426563 +v 4.211595 0.490564 -0.546702 +v 4.210034 0.493795 -0.538953 +v 4.235189 0.501141 -0.482758 +v 4.233815 0.504455 -0.474506 +v 4.211595 0.490564 -0.418814 +v 4.210034 0.493795 -0.410059 +v 4.233815 0.504455 -0.611652 +v 4.233816 0.504455 -0.353864 +v 4.133326 0.446975 -0.555457 +v 4.154570 0.462070 -0.491010 +v 4.133326 0.446975 -0.426563 +v 4.156564 0.459087 -0.482758 +v 4.154570 0.462070 -0.474506 +v 4.135487 0.444110 -0.546702 +v 4.133326 0.446975 -0.538953 +v 4.135487 0.444110 -0.418814 +v 4.133326 0.446975 -0.410059 +v 4.154570 0.462070 -0.611652 +v 4.154571 0.462069 -0.353864 +v 4.067225 0.386089 -0.555457 +v 4.085117 0.405039 -0.491010 +v 4.067225 0.386090 -0.426563 +v 4.069904 0.383701 -0.418814 +v 4.067225 0.386089 -0.410059 +v 4.069904 0.383702 -0.546702 +v 4.067225 0.386090 -0.538953 +v 4.087655 0.402502 -0.482758 +v 4.085117 0.405039 -0.474506 +v 4.085117 0.405039 -0.611652 +v 4.085117 0.405039 -0.353864 +v 4.014274 0.313478 -0.555457 +v 4.028124 0.335554 -0.491010 +v 4.014274 0.313479 -0.426563 +v 4.031108 0.333561 -0.482758 +v 4.028124 0.335554 -0.474506 +v 4.017366 0.311659 -0.418814 +v 4.014274 0.313478 -0.410059 +v 4.017366 0.311659 -0.546702 +v 4.014274 0.313478 -0.538953 +v 4.028124 0.335554 -0.611652 +v 4.028124 0.335553 -0.353864 +v 3.976504 0.231932 -0.555457 +v 3.985783 0.256285 -0.491010 +v 3.976504 0.231932 -0.426563 +v 3.989098 0.254913 -0.482758 +v 3.985783 0.256285 -0.474506 +v 3.979892 0.230750 -0.546702 +v 3.976504 0.231932 -0.538953 +v 3.979893 0.230750 -0.418814 +v 3.976505 0.231932 -0.410059 +v 3.985783 0.256285 -0.611652 +v 3.985783 0.256285 -0.353864 +v 3.955370 0.144584 -0.538953 +v 3.959719 0.170279 -0.474506 +v 3.955370 0.144584 -0.410059 +v 3.958924 0.144086 -0.418814 +v 3.955370 0.144584 -0.426563 +v 3.958924 0.144086 -0.546702 +v 3.955370 0.144584 -0.555457 +v 3.963238 0.169580 -0.482758 +v 3.959719 0.170279 -0.491010 +v 3.959719 0.170279 -0.611652 +v 3.959719 0.170279 -0.353864 +v 3.951683 0.054792 -0.555457 +v 3.950935 0.080842 -0.491010 +v 3.951683 0.054792 -0.426563 +v 3.954523 0.080843 -0.482758 +v 3.950935 0.080842 -0.474506 +v 3.955266 0.054997 -0.418814 +v 3.951683 0.054792 -0.410059 +v 3.955266 0.054997 -0.546702 +v 3.951683 0.054792 -0.538953 +v 3.950935 0.080842 -0.611652 +v 3.950935 0.080842 -0.353864 +v 3.965584 -0.033995 -0.538953 +v 3.959768 -0.008591 -0.474506 +v 3.965584 -0.033995 -0.410059 +v 3.969058 -0.033095 -0.546702 +v 3.965584 -0.033995 -0.555457 +v 3.963287 -0.007890 -0.482758 +v 3.959768 -0.008591 -0.491010 +v 3.969058 -0.033095 -0.418814 +v 3.965584 -0.033995 -0.426563 +v 3.959768 -0.008591 -0.611652 +v 3.959769 -0.008591 -0.353864 +v 3.996539 -0.118364 -0.538953 +v 3.985879 -0.094583 -0.474506 +v 3.996540 -0.118364 -0.410059 +v 3.999770 -0.116803 -0.418814 +v 3.996539 -0.118364 -0.426563 +v 3.999770 -0.116803 -0.546702 +v 3.996539 -0.118364 -0.555457 +v 3.989194 -0.093209 -0.482758 +v 3.985879 -0.094583 -0.491010 +v 3.985879 -0.094583 -0.611652 +v 3.985880 -0.094583 -0.353864 +v 4.043359 -0.195072 -0.555457 +v 4.028265 -0.173828 -0.491010 +v 4.043359 -0.195072 -0.426563 +v 4.031248 -0.171834 -0.482758 +v 4.028265 -0.173828 -0.474506 +v 4.046224 -0.192911 -0.546702 +v 4.043359 -0.195072 -0.538953 +v 4.046224 -0.192911 -0.418814 +v 4.043359 -0.195072 -0.410059 +v 4.028265 -0.173828 -0.611652 +v 4.028265 -0.173828 -0.353864 +v 4.104245 -0.261173 -0.555457 +v 4.085296 -0.243281 -0.491010 +v 4.104245 -0.261173 -0.426563 +v 4.106633 -0.258494 -0.418814 +v 4.104245 -0.261173 -0.410059 +v 4.106633 -0.258494 -0.546702 +v 4.104245 -0.261173 -0.538953 +v 4.087832 -0.240743 -0.482758 +v 4.085296 -0.243281 -0.474506 +v 4.085296 -0.243281 -0.611652 +v 4.085296 -0.243281 -0.353864 +v 4.176856 -0.314125 -0.555457 +v 4.154781 -0.300274 -0.491010 +v 4.176856 -0.314125 -0.426563 +v 4.178676 -0.311032 -0.546702 +v 4.176856 -0.314125 -0.538953 +v 4.156774 -0.297290 -0.482758 +v 4.154781 -0.300274 -0.474506 +v 4.178676 -0.311032 -0.418814 +v 4.176856 -0.314125 -0.410059 +v 4.154781 -0.300274 -0.611652 +v 4.154781 -0.300274 -0.353864 +v 4.435543 -0.376715 -0.555457 +v 4.409493 -0.377464 -0.491010 +v 4.435543 -0.376715 -0.426563 +v 4.409492 -0.373876 -0.482758 +v 4.409493 -0.377464 -0.474506 +v 4.435338 -0.373133 -0.418814 +v 4.435543 -0.376715 -0.410059 +v 4.435338 -0.373133 -0.546702 +v 4.435543 -0.376715 -0.538953 +v 4.409493 -0.377464 -0.611652 +v 4.409493 -0.377464 -0.353864 +v 4.345750 -0.373028 -0.555457 +v 4.320055 -0.368679 -0.491010 +v 4.345750 -0.373028 -0.426563 +v 4.346248 -0.369475 -0.418814 +v 4.345750 -0.373028 -0.410059 +v 4.346248 -0.369475 -0.546702 +v 4.345750 -0.373028 -0.538953 +v 4.320754 -0.365160 -0.482758 +v 4.320055 -0.368679 -0.474506 +v 4.320055 -0.368679 -0.611652 +v 4.320055 -0.368679 -0.353864 +v 4.258402 -0.351894 -0.555457 +v 4.234049 -0.342616 -0.491010 +v 4.258402 -0.351894 -0.426563 +v 4.235422 -0.339300 -0.482758 +v 4.234049 -0.342616 -0.474506 +v 4.259584 -0.348506 -0.546702 +v 4.258402 -0.351894 -0.538953 +v 4.259584 -0.348506 -0.418814 +v 4.258402 -0.351894 -0.410059 +v 4.234049 -0.342616 -0.611652 +v 4.234049 -0.342616 -0.353864 +v 3.947731 0.089918 -0.352963 +v 3.947736 0.071764 -0.352963 +v 3.949197 0.080842 -0.350058 +v 3.947736 0.071764 -0.612552 +v 3.947731 0.089918 -0.612552 +v 3.949197 0.080842 -0.615458 +v 3.954855 -0.000314 -0.352963 +v 3.958402 -0.018119 -0.352963 +v 3.958064 -0.008930 -0.350058 +v 3.958402 -0.018119 -0.612552 +v 3.954855 -0.000314 -0.612552 +v 3.958064 -0.008930 -0.615458 +v 3.979446 -0.087423 -0.352963 +v 3.986398 -0.104194 -0.352963 +v 3.984274 -0.095248 -0.350058 +v 3.986398 -0.104194 -0.612552 +v 3.979446 -0.087423 -0.612552 +v 3.984274 -0.095248 -0.615458 +v 4.020558 -0.168061 -0.352963 +v 4.030648 -0.183153 -0.352963 +v 4.026819 -0.174793 -0.350058 +v 4.030648 -0.183153 -0.612552 +v 4.020558 -0.168061 -0.612552 +v 4.026819 -0.174793 -0.615458 +v 4.076612 -0.239129 -0.352963 +v 4.089453 -0.251963 -0.352963 +v 4.084067 -0.244510 -0.350058 +v 4.089453 -0.251963 -0.612552 +v 4.076612 -0.239129 -0.612552 +v 4.084067 -0.244510 -0.615458 +v 4.145454 -0.297896 -0.352963 +v 4.160552 -0.307978 -0.352963 +v 4.153815 -0.301719 -0.350058 +v 4.160552 -0.307978 -0.612552 +v 4.145454 -0.297896 -0.612552 +v 4.153815 -0.301719 -0.615458 +v 4.224437 -0.342103 -0.352963 +v 4.241212 -0.349045 -0.352963 +v 4.233384 -0.344221 -0.350058 +v 4.241212 -0.349045 -0.612552 +v 4.224437 -0.342103 -0.612552 +v 4.233384 -0.344221 -0.615458 +v 4.310528 -0.370051 -0.352963 +v 4.328334 -0.373588 -0.352963 +v 4.319716 -0.370384 -0.350058 +v 4.328334 -0.373588 -0.612552 +v 4.310528 -0.370051 -0.612552 +v 4.319716 -0.370384 -0.615458 +v 4.400417 -0.380668 -0.352963 +v 4.418571 -0.380663 -0.352963 +v 4.409493 -0.379201 -0.350058 +v 4.418571 -0.380663 -0.612552 +v 4.400416 -0.380668 -0.612552 +v 4.409493 -0.379201 -0.615458 +v 4.490649 -0.373544 -0.352963 +v 4.508454 -0.369996 -0.352963 +v 4.499265 -0.370335 -0.350058 +v 4.508454 -0.369997 -0.612553 +v 4.490649 -0.373544 -0.612552 +v 4.499265 -0.370335 -0.615458 +v 4.577758 -0.348953 -0.352963 +v 4.594529 -0.342001 -0.352963 +v 4.585583 -0.344125 -0.350058 +v 4.594529 -0.342001 -0.612553 +v 4.577758 -0.348953 -0.612553 +v 4.585583 -0.344125 -0.615458 +v 4.658396 -0.307841 -0.352964 +v 4.673488 -0.297750 -0.352964 +v 4.665128 -0.301579 -0.350058 +v 4.673488 -0.297750 -0.612553 +v 4.658396 -0.307841 -0.612553 +v 4.665128 -0.301579 -0.615458 +v 4.729464 -0.251787 -0.352964 +v 4.742298 -0.238946 -0.352964 +v 4.734845 -0.244332 -0.350058 +v 4.742298 -0.238946 -0.612553 +v 4.729464 -0.251787 -0.612553 +v 4.734845 -0.244332 -0.615458 +v 4.788230 -0.182944 -0.352964 +v 4.798313 -0.167847 -0.352964 +v 4.792054 -0.174583 -0.350058 +v 4.798313 -0.167847 -0.612553 +v 4.788230 -0.182944 -0.612553 +v 4.792054 -0.174583 -0.615458 +v 4.832438 -0.103961 -0.352964 +v 4.839380 -0.087186 -0.352964 +v 4.834556 -0.095014 -0.350058 +v 4.839380 -0.087186 -0.612553 +v 4.832438 -0.103961 -0.612553 +v 4.834556 -0.095014 -0.615458 +v 4.860386 -0.017871 -0.352964 +v 4.863923 -0.000064 -0.352964 +v 4.860719 -0.008683 -0.350058 +v 4.863923 -0.000064 -0.612553 +v 4.860386 -0.017871 -0.612553 +v 4.860719 -0.008683 -0.615458 +v 4.871003 0.072018 -0.352964 +v 4.870998 0.090173 -0.352964 +v 4.869537 0.081094 -0.350058 +v 4.870998 0.090173 -0.612553 +v 4.871003 0.072018 -0.612553 +v 4.869537 0.081094 -0.615458 +v 4.863878 0.162251 -0.352964 +v 4.860332 0.180056 -0.352964 +v 4.860670 0.170867 -0.350058 +v 4.860332 0.180056 -0.612553 +v 4.863878 0.162251 -0.612553 +v 4.860670 0.170867 -0.615458 +v 4.839288 0.249360 -0.352964 +v 4.832335 0.266131 -0.352964 +v 4.834460 0.257184 -0.350058 +v 4.832335 0.266131 -0.612553 +v 4.839288 0.249360 -0.612553 +v 4.834460 0.257184 -0.615458 +v 4.798175 0.329998 -0.352964 +v 4.788085 0.345090 -0.352964 +v 4.791914 0.336730 -0.350058 +v 4.788085 0.345090 -0.612553 +v 4.798175 0.329998 -0.612553 +v 4.791914 0.336730 -0.615458 +v 4.742121 0.401066 -0.352964 +v 4.729280 0.413899 -0.352964 +v 4.734666 0.406447 -0.350058 +v 4.729280 0.413899 -0.612553 +v 4.742121 0.401066 -0.612553 +v 4.734666 0.406447 -0.615458 +v 4.673279 0.459832 -0.352964 +v 4.658182 0.469914 -0.352964 +v 4.664918 0.463656 -0.350058 +v 4.658182 0.469914 -0.612552 +v 4.673279 0.459832 -0.612552 +v 4.664918 0.463656 -0.615458 +v 4.594296 0.504039 -0.352964 +v 4.577521 0.510982 -0.352964 +v 4.585350 0.506158 -0.350058 +v 4.577521 0.510982 -0.612552 +v 4.594296 0.504039 -0.612552 +v 4.585350 0.506158 -0.615458 +v 4.508205 0.531988 -0.352964 +v 4.490398 0.535525 -0.352964 +v 4.499017 0.532321 -0.350058 +v 4.490398 0.535525 -0.612552 +v 4.508205 0.531988 -0.612552 +v 4.499017 0.532321 -0.615458 +v 4.418317 0.542604 -0.352964 +v 4.400162 0.542599 -0.352964 +v 4.409240 0.541138 -0.350058 +v 4.400162 0.542599 -0.612552 +v 4.418316 0.542604 -0.612552 +v 4.409240 0.541138 -0.615458 +v 4.328084 0.535480 -0.352964 +v 4.310279 0.531933 -0.352964 +v 4.319468 0.532271 -0.350058 +v 4.310279 0.531933 -0.612552 +v 4.328084 0.535480 -0.612552 +v 4.319468 0.532271 -0.615458 +v 4.240974 0.510889 -0.352963 +v 4.224204 0.503937 -0.352963 +v 4.233150 0.506061 -0.350058 +v 4.224204 0.503937 -0.612552 +v 4.240974 0.510889 -0.612552 +v 4.233150 0.506061 -0.615458 +v 4.160337 0.469777 -0.352963 +v 4.145245 0.459686 -0.352963 +v 4.153605 0.463515 -0.350058 +v 4.145245 0.459686 -0.612552 +v 4.160337 0.469777 -0.612552 +v 4.153605 0.463515 -0.615458 +v 4.089269 0.413722 -0.352963 +v 4.076436 0.400881 -0.352963 +v 4.083888 0.406268 -0.350058 +v 4.076436 0.400882 -0.612552 +v 4.089269 0.413722 -0.612552 +v 4.083888 0.406268 -0.615458 +v 4.030503 0.344881 -0.352963 +v 4.020421 0.329783 -0.352963 +v 4.026679 0.336519 -0.350058 +v 4.020421 0.329783 -0.612552 +v 4.030503 0.344881 -0.612552 +v 4.026679 0.336519 -0.615458 +v 3.986295 0.265897 -0.352963 +v 3.979353 0.249122 -0.352963 +v 3.984177 0.256950 -0.350058 +v 3.979353 0.249122 -0.612552 +v 3.986295 0.265897 -0.612552 +v 3.984177 0.256951 -0.615458 +v 3.958347 0.179806 -0.352963 +v 3.954810 0.162000 -0.352963 +v 3.958014 0.170618 -0.350058 +v 3.954810 0.162000 -0.612552 +v 3.958347 0.179806 -0.612552 +v 3.958014 0.170618 -0.615458 +v 4.038225 -0.187581 -0.418368 +v 4.049151 -0.202068 -0.418368 +v 4.097747 -0.254827 -0.418368 +v 4.111290 -0.266904 -0.418368 +v 4.169245 -0.309168 -0.418368 +v 4.184884 -0.318372 -0.418368 +v 4.249971 -0.348518 -0.418368 +v 4.267105 -0.354493 -0.418368 +v 4.336823 -0.371361 -0.418368 +v 4.354793 -0.373880 -0.418368 +v 4.426461 -0.376823 -0.418368 +v 4.444578 -0.375787 -0.418368 +v 4.515444 -0.364692 -0.418368 +v 4.533010 -0.360141 -0.418368 +v 4.600349 -0.335434 -0.418368 +v 4.616690 -0.327544 -0.418368 +v 4.677916 -0.290174 -0.418368 +v 4.692403 -0.279247 -0.418368 +v 4.745162 -0.230651 -0.418368 +v 4.757239 -0.217109 -0.418368 +v 4.799503 -0.159153 -0.418368 +v 4.808707 -0.143514 -0.418368 +v 4.838852 -0.078427 -0.418368 +v 4.844828 -0.061294 -0.418368 +v 4.861697 0.008424 -0.418368 +v 4.864215 0.026394 -0.418368 +v 4.867158 0.098063 -0.418368 +v 4.866122 0.116179 -0.418368 +v 4.855026 0.187045 -0.418368 +v 4.850476 0.204611 -0.418368 +v 4.825768 0.271951 -0.418368 +v 4.817879 0.288292 -0.418368 +v 4.780509 0.349517 -0.418368 +v 4.769583 0.364005 -0.418368 +v 4.720986 0.416764 -0.418368 +v 4.707443 0.428841 -0.418368 +v 4.649488 0.471105 -0.418368 +v 4.633849 0.480308 -0.418368 +v 4.568762 0.510454 -0.418368 +v 4.551629 0.516430 -0.418368 +v 4.481911 0.533298 -0.418368 +v 4.463941 0.535816 -0.418368 +v 4.392272 0.538759 -0.418368 +v 4.374156 0.537723 -0.418368 +v 4.303289 0.526628 -0.418368 +v 4.285723 0.522078 -0.418368 +v 4.218384 0.497370 -0.418368 +v 4.202043 0.489480 -0.418368 +v 4.140818 0.452110 -0.418368 +v 4.126330 0.441184 -0.418368 +v 4.073572 0.392587 -0.418368 +v 4.061494 0.379045 -0.418368 +v 4.019230 0.321089 -0.418368 +v 4.010026 0.305450 -0.418368 +v 3.954519 0.135542 -0.418368 +v 3.957036 0.153512 -0.418368 +v 3.979881 0.240363 -0.418368 +v 3.973905 0.223230 -0.418368 +v 4.000855 -0.126355 -0.418368 +v 3.992965 -0.110014 -0.418368 +v 3.968257 -0.042675 -0.418368 +v 3.963707 -0.025109 -0.418368 +v 3.951576 0.063873 -0.418368 +v 3.952612 0.045757 -0.418368 +v 4.023564 -0.166057 -0.482758 +v 4.033649 -0.181141 -0.482758 +v 4.079170 -0.236577 -0.482758 +v 4.092004 -0.249404 -0.482758 +v 4.147465 -0.294894 -0.482758 +v 4.162554 -0.304970 -0.482758 +v 4.225824 -0.338767 -0.482758 +v 4.242589 -0.345706 -0.482758 +v 4.311237 -0.366509 -0.482758 +v 4.329034 -0.370044 -0.482758 +v 4.400421 -0.377055 -0.482758 +v 4.418565 -0.377050 -0.482758 +v 4.489949 -0.369999 -0.482758 +v 4.507744 -0.366454 -0.482758 +v 4.576380 -0.345613 -0.482758 +v 4.593141 -0.338665 -0.482758 +v 4.656393 -0.304834 -0.482758 +v 4.671476 -0.294749 -0.482758 +v 4.726912 -0.249229 -0.482758 +v 4.739739 -0.236395 -0.482758 +v 4.785229 -0.180934 -0.482758 +v 4.795305 -0.165844 -0.482758 +v 4.829101 -0.102575 -0.482758 +v 4.836040 -0.085809 -0.482758 +v 4.856844 -0.017162 -0.482758 +v 4.860379 0.000636 -0.482758 +v 4.867390 0.072022 -0.482758 +v 4.867384 0.090167 -0.482758 +v 4.860334 0.161550 -0.482758 +v 4.856789 0.179345 -0.482758 +v 4.835948 0.247981 -0.482758 +v 4.829000 0.264743 -0.482758 +v 4.795169 0.327994 -0.482758 +v 4.785084 0.343078 -0.482758 +v 4.739564 0.398514 -0.482758 +v 4.726729 0.411341 -0.482758 +v 4.671268 0.456831 -0.482758 +v 4.656179 0.466907 -0.482758 +v 4.592909 0.500703 -0.482758 +v 4.576144 0.507642 -0.482758 +v 4.507496 0.528445 -0.482758 +v 4.489699 0.531980 -0.482758 +v 4.418313 0.538991 -0.482758 +v 4.400167 0.538986 -0.482758 +v 4.328784 0.531936 -0.482758 +v 4.310989 0.528391 -0.482758 +v 4.242353 0.507550 -0.482758 +v 4.225592 0.500601 -0.482758 +v 4.162340 0.466770 -0.482758 +v 4.147256 0.456685 -0.482758 +v 4.091821 0.411165 -0.482758 +v 4.078994 0.398331 -0.482758 +v 4.033504 0.342870 -0.482758 +v 4.023428 0.327780 -0.482758 +v 3.958355 0.161300 -0.482758 +v 3.961889 0.179097 -0.482758 +v 3.989632 0.264510 -0.482758 +v 3.982693 0.247745 -0.482758 +v 3.989734 -0.102806 -0.482758 +v 3.982785 -0.086045 -0.482758 +v 3.961944 -0.017409 -0.482758 +v 3.958399 0.000387 -0.482758 +v 3.951344 0.089914 -0.482758 +v 3.951349 0.071769 -0.482758 +v 4.038225 -0.187581 -0.547148 +v 4.049151 -0.202068 -0.547148 +v 4.097747 -0.254827 -0.547148 +v 4.111290 -0.266904 -0.547148 +v 4.169245 -0.309168 -0.547148 +v 4.184884 -0.318372 -0.547148 +v 4.249971 -0.348518 -0.547148 +v 4.267105 -0.354493 -0.547148 +v 4.336823 -0.371361 -0.547148 +v 4.354793 -0.373880 -0.547148 +v 4.426461 -0.376823 -0.547148 +v 4.444578 -0.375787 -0.547148 +v 4.515444 -0.364692 -0.547148 +v 4.533010 -0.360141 -0.547148 +v 4.600349 -0.335434 -0.547148 +v 4.616690 -0.327544 -0.547148 +v 4.677916 -0.290174 -0.547148 +v 4.692403 -0.279247 -0.547148 +v 4.745162 -0.230651 -0.547148 +v 4.757239 -0.217109 -0.547148 +v 4.799503 -0.159153 -0.547148 +v 4.808707 -0.143514 -0.547148 +v 4.838852 -0.078427 -0.547148 +v 4.844828 -0.061294 -0.547148 +v 4.861697 0.008424 -0.547148 +v 4.864215 0.026394 -0.547148 +v 4.867158 0.098063 -0.547148 +v 4.866122 0.116179 -0.547148 +v 4.855026 0.187045 -0.547148 +v 4.850476 0.204611 -0.547148 +v 4.825768 0.271951 -0.547148 +v 4.817879 0.288292 -0.547148 +v 4.780509 0.349517 -0.547148 +v 4.769583 0.364005 -0.547148 +v 4.720986 0.416764 -0.547148 +v 4.707443 0.428841 -0.547148 +v 4.649488 0.471105 -0.547148 +v 4.633849 0.480308 -0.547148 +v 4.568762 0.510454 -0.547148 +v 4.551629 0.516430 -0.547148 +v 4.481911 0.533298 -0.547148 +v 4.463941 0.535816 -0.547148 +v 4.392272 0.538760 -0.547148 +v 4.374156 0.537723 -0.547148 +v 4.303289 0.526628 -0.547148 +v 4.285723 0.522078 -0.547148 +v 4.218384 0.497370 -0.547148 +v 4.202043 0.489480 -0.547148 +v 4.140818 0.452110 -0.547148 +v 4.126330 0.441184 -0.547148 +v 4.073571 0.392587 -0.547148 +v 4.061494 0.379045 -0.547148 +v 4.019229 0.321089 -0.547148 +v 4.010026 0.305450 -0.547148 +v 3.954519 0.135542 -0.547148 +v 3.957036 0.153512 -0.547148 +v 3.979881 0.240363 -0.547148 +v 3.973905 0.223230 -0.547148 +v 4.000855 -0.126355 -0.547148 +v 3.992965 -0.110014 -0.547148 +v 3.968257 -0.042675 -0.547148 +v 3.963707 -0.025109 -0.547148 +v 3.951576 0.063873 -0.547148 +v 3.952612 0.045757 -0.547148 +v 3.949004 0.045549 -0.409551 +v 3.947968 0.063669 -0.409551 +v 3.947968 0.063669 -0.426170 +v 3.949004 0.045550 -0.426170 +v 3.947735 0.071766 -0.474448 +v 3.947731 0.089915 -0.474448 +v 3.947731 0.089915 -0.491067 +v 3.947735 0.071766 -0.491067 +v 3.949004 0.045550 -0.539346 +v 3.947968 0.063669 -0.539346 +v 3.947968 0.063669 -0.555964 +v 3.949004 0.045549 -0.555964 +v 3.960208 -0.026013 -0.555964 +v 3.964760 -0.043583 -0.555964 +v 3.964760 -0.043582 -0.539346 +v 3.960209 -0.026013 -0.539346 +v 3.954855 -0.000318 -0.491067 +v 3.958401 -0.018117 -0.491067 +v 3.958401 -0.018117 -0.474448 +v 3.954855 -0.000318 -0.474448 +v 3.960209 -0.026013 -0.426170 +v 3.964760 -0.043582 -0.426170 +v 3.964760 -0.043583 -0.409551 +v 3.960208 -0.026013 -0.409551 +v 3.953459 0.154015 -0.426170 +v 3.950940 0.136042 -0.426170 +v 3.950940 0.136041 -0.409551 +v 3.953459 0.154015 -0.409551 +v 3.958346 0.179803 -0.491067 +v 3.954810 0.162002 -0.491067 +v 3.954810 0.162002 -0.474448 +v 3.958346 0.179803 -0.474448 +v 3.953459 0.154015 -0.555964 +v 3.950940 0.136041 -0.555964 +v 3.950940 0.136042 -0.539346 +v 3.953459 0.154015 -0.539346 +v 3.989710 -0.111584 -0.555964 +v 3.997602 -0.127928 -0.555964 +v 3.997602 -0.127928 -0.539346 +v 3.989710 -0.111584 -0.539346 +v 3.979446 -0.087426 -0.491067 +v 3.986396 -0.104191 -0.491067 +v 3.986396 -0.104191 -0.474448 +v 3.979446 -0.087426 -0.474448 +v 3.989710 -0.111584 -0.426170 +v 3.997602 -0.127927 -0.426170 +v 3.997602 -0.127928 -0.409551 +v 3.989710 -0.111584 -0.409551 +v 4.046267 -0.204245 -0.539346 +v 4.035339 -0.189755 -0.539346 +v 4.035338 -0.189755 -0.555965 +v 4.046268 -0.204246 -0.555965 +v 4.030647 -0.183152 -0.474448 +v 4.020560 -0.168064 -0.474448 +v 4.020560 -0.168064 -0.491067 +v 4.030647 -0.183152 -0.491067 +v 4.046268 -0.204246 -0.409551 +v 4.035338 -0.189755 -0.409551 +v 4.035339 -0.189755 -0.426170 +v 4.046267 -0.204245 -0.426170 +v 4.108886 -0.269602 -0.539346 +v 4.095341 -0.257522 -0.539346 +v 4.095341 -0.257522 -0.555965 +v 4.108887 -0.269603 -0.555965 +v 4.089451 -0.251961 -0.474448 +v 4.076614 -0.239132 -0.474448 +v 4.076614 -0.239132 -0.491067 +v 4.089451 -0.251961 -0.491067 +v 4.108887 -0.269603 -0.409551 +v 4.095341 -0.257522 -0.409551 +v 4.095341 -0.257523 -0.426170 +v 4.108886 -0.269602 -0.426170 +v 4.183053 -0.321487 -0.539346 +v 4.167411 -0.312282 -0.539346 +v 4.167411 -0.312281 -0.555965 +v 4.183053 -0.321487 -0.555965 +v 4.160549 -0.307976 -0.474448 +v 4.145456 -0.297898 -0.474448 +v 4.145456 -0.297898 -0.491067 +v 4.160549 -0.307976 -0.491067 +v 4.183053 -0.321487 -0.409551 +v 4.167411 -0.312281 -0.409551 +v 4.167411 -0.312282 -0.426170 +v 4.183053 -0.321487 -0.426170 +v 4.265916 -0.357906 -0.539346 +v 4.248780 -0.351929 -0.539346 +v 4.248779 -0.351929 -0.555965 +v 4.265917 -0.357906 -0.555965 +v 4.241210 -0.349045 -0.474448 +v 4.224440 -0.342104 -0.474448 +v 4.224440 -0.342104 -0.491067 +v 4.241210 -0.349045 -0.491067 +v 4.265917 -0.357906 -0.409551 +v 4.248779 -0.351929 -0.409551 +v 4.248780 -0.351929 -0.426170 +v 4.265916 -0.357906 -0.426170 +v 4.354292 -0.377458 -0.539346 +v 4.336319 -0.374940 -0.539346 +v 4.336318 -0.374940 -0.555965 +v 4.354293 -0.377458 -0.555965 +v 4.328332 -0.373588 -0.474448 +v 4.310531 -0.370053 -0.474448 +v 4.310531 -0.370053 -0.491067 +v 4.328332 -0.373588 -0.491067 +v 4.354293 -0.377458 -0.409551 +v 4.336318 -0.374940 -0.409551 +v 4.336319 -0.374940 -0.426170 +v 4.354292 -0.377458 -0.426170 +v 4.444785 -0.379394 -0.539346 +v 4.426667 -0.380431 -0.539346 +v 4.426666 -0.380430 -0.555965 +v 4.444786 -0.379394 -0.555965 +v 4.418569 -0.380663 -0.474448 +v 4.400420 -0.380668 -0.474448 +v 4.400420 -0.380668 -0.491067 +v 4.418569 -0.380663 -0.491067 +v 4.444786 -0.379394 -0.409551 +v 4.426666 -0.380430 -0.409551 +v 4.426667 -0.380431 -0.426170 +v 4.444785 -0.379394 -0.426170 +v 4.533917 -0.363638 -0.539346 +v 4.516348 -0.368190 -0.539346 +v 4.516347 -0.368190 -0.555965 +v 4.533917 -0.363638 -0.555965 +v 4.508451 -0.369998 -0.474449 +v 4.490653 -0.373544 -0.474448 +v 4.490653 -0.373544 -0.491067 +v 4.508451 -0.369998 -0.491067 +v 4.533917 -0.363638 -0.409551 +v 4.516347 -0.368190 -0.409551 +v 4.516348 -0.368190 -0.426170 +v 4.533917 -0.363638 -0.426170 +v 4.618263 -0.330797 -0.539346 +v 4.601919 -0.338688 -0.539346 +v 4.601918 -0.338689 -0.555965 +v 4.618263 -0.330797 -0.555965 +v 4.594527 -0.342002 -0.474449 +v 4.577762 -0.348952 -0.474449 +v 4.577762 -0.348952 -0.491067 +v 4.594527 -0.342002 -0.491067 +v 4.618263 -0.330797 -0.409551 +v 4.601918 -0.338689 -0.409551 +v 4.601919 -0.338688 -0.426170 +v 4.618263 -0.330797 -0.426170 +v 4.694580 -0.282131 -0.539346 +v 4.680090 -0.293059 -0.539346 +v 4.680089 -0.293060 -0.555965 +v 4.694581 -0.282131 -0.555965 +v 4.673486 -0.297752 -0.474449 +v 4.658399 -0.307839 -0.474449 +v 4.658399 -0.307839 -0.491068 +v 4.673486 -0.297752 -0.491068 +v 4.694581 -0.282131 -0.409551 +v 4.680089 -0.293060 -0.409551 +v 4.680090 -0.293059 -0.426170 +v 4.694580 -0.282131 -0.426170 +v 4.759937 -0.219512 -0.539346 +v 4.747858 -0.233057 -0.539346 +v 4.747857 -0.233058 -0.555965 +v 4.759938 -0.219512 -0.555965 +v 4.742296 -0.238947 -0.474449 +v 4.729466 -0.251785 -0.474449 +v 4.729466 -0.251785 -0.491068 +v 4.742296 -0.238947 -0.491068 +v 4.759938 -0.219512 -0.409551 +v 4.747857 -0.233058 -0.409551 +v 4.747858 -0.233057 -0.426170 +v 4.759937 -0.219512 -0.426170 +v 4.811822 -0.145346 -0.539346 +v 4.802617 -0.160987 -0.539346 +v 4.802617 -0.160987 -0.555965 +v 4.811822 -0.145345 -0.555965 +v 4.798312 -0.167849 -0.474449 +v 4.788233 -0.182942 -0.474449 +v 4.788233 -0.182942 -0.491068 +v 4.798312 -0.167849 -0.491068 +v 4.811822 -0.145345 -0.409551 +v 4.802617 -0.160987 -0.409551 +v 4.802617 -0.160987 -0.426170 +v 4.811822 -0.145346 -0.426170 +v 4.848240 -0.062482 -0.539346 +v 4.842264 -0.079619 -0.539346 +v 4.842263 -0.079619 -0.555965 +v 4.848240 -0.062481 -0.555965 +v 4.839380 -0.087189 -0.474449 +v 4.832439 -0.103958 -0.474449 +v 4.832439 -0.103958 -0.491068 +v 4.839380 -0.087189 -0.491068 +v 4.848240 -0.062481 -0.409551 +v 4.842263 -0.079619 -0.409551 +v 4.842264 -0.079619 -0.426170 +v 4.848240 -0.062482 -0.426170 +v 4.867794 0.025894 -0.539346 +v 4.865275 0.007921 -0.539346 +v 4.865274 0.007920 -0.555965 +v 4.867793 0.025895 -0.555965 +v 4.863923 -0.000066 -0.474449 +v 4.860387 -0.017868 -0.474449 +v 4.860387 -0.017868 -0.491068 +v 4.863923 -0.000066 -0.491068 +v 4.867793 0.025895 -0.409551 +v 4.865274 0.007920 -0.409551 +v 4.865275 0.007921 -0.426170 +v 4.867794 0.025894 -0.426170 +v 4.869730 0.116387 -0.539346 +v 4.870765 0.098268 -0.539346 +v 4.870765 0.098267 -0.555965 +v 4.869729 0.116388 -0.555965 +v 4.870998 0.090170 -0.474449 +v 4.871003 0.072022 -0.474449 +v 4.871003 0.072022 -0.491068 +v 4.870998 0.090170 -0.491068 +v 4.869729 0.116388 -0.409551 +v 4.870765 0.098267 -0.409551 +v 4.870765 0.098268 -0.426170 +v 4.869730 0.116387 -0.426170 +v 4.853974 0.205519 -0.539346 +v 4.858525 0.187950 -0.539346 +v 4.858525 0.187949 -0.555965 +v 4.853973 0.205519 -0.555965 +v 4.860332 0.180054 -0.474449 +v 4.863878 0.162254 -0.474449 +v 4.863878 0.162254 -0.491068 +v 4.860332 0.180054 -0.491068 +v 4.853973 0.205519 -0.409551 +v 4.858525 0.187949 -0.409551 +v 4.858525 0.187950 -0.426170 +v 4.853974 0.205519 -0.426170 +v 4.821132 0.289864 -0.539346 +v 4.829023 0.273521 -0.539346 +v 4.829023 0.273520 -0.555965 +v 4.821131 0.289865 -0.555965 +v 4.832337 0.266128 -0.474449 +v 4.839287 0.249363 -0.474449 +v 4.839287 0.249363 -0.491068 +v 4.832337 0.266128 -0.491068 +v 4.821131 0.289865 -0.409551 +v 4.829023 0.273520 -0.409551 +v 4.829023 0.273521 -0.426170 +v 4.821132 0.289864 -0.426170 +v 4.772466 0.366182 -0.539346 +v 4.783394 0.351692 -0.539346 +v 4.783395 0.351691 -0.555965 +v 4.772466 0.366182 -0.555965 +v 4.788086 0.345088 -0.474449 +v 4.798174 0.330001 -0.474449 +v 4.798174 0.330001 -0.491068 +v 4.788086 0.345088 -0.491068 +v 4.772466 0.366182 -0.409551 +v 4.783395 0.351691 -0.409551 +v 4.783394 0.351692 -0.426170 +v 4.772466 0.366182 -0.426170 +v 4.709847 0.431539 -0.539346 +v 4.723392 0.419459 -0.539346 +v 4.723392 0.419459 -0.555965 +v 4.709846 0.431539 -0.555965 +v 4.729282 0.413898 -0.474449 +v 4.742119 0.401068 -0.474449 +v 4.742119 0.401068 -0.491068 +v 4.729282 0.413898 -0.491068 +v 4.709846 0.431539 -0.409551 +v 4.723392 0.419459 -0.409551 +v 4.723392 0.419459 -0.426170 +v 4.709847 0.431539 -0.426170 +v 4.635681 0.483423 -0.539346 +v 4.651322 0.474218 -0.539346 +v 4.651322 0.474218 -0.555965 +v 4.635680 0.483424 -0.555965 +v 4.658184 0.469913 -0.474448 +v 4.673277 0.459834 -0.474448 +v 4.673277 0.459834 -0.491068 +v 4.658184 0.469913 -0.491068 +v 4.635680 0.483424 -0.409551 +v 4.651322 0.474218 -0.409551 +v 4.651322 0.474218 -0.426170 +v 4.635681 0.483423 -0.426170 +v 4.552817 0.519842 -0.539346 +v 4.569953 0.513865 -0.539346 +v 4.569954 0.513865 -0.555965 +v 4.552816 0.519842 -0.555965 +v 4.577524 0.510981 -0.474448 +v 4.594293 0.504041 -0.474448 +v 4.594293 0.504041 -0.491068 +v 4.577524 0.510981 -0.491068 +v 4.552816 0.519842 -0.409551 +v 4.569954 0.513865 -0.409551 +v 4.569953 0.513865 -0.426170 +v 4.552817 0.519842 -0.426170 +v 4.464440 0.539395 -0.539346 +v 4.482414 0.536876 -0.539346 +v 4.482414 0.536876 -0.555965 +v 4.464440 0.539395 -0.555965 +v 4.490401 0.535524 -0.474448 +v 4.508202 0.531989 -0.474448 +v 4.508202 0.531989 -0.491068 +v 4.490401 0.535524 -0.491068 +v 4.464440 0.539395 -0.409551 +v 4.482414 0.536876 -0.409551 +v 4.482414 0.536876 -0.426170 +v 4.464440 0.539395 -0.426170 +v 4.373947 0.541331 -0.539346 +v 4.392067 0.542367 -0.539346 +v 4.392067 0.542367 -0.555965 +v 4.373947 0.541330 -0.555965 +v 4.400165 0.542600 -0.474448 +v 4.418313 0.542604 -0.474448 +v 4.418313 0.542604 -0.491068 +v 4.400165 0.542600 -0.491068 +v 4.373947 0.541330 -0.409551 +v 4.392067 0.542367 -0.409551 +v 4.392067 0.542367 -0.426170 +v 4.373947 0.541331 -0.426170 +v 4.284816 0.525575 -0.539346 +v 4.302385 0.530126 -0.539346 +v 4.302385 0.530126 -0.555965 +v 4.284815 0.525575 -0.555965 +v 4.310281 0.531934 -0.474448 +v 4.328080 0.535480 -0.474448 +v 4.328080 0.535480 -0.491068 +v 4.310281 0.531934 -0.491068 +v 4.284815 0.525575 -0.409551 +v 4.302385 0.530126 -0.409551 +v 4.302385 0.530126 -0.426170 +v 4.284816 0.525575 -0.426170 +v 4.200470 0.492733 -0.539346 +v 4.216814 0.500625 -0.539346 +v 4.216815 0.500625 -0.555964 +v 4.200470 0.492733 -0.555964 +v 4.224206 0.503938 -0.474448 +v 4.240972 0.510888 -0.474448 +v 4.240972 0.510888 -0.491067 +v 4.224206 0.503938 -0.491067 +v 4.200470 0.492733 -0.409551 +v 4.216815 0.500625 -0.409551 +v 4.216814 0.500625 -0.426170 +v 4.200470 0.492733 -0.426170 +v 4.124153 0.444068 -0.539346 +v 4.138643 0.454996 -0.539346 +v 4.138643 0.454996 -0.555964 +v 4.124152 0.444067 -0.555964 +v 4.145247 0.459688 -0.474448 +v 4.160334 0.469775 -0.474448 +v 4.160334 0.469775 -0.491067 +v 4.145247 0.459688 -0.491067 +v 4.124152 0.444067 -0.409551 +v 4.138644 0.454996 -0.409551 +v 4.138643 0.454996 -0.426170 +v 4.124153 0.444068 -0.426170 +v 4.058796 0.381448 -0.539346 +v 4.070876 0.394993 -0.539346 +v 4.070876 0.394994 -0.555964 +v 4.058796 0.381448 -0.555964 +v 4.076437 0.400884 -0.474448 +v 4.089266 0.413720 -0.474448 +v 4.089266 0.413720 -0.491067 +v 4.076437 0.400884 -0.491067 +v 4.058796 0.381448 -0.409551 +v 4.070876 0.394994 -0.409551 +v 4.070876 0.394993 -0.426170 +v 4.058796 0.381448 -0.426170 +v 4.006911 0.307282 -0.539346 +v 4.016117 0.322923 -0.539346 +v 4.016117 0.322924 -0.555964 +v 4.006911 0.307281 -0.555964 +v 4.020422 0.329785 -0.474448 +v 4.030500 0.344878 -0.474448 +v 4.030500 0.344878 -0.491067 +v 4.020422 0.329785 -0.491067 +v 4.006911 0.307281 -0.409551 +v 4.016117 0.322924 -0.409551 +v 4.016117 0.322923 -0.426170 +v 4.006911 0.307282 -0.426170 +v 3.970493 0.224418 -0.539346 +v 3.976470 0.241555 -0.539346 +v 3.976470 0.241555 -0.555964 +v 3.970493 0.224417 -0.555964 +v 3.979353 0.249125 -0.474448 +v 3.986294 0.265894 -0.474448 +v 3.986294 0.265894 -0.491067 +v 3.979353 0.249125 -0.491067 +v 3.970493 0.224417 -0.409551 +v 3.976470 0.241555 -0.409551 +v 3.976470 0.241555 -0.426170 +v 3.970493 0.224418 -0.426170 +v 4.498926 -0.368630 -0.353864 +v 4.498926 -0.368630 -0.611652 +v 4.498927 -0.368630 -0.474506 +v 4.498225 -0.365111 -0.482758 +v 4.524330 -0.362814 -0.538953 +v 4.523429 -0.359341 -0.546702 +v 4.524330 -0.362814 -0.410059 +v 4.523429 -0.359341 -0.418814 +v 4.524330 -0.362814 -0.426563 +v 4.498927 -0.368630 -0.491010 +v 4.524330 -0.362814 -0.555457 +v 4.018566 0.080861 -0.636239 +v 4.026096 0.004622 -0.636239 +v 4.048355 -0.068684 -0.636239 +v 4.084487 -0.136238 -0.636239 +v 4.133105 -0.195446 -0.636239 +v 4.192338 -0.244030 -0.636239 +v 4.259912 -0.280126 -0.636239 +v 4.333230 -0.302345 -0.636239 +v 4.409474 -0.309833 -0.636239 +v 4.485713 -0.302303 -0.636239 +v 4.559019 -0.280044 -0.636239 +v 4.626573 -0.243911 -0.636239 +v 4.685781 -0.195294 -0.636239 +v 4.734365 -0.136060 -0.636239 +v 4.770461 -0.068486 -0.636239 +v 4.792679 0.004832 -0.636239 +v 4.800168 0.081076 -0.636239 +v 4.792638 0.157315 -0.636239 +v 4.770379 0.230620 -0.636239 +v 4.734246 0.298175 -0.636239 +v 4.685629 0.357382 -0.636239 +v 4.626395 0.405967 -0.636239 +v 4.558820 0.442062 -0.636239 +v 4.485503 0.464281 -0.636239 +v 4.409259 0.471769 -0.636239 +v 4.333020 0.464239 -0.636239 +v 4.259714 0.441980 -0.636239 +v 4.192160 0.405848 -0.636239 +v 4.132953 0.357230 -0.636239 +v 4.084368 0.297996 -0.636239 +v 4.048273 0.230422 -0.636239 +v 4.026054 0.157104 -0.636239 +v 4.076863 0.014734 -0.629995 +v 4.279709 -0.232296 -0.629995 +v 4.127416 0.269249 -0.629995 +v 4.051066 0.125316 -0.662301 +v 4.066486 0.195731 -0.662301 +v 4.286350 0.073793 -0.650101 +v 4.301770 0.144207 -0.650101 +v 4.103345 0.113868 -0.676623 +v 4.118765 0.184283 -0.676623 +v 4.066486 0.195731 -0.632907 +v 4.051066 0.125316 -0.632845 +v 4.220395 0.392688 -0.662301 +v 4.285015 0.424629 -0.662301 +v 4.327125 0.176767 -0.650101 +v 4.391744 0.208708 -0.650101 +v 4.244110 0.344711 -0.676623 +v 4.308730 0.376652 -0.676623 +v 4.285015 0.424629 -0.633336 +v 4.220395 0.392688 -0.633218 +v 4.542915 0.427629 -0.662301 +v 4.607794 0.396218 -0.662301 +v 4.437957 0.210842 -0.650101 +v 4.502836 0.179430 -0.650101 +v 4.519594 0.379459 -0.676624 +v 4.584473 0.348048 -0.676624 +v 4.607794 0.396218 -0.634134 +v 4.542915 0.427629 -0.634006 +v 4.763578 0.199869 -0.662301 +v 4.780223 0.129734 -0.662301 +v 4.529228 0.144252 -0.650101 +v 4.545873 0.074117 -0.650101 +v 4.711507 0.187511 -0.676624 +v 4.728151 0.117376 -0.676624 +v 4.780223 0.129734 -0.634413 +v 4.763578 0.199869 -0.634368 +v 4.725554 -0.116868 -0.662301 +v 4.681181 -0.173675 -0.662301 +v 4.535739 0.031400 -0.650101 +v 4.491366 -0.025406 -0.650101 +v 4.683378 -0.083923 -0.676624 +v 4.639005 -0.140730 -0.676624 +v 4.681181 -0.173675 -0.634146 +v 4.725554 -0.116868 -0.634201 +v 4.455746 -0.285394 -0.662301 +v 4.383662 -0.285530 -0.662301 +v 4.455288 -0.044535 -0.650101 +v 4.383205 -0.044672 -0.650101 +v 4.455644 -0.231876 -0.676624 +v 4.383561 -0.232012 -0.676624 +v 4.383662 -0.285530 -0.633613 +v 4.455746 -0.285394 -0.633842 +v 4.151117 -0.175610 -0.662301 +v 4.106280 -0.119169 -0.662301 +v 4.339711 -0.025793 -0.650101 +v 4.294875 0.030649 -0.650101 +v 4.193022 -0.142322 -0.676623 +v 4.148186 -0.085880 -0.676623 +v 4.107577 -0.120801 -0.632889 +v 4.106280 -0.119169 -0.632934 +v 4.151117 -0.175610 -0.633026 +v 4.045502 0.162012 -0.646399 +v 4.121924 -0.157823 -0.646399 +v 4.419631 -0.297488 -0.646399 +v 4.714441 -0.151812 -0.646399 +v 4.784359 0.169508 -0.646399 +v 4.576733 0.424511 -0.646399 +v 4.247911 0.421175 -0.646399 +v 4.750355 0.013239 -0.631034 +v 4.698860 0.274516 -0.631105 +v 4.743629 0.219532 -0.632746 +v 4.655740 0.327477 -0.631139 +v 4.610821 0.382645 -0.632856 +v 4.477403 0.423504 -0.631225 +v 4.409273 0.422812 -0.630334 +v 4.341409 0.422124 -0.631059 +v 4.169467 0.320736 -0.630012 +v 4.212352 0.375646 -0.631857 +v 4.165892 0.316158 -0.629995 +v 4.086556 0.214577 -0.631241 +v 4.123436 0.261798 -0.629995 +v 4.140831 -0.030349 -0.629995 +v 4.094839 -0.044466 -0.629995 +v 4.127641 0.024849 -0.629995 +v 4.080519 0.015463 -0.629995 +v 4.246343 -0.163158 -0.629995 +v 4.298246 -0.187508 -0.629995 +v 4.279865 -0.231919 -0.629995 +v 4.272780 -0.228595 -0.629995 +v 4.351114 -0.212310 -0.629995 +v 4.282421 -0.233118 -0.629995 +v 4.522897 -0.192906 -0.629995 +v 4.575194 -0.167064 -0.629995 +v 4.703254 0.022594 -0.629995 +v 4.690626 -0.035443 -0.629995 +v 4.658769 0.247712 -0.629995 +v 4.621620 0.293338 -0.629995 +v 4.467847 0.375391 -0.629995 +v 4.409286 0.374797 -0.629995 +v 4.128625 0.268442 -0.629995 +v 4.168664 0.241704 -0.629995 +v 4.203681 0.286540 -0.629995 +v 4.045502 0.162012 -0.634155 +v 4.064401 0.186210 -0.632814 +v 4.047703 0.152804 -0.633577 +v 4.071055 0.194730 -0.632342 +v 4.064889 0.080874 -0.630651 +v 4.074163 0.042061 -0.629995 +v 4.095914 -0.048969 -0.630029 +v 4.052598 0.132314 -0.632743 +v 4.219376 -0.203541 -0.630366 +v 4.054447 0.124576 -0.632429 +v 4.341477 -0.260824 -0.631133 +v 4.114251 0.080887 -0.629995 +v 4.478918 -0.268192 -0.632044 +v 4.541323 -0.237356 -0.630665 +v 4.132595 0.195522 -0.629995 +v 4.602108 -0.207319 -0.630930 +v 4.666150 -0.175674 -0.632891 +v 4.123080 0.183338 -0.629995 +v 4.735703 -0.054100 -0.631702 +v 4.765114 0.081066 -0.632011 +v 4.106538 0.113169 -0.629995 +v 4.723645 0.116306 -0.629995 +v 4.728151 0.117376 -0.631422 +v 4.711507 0.187511 -0.630981 +v 4.708388 0.186770 -0.629995 +v 4.719962 -0.126441 -0.634150 +v 4.688086 -0.164835 -0.634114 +v 4.064401 0.186210 -0.646399 +v 4.714441 -0.151812 -0.635583 +v 4.676925 -0.170351 -0.633492 +v 4.052598 0.132314 -0.646399 +v 4.720690 -0.123095 -0.634037 +v 4.054447 0.124576 -0.646399 +v 4.103345 0.113868 -0.631001 +v 4.722555 -0.114526 -0.633747 +v 4.071055 0.194730 -0.646399 +v 4.118765 0.184283 -0.631356 +v 4.630293 -0.139837 -0.629995 +v 4.634929 -0.137547 -0.629995 +v 4.680556 -0.081719 -0.629995 +v 4.268253 0.421382 -0.633549 +v 4.278659 0.421487 -0.633195 +v 4.286528 0.421567 -0.632927 +v 4.222437 0.388558 -0.632660 +v 4.688086 -0.164835 -0.646399 +v 4.720690 -0.123095 -0.646399 +v 4.228974 0.396928 -0.633181 +v 4.247911 0.421175 -0.634690 +v 4.350955 0.374205 -0.629995 +v 4.722555 -0.114526 -0.646399 +v 4.683378 -0.083923 -0.631098 +v 4.310144 0.373791 -0.629995 +v 4.676925 -0.170351 -0.646399 +v 4.240450 0.333619 -0.629995 +v 4.246049 0.340788 -0.629995 +v 4.639005 -0.140730 -0.631587 +v 4.278659 0.421487 -0.646399 +v 4.394099 -0.285511 -0.633487 +v 4.409469 -0.292721 -0.634175 +v 4.383654 -0.280610 -0.633020 +v 4.228974 0.396928 -0.646399 +v 4.455735 -0.279648 -0.633149 +v 4.222437 0.388558 -0.646399 +v 4.419631 -0.297488 -0.634871 +v 4.444062 -0.285416 -0.633706 +v 4.383553 -0.227528 -0.629995 +v 4.469206 -0.219436 -0.629995 +v 4.455633 -0.226143 -0.629995 +v 4.244110 0.344711 -0.631342 +v 4.286528 0.421567 -0.646399 +v 4.308730 0.376652 -0.630978 +v 4.394099 -0.285511 -0.646399 +v 4.576733 0.424511 -0.635386 +v 4.551450 0.424255 -0.633914 +v 4.594549 0.402630 -0.634064 +v 4.604802 0.390037 -0.633303 +v 4.444062 -0.285416 -0.646399 +v 4.455735 -0.279648 -0.646399 +v 4.541232 0.424151 -0.633543 +v 4.455644 -0.231876 -0.631753 +v 4.549916 0.424239 -0.633859 +v 4.383654 -0.280610 -0.646399 +v 4.383561 -0.232012 -0.631381 +v 4.111666 -0.114891 -0.632114 +v 4.582922 0.340867 -0.629995 +v 4.155134 -0.173403 -0.632480 +v 4.154356 -0.173038 -0.632525 +v 4.581714 0.342350 -0.629995 +v 4.517869 0.375898 -0.629995 +v 4.115445 -0.130705 -0.632914 +v 4.145936 -0.169088 -0.633010 +v 4.121924 -0.157823 -0.634392 +v 4.594549 0.402630 -0.646399 +v 4.549916 0.424239 -0.646399 +v 4.568378 0.415301 -0.643281 +v 4.541232 0.424151 -0.646399 +v 4.519594 0.379459 -0.631206 +v 4.153156 -0.081932 -0.629995 +v 4.196329 -0.139695 -0.629995 +v 4.604802 0.390037 -0.646399 +v 4.584473 0.348048 -0.631955 +v 4.777865 0.139668 -0.634247 +v 4.781210 0.155039 -0.634834 +v 4.115445 -0.130705 -0.646399 +v 4.775458 0.128603 -0.633825 +v 4.784359 0.169508 -0.635708 +v 4.765199 0.193040 -0.634315 +v 4.760277 0.199086 -0.633957 +v 4.145936 -0.169088 -0.646399 +v 4.133317 -0.153204 -0.643317 +v 4.715974 0.081052 -0.629995 +v 4.154356 -0.173038 -0.646399 +v 4.697338 0.200342 -0.629995 +v 4.193022 -0.142322 -0.631287 +v 4.111666 -0.114891 -0.646399 +v 4.148186 -0.085880 -0.631960 +v 4.777865 0.139668 -0.646399 +v 4.765199 0.193040 -0.646399 +v 4.760277 0.199086 -0.646399 +v 4.775458 0.128603 -0.646399 +v 4.304957 0.168066 -0.632189 +v 4.524901 0.170215 -0.632189 +v 4.553225 0.051481 -0.632189 +v 4.355995 -0.045886 -0.632189 +v 4.363303 -0.045814 -0.632189 +v 4.278959 0.048801 -0.632189 +v 4.478055 -0.044693 -0.632189 +v 4.414411 0.222100 -0.632189 +v 4.581535 0.341980 -0.629995 +v 4.582705 0.340542 -0.629995 +v 4.467772 0.375018 -0.629995 +v 4.517688 0.375524 -0.629995 +v 4.581535 0.341980 -0.658712 +v 4.503288 0.180364 -0.632189 +v 4.476596 0.290649 -0.644011 +v 4.517688 0.375524 -0.658712 +v 4.438036 0.211006 -0.632189 +v 4.715593 0.081052 -0.629995 +v 4.702889 0.022667 -0.629995 +v 4.723243 0.116211 -0.629995 +v 4.707985 0.186675 -0.629995 +v 4.696979 0.200193 -0.629995 +v 4.658458 0.247505 -0.629995 +v 4.723243 0.116211 -0.658712 +v 4.547720 0.074555 -0.632189 +v 4.707985 0.186675 -0.658712 +v 4.128007 0.024922 -0.629995 +v 4.530994 0.144671 -0.632189 +v 4.141179 -0.030205 -0.629995 +v 4.574986 -0.166751 -0.629995 +v 4.630014 -0.139559 -0.629995 +v 4.634603 -0.137292 -0.629995 +v 4.690276 -0.035298 -0.629995 +v 4.246553 -0.162845 -0.629995 +v 4.680230 -0.081465 -0.629995 +v 4.298389 -0.187163 -0.629995 +v 4.351188 -0.211933 -0.629995 +v 4.522754 -0.192560 -0.629995 +v 4.634603 -0.137292 -0.658712 +v 4.621355 0.293073 -0.629995 +v 4.409286 0.374424 -0.629995 +v 4.168975 0.241497 -0.629995 +v 4.203947 0.286275 -0.629995 +v 4.114634 0.080887 -0.629995 +v 4.132953 0.195374 -0.629995 +v 4.492461 -0.026261 -0.632189 +v 4.123484 0.183249 -0.629995 +v 4.680230 -0.081465 -0.658712 +v 4.536851 0.030532 -0.632189 +v 4.383552 -0.227116 -0.629995 +v 4.106942 0.113081 -0.629995 +v 4.455632 -0.225728 -0.629995 +v 4.469131 -0.219058 -0.629995 +v 4.123484 0.183249 -0.658712 +v 4.383552 -0.227116 -0.658712 +v 4.299848 0.144628 -0.632189 +v 4.284495 0.074199 -0.632189 +v 4.106942 0.113081 -0.658712 +v 4.351028 0.373833 -0.629995 +v 4.383207 -0.045620 -0.632189 +v 4.455289 -0.044915 -0.632189 +v 4.455632 -0.225728 -0.658712 +v 4.310328 0.373420 -0.629995 +v 4.240669 0.333293 -0.629995 +v 4.246233 0.340417 -0.629995 +v 4.153478 -0.081676 -0.629995 +v 4.196654 -0.139436 -0.629995 +v 4.310328 0.373420 -0.658712 +v 4.390870 0.210478 -0.632189 +v 4.153478 -0.081676 -0.658712 +v 4.246233 0.340417 -0.658712 +v 4.294178 0.030095 -0.632189 +v 4.339672 -0.025824 -0.632189 +v 4.271064 -0.080326 -0.643895 +v 4.196654 -0.139436 -0.658712 +v 4.326233 0.178569 -0.632189 +v 4.357168 0.127256 -0.643568 +v 4.343418 0.064177 -0.643568 +v 4.384162 0.014097 -0.643568 +v 4.448720 0.014728 -0.643568 +v 4.488477 0.065595 -0.643568 +v 4.473497 0.128393 -0.643568 +v 4.415059 0.155835 -0.643568 +v 4.321605 0.058974 -0.654298 +v 4.339500 0.141066 -0.654298 +v 4.374630 -0.006200 -0.654298 +v 4.458646 -0.005379 -0.654298 +v 4.510387 0.060819 -0.654298 +v 4.490891 0.142545 -0.654298 +v 4.414840 0.178259 -0.654298 +v 4.328841 0.060700 -0.654298 +v 4.345361 0.136485 -0.654298 +v 4.377792 0.000533 -0.654298 +v 4.455353 0.001290 -0.654298 +v 4.503119 0.062403 -0.654298 +v 4.485122 0.137851 -0.654298 +v 4.414913 0.170821 -0.654298 +v 4.383207 -0.045620 -0.623655 +v 4.286350 0.073793 -0.625128 +v 4.383205 -0.044672 -0.624390 +v 4.455288 -0.044535 -0.623950 +v 4.301770 0.144207 -0.625181 +v 4.455289 -0.044915 -0.623655 +v 4.327125 0.176767 -0.625215 +v 4.294178 0.030095 -0.623655 +v 4.391744 0.208708 -0.625186 +v 4.294875 0.030649 -0.624346 +v 4.437957 0.210842 -0.623797 +v 4.339711 -0.025793 -0.623693 +v 4.502836 0.179430 -0.624460 +v 4.339672 -0.025824 -0.623655 +v 4.529228 0.144252 -0.625063 +v 4.545873 0.074117 -0.625128 +v 4.304956 0.168065 -0.623655 +v 4.304957 0.168066 -0.623655 +v 4.299848 0.144628 -0.623655 +v 4.535739 0.031400 -0.624749 +v 4.284495 0.074199 -0.623655 +v 4.491366 -0.025406 -0.624732 +v 4.278959 0.048801 -0.623655 +v 4.278959 0.048801 -0.623655 +v 4.355995 -0.045886 -0.623655 +v 4.478055 -0.044693 -0.623655 +v 4.478055 -0.044693 -0.623655 +v 4.390870 0.210478 -0.623655 +v 4.355995 -0.045886 -0.623655 +v 4.536851 0.030532 -0.623655 +v 4.326233 0.178569 -0.623655 +v 4.503288 0.180364 -0.623655 +v 4.553225 0.051481 -0.623655 +v 4.553225 0.051481 -0.623655 +v 4.492461 -0.026261 -0.623655 +v 4.530994 0.144671 -0.623655 +v 4.438036 0.211006 -0.623655 +v 4.547720 0.074555 -0.623655 +v 4.524901 0.170215 -0.623655 +v 4.524901 0.170215 -0.623655 +v 4.414411 0.222100 -0.623655 +v 4.414411 0.222100 -0.623655 +vt 0.750000 0.452782 +vt 0.789561 0.448886 +vt 0.827601 0.437346 +vt 0.862660 0.418607 +vt 0.893388 0.393388 +vt 0.918607 0.362660 +vt 0.937346 0.327601 +vt 0.948886 0.289561 +vt 0.952782 0.250000 +vt 0.948886 0.210439 +vt 0.937346 0.172399 +vt 0.918607 0.137340 +vt 0.893388 0.106612 +vt 0.862660 0.081393 +vt 0.827601 0.062654 +vt 0.789561 0.051114 +vt 0.750000 0.047218 +vt 0.710439 0.051114 +vt 0.672399 0.062654 +vt 0.637340 0.081393 +vt 0.606611 0.106612 +vt 0.581393 0.137341 +vt 0.562654 0.172399 +vt 0.551114 0.210439 +vt 0.547218 0.250000 +vt 0.551114 0.289561 +vt 0.562654 0.327601 +vt 0.581393 0.362660 +vt 0.606612 0.393389 +vt 0.637341 0.418607 +vt 0.672399 0.437346 +vt 0.710439 0.448886 +vt 0.375000 0.055549 +vt 0.625000 0.055549 +vt 0.625000 0.250000 +vt 0.375000 0.250000 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.055549 +vt 0.625000 0.055549 +vt 0.625000 0.250000 +vt 0.375000 0.250000 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.055549 +vt 0.625000 0.055549 +vt 0.625000 0.250000 +vt 0.375000 0.250000 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.055549 +vt 0.625000 0.055549 +vt 0.625000 0.250000 +vt 0.375000 0.250000 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.055549 +vt 0.625000 0.055549 +vt 0.625000 0.250000 +vt 0.375000 0.250000 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.055549 +vt 0.625000 0.055549 +vt 0.625000 0.250000 +vt 0.375000 0.250000 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.055549 +vt 0.625000 0.055549 +vt 0.625000 0.250000 +vt 0.375000 0.250000 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.412335 0.317241 +vt 0.412531 0.317322 +vt 0.410609 0.320917 +vt 0.412958 0.315915 +vt 0.152263 0.396274 +vt 0.127928 0.376303 +vt 0.152682 0.395647 +vt 0.156129 0.398340 +vt 0.591195 0.984481 +vt 0.591195 0.971224 +vt 0.625000 0.971315 +vt 0.625000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 0.971255 +vt 0.399843 0.971155 +vt 0.399843 0.984481 +vt 0.153745 0.750000 +vt 0.125000 0.750000 +vt 0.125000 0.694451 +vt 0.167165 0.694451 +vt 0.141327 0.746407 +vt 0.154903 0.746407 +vt 0.833163 0.694451 +vt 0.875000 0.694451 +vt 0.875000 0.750000 +vt 0.846315 0.750000 +vt 0.844748 0.745144 +vt 0.858389 0.745144 +vt 0.600410 0.984481 +vt 0.600410 0.971596 +vt 0.625000 0.971733 +vt 0.625000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 0.971619 +vt 0.408190 0.971582 +vt 0.408190 0.984481 +vt 0.153381 0.750000 +vt 0.125000 0.750000 +vt 0.125000 0.694451 +vt 0.166849 0.694451 +vt 0.141595 0.745218 +vt 0.154928 0.745218 +vt 0.832813 0.694451 +vt 0.875000 0.694451 +vt 0.875000 0.750000 +vt 0.846733 0.750000 +vt 0.845591 0.746455 +vt 0.858683 0.746455 +vt 0.573964 0.984481 +vt 0.573964 0.972443 +vt 0.625000 0.972512 +vt 0.625000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 0.972387 +vt 0.401976 0.972243 +vt 0.401976 0.984481 +vt 0.473116 0.981439 +vt 0.152613 0.750000 +vt 0.125000 0.750000 +vt 0.125000 0.694451 +vt 0.166976 0.694451 +vt 0.141422 0.745990 +vt 0.153908 0.745990 +vt 0.833717 0.694451 +vt 0.875000 0.694451 +vt 0.875000 0.750000 +vt 0.847513 0.750000 +vt 0.845202 0.742873 +vt 0.857878 0.742873 +vt 0.589589 0.984481 +vt 0.589589 0.972622 +vt 0.625000 0.972784 +vt 0.625000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 0.972740 +vt 0.399342 0.972688 +vt 0.399342 0.984481 +vt 0.152260 0.750000 +vt 0.125000 0.750000 +vt 0.125000 0.694451 +vt 0.167183 0.694451 +vt 0.141312 0.746478 +vt 0.153402 0.746478 +vt 0.833224 0.694451 +vt 0.875000 0.694451 +vt 0.875000 0.750000 +vt 0.847784 0.750000 +vt 0.846141 0.744916 +vt 0.858337 0.744916 +vt 0.586096 0.984481 +vt 0.586097 0.972492 +vt 0.625000 0.972524 +vt 0.625000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 0.972577 +vt 0.402404 0.972417 +vt 0.402404 0.984481 +vt 0.152423 0.750000 +vt 0.125000 0.750000 +vt 0.125000 0.694451 +vt 0.167076 0.694451 +vt 0.141408 0.746050 +vt 0.153697 0.746050 +vt 0.833377 0.694451 +vt 0.875000 0.694451 +vt 0.875000 0.750000 +vt 0.847524 0.750000 +vt 0.845706 0.744394 +vt 0.858220 0.744394 +vt 0.588803 0.984481 +vt 0.588803 0.971881 +vt 0.625000 0.972004 +vt 0.625000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 0.972228 +vt 0.415522 0.972094 +vt 0.415522 0.984481 +vt 0.152772 0.750000 +vt 0.125000 0.750000 +vt 0.125000 0.694451 +vt 0.166470 0.694451 +vt 0.141861 0.744036 +vt 0.154703 0.744036 +vt 0.833186 0.694451 +vt 0.875000 0.694451 +vt 0.875000 0.750000 +vt 0.847004 0.750000 +vt 0.845352 0.744893 +vt 0.858332 0.744893 +vt 0.573901 0.984481 +vt 0.573901 0.971321 +vt 0.617771 0.971297 +vt 0.625000 0.971341 +vt 0.625000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 0.971431 +vt 0.403890 0.971415 +vt 0.403890 0.984481 +vt 0.474247 0.981473 +vt 0.153569 0.750000 +vt 0.125000 0.750000 +vt 0.125000 0.694451 +vt 0.166900 0.694451 +vt 0.141484 0.745707 +vt 0.154943 0.745707 +vt 0.833722 0.694451 +vt 0.875000 0.694451 +vt 0.875000 0.750000 +vt 0.846341 0.750000 +vt 0.844047 0.742861 +vt 0.857876 0.742861 +vt 1.000000 1.000000 +vt 0.986735 1.000000 +vt 0.986735 0.975180 +vt 0.995887 0.976695 +vt 1.000000 0.977747 +vt 0.907775 0.970185 +vt 0.934543 0.970185 +vt 0.946423 0.970185 +vt 0.963759 0.971378 +vt 0.983279 0.974608 +vt 0.983279 1.000000 +vt 0.876319 1.000000 +vt 0.876319 0.974036 +vt 0.905764 0.970247 +vt 0.869255 1.000000 +vt 0.857143 1.000000 +vt 0.857143 0.978177 +vt 0.869255 0.975489 +vt 0.719162 0.977782 +vt 0.726537 0.976532 +vt 0.726537 1.000000 +vt 0.714286 1.000000 +vt 0.714286 0.979047 +vt 0.845621 1.000000 +vt 0.845621 0.975664 +vt 0.841207 0.974701 +vt 0.841581 0.974783 +vt 0.841581 1.000000 +vt 0.731550 1.000000 +vt 0.731550 0.975683 +vt 0.751788 0.972253 +vt 0.780127 0.970185 +vt 0.781354 0.970185 +vt 0.784754 0.970185 +vt 0.810380 0.970860 +vt 0.589608 1.000000 +vt 0.589608 0.976540 +vt 0.594829 0.975449 +vt 0.625862 0.971884 +vt 0.655317 0.971403 +vt 0.685556 0.973908 +vt 0.696791 0.975918 +vt 0.696791 1.000000 +vt 0.571429 1.000000 +vt 0.571429 0.980340 +vt 0.584200 0.977671 +vt 0.584200 1.000000 +vt 0.702447 1.000000 +vt 0.702447 0.976930 +vt 0.446758 1.000000 +vt 0.446758 0.977145 +vt 0.467892 0.973849 +vt 0.498048 0.972073 +vt 0.527986 0.973287 +vt 0.554851 0.977003 +vt 0.554851 1.000000 +vt 0.428571 1.000000 +vt 0.428571 0.980569 +vt 0.435005 0.978979 +vt 0.441838 0.977913 +vt 0.441838 1.000000 +vt 0.558661 0.977531 +vt 0.560149 0.977736 +vt 0.558661 1.000000 +vt 0.415389 1.000000 +vt 0.415389 0.978036 +vt 0.309169 0.975385 +vt 0.340075 0.972264 +vt 0.369744 0.972202 +vt 0.400548 0.975185 +vt 0.412002 0.977386 +vt 0.412002 1.000000 +vt 0.305027 1.000000 +vt 0.305027 0.976197 +vt 0.297973 1.000000 +vt 0.285714 1.000000 +vt 0.285714 0.979982 +vt 0.297973 0.977580 +vt 0.416059 0.357087 +vt 0.423064 0.325372 +vt 0.430581 0.291701 +vt 0.438297 0.257223 +vt 0.443039 0.236044 +vt 0.445992 0.234885 +vt 0.478382 0.221132 +vt 0.442688 0.377519 +vt 0.418109 0.358843 +vt 0.437640 0.399638 +vt 0.433246 0.393209 +vt 0.441377 0.383261 +vt 0.184488 0.071792 +vt 0.183417 0.068541 +vt 0.172381 0.033767 +vt 0.329965 0.033767 +vt 0.313923 0.069442 +vt 0.312784 0.071960 +vt 0.283013 0.071276 +vt 0.245500 0.070956 +vt 0.207513 0.071256 +vt 0.335519 0.033767 +vt 0.354132 0.033767 +vt 0.365740 0.048324 +vt 0.432525 0.191471 +vt 0.426641 0.183685 +vt 0.403170 0.153489 +vt 0.380082 0.124766 +vt 0.355564 0.095101 +vt 0.353492 0.092633 +vt 0.355136 0.088999 +vt 0.370656 0.054488 +vt 0.468080 0.176654 +vt 0.436311 0.189957 +vt 0.473222 0.183101 +vt 0.483983 0.196595 +vt 0.480008 0.214008 +vt 0.022842 0.200525 +vt 0.016017 0.196595 +vt 0.027160 0.182623 +vt 0.136101 0.099156 +vt 0.112362 0.128229 +vt 0.089426 0.156450 +vt 0.065503 0.185941 +vt 0.064758 0.186857 +vt 0.061005 0.185471 +vt 0.033572 0.174582 +vt 0.130807 0.052653 +vt 0.142141 0.088637 +vt 0.142886 0.090878 +vt 0.145868 0.033767 +vt 0.165209 0.033767 +vt 0.133885 0.048793 +vt 0.274063 0.977207 +vt 0.274730 0.977308 +vt 0.274063 1.000000 +vt 0.183477 0.972119 +vt 0.212961 0.970801 +vt 0.242560 0.972419 +vt 0.270291 0.976634 +vt 0.270291 1.000000 +vt 0.159634 1.000000 +vt 0.159634 0.975514 +vt 0.156216 1.000000 +vt 0.142857 1.000000 +vt 0.142857 0.978718 +vt 0.151695 0.976645 +vt 0.156216 0.976001 +vt 0.129491 1.000000 +vt 0.129492 0.975976 +vt 0.000000 0.977747 +vt 0.013338 0.975309 +vt 0.013338 1.000000 +vt 0.000000 1.000000 +vt 0.018035 0.974450 +vt 0.028975 0.972450 +vt 0.055005 0.970185 +vt 0.058667 0.970185 +vt 0.084969 0.970185 +vt 0.087492 0.970216 +vt 0.117760 0.973569 +vt 0.124878 0.975029 +vt 0.124878 1.000000 +vt 0.018035 1.000000 +vt 0.019797 0.213154 +vt 0.051909 0.224916 +vt 0.054327 0.225559 +vt 0.062090 0.254257 +vt 0.070975 0.288475 +vt 0.079806 0.322620 +vt 0.086020 0.346400 +vt 0.084307 0.348069 +vt 0.056918 0.375792 +vt 0.021021 0.218517 +vt 0.250000 0.490000 +vt 0.232480 0.481563 +vt 0.267423 0.481609 +vt 0.274590 0.439780 +vt 0.274738 0.437263 +vt 0.293364 0.429104 +vt 0.325828 0.414536 +vt 0.357919 0.399840 +vt 0.387945 0.385993 +vt 0.390902 0.389016 +vt 0.412452 0.411767 +vt 0.271963 0.479423 +vt 0.062360 0.399638 +vt 0.058027 0.380651 +vt 0.079916 0.408092 +vt 0.112684 0.384040 +vt 0.115045 0.381715 +vt 0.120154 0.384464 +vt 0.153938 0.401805 +vt 0.186405 0.417424 +vt 0.220119 0.432677 +vt 0.229066 0.436538 +vt 0.228861 0.439953 +vt 0.226311 0.478592 +vt 0.085976 0.411010 +vt 0.421730 0.407299 +vt 0.307648 0.389175 +vt 0.307723 0.389356 +vt 0.279079 0.396192 +vt 0.279042 0.396002 +vt 0.389114 0.307623 +vt 0.389293 0.307697 +vt 0.376651 0.334626 +vt 0.376489 0.334517 +vt 0.401975 0.280230 +vt 0.402170 0.280269 +vt 0.378724 0.163989 +vt 0.392126 0.191130 +vt 0.391947 0.191204 +vt 0.378562 0.164098 +vt 0.280294 0.097703 +vt 0.280331 0.097514 +vt 0.310444 0.104075 +vt 0.310369 0.104256 +vt 0.139971 0.139972 +vt 0.139834 0.139834 +vt 0.163514 0.120565 +vt 0.163622 0.120726 +vt 0.097536 0.250000 +vt 0.097236 0.219613 +vt 0.097430 0.219652 +vt 0.097729 0.250000 +vt 0.166562 0.374875 +vt 0.143302 0.356698 +vt 0.143440 0.356561 +vt 0.166669 0.374714 +vt 0.250000 0.403132 +vt 0.250000 0.402933 +vt 0.190597 0.393412 +vt 0.190520 0.393597 +vt 0.196887 0.398327 +vt 0.196841 0.398536 +vt 0.233248 0.407130 +vt 0.233294 0.406920 +vt 0.098028 0.280229 +vt 0.097835 0.280268 +vt 0.098236 0.301349 +vt 0.098044 0.301444 +vt 0.119048 0.337500 +vt 0.118879 0.337613 +vt 0.115160 0.334707 +vt 0.115352 0.334612 +vt 0.115335 0.160020 +vt 0.115167 0.159907 +vt 0.114589 0.160627 +vt 0.114397 0.160534 +vt 0.096980 0.193657 +vt 0.097174 0.193751 +vt 0.250000 0.091103 +vt 0.250000 0.090905 +vt 0.231758 0.087128 +vt 0.231708 0.086920 +vt 0.188176 0.100745 +vt 0.188099 0.100558 +vt 0.195143 0.094826 +vt 0.195193 0.095035 +vt 0.364605 0.135395 +vt 0.364460 0.135540 +vt 0.363417 0.132989 +vt 0.363285 0.133159 +vt 0.334455 0.109306 +vt 0.334323 0.109475 +vt 0.409858 0.263439 +vt 0.410071 0.263439 +vt 0.405885 0.218993 +vt 0.409363 0.226037 +vt 0.409147 0.226037 +vt 0.405688 0.219032 +vt 0.334358 0.382801 +vt 0.334490 0.382968 +vt 0.364469 0.360574 +vt 0.364335 0.360405 +vt 0.879125 0.952094 +vt 0.905911 0.952094 +vt 0.934599 0.952094 +vt 0.963724 0.952094 +vt 0.980478 0.952094 +vt 0.980478 1.000000 +vt 0.879125 1.000000 +vt 0.734152 0.952094 +vt 0.752247 0.952094 +vt 0.781767 0.952094 +vt 0.810748 0.952094 +vt 0.838646 0.952094 +vt 0.838646 1.000000 +vt 0.734153 1.000000 +vt 0.592608 0.952094 +vt 0.595198 0.952094 +vt 0.626267 0.952094 +vt 0.655756 0.952094 +vt 0.686031 0.952094 +vt 0.693652 0.952094 +vt 0.693652 1.000000 +vt 0.592608 1.000000 +vt 0.449715 0.952094 +vt 0.467927 0.952094 +vt 0.498171 0.952094 +vt 0.528197 0.952094 +vt 0.552112 0.952094 +vt 0.552112 1.000000 +vt 0.449715 1.000000 +vt 0.307849 0.952094 +vt 0.308788 0.952094 +vt 0.339771 0.952094 +vt 0.369515 0.952094 +vt 0.400396 0.952094 +vt 0.409220 0.952094 +vt 0.409220 1.000000 +vt 0.307849 1.000000 +vt 0.389345 0.328970 +vt 0.351188 0.273135 +vt 0.349989 0.267876 +vt 0.346726 0.253555 +vt 0.477538 0.224832 +vt 0.443640 0.373348 +vt 0.334909 0.201692 +vt 0.331177 0.185313 +vt 0.315627 0.177817 +vt 0.373383 0.057907 +vt 0.465228 0.173077 +vt 0.148795 0.273060 +vt 0.089612 0.238977 +vt 0.153088 0.254285 +vt 0.186333 0.176851 +vt 0.168871 0.185252 +vt 0.164944 0.202428 +vt 0.036137 0.171366 +vt 0.128278 0.055824 +vt 0.267712 0.154721 +vt 0.250039 0.146201 +vt 0.234265 0.153790 +vt 0.176691 0.033767 +vt 0.325971 0.033767 +vt 0.162409 0.952094 +vt 0.183011 0.952094 +vt 0.212500 0.952094 +vt 0.242106 0.952094 +vt 0.267372 0.952094 +vt 0.267372 1.000000 +vt 0.162409 1.000000 +vt 0.028760 0.952094 +vt 0.058382 0.952094 +vt 0.087140 0.952094 +vt 0.117337 0.952094 +vt 0.121913 0.952094 +vt 0.121913 1.000000 +vt 0.020973 1.000000 +vt 0.020973 0.952094 +vt 0.056018 0.371849 +vt 0.021967 0.222664 +vt 0.160868 0.288211 +vt 0.194017 0.329809 +vt 0.204928 0.343503 +vt 0.222629 0.343509 +vt 0.222452 0.476734 +vt 0.089871 0.412886 +vt 0.275820 0.343529 +vt 0.295002 0.343536 +vt 0.306102 0.329628 +vt 0.408767 0.413542 +vt 0.275642 0.477652 +vt 0.339283 0.288052 +vt 0.348645 0.328667 +vt 0.250000 0.376172 +vt 0.151355 0.328667 +vt 0.126992 0.221924 +vt 0.195256 0.136323 +vt 0.304744 0.136323 +vt 0.373008 0.221924 +vt 0.250000 0.401586 +vt 0.368515 0.344513 +vt 0.378377 0.352378 +vt 0.250000 0.414201 +vt 0.397786 0.216269 +vt 0.410084 0.213462 +vt 0.315771 0.113425 +vt 0.321244 0.102060 +vt 0.184229 0.113425 +vt 0.178756 0.102060 +vt 0.102214 0.216269 +vt 0.089916 0.213462 +vt 0.131485 0.344513 +vt 0.121623 0.352378 +vt 0.375000 0.275590 +vt 0.625000 0.275535 +vt 0.375000 0.275500 +vt 0.625000 0.275529 +vt 0.375000 0.276953 +vt 0.625000 0.276274 +vt 0.375000 0.275656 +vt 0.625000 0.275590 +vt 0.375000 0.275978 +vt 0.625000 0.275995 +vt 0.375000 0.276796 +vt 0.625000 0.276345 +vt 0.375000 0.277059 +vt 0.625000 0.276391 +vt 0.856398 0.502042 +vt 0.847674 0.502042 +vt 0.849465 0.500000 +vt 0.875000 0.500000 +vt 0.832412 0.689867 +vt 0.832459 0.689438 +vt 0.859050 0.689438 +vt 0.167652 0.690629 +vt 0.167701 0.691059 +vt 0.125000 0.500000 +vt 0.150590 0.500000 +vt 0.152318 0.501971 +vt 0.143593 0.501971 +vt 0.141088 0.690629 +vt 0.856398 0.502049 +vt 0.847676 0.502049 +vt 0.849471 0.500000 +vt 0.875000 0.500000 +vt 0.832290 0.691138 +vt 0.832340 0.690709 +vt 0.858902 0.690709 +vt 0.167557 0.689479 +vt 0.167604 0.689909 +vt 0.125000 0.500000 +vt 0.150500 0.500000 +vt 0.152330 0.502087 +vt 0.143607 0.502087 +vt 0.140957 0.689479 +vt 0.848726 0.500000 +vt 0.875000 0.500000 +vt 0.832534 0.687880 +vt 0.832575 0.687453 +vt 0.859288 0.687453 +vt 0.856517 0.501077 +vt 0.847785 0.501077 +vt 0.167566 0.689913 +vt 0.167616 0.690344 +vt 0.125000 0.500000 +vt 0.151953 0.500000 +vt 0.152119 0.500190 +vt 0.143377 0.500190 +vt 0.142774 0.592035 +vt 0.141000 0.689913 +vt 0.849410 0.500000 +vt 0.875000 0.500000 +vt 0.832463 0.689644 +vt 0.832513 0.689215 +vt 0.859085 0.689215 +vt 0.856410 0.501970 +vt 0.847690 0.501970 +vt 0.167672 0.690694 +vt 0.167720 0.691124 +vt 0.125000 0.500000 +vt 0.150656 0.500000 +vt 0.152302 0.501884 +vt 0.143580 0.501884 +vt 0.141100 0.690694 +vt 0.849005 0.500000 +vt 0.875000 0.500000 +vt 0.832460 0.689083 +vt 0.832504 0.688653 +vt 0.859141 0.688654 +vt 0.856473 0.501441 +vt 0.847746 0.501441 +vt 0.167612 0.690305 +vt 0.167662 0.690735 +vt 0.125000 0.500000 +vt 0.150978 0.500000 +vt 0.152256 0.501464 +vt 0.143529 0.501464 +vt 0.141048 0.690305 +vt 0.856527 0.500984 +vt 0.847793 0.500984 +vt 0.848655 0.500000 +vt 0.875000 0.500000 +vt 0.832447 0.689797 +vt 0.832497 0.689369 +vt 0.859066 0.689369 +vt 0.167396 0.688069 +vt 0.167443 0.688500 +vt 0.125000 0.500000 +vt 0.151796 0.500000 +vt 0.152141 0.500395 +vt 0.143402 0.500395 +vt 0.140785 0.688069 +vt 0.856534 0.500924 +vt 0.847799 0.500924 +vt 0.848609 0.500000 +vt 0.875000 0.500000 +vt 0.832672 0.687862 +vt 0.832721 0.687435 +vt 0.859303 0.687435 +vt 0.167534 0.689636 +vt 0.167585 0.690068 +vt 0.125000 0.500000 +vt 0.152059 0.500000 +vt 0.152104 0.500052 +vt 0.143360 0.500052 +vt 0.142767 0.590999 +vt 0.140966 0.689636 +vt 0.971926 0.953202 +vt 0.971926 0.970060 +vt 1.000000 0.970060 +vt 1.000000 0.953202 +vt 1.000000 0.953202 +vt 0.857143 0.953202 +vt 0.857143 0.970060 +vt 0.887565 0.970060 +vt 0.887565 0.953202 +vt 0.828921 0.953202 +vt 0.828921 0.970060 +vt 0.857143 0.953202 +vt 0.714286 0.953202 +vt 0.714286 0.970060 +vt 0.744554 0.970060 +vt 0.744554 0.953202 +vt 0.571429 0.970060 +vt 0.598072 0.970059 +vt 0.598072 0.953202 +vt 0.571429 0.953202 +vt 0.571429 0.953202 +vt 0.682436 0.953202 +vt 0.682436 0.970060 +vt 0.705731 0.970059 +vt 0.714286 0.953202 +vt 0.428571 0.970060 +vt 0.459688 0.970060 +vt 0.459688 0.953202 +vt 0.428572 0.953202 +vt 0.428571 0.953202 +vt 0.544050 0.953202 +vt 0.544050 0.970060 +vt 0.285714 0.953202 +vt 0.285714 0.970060 +vt 0.316448 0.970060 +vt 0.316448 0.953202 +vt 0.285714 0.953202 +vt 0.400809 0.953202 +vt 0.400809 0.970060 +vt 0.257770 0.953202 +vt 0.257770 0.970060 +vt 0.142857 0.953202 +vt 0.142857 0.970060 +vt 0.173403 0.970060 +vt 0.173403 0.953202 +vt 0.112131 0.953202 +vt 0.112131 0.970060 +vt 0.142857 0.953202 +vt 0.000000 0.953202 +vt 0.000000 0.970060 +vt 0.027770 0.970060 +vt 0.027770 0.953202 +vt 0.436509 0.398736 +vt 0.436509 0.398736 +vt 0.396791 0.417863 +vt 0.395397 0.414961 +vt 0.285207 0.467896 +vt 0.286652 0.470904 +vt 0.250000 0.488554 +vt 0.472813 0.239678 +vt 0.472731 0.239658 +vt 0.444141 0.358513 +vt 0.445609 0.358866 +vt 0.482573 0.196917 +vt 0.482573 0.196917 +vt 0.377577 0.065256 +vt 0.377069 0.065654 +vt 0.452533 0.161826 +vt 0.453798 0.160833 +vt 0.353505 0.035070 +vt 0.353505 0.035070 +vt 0.146495 0.035070 +vt 0.191586 0.035070 +vt 0.191586 0.037462 +vt 0.313831 0.037425 +vt 0.313830 0.035070 +vt 0.146495 0.035070 +vt 0.017427 0.196917 +vt 0.045194 0.162098 +vt 0.047598 0.164020 +vt 0.123927 0.068533 +vt 0.121412 0.066523 +vt 0.017427 0.196917 +vt 0.063491 0.398736 +vt 0.063491 0.398736 +vt 0.053641 0.355583 +vt 0.053944 0.355518 +vt 0.028158 0.236023 +vt 0.026437 0.236395 +vt 0.213745 0.471095 +vt 0.215223 0.468022 +vt 0.105057 0.415037 +vt 0.103606 0.418055 +vt 0.250000 0.488554 +vt 0.937420 0.533849 +vt 0.934356 0.538582 +vt 0.909393 0.538582 +vt 0.906330 0.533849 +vt 0.906575 0.519291 +vt 0.937175 0.519291 +vt 0.934358 0.657826 +vt 0.934357 0.736465 +vt 0.909392 0.736465 +vt 0.909393 0.657826 +vt 0.903108 0.657826 +vt 0.903107 0.736465 +vt 0.878142 0.736465 +vt 0.878143 0.657826 +vt 0.871858 0.657826 +vt 0.871857 0.736465 +vt 0.846892 0.736465 +vt 0.846893 0.657826 +vt 0.840608 0.657826 +vt 0.840607 0.736465 +vt 0.815642 0.736465 +vt 0.815643 0.657826 +vt 0.809358 0.657826 +vt 0.809357 0.736465 +vt 0.784392 0.736465 +vt 0.784393 0.657826 +vt 0.778108 0.657826 +vt 0.778107 0.736465 +vt 0.753142 0.736465 +vt 0.753143 0.657826 +vt 0.746858 0.657826 +vt 0.746857 0.736465 +vt 0.721892 0.736465 +vt 0.721893 0.657826 +vt 0.715608 0.657826 +vt 0.715607 0.736465 +vt 0.690642 0.736465 +vt 0.690643 0.657826 +vt 0.684358 0.657826 +vt 0.684357 0.736465 +vt 0.659392 0.736465 +vt 0.659393 0.657826 +vt 0.653108 0.657826 +vt 0.653107 0.736465 +vt 0.628142 0.736465 +vt 0.628143 0.657826 +vt 0.621858 0.657826 +vt 0.621857 0.736465 +vt 0.596892 0.736465 +vt 0.596893 0.657826 +vt 0.590608 0.657826 +vt 0.590607 0.736465 +vt 0.565642 0.736465 +vt 0.565643 0.657826 +vt 0.559358 0.657826 +vt 0.559357 0.736465 +vt 0.534392 0.736465 +vt 0.534393 0.657826 +vt 0.528108 0.657826 +vt 0.528107 0.736465 +vt 0.503142 0.736465 +vt 0.503143 0.657826 +vt 0.496858 0.657826 +vt 0.496857 0.736465 +vt 0.471892 0.736465 +vt 0.471893 0.657826 +vt 0.465608 0.657826 +vt 0.465607 0.736465 +vt 0.440642 0.736465 +vt 0.440643 0.657826 +vt 0.434358 0.657826 +vt 0.434357 0.736465 +vt 0.409392 0.736465 +vt 0.409393 0.657826 +vt 0.403108 0.657826 +vt 0.403107 0.736465 +vt 0.378142 0.736465 +vt 0.378143 0.657826 +vt 0.371858 0.657826 +vt 0.371857 0.736465 +vt 0.346892 0.736465 +vt 0.346893 0.657826 +vt 0.340608 0.657826 +vt 0.340607 0.736465 +vt 0.315642 0.736465 +vt 0.315643 0.657826 +vt 0.309358 0.657826 +vt 0.309357 0.736465 +vt 0.284392 0.736465 +vt 0.284393 0.657826 +vt 0.278108 0.657826 +vt 0.278107 0.736465 +vt 0.253142 0.736465 +vt 0.253143 0.657826 +vt 0.246858 0.657826 +vt 0.246857 0.736465 +vt 0.221892 0.736465 +vt 0.221893 0.657826 +vt 0.215608 0.657826 +vt 0.215607 0.736465 +vt 0.190642 0.736465 +vt 0.190643 0.657826 +vt 0.184358 0.657826 +vt 0.184357 0.736465 +vt 0.159392 0.736465 +vt 0.159393 0.657826 +vt 0.153108 0.657826 +vt 0.153107 0.736465 +vt 0.128142 0.736465 +vt 0.128143 0.657826 +vt 0.121858 0.657826 +vt 0.121857 0.736465 +vt 0.096892 0.736465 +vt 0.096893 0.657826 +vt 0.090608 0.657826 +vt 0.090607 0.736465 +vt 0.065642 0.736465 +vt 0.065643 0.657826 +vt 0.906170 0.533849 +vt 0.903106 0.538582 +vt 0.878143 0.538582 +vt 0.875080 0.533849 +vt 0.875325 0.519291 +vt 0.905925 0.519291 +vt 0.965608 0.657826 +vt 0.965607 0.736465 +vt 0.940642 0.736465 +vt 0.940643 0.657826 +vt 0.968670 0.533849 +vt 0.965606 0.538582 +vt 0.940643 0.538582 +vt 0.937580 0.533849 +vt 0.937825 0.519291 +vt 0.968425 0.519291 +vt 0.028106 0.538582 +vt 0.028107 0.630756 +vt 0.003143 0.630756 +vt 0.003143 0.538582 +vt 0.999675 0.519291 +vt 0.969075 0.519291 +vt 0.969962 0.500000 +vt 0.998788 0.500000 +vt 0.750000 0.471391 +vt 0.793191 0.467137 +vt 0.000080 0.966151 +vt 0.003143 0.961418 +vt 0.028106 0.961418 +vt 0.031170 0.966151 +vt 0.030925 0.980709 +vt 0.000325 0.980709 +vt 0.969075 0.980709 +vt 0.999675 0.980709 +vt 0.998788 1.000000 +vt 0.969962 1.000000 +vt 0.293191 0.467137 +vt 0.250000 0.471391 +vt 0.250000 0.452782 +vt 0.289561 0.448886 +vt 0.965607 0.630756 +vt 0.940643 0.630756 +vt 0.938712 0.500000 +vt 0.967538 0.500000 +vt 0.834722 0.454539 +vt 0.965607 0.869244 +vt 0.965606 0.961418 +vt 0.940643 0.961418 +vt 0.940643 0.869244 +vt 0.937825 0.980709 +vt 0.968425 0.980709 +vt 0.967538 1.000000 +vt 0.938712 1.000000 +vt 0.334723 0.454539 +vt 0.327601 0.437346 +vt 0.934357 0.630756 +vt 0.909393 0.630756 +vt 0.907461 0.500000 +vt 0.936288 0.500000 +vt 0.872998 0.434080 +vt 0.934357 0.869244 +vt 0.934356 0.961418 +vt 0.909393 0.961418 +vt 0.909393 0.869244 +vt 0.906575 0.980709 +vt 0.937175 0.980709 +vt 0.936288 1.000000 +vt 0.907462 1.000000 +vt 0.372998 0.434080 +vt 0.362660 0.418607 +vt 0.903107 0.630756 +vt 0.878143 0.630756 +vt 0.876212 0.500000 +vt 0.905038 0.500000 +vt 0.906547 0.406547 +vt 0.903107 0.869244 +vt 0.903106 0.961418 +vt 0.878143 0.961418 +vt 0.878143 0.869244 +vt 0.875325 0.980709 +vt 0.905925 0.980709 +vt 0.905038 1.000000 +vt 0.876212 1.000000 +vt 0.406547 0.406547 +vt 0.393388 0.393388 +vt 0.871856 0.538582 +vt 0.871857 0.630756 +vt 0.846893 0.630756 +vt 0.846893 0.538582 +vt 0.874675 0.519291 +vt 0.844075 0.519291 +vt 0.844962 0.500000 +vt 0.873788 0.500000 +vt 0.934080 0.372998 +vt 0.871857 0.869244 +vt 0.871856 0.961418 +vt 0.846893 0.961418 +vt 0.846893 0.869244 +vt 0.844075 0.980709 +vt 0.874675 0.980709 +vt 0.873788 1.000000 +vt 0.844962 1.000000 +vt 0.434080 0.372998 +vt 0.418607 0.362660 +vt 0.840606 0.538582 +vt 0.840607 0.630756 +vt 0.815643 0.630756 +vt 0.815643 0.538582 +vt 0.843425 0.519291 +vt 0.812825 0.519291 +vt 0.813712 0.500000 +vt 0.842538 0.500000 +vt 0.954539 0.334723 +vt 0.840607 0.869244 +vt 0.840606 0.961418 +vt 0.815643 0.961418 +vt 0.815643 0.869244 +vt 0.812825 0.980709 +vt 0.843425 0.980709 +vt 0.842538 1.000000 +vt 0.813712 1.000000 +vt 0.454539 0.334723 +vt 0.437346 0.327601 +vt 0.809356 0.538582 +vt 0.809357 0.630756 +vt 0.784393 0.630756 +vt 0.784393 0.538582 +vt 0.812175 0.519291 +vt 0.781575 0.519291 +vt 0.782462 0.500000 +vt 0.811288 0.500000 +vt 0.967137 0.293191 +vt 0.809357 0.869244 +vt 0.809356 0.961418 +vt 0.784393 0.961418 +vt 0.784393 0.869244 +vt 0.781575 0.980709 +vt 0.812175 0.980709 +vt 0.811288 1.000000 +vt 0.782462 1.000000 +vt 0.467137 0.293191 +vt 0.448886 0.289561 +vt 0.778106 0.538582 +vt 0.778107 0.630756 +vt 0.753143 0.630756 +vt 0.753143 0.538582 +vt 0.780925 0.519291 +vt 0.750325 0.519291 +vt 0.751211 0.500000 +vt 0.780038 0.500000 +vt 0.971391 0.250000 +vt 0.778107 0.869244 +vt 0.778106 0.961418 +vt 0.753143 0.961418 +vt 0.753143 0.869244 +vt 0.750325 0.980709 +vt 0.780925 0.980709 +vt 0.780038 1.000000 +vt 0.751212 1.000000 +vt 0.471391 0.250000 +vt 0.452782 0.250000 +vt 0.746856 0.538582 +vt 0.746857 0.630756 +vt 0.721893 0.630756 +vt 0.721893 0.538582 +vt 0.749675 0.519291 +vt 0.719075 0.519291 +vt 0.719962 0.500000 +vt 0.748788 0.500000 +vt 0.967137 0.206809 +vt 0.746857 0.869244 +vt 0.746856 0.961418 +vt 0.721893 0.961418 +vt 0.721893 0.869244 +vt 0.719075 0.980709 +vt 0.749675 0.980709 +vt 0.748788 1.000000 +vt 0.719962 1.000000 +vt 0.467137 0.206809 +vt 0.448886 0.210439 +vt 0.715606 0.538582 +vt 0.715607 0.630756 +vt 0.690643 0.630756 +vt 0.690643 0.538582 +vt 0.718425 0.519291 +vt 0.687825 0.519291 +vt 0.688712 0.500000 +vt 0.717538 0.500000 +vt 0.954539 0.165277 +vt 0.715607 0.869244 +vt 0.715606 0.961418 +vt 0.690643 0.961418 +vt 0.690643 0.869244 +vt 0.687825 0.980709 +vt 0.718425 0.980709 +vt 0.717538 1.000000 +vt 0.688712 1.000000 +vt 0.454539 0.165277 +vt 0.437346 0.172399 +vt 0.684356 0.538582 +vt 0.684357 0.630756 +vt 0.659393 0.630756 +vt 0.659393 0.538582 +vt 0.687175 0.519291 +vt 0.656575 0.519291 +vt 0.657462 0.500000 +vt 0.686288 0.500000 +vt 0.934080 0.127002 +vt 0.684357 0.869244 +vt 0.684356 0.961418 +vt 0.659393 0.961418 +vt 0.659393 0.869244 +vt 0.656575 0.980709 +vt 0.687175 0.980709 +vt 0.686288 1.000000 +vt 0.657462 1.000000 +vt 0.434080 0.127002 +vt 0.418607 0.137340 +vt 0.653106 0.538582 +vt 0.653107 0.630756 +vt 0.628143 0.630756 +vt 0.628143 0.538582 +vt 0.655925 0.519291 +vt 0.625325 0.519291 +vt 0.626212 0.500000 +vt 0.655039 0.500000 +vt 0.906547 0.093453 +vt 0.653107 0.869244 +vt 0.653106 0.961418 +vt 0.628143 0.961418 +vt 0.628143 0.869244 +vt 0.625325 0.980709 +vt 0.655925 0.980709 +vt 0.655038 1.000000 +vt 0.626212 1.000000 +vt 0.406547 0.093453 +vt 0.393389 0.106612 +vt 0.621856 0.538582 +vt 0.621857 0.630756 +vt 0.596893 0.630756 +vt 0.596893 0.538582 +vt 0.624675 0.519291 +vt 0.594075 0.519291 +vt 0.594962 0.500000 +vt 0.623788 0.500000 +vt 0.872998 0.065920 +vt 0.621857 0.869244 +vt 0.621856 0.961418 +vt 0.596893 0.961418 +vt 0.596893 0.869244 +vt 0.594075 0.980709 +vt 0.624675 0.980709 +vt 0.623788 1.000000 +vt 0.594962 1.000000 +vt 0.372998 0.065920 +vt 0.362660 0.081393 +vt 0.590606 0.538582 +vt 0.590607 0.630756 +vt 0.565643 0.630756 +vt 0.565643 0.538582 +vt 0.593425 0.519291 +vt 0.562825 0.519291 +vt 0.563712 0.500000 +vt 0.592538 0.500000 +vt 0.834723 0.045461 +vt 0.590607 0.869244 +vt 0.590606 0.961418 +vt 0.565643 0.961418 +vt 0.565643 0.869244 +vt 0.562825 0.980709 +vt 0.593425 0.980709 +vt 0.592538 1.000000 +vt 0.563712 1.000000 +vt 0.334723 0.045461 +vt 0.327601 0.062654 +vt 0.559356 0.538582 +vt 0.559357 0.630756 +vt 0.534393 0.630756 +vt 0.534393 0.538582 +vt 0.562175 0.519291 +vt 0.531575 0.519291 +vt 0.532462 0.500000 +vt 0.561288 0.500000 +vt 0.793191 0.032863 +vt 0.559357 0.869244 +vt 0.559356 0.961418 +vt 0.534393 0.961418 +vt 0.534393 0.869244 +vt 0.531575 0.980709 +vt 0.562175 0.980709 +vt 0.561289 1.000000 +vt 0.532462 1.000000 +vt 0.293191 0.032863 +vt 0.289561 0.051114 +vt 0.528106 0.538582 +vt 0.528107 0.630756 +vt 0.503143 0.630756 +vt 0.503143 0.538582 +vt 0.530925 0.519291 +vt 0.500325 0.519291 +vt 0.501212 0.500000 +vt 0.530038 0.500000 +vt 0.750000 0.028609 +vt 0.528107 0.869244 +vt 0.528106 0.961418 +vt 0.503143 0.961418 +vt 0.503143 0.869244 +vt 0.500325 0.980709 +vt 0.530925 0.980709 +vt 0.530038 1.000000 +vt 0.501212 1.000000 +vt 0.250000 0.028609 +vt 0.250000 0.047218 +vt 0.496856 0.538582 +vt 0.496857 0.630756 +vt 0.471893 0.630756 +vt 0.471893 0.538582 +vt 0.499675 0.519291 +vt 0.469075 0.519291 +vt 0.469962 0.500000 +vt 0.498788 0.500000 +vt 0.706809 0.032863 +vt 0.496857 0.869244 +vt 0.496856 0.961418 +vt 0.471893 0.961418 +vt 0.471893 0.869244 +vt 0.469075 0.980709 +vt 0.499675 0.980709 +vt 0.498789 1.000000 +vt 0.469962 1.000000 +vt 0.206809 0.032863 +vt 0.210439 0.051114 +vt 0.465606 0.538582 +vt 0.465607 0.630756 +vt 0.440643 0.630756 +vt 0.440643 0.538582 +vt 0.468425 0.519291 +vt 0.437825 0.519291 +vt 0.438712 0.500000 +vt 0.467538 0.500000 +vt 0.665277 0.045461 +vt 0.465607 0.869244 +vt 0.465606 0.961418 +vt 0.440643 0.961418 +vt 0.440643 0.869244 +vt 0.437825 0.980709 +vt 0.468425 0.980709 +vt 0.467538 1.000000 +vt 0.438712 1.000000 +vt 0.165277 0.045461 +vt 0.172399 0.062654 +vt 0.434356 0.538582 +vt 0.434357 0.630756 +vt 0.409393 0.630756 +vt 0.409393 0.538582 +vt 0.437175 0.519291 +vt 0.406575 0.519291 +vt 0.407461 0.500000 +vt 0.436288 0.500000 +vt 0.627002 0.065920 +vt 0.434357 0.869244 +vt 0.434356 0.961418 +vt 0.409393 0.961418 +vt 0.409393 0.869244 +vt 0.406575 0.980709 +vt 0.437175 0.980709 +vt 0.436289 1.000000 +vt 0.407462 1.000000 +vt 0.127002 0.065920 +vt 0.137340 0.081393 +vt 0.403106 0.538582 +vt 0.403107 0.630756 +vt 0.378143 0.630756 +vt 0.378143 0.538582 +vt 0.405925 0.519291 +vt 0.375325 0.519291 +vt 0.376212 0.500000 +vt 0.405038 0.500000 +vt 0.593453 0.093453 +vt 0.403107 0.869244 +vt 0.403106 0.961418 +vt 0.378143 0.961418 +vt 0.378143 0.869244 +vt 0.375325 0.980709 +vt 0.405925 0.980709 +vt 0.405038 1.000000 +vt 0.376212 1.000000 +vt 0.093453 0.093453 +vt 0.106611 0.106612 +vt 0.371856 0.538582 +vt 0.371857 0.630756 +vt 0.346893 0.630756 +vt 0.346893 0.538582 +vt 0.374675 0.519291 +vt 0.344075 0.519291 +vt 0.344962 0.500000 +vt 0.373788 0.500000 +vt 0.565920 0.127002 +vt 0.371857 0.869244 +vt 0.371856 0.961418 +vt 0.346893 0.961418 +vt 0.346893 0.869244 +vt 0.344075 0.980709 +vt 0.374675 0.980709 +vt 0.373788 1.000000 +vt 0.344962 1.000000 +vt 0.065920 0.127002 +vt 0.081393 0.137341 +vt 0.340606 0.538582 +vt 0.340607 0.630756 +vt 0.315643 0.630756 +vt 0.315643 0.538582 +vt 0.343425 0.519291 +vt 0.312825 0.519291 +vt 0.313711 0.500000 +vt 0.342539 0.500000 +vt 0.545461 0.165278 +vt 0.340607 0.869244 +vt 0.340606 0.961418 +vt 0.315643 0.961418 +vt 0.315643 0.869244 +vt 0.312825 0.980709 +vt 0.343425 0.980709 +vt 0.342539 1.000000 +vt 0.313712 1.000000 +vt 0.045461 0.165278 +vt 0.062654 0.172399 +vt 0.309356 0.538582 +vt 0.309357 0.630756 +vt 0.284393 0.630756 +vt 0.284393 0.538582 +vt 0.312175 0.519291 +vt 0.281575 0.519291 +vt 0.282462 0.500000 +vt 0.311288 0.500000 +vt 0.532863 0.206809 +vt 0.309357 0.869244 +vt 0.309356 0.961418 +vt 0.284393 0.961418 +vt 0.284393 0.869244 +vt 0.281575 0.980709 +vt 0.312175 0.980709 +vt 0.311288 1.000000 +vt 0.282462 1.000000 +vt 0.032863 0.206809 +vt 0.051114 0.210439 +vt 0.278106 0.538582 +vt 0.278107 0.630756 +vt 0.253143 0.630756 +vt 0.253143 0.538582 +vt 0.280925 0.519291 +vt 0.250325 0.519291 +vt 0.251212 0.500000 +vt 0.280038 0.500000 +vt 0.528609 0.250000 +vt 0.278107 0.869244 +vt 0.278106 0.961418 +vt 0.253143 0.961418 +vt 0.253143 0.869244 +vt 0.250325 0.980709 +vt 0.280925 0.980709 +vt 0.280038 1.000000 +vt 0.251212 1.000000 +vt 0.028609 0.250000 +vt 0.047218 0.250000 +vt 0.246856 0.538582 +vt 0.246857 0.630756 +vt 0.221893 0.630756 +vt 0.221893 0.538582 +vt 0.249675 0.519291 +vt 0.219075 0.519291 +vt 0.219962 0.500000 +vt 0.248788 0.500000 +vt 0.532863 0.293191 +vt 0.246857 0.869244 +vt 0.246856 0.961418 +vt 0.221893 0.961418 +vt 0.221893 0.869244 +vt 0.219075 0.980709 +vt 0.249675 0.980709 +vt 0.248788 1.000000 +vt 0.219962 1.000000 +vt 0.032863 0.293191 +vt 0.051115 0.289561 +vt 0.215606 0.538582 +vt 0.215607 0.630756 +vt 0.190643 0.630756 +vt 0.190643 0.538582 +vt 0.218425 0.519291 +vt 0.187825 0.519291 +vt 0.188712 0.500000 +vt 0.217538 0.500000 +vt 0.545462 0.334723 +vt 0.215607 0.869244 +vt 0.215606 0.961418 +vt 0.190643 0.961418 +vt 0.190643 0.869244 +vt 0.187825 0.980709 +vt 0.218425 0.980709 +vt 0.217538 1.000000 +vt 0.188712 1.000000 +vt 0.045462 0.334723 +vt 0.062654 0.327601 +vt 0.184356 0.538582 +vt 0.184357 0.630756 +vt 0.159393 0.630756 +vt 0.159393 0.538582 +vt 0.187175 0.519291 +vt 0.156575 0.519291 +vt 0.157462 0.500000 +vt 0.186288 0.500000 +vt 0.565920 0.372998 +vt 0.184357 0.869244 +vt 0.184356 0.961418 +vt 0.159393 0.961418 +vt 0.159393 0.869244 +vt 0.156575 0.980709 +vt 0.187175 0.980709 +vt 0.186288 1.000000 +vt 0.157462 1.000000 +vt 0.065920 0.372998 +vt 0.081393 0.362660 +vt 0.153106 0.538582 +vt 0.153107 0.630756 +vt 0.128143 0.630756 +vt 0.128143 0.538582 +vt 0.155925 0.519291 +vt 0.125325 0.519291 +vt 0.126212 0.500000 +vt 0.155038 0.500000 +vt 0.593453 0.406547 +vt 0.153107 0.869244 +vt 0.153106 0.961418 +vt 0.128143 0.961418 +vt 0.128143 0.869244 +vt 0.125325 0.980709 +vt 0.155925 0.980709 +vt 0.155038 1.000000 +vt 0.126212 1.000000 +vt 0.093453 0.406547 +vt 0.106612 0.393389 +vt 0.121856 0.538582 +vt 0.121857 0.630756 +vt 0.096893 0.630756 +vt 0.096893 0.538582 +vt 0.124675 0.519291 +vt 0.094075 0.519291 +vt 0.094962 0.500000 +vt 0.123788 0.500000 +vt 0.627002 0.434080 +vt 0.121857 0.869244 +vt 0.121856 0.961418 +vt 0.096893 0.961418 +vt 0.096893 0.869244 +vt 0.094075 0.980709 +vt 0.124675 0.980709 +vt 0.123788 1.000000 +vt 0.094962 1.000000 +vt 0.127002 0.434080 +vt 0.137341 0.418607 +vt 0.090606 0.538582 +vt 0.090607 0.630756 +vt 0.065643 0.630756 +vt 0.065643 0.538582 +vt 0.093425 0.519291 +vt 0.062825 0.519291 +vt 0.063712 0.500000 +vt 0.092538 0.500000 +vt 0.665278 0.454539 +vt 0.090607 0.869244 +vt 0.090606 0.961418 +vt 0.065643 0.961418 +vt 0.065643 0.869244 +vt 0.062825 0.980709 +vt 0.093425 0.980709 +vt 0.092538 1.000000 +vt 0.063712 1.000000 +vt 0.165278 0.454539 +vt 0.172399 0.437346 +vt 0.059356 0.538582 +vt 0.059357 0.630756 +vt 0.034393 0.630756 +vt 0.034393 0.538582 +vt 0.062175 0.519291 +vt 0.031575 0.519291 +vt 0.032462 0.500000 +vt 0.061288 0.500000 +vt 0.706809 0.467137 +vt 0.059357 0.869244 +vt 0.059356 0.961418 +vt 0.034393 0.961418 +vt 0.034393 0.869244 +vt 0.031575 0.980709 +vt 0.062175 0.980709 +vt 0.061288 1.000000 +vt 0.032462 1.000000 +vt 0.206809 0.467137 +vt 0.210440 0.448886 +vt 0.999920 0.533849 +vt 0.996856 0.538582 +vt 0.971893 0.538582 +vt 0.968830 0.533849 +vt 0.030925 0.519291 +vt 0.000325 0.519291 +vt 0.001212 0.500000 +vt 0.030038 0.500000 +vt 0.028107 0.869244 +vt 0.003143 0.869244 +vt 0.030038 1.000000 +vt 0.001212 1.000000 +vt 0.996857 0.763535 +vt 0.996858 0.842174 +vt 0.971893 0.842174 +vt 0.971892 0.763535 +vt 0.996857 0.869244 +vt 0.996856 0.961418 +vt 0.971893 0.961418 +vt 0.971893 0.869244 +vt 0.968830 0.966151 +vt 0.999920 0.966151 +vt 0.031330 0.966151 +vt 0.062420 0.966151 +vt 0.937580 0.966151 +vt 0.968670 0.966151 +vt 0.059358 0.657826 +vt 0.059357 0.736465 +vt 0.034392 0.736465 +vt 0.034393 0.657826 +vt 0.059357 0.763535 +vt 0.059358 0.842174 +vt 0.034393 0.842174 +vt 0.034392 0.763535 +vt 0.934357 0.763535 +vt 0.934358 0.842174 +vt 0.909393 0.842174 +vt 0.909392 0.763535 +vt 0.934333 0.644291 +vt 0.909417 0.644291 +vt 0.028083 0.855709 +vt 0.003167 0.855709 +vt 0.003143 0.842174 +vt 0.028108 0.842174 +vt 0.062580 0.966151 +vt 0.093670 0.966151 +vt 0.812500 0.538582 +vt 0.812500 0.630756 +vt 0.062420 0.533849 +vt 0.031330 0.533849 +vt 0.093830 0.966151 +vt 0.124920 0.966151 +vt 0.090607 0.763535 +vt 0.090608 0.842174 +vt 0.065643 0.842174 +vt 0.065642 0.763535 +vt 0.093670 0.533849 +vt 0.062580 0.533849 +vt 0.125080 0.966151 +vt 0.156170 0.966151 +vt 0.121857 0.763535 +vt 0.121858 0.842174 +vt 0.096893 0.842174 +vt 0.096892 0.763535 +vt 0.124920 0.533849 +vt 0.093830 0.533849 +vt 0.156330 0.966151 +vt 0.187420 0.966151 +vt 0.153107 0.763535 +vt 0.153108 0.842174 +vt 0.128143 0.842174 +vt 0.128142 0.763535 +vt 0.156170 0.533849 +vt 0.125080 0.533849 +vt 0.187580 0.966151 +vt 0.218670 0.966151 +vt 0.184357 0.763535 +vt 0.184358 0.842174 +vt 0.159393 0.842174 +vt 0.159392 0.763535 +vt 0.187420 0.533849 +vt 0.156330 0.533849 +vt 0.218830 0.966151 +vt 0.249920 0.966151 +vt 0.215607 0.763535 +vt 0.215608 0.842174 +vt 0.190643 0.842174 +vt 0.190642 0.763535 +vt 0.218670 0.533849 +vt 0.187580 0.533849 +vt 0.250080 0.966151 +vt 0.281170 0.966151 +vt 0.246857 0.763535 +vt 0.246858 0.842174 +vt 0.221893 0.842174 +vt 0.221892 0.763535 +vt 0.249920 0.533849 +vt 0.218830 0.533849 +vt 0.281330 0.966151 +vt 0.312420 0.966151 +vt 0.278107 0.763535 +vt 0.278108 0.842174 +vt 0.253143 0.842174 +vt 0.253142 0.763535 +vt 0.281170 0.533849 +vt 0.250080 0.533849 +vt 0.312580 0.966151 +vt 0.343670 0.966151 +vt 0.309357 0.763535 +vt 0.309358 0.842174 +vt 0.284393 0.842174 +vt 0.284392 0.763535 +vt 0.312420 0.533849 +vt 0.281330 0.533849 +vt 0.343830 0.966151 +vt 0.374920 0.966151 +vt 0.340607 0.763535 +vt 0.340608 0.842174 +vt 0.315643 0.842174 +vt 0.315642 0.763535 +vt 0.343670 0.533849 +vt 0.312580 0.533849 +vt 0.375080 0.966151 +vt 0.406170 0.966151 +vt 0.371857 0.763535 +vt 0.371858 0.842174 +vt 0.346893 0.842174 +vt 0.346892 0.763535 +vt 0.374920 0.533849 +vt 0.343830 0.533849 +vt 0.406330 0.966151 +vt 0.437420 0.966151 +vt 0.403107 0.763535 +vt 0.403108 0.842174 +vt 0.378143 0.842174 +vt 0.378142 0.763535 +vt 0.406170 0.533849 +vt 0.375080 0.533849 +vt 0.437580 0.966151 +vt 0.468670 0.966151 +vt 0.434357 0.763535 +vt 0.434358 0.842174 +vt 0.409393 0.842174 +vt 0.409392 0.763535 +vt 0.437420 0.533849 +vt 0.406330 0.533849 +vt 0.468830 0.966151 +vt 0.499920 0.966151 +vt 0.465607 0.763535 +vt 0.465608 0.842174 +vt 0.440643 0.842174 +vt 0.440642 0.763535 +vt 0.468670 0.533849 +vt 0.437580 0.533849 +vt 0.500080 0.966151 +vt 0.531170 0.966151 +vt 0.496857 0.763535 +vt 0.496858 0.842174 +vt 0.471893 0.842174 +vt 0.471892 0.763535 +vt 0.499920 0.533849 +vt 0.468830 0.533849 +vt 0.531330 0.966151 +vt 0.562420 0.966151 +vt 0.528107 0.763535 +vt 0.528108 0.842174 +vt 0.503143 0.842174 +vt 0.503142 0.763535 +vt 0.531170 0.533849 +vt 0.500080 0.533849 +vt 0.562580 0.966151 +vt 0.593670 0.966151 +vt 0.559357 0.763535 +vt 0.559358 0.842174 +vt 0.534393 0.842174 +vt 0.534392 0.763535 +vt 0.562420 0.533849 +vt 0.531330 0.533849 +vt 0.593830 0.966151 +vt 0.624920 0.966151 +vt 0.590607 0.763535 +vt 0.590608 0.842174 +vt 0.565643 0.842174 +vt 0.565642 0.763535 +vt 0.593670 0.533849 +vt 0.562580 0.533849 +vt 0.625080 0.966151 +vt 0.656170 0.966151 +vt 0.621857 0.763535 +vt 0.621858 0.842174 +vt 0.596893 0.842174 +vt 0.596892 0.763535 +vt 0.624920 0.533849 +vt 0.593830 0.533849 +vt 0.656330 0.966151 +vt 0.687420 0.966151 +vt 0.653107 0.763535 +vt 0.653108 0.842174 +vt 0.628143 0.842174 +vt 0.628142 0.763535 +vt 0.656170 0.533849 +vt 0.625080 0.533849 +vt 0.687580 0.966151 +vt 0.718670 0.966151 +vt 0.684357 0.763535 +vt 0.684358 0.842174 +vt 0.659393 0.842174 +vt 0.659392 0.763535 +vt 0.687420 0.533849 +vt 0.656330 0.533849 +vt 0.718830 0.966151 +vt 0.749920 0.966151 +vt 0.715607 0.763535 +vt 0.715608 0.842174 +vt 0.690643 0.842174 +vt 0.690642 0.763535 +vt 0.718670 0.533849 +vt 0.687580 0.533849 +vt 0.750080 0.966151 +vt 0.781170 0.966151 +vt 0.746857 0.763535 +vt 0.746858 0.842174 +vt 0.721893 0.842174 +vt 0.721892 0.763535 +vt 0.749920 0.533849 +vt 0.718830 0.533849 +vt 0.781330 0.966151 +vt 0.812420 0.966151 +vt 0.778107 0.763535 +vt 0.778108 0.842174 +vt 0.753143 0.842174 +vt 0.753142 0.763535 +vt 0.781170 0.533849 +vt 0.750080 0.533849 +vt 0.812580 0.966151 +vt 0.843670 0.966151 +vt 0.809357 0.763535 +vt 0.809358 0.842174 +vt 0.784393 0.842174 +vt 0.784392 0.763535 +vt 0.812420 0.533849 +vt 0.781330 0.533849 +vt 0.843830 0.966151 +vt 0.874920 0.966151 +vt 0.840607 0.763535 +vt 0.840608 0.842174 +vt 0.815643 0.842174 +vt 0.815642 0.763535 +vt 0.843670 0.533849 +vt 0.812580 0.533849 +vt 0.875080 0.966151 +vt 0.906170 0.966151 +vt 0.871857 0.763535 +vt 0.871858 0.842174 +vt 0.846893 0.842174 +vt 0.846892 0.763535 +vt 0.874920 0.533849 +vt 0.843830 0.533849 +vt 0.906330 0.966151 +vt 0.937420 0.966151 +vt 0.903107 0.763535 +vt 0.903108 0.842174 +vt 0.878143 0.842174 +vt 0.878142 0.763535 +vt 0.028108 0.657826 +vt 0.028107 0.736465 +vt 0.003142 0.736465 +vt 0.003143 0.657826 +vt 0.965607 0.763535 +vt 0.965608 0.842174 +vt 0.940643 0.842174 +vt 0.940642 0.763535 +vt 0.028107 0.763535 +vt 0.003142 0.763535 +vt 0.878166 0.750000 +vt 0.903083 0.750000 +vt 0.909417 0.855709 +vt 0.934333 0.855709 +vt 0.996858 0.657826 +vt 0.996857 0.736465 +vt 0.971892 0.736465 +vt 0.971893 0.657826 +vt 0.971917 0.644291 +vt 0.996833 0.644291 +vt 0.971916 0.750000 +vt 0.996833 0.750000 +vt 0.971917 0.855709 +vt 0.996833 0.855709 +vt 0.940667 0.644291 +vt 0.965583 0.644291 +vt 0.028083 0.750000 +vt 0.003166 0.750000 +vt 0.940667 0.855709 +vt 0.965583 0.855709 +vt 0.065667 0.644291 +vt 0.090583 0.644291 +vt 0.065667 0.855709 +vt 0.090583 0.855709 +vt 0.096916 0.750000 +vt 0.121833 0.750000 +vt 0.128167 0.644291 +vt 0.153083 0.644291 +vt 0.096917 0.855709 +vt 0.121833 0.855709 +vt 0.128166 0.750000 +vt 0.153083 0.750000 +vt 0.159417 0.855709 +vt 0.184333 0.855709 +vt 0.159417 0.644291 +vt 0.184333 0.644291 +vt 0.190666 0.750000 +vt 0.215583 0.750000 +vt 0.221917 0.644291 +vt 0.246833 0.644291 +vt 0.221917 0.855709 +vt 0.246833 0.855709 +vt 0.253166 0.750000 +vt 0.278083 0.750000 +vt 0.284417 0.644291 +vt 0.309333 0.644291 +vt 0.284417 0.855709 +vt 0.309333 0.855709 +vt 0.315666 0.750000 +vt 0.340583 0.750000 +vt 0.346917 0.644291 +vt 0.371833 0.644291 +vt 0.315667 0.855709 +vt 0.340583 0.855709 +vt 0.346916 0.750000 +vt 0.371833 0.750000 +vt 0.378167 0.855709 +vt 0.403083 0.855709 +vt 0.378167 0.644291 +vt 0.403083 0.644291 +vt 0.409416 0.750000 +vt 0.434333 0.750000 +vt 0.440667 0.644291 +vt 0.465583 0.644291 +vt 0.440667 0.855709 +vt 0.465583 0.855709 +vt 0.471916 0.750000 +vt 0.496833 0.750000 +vt 0.503167 0.644291 +vt 0.528083 0.644291 +vt 0.503167 0.855709 +vt 0.528083 0.855709 +vt 0.534416 0.750000 +vt 0.559333 0.750000 +vt 0.565667 0.644291 +vt 0.590583 0.644291 +vt 0.534417 0.855709 +vt 0.559333 0.855709 +vt 0.565666 0.750000 +vt 0.590583 0.750000 +vt 0.596917 0.855709 +vt 0.621833 0.855709 +vt 0.596917 0.644291 +vt 0.621833 0.644291 +vt 0.628166 0.750000 +vt 0.653083 0.750000 +vt 0.659417 0.644291 +vt 0.684333 0.644291 +vt 0.659417 0.855709 +vt 0.684333 0.855709 +vt 0.690666 0.750000 +vt 0.715583 0.750000 +vt 0.721917 0.644291 +vt 0.746833 0.644291 +vt 0.721917 0.855709 +vt 0.746833 0.855709 +vt 0.753166 0.750000 +vt 0.778083 0.750000 +vt 0.784417 0.644291 +vt 0.809333 0.644291 +vt 0.753167 0.855709 +vt 0.778083 0.855709 +vt 0.784416 0.750000 +vt 0.809333 0.750000 +vt 0.815667 0.855709 +vt 0.840583 0.855709 +vt 0.815667 0.644291 +vt 0.840583 0.644291 +vt 0.846916 0.750000 +vt 0.871833 0.750000 +vt 0.878167 0.644291 +vt 0.903083 0.644291 +vt 0.934333 0.750000 +vt 0.909416 0.750000 +vt 0.878167 0.855709 +vt 0.903083 0.855709 +vt 0.059333 0.644291 +vt 0.034417 0.644291 +vt 0.940666 0.750000 +vt 0.965583 0.750000 +vt 0.059333 0.855709 +vt 0.034417 0.855709 +vt 0.996857 0.630756 +vt 0.971893 0.630756 +vt 0.846917 0.855709 +vt 0.871833 0.855709 +vt 0.784417 0.855709 +vt 0.809333 0.855709 +vt 0.690667 0.855709 +vt 0.715583 0.855709 +vt 0.628167 0.855709 +vt 0.653083 0.855709 +vt 0.565667 0.855709 +vt 0.590583 0.855709 +vt 0.471917 0.855709 +vt 0.496833 0.855709 +vt 0.409417 0.855709 +vt 0.434333 0.855709 +vt 0.346917 0.855709 +vt 0.371833 0.855709 +vt 0.253167 0.855709 +vt 0.278083 0.855709 +vt 0.190667 0.855709 +vt 0.215583 0.855709 +vt 0.128167 0.855709 +vt 0.153083 0.855709 +vt 0.034416 0.750000 +vt 0.059333 0.750000 +vt 0.815666 0.750000 +vt 0.840583 0.750000 +vt 0.721916 0.750000 +vt 0.746833 0.750000 +vt 0.659416 0.750000 +vt 0.684333 0.750000 +vt 0.596916 0.750000 +vt 0.621833 0.750000 +vt 0.503166 0.750000 +vt 0.528083 0.750000 +vt 0.440666 0.750000 +vt 0.465583 0.750000 +vt 0.378166 0.750000 +vt 0.403083 0.750000 +vt 0.284416 0.750000 +vt 0.309333 0.750000 +vt 0.221916 0.750000 +vt 0.246833 0.750000 +vt 0.159416 0.750000 +vt 0.184333 0.750000 +vt 0.065666 0.750000 +vt 0.090583 0.750000 +vt 0.028083 0.644291 +vt 0.003167 0.644291 +vt 0.846917 0.644291 +vt 0.871833 0.644291 +vt 0.753167 0.644291 +vt 0.778083 0.644291 +vt 0.690667 0.644291 +vt 0.715583 0.644291 +vt 0.628167 0.644291 +vt 0.653083 0.644291 +vt 0.534417 0.644291 +vt 0.559333 0.644291 +vt 0.471917 0.644291 +vt 0.496833 0.644291 +vt 0.409417 0.644291 +vt 0.434333 0.644291 +vt 0.315667 0.644291 +vt 0.340583 0.644291 +vt 0.253167 0.644291 +vt 0.278083 0.644291 +vt 0.190667 0.644291 +vt 0.215583 0.644291 +vt 0.096917 0.644291 +vt 0.121833 0.644291 +vt 0.001573 0.538522 +vt 0.000002 0.538461 +vt 0.000080 0.533849 +vt -0.003083 0.961658 +vt 0.000030 0.961538 +vt 0.968771 0.538582 +vt 0.968711 0.961418 +vt 0.971816 0.961418 +vt 0.937521 0.538582 +vt 0.937461 0.961418 +vt 0.906271 0.538582 +vt 0.906211 0.961418 +vt 0.909316 0.961418 +vt 0.875021 0.538582 +vt 0.874961 0.961418 +vt 0.843771 0.538582 +vt 0.843711 0.961418 +vt 0.846816 0.961418 +vt 0.812461 0.961418 +vt 0.781271 0.538582 +vt 0.781211 0.961418 +vt 0.784316 0.961418 +vt 0.750021 0.538582 +vt 0.749961 0.961418 +vt 0.718771 0.538582 +vt 0.718711 0.961418 +vt 0.721816 0.961418 +vt 0.687521 0.538582 +vt 0.687461 0.961418 +vt 0.656271 0.538582 +vt 0.656211 0.961418 +vt 0.659316 0.961418 +vt 0.625021 0.538582 +vt 0.624961 0.961418 +vt 0.593771 0.538582 +vt 0.593711 0.961418 +vt 0.596816 0.961418 +vt 0.562521 0.538582 +vt 0.562461 0.961418 +vt 0.531271 0.538582 +vt 0.531211 0.961418 +vt 0.534316 0.961418 +vt 0.500011 0.538582 +vt 0.499980 0.961418 +vt 0.468771 0.538582 +vt 0.468711 0.961418 +vt 0.471816 0.961418 +vt 0.437521 0.538582 +vt 0.437461 0.961418 +vt 0.406271 0.538582 +vt 0.406211 0.961418 +vt 0.409316 0.961418 +vt 0.375021 0.538582 +vt 0.374961 0.961418 +vt 0.343771 0.538582 +vt 0.343711 0.961418 +vt 0.346816 0.961418 +vt 0.312521 0.538582 +vt 0.312461 0.961418 +vt 0.281271 0.538582 +vt 0.281211 0.961418 +vt 0.284316 0.961418 +vt 0.250021 0.538582 +vt 0.249961 0.961418 +vt 0.218771 0.538582 +vt 0.218711 0.961418 +vt 0.221816 0.961418 +vt 0.187521 0.538582 +vt 0.187461 0.961418 +vt 0.156271 0.538582 +vt 0.156211 0.961418 +vt 0.159316 0.961418 +vt 0.125021 0.538582 +vt 0.124961 0.961418 +vt 0.093771 0.538582 +vt 0.093711 0.961418 +vt 0.096816 0.961418 +vt 0.062521 0.538582 +vt 0.062461 0.961418 +vt 0.031271 0.538582 +vt 0.031170 0.533849 +vt 0.031211 0.961418 +vt 0.034316 0.961418 +vt 0.906250 0.630756 +vt 0.906250 0.644291 +vt 0.687500 0.630756 +vt 0.687500 0.644291 +vt 0.468750 0.630756 +vt 0.468750 0.644291 +vt 0.250000 0.630756 +vt 0.250000 0.644291 +vt 0.062500 0.630756 +vt 0.062500 0.644291 +vt 0.718750 0.736465 +vt 0.718750 0.750000 +vt 0.500000 0.736465 +vt 0.500000 0.750000 +vt 0.281250 0.736465 +vt 0.281250 0.750000 +vt 0.031250 0.763535 +vt 0.031250 0.750000 +vt 0.750000 0.842174 +vt 0.750000 0.855709 +vt 0.531250 0.842174 +vt 0.531250 0.855709 +vt 0.312500 0.842174 +vt 0.312500 0.855709 +vt 0.093750 0.842174 +vt 0.093750 0.855709 +vt 0.001571 0.842212 +vt 0.001584 0.855709 +vt 0.000000 0.855709 +vt 0.000000 0.842251 +vt 0.843750 0.630756 +vt 0.843750 0.644291 +vt 0.812500 0.644291 +vt 0.750000 0.630756 +vt 0.750000 0.644291 +vt 0.625000 0.630756 +vt 0.625000 0.644291 +vt 0.593750 0.630756 +vt 0.593750 0.644291 +vt 0.531250 0.630756 +vt 0.531250 0.644291 +vt 0.406250 0.630756 +vt 0.406250 0.644291 +vt 0.375000 0.630756 +vt 0.375000 0.644291 +vt 0.312500 0.630756 +vt 0.312500 0.644291 +vt 0.187500 0.630756 +vt 0.187500 0.644291 +vt 0.156250 0.630756 +vt 0.156250 0.644291 +vt 0.093750 0.630756 +vt 0.093750 0.644291 +vt 0.968750 0.657826 +vt 0.968750 0.644291 +vt 0.001572 0.630786 +vt 0.001584 0.644291 +vt 0.000000 0.644291 +vt 0.000000 0.630817 +vt 0.875000 0.736465 +vt 0.875000 0.750000 +vt 0.843750 0.736465 +vt 0.843750 0.750000 +vt 0.781250 0.736465 +vt 0.781250 0.750000 +vt 0.656250 0.736465 +vt 0.656250 0.750000 +vt 0.625000 0.736465 +vt 0.625000 0.750000 +vt 0.562500 0.736465 +vt 0.562500 0.750000 +vt 0.437500 0.736465 +vt 0.437500 0.750000 +vt 0.406250 0.736465 +vt 0.406250 0.750000 +vt 0.343750 0.736465 +vt 0.343750 0.750000 +vt 0.218750 0.736465 +vt 0.218750 0.750000 +vt 0.187500 0.736465 +vt 0.187500 0.750000 +vt 0.125000 0.736465 +vt 0.125000 0.750000 +vt 0.937500 0.763535 +vt 0.937500 0.750000 +vt 0.968750 0.763535 +vt 0.968750 0.750000 +vt 0.906250 0.842174 +vt 0.906250 0.855709 +vt 0.875000 0.842174 +vt 0.875000 0.855709 +vt 0.812500 0.842174 +vt 0.812500 0.855709 +vt 0.687500 0.842174 +vt 0.687500 0.855709 +vt 0.656250 0.842174 +vt 0.656250 0.855709 +vt 0.593750 0.842174 +vt 0.593750 0.855709 +vt 0.468750 0.842174 +vt 0.468750 0.855709 +vt 0.437500 0.842174 +vt 0.437500 0.855709 +vt 0.375000 0.842174 +vt 0.375000 0.855709 +vt 0.250000 0.842174 +vt 0.250000 0.855709 +vt 0.218750 0.842174 +vt 0.218750 0.855709 +vt 0.156250 0.842174 +vt 0.156250 0.855709 +vt 0.062500 0.842174 +vt 0.062500 0.855709 +vt 0.937500 0.869244 +vt 0.937500 0.855709 +vt 0.968750 0.869244 +vt 0.968750 0.855709 +vt 0.031250 0.869244 +vt 0.031250 0.855709 +vt 0.125000 0.842174 +vt 0.125000 0.855709 +vt 0.187500 0.842174 +vt 0.187500 0.855709 +vt 0.281250 0.842174 +vt 0.281250 0.855709 +vt 0.343750 0.842174 +vt 0.343750 0.855709 +vt 0.406250 0.842174 +vt 0.406250 0.855709 +vt 0.500000 0.842174 +vt 0.500000 0.855709 +vt 0.562500 0.842174 +vt 0.562500 0.855709 +vt 0.625000 0.842174 +vt 0.625000 0.855709 +vt 0.718750 0.842174 +vt 0.718750 0.855709 +vt 0.781250 0.842174 +vt 0.781250 0.855709 +vt 0.843750 0.842174 +vt 0.843750 0.855709 +vt 0.001571 0.736499 +vt 0.001583 0.750000 +vt 0.000000 0.750000 +vt 0.000000 0.736533 +vt 0.062500 0.736465 +vt 0.062500 0.750000 +vt 0.093750 0.736465 +vt 0.093750 0.750000 +vt 0.156250 0.736465 +vt 0.156250 0.750000 +vt 0.250000 0.736465 +vt 0.250000 0.750000 +vt 0.312500 0.736465 +vt 0.312500 0.750000 +vt 0.375000 0.736465 +vt 0.375000 0.750000 +vt 0.468750 0.736465 +vt 0.468750 0.750000 +vt 0.531250 0.736465 +vt 0.531250 0.750000 +vt 0.593750 0.736465 +vt 0.593750 0.750000 +vt 0.687500 0.736465 +vt 0.687500 0.750000 +vt 0.750000 0.736465 +vt 0.750000 0.750000 +vt 0.812500 0.736465 +vt 0.812500 0.750000 +vt 0.906250 0.736465 +vt 0.906250 0.750000 +vt 0.937500 0.657826 +vt 0.937500 0.644291 +vt 0.031250 0.657826 +vt 0.031250 0.644291 +vt 0.125000 0.630756 +vt 0.125000 0.644291 +vt 0.218750 0.630756 +vt 0.218750 0.644291 +vt 0.281250 0.630756 +vt 0.281250 0.644291 +vt 0.343750 0.630756 +vt 0.343750 0.644291 +vt 0.437500 0.630756 +vt 0.437500 0.644291 +vt 0.500000 0.630756 +vt 0.500000 0.644291 +vt 0.562500 0.630756 +vt 0.562500 0.644291 +vt 0.656250 0.630756 +vt 0.656250 0.644291 +vt 0.718750 0.630756 +vt 0.718750 0.644291 +vt 0.781250 0.630756 +vt 0.781250 0.644291 +vt 0.875000 0.630756 +vt 0.875000 0.644291 +vt 0.001571 0.657788 +vt 0.000000 0.657749 +vt 0.968750 0.630756 +vt 0.001571 0.763501 +vt 0.000000 0.763467 +vt 0.968750 0.736465 +vt 0.001572 0.869214 +vt 0.000000 0.869183 +vt 0.968750 0.842174 +vt 0.937500 0.630756 +vt 0.937500 0.736465 +vt 0.937500 0.842174 +vt 0.062500 0.657826 +vt 0.031250 0.630756 +vt 0.062500 0.763535 +vt 0.031250 0.736465 +vt 0.062500 0.869244 +vt 0.031250 0.842174 +vt 0.093750 0.657826 +vt 0.093750 0.763535 +vt 0.093750 0.869244 +vt 0.125000 0.657826 +vt 0.125000 0.763535 +vt 0.125000 0.869244 +vt 0.156250 0.657826 +vt 0.156250 0.763535 +vt 0.156250 0.869244 +vt 0.187500 0.657826 +vt 0.187500 0.763535 +vt 0.187500 0.869244 +vt 0.218750 0.657826 +vt 0.218750 0.763535 +vt 0.218750 0.869244 +vt 0.250000 0.657826 +vt 0.250000 0.763535 +vt 0.250000 0.869244 +vt 0.281250 0.657826 +vt 0.281250 0.763535 +vt 0.281250 0.869244 +vt 0.312500 0.657826 +vt 0.312500 0.763535 +vt 0.312500 0.869244 +vt 0.343750 0.657826 +vt 0.343750 0.763535 +vt 0.343750 0.869244 +vt 0.375000 0.657826 +vt 0.375000 0.763535 +vt 0.375000 0.869244 +vt 0.406250 0.657826 +vt 0.406250 0.763535 +vt 0.406250 0.869244 +vt 0.437500 0.657826 +vt 0.437500 0.763535 +vt 0.437500 0.869244 +vt 0.468750 0.657826 +vt 0.468750 0.763535 +vt 0.468750 0.869244 +vt 0.500000 0.657826 +vt 0.500000 0.763535 +vt 0.500000 0.869244 +vt 0.531250 0.657826 +vt 0.531250 0.763535 +vt 0.531250 0.869244 +vt 0.562500 0.657826 +vt 0.562500 0.763535 +vt 0.562500 0.869244 +vt 0.593750 0.657826 +vt 0.593750 0.763535 +vt 0.593750 0.869244 +vt 0.625000 0.657826 +vt 0.625000 0.763535 +vt 0.625000 0.869244 +vt 0.656250 0.657826 +vt 0.656250 0.763535 +vt 0.656250 0.869244 +vt 0.687500 0.657826 +vt 0.687500 0.763535 +vt 0.687500 0.869244 +vt 0.718750 0.657826 +vt 0.718750 0.763535 +vt 0.718750 0.869244 +vt 0.750000 0.657826 +vt 0.750000 0.763535 +vt 0.750000 0.869244 +vt 0.781250 0.657826 +vt 0.781250 0.763535 +vt 0.781250 0.869244 +vt 0.812500 0.657826 +vt 0.812500 0.763535 +vt 0.812500 0.869244 +vt 0.843750 0.657826 +vt 0.843750 0.763535 +vt 0.843750 0.869244 +vt 0.875000 0.657826 +vt 0.875000 0.763535 +vt 0.875000 0.869244 +vt 0.906250 0.657826 +vt 0.906250 0.763535 +vt 0.906250 0.869244 +vt 0.031250 0.538582 +vt 0.001572 0.538953 +vt 0.001571 0.736035 +vt 0.000000 0.735604 +vt 0.000000 0.657826 +vt 0.968750 0.538582 +vt 0.001571 0.763965 +vt 0.001572 0.961047 +vt 0.000000 0.960677 +vt 0.906250 0.538582 +vt 0.843750 0.538582 +vt 0.781250 0.538582 +vt 0.718750 0.538582 +vt 0.656250 0.538582 +vt 0.593750 0.538582 +vt 0.531250 0.538582 +vt 0.468750 0.538582 +vt 0.406250 0.538582 +vt 0.343750 0.538582 +vt 0.281250 0.538582 +vt 0.218750 0.538582 +vt 0.156250 0.538582 +vt 0.093750 0.538582 +vt 0.000000 0.842174 +vt 0.000000 0.764396 +vt 0.000000 0.539323 +vt 0.270141 0.423938 +vt 0.284321 0.422542 +vt 0.250000 0.428745 +vt 0.317378 0.412665 +vt 0.315041 0.413223 +vt 0.397602 0.348624 +vt 0.427342 0.285275 +vt 0.431185 0.213960 +vt 0.415193 0.181575 +vt 0.399616 0.150030 +vt 0.383205 0.116795 +vt 0.285193 0.073075 +vt 0.320132 0.080687 +vt 0.250000 0.065407 +vt 0.149611 0.099758 +vt 0.178149 0.076536 +vt 0.122125 0.122125 +vt 0.093492 0.145425 +vt 0.072621 0.250000 +vt 0.072272 0.214648 +vt 0.072969 0.285214 +vt 0.125553 0.374447 +vt 0.097067 0.352187 +vt 0.180626 0.417484 +vt 0.283943 0.420644 +vt 0.190922 0.425529 +vt 0.190402 0.427900 +vt 0.195343 0.428984 +vt 0.207896 0.438793 +vt 0.212674 0.437653 +vt 0.223307 0.435116 +vt 0.226937 0.435912 +vt 0.227322 0.434157 +vt 0.073250 0.313691 +vt 0.071661 0.314476 +vt 0.073290 0.317774 +vt 0.073343 0.323174 +vt 0.086027 0.343559 +vt 0.088226 0.348011 +vt 0.090369 0.346952 +vt 0.073448 0.333729 +vt 0.089655 0.148547 +vt 0.086449 0.146994 +vt 0.083120 0.153865 +vt 0.071763 0.163107 +vt 0.071893 0.176226 +vt 0.071901 0.177022 +vt 0.070141 0.180654 +vt 0.071945 0.181528 +vt 0.225335 0.060033 +vt 0.224749 0.057560 +vt 0.219594 0.058782 +vt 0.211619 0.057044 +vt 0.191898 0.065347 +vt 0.188354 0.066187 +vt 0.188761 0.067900 +vt 0.204111 0.055409 +vt 0.380444 0.111203 +vt 0.382170 0.108995 +vt 0.377584 0.105411 +vt 0.370830 0.091733 +vt 0.357667 0.088865 +vt 0.355930 0.088487 +vt 0.352700 0.085962 +vt 0.351484 0.087518 +vt 0.437615 0.263394 +vt 0.440168 0.263390 +vt 0.440159 0.257974 +vt 0.443903 0.250000 +vt 0.440117 0.232049 +vt 0.440107 0.225987 +vt 0.437126 0.225992 +vt 0.446378 0.244728 +vt 0.353806 0.407296 +vt 0.354653 0.406624 +vt 0.351586 0.404501 +vt 0.379714 0.386727 +vt 0.383099 0.384039 +vt 0.381764 0.382359 +vt 0.381954 0.381954 +vt 0.359793 0.402543 +vt 0.373865 0.399184 +vn 0.0000 0.0000 1.0000 +vn 0.1369 -0.0300 -0.9901 +vn -0.2525 0.0553 -0.9660 +vn 0.0621 -0.1257 -0.9901 +vn -0.1146 0.2318 -0.9660 +vn -0.0611 -0.1262 -0.9901 +vn 0.1127 0.2327 -0.9660 +vn -0.1364 -0.0324 -0.9901 +vn 0.2515 0.0597 -0.9660 +vn -0.1105 0.0863 -0.9901 +vn 0.2037 -0.1591 -0.9660 +vn -0.0003 0.1402 -0.9901 +vn 0.0005 -0.2585 -0.9660 +vn 0.1098 0.0872 -0.9901 +vn -0.2024 -0.1608 -0.9660 +vn 0.0000 0.0000 -1.0000 +vn 0.0001 0.0000 -1.0000 +vn -0.9769 0.2139 0.0000 +vn -0.2139 -0.9769 0.0000 +vn 0.2139 0.9769 0.0000 +vn -0.4431 0.8965 0.0000 +vn -0.8965 -0.4431 0.0000 +vn 0.8965 0.4431 0.0000 +vn 0.4358 0.9001 0.0000 +vn -0.9001 0.4358 0.0000 +vn 0.9001 -0.4358 0.0000 +vn 0.9730 0.2309 0.0000 +vn -0.2309 0.9730 -0.0000 +vn 0.2309 -0.9730 0.0000 +vn 0.7881 -0.6156 0.0000 +vn 0.6156 0.7881 0.0000 +vn -0.6156 -0.7881 -0.0000 +vn 0.0019 -1.0000 -0.0000 +vn 1.0000 0.0019 0.0000 +vn -1.0000 -0.0019 0.0000 +vn -0.7830 -0.6220 0.0000 +vn 0.6220 -0.7830 -0.0000 +vn -0.6220 0.7830 0.0000 +vn -0.9726 -0.2324 0.0000 +vn -0.4247 -0.9053 -0.0000 +vn 0.4430 -0.8965 0.0000 +vn 0.9771 -0.2126 -0.0000 +vn 0.7755 0.6314 0.0000 +vn 0.1373 0.2927 -0.9463 +vn -0.3159 0.0687 -0.9463 +vn -0.1432 0.2898 -0.9463 +vn -0.1906 -0.1552 -0.9693 +vn -0.2507 -0.2041 -0.9463 +vn -0.0101 0.9999 -0.0000 +vn -0.0102 0.9999 -0.0000 +vn -0.7881 0.6155 0.0000 +vn 0.0033 -0.3233 -0.9463 +vn 0.3144 0.0751 -0.9463 +vn 0.2548 -0.1990 -0.9463 +vn 0.2391 0.0571 -0.9693 +vn -0.0002 0.0000 -1.0000 +vn -0.0001 0.0000 -1.0000 +vn 0.0002 0.0000 -1.0000 +vn 0.0635 0.1540 -0.9860 +vn -0.0723 0.1460 -0.9866 +vn -0.0563 -0.1199 -0.9912 +vn -0.1263 -0.1019 -0.9867 +vn -0.1584 0.0353 -0.9867 +vn 0.0094 -0.1664 -0.9860 +vn 0.1282 -0.1001 -0.9867 +vn 0.1580 0.0372 -0.9867 +vn 0.1027 0.0836 -0.9912 +vn 0.6079 -0.1325 -0.7829 +vn 0.4826 0.3927 -0.7829 +vn -0.0061 0.6221 -0.7829 +vn -0.4902 0.3831 -0.7829 +vn -0.6052 -0.1444 -0.7829 +vn -0.2644 -0.5631 -0.7829 +vn 0.2754 -0.5579 -0.7829 +vn 0.9769 -0.2139 0.0000 +vn 0.4431 -0.8965 0.0000 +vn -0.4358 -0.9001 0.0000 +vn -0.9730 -0.2309 0.0000 +vn -0.7881 0.6156 -0.0000 +vn -0.0019 1.0000 0.0000 +vn 0.7830 0.6220 -0.0000 +vn 0.9771 -0.2130 0.0000 +vn 0.7757 0.6311 0.0000 +vn -0.0098 1.0000 0.0000 +vn -0.7879 0.6158 0.0000 +vn -0.9727 -0.2321 -0.0000 +vn -0.9727 -0.2320 0.0000 +vn -0.4251 -0.9052 0.0000 +vn -0.4250 -0.9052 0.0000 +vn 0.4427 -0.8967 0.0000 +vn -0.5989 0.1305 -0.7901 +vn -0.4755 -0.3868 -0.7901 +vn 0.0060 -0.6129 -0.7901 +vn 0.4829 -0.3775 -0.7901 +vn 0.5962 0.1422 -0.7901 +vn 0.2605 0.5548 -0.7901 +vn -0.2713 0.5496 -0.7901 +vn -0.6861 -0.3669 0.6282 +vn -0.8680 -0.4965 -0.0000 +vn -0.7545 -0.6563 0.0000 +vn -0.6120 -0.7909 0.0000 +vn -0.4459 -0.8951 0.0000 +vn -0.2627 -0.9649 0.0000 +vn -0.0694 -0.9976 -0.0000 +vn 0.1265 -0.9920 0.0000 +vn 0.3176 -0.9482 0.0000 +vn 0.4965 -0.8680 -0.0000 +vn 0.6563 -0.7545 0.0000 +vn 0.7909 -0.6119 0.0000 +vn 0.8951 -0.4459 -0.0000 +vn 0.9649 -0.2627 -0.0000 +vn 0.9976 -0.0694 -0.0000 +vn 0.9920 0.1265 -0.0000 +vn 0.9482 0.3176 -0.0000 +vn 0.8680 0.4965 0.0000 +vn 0.7545 0.6563 0.0000 +vn 0.6119 0.7909 -0.0000 +vn 0.4459 0.8951 0.0000 +vn 0.2627 0.9649 -0.0000 +vn 0.0694 0.9976 0.0000 +vn -0.1265 0.9920 0.0000 +vn -0.3176 0.9482 0.0000 +vn -0.4965 0.8680 -0.0000 +vn -0.6563 0.7545 0.0000 +vn -0.7909 0.6119 0.0000 +vn -0.8951 0.4459 -0.0000 +vn -0.6013 -0.4937 0.6282 +vn -0.9482 -0.3176 0.0000 +vn -0.7445 -0.2261 0.6282 +vn -0.9976 0.0694 0.0000 +vn -0.3134 -0.0310 0.9491 +vn -0.0881 -0.0087 0.9961 +vn -0.7743 0.0761 -0.6282 +vn -0.3134 -0.0310 -0.9491 +vn -0.0881 -0.0087 -0.9961 +vn -0.3014 -0.0915 0.9491 +vn -0.0847 -0.0257 0.9961 +vn -0.3014 -0.0915 -0.9491 +vn -0.0847 -0.0257 -0.9961 +vn -0.2777 -0.1485 0.9491 +vn -0.0781 -0.0418 0.9961 +vn -0.2777 -0.1485 -0.9491 +vn -0.0781 -0.0418 -0.9961 +vn -0.2434 -0.1999 0.9491 +vn -0.0684 -0.0562 0.9961 +vn -0.2434 -0.1999 -0.9491 +vn -0.0684 -0.0562 -0.9961 +vn -0.6119 -0.7909 -0.0000 +vn -0.1997 -0.2435 0.9491 +vn -0.0562 -0.0685 0.9961 +vn -0.1997 -0.2435 -0.9491 +vn -0.0562 -0.0685 -0.9961 +vn -0.1484 -0.2778 0.9491 +vn -0.0417 -0.0781 0.9961 +vn -0.1484 -0.2778 -0.9491 +vn -0.0417 -0.0781 -0.9961 +vn -0.0913 -0.3014 0.9491 +vn -0.0257 -0.0848 0.9961 +vn -0.0913 -0.3014 -0.9491 +vn -0.0257 -0.0848 -0.9961 +vn -0.0308 -0.3134 0.9491 +vn -0.0087 -0.0881 0.9961 +vn -0.0308 -0.3134 -0.9491 +vn -0.0087 -0.0881 -0.9961 +vn 0.0310 -0.3134 0.9491 +vn 0.0087 -0.0881 0.9961 +vn 0.0310 -0.3134 -0.9491 +vn 0.0087 -0.0881 -0.9961 +vn 0.0915 -0.3014 0.9491 +vn 0.0257 -0.0847 0.9961 +vn 0.0915 -0.3014 -0.9491 +vn 0.0257 -0.0847 -0.9961 +vn 0.1485 -0.2777 0.9491 +vn 0.0418 -0.0781 0.9961 +vn 0.1485 -0.2777 -0.9491 +vn 0.0418 -0.0781 -0.9961 +vn 0.1999 -0.2434 0.9491 +vn 0.0562 -0.0684 0.9961 +vn 0.1999 -0.2434 -0.9491 +vn 0.0562 -0.0684 -0.9961 +vn 0.2435 -0.1997 0.9491 +vn 0.0685 -0.0562 0.9961 +vn 0.2435 -0.1997 -0.9491 +vn 0.0685 -0.0562 -0.9961 +vn 0.2778 -0.1484 0.9491 +vn 0.0781 -0.0417 0.9961 +vn 0.2778 -0.1484 -0.9491 +vn 0.0781 -0.0417 -0.9961 +vn 0.3014 -0.0913 0.9491 +vn 0.0848 -0.0257 0.9961 +vn 0.3014 -0.0913 -0.9491 +vn 0.0848 -0.0257 -0.9961 +vn 0.3134 -0.0308 0.9491 +vn 0.0881 -0.0087 0.9961 +vn 0.3134 -0.0308 -0.9491 +vn 0.0881 -0.0087 -0.9961 +vn 0.3134 0.0310 0.9491 +vn 0.0881 0.0087 0.9961 +vn 0.3134 0.0310 -0.9491 +vn 0.0881 0.0087 -0.9961 +vn 0.3014 0.0915 0.9491 +vn 0.0847 0.0257 0.9961 +vn 0.3014 0.0915 -0.9491 +vn 0.0847 0.0257 -0.9961 +vn 0.2777 0.1485 0.9491 +vn 0.0781 0.0418 0.9961 +vn 0.2777 0.1485 -0.9491 +vn 0.0781 0.0418 -0.9961 +vn 0.2434 0.1999 0.9491 +vn 0.0684 0.0562 0.9961 +vn 0.2434 0.1999 -0.9491 +vn 0.0684 0.0562 -0.9961 +vn 0.1997 0.2435 0.9491 +vn 0.0562 0.0685 0.9961 +vn 0.1997 0.2435 -0.9491 +vn 0.0562 0.0685 -0.9961 +vn 0.1484 0.2778 0.9491 +vn 0.0417 0.0781 0.9961 +vn 0.1484 0.2778 -0.9491 +vn 0.0417 0.0781 -0.9961 +vn 0.0913 0.3014 0.9491 +vn 0.0257 0.0848 0.9961 +vn 0.0913 0.3014 -0.9491 +vn 0.0257 0.0848 -0.9961 +vn 0.0308 0.3134 0.9491 +vn 0.0087 0.0881 0.9961 +vn 0.0308 0.3134 -0.9491 +vn 0.0087 0.0881 -0.9961 +vn -0.0310 0.3134 0.9491 +vn -0.0087 0.0881 0.9961 +vn -0.0310 0.3134 -0.9491 +vn -0.0087 0.0881 -0.9961 +vn -0.0915 0.3014 0.9491 +vn -0.0257 0.0847 0.9961 +vn -0.0915 0.3014 -0.9491 +vn -0.0257 0.0847 -0.9961 +vn -0.1485 0.2777 0.9491 +vn -0.0418 0.0781 0.9961 +vn -0.1485 0.2777 -0.9491 +vn -0.0418 0.0781 -0.9961 +vn -0.1999 0.2434 0.9491 +vn -0.0562 0.0684 0.9961 +vn -0.1999 0.2434 -0.9491 +vn -0.0562 0.0684 -0.9961 +vn -0.2435 0.1997 0.9491 +vn -0.0685 0.0562 0.9961 +vn -0.2435 0.1997 -0.9491 +vn -0.0685 0.0562 -0.9961 +vn -0.2778 0.1484 0.9491 +vn -0.0781 0.0417 0.9961 +vn -0.2778 0.1484 -0.9491 +vn -0.0781 0.0417 -0.9961 +vn -0.9649 0.2627 -0.0000 +vn -0.3014 0.0913 0.9491 +vn -0.0848 0.0257 0.9961 +vn -0.3014 0.0913 -0.9491 +vn -0.0848 0.0257 -0.9961 +vn -0.7743 -0.0765 0.6282 +vn -0.3134 0.0308 0.9491 +vn -0.0881 0.0087 0.9961 +vn -0.3134 0.0308 -0.9491 +vn -0.0881 0.0087 -0.9961 +vn -0.9920 -0.1265 0.0000 +vn -0.7743 -0.0765 -0.6282 +vn -0.7446 0.2256 -0.6282 +vn -0.7445 -0.2261 -0.6282 +vn -0.7903 -0.4824 -0.3777 +vn -0.9074 0.0373 -0.4186 +vn -0.6863 0.3666 -0.6282 +vn -0.6306 -0.7611 -0.1519 +vn -0.7446 0.2256 0.6282 +vn -0.6016 0.4934 -0.6282 +vn -0.6863 0.3666 0.6282 +vn -0.4937 0.6013 -0.6282 +vn -0.6016 0.4934 0.6282 +vn -0.3669 0.6861 -0.6282 +vn -0.4937 0.6013 0.6282 +vn -0.2261 0.7445 -0.6282 +vn -0.3669 0.6861 0.6282 +vn -0.0765 0.7743 -0.6282 +vn -0.2261 0.7445 0.6282 +vn 0.0760 0.7743 -0.6282 +vn -0.0765 0.7743 0.6282 +vn 0.2256 0.7446 -0.6282 +vn 0.0760 0.7743 0.6282 +vn 0.3666 0.6863 -0.6282 +vn 0.2256 0.7446 0.6282 +vn 0.4934 0.6015 -0.6282 +vn 0.3666 0.6863 0.6282 +vn 0.6013 0.4937 -0.6282 +vn 0.4934 0.6016 0.6282 +vn 0.6861 0.3669 -0.6282 +vn 0.6013 0.4937 0.6282 +vn 0.7444 0.2261 -0.6283 +vn 0.6861 0.3669 0.6282 +vn 0.7742 0.0765 -0.6282 +vn 0.7444 0.2261 0.6282 +vn 0.7743 -0.0760 -0.6282 +vn 0.7743 0.0765 0.6282 +vn 0.7446 -0.2256 -0.6282 +vn 0.7743 -0.0761 0.6282 +vn 0.6862 -0.3666 -0.6282 +vn 0.7446 -0.2256 0.6282 +vn 0.6016 -0.4934 -0.6282 +vn 0.6863 -0.3666 0.6282 +vn 0.4937 -0.6013 -0.6283 +vn 0.6016 -0.4934 0.6282 +vn 0.3669 -0.6860 -0.6282 +vn 0.4937 -0.6013 0.6282 +vn 0.2261 -0.7445 -0.6282 +vn 0.3669 -0.6860 0.6282 +vn 0.0765 -0.7743 -0.6282 +vn 0.2261 -0.7445 0.6282 +vn -0.0760 -0.7743 -0.6282 +vn 0.0765 -0.7743 0.6282 +vn -0.2256 -0.7446 -0.6282 +vn -0.0760 -0.7743 0.6282 +vn -0.3666 -0.6863 -0.6282 +vn -0.2256 -0.7446 0.6282 +vn -0.4934 -0.6015 -0.6282 +vn -0.3666 -0.6863 0.6282 +vn -0.6013 -0.4937 -0.6283 +vn -0.4934 -0.6016 0.6282 +vn -0.6861 -0.3669 -0.6282 +vn -0.7093 -0.5824 0.3972 +vn -0.7903 -0.4824 0.3777 +vn -0.8972 -0.1405 0.4186 +vn -0.9133 -0.0902 0.3972 +vn -0.9148 -0.1432 0.3777 +vn -0.8526 -0.3128 0.4186 +vn -0.9133 0.0897 -0.3972 +vn -0.8693 -0.3189 0.3777 +vn -0.8241 0.3817 0.4186 +vn -0.9133 0.0897 0.3972 +vn -0.8402 0.3891 0.3777 +vn -0.8402 0.3891 -0.3777 +vn -0.7096 0.5820 0.3972 +vn -0.8241 0.3817 -0.4186 +vn -0.6153 0.6680 0.4186 +vn -0.7096 0.5820 -0.3972 +vn -0.7481 0.5456 0.3777 +vn -0.6273 0.6810 -0.3777 +vn -0.5824 0.7093 0.3972 +vn -0.4824 0.7904 0.3777 +vn -0.4732 0.7752 0.4186 +vn -0.2666 0.8782 0.3972 +vn -0.4732 0.7752 -0.4186 +vn -0.1405 0.8973 0.4186 +vn -0.2666 0.8782 -0.3972 +vn -0.1432 0.9148 0.3777 +vn -0.1432 0.9148 -0.3777 +vn 0.0897 0.9134 0.3972 +vn -0.1405 0.8973 -0.4186 +vn 0.2136 0.8827 0.4186 +vn 0.0897 0.9134 -0.3972 +vn 0.2178 0.9000 0.3777 +vn 0.2177 0.9000 -0.3777 +vn 0.4324 0.8095 0.3972 +vn 0.2136 0.8827 -0.4186 +vn 0.5351 0.7338 0.4186 +vn 0.4324 0.8095 -0.3972 +vn 0.3891 0.8402 0.3777 +vn 0.5456 0.7481 -0.3777 +vn 0.5820 0.7096 0.3972 +vn 0.6810 0.6273 0.3777 +vn 0.6680 0.6153 0.4185 +vn 0.8093 0.4328 0.3972 +vn 0.6680 0.6153 -0.4185 +vn 0.8526 0.3128 0.4186 +vn 0.8093 0.4328 -0.3972 +vn 0.8693 0.3189 0.3777 +vn 0.8693 0.3189 -0.3777 +vn 0.9133 0.0902 0.3972 +vn 0.8526 0.3128 -0.4186 +vn 0.9074 -0.0373 0.4185 +vn 0.9133 0.0902 -0.3972 +vn 0.9252 -0.0380 0.3776 +vn 0.9252 -0.0380 -0.3776 +vn 0.8783 -0.2662 0.3972 +vn 0.9074 -0.0373 -0.4185 +vn 0.8241 -0.3817 0.4186 +vn 0.8783 -0.2662 -0.3972 +vn 0.9000 -0.2178 0.3777 +vn 0.8402 -0.3891 -0.3777 +vn 0.8095 -0.4324 0.3972 +vn 0.7481 -0.5456 0.3777 +vn 0.7338 -0.5351 0.4185 +vn 0.5824 -0.7093 0.3972 +vn 0.7338 -0.5351 -0.4185 +vn 0.4732 -0.7752 0.4186 +vn 0.5824 -0.7093 -0.3972 +vn 0.4824 -0.7903 0.3777 +vn 0.4824 -0.7903 -0.3777 +vn 0.2666 -0.8782 0.3972 +vn 0.4732 -0.7752 -0.4186 +vn 0.1405 -0.8973 0.4185 +vn 0.2666 -0.8782 -0.3972 +vn 0.1432 -0.9148 0.3777 +vn 0.1432 -0.9148 -0.3777 +vn -0.0897 -0.9134 0.3972 +vn 0.1405 -0.8973 -0.4186 +vn -0.2136 -0.8827 0.4186 +vn -0.0897 -0.9134 -0.3972 +vn -0.0380 -0.9252 0.3777 +vn -0.2178 -0.9000 -0.3777 +vn -0.2662 -0.8783 0.3972 +vn -0.3891 -0.8402 0.3777 +vn -0.3817 -0.8241 0.4185 +vn -0.5820 -0.7096 0.3972 +vn -0.3817 -0.8241 -0.4186 +vn -0.6680 -0.6153 0.4186 +vn -0.8093 -0.4328 -0.3972 +vn -0.6810 -0.6273 0.3777 +vn -0.7752 -0.4731 0.4186 +vn -0.8093 -0.4328 0.3972 +vn -0.6680 -0.6153 -0.4186 +vn -0.9000 0.2178 -0.3777 +vn -0.8782 -0.2666 0.3972 +vn -0.8827 0.2136 -0.4186 +vn -0.7752 -0.4731 -0.4186 +vn -0.5456 -0.7481 0.3777 +vn -0.5351 -0.7338 -0.4186 +vn -0.2177 -0.9000 0.3777 +vn -0.2136 -0.8827 -0.4186 +vn -0.0373 -0.9074 -0.4186 +vn 0.3189 -0.8693 0.3777 +vn 0.3128 -0.8526 -0.4186 +vn 0.6273 -0.6811 0.3777 +vn 0.6153 -0.6680 -0.4186 +vn 0.8402 -0.3891 0.3777 +vn 0.8241 -0.3817 -0.4186 +vn 0.8827 -0.2136 -0.4186 +vn 0.9148 0.1432 0.3777 +vn 0.8972 0.1405 -0.4186 +vn 0.7903 0.4824 0.3777 +vn 0.7752 0.4732 -0.4186 +vn 0.5456 0.7481 0.3777 +vn 0.5351 0.7338 -0.4186 +vn 0.3817 0.8241 -0.4186 +vn 0.0380 0.9252 0.3777 +vn 0.0373 0.9074 -0.4185 +vn -0.3189 0.8693 0.3777 +vn -0.3128 0.8526 -0.4186 +vn -0.6273 0.6810 0.3777 +vn -0.6153 0.6680 -0.4186 +vn -0.7338 0.5351 -0.4185 +vn -0.9000 0.2178 0.3777 +vn -0.9252 0.0380 0.3777 +vn -0.8526 -0.3128 -0.4186 +vn -0.8972 -0.1405 -0.4186 +vn -0.8783 0.2662 0.3972 +vn -0.5820 -0.7096 -0.3972 +vn -0.7093 -0.5824 -0.3972 +vn -0.4324 -0.8095 0.3972 +vn -0.4324 -0.8095 -0.3972 +vn -0.2662 -0.8783 -0.3972 +vn 0.0902 -0.9133 0.3972 +vn 0.0902 -0.9133 -0.3972 +vn 0.4328 -0.8093 0.3972 +vn 0.4328 -0.8093 -0.3972 +vn 0.7096 -0.5820 0.3971 +vn 0.7096 -0.5820 -0.3971 +vn 0.8095 -0.4324 -0.3972 +vn 0.9134 -0.0897 0.3971 +vn 0.9134 -0.0897 -0.3971 +vn 0.8782 0.2666 0.3972 +vn 0.8782 0.2666 -0.3972 +vn 0.7093 0.5824 0.3972 +vn 0.7093 0.5824 -0.3972 +vn 0.5820 0.7096 -0.3972 +vn 0.2662 0.8783 0.3972 +vn 0.2662 0.8783 -0.3972 +vn -0.0902 0.9133 0.3972 +vn -0.0902 0.9133 -0.3972 +vn -0.4328 0.8093 0.3972 +vn -0.4328 0.8093 -0.3972 +vn -0.5824 0.7093 -0.3972 +vn -0.8095 0.4324 0.3971 +vn -0.8095 0.4324 -0.3972 +vn -0.8783 0.2662 -0.3972 +vn -0.8781 -0.2666 -0.3972 +vn -0.9133 -0.0902 -0.3972 +vn -0.9252 0.0380 -0.3777 +vn -0.6810 -0.6273 -0.3777 +vn -0.5351 -0.7338 0.4186 +vn -0.5456 -0.7481 -0.3777 +vn -0.3891 -0.8402 -0.3777 +vn -0.0373 -0.9074 0.4186 +vn -0.0380 -0.9252 -0.3777 +vn 0.3128 -0.8526 0.4186 +vn 0.3189 -0.8693 -0.3777 +vn 0.6153 -0.6680 0.4186 +vn 0.6273 -0.6811 -0.3777 +vn 0.7481 -0.5456 -0.3777 +vn 0.8827 -0.2136 0.4186 +vn 0.9000 -0.2178 -0.3777 +vn 0.8972 0.1405 0.4186 +vn 0.9148 0.1432 -0.3777 +vn 0.7752 0.4732 0.4186 +vn 0.7903 0.4824 -0.3777 +vn 0.6810 0.6273 -0.3777 +vn 0.3817 0.8241 0.4186 +vn 0.3891 0.8402 -0.3777 +vn 0.0373 0.9074 0.4185 +vn 0.0380 0.9252 -0.3777 +vn -0.3128 0.8526 0.4186 +vn -0.3190 0.8693 -0.3776 +vn -0.4824 0.7904 -0.3776 +vn -0.7338 0.5351 0.4186 +vn -0.7481 0.5456 -0.3777 +vn -0.8827 0.2136 0.4186 +vn -0.9074 0.0373 0.4186 +vn -0.8693 -0.3189 -0.3777 +vn -0.9148 -0.1432 -0.3777 +vn -0.9096 -0.0002 -0.4155 +vn -0.9096 -0.0003 0.4155 +vn -0.8921 -0.1777 -0.4155 +vn -0.8921 -0.1777 0.4154 +vn -0.8403 -0.3483 -0.4154 +vn -0.8403 -0.3483 0.4153 +vn -0.7561 -0.5056 -0.4155 +vn -0.7561 -0.5056 0.4155 +vn -0.6430 -0.6434 -0.4155 +vn -0.6430 -0.6434 0.4154 +vn -0.5051 -0.7564 -0.4155 +vn -0.5052 -0.7564 0.4155 +vn -0.3478 -0.8405 -0.4154 +vn -0.3478 -0.8405 0.4154 +vn -0.1772 -0.8922 -0.4155 +vn -0.1772 -0.8922 0.4155 +vn 0.0003 -0.9097 -0.4154 +vn 0.0002 -0.9097 0.4154 +vn 0.1777 -0.8921 -0.4155 +vn 0.1777 -0.8921 0.4155 +vn 0.3483 -0.8403 -0.4155 +vn 0.3483 -0.8403 0.4155 +vn 0.5056 -0.7562 -0.4155 +vn 0.5056 -0.7562 0.4155 +vn 0.6434 -0.6430 -0.4155 +vn 0.6434 -0.6430 0.4155 +vn 0.7564 -0.5052 -0.4154 +vn 0.7564 -0.5052 0.4154 +vn 0.8405 -0.3479 -0.4154 +vn 0.8405 -0.3479 0.4154 +vn 0.8922 -0.1772 -0.4155 +vn 0.8922 -0.1772 0.4155 +vn 0.9096 0.0002 -0.4155 +vn 0.9096 0.0002 0.4155 +vn 0.8920 0.1777 -0.4156 +vn 0.8920 0.1776 0.4156 +vn 0.8403 0.3483 -0.4154 +vn 0.8403 0.3483 0.4154 +vn 0.7562 0.5056 -0.4154 +vn 0.7562 0.5056 0.4154 +vn 0.6430 0.6434 -0.4155 +vn 0.6430 0.6434 0.4155 +vn 0.5051 0.7564 -0.4155 +vn 0.5051 0.7565 0.4155 +vn 0.3478 0.8404 -0.4156 +vn 0.3478 0.8404 0.4155 +vn 0.1772 0.8922 -0.4155 +vn 0.1772 0.8922 0.4155 +vn -0.0002 0.9096 -0.4155 +vn -0.0003 0.9096 0.4155 +vn -0.1777 0.8921 -0.4155 +vn -0.1777 0.8921 0.4155 +vn -0.3483 0.8403 -0.4154 +vn -0.3483 0.8403 0.4154 +vn -0.5056 0.7561 -0.4155 +vn -0.5056 0.7562 0.4154 +vn -0.6434 0.6430 -0.4155 +vn -0.6433 0.6430 0.4156 +vn -0.7565 0.5052 -0.4154 +vn -0.7565 0.5052 0.4154 +vn -0.8405 0.3478 -0.4155 +vn -0.8405 0.3478 0.4155 +vn -0.8922 0.1772 -0.4154 +vn -0.8922 0.1772 0.4154 +vn -0.8824 -0.2998 -0.3627 +vn 0.1219 -0.9239 -0.3627 +vn 0.9299 -0.0607 -0.3626 +vn 0.2410 0.9002 -0.3627 +vn -0.7395 0.5671 -0.3627 +vn -0.1292 -0.9161 -0.3797 +vn 0.8732 -0.3055 -0.3797 +vn 0.4700 0.7969 -0.3797 +vn -0.9160 -0.1298 0.3796 +vn -0.2710 -0.8765 -0.3980 +vn 0.8068 -0.4367 -0.3980 +vn 0.5857 0.7060 -0.3980 +vn -0.5782 0.7122 -0.3980 +vn -0.8764 0.2709 -0.3980 +vn -0.7005 -0.6146 -0.3626 +vn -0.5671 -0.7395 -0.3627 +vn -0.2410 -0.9002 -0.3626 +vn 0.4661 -0.8070 -0.3626 +vn 0.6147 -0.7005 -0.3627 +vn 0.8359 -0.4120 -0.3626 +vn 0.8824 0.2997 -0.3627 +vn 0.8070 0.4661 -0.3627 +vn 0.5672 0.7394 -0.3627 +vn -0.1219 0.9239 -0.3626 +vn -0.2998 0.8824 -0.3627 +vn -0.6146 0.7005 -0.3627 +vn -0.7517 -0.5258 0.3980 +vn -0.9002 0.2410 -0.3627 +vn -0.8335 -0.4015 -0.3797 +vn -0.7391 -0.5564 -0.3796 +vn -0.4700 -0.7969 -0.3796 +vn 0.2311 -0.8958 -0.3796 +vn 0.4015 -0.8335 -0.3797 +vn 0.6899 -0.6164 -0.3796 +vn 0.9237 0.0520 -0.3797 +vn 0.8958 0.2312 -0.3797 +vn 0.7391 0.5564 -0.3796 +vn 0.1292 0.9161 -0.3797 +vn -0.0519 0.9237 -0.3797 +vn -0.4015 0.8335 -0.3796 +vn -0.6895 -0.6168 0.3796 +vn -0.7966 -0.4704 0.3796 +vn -0.8793 -0.2617 -0.3980 +vn -0.8113 -0.4282 -0.3980 +vn -0.5857 -0.7061 -0.3980 +vn 0.0851 -0.9134 -0.3980 +vn 0.2616 -0.8793 -0.3980 +vn 0.5782 -0.7122 -0.3980 +vn 0.9125 -0.0948 -0.3980 +vn 0.9134 0.0851 -0.3981 +vn 0.8113 0.4282 -0.3980 +vn 0.2709 0.8765 -0.3980 +vn 0.0947 0.9125 -0.3980 +vn -0.2616 0.8793 -0.3980 +vn -0.7061 0.5857 -0.3980 +vn -0.6700 -0.6477 0.3627 +vn -0.7835 -0.5046 0.3627 +vn -0.9170 -0.1664 0.3626 +vn -0.4282 0.8113 -0.3980 +vn -0.0851 0.9134 -0.3980 +vn 0.4367 0.8068 -0.3980 +vn 0.7122 0.5783 -0.3980 +vn 0.8793 0.2617 -0.3980 +vn 0.8764 -0.2710 -0.3980 +vn 0.7060 -0.5858 -0.3980 +vn 0.4282 -0.8113 -0.3980 +vn -0.0947 -0.9125 -0.3980 +vn -0.4367 -0.8068 -0.3980 +vn -0.7122 -0.5782 -0.3980 +vn -0.8733 0.3054 -0.3797 +vn -0.6899 0.6164 -0.3796 +vn -0.5564 0.7391 -0.3796 +vn -0.2312 0.8958 -0.3796 +vn 0.3055 0.8732 -0.3797 +vn 0.6164 0.6899 -0.3797 +vn 0.8335 0.4015 -0.3797 +vn 0.9161 -0.1292 -0.3796 +vn 0.7969 -0.4700 -0.3796 +vn 0.5564 -0.7391 -0.3797 +vn 0.0520 -0.9237 -0.3797 +vn -0.3055 -0.8733 -0.3796 +vn -0.6164 -0.6898 -0.3797 +vn -0.8958 -0.2312 -0.3797 +vn -0.6347 -0.6624 0.3980 +vn -0.8957 -0.1982 0.3980 +vn -0.4661 0.8070 -0.3626 +vn 0.0607 0.9299 -0.3626 +vn 0.4120 0.8359 -0.3626 +vn 0.7005 0.6146 -0.3627 +vn 0.9239 0.1219 -0.3627 +vn 0.9002 -0.2410 -0.3627 +vn 0.7395 -0.5672 -0.3626 +vn 0.2998 -0.8824 -0.3627 +vn -0.0607 -0.9299 -0.3626 +vn -0.4120 -0.8359 -0.3626 +vn -0.8069 -0.4662 -0.3626 +vn -0.8764 0.2710 0.3980 +vn -0.7835 -0.5046 -0.3627 +vn -0.8732 0.3055 0.3797 +vn -0.7966 -0.4704 -0.3796 +vn -0.9002 0.2410 0.3627 +vn -0.7517 -0.5258 -0.3980 +vn -0.6700 -0.6478 -0.3627 +vn -0.6895 -0.6168 -0.3796 +vn -0.6347 -0.6624 -0.3980 +vn -0.7061 0.5857 0.3980 +vn -0.9170 -0.1664 -0.3626 +vn -0.6899 0.6164 0.3796 +vn -0.9160 -0.1298 -0.3796 +vn -0.7395 0.5671 0.3627 +vn -0.8957 -0.1982 -0.3980 +vn -0.5782 0.7122 0.3980 +vn -0.5564 0.7391 0.3796 +vn -0.6146 0.7005 0.3626 +vn -0.4282 0.8113 0.3980 +vn -0.4015 0.8335 0.3796 +vn -0.4661 0.8070 0.3626 +vn -0.2616 0.8793 0.3980 +vn -0.2312 0.8958 0.3796 +vn -0.2998 0.8824 0.3627 +vn -0.0851 0.9134 0.3980 +vn -0.0520 0.9237 0.3797 +vn -0.1219 0.9239 0.3627 +vn 0.0947 0.9125 0.3980 +vn 0.1292 0.9161 0.3797 +vn 0.0607 0.9299 0.3627 +vn 0.2709 0.8765 0.3980 +vn 0.3055 0.8732 0.3797 +vn 0.2410 0.9002 0.3627 +vn 0.4367 0.8068 0.3980 +vn 0.4700 0.7969 0.3796 +vn 0.4120 0.8359 0.3626 +vn 0.5858 0.7060 0.3981 +vn 0.6164 0.6899 0.3797 +vn 0.5672 0.7394 0.3626 +vn 0.7122 0.5783 0.3980 +vn 0.7391 0.5564 0.3796 +vn 0.7005 0.6146 0.3627 +vn 0.8113 0.4281 0.3981 +vn 0.8335 0.4014 0.3797 +vn 0.8070 0.4661 0.3627 +vn 0.8793 0.2616 0.3980 +vn 0.8958 0.2312 0.3797 +vn 0.8824 0.2997 0.3627 +vn 0.9134 0.0851 0.3981 +vn 0.9237 0.0520 0.3797 +vn 0.9239 0.1219 0.3627 +vn 0.9125 -0.0948 0.3980 +vn 0.9161 -0.1292 0.3796 +vn 0.9299 -0.0607 0.3626 +vn 0.8764 -0.2710 0.3980 +vn 0.8732 -0.3055 0.3797 +vn 0.9002 -0.2410 0.3627 +vn 0.8068 -0.4367 0.3980 +vn 0.7969 -0.4700 0.3796 +vn 0.8359 -0.4120 0.3626 +vn 0.7060 -0.5858 0.3980 +vn 0.6899 -0.6164 0.3796 +vn 0.7395 -0.5672 0.3626 +vn 0.5782 -0.7122 0.3980 +vn 0.5563 -0.7392 0.3797 +vn 0.6147 -0.7005 0.3627 +vn 0.4282 -0.8113 0.3980 +vn 0.4015 -0.8335 0.3797 +vn 0.4661 -0.8070 0.3626 +vn 0.2616 -0.8793 0.3980 +vn 0.2311 -0.8958 0.3796 +vn 0.2998 -0.8824 0.3627 +vn 0.0851 -0.9134 0.3980 +vn 0.0520 -0.9237 0.3797 +vn 0.1219 -0.9239 0.3627 +vn -0.0947 -0.9125 0.3980 +vn -0.1292 -0.9161 0.3797 +vn -0.0607 -0.9299 0.3626 +vn -0.2709 -0.8765 0.3980 +vn -0.3055 -0.8733 0.3796 +vn -0.2410 -0.9002 0.3626 +vn -0.4367 -0.8068 0.3980 +vn -0.4700 -0.7969 0.3796 +vn -0.4120 -0.8359 0.3626 +vn -0.5857 -0.7060 0.3980 +vn -0.6164 -0.6899 0.3797 +vn -0.5671 -0.7395 0.3626 +vn -0.7122 -0.5782 0.3980 +vn -0.7391 -0.5564 0.3796 +vn -0.7005 -0.6146 0.3626 +vn -0.8113 -0.4282 0.3980 +vn -0.8335 -0.4015 0.3797 +vn -0.8070 -0.4661 0.3627 +vn -0.8793 -0.2616 0.3980 +vn -0.8958 -0.2312 0.3797 +vn -0.8824 -0.2998 0.3627 +vn -0.8695 0.4700 -0.1519 +vn -0.9165 -0.3659 0.1617 +vn -0.9344 0.3044 0.1849 +vn -0.8333 -0.5224 -0.1807 +vn -0.8275 -0.5377 0.1617 +vn -0.8571 0.4808 0.1849 +vn -0.8571 0.4808 -0.1849 +vn -0.9192 -0.3498 0.1807 +vn -0.8334 -0.5224 0.1807 +vn -0.9445 0.2914 0.1519 +vn -0.8275 -0.5377 -0.1617 +vn -0.8695 0.4700 0.1519 +vn -0.7067 -0.6888 -0.1617 +vn -0.7154 -0.6749 0.1807 +vn -0.7154 -0.6749 -0.1807 +vn -0.7067 -0.6888 0.1617 +vn -0.7611 0.6306 -0.1519 +vn -0.7468 0.6388 0.1849 +vn -0.7468 0.6388 -0.1849 +vn -0.7611 0.6306 0.1519 +vn -0.5588 -0.8134 -0.1617 +vn -0.5700 -0.8016 0.1807 +vn -0.5700 -0.8016 -0.1807 +vn -0.5588 -0.8134 0.1617 +vn -0.3894 -0.9068 -0.1617 +vn -0.4026 -0.8974 0.1807 +vn -0.4026 -0.8974 -0.1807 +vn -0.3894 -0.9068 0.1617 +vn -0.2049 -0.9653 -0.1617 +vn -0.2198 -0.9587 0.1807 +vn -0.2198 -0.9587 -0.1807 +vn -0.2049 -0.9653 0.1617 +vn -0.0127 -0.9868 -0.1617 +vn -0.0286 -0.9831 0.1807 +vn -0.0286 -0.9831 -0.1807 +vn -0.0127 -0.9868 0.1617 +vn 0.1801 -0.9703 -0.1617 +vn 0.1638 -0.9698 0.1807 +vn 0.1638 -0.9698 -0.1807 +vn 0.1801 -0.9703 0.1617 +vn 0.3659 -0.9165 -0.1617 +vn 0.3498 -0.9192 0.1807 +vn 0.3498 -0.9192 -0.1807 +vn 0.3659 -0.9165 0.1617 +vn 0.5376 -0.8275 -0.1617 +vn 0.5224 -0.8333 0.1807 +vn 0.5224 -0.8333 -0.1807 +vn 0.5376 -0.8275 0.1617 +vn 0.6888 -0.7067 -0.1617 +vn 0.6749 -0.7154 0.1807 +vn 0.6749 -0.7154 -0.1807 +vn 0.6888 -0.7067 0.1617 +vn 0.8134 -0.5588 -0.1617 +vn 0.8016 -0.5699 0.1807 +vn 0.8016 -0.5699 -0.1807 +vn 0.8134 -0.5588 0.1617 +vn 0.9068 -0.3893 -0.1617 +vn 0.8973 -0.4026 0.1807 +vn 0.8973 -0.4026 -0.1807 +vn 0.9068 -0.3893 0.1617 +vn 0.9653 -0.2050 -0.1617 +vn 0.9586 -0.2199 0.1807 +vn 0.9586 -0.2199 -0.1807 +vn 0.9653 -0.2050 0.1617 +vn 0.9868 -0.0127 -0.1617 +vn 0.9831 -0.0286 0.1807 +vn 0.9831 -0.0286 -0.1807 +vn 0.9868 -0.0126 0.1617 +vn 0.9703 0.1801 -0.1617 +vn 0.9698 0.1637 0.1807 +vn 0.9698 0.1637 -0.1807 +vn 0.9703 0.1800 0.1617 +vn 0.9165 0.3659 -0.1617 +vn 0.9193 0.3497 0.1807 +vn 0.9193 0.3497 -0.1807 +vn 0.9165 0.3659 0.1617 +vn 0.8275 0.5377 -0.1617 +vn 0.8333 0.5224 0.1807 +vn 0.8333 0.5224 -0.1807 +vn 0.8275 0.5376 0.1617 +vn 0.7067 0.6888 -0.1617 +vn 0.7154 0.6750 0.1807 +vn 0.7154 0.6750 -0.1807 +vn 0.7067 0.6888 0.1617 +vn 0.5587 0.8134 -0.1617 +vn 0.5700 0.8016 0.1807 +vn 0.5700 0.8016 -0.1807 +vn 0.5588 0.8134 0.1617 +vn 0.3893 0.9068 -0.1617 +vn 0.4026 0.8973 0.1807 +vn 0.4026 0.8974 -0.1807 +vn 0.3893 0.9068 0.1617 +vn 0.2050 0.9653 -0.1617 +vn 0.2199 0.9586 0.1807 +vn 0.2199 0.9586 -0.1807 +vn 0.2050 0.9653 0.1617 +vn 0.0127 0.9868 -0.1617 +vn 0.0286 0.9831 0.1807 +vn 0.0286 0.9831 -0.1807 +vn 0.0127 0.9868 0.1617 +vn -0.1801 0.9703 -0.1617 +vn -0.1637 0.9698 0.1807 +vn -0.1637 0.9698 -0.1807 +vn -0.1801 0.9703 0.1617 +vn -0.3659 0.9165 -0.1617 +vn -0.3498 0.9192 0.1807 +vn -0.3498 0.9192 -0.1807 +vn -0.3659 0.9165 0.1617 +vn -0.5377 0.8275 -0.1617 +vn -0.5224 0.8333 0.1807 +vn -0.5224 0.8333 -0.1807 +vn -0.5377 0.8275 0.1617 +vn -0.6888 0.7067 -0.1617 +vn -0.6750 0.7154 0.1807 +vn -0.6750 0.7154 -0.1807 +vn -0.6887 0.7068 0.1616 +vn -0.8134 0.5588 -0.1617 +vn -0.8015 0.5700 0.1807 +vn -0.8015 0.5700 -0.1807 +vn -0.8134 0.5587 0.1617 +vn -0.9068 0.3893 -0.1617 +vn -0.8973 0.4026 0.1807 +vn -0.8973 0.4027 -0.1807 +vn -0.9068 0.3893 0.1617 +vn -0.9653 0.2049 -0.1617 +vn -0.9587 0.2198 0.1807 +vn -0.9587 0.2198 -0.1807 +vn -0.9653 0.2049 0.1617 +vn -0.7743 0.0760 0.6282 +vn -0.6388 -0.7468 0.1849 +vn -0.6388 -0.7468 -0.1849 +vn -0.6306 -0.7611 0.1519 +vn -0.0157 -0.9318 0.3627 +vn -0.0514 -0.9237 0.3797 +vn 0.0196 -0.9172 0.3980 +vn -0.0514 -0.9237 -0.3797 +vn 0.0196 -0.9172 -0.3980 +vn -0.0157 -0.9318 -0.3627 +vn -0.4700 -0.8695 -0.1519 +vn -0.4808 -0.8571 0.1849 +vn -0.4809 -0.8571 -0.1849 +vn -0.4700 -0.8695 0.1519 +vn 0.1664 -0.9170 0.3627 +vn 0.1298 -0.9160 0.3796 +vn 0.1982 -0.8957 0.3980 +vn 0.1664 -0.9170 -0.3626 +vn 0.1982 -0.8957 -0.3980 +vn 0.1298 -0.9160 -0.3796 +vn -0.2913 -0.9445 -0.1519 +vn -0.3044 -0.9344 0.1849 +vn -0.3044 -0.9344 -0.1849 +vn -0.2913 -0.9445 0.1519 +vn 0.3421 -0.8669 0.3627 +vn 0.3060 -0.8731 0.3796 +vn 0.3691 -0.8398 0.3981 +vn 0.3060 -0.8731 -0.3796 +vn 0.3421 -0.8669 -0.3627 +vn 0.3691 -0.8398 -0.3981 +vn -0.7670 -0.6234 -0.1519 +vn -0.7722 -0.6078 0.1849 +vn -0.7722 -0.6078 -0.1849 +vn -0.7670 -0.6235 0.1519 +vn -0.1972 -0.9108 0.3627 +vn -0.2306 -0.8959 0.3797 +vn -0.1597 -0.9034 0.3980 +vn -0.1597 -0.9034 -0.3980 +vn -0.2306 -0.8959 -0.3797 +vn -0.1972 -0.9108 -0.3627 +vn -0.8739 -0.4619 -0.1519 +vn -0.8760 -0.4455 0.1849 +vn -0.8760 -0.4455 -0.1849 +vn -0.8739 -0.4618 0.1519 +vn -0.3711 -0.8548 0.3627 +vn -0.4010 -0.8337 0.3797 +vn -0.3329 -0.8548 0.3981 +vn -0.3711 -0.8548 -0.3627 +vn -0.3329 -0.8548 -0.3980 +vn -0.4010 -0.8337 -0.3797 +vn -0.9472 -0.2824 -0.1519 +vn -0.9461 -0.2660 0.1849 +vn -0.9461 -0.2660 -0.1849 +vn -0.9472 -0.2825 0.1519 +vn -0.5308 -0.7660 0.3627 +vn -0.5559 -0.7394 0.3796 +vn -0.4932 -0.7735 0.3980 +vn -0.5559 -0.7395 -0.3797 +vn -0.4933 -0.7735 -0.3980 +vn -0.5308 -0.7660 -0.3627 +vn -0.9841 -0.0922 -0.1519 +vn -0.9798 -0.0764 0.1849 +vn -0.9798 -0.0763 -0.1849 +vn -0.9841 -0.0923 0.1519 +vn -0.9134 -0.0851 -0.3980 +vn -0.9237 -0.0520 -0.3797 +vn -0.9239 -0.1219 -0.3626 +vn -0.9134 -0.0851 0.3980 +vn -0.9239 -0.1219 0.3627 +vn -0.9237 -0.0520 0.3796 +vn -0.9832 0.1015 0.1519 +vn -0.9759 0.1162 -0.1849 +vn -0.9832 0.1015 -0.1519 +vn -0.9759 0.1162 0.1849 +vn -0.9125 0.0947 -0.3980 +vn -0.9161 0.1292 -0.3797 +vn -0.9299 0.0607 -0.3626 +vn -0.9299 0.0607 0.3626 +vn -0.9161 0.1292 0.3796 +vn -0.9125 0.0948 0.3980 +vn -0.9165 -0.3659 -0.1617 +vn -0.9344 0.3044 -0.1849 +vn -0.9192 -0.3498 -0.1807 +vn -0.9445 0.2913 -0.1519 +vn -0.8669 -0.3421 0.3627 +vn -0.8731 -0.3060 0.3797 +vn -0.8398 -0.3691 0.3980 +vn -0.8731 -0.3059 -0.3797 +vn -0.8669 -0.3421 -0.3627 +vn -0.8398 -0.3691 -0.3980 +vn -0.9703 -0.1801 -0.1617 +vn -0.9698 -0.1638 0.1807 +vn -0.9698 -0.1638 -0.1807 +vn -0.9703 -0.1801 0.1617 +vn -0.8068 0.4367 -0.3980 +vn -0.7969 0.4700 -0.3797 +vn -0.8359 0.4120 -0.3627 +vn -0.8068 0.4367 0.3980 +vn -0.8359 0.4120 0.3627 +vn -0.7969 0.4700 0.3797 +vn -0.9868 0.0127 -0.1617 +vn -0.9831 0.0286 0.1807 +vn -0.9831 0.0286 -0.1807 +vn -0.9868 0.0127 0.1617 +vn -0.9318 0.0158 0.3627 +vn -0.9237 0.0514 0.3796 +vn -0.9172 -0.0196 0.3980 +vn -0.9237 0.0514 -0.3796 +vn -0.9172 -0.0196 -0.3980 +vn -0.9318 0.0157 -0.3626 +vn -0.6234 0.7670 -0.1519 +vn -0.6078 0.7723 0.1849 +vn -0.6078 0.7723 -0.1849 +vn -0.6234 0.7670 0.1519 +vn -0.9108 0.1972 0.3626 +vn -0.8959 0.2306 0.3796 +vn -0.9034 0.1597 0.3980 +vn -0.8959 0.2306 -0.3796 +vn -0.9108 0.1973 -0.3627 +vn -0.9034 0.1597 -0.3980 +vn -0.4618 0.8739 -0.1519 +vn -0.4455 0.8760 0.1849 +vn -0.4455 0.8760 -0.1849 +vn -0.4618 0.8739 0.1519 +vn -0.8548 0.3711 0.3627 +vn -0.8337 0.4010 0.3796 +vn -0.8548 0.3329 0.3981 +vn -0.8548 0.3711 -0.3627 +vn -0.8548 0.3329 -0.3980 +vn -0.8337 0.4010 -0.3796 +vn -0.2825 0.9472 -0.1519 +vn -0.2660 0.9461 0.1849 +vn -0.2660 0.9461 -0.1849 +vn -0.2825 0.9472 0.1519 +vn -0.7660 0.5308 0.3627 +vn -0.7395 0.5559 0.3796 +vn -0.7735 0.4933 0.3980 +vn -0.7395 0.5559 -0.3796 +vn -0.7735 0.4933 -0.3980 +vn -0.7660 0.5308 -0.3627 +vn -0.0923 0.9841 -0.1519 +vn -0.0763 0.9798 0.1849 +vn -0.0763 0.9798 -0.1849 +vn -0.0923 0.9841 0.1519 +vn -0.6478 0.6700 0.3627 +vn -0.6168 0.6895 0.3796 +vn -0.6624 0.6347 0.3980 +vn -0.6624 0.6347 -0.3980 +vn -0.6168 0.6895 -0.3796 +vn -0.6477 0.6700 -0.3626 +vn 0.1015 0.9832 -0.1519 +vn 0.1162 0.9759 0.1849 +vn 0.1162 0.9759 -0.1849 +vn 0.1015 0.9832 0.1519 +vn -0.5046 0.7835 0.3627 +vn -0.4704 0.7966 0.3796 +vn -0.5258 0.7517 0.3980 +vn -0.5046 0.7835 -0.3627 +vn -0.5259 0.7517 -0.3980 +vn -0.4704 0.7966 -0.3797 +vn 0.2913 0.9445 -0.1519 +vn 0.3044 0.9344 0.1849 +vn 0.3044 0.9344 -0.1849 +vn 0.2913 0.9445 0.1519 +vn -0.3420 0.8669 0.3626 +vn -0.3060 0.8731 0.3796 +vn -0.3691 0.8399 0.3980 +vn -0.3060 0.8731 -0.3797 +vn -0.3691 0.8399 -0.3980 +vn -0.3421 0.8669 -0.3626 +vn 0.4700 0.8695 -0.1519 +vn 0.4808 0.8571 0.1849 +vn 0.4809 0.8571 -0.1849 +vn 0.4700 0.8695 0.1519 +vn -0.1664 0.9170 0.3626 +vn -0.1298 0.9160 0.3797 +vn -0.1982 0.8957 0.3980 +vn -0.1664 0.9170 -0.3626 +vn -0.1982 0.8957 -0.3980 +vn -0.1297 0.9160 -0.3797 +vn 0.6306 0.7611 -0.1519 +vn 0.6388 0.7468 0.1849 +vn 0.6388 0.7468 -0.1849 +vn 0.6306 0.7611 0.1519 +vn 0.0157 0.9318 0.3627 +vn 0.0514 0.9237 0.3796 +vn -0.0196 0.9172 0.3980 +vn 0.0514 0.9237 -0.3796 +vn 0.0157 0.9318 -0.3627 +vn -0.0196 0.9172 -0.3980 +vn 0.7669 0.6235 -0.1519 +vn 0.7722 0.6078 0.1849 +vn 0.7722 0.6078 -0.1849 +vn 0.7669 0.6235 0.1519 +vn 0.1972 0.9108 0.3627 +vn 0.2307 0.8959 0.3797 +vn 0.1597 0.9034 0.3980 +vn 0.1972 0.9108 -0.3627 +vn 0.1597 0.9034 -0.3980 +vn 0.2306 0.8959 -0.3797 +vn 0.8739 0.4618 -0.1519 +vn 0.8760 0.4455 0.1849 +vn 0.8760 0.4455 -0.1849 +vn 0.8739 0.4618 0.1519 +vn 0.3711 0.8548 0.3627 +vn 0.4010 0.8337 0.3797 +vn 0.3329 0.8549 0.3980 +vn 0.4010 0.8337 -0.3796 +vn 0.3329 0.8549 -0.3980 +vn 0.3711 0.8548 -0.3626 +vn 0.9472 0.2824 -0.1519 +vn 0.9460 0.2661 0.1849 +vn 0.9460 0.2661 -0.1849 +vn 0.9472 0.2824 0.1519 +vn 0.5307 0.7660 0.3627 +vn 0.5559 0.7395 0.3796 +vn 0.4932 0.7735 0.3980 +vn 0.4933 0.7735 -0.3980 +vn 0.5559 0.7395 -0.3796 +vn 0.5307 0.7660 -0.3627 +vn 0.9841 0.0923 -0.1519 +vn 0.9798 0.0764 0.1849 +vn 0.9798 0.0763 -0.1849 +vn 0.9841 0.0922 0.1519 +vn 0.6700 0.6477 0.3627 +vn 0.6895 0.6168 0.3797 +vn 0.6347 0.6624 0.3981 +vn 0.6700 0.6477 -0.3627 +vn 0.6347 0.6624 -0.3981 +vn 0.6895 0.6168 -0.3797 +vn 0.9832 -0.1015 -0.1519 +vn 0.9758 -0.1163 0.1849 +vn 0.9758 -0.1163 -0.1849 +vn 0.9832 -0.1014 0.1519 +vn 0.7835 0.5046 0.3627 +vn 0.7966 0.4704 0.3796 +vn 0.7517 0.5258 0.3980 +vn 0.7966 0.4705 -0.3796 +vn 0.7517 0.5259 -0.3980 +vn 0.7835 0.5045 -0.3627 +vn 0.9445 -0.2913 -0.1519 +vn 0.9344 -0.3044 0.1849 +vn 0.9344 -0.3044 -0.1849 +vn 0.9445 -0.2913 0.1519 +vn 0.8669 0.3421 0.3626 +vn 0.8731 0.3060 0.3796 +vn 0.8399 0.3691 0.3980 +vn 0.8669 0.3421 -0.3626 +vn 0.8398 0.3691 -0.3980 +vn 0.8731 0.3060 -0.3796 +vn 0.8695 -0.4700 -0.1519 +vn 0.8571 -0.4808 0.1849 +vn 0.8571 -0.4808 -0.1849 +vn 0.8695 -0.4700 0.1519 +vn 0.9170 0.1664 0.3626 +vn 0.9160 0.1297 0.3797 +vn 0.8957 0.1982 0.3980 +vn 0.9160 0.1297 -0.3797 +vn 0.9170 0.1664 -0.3626 +vn 0.8957 0.1982 -0.3980 +vn 0.7611 -0.6306 -0.1519 +vn 0.7468 -0.6388 0.1849 +vn 0.7468 -0.6388 -0.1849 +vn 0.7611 -0.6306 0.1519 +vn 0.9318 -0.0157 0.3626 +vn 0.9237 -0.0515 0.3796 +vn 0.9172 0.0197 0.3980 +vn 0.9318 -0.0157 -0.3626 +vn 0.9172 0.0197 -0.3980 +vn 0.9237 -0.0514 -0.3797 +vn 0.6235 -0.7670 -0.1519 +vn 0.6078 -0.7723 0.1849 +vn 0.6078 -0.7722 -0.1849 +vn 0.6235 -0.7669 0.1519 +vn 0.9108 -0.1973 0.3627 +vn 0.8959 -0.2306 0.3797 +vn 0.9034 -0.1598 0.3980 +vn 0.8959 -0.2306 -0.3797 +vn 0.9034 -0.1597 -0.3980 +vn 0.9108 -0.1973 -0.3627 +vn 0.4618 -0.8739 -0.1519 +vn 0.4455 -0.8760 0.1849 +vn 0.4455 -0.8760 -0.1849 +vn 0.4618 -0.8739 0.1519 +vn 0.8549 -0.3711 0.3626 +vn 0.8337 -0.4010 0.3796 +vn 0.8549 -0.3329 0.3980 +vn 0.8549 -0.3329 -0.3980 +vn 0.8337 -0.4010 -0.3797 +vn 0.8549 -0.3711 -0.3626 +vn 0.2825 -0.9472 -0.1519 +vn 0.2660 -0.9461 0.1849 +vn 0.2660 -0.9461 -0.1849 +vn 0.2825 -0.9472 0.1519 +vn 0.7660 -0.5307 0.3627 +vn 0.7395 -0.5560 0.3796 +vn 0.7735 -0.4932 0.3980 +vn 0.7660 -0.5307 -0.3627 +vn 0.7735 -0.4932 -0.3980 +vn 0.7395 -0.5559 -0.3796 +vn 0.0923 -0.9841 -0.1519 +vn 0.0764 -0.9798 0.1849 +vn 0.0764 -0.9798 -0.1849 +vn 0.0923 -0.9841 0.1519 +vn 0.6477 -0.6700 0.3627 +vn 0.6168 -0.6895 0.3797 +vn 0.6624 -0.6347 0.3980 +vn 0.6168 -0.6895 -0.3797 +vn 0.6624 -0.6347 -0.3980 +vn 0.6477 -0.6700 -0.3627 +vn -0.1015 -0.9832 -0.1519 +vn -0.1162 -0.9759 0.1849 +vn -0.1162 -0.9759 -0.1849 +vn -0.1015 -0.9832 0.1519 +vn 0.5046 -0.7835 0.3627 +vn 0.4704 -0.7966 0.3797 +vn 0.5259 -0.7517 0.3980 +vn 0.5046 -0.7835 -0.3626 +vn 0.5259 -0.7517 -0.3980 +vn 0.4704 -0.7966 -0.3797 +vn 0.1197 0.0118 -0.9927 +vn 0.1151 0.0350 -0.9927 +vn 0.0567 0.1061 -0.9927 +vn 0.0349 0.1152 -0.9927 +vn -0.0350 0.1151 -0.9927 +vn -0.0567 0.1061 -0.9927 +vn -0.0764 0.0930 -0.9927 +vn -0.1151 0.0349 -0.9927 +vn -0.1197 0.0118 -0.9927 +vn -0.1061 -0.0567 -0.9927 +vn -0.0930 -0.0764 -0.9927 +vn -0.0763 -0.0930 -0.9927 +vn -0.0118 -0.1197 -0.9927 +vn 0.0118 -0.1197 -0.9927 +vn 0.0764 -0.0930 -0.9927 +vn 0.0930 -0.0763 -0.9927 +vn 0.1061 -0.0567 -0.9927 +vn 0.1151 -0.0349 -0.9927 +vn 0.1197 -0.0118 -0.9927 +vn 0.0350 -0.1151 -0.9927 +vn 0.0567 -0.1061 -0.9927 +vn -0.0567 -0.1061 -0.9927 +vn -0.0349 -0.1151 -0.9927 +vn -0.1197 -0.0118 -0.9927 +vn -0.1151 -0.0350 -0.9927 +vn -0.0930 0.0763 -0.9927 +vn -0.1061 0.0567 -0.9927 +vn 0.0118 0.1197 -0.9927 +vn -0.0118 0.1197 -0.9927 +vn 0.1061 0.0567 -0.9927 +vn 0.0930 0.0764 -0.9927 +vn 0.0763 0.0930 -0.9927 +usemtl besi_roda +s off +f 2699/3084/1540 2704/3085/1540 2709/3086/1540 2714/3087/1540 2719/3088/1540 2724/3089/1540 2730/3090/1540 2737/3091/1540 2744/3092/1540 2751/3093/1540 2758/3094/1540 2765/3095/1540 2772/3096/1540 2779/3097/1540 2786/3098/1540 2793/3099/1540 2800/3100/1540 2807/3101/1540 2814/3102/1540 2821/3103/1540 2828/3104/1540 2835/3105/1540 2842/3106/1540 2849/3107/1540 2856/3108/1540 2863/3109/1540 2870/3110/1540 2877/3111/1540 2884/3112/1540 2891/3113/1540 2898/3114/1540 2905/3115/1540 +f 4018/3116/1541 4019/3117/1541 4017/3118/1541 4016/3119/1541 +f 4014/3120/1542 4015/3121/1542 4019/3117/1542 4018/3116/1542 +f 4026/3122/1543 4027/3123/1543 4025/3124/1543 4024/3125/1543 +f 4022/3126/1544 4023/3127/1544 4027/3123/1544 4026/3122/1544 +f 4034/3128/1545 4035/3129/1545 4033/3130/1545 4032/3131/1545 +f 4030/3132/1546 4031/3133/1546 4035/3129/1546 4034/3128/1546 +f 4042/3134/1547 4043/3135/1547 4041/3136/1547 4040/3137/1547 +f 4038/3138/1548 4039/3139/1548 4043/3135/1548 4042/3134/1548 +f 4050/3140/1549 4051/3141/1549 4049/3142/1549 4048/3143/1549 +f 4046/3144/1550 4047/3145/1550 4051/3141/1550 4050/3140/1550 +f 4058/3146/1551 4059/3147/1551 4057/3148/1551 4056/3149/1551 +f 4054/3150/1552 4055/3151/1552 4059/3147/1552 4058/3146/1552 +f 4066/3152/1553 4067/3153/1553 4065/3154/1553 4064/3155/1553 +f 4062/3156/1554 4063/3157/1554 4067/3153/1554 4066/3152/1554 +f 4097/3158/1555 4012/3159/1555 4098/3160/1555 +f 4012/3159/1555 4097/3158/1555 4100/3161/1555 +f 4013/3162/1555 4088/3163/1555 4109/3164/1555 +f 4013/3162/1556 4109/3164/1556 4090/3165/1556 +f 4139/3166/1557 4113/3167/1557 4020/3168/1557 4015/3169/1557 4014/3170/1557 4021/3171/1557 4119/3172/1557 4142/3173/1557 +f 4021/3174/1558 4014/3175/1558 4018/3176/1558 4145/3177/1558 4144/3178/1558 4121/3179/1558 +f 4148/3180/1559 4019/3181/1559 4015/3182/1559 4020/3183/1559 4115/3184/1559 4147/3185/1559 +f 4168/3186/1560 4153/3187/1560 4028/3188/1560 4023/3189/1560 4022/3190/1560 4029/3191/1560 4158/3192/1560 4172/3193/1560 +f 4029/3194/1561 4022/3195/1561 4026/3196/1561 4180/3197/1561 4174/3198/1561 4155/3199/1561 +f 4182/3200/1562 4027/3201/1562 4023/3202/1562 4028/3203/1562 4154/3204/1562 4181/3205/1562 +f 4204/3206/1563 4186/3207/1563 4036/3208/1563 4031/3209/1563 4030/3210/1563 4037/3211/1563 4192/3212/1563 4205/3213/1563 4206/3214/1563 +f 4037/3215/1564 4030/3216/1564 4034/3217/1564 4208/3218/1564 4207/3219/1564 4190/3220/1564 +f 4212/3221/1565 4035/3222/1565 4031/3223/1565 4036/3224/1565 4187/3225/1565 4211/3226/1565 +f 4228/3227/1566 4213/3228/1566 4044/3229/1566 4039/3230/1566 4038/3231/1566 4045/3232/1566 4218/3233/1566 4229/3234/1566 +f 4045/3235/1567 4038/3236/1567 4042/3237/1567 4135/3238/1567 4230/3239/1567 4219/3240/1567 +f 4134/3241/1568 4043/3242/1568 4039/3243/1568 4044/3244/1568 4216/3245/1568 4231/3246/1568 +f 4156/3247/1569 4138/3248/1569 4052/3249/1569 4047/3250/1569 4046/3251/1569 4053/3252/1569 4143/3253/1569 4157/3254/1569 +f 4053/3255/1570 4046/3256/1570 4050/3257/1570 4162/3258/1570 4161/3259/1570 4146/3260/1570 +f 4167/3261/1571 4051/3262/1571 4047/3263/1571 4052/3264/1571 4141/3265/1571 4164/3266/1571 +f 4183/3267/1572 4169/3268/1572 4060/3269/1572 4055/3270/1572 4054/3271/1572 4061/3272/1572 4176/3273/1572 4188/3274/1572 +f 4061/3275/1573 4054/3276/1573 4058/3277/1573 4191/3278/1573 4189/3279/1573 4173/3280/1573 +f 4194/3281/1574 4059/3282/1574 4055/3283/1574 4060/3284/1574 4171/3285/1574 4193/3286/1574 +f 4215/3287/1575 4201/3288/1575 4068/3289/1575 4069/3290/1575 4063/3291/1575 4062/3292/1575 4070/3293/1575 4202/3294/1575 4220/3295/1575 4221/3296/1575 +f 4070/3297/1576 4062/3298/1576 4066/3299/1576 4225/3300/1576 4223/3301/1576 4198/3302/1576 +f 4227/3303/1577 4067/3304/1577 4063/3305/1577 4069/3306/1577 4195/3307/1577 4226/3308/1577 +f 4071/3309/1578 4142/3310/1578 4119/3311/1578 4114/3312/1578 4112/3313/1578 +f 4092/3314/1578 4094/3315/1578 4117/3316/1578 4116/3317/1578 4121/3318/1578 4144/3319/1578 4226/3320/1578 4195/3321/1578 4118/3322/1578 +f 4215/3323/1578 4072/3324/1578 4203/3325/1578 4201/3326/1578 +f 4170/3327/1579 4169/3328/1579 4183/3329/1579 4073/3330/1579 4175/3331/1579 +f 4220/3332/1579 4202/3333/1579 4203/3325/1579 4072/3324/1579 +f 4197/3334/1579 4198/3335/1579 4223/3336/1579 4193/3337/1579 4171/3338/1579 4122/3339/1579 4100/3340/1579 4097/3341/1579 4098/3342/1579 4120/3343/1579 +f 4164/3344/1580 4141/3345/1580 4128/3346/1580 4127/3347/1580 4125/3348/1580 4124/3349/1580 4173/3350/1580 4189/3351/1580 +f 4074/3352/1580 4140/3353/1580 4138/3354/1580 4156/3355/1580 +f 4175/3331/1580 4073/3330/1580 4188/3356/1580 4176/3357/1580 +f 4231/3358/1581 4216/3359/1581 4131/3360/1581 4078/3361/1581 4130/3362/1581 4146/3363/1581 4161/3364/1581 +f 4075/3365/1581 4217/3366/1581 4214/3367/1581 4213/3368/1581 4228/3369/1581 +f 4143/3370/1581 4137/3371/1581 4140/3353/1581 4074/3352/1581 4157/3372/1581 +f 4075/3365/1582 4229/3373/1582 4218/3374/1582 4217/3366/1582 +f 4082/3375/1582 4081/3376/1582 4079/3377/1582 4080/3378/1582 4219/3379/1582 4230/3380/1582 4211/3381/1582 4187/3382/1582 +f 4204/3383/1582 4076/3384/1582 4184/3385/1582 4186/3386/1582 +f 4210/3387/1583 4095/3388/1583 4096/3389/1583 4099/3390/1583 4177/3391/1583 4194/3392/1583 4193/3393/1583 4223/3394/1583 4225/3395/1583 +f 4072/3396/1583 4221/3397/1583 4220/3398/1583 +f 4133/3399/1584 4134/3400/1584 4231/3401/1584 4161/3402/1584 4162/3403/1584 4151/3404/1584 4104/3405/1584 4103/3406/1584 4222/3407/1584 +f 4157/3408/1555 4074/3409/1555 4156/3410/1555 +f 4179/3411/1585 4178/3412/1585 4101/3413/1585 4102/3414/1585 4149/3415/1585 4150/3416/1585 4167/3417/1585 4164/3418/1585 4189/3419/1585 4191/3420/1585 +f 4188/3421/1555 4073/3422/1555 4183/3423/1555 +f 4206/3424/1586 4076/3425/1586 4204/3426/1586 +f 4224/3427/1587 4105/3428/1587 4106/3429/1587 4196/3430/1587 4199/3431/1587 4212/3432/1587 4211/3433/1587 4230/3434/1587 4135/3435/1587 4136/3436/1587 +f 4075/3437/1555 4228/3438/1555 4229/3439/1555 +f 4192/3440/1588 4185/3441/1588 4184/3385/1588 4076/3384/1588 4205/3442/1588 +f 4085/3443/1588 4084/3444/1588 4083/3445/1588 4190/3446/1588 4207/3447/1588 4181/3448/1588 4154/3449/1588 +f 4168/3450/1589 4077/3451/1589 4159/3452/1589 4152/3453/1589 4153/3454/1589 +f 4159/3452/1590 4077/3451/1590 4172/3455/1590 4158/3456/1590 +f 4112/3457/1590 4113/3458/1590 4139/3459/1590 4071/3460/1590 +f 4115/3461/1590 4089/3462/1590 4090/3463/1590 4109/3464/1590 4088/3465/1590 4086/3466/1590 4087/3467/1590 4155/3468/1590 4174/3469/1590 4147/3470/1590 +f 4205/3471/1591 4076/3425/1591 4206/3424/1591 +f 4208/3472/1591 4200/3473/1591 4107/3474/1591 4108/3475/1591 4160/3476/1591 4163/3477/1591 4182/3478/1591 4181/3479/1591 4207/3480/1591 +f 4071/3481/1555 4139/3482/1555 4142/3483/1555 +f 4145/3484/1592 4132/3485/1592 4123/3486/1592 4093/3487/1592 4091/3488/1592 4209/3489/1592 4227/3490/1592 4226/3491/1592 4144/3492/1592 +f 4077/3493/1555 4168/3494/1555 4172/3495/1555 +f 4180/3496/1593 4166/3497/1593 4165/3498/1593 4111/3499/1593 4110/3500/1593 4126/3501/1593 4129/3502/1593 4148/3503/1593 4147/3504/1593 4174/3505/1593 +f 4221/3397/1594 4072/3396/1594 4215/3506/1594 +f 4260/3507/1555 4091/3508/1555 4093/3509/1555 4258/3510/1555 +f 4267/3511/1555 4096/3512/1555 4095/3513/1555 4265/3514/1555 +f 4096/3512/1555 4267/3511/1555 4268/3515/1555 4099/3516/1555 +f 4102/3517/1555 4101/3518/1555 4269/3519/1555 4261/3520/1555 +f 4250/3521/1595 4103/3522/1595 4104/3523/1595 4264/3524/1595 +f 4271/3525/1555 4106/3526/1555 4105/3527/1555 4254/3528/1555 +f 4108/3529/1555 4107/3530/1555 4242/3531/1555 4272/3532/1555 +f 4110/3533/1596 4111/3534/1596 4274/3535/1596 4273/3536/1596 +f 4258/3510/1556 4093/3509/1556 4123/3537/1556 4275/3538/1556 +f 4276/3539/1555 4126/3540/1555 4110/3533/1555 4273/3536/1555 +f 4278/3541/1555 4129/3542/1555 4126/3540/1555 4276/3539/1555 +f 4275/3538/1555 4123/3537/1555 4132/3543/1555 4282/3544/1555 +f 4290/3545/1555 4160/3546/1555 4108/3529/1555 4272/3532/1555 +f 4294/3547/1555 4163/3548/1555 4160/3546/1555 4290/3545/1555 +f 4295/3549/1555 4165/3550/1555 4166/3551/1555 4296/3552/1555 +f 4274/3535/1555 4111/3534/1555 4165/3550/1555 4295/3549/1555 +f 4241/3553/1556 4196/3554/1556 4106/3526/1556 4271/3525/1556 +f 4240/3555/1555 4199/3556/1555 4196/3554/1555 4241/3553/1555 +f 4107/3530/1555 4200/3557/1555 4243/3558/1555 4242/3531/1555 +f 4249/3559/1596 4222/3560/1596 4103/3522/1596 4250/3521/1596 +f 4251/3561/1596 4133/3562/1596 4222/3560/1596 4249/3559/1596 +f 4253/3563/1555 4224/3564/1555 4136/3565/1555 4252/3566/1555 +f 4254/3528/1555 4105/3527/1555 4224/3564/1555 4253/3563/1555 +f 4149/3567/1556 4102/3517/1556 4261/3520/1556 4262/3568/1556 +f 4150/3569/1556 4149/3567/1556 4262/3568/1556 4263/3570/1556 +f 4264/3524/1555 4104/3523/1555 4151/3571/1555 4266/3572/1555 +f 4099/3516/1555 4268/3515/1555 4281/3573/1555 4177/3574/1555 +f 4178/3575/1555 4179/3576/1555 4283/3577/1555 4284/3578/1555 +f 4269/3519/1555 4101/3518/1555 4178/3575/1555 4284/3578/1555 +f 4091/3508/1597 4260/3507/1597 4297/3579/1597 4209/3580/1597 +f 4265/3514/1555 4095/3513/1555 4210/3581/1555 4298/3582/1555 +f 4297/3583/1578 4260/3584/1578 4258/3585/1578 4275/3586/1578 4282/3587/1578 4289/3588/1578 4301/3589/1578 +f 4281/3590/1579 4268/3591/1579 4267/3592/1579 4265/3593/1579 4298/3594/1579 4306/3595/1579 4286/3596/1579 +f 4263/3597/1580 4262/3598/1580 4261/3599/1580 4269/3600/1580 4284/3601/1580 4283/3602/1580 4293/3603/1580 4270/3604/1580 +f 4251/3605/1581 4249/3606/1581 4250/3607/1581 4264/3608/1581 4266/3609/1581 4279/3610/1581 4255/3611/1581 +f 4240/3612/1582 4241/3613/1582 4271/3614/1582 4254/3615/1582 4253/3616/1582 4252/3617/1582 4257/3618/1582 4244/3619/1582 +f 4305/3620/1598 4235/3621/1598 4236/3622/1598 4291/3623/1598 4286/3624/1598 4306/3625/1598 +f 4292/3626/1599 4238/3627/1599 4277/3628/1599 4270/3629/1599 4293/3630/1599 +f 4239/3631/1600 4246/3632/1600 4248/3633/1600 +f 4259/3634/1601 4233/3635/1601 4245/3636/1601 4244/3637/1601 4257/3638/1601 +f 4280/3639/1602 4234/3640/1602 4256/3641/1602 4255/3642/1602 4279/3643/1602 +f 4294/3644/1588 4290/3645/1588 4272/3646/1588 4242/3647/1588 4243/3648/1588 4247/3649/1588 4299/3650/1588 +f 4276/3651/1590 4273/3652/1590 4274/3653/1590 4295/3654/1590 4296/3655/1590 4302/3656/1590 4285/3657/1590 4278/3658/1590 +f 4299/3659/1603 4247/3660/1603 4246/3632/1603 4239/3631/1603 4300/3661/1603 +f 4307/3662/1604 4232/3663/1604 4287/3664/1604 4285/3665/1604 4302/3666/1604 +f 4288/3667/1605 4237/3668/1605 4303/3669/1605 4301/3670/1605 4289/3671/1605 +f 4235/3621/1606 4305/3620/1606 4304/3672/1606 +f 4309/3673/1555 4308/3674/1555 4314/3675/1555 4313/3676/1555 4312/3677/1555 4311/3678/1555 4310/3679/1555 +f 4323/3680/1555 4322/3681/1555 4315/3682/1555 4316/3683/1555 +f 4322/3681/1555 4324/3684/1555 4317/3685/1555 4315/3682/1555 +f 4324/3684/1555 4325/3686/1555 4318/3687/1555 4317/3685/1555 +f 4325/3686/1555 4326/3688/1555 4319/3689/1555 4318/3687/1555 +f 4326/3688/1555 4327/3690/1555 4320/3691/1555 4319/3689/1555 +f 4327/3690/1555 4328/3692/1555 4321/3693/1555 4320/3691/1555 +f 4328/3692/1555 4323/3680/1555 4316/3683/1555 4321/3693/1555 +f 4308/3674/1607 4309/3673/1607 4322/3681/1607 4323/3680/1607 +f 4309/3673/1608 4310/3679/1608 4324/3684/1608 4322/3681/1608 +f 4310/3679/1609 4311/3678/1609 4325/3686/1609 4324/3684/1609 +f 4311/3678/1610 4312/3677/1610 4326/3688/1610 4325/3686/1610 +f 4312/3677/1611 4313/3676/1611 4327/3690/1611 4326/3688/1611 +f 4313/3676/1612 4314/3675/1612 4328/3692/1612 4327/3690/1612 +f 4314/3675/1613 4308/3674/1613 4323/3680/1613 4328/3692/1613 +f 4330/3694/1614 4016/3119/1614 4017/3118/1614 4333/3695/1614 +f 4335/3696/1615 4024/3125/1615 4025/3124/1615 4337/3697/1615 +f 4339/3698/1616 4032/3131/1616 4033/3130/1616 4341/3699/1616 +f 4343/3700/1617 4040/3137/1617 4041/3136/1617 4344/3701/1617 +f 4348/3702/1618 4048/3143/1618 4049/3142/1618 4350/3703/1618 +f 4332/3704/1619 4056/3149/1619 4057/3148/1619 4331/3705/1619 +f 4340/3706/1620 4064/3155/1620 4065/3154/1620 4338/3707/1620 +f 4287/3708/1559 4347/3709/1559 4333/3710/1559 4017/3711/1559 4019/3181/1559 4148/3180/1559 4129/3712/1559 4278/3713/1559 4285/3714/1559 +f 4282/3715/1558 4132/3716/1558 4145/3177/1558 4018/3176/1558 4016/3717/1558 4330/3718/1558 4349/3719/1558 4288/3720/1558 4289/3721/1558 +f 4300/3722/1562 4356/3723/1562 4337/3724/1562 4025/3725/1562 4027/3201/1562 4182/3200/1562 4163/3726/1562 4294/3727/1562 4299/3728/1562 +f 4296/3729/1561 4166/3730/1561 4180/3197/1561 4026/3196/1561 4024/3731/1561 4335/3732/1561 4359/3733/1561 4307/3734/1561 4302/3735/1561 +f 4341/3736/1565 4033/3737/1565 4035/3222/1565 4212/3221/1565 4199/3738/1565 4240/3739/1565 4244/3740/1565 4245/3741/1565 4360/3742/1565 +f 4243/3743/1564 4200/3744/1564 4208/3218/1564 4034/3217/1564 4032/3745/1564 4339/3746/1564 4365/3747/1564 4248/3748/1564 4246/3749/1564 4247/3750/1564 +f 4344/3751/1568 4041/3752/1568 4043/3242/1568 4134/3241/1568 4133/3753/1568 4251/3754/1568 4255/3755/1568 4256/3756/1568 4366/3757/1568 +f 4252/3758/1567 4136/3759/1567 4135/3238/1567 4042/3237/1567 4040/3760/1567 4343/3761/1567 4364/3762/1567 4259/3763/1567 4257/3764/1567 +f 4350/3765/1571 4049/3766/1571 4051/3262/1571 4167/3261/1571 4150/3767/1571 4263/3768/1571 4270/3769/1571 4277/3770/1571 4363/3771/1571 +f 4266/3772/1570 4151/3773/1570 4162/3258/1570 4050/3257/1570 4048/3774/1570 4348/3775/1570 4358/3776/1570 4280/3777/1570 4279/3778/1570 +f 4291/3779/1574 4329/3780/1574 4331/3781/1574 4057/3782/1574 4059/3282/1574 4194/3281/1574 4177/3783/1574 4281/3784/1574 4286/3785/1574 +f 4283/3786/1573 4179/3787/1573 4191/3278/1573 4058/3277/1573 4056/3788/1573 4332/3789/1573 4334/3790/1573 4292/3791/1573 4293/3792/1573 +f 4303/3793/1577 4336/3794/1577 4338/3795/1577 4065/3796/1577 4067/3304/1577 4227/3303/1577 4209/3797/1577 4297/3798/1577 4301/3799/1577 +f 4298/3800/1576 4210/3801/1576 4225/3300/1576 4066/3299/1576 4064/3802/1576 4340/3803/1576 4342/3804/1576 4304/3805/1576 4305/3806/1576 4306/3807/1576 +f 4347/3808/1621 4287/3809/1621 4232/3810/1621 4346/3811/1621 4345/3812/1621 +f 4351/3813/1621 4237/3814/1621 4288/3815/1621 4349/3816/1621 +f 4336/3817/1622 4303/3818/1622 4237/3814/1622 4351/3813/1622 4352/3819/1622 +f 4353/3820/1622 4235/3821/1622 4304/3822/1622 4342/3823/1622 +f 4238/3824/1623 4292/3825/1623 4334/3826/1623 4355/3827/1623 4354/3828/1623 +f 4329/3829/1623 4291/3830/1623 4236/3831/1623 4235/3821/1623 4353/3820/1623 4357/3832/1623 +f 4234/3833/1624 4280/3834/1624 4358/3835/1624 4361/3836/1624 4362/3837/1624 +f 4363/3838/1624 4277/3839/1624 4238/3824/1624 4354/3828/1624 +f 4367/3840/1625 4233/3841/1625 4259/3842/1625 4364/3843/1625 4368/3844/1625 +f 4366/3845/1626 4256/3846/1626 4234/3833/1626 4362/3837/1626 +f 4360/3847/1627 4245/3848/1627 4233/3841/1627 4367/3840/1627 +f 4369/3849/1628 4239/3850/1628 4248/3851/1628 4365/3852/1628 +f 4356/3853/1629 4300/3854/1629 4239/3850/1629 4369/3849/1629 4370/3855/1629 +f 4346/3856/1629 4232/3857/1629 4307/3858/1629 4359/3859/1629 +f 4352/3860/1630 4351/3861/1630 4349/3862/1630 4330/3863/1630 4333/3864/1630 4347/3865/1630 4345/3866/1630 4316/3683/1630 4315/3682/1630 +f 4342/3867/1631 4340/3868/1631 4338/3869/1631 4336/3870/1631 4352/3860/1631 4315/3682/1631 4317/3685/1631 4357/3871/1631 4353/3872/1631 +f 4334/3873/1632 4332/3874/1632 4331/3875/1632 4329/3876/1632 4357/3871/1632 4317/3685/1632 4318/3687/1632 4355/3877/1632 +f 4354/3878/1633 4355/3877/1633 4318/3687/1633 4319/3689/1633 4361/3879/1633 4358/3880/1633 4348/3881/1633 4350/3882/1633 4363/3883/1633 +f 4362/3884/1634 4361/3879/1634 4319/3689/1634 4320/3691/1634 4368/3885/1634 4364/3886/1634 4343/3887/1634 4344/3888/1634 4366/3889/1634 +f 4367/3890/1635 4368/3885/1635 4320/3691/1635 4321/3693/1635 4370/3891/1635 4369/3892/1635 4365/3893/1635 4339/3894/1635 4341/3895/1635 4360/3896/1635 +f 4359/3897/1636 4335/3898/1636 4337/3899/1636 4356/3900/1636 4370/3891/1636 4321/3693/1636 4316/3683/1636 4345/3866/1636 4346/3901/1636 +usemtl Material.005 +f 3214/3902/1637 3213/3903/1637 3218/3904/1637 3220/3905/1637 2716/3906/1637 2711/3907/1637 +f 3629/3908/1638 3626/3909/1638 3637/3910/1638 3642/3911/1638 +f 3643/3912/1639 3636/3913/1639 3649/3914/1639 3654/3915/1639 +f 3655/3916/1640 3648/3917/1640 3661/3918/1640 3666/3919/1640 +f 3667/3920/1641 3660/3921/1641 3673/3922/1641 3678/3923/1641 +f 3679/3924/1642 3672/3925/1642 3685/3926/1642 3690/3927/1642 +f 3691/3928/1643 3684/3929/1643 3697/3930/1643 3702/3931/1643 +f 3703/3932/1644 3696/3933/1644 3709/3934/1644 3714/3935/1644 +f 3715/3936/1645 3708/3937/1645 3721/3938/1645 3726/3939/1645 +f 3727/3940/1646 3720/3941/1646 3733/3942/1646 3738/3943/1646 +f 3739/3944/1647 3732/3945/1647 3745/3946/1647 3750/3947/1647 +f 3751/3948/1648 3744/3949/1648 3757/3950/1648 3762/3951/1648 +f 3763/3952/1649 3756/3953/1649 3769/3954/1649 3774/3955/1649 +f 3775/3956/1650 3768/3957/1650 3781/3958/1650 3786/3959/1650 +f 3787/3960/1651 3780/3961/1651 3793/3962/1651 3798/3963/1651 +f 3799/3964/1652 3792/3965/1652 3805/3966/1652 3810/3967/1652 +f 3811/3968/1653 3804/3969/1653 3817/3970/1653 3822/3971/1653 +f 3823/3972/1654 3816/3973/1654 3829/3974/1654 3834/3975/1654 +f 3835/3976/1655 3828/3977/1655 3841/3978/1655 3846/3979/1655 +f 3847/3980/1656 3840/3981/1656 3853/3982/1656 3858/3983/1656 +f 3859/3984/1657 3852/3985/1657 3865/3986/1657 3870/3987/1657 +f 3871/3988/1658 3864/3989/1658 3877/3990/1658 3882/3991/1658 +f 3883/3992/1659 3876/3993/1659 3889/3994/1659 3894/3995/1659 +f 3895/3996/1660 3888/3997/1660 3901/3998/1660 3906/3999/1660 +f 3907/4000/1661 3900/4001/1661 3913/4002/1661 3918/4003/1661 +f 3919/4004/1662 3912/4005/1662 3925/4006/1662 3930/4007/1662 +f 3931/4008/1663 3924/4009/1663 3937/4010/1663 3942/4011/1663 +f 3943/4012/1664 3936/4013/1664 3949/4014/1664 3954/4015/1664 +f 3955/4016/1665 3948/4017/1665 3961/4018/1665 3966/4019/1665 +f 3220/4020/1666 3219/4021/1666 3224/4022/1666 3226/4023/1666 2721/4024/1666 2716/4025/1666 +f 3605/4026/1667 3602/4027/1667 3627/4028/1667 3628/4029/1667 +f 3208/4030/1668 3207/4031/1668 3212/4032/1668 3214/4033/1668 2711/4034/1668 2706/4035/1668 +f 3387/4036/1669 3610/4037/1669 3585/4038/1669 3200/4039/1669 +f 2701/4040/1670 2706/4041/1670 2705/4042/1670 2700/4043/1670 +f 2700/4044/1671 2705/4045/1671 2704/3085/1671 2699/3084/1671 +f 3205/4046/1672 3204/4047/1672 3389/4048/1672 3391/4049/1672 2911/4050/1672 2703/4051/1672 +f 2708/4052/1673 2703/4053/1673 2702/4054/1673 2707/4055/1673 +f 2707/4056/1674 2702/4057/1674 3979/4058/1674 3980/4059/1674 +f 3207/4031/1667 3606/4060/1667 3631/4061/1667 3212/4032/1667 +f 2706/4035/1675 2711/4034/1675 2710/4062/1675 2705/4063/1675 +f 2705/4045/1676 2710/4064/1676 2709/3086/1676 2704/3085/1676 +f 3597/4065/1667 3209/4066/1667 3216/4067/1667 3620/4068/1667 +f 2713/4069/1677 2708/4070/1677 2707/4071/1677 2712/4072/1677 +f 2712/4073/1678 2707/4056/1678 3980/4059/1678 3981/4074/1678 +f 3213/3903/1638 3630/4075/1638 3641/4076/1638 3218/3904/1638 +f 2711/3907/1679 2716/3906/1679 2715/4077/1679 2710/4078/1679 +f 2710/4064/1680 2715/4079/1680 2714/3087/1680 2709/3086/1680 +f 3621/4080/1638 3215/4081/1638 3222/4082/1638 3634/4083/1638 +f 2718/4084/1681 2713/4085/1681 2712/4086/1681 2717/4087/1681 +f 2717/4088/1682 2712/4073/1682 3981/4074/1682 3982/4089/1682 +f 3219/4021/1639 3640/4090/1639 3653/4091/1639 3224/4022/1639 +f 2716/4025/1683 2721/4024/1683 2720/4092/1683 2715/4093/1683 +f 2715/4079/1684 2720/4094/1684 2719/3088/1684 2714/3087/1684 +f 3635/4095/1639 3221/4096/1639 3228/4097/1639 3646/4098/1639 +f 2723/4099/1685 2718/4100/1685 2717/4101/1685 2722/4102/1685 +f 2722/4103/1686 2717/4088/1686 3982/4089/1686 3983/4104/1686 +f 3225/4105/1687 3652/4106/1687 3665/4107/1687 3230/4108/1687 +f 2721/4109/1688 2726/4110/1688 2725/4111/1688 2720/4112/1688 +f 2720/4094/1689 2725/4113/1689 2724/3089/1689 2719/3088/1689 +f 3647/4114/1687 3227/4115/1687 3234/4116/1687 3658/4117/1687 +f 2729/4118/1690 2723/4119/1690 2722/4120/1690 2728/4121/1690 +f 2728/4122/1691 2722/4103/1691 3983/4104/1691 3984/4123/1691 +f 3231/4124/1641 3664/4125/1641 3677/4126/1641 3236/4127/1641 +f 2726/4128/1692 2733/4129/1692 2732/4130/1692 2725/4131/1692 +f 2725/4113/1693 2732/4132/1693 2730/3090/1693 2724/3089/1693 +f 3659/4133/1641 3233/4134/1641 3240/4135/1641 3670/4136/1641 +f 2736/4137/1694 2729/4138/1694 2728/4139/1694 2735/4140/1694 +f 2735/4141/1695 2728/4122/1695 3984/4123/1695 3985/4142/1695 +f 3237/4143/1642 3676/4144/1642 3689/4145/1642 3242/4146/1642 +f 2733/4147/1696 2740/4148/1696 2739/4149/1696 2732/4150/1696 +f 2732/4132/1697 2739/4151/1697 2737/3091/1697 2730/3090/1697 +f 3671/4152/1642 3239/4153/1642 3246/4154/1642 3682/4155/1642 +f 2743/4156/1698 2736/4157/1698 2735/4158/1698 2742/4159/1698 +f 2742/4160/1699 2735/4141/1699 3985/4142/1699 3986/4161/1699 +f 3243/4162/1643 3688/4163/1643 3701/4164/1643 3248/4165/1643 +f 2740/4166/1700 2747/4167/1700 2746/4168/1700 2739/4169/1700 +f 2739/4151/1701 2746/4170/1701 2744/3092/1701 2737/3091/1701 +f 3683/4171/1643 3245/4172/1643 3252/4173/1643 3694/4174/1643 +f 2750/4175/1702 2743/4176/1702 2742/4177/1702 2749/4178/1702 +f 2749/4179/1703 2742/4160/1703 3986/4161/1703 3987/4180/1703 +f 3249/4181/1644 3700/4182/1644 3713/4183/1644 3254/4184/1644 +f 2747/4185/1704 2754/4186/1704 2753/4187/1704 2746/4188/1704 +f 2746/4170/1705 2753/4189/1705 2751/3093/1705 2744/3092/1705 +f 3695/4190/1644 3251/4191/1644 3258/4192/1644 3706/4193/1644 +f 2757/4194/1706 2750/4195/1706 2749/4196/1706 2756/4197/1706 +f 2756/4198/1707 2749/4179/1707 3987/4180/1707 3988/4199/1707 +f 3255/4200/1645 3712/4201/1645 3725/4202/1645 3260/4203/1645 +f 2754/4204/1708 2761/4205/1708 2760/4206/1708 2753/4207/1708 +f 2753/4189/1709 2760/4208/1709 2758/3094/1709 2751/3093/1709 +f 3707/4209/1645 3257/4210/1645 3264/4211/1645 3718/4212/1645 +f 2764/4213/1710 2757/4214/1710 2756/4215/1710 2763/4216/1710 +f 2763/4217/1711 2756/4198/1711 3988/4199/1711 3989/4218/1711 +f 3261/4219/1646 3724/4220/1646 3737/4221/1646 3266/4222/1646 +f 2761/4223/1712 2768/4224/1712 2767/4225/1712 2760/4226/1712 +f 2760/4208/1713 2767/4227/1713 2765/3095/1713 2758/3094/1713 +f 3719/4228/1646 3263/4229/1646 3270/4230/1646 3730/4231/1646 +f 2771/4232/1714 2764/4233/1714 2763/4234/1714 2770/4235/1714 +f 2770/4236/1715 2763/4217/1715 3989/4218/1715 3990/4237/1715 +f 3267/4238/1647 3736/4239/1647 3749/4240/1647 3272/4241/1647 +f 2768/4242/1716 2775/4243/1716 2774/4244/1716 2767/4245/1716 +f 2767/4227/1717 2774/4246/1717 2772/3096/1717 2765/3095/1717 +f 3731/4247/1647 3269/4248/1647 3276/4249/1647 3742/4250/1647 +f 2778/4251/1718 2771/4252/1718 2770/4253/1718 2777/4254/1718 +f 2777/4255/1719 2770/4236/1719 3990/4237/1719 3991/4256/1719 +f 3273/4257/1648 3748/4258/1648 3761/4259/1648 3278/4260/1648 +f 2775/4261/1720 2782/4262/1720 2781/4263/1720 2774/4264/1720 +f 2774/4246/1721 2781/4265/1721 2779/3097/1721 2772/3096/1721 +f 3743/4266/1648 3275/4267/1648 3282/4268/1648 3754/4269/1648 +f 2785/4270/1722 2778/4271/1722 2777/4272/1722 2784/4273/1722 +f 2784/4274/1723 2777/4255/1723 3991/4256/1723 3992/4275/1723 +f 3279/4276/1649 3760/4277/1649 3773/4278/1649 3284/4279/1649 +f 2782/4280/1724 2789/4281/1724 2788/4282/1724 2781/4283/1724 +f 2781/4265/1725 2788/4284/1725 2786/3098/1725 2779/3097/1725 +f 3755/4285/1649 3281/4286/1649 3288/4287/1649 3766/4288/1649 +f 2792/4289/1726 2785/4290/1726 2784/4291/1726 2791/4292/1726 +f 2791/4293/1727 2784/4274/1727 3992/4275/1727 3993/4294/1727 +f 3285/4295/1650 3772/4296/1650 3785/4297/1650 3290/4298/1650 +f 2789/4299/1728 2796/4300/1728 2795/4301/1728 2788/4302/1728 +f 2788/4284/1729 2795/4303/1729 2793/3099/1729 2786/3098/1729 +f 3767/4304/1650 3287/4305/1650 3294/4306/1650 3778/4307/1650 +f 2799/4308/1730 2792/4309/1730 2791/4310/1730 2798/4311/1730 +f 2798/4312/1731 2791/4293/1731 3993/4294/1731 3994/4313/1731 +f 3291/4314/1651 3784/4315/1651 3797/4316/1651 3296/4317/1651 +f 2796/4318/1732 2803/4319/1732 2802/4320/1732 2795/4321/1732 +f 2795/4303/1733 2802/4322/1733 2800/3100/1733 2793/3099/1733 +f 3779/4323/1651 3293/4324/1651 3300/4325/1651 3790/4326/1651 +f 2806/4327/1734 2799/4328/1734 2798/4329/1734 2805/4330/1734 +f 2805/4331/1735 2798/4312/1735 3994/4313/1735 3995/4332/1735 +f 3297/4333/1652 3796/4334/1652 3809/4335/1652 3302/4336/1652 +f 2803/4337/1736 2810/4338/1736 2809/4339/1736 2802/4340/1736 +f 2802/4322/1737 2809/4341/1737 2807/3101/1737 2800/3100/1737 +f 3791/4342/1652 3299/4343/1652 3306/4344/1652 3802/4345/1652 +f 2813/4346/1738 2806/4347/1738 2805/4348/1738 2812/4349/1738 +f 2812/4350/1739 2805/4331/1739 3995/4332/1739 3996/4351/1739 +f 3303/4352/1653 3808/4353/1653 3821/4354/1653 3308/4355/1653 +f 2810/4356/1740 2817/4357/1740 2816/4358/1740 2809/4359/1740 +f 2809/4341/1741 2816/4360/1741 2814/3102/1741 2807/3101/1741 +f 3803/4361/1653 3305/4362/1653 3312/4363/1653 3814/4364/1653 +f 2820/4365/1742 2813/4366/1742 2812/4367/1742 2819/4368/1742 +f 2819/4369/1743 2812/4350/1743 3996/4351/1743 3997/4370/1743 +f 3309/4371/1654 3820/4372/1654 3833/4373/1654 3314/4374/1654 +f 2817/4375/1744 2824/4376/1744 2823/4377/1744 2816/4378/1744 +f 2816/4360/1745 2823/4379/1745 2821/3103/1745 2814/3102/1745 +f 3815/4380/1654 3311/4381/1654 3318/4382/1654 3826/4383/1654 +f 2827/4384/1746 2820/4385/1746 2819/4386/1746 2826/4387/1746 +f 2826/4388/1747 2819/4369/1747 3997/4370/1747 3998/4389/1747 +f 3315/4390/1655 3832/4391/1655 3845/4392/1655 3320/4393/1655 +f 2824/4394/1748 2831/4395/1748 2830/4396/1748 2823/4397/1748 +f 2823/4379/1749 2830/4398/1749 2828/3104/1749 2821/3103/1749 +f 3827/4399/1655 3317/4400/1655 3324/4401/1655 3838/4402/1655 +f 2834/4403/1750 2827/4404/1750 2826/4405/1750 2833/4406/1750 +f 2833/4407/1751 2826/4388/1751 3998/4389/1751 3999/4408/1751 +f 3321/4409/1656 3844/4410/1656 3857/4411/1656 3326/4412/1656 +f 2831/4413/1752 2838/4414/1752 2837/4415/1752 2830/4416/1752 +f 2830/4398/1753 2837/4417/1753 2835/3105/1753 2828/3104/1753 +f 3839/4418/1656 3323/4419/1656 3330/4420/1656 3850/4421/1656 +f 2841/4422/1754 2834/4423/1754 2833/4424/1754 2840/4425/1754 +f 2840/4426/1755 2833/4407/1755 3999/4408/1755 4000/4427/1755 +f 3327/4428/1657 3856/4429/1657 3869/4430/1657 3332/4431/1657 +f 2838/4432/1756 2845/4433/1756 2844/4434/1756 2837/4435/1756 +f 2837/4417/1757 2844/4436/1757 2842/3106/1757 2835/3105/1757 +f 3851/4437/1657 3329/4438/1657 3336/4439/1657 3862/4440/1657 +f 2848/4441/1758 2841/4442/1758 2840/4443/1758 2847/4444/1758 +f 2847/4445/1759 2840/4426/1759 4000/4427/1759 4001/4446/1759 +f 3333/4447/1658 3868/4448/1658 3881/4449/1658 3338/4450/1658 +f 2845/4451/1760 2852/4452/1760 2851/4453/1760 2844/4454/1760 +f 2844/4436/1761 2851/4455/1761 2849/3107/1761 2842/3106/1761 +f 3863/4456/1658 3335/4457/1658 3342/4458/1658 3874/4459/1658 +f 2855/4460/1762 2848/4461/1762 2847/4462/1762 2854/4463/1762 +f 2854/4464/1763 2847/4445/1763 4001/4446/1763 4002/4465/1763 +f 3339/4466/1659 3880/4467/1659 3893/4468/1659 3344/4469/1659 +f 2852/4470/1764 2859/4471/1764 2858/4472/1764 2851/4473/1764 +f 2851/4455/1765 2858/4474/1765 2856/3108/1765 2849/3107/1765 +f 3875/4475/1659 3341/4476/1659 3348/4477/1659 3886/4478/1659 +f 2862/4479/1766 2855/4480/1766 2854/4481/1766 2861/4482/1766 +f 2861/4483/1767 2854/4464/1767 4002/4465/1767 4003/4484/1767 +f 3345/4485/1660 3892/4486/1660 3905/4487/1660 3350/4488/1660 +f 2859/4489/1768 2866/4490/1768 2865/4491/1768 2858/4492/1768 +f 2858/4474/1769 2865/4493/1769 2863/3109/1769 2856/3108/1769 +f 3887/4494/1660 3347/4495/1660 3354/4496/1660 3898/4497/1660 +f 2869/4498/1770 2862/4499/1770 2861/4500/1770 2868/4501/1770 +f 2868/4502/1771 2861/4483/1771 4003/4484/1771 4004/4503/1771 +f 3351/4504/1661 3904/4505/1661 3917/4506/1661 3356/4507/1661 +f 2866/4508/1772 2873/4509/1772 2872/4510/1772 2865/4511/1772 +f 2865/4493/1773 2872/4512/1773 2870/3110/1773 2863/3109/1773 +f 3899/4513/1661 3353/4514/1661 3360/4515/1661 3910/4516/1661 +f 2876/4517/1774 2869/4518/1774 2868/4519/1774 2875/4520/1774 +f 2875/4521/1775 2868/4502/1775 4004/4503/1775 4005/4522/1775 +f 3357/4523/1662 3916/4524/1662 3929/4525/1662 3362/4526/1662 +f 2873/4527/1776 2880/4528/1776 2879/4529/1776 2872/4530/1776 +f 2872/4512/1777 2879/4531/1777 2877/3111/1777 2870/3110/1777 +f 3911/4532/1662 3359/4533/1662 3366/4534/1662 3922/4535/1662 +f 2883/4536/1778 2876/4537/1778 2875/4538/1778 2882/4539/1778 +f 2882/4540/1779 2875/4521/1779 4005/4522/1779 4006/4541/1779 +f 3363/4542/1663 3928/4543/1663 3941/4544/1663 3368/4545/1663 +f 2880/4546/1780 2887/4547/1780 2886/4548/1780 2879/4549/1780 +f 2879/4531/1781 2886/4550/1781 2884/3112/1781 2877/3111/1781 +f 3923/4551/1663 3365/4552/1663 3372/4553/1663 3934/4554/1663 +f 2890/4555/1782 2883/4556/1782 2882/4557/1782 2889/4558/1782 +f 2889/4559/1783 2882/4540/1783 4006/4541/1783 4007/4560/1783 +f 3369/4561/1664 3940/4562/1664 3953/4563/1664 3374/4564/1664 +f 2887/4565/1784 2894/4566/1784 2893/4567/1784 2886/4568/1784 +f 2886/4550/1785 2893/4569/1785 2891/3113/1785 2884/3112/1785 +f 3935/4570/1664 3371/4571/1664 3378/4572/1664 3946/4573/1664 +f 2897/4574/1786 2890/4575/1786 2889/4576/1786 2896/4577/1786 +f 2896/4578/1787 2889/4559/1787 4007/4560/1787 4008/4579/1787 +f 3375/4580/1665 3952/4581/1665 3965/4582/1665 3380/4583/1665 +f 2894/4584/1788 2901/4585/1788 2900/4586/1788 2893/4587/1788 +f 2893/4569/1789 2900/4588/1789 2898/3114/1789 2891/3113/1789 +f 3947/4589/1665 3377/4590/1665 3384/4591/1665 3958/4592/1665 +f 2904/4593/1790 2897/4594/1790 2896/4595/1790 2903/4596/1790 +f 2903/4597/1791 2896/4578/1791 4008/4579/1791 4009/4598/1791 +f 3381/4599/1792 3964/4600/1792 3611/4601/1792 3386/4602/1792 +f 2901/4603/1793 2908/4604/1793 2907/4605/1793 2900/4606/1793 +f 2900/4588/1794 2907/4607/1794 2905/3115/1794 2898/3114/1794 +f 3959/4608/1792 3383/4609/1792 3390/4610/1792 3616/4611/1792 +f 2911/4612/1795 2904/4613/1795 2903/4614/1795 2910/4615/1795 +f 2910/4616/1796 2903/4597/1796 4009/4598/1796 4010/4617/1796 +f 3202/4618/1797 3201/4619/1797 3206/4620/1797 3208/4621/1797 2706/4041/1797 2701/4040/1797 +f 2908/4622/1798 2701/4623/1798 2700/4624/1798 2907/4625/1798 +f 2907/4607/1799 2700/4044/1799 2699/3084/1799 2905/3115/1799 +f 3617/4626/1669 3389/4048/1669 3204/4047/1669 3594/4627/1669 +f 2703/4051/1800 2911/4050/1800 2910/4628/1800 2702/4629/1800 +f 2702/4057/1801 2910/4616/1801 4010/4617/1801 3979/4058/1801 +f 3591/4630/1802 3592/4631/1802 3599/4632/1802 3600/4633/1802 +f 3595/4634/1802 3203/4635/1802 3210/4636/1802 3596/4637/1802 +f 3211/4638/1803 3210/4636/1803 3203/4635/1803 3205/4639/1803 2703/4053/1803 2708/4052/1803 +f 3391/4640/1804 3390/4610/1804 3383/4609/1804 3385/4641/1804 2904/4613/1804 2911/4612/1804 +f 3217/4642/1805 3216/4067/1805 3209/4066/1805 3211/4643/1805 2708/4070/1805 2713/4069/1805 +f 3967/4644/1792 3960/4645/1792 3615/4646/1792 3608/4647/1792 +f 3963/4648/1792 3956/4649/1792 3619/4650/1792 3612/4651/1792 +f 3625/4652/1638 3622/4653/1638 3633/4654/1638 3638/4655/1638 +f 3450/4656/1806 3392/4657/1806 3641/4076/1806 3630/4075/1806 +f 3574/4658/1807 3582/4659/1807 3593/4660/1807 3618/4661/1807 +f 3385/4662/1808 3384/4591/1808 3377/4590/1808 3379/4663/1808 2897/4594/1808 2904/4593/1808 +f 3676/4144/1809 3237/4143/1809 3199/4664/1809 3197/4665/1809 +f 3382/4666/1810 3381/4599/1810 3386/4602/1810 3388/4667/1810 2908/4604/1810 2901/4603/1810 +f 3379/4668/1811 3378/4572/1811 3371/4571/1811 3373/4669/1811 2890/4575/1811 2897/4574/1811 +f 3951/4670/1665 3944/4671/1665 3957/4672/1665 3962/4673/1665 +f 3376/4674/1812 3375/4580/1812 3380/4583/1812 3382/4675/1812 2901/4585/1812 2894/4584/1812 +f 3373/4676/1813 3372/4553/1813 3365/4552/1813 3367/4677/1813 2883/4556/1813 2890/4555/1813 +f 3939/4678/1664 3932/4679/1664 3945/4680/1664 3950/4681/1664 +f 3370/4682/1814 3369/4561/1814 3374/4564/1814 3376/4683/1814 2894/4566/1814 2887/4565/1814 +f 3367/4684/1815 3366/4534/1815 3359/4533/1815 3361/4685/1815 2876/4537/1815 2883/4536/1815 +f 3927/4686/1663 3920/4687/1663 3933/4688/1663 3938/4689/1663 +f 3364/4690/1816 3363/4542/1816 3368/4545/1816 3370/4691/1816 2887/4547/1816 2880/4546/1816 +f 3361/4692/1817 3360/4515/1817 3353/4514/1817 3355/4693/1817 2869/4518/1817 2876/4517/1817 +f 3915/4694/1662 3908/4695/1662 3921/4696/1662 3926/4697/1662 +f 3358/4698/1818 3357/4523/1818 3362/4526/1818 3364/4699/1818 2880/4528/1818 2873/4527/1818 +f 3355/4700/1819 3354/4496/1819 3347/4495/1819 3349/4701/1819 2862/4499/1819 2869/4498/1819 +f 3903/4702/1661 3896/4703/1661 3909/4704/1661 3914/4705/1661 +f 3352/4706/1820 3351/4504/1820 3356/4507/1820 3358/4707/1820 2873/4509/1820 2866/4508/1820 +f 3349/4708/1821 3348/4477/1821 3341/4476/1821 3343/4709/1821 2855/4480/1821 2862/4479/1821 +f 3891/4710/1660 3884/4711/1660 3897/4712/1660 3902/4713/1660 +f 3346/4714/1822 3345/4485/1822 3350/4488/1822 3352/4715/1822 2866/4490/1822 2859/4489/1822 +f 3343/4716/1823 3342/4458/1823 3335/4457/1823 3337/4717/1823 2848/4461/1823 2855/4460/1823 +f 3879/4718/1659 3872/4719/1659 3885/4720/1659 3890/4721/1659 +f 3340/4722/1824 3339/4466/1824 3344/4469/1824 3346/4723/1824 2859/4471/1824 2852/4470/1824 +f 3337/4724/1825 3336/4439/1825 3329/4438/1825 3331/4725/1825 2841/4442/1825 2848/4441/1825 +f 3867/4726/1658 3860/4727/1658 3873/4728/1658 3878/4729/1658 +f 3334/4730/1826 3333/4447/1826 3338/4450/1826 3340/4731/1826 2852/4452/1826 2845/4451/1826 +f 3331/4732/1827 3330/4420/1827 3323/4419/1827 3325/4733/1827 2834/4423/1827 2841/4422/1827 +f 3855/4734/1657 3848/4735/1657 3861/4736/1657 3866/4737/1657 +f 3328/4738/1828 3327/4428/1828 3332/4431/1828 3334/4739/1828 2845/4433/1828 2838/4432/1828 +f 3325/4740/1829 3324/4401/1829 3317/4400/1829 3319/4741/1829 2827/4404/1829 2834/4403/1829 +f 3843/4742/1656 3836/4743/1656 3849/4744/1656 3854/4745/1656 +f 3322/4746/1830 3321/4409/1830 3326/4412/1830 3328/4747/1830 2838/4414/1830 2831/4413/1830 +f 3319/4748/1831 3318/4382/1831 3311/4381/1831 3313/4749/1831 2820/4385/1831 2827/4384/1831 +f 3831/4750/1655 3824/4751/1655 3837/4752/1655 3842/4753/1655 +f 3316/4754/1832 3315/4390/1832 3320/4393/1832 3322/4755/1832 2831/4395/1832 2824/4394/1832 +f 3313/4756/1833 3312/4363/1833 3305/4362/1833 3307/4757/1833 2813/4366/1833 2820/4365/1833 +f 3819/4758/1654 3812/4759/1654 3825/4760/1654 3830/4761/1654 +f 3310/4762/1834 3309/4371/1834 3314/4374/1834 3316/4763/1834 2824/4376/1834 2817/4375/1834 +f 3307/4764/1835 3306/4344/1835 3299/4343/1835 3301/4765/1835 2806/4347/1835 2813/4346/1835 +f 3807/4766/1653 3800/4767/1653 3813/4768/1653 3818/4769/1653 +f 3304/4770/1836 3303/4352/1836 3308/4355/1836 3310/4771/1836 2817/4357/1836 2810/4356/1836 +f 3301/4772/1837 3300/4325/1837 3293/4324/1837 3295/4773/1837 2799/4328/1837 2806/4327/1837 +f 3795/4774/1652 3788/4775/1652 3801/4776/1652 3806/4777/1652 +f 3298/4778/1838 3297/4333/1838 3302/4336/1838 3304/4779/1838 2810/4338/1838 2803/4337/1838 +f 3295/4780/1839 3294/4306/1839 3287/4305/1839 3289/4781/1839 2792/4309/1839 2799/4308/1839 +f 3783/4782/1651 3776/4783/1651 3789/4784/1651 3794/4785/1651 +f 3292/4786/1840 3291/4314/1840 3296/4317/1840 3298/4787/1840 2803/4319/1840 2796/4318/1840 +f 3289/4788/1841 3288/4287/1841 3281/4286/1841 3283/4789/1841 2785/4290/1841 2792/4289/1841 +f 3771/4790/1650 3764/4791/1650 3777/4792/1650 3782/4793/1650 +f 3286/4794/1842 3285/4295/1842 3290/4298/1842 3292/4795/1842 2796/4300/1842 2789/4299/1842 +f 3283/4796/1843 3282/4268/1843 3275/4267/1843 3277/4797/1843 2778/4271/1843 2785/4270/1843 +f 3759/4798/1649 3752/4799/1649 3765/4800/1649 3770/4801/1649 +f 3280/4802/1844 3279/4276/1844 3284/4279/1844 3286/4803/1844 2789/4281/1844 2782/4280/1844 +f 3277/4804/1845 3276/4249/1845 3269/4248/1845 3271/4805/1845 2771/4252/1845 2778/4251/1845 +f 3747/4806/1648 3740/4807/1648 3753/4808/1648 3758/4809/1648 +f 3274/4810/1846 3273/4257/1846 3278/4260/1846 3280/4811/1846 2782/4262/1846 2775/4261/1846 +f 3271/4812/1847 3270/4230/1847 3263/4229/1847 3265/4813/1847 2764/4233/1847 2771/4232/1847 +f 3735/4814/1647 3728/4815/1647 3741/4816/1647 3746/4817/1647 +f 3268/4818/1848 3267/4238/1848 3272/4241/1848 3274/4819/1848 2775/4243/1848 2768/4242/1848 +f 3265/4820/1849 3264/4211/1849 3257/4210/1849 3259/4821/1849 2757/4214/1849 2764/4213/1849 +f 3723/4822/1646 3716/4823/1646 3729/4824/1646 3734/4825/1646 +f 3262/4826/1850 3261/4219/1850 3266/4222/1850 3268/4827/1850 2768/4224/1850 2761/4223/1850 +f 3259/4828/1851 3258/4192/1851 3251/4191/1851 3253/4829/1851 2750/4195/1851 2757/4194/1851 +f 3711/4830/1645 3704/4831/1645 3717/4832/1645 3722/4833/1645 +f 3256/4834/1852 3255/4200/1852 3260/4203/1852 3262/4835/1852 2761/4205/1852 2754/4204/1852 +f 3253/4836/1853 3252/4173/1853 3245/4172/1853 3247/4837/1853 2743/4176/1853 2750/4175/1853 +f 3699/4838/1644 3692/4839/1644 3705/4840/1644 3710/4841/1644 +f 3250/4842/1854 3249/4181/1854 3254/4184/1854 3256/4843/1854 2754/4186/1854 2747/4185/1854 +f 3247/4844/1855 3246/4154/1855 3239/4153/1855 3241/4845/1855 2736/4157/1855 2743/4156/1855 +f 3687/4846/1643 3680/4847/1643 3693/4848/1643 3698/4849/1643 +f 3244/4850/1856 3243/4162/1856 3248/4165/1856 3250/4851/1856 2747/4167/1856 2740/4166/1856 +f 3241/4852/1857 3240/4135/1857 3233/4134/1857 3235/4853/1857 2729/4138/1857 2736/4137/1857 +f 3675/4854/1642 3668/4855/1642 3681/4856/1642 3686/4857/1642 +f 3238/4858/1858 3237/4143/1858 3242/4146/1858 3244/4859/1858 2740/4148/1858 2733/4147/1858 +f 3235/4860/1859 3234/4116/1859 3227/4115/1859 3229/4861/1859 2723/4119/1859 2729/4118/1859 +f 3663/4862/1641 3656/4863/1641 3669/4864/1641 3674/4865/1641 +f 3232/4866/1860 3231/4124/1860 3236/4127/1860 3238/4867/1860 2733/4129/1860 2726/4128/1860 +f 3229/4868/1861 3228/4097/1861 3221/4096/1861 3223/4869/1861 2718/4100/1861 2723/4099/1861 +f 3651/4870/1687 3644/4871/1687 3657/4872/1687 3662/4873/1687 +f 3226/4874/1862 3225/4105/1862 3230/4108/1862 3232/4875/1862 2726/4110/1862 2721/4109/1862 +f 3223/4876/1863 3222/4082/1863 3215/4081/1863 3217/4877/1863 2713/4085/1863 2718/4084/1863 +f 3639/4878/1639 3632/4879/1639 3645/4880/1639 3650/4881/1639 +f 3609/4882/1669 3614/4883/1669 3589/4884/1669 3586/4885/1669 +f 3601/4886/1667 3598/4887/1667 3623/4888/1667 3624/4889/1667 +f 3613/4890/1669 3618/4661/1669 3593/4660/1669 3590/4891/1669 +f 3639/4878/1864 3650/4881/1864 3458/4892/1864 3457/4893/1864 +f 3621/4080/1865 3634/4083/1865 3520/4894/1865 3578/4895/1865 +f 3587/4896/1802 3588/4897/1802 3603/4898/1802 3604/4899/1802 +f 3587/4896/1866 3604/4899/1866 3453/4900/1866 3455/4901/1866 +f 3591/4630/1867 3600/4633/1867 3517/4902/1867 3519/4903/1867 +f 3595/4634/1868 3596/4637/1868 3581/4904/1868 3583/4905/1868 +f 3605/4026/1869 3628/4029/1869 3451/4906/1869 3452/4907/1869 +f 3510/4908/1870 3518/4909/1870 3589/4884/1870 3614/4883/1870 +f 3597/4065/1871 3620/4068/1871 3579/4910/1871 3580/4911/1871 +f 3955/4016/1872 3966/4019/1872 3448/4912/1872 3445/4913/1872 +f 3613/4890/1873 3590/4891/1873 3518/4909/1873 3510/4908/1873 +f 3947/4589/1874 3958/4592/1874 3576/4914/1874 3573/4915/1874 +f 3445/4913/1875 3448/4912/1875 3965/4582/1875 3952/4581/1875 +f 3939/4678/1876 3950/4681/1876 3508/4916/1876 3507/4917/1876 +f 3573/4915/1877 3576/4914/1877 3957/4672/1877 3944/4671/1877 +f 3931/4008/1878 3942/4011/1878 3442/4918/1878 3441/4919/1878 +f 3507/4917/1879 3508/4916/1879 3949/4014/1879 3936/4013/1879 +f 3935/4570/1880 3946/4573/1880 3572/4920/1880 3571/4921/1880 +f 3441/4919/1881 3442/4918/1881 3941/4544/1881 3928/4543/1881 +f 3927/4686/1882 3938/4689/1882 3506/4922/1882 3505/4923/1882 +f 3911/4532/1883 3922/4535/1883 3568/4924/1883 3567/4925/1883 +f 3919/4004/1884 3930/4007/1884 3440/4926/1884 3439/4927/1884 +f 3903/4702/1885 3914/4705/1885 3502/4928/1885 3501/4929/1885 +f 3567/4925/1886 3568/4924/1886 3921/4696/1886 3908/4695/1886 +f 3895/3996/1887 3906/3999/1887 3436/4930/1887 3435/4931/1887 +f 3501/4929/1888 3502/4928/1888 3913/4002/1888 3900/4001/1888 +f 3887/4494/1889 3898/4497/1889 3564/4932/1889 3563/4933/1889 +f 3435/4931/1890 3436/4930/1890 3905/4487/1890 3892/4486/1890 +f 3879/4718/1891 3890/4721/1891 3498/4934/1891 3497/4935/1891 +f 3563/4933/1892 3564/4932/1892 3897/4712/1892 3884/4711/1892 +f 3871/3988/1893 3882/3991/1893 3432/4936/1893 3431/4937/1893 +f 3497/4935/1894 3498/4934/1894 3889/3994/1894 3876/3993/1894 +f 3863/4456/1895 3874/4459/1895 3560/4938/1895 3559/4939/1895 +f 3431/4937/1896 3432/4936/1896 3881/4449/1896 3868/4448/1896 +f 3855/4734/1897 3866/4737/1897 3494/4940/1897 3493/4941/1897 +f 3559/4939/1898 3560/4938/1898 3873/4728/1898 3860/4727/1898 +f 3847/3980/1899 3858/3983/1899 3428/4942/1899 3427/4943/1899 +f 3493/4941/1900 3494/4940/1900 3865/3986/1900 3852/3985/1900 +f 3851/4437/1901 3862/4440/1901 3558/4944/1901 3557/4945/1901 +f 3427/4943/1902 3428/4942/1902 3857/4411/1902 3844/4410/1902 +f 3843/4742/1903 3854/4745/1903 3492/4946/1903 3491/4947/1903 +f 3827/4399/1904 3838/4402/1904 3554/4948/1904 3553/4949/1904 +f 3835/3976/1905 3846/3979/1905 3426/4950/1905 3425/4951/1905 +f 3819/4758/1906 3830/4761/1906 3488/4952/1906 3487/4953/1906 +f 3553/4949/1907 3554/4948/1907 3837/4752/1907 3824/4751/1907 +f 3811/3968/1908 3822/3971/1908 3422/4954/1908 3421/4955/1908 +f 3487/4953/1909 3488/4952/1909 3829/3974/1909 3816/3973/1909 +f 3803/4361/1910 3814/4364/1910 3550/4956/1910 3549/4957/1910 +f 3421/4955/1911 3422/4954/1911 3821/4354/1911 3808/4353/1911 +f 3795/4774/1912 3806/4777/1912 3484/4958/1912 3483/4959/1912 +f 3549/4957/1913 3550/4956/1913 3813/4768/1913 3800/4767/1913 +f 3787/3960/1914 3798/3963/1914 3418/4960/1914 3417/4961/1914 +f 3483/4959/1915 3484/4958/1915 3805/3966/1915 3792/3965/1915 +f 3779/4323/1916 3790/4326/1916 3546/4962/1916 3545/4963/1916 +f 3417/4961/1917 3418/4960/1917 3797/4316/1917 3784/4315/1917 +f 3771/4790/1918 3782/4793/1918 3480/4964/1918 3479/4965/1918 +f 3545/4963/1919 3546/4962/1919 3789/4784/1919 3776/4783/1919 +f 3763/3952/1920 3774/3955/1920 3414/4966/1920 3413/4967/1920 +f 3479/4965/1921 3480/4964/1921 3781/3958/1921 3768/3957/1921 +f 3767/4304/1922 3778/4307/1922 3544/4968/1922 3543/4969/1922 +f 3413/4967/1923 3414/4966/1923 3773/4278/1923 3760/4277/1923 +f 3759/4798/1924 3770/4801/1924 3478/4970/1924 3477/4971/1924 +f 3743/4266/1925 3754/4269/1925 3540/4972/1925 3539/4973/1925 +f 3751/3948/1926 3762/3951/1926 3412/4974/1926 3411/4975/1926 +f 3735/4814/1927 3746/4817/1927 3474/4976/1927 3473/4977/1927 +f 3539/4973/1928 3540/4972/1928 3753/4808/1928 3740/4807/1928 +f 3727/3940/1929 3738/3943/1929 3408/4978/1929 3407/4979/1929 +f 3473/4977/1930 3474/4976/1930 3745/3946/1930 3732/3945/1930 +f 3719/4228/1931 3730/4231/1931 3536/4980/1931 3535/4981/1931 +f 3407/4979/1932 3408/4978/1932 3737/4221/1932 3724/4220/1932 +f 3711/4830/1933 3722/4833/1933 3470/4982/1933 3469/4983/1933 +f 3535/4981/1934 3536/4980/1934 3729/4824/1934 3716/4823/1934 +f 3703/3932/1935 3714/3935/1935 3404/4984/1935 3403/4985/1935 +f 3469/4983/1936 3470/4982/1936 3721/3938/1936 3708/3937/1936 +f 3695/4190/1937 3706/4193/1937 3532/4986/1937 3531/4987/1937 +f 3403/4985/1938 3404/4984/1938 3713/4183/1938 3700/4182/1938 +f 3687/4846/1939 3698/4849/1939 3466/4988/1939 3465/4989/1939 +f 3531/4987/1940 3532/4986/1940 3705/4840/1940 3692/4839/1940 +f 3679/3924/1941 3690/3927/1941 3400/4990/1941 3399/4991/1941 +f 3465/4989/1942 3466/4988/1942 3697/3930/1942 3684/3929/1942 +f 3683/4171/1943 3694/4174/1943 3530/4992/1943 3529/4993/1943 +f 3399/4991/1944 3400/4990/1944 3689/4145/1944 3676/4144/1944 +f 3675/4854/1945 3686/4857/1945 3464/4994/1945 3463/4995/1945 +f 3659/4133/1946 3670/4136/1946 3526/4996/1946 3525/4997/1946 +f 3667/3920/1947 3678/3923/1947 3398/4998/1947 3397/4999/1947 +f 3651/4870/1948 3662/4873/1948 3460/5000/1948 3459/5001/1948 +f 3525/4997/1949 3526/4996/1949 3669/4864/1949 3656/4863/1949 +f 3643/3912/1950 3654/3915/1950 3394/5002/1950 3393/5003/1950 +f 3514/5004/1951 3456/5005/1951 3637/3910/1951 3626/3909/1951 +f 3635/4095/1952 3646/4098/1952 3522/5006/1952 3521/5007/1952 +f 3629/3908/1953 3642/3911/1953 3392/4657/1953 3450/4656/1953 +f 3625/4652/1954 3638/4655/1954 3456/5005/1954 3514/5004/1954 +f 3521/5007/1955 3522/5006/1955 3645/4880/1955 3632/4879/1955 +f 3449/5008/1956 3447/5009/1956 3611/4601/1956 3964/4600/1956 +f 3601/4886/1957 3624/4889/1957 3515/5010/1957 3516/5011/1957 +f 3577/5012/1958 3575/5013/1958 3619/4650/1958 3956/4649/1958 +f 3201/4619/1802 3584/5014/1802 3607/5015/1802 3206/4620/1802 +f 3578/4895/1959 3520/4894/1959 3633/4654/1959 3622/4653/1959 +f 3647/4114/1960 3658/4117/1960 3524/5016/1960 3523/5017/1960 +f 3523/5017/1961 3524/5016/1961 3657/4872/1961 3644/4871/1961 +f 3671/4152/1962 3682/4155/1962 3528/5018/1962 3527/5019/1962 +f 3527/5019/1963 3528/5018/1963 3681/4856/1963 3668/4855/1963 +f 3529/4993/1964 3530/4992/1964 3693/4848/1964 3680/4847/1964 +f 3707/4209/1965 3718/4212/1965 3534/5020/1965 3533/5021/1965 +f 3533/5021/1966 3534/5020/1966 3717/4832/1966 3704/4831/1966 +f 3731/4247/1967 3742/4250/1967 3538/5022/1967 3537/5023/1967 +f 3537/5023/1968 3538/5022/1968 3741/4816/1968 3728/4815/1968 +f 3755/4285/1969 3766/4288/1969 3542/5024/1969 3541/5025/1969 +f 3541/5025/1970 3542/5024/1970 3765/4800/1970 3752/4799/1970 +f 3543/4969/1971 3544/4968/1971 3777/4792/1971 3764/4791/1971 +f 3791/4342/1972 3802/4345/1972 3548/5026/1972 3547/5027/1972 +f 3547/5027/1973 3548/5026/1973 3801/4776/1973 3788/4775/1973 +f 3815/4380/1974 3826/4383/1974 3552/5028/1974 3551/5029/1974 +f 3551/5029/1975 3552/5028/1975 3825/4760/1975 3812/4759/1975 +f 3839/4418/1976 3850/4421/1976 3556/5030/1976 3555/5031/1976 +f 3555/5031/1977 3556/5030/1977 3849/4744/1977 3836/4743/1977 +f 3557/4945/1978 3558/4944/1978 3861/4736/1978 3848/4735/1978 +f 3875/4475/1979 3886/4478/1979 3562/5032/1979 3561/5033/1979 +f 3561/5033/1980 3562/5032/1980 3885/4720/1980 3872/4719/1980 +f 3899/4513/1981 3910/4516/1981 3566/5034/1981 3565/5035/1981 +f 3565/5035/1982 3566/5034/1982 3909/4704/1982 3896/4703/1982 +f 3923/4551/1983 3934/4554/1983 3570/5036/1983 3569/5037/1983 +f 3569/5037/1984 3570/5036/1984 3933/4688/1984 3920/4687/1984 +f 3571/4921/1985 3572/4920/1985 3945/4680/1985 3932/4679/1985 +f 3959/4608/1986 3616/4611/1986 3575/5013/1986 3577/5012/1986 +f 3617/4626/1987 3594/4627/1987 3582/4659/1987 3574/4658/1987 +f 3580/4911/1988 3579/4910/1988 3623/4888/1988 3598/4887/1988 +f 3583/4905/1989 3581/4904/1989 3599/4632/1989 3592/4631/1989 +f 3963/4648/1990 3612/4651/1990 3511/5038/1990 3513/5039/1990 +f 3459/5001/1991 3460/5000/1991 3661/3918/1991 3648/3917/1991 +f 3457/4893/1992 3458/4892/1992 3649/3914/1992 3636/3913/1992 +f 3663/4862/1993 3674/4865/1993 3462/5040/1993 3461/5041/1993 +f 3461/5041/1994 3462/5040/1994 3673/3922/1994 3660/3921/1994 +f 3463/4995/1995 3464/4994/1995 3685/3926/1995 3672/3925/1995 +f 3699/4838/1996 3710/4841/1996 3468/5042/1996 3467/5043/1996 +f 3467/5043/1997 3468/5042/1997 3709/3934/1997 3696/3933/1997 +f 3723/4822/1998 3734/4825/1998 3472/5044/1998 3471/5045/1998 +f 3471/5045/1999 3472/5044/1999 3733/3942/1999 3720/3941/1999 +f 3747/4806/2000 3758/4809/2000 3476/5046/2000 3475/5047/2000 +f 3475/5047/2001 3476/5046/2001 3757/3950/2001 3744/3949/2001 +f 3477/4971/2002 3478/4970/2002 3769/3954/2002 3756/3953/2002 +f 3783/4782/2003 3794/4785/2003 3482/5048/2003 3481/5049/2003 +f 3481/5049/2004 3482/5048/2004 3793/3962/2004 3780/3961/2004 +f 3807/4766/2005 3818/4769/2005 3486/5050/2005 3485/5051/2005 +f 3485/5051/2006 3486/5050/2006 3817/3970/2006 3804/3969/2006 +f 3831/4750/2007 3842/4753/2007 3490/5052/2007 3489/5053/2007 +f 3489/5053/2008 3490/5052/2008 3841/3978/2008 3828/3977/2008 +f 3491/4947/2009 3492/4946/2009 3853/3982/2009 3840/3981/2009 +f 3867/4726/2010 3878/4729/2010 3496/5054/2010 3495/5055/2010 +f 3495/5055/2011 3496/5054/2011 3877/3990/2011 3864/3989/2011 +f 3891/4710/2012 3902/4713/2012 3500/5056/2012 3499/5057/2012 +f 3499/5057/2013 3500/5056/2013 3901/3998/2013 3888/3997/2013 +f 3915/4694/2014 3926/4697/2014 3504/5058/2014 3503/5059/2014 +f 3503/5059/2015 3504/5058/2015 3925/4006/2015 3912/4005/2015 +f 3505/4923/2016 3506/4922/2016 3937/4010/2016 3924/4009/2016 +f 3951/4670/2017 3962/4673/2017 3512/5060/2017 3509/5061/2017 +f 3509/5061/2018 3512/5060/2018 3961/4018/2018 3948/4017/2018 +f 3513/5039/2019 3511/5038/2019 3615/4646/2019 3960/4645/2019 +f 3516/5011/2020 3515/5010/2020 3627/4028/2020 3602/4027/2020 +f 3519/4903/2021 3517/4902/2021 3603/4898/2021 3588/4897/2021 +f 3446/5062/2022 3454/5063/2022 3585/4038/2022 3610/4037/2022 +f 3393/5003/2023 3394/5002/2023 3653/4091/2023 3640/4090/2023 +f 3655/3916/2024 3666/3919/2024 3396/5064/2024 3395/5065/2024 +f 3395/5065/2025 3396/5064/2025 3665/4107/2025 3652/4106/2025 +f 3397/4999/2026 3398/4998/2026 3677/4126/2026 3664/4125/2026 +f 3691/3928/2027 3702/3931/2027 3402/5066/2027 3401/5067/2027 +f 3401/5067/2028 3402/5066/2028 3701/4164/2028 3688/4163/2028 +f 3715/3936/2029 3726/3939/2029 3406/5068/2029 3405/5069/2029 +f 3405/5069/2030 3406/5068/2030 3725/4202/2030 3712/4201/2030 +f 3739/3944/2031 3750/3947/2031 3410/5070/2031 3409/5071/2031 +f 3409/5071/2032 3410/5070/2032 3749/4240/2032 3736/4239/2032 +f 3411/4975/2033 3412/4974/2033 3761/4259/2033 3748/4258/2033 +f 3775/3956/2034 3786/3959/2034 3416/5072/2034 3415/5073/2034 +f 3415/5073/2035 3416/5072/2035 3785/4297/2035 3772/4296/2035 +f 3799/3964/2036 3810/3967/2036 3420/5074/2036 3419/5075/2036 +f 3419/5075/2037 3420/5074/2037 3809/4335/2037 3796/4334/2037 +f 3823/3972/2038 3834/3975/2038 3424/5076/2038 3423/5077/2038 +f 3423/5077/2039 3424/5076/2039 3833/4373/2039 3820/4372/2039 +f 3425/4951/2040 3426/4950/2040 3845/4392/2040 3832/4391/2040 +f 3859/3984/2041 3870/3987/2041 3430/5078/2041 3429/5079/2041 +f 3429/5079/2042 3430/5078/2042 3869/4430/2042 3856/4429/2042 +f 3883/3992/2043 3894/3995/2043 3434/5080/2043 3433/5081/2043 +f 3433/5081/2044 3434/5080/2044 3893/4468/2044 3880/4467/2044 +f 3907/4000/2045 3918/4003/2045 3438/5082/2045 3437/5083/2045 +f 3437/5083/2046 3438/5082/2046 3917/4506/2046 3904/4505/2046 +f 3439/4927/2047 3440/4926/2047 3929/4525/2047 3916/4524/2047 +f 3943/4012/2048 3954/4015/2048 3444/5084/2048 3443/5085/2048 +f 3443/5085/2049 3444/5084/2049 3953/4563/2049 3940/4562/2049 +f 3967/4644/2050 3608/4647/2050 3447/5009/2050 3449/5008/2050 +f 3609/4882/2051 3586/4885/2051 3454/5063/2051 3446/5062/2051 +f 3452/4907/2052 3451/4906/2052 3631/4061/2052 3606/4060/2052 +f 3455/4901/2053 3453/4900/2053 3607/5015/2053 3584/5014/2053 +f 3200/4039/2054 3111/5086/2054 3201/5087/2054 3202/5088/2054 +f 3203/5089/2055 3110/5090/2055 3204/4047/2055 3205/4046/2055 +f 3206/4620/2056 3122/5091/2056 3207/4031/2056 3208/4030/2056 +f 3209/4066/2057 3121/5092/2057 3210/5093/2057 3211/4638/2057 +f 3212/4032/2058 3133/5094/2058 3213/3903/2058 3214/3902/2058 +f 3215/4081/2059 3132/5095/2059 3216/4067/2059 3217/4642/2059 +f 3218/3904/2060 3144/5096/2060 3219/4021/2060 3220/4020/2060 +f 3221/4096/2061 3143/5097/2061 3222/5098/2061 3223/4876/2061 +f 3224/4022/2062 3155/5099/2062 3225/4105/2062 3226/4874/2062 +f 3227/4115/2063 3154/5100/2063 3228/4097/2063 3229/4868/2063 +f 3230/4108/2064 3166/5101/2064 3231/4124/2064 3232/4866/2064 +f 3233/4134/2065 3165/5102/2065 3234/5103/2065 3235/4860/2065 +f 3236/4127/2066 3199/4664/2066 3237/4143/2066 3238/4858/2066 +f 3239/4153/2067 3198/5104/2067 3240/4135/2067 3241/4852/2067 +f 3242/4146/2068 3188/5105/2068 3243/4162/2068 3244/4850/2068 +f 3245/4172/2069 3187/5106/2069 3246/5107/2069 3247/4844/2069 +f 3248/4165/2070 3177/5108/2070 3249/4181/2070 3250/4842/2070 +f 3251/4191/2071 3176/5109/2071 3252/4173/2071 3253/4836/2071 +f 3254/4184/2072 3968/5110/2072 3255/4200/2072 3256/4834/2072 +f 3257/4210/2073 3969/5111/2073 3258/5112/2073 3259/4828/2073 +f 3260/4203/2074 2762/5113/2074 3261/4219/2074 3262/4826/2074 +f 3263/4229/2075 2759/5114/2075 3264/4211/2075 3265/4820/2075 +f 3266/4222/2076 2801/5115/2076 3267/4238/2076 3268/4818/2076 +f 3269/4248/2077 2797/5116/2077 3270/5117/2077 3271/4812/2077 +f 3272/4241/2078 2839/5118/2078 3273/4257/2078 3274/4810/2078 +f 3275/4267/2079 2836/5119/2079 3276/4249/2079 3277/4804/2079 +f 3278/4260/2080 2878/5120/2080 3279/4276/2080 3280/4802/2080 +f 3281/4286/2081 2874/5121/2081 3282/5122/2081 3283/4796/2081 +f 3284/4279/2082 2913/5123/2082 3285/4295/2082 3286/4794/2082 +f 3287/4305/2083 2912/5124/2083 3288/4287/2083 3289/4788/2083 +f 3290/4298/2084 2924/5125/2084 3291/4314/2084 3292/4786/2084 +f 3293/4324/2085 2923/5126/2085 3294/5127/2085 3295/4780/2085 +f 3296/4317/2086 2935/5128/2086 3297/4333/2086 3298/4778/2086 +f 3299/4343/2087 2934/5129/2087 3300/4325/2087 3301/4772/2087 +f 3302/4336/2088 2946/5130/2088 3303/4352/2088 3304/4770/2088 +f 3305/4362/2089 2945/5131/2089 3306/5132/2089 3307/4764/2089 +f 3308/4355/2090 2957/5133/2090 3309/4371/2090 3310/4762/2090 +f 3311/4381/2091 2956/5134/2091 3312/4363/2091 3313/4756/2091 +f 3314/4374/2092 2968/5135/2092 3315/4390/2092 3316/4754/2092 +f 3317/4400/2093 2967/5136/2093 3318/5137/2093 3319/4748/2093 +f 3320/4393/2094 2979/5138/2094 3321/4409/2094 3322/4746/2094 +f 3323/4419/2095 2978/5139/2095 3324/4401/2095 3325/4740/2095 +f 3326/4412/2096 2990/5140/2096 3327/4428/2096 3328/4738/2096 +f 3329/4438/2097 2989/5141/2097 3330/5142/2097 3331/4732/2097 +f 3332/4431/2098 3001/5143/2098 3333/4447/2098 3334/4730/2098 +f 3335/4457/2099 3000/5144/2099 3336/4439/2099 3337/4724/2099 +f 3338/4450/2100 3012/5145/2100 3339/4466/2100 3340/4722/2100 +f 3341/4476/2101 3011/5146/2101 3342/5147/2101 3343/4716/2101 +f 3344/4469/2102 3023/5148/2102 3345/4485/2102 3346/4714/2102 +f 3347/4495/2103 3022/5149/2103 3348/4477/2103 3349/4708/2103 +f 3350/4488/2104 3034/5150/2104 3351/4504/2104 3352/4706/2104 +f 3353/4514/2105 3033/5151/2105 3354/5152/2105 3355/4700/2105 +f 3356/4507/2106 3045/5153/2106 3357/4523/2106 3358/4698/2106 +f 3359/4533/2107 3044/5154/2107 3360/4515/2107 3361/4692/2107 +f 3362/4526/2108 3056/5155/2108 3363/4542/2108 3364/4690/2108 +f 3365/4552/2109 3055/5156/2109 3366/5157/2109 3367/4684/2109 +f 3368/4545/2110 3067/5158/2110 3369/4561/2110 3370/4682/2110 +f 3371/4571/2111 3066/5159/2111 3372/4553/2111 3373/4676/2111 +f 3374/4564/2112 3078/5160/2112 3375/4580/2112 3376/4674/2112 +f 3377/4590/2113 3077/5161/2113 3378/5162/2113 3379/4668/2113 +f 3380/4583/2114 3089/5163/2114 3381/4599/2114 3382/4666/2114 +f 3383/4609/2115 3088/5164/2115 3384/4591/2115 3385/4662/2115 +f 3386/4602/2116 3100/5165/2116 3387/4036/2116 3388/5166/2116 +f 3389/4048/2117 3099/5167/2117 3390/5168/2117 3391/4640/2117 +f 3142/5169/2118 3141/5170/2118 3393/5003/2118 3640/4090/2118 +f 2755/5171/2119 2752/5172/2119 3407/4979/2119 3724/4220/2119 +f 2944/5173/2120 2943/5174/2120 3421/4955/2120 3808/4353/2120 +f 3021/5175/2121 3020/5176/2121 3435/4931/2121 3892/4486/2121 +f 3087/5177/2122 3086/5178/2122 3449/5008/2122 3964/4600/2122 +f 3970/5179/2123 3971/5180/2123 3469/4983/2123 3708/3937/2123 +f 2933/5181/2124 2932/5182/2124 3483/4959/2124 3792/3965/2124 +f 3010/5183/2125 3009/5184/2125 3497/4935/2125 3876/3993/2125 +f 3098/5185/2126 3097/5186/2126 3511/5038/2126 3612/4651/2126 +f 3175/5187/2127 3174/5188/2127 3531/4987/2127 3692/4839/2127 +f 2922/5189/2128 2921/5190/2128 3545/4963/2128 3776/4783/2128 +f 2999/5191/2129 2998/5192/2129 3559/4939/2129 3860/4727/2129 +f 3076/5193/2130 3075/5194/2130 3573/4915/2130 3944/4671/2130 +f 3109/5195/2131 3108/5196/2131 3583/5197/2131 3592/5198/2131 +f 3164/5199/2132 3163/5200/2132 3397/4999/2132 3664/4125/2132 +f 3197/4665/2133 3196/5201/2133 3399/4991/2133 3676/4144/2133 +f 3173/5202/2134 3172/5203/2134 3403/4985/2134 3700/4182/2134 +f 2832/5204/2135 2829/5205/2135 3411/4975/2135 3748/4258/2135 +f 2871/5206/2136 2867/5207/2136 3413/4967/2136 3760/4277/2136 +f 2920/5208/2137 2919/5209/2137 3417/4961/2137 3784/4315/2137 +f 2966/5210/2138 2965/5211/2138 3425/4951/2138 3832/4391/2138 +f 2977/5212/2139 2976/5213/2139 3427/4943/2139 3844/4410/2139 +f 2997/5214/2140 2996/5215/2140 3431/4937/2140 3868/4448/2140 +f 3043/5216/2141 3042/5217/2141 3439/4927/2141 3916/4524/2141 +f 3054/5218/2142 3053/5219/2142 3441/4919/2142 3928/4543/2142 +f 3074/5220/2143 3073/5221/2143 3445/4913/2143 3952/4581/2143 +f 3120/5222/2144 3119/5223/2144 3453/4900/2144 3604/4899/2144 +f 3107/5224/2145 3106/5225/2145 3455/5226/2145 3584/5227/2145 +f 3153/5228/2146 3152/5229/2146 3459/5001/2146 3648/3917/2146 +f 3162/5230/2147 3161/5231/2147 3461/5041/2147 3660/3921/2147 +f 3186/5232/2148 3185/5233/2148 3465/4989/2148 3684/3929/2148 +f 2794/5234/2149 2790/5235/2149 3473/4977/2149 3732/3945/2149 +f 2825/5236/2150 2822/5237/2150 3475/5047/2150 3744/3949/2150 +f 2909/5238/2151 2906/5239/2151 3479/4965/2151 3768/3957/2151 +f 2955/5240/2152 2954/5241/2152 3487/4953/2152 3816/3973/2152 +f 2964/5242/2153 2963/5243/2153 3489/5053/2153 3828/3977/2153 +f 2988/5244/2154 2987/5245/2154 3493/4941/2154 3852/3985/2154 +f 3032/5246/2155 3031/5247/2155 3501/4929/2155 3900/4001/2155 +f 3041/5248/2156 3040/5249/2156 3503/5059/2156 3912/4005/2156 +f 3065/5250/2157 3064/5251/2157 3507/4917/2157 3936/4013/2157 +f 3131/5252/2158 3130/5253/2158 3515/5010/2158 3624/4889/2158 +f 3118/5254/2159 3117/5255/2159 3517/4902/2159 3600/4633/2159 +f 3140/5256/2160 3139/5257/2160 3521/5007/2160 3632/4879/2160 +f 3151/5258/2161 3150/5259/2161 3523/5017/2161 3644/4871/2161 +f 3195/5260/2162 3194/5261/2162 3527/5019/2162 3668/4855/2162 +f 2748/5262/2163 2745/5263/2163 3535/4981/2163 3716/4823/2163 +f 2787/5264/2164 2783/5265/2164 3537/5023/2164 3728/4815/2164 +f 2864/5266/2165 2860/5267/2165 3541/5025/2165 3752/4799/2165 +f 2942/5268/2166 2941/5269/2166 3549/4957/2166 3800/4767/2166 +f 2953/5270/2167 2952/5271/2167 3551/5029/2167 3812/4759/2167 +f 2975/5272/2168 2974/5273/2168 3555/5031/2168 3836/4743/2168 +f 3019/5274/2169 3018/5275/2169 3563/4933/2169 3884/4711/2169 +f 3030/5276/2170 3029/5277/2170 3565/5035/2170 3896/4703/2170 +f 3052/5278/2171 3051/5279/2171 3569/5037/2171 3920/4687/2171 +f 3085/5280/2172 3084/5281/2172 3577/5012/2172 3956/4649/2172 +f 3129/5282/2173 3128/5283/2173 3579/4910/2173 3620/4068/2173 +f 3116/5284/2174 3115/5285/2174 3581/4904/2174 3596/4637/2174 +f 3096/5286/2175 3095/5287/2175 3575/5013/2175 3616/4611/2175 +f 3063/5288/2176 3062/5289/2176 3571/4921/2176 3932/4679/2176 +f 3039/5290/2177 3038/5291/2177 3567/4925/2177 3908/4695/2177 +f 3008/5292/2178 3007/5293/2178 3561/5033/2178 3872/4719/2178 +f 2986/5294/2179 2985/5295/2179 3557/4945/2179 3848/4735/2179 +f 2962/5296/2180 2961/5297/2180 3553/4949/2180 3824/4751/2180 +f 2931/5298/2181 2930/5299/2181 3547/5027/2181 3788/4775/2181 +f 2902/5300/2182 2899/5301/2182 3543/4969/2182 3764/4791/2182 +f 2818/5302/2183 2815/5303/2183 3539/4973/2183 3740/4807/2183 +f 3972/5304/2184 3973/5305/2184 3533/5021/2184 3704/4831/2184 +f 3184/5306/2185 3183/5307/2185 3529/4993/2185 3680/4847/2185 +f 3160/5308/2186 3159/5309/2186 3525/4997/2186 3656/4863/2186 +f 3105/5310/2187 3104/5311/2187 3519/5312/2187 3588/5313/2187 +f 3083/5314/2188 3082/5315/2188 3513/5039/2188 3960/4645/2188 +f 3072/5316/2189 3071/5317/2189 3509/5061/2189 3948/4017/2189 +f 3050/5318/2190 3049/5319/2190 3505/4923/2190 3924/4009/2190 +f 3017/5320/2191 3016/5321/2191 3499/5057/2191 3888/3997/2191 +f 2995/5322/2192 2994/5323/2192 3495/5055/2192 3864/3989/2192 +f 2973/5324/2193 2972/5325/2193 3491/4947/2193 3840/3981/2193 +f 2940/5326/2194 2939/5327/2194 3485/5051/2194 3804/3969/2194 +f 2918/5328/2195 2917/5329/2195 3481/5049/2195 3780/3961/2195 +f 2857/5330/2196 2853/5331/2196 3477/4971/2196 3756/3953/2196 +f 2741/5332/2197 2738/5333/2197 3471/5045/2197 3720/3941/2197 +f 3171/5334/2198 3170/5335/2198 3467/5043/2198 3696/3933/2198 +f 3193/5336/2199 3192/5337/2199 3463/4995/2199 3672/3925/2199 +f 3138/5338/2200 3137/5339/2200 3457/4893/2200 3636/3913/2200 +f 3127/5340/2201 3126/5341/2201 3451/4906/2201 3628/4029/2201 +f 3094/5342/2202 3093/5343/2202 3447/5009/2202 3608/4647/2202 +f 3061/5344/2203 3060/5345/2203 3443/5085/2203 3940/4562/2203 +f 3028/5346/2204 3027/5347/2204 3437/5083/2204 3904/4505/2204 +f 3006/5348/2205 3005/5349/2205 3433/5081/2205 3880/4467/2205 +f 2984/5350/2206 2983/5351/2206 3429/5079/2206 3856/4429/2206 +f 2951/5352/2207 2950/5353/2207 3423/5077/2207 3820/4372/2207 +f 2929/5354/2208 2928/5355/2208 3419/5075/2208 3796/4334/2208 +f 2895/5356/2209 2892/5357/2209 3415/5073/2209 3772/4296/2209 +f 2780/5358/2210 2776/5359/2210 3409/5071/2210 3736/4239/2210 +f 3974/5360/2211 3975/5361/2211 3405/5069/2211 3712/4201/2211 +f 3182/5362/2212 3181/5363/2212 3401/5067/2212 3688/4163/2212 +f 3149/5364/2213 3148/5365/2213 3395/5065/2213 3652/4106/2213 +f 3106/5225/2214 3103/5366/2214 3587/5367/2214 3455/5226/2214 +f 3119/5223/2215 3114/5368/2215 3607/5015/2215 3453/4900/2215 +f 3104/5311/2216 3102/5369/2216 3591/5370/2216 3519/5312/2216 +f 3117/5255/2217 3113/5371/2217 3603/4898/2217 3517/4902/2217 +f 3108/5196/2218 3101/5372/2218 3595/5373/2218 3583/5197/2218 +f 3115/5285/2219 3112/5374/2219 3599/4632/2219 3581/4904/2219 +f 3126/5341/2220 3125/5375/2220 3631/4061/2220 3451/4906/2220 +f 3130/5253/2221 3124/5376/2221 3627/4028/2221 3515/5010/2221 +f 3128/5283/2222 3123/5377/2222 3623/4888/2222 3579/4910/2222 +f 3086/5178/2223 3081/5378/2223 3967/4644/2223 3449/5008/2223 +f 3093/5343/2224 3092/5379/2224 3611/4601/2224 3447/5009/2224 +f 3082/5315/2225 3080/5380/2225 3963/4648/2225 3513/5039/2225 +f 3097/5186/2226 3091/5381/2226 3615/4646/2226 3511/5038/2226 +f 3084/5281/2227 3079/5382/2227 3959/4608/2227 3577/5012/2227 +f 3095/5287/2228 3090/5383/2228 3619/4650/2228 3575/5013/2228 +f 3073/5221/2229 3070/5384/2229 3955/4016/2229 3445/4913/2229 +f 3071/5317/2230 3069/5385/2230 3951/4670/2230 3509/5061/2230 +f 3075/5194/2231 3068/5386/2231 3947/4589/2231 3573/4915/2231 +f 3060/5345/2232 3059/5387/2232 3943/4012/2232 3443/5085/2232 +f 3064/5251/2233 3058/5388/2233 3939/4678/2233 3507/4917/2233 +f 3062/5289/2234 3057/5389/2234 3935/4570/2234 3571/4921/2234 +f 3053/5219/2235 3048/5390/2235 3931/4008/2235 3441/4919/2235 +f 3049/5319/2236 3047/5391/2236 3927/4686/2236 3505/4923/2236 +f 3051/5279/2237 3046/5392/2237 3923/4551/2237 3569/5037/2237 +f 3042/5217/2238 3037/5393/2238 3919/4004/2238 3439/4927/2238 +f 3040/5249/2239 3036/5394/2239 3915/4694/2239 3503/5059/2239 +f 3038/5291/2240 3035/5395/2240 3911/4532/2240 3567/4925/2240 +f 3027/5347/2241 3026/5396/2241 3907/4000/2241 3437/5083/2241 +f 3031/5247/2242 3025/5397/2242 3903/4702/2242 3501/4929/2242 +f 3029/5277/2243 3024/5398/2243 3899/4513/2243 3565/5035/2243 +f 3020/5176/2244 3015/5399/2244 3895/3996/2244 3435/4931/2244 +f 3016/5321/2245 3014/5400/2245 3891/4710/2245 3499/5057/2245 +f 3018/5275/2246 3013/5401/2246 3887/4494/2246 3563/4933/2246 +f 3005/5349/2247 3004/5402/2247 3883/3992/2247 3433/5081/2247 +f 3009/5184/2248 3003/5403/2248 3879/4718/2248 3497/4935/2248 +f 3007/5293/2249 3002/5404/2249 3875/4475/2249 3561/5033/2249 +f 2996/5215/2250 2993/5405/2250 3871/3988/2250 3431/4937/2250 +f 2994/5323/2251 2992/5406/2251 3867/4726/2251 3495/5055/2251 +f 2998/5192/2252 2991/5407/2252 3863/4456/2252 3559/4939/2252 +f 2983/5351/2253 2982/5408/2253 3859/3984/2253 3429/5079/2253 +f 2987/5245/2254 2981/5409/2254 3855/4734/2254 3493/4941/2254 +f 2985/5295/2255 2980/5410/2255 3851/4437/2255 3557/4945/2255 +f 2976/5213/2256 2971/5411/2256 3847/3980/2256 3427/4943/2256 +f 2972/5325/2257 2970/5412/2257 3843/4742/2257 3491/4947/2257 +f 2974/5273/2258 2969/5413/2258 3839/4418/2258 3555/5031/2258 +f 2965/5211/2259 2960/5414/2259 3835/3976/2259 3425/4951/2259 +f 2963/5243/2260 2959/5415/2260 3831/4750/2260 3489/5053/2260 +f 2961/5297/2261 2958/5416/2261 3827/4399/2261 3553/4949/2261 +f 2950/5353/2262 2949/5417/2262 3823/3972/2262 3423/5077/2262 +f 2954/5241/2263 2948/5418/2263 3819/4758/2263 3487/4953/2263 +f 2952/5271/2264 2947/5419/2264 3815/4380/2264 3551/5029/2264 +f 2943/5174/2265 2938/5420/2265 3811/3968/2265 3421/4955/2265 +f 2939/5327/2266 2937/5421/2266 3807/4766/2266 3485/5051/2266 +f 2941/5269/2267 2936/5422/2267 3803/4361/2267 3549/4957/2267 +f 2928/5355/2268 2927/5423/2268 3799/3964/2268 3419/5075/2268 +f 2932/5182/2269 2926/5424/2269 3795/4774/2269 3483/4959/2269 +f 2930/5299/2270 2925/5425/2270 3791/4342/2270 3547/5027/2270 +f 2919/5209/2271 2916/5426/2271 3787/3960/2271 3417/4961/2271 +f 2917/5329/2272 2915/5427/2272 3783/4782/2272 3481/5049/2272 +f 2921/5190/2273 2914/5428/2273 3779/4323/2273 3545/4963/2273 +f 2892/5357/2274 2888/5429/2274 3775/3956/2274 3415/5073/2274 +f 2906/5239/2275 2885/5430/2275 3771/4790/2275 3479/4965/2275 +f 2899/5301/2276 2881/5431/2276 3767/4304/2276 3543/4969/2276 +f 2867/5207/2277 2850/5432/2277 3763/3952/2277 3413/4967/2277 +f 2853/5331/2278 2846/5433/2278 3759/4798/2278 3477/4971/2278 +f 2860/5267/2279 2843/5434/2279 3755/4285/2279 3541/5025/2279 +f 2829/5205/2280 2811/5435/2280 3751/3948/2280 3411/4975/2280 +f 2822/5237/2281 2808/5436/2281 3747/4806/2281 3475/5047/2281 +f 2815/5303/2282 2804/5437/2282 3743/4266/2282 3539/4973/2282 +f 2776/5359/2283 2773/5438/2283 3739/3944/2283 3409/5071/2283 +f 2790/5235/2284 2769/5439/2284 3735/4814/2284 3473/4977/2284 +f 2783/5265/2285 2766/5440/2285 3731/4247/2285 3537/5023/2285 +f 2752/5172/2286 2734/5441/2286 3727/3940/2286 3407/4979/2286 +f 2738/5333/2287 2731/5442/2287 3723/4822/2287 3471/5045/2287 +f 2745/5263/2288 2727/5443/2288 3719/4228/2288 3535/4981/2288 +f 3975/5361/2289 3976/5444/2289 3715/3936/2289 3405/5069/2289 +f 3971/5180/2290 3977/5445/2290 3711/4830/2290 3469/4983/2290 +f 3973/5305/2291 3978/5446/2291 3707/4209/2291 3533/5021/2291 +f 3172/5203/2292 3169/5447/2292 3703/3932/2292 3403/4985/2292 +f 3170/5335/2293 3168/5448/2293 3699/4838/2293 3467/5043/2293 +f 3174/5188/2294 3167/5449/2294 3695/4190/2294 3531/4987/2294 +f 3181/5363/2295 3180/5450/2295 3691/3928/2295 3401/5067/2295 +f 3185/5233/2296 3179/5451/2296 3687/4846/2296 3465/4989/2296 +f 3183/5307/2297 3178/5452/2297 3683/4171/2297 3529/4993/2297 +f 3196/5201/2298 3191/5453/2298 3679/3924/2298 3399/4991/2298 +f 3192/5337/2299 3190/5454/2299 3675/4854/2299 3463/4995/2299 +f 3194/5261/2300 3189/5455/2300 3671/4152/2300 3527/5019/2300 +f 3163/5200/2301 3158/5456/2301 3667/3920/2301 3397/4999/2301 +f 3161/5231/2302 3157/5457/2302 3663/4862/2302 3461/5041/2302 +f 3159/5309/2303 3156/5458/2303 3659/4133/2303 3525/4997/2303 +f 3148/5365/2304 3147/5459/2304 3655/3916/2304 3395/5065/2304 +f 3152/5229/2305 3146/5460/2305 3651/4870/2305 3459/5001/2305 +f 3150/5259/2306 3145/5461/2306 3647/4114/2306 3523/5017/2306 +f 3141/5170/2307 3136/5462/2307 3643/3912/2307 3393/5003/2307 +f 3137/5339/2308 3135/5463/2308 3639/4878/2308 3457/4893/2308 +f 3139/5257/2309 3134/5464/2309 3635/4095/2309 3521/5007/2309 +f 3100/5465/2310 3092/5379/2310 3610/4037/2310 3387/4036/2310 +f 3107/5224/2311 3111/5466/2311 3200/4039/2311 3585/4038/2311 +f 3103/5366/2312 3105/5467/2312 3588/5468/2312 3587/5469/2312 +f 3113/5371/2313 3120/5222/2313 3604/4899/2313 3603/4898/2313 +f 3114/5368/2314 3122/5470/2314 3206/4620/2314 3607/5015/2314 +f 3094/5342/2315 3091/5381/2315 3614/4883/2315 3609/4882/2315 +f 3098/5185/2316 3090/5383/2316 3618/4661/2316 3613/4890/2316 +f 3109/5195/2317 3102/5471/2317 3590/4891/2317 3593/4660/2317 +f 3112/5374/2318 3118/5254/2318 3600/4633/2318 3599/4632/2318 +f 3101/5372/2319 3110/5472/2319 3203/5473/2319 3595/5373/2319 +f 3121/5092/2320 3116/5284/2320 3596/4637/2320 3210/4636/2320 +f 3096/5286/2321 3099/5167/2321 3389/4048/2321 3617/4626/2321 +f 3132/5095/2322 3129/5282/2322 3620/4068/2322 3216/4067/2322 +f 3123/5377/2323 3131/5252/2323 3624/4889/2323 3623/4888/2323 +f 3124/5376/2324 3127/5340/2324 3628/4029/2324 3627/4028/2324 +f 3125/5375/2325 3133/5094/2325 3212/4032/2325 3631/4061/2325 +f 3089/5163/2326 3087/5177/2326 3964/4600/2326 3381/4599/2326 +f 3081/5378/2327 3083/5314/2327 3960/4645/2327 3967/4644/2327 +f 3080/5380/2328 3085/5280/2328 3956/4649/2328 3963/4648/2328 +f 3079/5382/2329 3088/5164/2329 3383/4609/2329 3959/4608/2329 +f 3143/5097/2330 3134/5464/2330 3634/4083/2330 3222/4082/2330 +f 3140/5256/2331 3135/5463/2331 3638/4655/2331 3633/4654/2331 +f 3138/5338/2332 3136/5462/2332 3642/3911/2332 3637/3910/2332 +f 3142/5169/2333 3144/5474/2333 3218/3904/2333 3641/4076/2333 +f 3154/5100/2334 3145/5461/2334 3646/4098/2334 3228/4097/2334 +f 3151/5258/2335 3146/5460/2335 3650/4881/2335 3645/4880/2335 +f 3153/5228/2336 3147/5459/2336 3654/3915/2336 3649/3914/2336 +f 3149/5364/2337 3155/5099/2337 3224/4022/2337 3653/4091/2337 +f 3165/5102/2338 3156/5458/2338 3658/4117/2338 3234/4116/2338 +f 3160/5308/2339 3157/5457/2339 3662/4873/2339 3657/4872/2339 +f 3162/5230/2340 3158/5456/2340 3666/3919/2340 3661/3918/2340 +f 3164/5199/2341 3166/5475/2341 3230/4108/2341 3665/4107/2341 +f 3198/5104/2342 3189/5455/2342 3670/4136/2342 3240/4135/2342 +f 3195/5260/2343 3190/5454/2343 3674/4865/2343 3669/4864/2343 +f 3193/5336/2344 3191/5453/2344 3678/3923/2344 3673/3922/2344 +f 3197/4665/2345 3199/4664/2345 3236/4127/2345 3677/4126/2345 +f 3187/5106/2346 3178/5452/2346 3682/4155/2346 3246/4154/2346 +f 3184/5306/2347 3179/5451/2347 3686/4857/2347 3681/4856/2347 +f 3186/5232/2348 3180/5450/2348 3690/3927/2348 3685/3926/2348 +f 3182/5362/2349 3188/5476/2349 3242/4146/2349 3689/4145/2349 +f 3176/5109/2350 3167/5449/2350 3694/4174/2350 3252/4173/2350 +f 3175/5187/2351 3168/5448/2351 3698/4849/2351 3693/4848/2351 +f 3171/5334/2352 3169/5447/2352 3702/3931/2352 3697/3930/2352 +f 3173/5202/2353 3177/5108/2353 3248/4165/2353 3701/4164/2353 +f 3969/5111/2354 3978/5446/2354 3706/4193/2354 3258/4192/2354 +f 3972/5304/2355 3977/5445/2355 3710/4841/2355 3705/4840/2355 +f 3970/5179/2356 3976/5444/2356 3714/3935/2356 3709/3934/2356 +f 3974/5360/2357 3968/5477/2357 3254/4184/2357 3713/4183/2357 +f 2759/5114/2358 2727/5443/2358 3718/4212/2358 3264/4211/2358 +f 2748/5262/2359 2731/5442/2359 3722/4833/2359 3717/4832/2359 +f 2741/5332/2360 2734/5441/2360 3726/3939/2360 3721/3938/2360 +f 2755/5171/2361 2762/5113/2361 3260/4203/2361 3725/4202/2361 +f 2797/5116/2362 2766/5440/2362 3730/4231/2362 3270/4230/2362 +f 2787/5264/2363 2769/5439/2363 3734/4825/2363 3729/4824/2363 +f 2794/5234/2364 2773/5438/2364 3738/3943/2364 3733/3942/2364 +f 2780/5358/2365 2801/5478/2365 3266/4222/2365 3737/4221/2365 +f 2836/5119/2366 2804/5437/2366 3742/4250/2366 3276/4249/2366 +f 2818/5302/2367 2808/5436/2367 3746/4817/2367 3741/4816/2367 +f 2825/5236/2368 2811/5435/2368 3750/3947/2368 3745/3946/2368 +f 2832/5204/2369 2839/5118/2369 3272/4241/2369 3749/4240/2369 +f 2874/5121/2370 2843/5434/2370 3754/4269/2370 3282/4268/2370 +f 2864/5266/2371 2846/5433/2371 3758/4809/2371 3753/4808/2371 +f 2857/5330/2372 2850/5432/2372 3762/3951/2372 3757/3950/2372 +f 2871/5206/2373 2878/5479/2373 3278/4260/2373 3761/4259/2373 +f 2912/5124/2374 2881/5431/2374 3766/4288/2374 3288/4287/2374 +f 2902/5300/2375 2885/5430/2375 3770/4801/2375 3765/4800/2375 +f 2909/5238/2376 2888/5429/2376 3774/3955/2376 3769/3954/2376 +f 2895/5356/2377 2913/5123/2377 3284/4279/2377 3773/4278/2377 +f 2923/5126/2378 2914/5428/2378 3778/4307/2378 3294/4306/2378 +f 2922/5189/2379 2915/5427/2379 3782/4793/2379 3777/4792/2379 +f 2918/5328/2380 2916/5426/2380 3786/3959/2380 3781/3958/2380 +f 2920/5208/2381 2924/5480/2381 3290/4298/2381 3785/4297/2381 +f 2934/5129/2382 2925/5425/2382 3790/4326/2382 3300/4325/2382 +f 2931/5298/2383 2926/5424/2383 3794/4785/2383 3789/4784/2383 +f 2933/5181/2384 2927/5423/2384 3798/3963/2384 3793/3962/2384 +f 2929/5354/2385 2935/5128/2385 3296/4317/2385 3797/4316/2385 +f 2945/5131/2386 2936/5422/2386 3802/4345/2386 3306/4344/2386 +f 2942/5268/2387 2937/5421/2387 3806/4777/2387 3801/4776/2387 +f 2940/5326/2388 2938/5420/2388 3810/3967/2388 3805/3966/2388 +f 2944/5173/2389 2946/5481/2389 3302/4336/2389 3809/4335/2389 +f 2956/5134/2390 2947/5419/2390 3814/4364/2390 3312/4363/2390 +f 2953/5270/2391 2948/5418/2391 3818/4769/2391 3813/4768/2391 +f 2955/5240/2392 2949/5417/2392 3822/3971/2392 3817/3970/2392 +f 2951/5352/2393 2957/5133/2393 3308/4355/2393 3821/4354/2393 +f 2967/5136/2394 2958/5416/2394 3826/4383/2394 3318/4382/2394 +f 2962/5296/2395 2959/5415/2395 3830/4761/2395 3825/4760/2395 +f 2964/5242/2396 2960/5414/2396 3834/3975/2396 3829/3974/2396 +f 2966/5210/2397 2968/5482/2397 3314/4374/2397 3833/4373/2397 +f 2978/5139/2398 2969/5413/2398 3838/4402/2398 3324/4401/2398 +f 2975/5272/2399 2970/5412/2399 3842/4753/2399 3837/4752/2399 +f 2973/5324/2400 2971/5411/2400 3846/3979/2400 3841/3978/2400 +f 2977/5212/2401 2979/5138/2401 3320/4393/2401 3845/4392/2401 +f 2989/5141/2402 2980/5410/2402 3850/4421/2402 3330/4420/2402 +f 2986/5294/2403 2981/5409/2403 3854/4745/2403 3849/4744/2403 +f 2988/5244/2404 2982/5408/2404 3858/3983/2404 3853/3982/2404 +f 2984/5350/2405 2990/5483/2405 3326/4412/2405 3857/4411/2405 +f 3000/5144/2406 2991/5407/2406 3862/4440/2406 3336/4439/2406 +f 2999/5191/2407 2992/5406/2407 3866/4737/2407 3861/4736/2407 +f 2995/5322/2408 2993/5405/2408 3870/3987/2408 3865/3986/2408 +f 2997/5214/2409 3001/5143/2409 3332/4431/2409 3869/4430/2409 +f 3011/5146/2410 3002/5404/2410 3874/4459/2410 3342/4458/2410 +f 3008/5292/2411 3003/5403/2411 3878/4729/2411 3873/4728/2411 +f 3010/5183/2412 3004/5402/2412 3882/3991/2412 3877/3990/2412 +f 3006/5348/2413 3012/5484/2413 3338/4450/2413 3881/4449/2413 +f 3022/5149/2414 3013/5401/2414 3886/4478/2414 3348/4477/2414 +f 3019/5274/2415 3014/5400/2415 3890/4721/2415 3885/4720/2415 +f 3017/5320/2416 3015/5399/2416 3894/3995/2416 3889/3994/2416 +f 3021/5175/2417 3023/5148/2417 3344/4469/2417 3893/4468/2417 +f 3033/5151/2418 3024/5398/2418 3898/4497/2418 3354/4496/2418 +f 3030/5276/2419 3025/5397/2419 3902/4713/2419 3897/4712/2419 +f 3032/5246/2420 3026/5396/2420 3906/3999/2420 3901/3998/2420 +f 3028/5346/2421 3034/5485/2421 3350/4488/2421 3905/4487/2421 +f 3044/5154/2422 3035/5395/2422 3910/4516/2422 3360/4515/2422 +f 3039/5290/2423 3036/5394/2423 3914/4705/2423 3909/4704/2423 +f 3041/5248/2424 3037/5393/2424 3918/4003/2424 3913/4002/2424 +f 3043/5216/2425 3045/5153/2425 3356/4507/2425 3917/4506/2425 +f 3055/5156/2426 3046/5392/2426 3922/4535/2426 3366/4534/2426 +f 3052/5278/2427 3047/5391/2427 3926/4697/2427 3921/4696/2427 +f 3050/5318/2428 3048/5390/2428 3930/4007/2428 3925/4006/2428 +f 3054/5218/2429 3056/5486/2429 3362/4526/2429 3929/4525/2429 +f 3066/5159/2430 3057/5389/2430 3934/4554/2430 3372/4553/2430 +f 3063/5288/2431 3058/5388/2431 3938/4689/2431 3933/4688/2431 +f 3065/5250/2432 3059/5387/2432 3942/4011/2432 3937/4010/2432 +f 3061/5344/2433 3067/5158/2433 3368/4545/2433 3941/4544/2433 +f 3077/5161/2434 3068/5386/2434 3946/4573/2434 3378/4572/2434 +f 3076/5193/2435 3069/5385/2435 3950/4681/2435 3945/4680/2435 +f 3072/5316/2436 3070/5384/2436 3954/4015/2436 3949/4014/2436 +f 3074/5220/2437 3078/5487/2437 3374/4564/2437 3953/4563/2437 +f 3388/5166/2438 3387/4036/2438 3200/4039/2438 3202/5088/2438 2701/4623/2438 2908/4622/2438 +f 3672/3925/2439 3679/3924/2439 3191/5453/2439 3193/5336/2439 +f 3668/4855/2440 3675/4854/2440 3190/5454/2440 3195/5260/2440 +f 3239/4153/2441 3671/4152/2441 3189/5455/2441 3198/5104/2441 +f 3526/4996/2442 3670/4136/2442 3189/5455/2442 3194/5261/2442 +f 3462/5040/2443 3674/4865/2443 3190/5454/2443 3192/5337/2443 +f 3398/4998/2444 3678/3923/2444 3191/5453/2444 3196/5201/2444 +f 3673/3922/2445 3462/5040/2445 3192/5337/2445 3193/5336/2445 +f 3669/4864/2446 3526/4996/2446 3194/5261/2446 3195/5260/2446 +f 3677/4126/2447 3398/4998/2447 3196/5201/2447 3197/4665/2447 +f 3688/4163/2448 3243/4162/2448 3188/5476/2448 3182/5362/2448 +f 3684/3929/2449 3691/3928/2449 3180/5450/2449 3186/5232/2449 +f 3680/4847/2450 3687/4846/2450 3179/5451/2450 3184/5306/2450 +f 3245/4172/2451 3683/4171/2451 3178/5452/2451 3187/5106/2451 +f 3528/5018/2452 3682/4155/2452 3178/5452/2452 3183/5307/2452 +f 3464/4994/2453 3686/4857/2453 3179/5451/2453 3185/5233/2453 +f 3400/4990/2454 3690/3927/2454 3180/5450/2454 3181/5363/2454 +f 3689/4145/2455 3400/4990/2455 3181/5363/2455 3182/5362/2455 +f 3681/4856/2456 3528/5018/2456 3183/5307/2456 3184/5306/2456 +f 3685/3926/2457 3464/4994/2457 3185/5233/2457 3186/5232/2457 +f 3700/4182/2458 3249/4181/2458 3177/5108/2458 3173/5202/2458 +f 3696/3933/2459 3703/3932/2459 3169/5447/2459 3171/5334/2459 +f 3692/4839/2460 3699/4838/2460 3168/5448/2460 3175/5187/2460 +f 3251/4191/2461 3695/4190/2461 3167/5449/2461 3176/5109/2461 +f 3530/4992/2462 3694/4174/2462 3167/5449/2462 3174/5188/2462 +f 3466/4988/2463 3698/4849/2463 3168/5448/2463 3170/5335/2463 +f 3402/5066/2464 3702/3931/2464 3169/5447/2464 3172/5203/2464 +f 3697/3930/2465 3466/4988/2465 3170/5335/2465 3171/5334/2465 +f 3701/4164/2466 3402/5066/2466 3172/5203/2466 3173/5202/2466 +f 3693/4848/2467 3530/4992/2467 3174/5188/2467 3175/5187/2467 +f 3664/4125/2468 3231/4124/2468 3166/5475/2468 3164/5199/2468 +f 3660/3921/2469 3667/3920/2469 3158/5456/2469 3162/5230/2469 +f 3656/4863/2470 3663/4862/2470 3157/5457/2470 3160/5308/2470 +f 3233/4134/2471 3659/4133/2471 3156/5458/2471 3165/5102/2471 +f 3524/5016/2472 3658/4117/2472 3156/5458/2472 3159/5309/2472 +f 3460/5000/2473 3662/4873/2473 3157/5457/2473 3161/5231/2473 +f 3396/5064/2474 3666/3919/2474 3158/5456/2474 3163/5200/2474 +f 3657/4872/2475 3524/5016/2475 3159/5309/2475 3160/5308/2475 +f 3661/3918/2476 3460/5000/2476 3161/5231/2476 3162/5230/2476 +f 3665/4107/2477 3396/5064/2477 3163/5200/2477 3164/5199/2477 +f 3652/4106/2478 3225/4105/2478 3155/5099/2478 3149/5364/2478 +f 3648/3917/2479 3655/3916/2479 3147/5459/2479 3153/5228/2479 +f 3644/4871/2480 3651/4870/2480 3146/5460/2480 3151/5258/2480 +f 3227/4115/2481 3647/4114/2481 3145/5461/2481 3154/5100/2481 +f 3522/5006/2482 3646/4098/2482 3145/5461/2482 3150/5259/2482 +f 3458/4892/2483 3650/4881/2483 3146/5460/2483 3152/5229/2483 +f 3394/5002/2484 3654/3915/2484 3147/5459/2484 3148/5365/2484 +f 3653/4091/2485 3394/5002/2485 3148/5365/2485 3149/5364/2485 +f 3645/4880/2486 3522/5006/2486 3150/5259/2486 3151/5258/2486 +f 3649/3914/2487 3458/4892/2487 3152/5229/2487 3153/5228/2487 +f 3640/4090/2488 3219/4021/2488 3144/5474/2488 3142/5169/2488 +f 3636/3913/2489 3643/3912/2489 3136/5462/2489 3138/5338/2489 +f 3632/4879/2490 3639/4878/2490 3135/5463/2490 3140/5256/2490 +f 3221/4096/2491 3635/4095/2491 3134/5464/2491 3143/5097/2491 +f 3520/4894/2492 3634/4083/2492 3134/5464/2492 3139/5257/2492 +f 3456/5005/2493 3638/4655/2493 3135/5463/2493 3137/5339/2493 +f 3392/4657/2494 3642/3911/2494 3136/5462/2494 3141/5170/2494 +f 3637/3910/2495 3456/5005/2495 3137/5339/2495 3138/5338/2495 +f 3633/4654/2496 3520/4894/2496 3139/5257/2496 3140/5256/2496 +f 3641/4076/2497 3392/4657/2497 3141/5170/2497 3142/5169/2497 +f 3630/4075/2498 3213/3903/2498 3133/5094/2498 3125/5375/2498 +f 3626/3909/2499 3629/3908/2499 3127/5340/2499 3124/5376/2499 +f 3622/4653/2500 3625/4652/2500 3131/5252/2500 3123/5377/2500 +f 3215/4081/2501 3621/4080/2501 3129/5282/2501 3132/5095/2501 +f 3578/4895/2502 3622/4653/2502 3123/5377/2502 3128/5283/2502 +f 3514/5004/2503 3626/3909/2503 3124/5376/2503 3130/5253/2503 +f 3450/4656/2504 3630/4075/2504 3125/5375/2504 3126/5341/2504 +f 3629/3908/2505 3450/4656/2505 3126/5341/2505 3127/5340/2505 +f 3621/4080/2506 3578/4895/2506 3128/5283/2506 3129/5282/2506 +f 3625/4652/2507 3514/5004/2507 3130/5253/2507 3131/5252/2507 +f 3209/4066/2508 3597/4065/2508 3116/5284/2508 3121/5092/2508 +f 3598/4887/2509 3601/4886/2509 3118/5254/2509 3112/5374/2509 +f 3606/4060/2510 3207/4031/2510 3122/5470/2510 3114/5368/2510 +f 3602/4027/2511 3605/4026/2511 3120/5222/2511 3113/5371/2511 +f 3580/4911/2512 3598/4887/2512 3112/5374/2512 3115/5285/2512 +f 3516/5011/2513 3602/4027/2513 3113/5371/2513 3117/5255/2513 +f 3452/4907/2514 3606/4060/2514 3114/5368/2514 3119/5223/2514 +f 3597/4065/2515 3580/4911/2515 3115/5285/2515 3116/5284/2515 +f 3601/4886/2516 3516/5011/2516 3117/5255/2516 3118/5254/2516 +f 3605/4026/2517 3452/4907/2517 3119/5223/2517 3120/5222/2517 +f 3594/4627/2518 3204/4047/2518 3110/5472/2518 3101/5372/2518 +f 3592/5488/2519 3591/5489/2519 3102/5471/2519 3109/5195/2519 +f 3586/4885/2520 3589/4884/2520 3105/5467/2520 3103/5366/2520 +f 3584/5227/2521 3201/5490/2521 3111/5466/2521 3107/5224/2521 +f 3582/4659/2522 3594/4627/2522 3101/5372/2522 3108/5196/2522 +f 3518/4909/2523 3590/4891/2523 3102/5369/2523 3104/5311/2523 +f 3454/5063/2524 3586/4885/2524 3103/5366/2524 3106/5225/2524 +f 3589/4884/2525 3518/4909/2525 3104/5311/2525 3105/5310/2525 +f 3585/4038/2526 3454/5063/2526 3106/5225/2526 3107/5224/2526 +f 3593/4660/2527 3582/4659/2527 3108/5196/2527 3109/5195/2527 +f 3616/4611/2528 3390/4610/2528 3099/5167/2528 3096/5286/2528 +f 3612/4651/2529 3619/4650/2529 3090/5383/2529 3098/5185/2529 +f 3608/4647/2530 3615/4646/2530 3091/5381/2530 3094/5342/2530 +f 3386/4602/2531 3611/4601/2531 3092/5379/2531 3100/5465/2531 +f 3574/4658/2532 3618/4661/2532 3090/5383/2532 3095/5287/2532 +f 3510/4908/2533 3614/4883/2533 3091/5381/2533 3097/5186/2533 +f 3446/5062/2534 3610/4037/2534 3092/5379/2534 3093/5343/2534 +f 3609/4882/2535 3446/5062/2535 3093/5343/2535 3094/5342/2535 +f 3617/4626/2536 3574/4658/2536 3095/5287/2536 3096/5286/2536 +f 3613/4890/2537 3510/4908/2537 3097/5186/2537 3098/5185/2537 +f 3958/4592/2538 3384/4591/2538 3088/5164/2538 3079/5382/2538 +f 3962/4673/2539 3957/4672/2539 3085/5280/2539 3080/5380/2539 +f 3966/4019/2540 3961/4018/2540 3083/5314/2540 3081/5378/2540 +f 3380/4583/2541 3965/4582/2541 3087/5177/2541 3089/5163/2541 +f 3576/4914/2542 3958/4592/2542 3079/5382/2542 3084/5281/2542 +f 3512/5060/2543 3962/4673/2543 3080/5380/2543 3082/5315/2543 +f 3448/4912/2544 3966/4019/2544 3081/5378/2544 3086/5178/2544 +f 3961/4018/2545 3512/5060/2545 3082/5315/2545 3083/5314/2545 +f 3957/4672/2546 3576/4914/2546 3084/5281/2546 3085/5280/2546 +f 3965/4582/2547 3448/4912/2547 3086/5178/2547 3087/5177/2547 +f 3952/4581/2548 3375/4580/2548 3078/5487/2548 3074/5220/2548 +f 3948/4017/2549 3955/4016/2549 3070/5384/2549 3072/5316/2549 +f 3944/4671/2550 3951/4670/2550 3069/5385/2550 3076/5193/2550 +f 3377/4590/2551 3947/4589/2551 3068/5386/2551 3077/5161/2551 +f 3572/4920/2552 3946/4573/2552 3068/5386/2552 3075/5194/2552 +f 3508/4916/2553 3950/4681/2553 3069/5385/2553 3071/5317/2553 +f 3444/5084/2554 3954/4015/2554 3070/5384/2554 3073/5221/2554 +f 3949/4014/2555 3508/4916/2555 3071/5317/2555 3072/5316/2555 +f 3953/4563/2556 3444/5084/2556 3073/5221/2556 3074/5220/2556 +f 3945/4680/2557 3572/4920/2557 3075/5194/2557 3076/5193/2557 +f 3940/4562/2558 3369/4561/2558 3067/5158/2558 3061/5344/2558 +f 3936/4013/2559 3943/4012/2559 3059/5387/2559 3065/5250/2559 +f 3932/4679/2560 3939/4678/2560 3058/5388/2560 3063/5288/2560 +f 3371/4571/2561 3935/4570/2561 3057/5389/2561 3066/5159/2561 +f 3570/5036/2562 3934/4554/2562 3057/5389/2562 3062/5289/2562 +f 3506/4922/2563 3938/4689/2563 3058/5388/2563 3064/5251/2563 +f 3442/4918/2564 3942/4011/2564 3059/5387/2564 3060/5345/2564 +f 3941/4544/2565 3442/4918/2565 3060/5345/2565 3061/5344/2565 +f 3933/4688/2566 3570/5036/2566 3062/5289/2566 3063/5288/2566 +f 3937/4010/2567 3506/4922/2567 3064/5251/2567 3065/5250/2567 +f 3928/4543/2568 3363/4542/2568 3056/5486/2568 3054/5218/2568 +f 3924/4009/2569 3931/4008/2569 3048/5390/2569 3050/5318/2569 +f 3920/4687/2570 3927/4686/2570 3047/5391/2570 3052/5278/2570 +f 3365/4552/2571 3923/4551/2571 3046/5392/2571 3055/5156/2571 +f 3568/4924/2572 3922/4535/2572 3046/5392/2572 3051/5279/2572 +f 3504/5058/2573 3926/4697/2573 3047/5391/2573 3049/5319/2573 +f 3440/4926/2574 3930/4007/2574 3048/5390/2574 3053/5219/2574 +f 3925/4006/2575 3504/5058/2575 3049/5319/2575 3050/5318/2575 +f 3921/4696/2576 3568/4924/2576 3051/5279/2576 3052/5278/2576 +f 3929/4525/2577 3440/4926/2577 3053/5219/2577 3054/5218/2577 +f 3916/4524/2578 3357/4523/2578 3045/5153/2578 3043/5216/2578 +f 3912/4005/2579 3919/4004/2579 3037/5393/2579 3041/5248/2579 +f 3908/4695/2580 3915/4694/2580 3036/5394/2580 3039/5290/2580 +f 3359/4533/2581 3911/4532/2581 3035/5395/2581 3044/5154/2581 +f 3566/5034/2582 3910/4516/2582 3035/5395/2582 3038/5291/2582 +f 3502/4928/2583 3914/4705/2583 3036/5394/2583 3040/5249/2583 +f 3438/5082/2584 3918/4003/2584 3037/5393/2584 3042/5217/2584 +f 3909/4704/2585 3566/5034/2585 3038/5291/2585 3039/5290/2585 +f 3913/4002/2586 3502/4928/2586 3040/5249/2586 3041/5248/2586 +f 3917/4506/2587 3438/5082/2587 3042/5217/2587 3043/5216/2587 +f 3904/4505/2588 3351/4504/2588 3034/5485/2588 3028/5346/2588 +f 3900/4001/2589 3907/4000/2589 3026/5396/2589 3032/5246/2589 +f 3896/4703/2590 3903/4702/2590 3025/5397/2590 3030/5276/2590 +f 3353/4514/2591 3899/4513/2591 3024/5398/2591 3033/5151/2591 +f 3564/4932/2592 3898/4497/2592 3024/5398/2592 3029/5277/2592 +f 3500/5056/2593 3902/4713/2593 3025/5397/2593 3031/5247/2593 +f 3436/4930/2594 3906/3999/2594 3026/5396/2594 3027/5347/2594 +f 3905/4487/2595 3436/4930/2595 3027/5347/2595 3028/5346/2595 +f 3897/4712/2596 3564/4932/2596 3029/5277/2596 3030/5276/2596 +f 3901/3998/2597 3500/5056/2597 3031/5247/2597 3032/5246/2597 +f 3892/4486/2598 3345/4485/2598 3023/5148/2598 3021/5175/2598 +f 3888/3997/2599 3895/3996/2599 3015/5399/2599 3017/5320/2599 +f 3884/4711/2600 3891/4710/2600 3014/5400/2600 3019/5274/2600 +f 3347/4495/2601 3887/4494/2601 3013/5401/2601 3022/5149/2601 +f 3562/5032/2602 3886/4478/2602 3013/5401/2602 3018/5275/2602 +f 3498/4934/2603 3890/4721/2603 3014/5400/2603 3016/5321/2603 +f 3434/5080/2604 3894/3995/2604 3015/5399/2604 3020/5176/2604 +f 3889/3994/2605 3498/4934/2605 3016/5321/2605 3017/5320/2605 +f 3885/4720/2606 3562/5032/2606 3018/5275/2606 3019/5274/2606 +f 3893/4468/2607 3434/5080/2607 3020/5176/2607 3021/5175/2607 +f 3880/4467/2608 3339/4466/2608 3012/5484/2608 3006/5348/2608 +f 3876/3993/2609 3883/3992/2609 3004/5402/2609 3010/5183/2609 +f 3872/4719/2610 3879/4718/2610 3003/5403/2610 3008/5292/2610 +f 3341/4476/2611 3875/4475/2611 3002/5404/2611 3011/5146/2611 +f 3560/4938/2612 3874/4459/2612 3002/5404/2612 3007/5293/2612 +f 3496/5054/2613 3878/4729/2613 3003/5403/2613 3009/5184/2613 +f 3432/4936/2614 3882/3991/2614 3004/5402/2614 3005/5349/2614 +f 3881/4449/2615 3432/4936/2615 3005/5349/2615 3006/5348/2615 +f 3873/4728/2616 3560/4938/2616 3007/5293/2616 3008/5292/2616 +f 3877/3990/2617 3496/5054/2617 3009/5184/2617 3010/5183/2617 +f 3868/4448/2618 3333/4447/2618 3001/5143/2618 2997/5214/2618 +f 3864/3989/2619 3871/3988/2619 2993/5405/2619 2995/5322/2619 +f 3860/4727/2620 3867/4726/2620 2992/5406/2620 2999/5191/2620 +f 3335/4457/2621 3863/4456/2621 2991/5407/2621 3000/5144/2621 +f 3558/4944/2622 3862/4440/2622 2991/5407/2622 2998/5192/2622 +f 3494/4940/2623 3866/4737/2623 2992/5406/2623 2994/5323/2623 +f 3430/5078/2624 3870/3987/2624 2993/5405/2624 2996/5215/2624 +f 3865/3986/2625 3494/4940/2625 2994/5323/2625 2995/5322/2625 +f 3869/4430/2626 3430/5078/2626 2996/5215/2626 2997/5214/2626 +f 3861/4736/2627 3558/4944/2627 2998/5192/2627 2999/5191/2627 +f 3856/4429/2628 3327/4428/2628 2990/5483/2628 2984/5350/2628 +f 3852/3985/2629 3859/3984/2629 2982/5408/2629 2988/5244/2629 +f 3848/4735/2630 3855/4734/2630 2981/5409/2630 2986/5294/2630 +f 3329/4438/2631 3851/4437/2631 2980/5410/2631 2989/5141/2631 +f 3556/5030/2632 3850/4421/2632 2980/5410/2632 2985/5295/2632 +f 3492/4946/2633 3854/4745/2633 2981/5409/2633 2987/5245/2633 +f 3428/4942/2634 3858/3983/2634 2982/5408/2634 2983/5351/2634 +f 3857/4411/2635 3428/4942/2635 2983/5351/2635 2984/5350/2635 +f 3849/4744/2636 3556/5030/2636 2985/5295/2636 2986/5294/2636 +f 3853/3982/2637 3492/4946/2637 2987/5245/2637 2988/5244/2637 +f 3844/4410/2638 3321/4409/2638 2979/5138/2638 2977/5212/2638 +f 3840/3981/2639 3847/3980/2639 2971/5411/2639 2973/5324/2639 +f 3836/4743/2640 3843/4742/2640 2970/5412/2640 2975/5272/2640 +f 3323/4419/2641 3839/4418/2641 2969/5413/2641 2978/5139/2641 +f 3554/4948/2642 3838/4402/2642 2969/5413/2642 2974/5273/2642 +f 3490/5052/2643 3842/4753/2643 2970/5412/2643 2972/5325/2643 +f 3426/4950/2644 3846/3979/2644 2971/5411/2644 2976/5213/2644 +f 3841/3978/2645 3490/5052/2645 2972/5325/2645 2973/5324/2645 +f 3837/4752/2646 3554/4948/2646 2974/5273/2646 2975/5272/2646 +f 3845/4392/2647 3426/4950/2647 2976/5213/2647 2977/5212/2647 +f 3832/4391/2648 3315/4390/2648 2968/5482/2648 2966/5210/2648 +f 3828/3977/2649 3835/3976/2649 2960/5414/2649 2964/5242/2649 +f 3824/4751/2650 3831/4750/2650 2959/5415/2650 2962/5296/2650 +f 3317/4400/2651 3827/4399/2651 2958/5416/2651 2967/5136/2651 +f 3552/5028/2652 3826/4383/2652 2958/5416/2652 2961/5297/2652 +f 3488/4952/2653 3830/4761/2653 2959/5415/2653 2963/5243/2653 +f 3424/5076/2654 3834/3975/2654 2960/5414/2654 2965/5211/2654 +f 3825/4760/2655 3552/5028/2655 2961/5297/2655 2962/5296/2655 +f 3829/3974/2656 3488/4952/2656 2963/5243/2656 2964/5242/2656 +f 3833/4373/2657 3424/5076/2657 2965/5211/2657 2966/5210/2657 +f 3820/4372/2658 3309/4371/2658 2957/5133/2658 2951/5352/2658 +f 3816/3973/2659 3823/3972/2659 2949/5417/2659 2955/5240/2659 +f 3812/4759/2660 3819/4758/2660 2948/5418/2660 2953/5270/2660 +f 3311/4381/2661 3815/4380/2661 2947/5419/2661 2956/5134/2661 +f 3550/4956/2662 3814/4364/2662 2947/5419/2662 2952/5271/2662 +f 3486/5050/2663 3818/4769/2663 2948/5418/2663 2954/5241/2663 +f 3422/4954/2664 3822/3971/2664 2949/5417/2664 2950/5353/2664 +f 3821/4354/2665 3422/4954/2665 2950/5353/2665 2951/5352/2665 +f 3813/4768/2666 3550/4956/2666 2952/5271/2666 2953/5270/2666 +f 3817/3970/2667 3486/5050/2667 2954/5241/2667 2955/5240/2667 +f 3808/4353/2668 3303/4352/2668 2946/5481/2668 2944/5173/2668 +f 3804/3969/2669 3811/3968/2669 2938/5420/2669 2940/5326/2669 +f 3800/4767/2670 3807/4766/2670 2937/5421/2670 2942/5268/2670 +f 3305/4362/2671 3803/4361/2671 2936/5422/2671 2945/5131/2671 +f 3548/5026/2672 3802/4345/2672 2936/5422/2672 2941/5269/2672 +f 3484/4958/2673 3806/4777/2673 2937/5421/2673 2939/5327/2673 +f 3420/5074/2674 3810/3967/2674 2938/5420/2674 2943/5174/2674 +f 3805/3966/2675 3484/4958/2675 2939/5327/2675 2940/5326/2675 +f 3801/4776/2676 3548/5026/2676 2941/5269/2676 2942/5268/2676 +f 3809/4335/2677 3420/5074/2677 2943/5174/2677 2944/5173/2677 +f 3796/4334/2678 3297/4333/2678 2935/5128/2678 2929/5354/2678 +f 3792/3965/2679 3799/3964/2679 2927/5423/2679 2933/5181/2679 +f 3788/4775/2680 3795/4774/2680 2926/5424/2680 2931/5298/2680 +f 3299/4343/2681 3791/4342/2681 2925/5425/2681 2934/5129/2681 +f 3546/4962/2682 3790/4326/2682 2925/5425/2682 2930/5299/2682 +f 3482/5048/2683 3794/4785/2683 2926/5424/2683 2932/5182/2683 +f 3418/4960/2684 3798/3963/2684 2927/5423/2684 2928/5355/2684 +f 3797/4316/2685 3418/4960/2685 2928/5355/2685 2929/5354/2685 +f 3789/4784/2686 3546/4962/2686 2930/5299/2686 2931/5298/2686 +f 3793/3962/2687 3482/5048/2687 2932/5182/2687 2933/5181/2687 +f 3784/4315/2688 3291/4314/2688 2924/5480/2688 2920/5208/2688 +f 3780/3961/2689 3787/3960/2689 2916/5426/2689 2918/5328/2689 +f 3776/4783/2690 3783/4782/2690 2915/5427/2690 2922/5189/2690 +f 3293/4324/2691 3779/4323/2691 2914/5428/2691 2923/5126/2691 +f 3544/4968/2692 3778/4307/2692 2914/5428/2692 2921/5190/2692 +f 3480/4964/2693 3782/4793/2693 2915/5427/2693 2917/5329/2693 +f 3416/5072/2694 3786/3959/2694 2916/5426/2694 2919/5209/2694 +f 3781/3958/2695 3480/4964/2695 2917/5329/2695 2918/5328/2695 +f 3785/4297/2696 3416/5072/2696 2919/5209/2696 2920/5208/2696 +f 3777/4792/2697 3544/4968/2697 2921/5190/2697 2922/5189/2697 +f 3772/4296/2698 3285/4295/2698 2913/5123/2698 2895/5356/2698 +f 3768/3957/2699 3775/3956/2699 2888/5429/2699 2909/5238/2699 +f 3764/4791/2700 3771/4790/2700 2885/5430/2700 2902/5300/2700 +f 3287/4305/2701 3767/4304/2701 2881/5431/2701 2912/5124/2701 +f 3542/5024/2702 3766/4288/2702 2881/5431/2702 2899/5301/2702 +f 3478/4970/2703 3770/4801/2703 2885/5430/2703 2906/5239/2703 +f 3414/4966/2704 3774/3955/2704 2888/5429/2704 2892/5357/2704 +f 3773/4278/2705 3414/4966/2705 2892/5357/2705 2895/5356/2705 +f 3765/4800/2706 3542/5024/2706 2899/5301/2706 2902/5300/2706 +f 3769/3954/2707 3478/4970/2707 2906/5239/2707 2909/5238/2707 +f 3760/4277/2708 3279/4276/2708 2878/5479/2708 2871/5206/2708 +f 3756/3953/2709 3763/3952/2709 2850/5432/2709 2857/5330/2709 +f 3752/4799/2710 3759/4798/2710 2846/5433/2710 2864/5266/2710 +f 3281/4286/2711 3755/4285/2711 2843/5434/2711 2874/5121/2711 +f 3540/4972/2712 3754/4269/2712 2843/5434/2712 2860/5267/2712 +f 3476/5046/2713 3758/4809/2713 2846/5433/2713 2853/5331/2713 +f 3412/4974/2714 3762/3951/2714 2850/5432/2714 2867/5207/2714 +f 3757/3950/2715 3476/5046/2715 2853/5331/2715 2857/5330/2715 +f 3753/4808/2716 3540/4972/2716 2860/5267/2716 2864/5266/2716 +f 3761/4259/2717 3412/4974/2717 2867/5207/2717 2871/5206/2717 +f 3748/4258/2718 3273/4257/2718 2839/5118/2718 2832/5204/2718 +f 3744/3949/2719 3751/3948/2719 2811/5435/2719 2825/5236/2719 +f 3740/4807/2720 3747/4806/2720 2808/5436/2720 2818/5302/2720 +f 3275/4267/2721 3743/4266/2721 2804/5437/2721 2836/5119/2721 +f 3538/5022/2722 3742/4250/2722 2804/5437/2722 2815/5303/2722 +f 3474/4976/2723 3746/4817/2723 2808/5436/2723 2822/5237/2723 +f 3410/5070/2724 3750/3947/2724 2811/5435/2724 2829/5205/2724 +f 3741/4816/2725 3538/5022/2725 2815/5303/2725 2818/5302/2725 +f 3745/3946/2726 3474/4976/2726 2822/5237/2726 2825/5236/2726 +f 3749/4240/2727 3410/5070/2727 2829/5205/2727 2832/5204/2727 +f 3736/4239/2728 3267/4238/2728 2801/5478/2728 2780/5358/2728 +f 3732/3945/2729 3739/3944/2729 2773/5438/2729 2794/5234/2729 +f 3728/4815/2730 3735/4814/2730 2769/5439/2730 2787/5264/2730 +f 3269/4248/2731 3731/4247/2731 2766/5440/2731 2797/5116/2731 +f 3536/4980/2732 3730/4231/2732 2766/5440/2732 2783/5265/2732 +f 3472/5044/2733 3734/4825/2733 2769/5439/2733 2790/5235/2733 +f 3408/4978/2734 3738/3943/2734 2773/5438/2734 2776/5359/2734 +f 3737/4221/2735 3408/4978/2735 2776/5359/2735 2780/5358/2735 +f 3729/4824/2736 3536/4980/2736 2783/5265/2736 2787/5264/2736 +f 3733/3942/2737 3472/5044/2737 2790/5235/2737 2794/5234/2737 +f 3724/4220/2738 3261/4219/2738 2762/5113/2738 2755/5171/2738 +f 3720/3941/2739 3727/3940/2739 2734/5441/2739 2741/5332/2739 +f 3716/4823/2740 3723/4822/2740 2731/5442/2740 2748/5262/2740 +f 3263/4229/2741 3719/4228/2741 2727/5443/2741 2759/5114/2741 +f 3534/5020/2742 3718/4212/2742 2727/5443/2742 2745/5263/2742 +f 3470/4982/2743 3722/4833/2743 2731/5442/2743 2738/5333/2743 +f 3406/5068/2744 3726/3939/2744 2734/5441/2744 2752/5172/2744 +f 3721/3938/2745 3470/4982/2745 2738/5333/2745 2741/5332/2745 +f 3717/4832/2746 3534/5020/2746 2745/5263/2746 2748/5262/2746 +f 3725/4202/2747 3406/5068/2747 2752/5172/2747 2755/5171/2747 +f 3712/4201/2748 3255/4200/2748 3968/5477/2748 3974/5360/2748 +f 3708/3937/2749 3715/3936/2749 3976/5444/2749 3970/5179/2749 +f 3704/4831/2750 3711/4830/2750 3977/5445/2750 3972/5304/2750 +f 3257/4210/2751 3707/4209/2751 3978/5446/2751 3969/5111/2751 +f 3532/4986/2752 3706/4193/2752 3978/5446/2752 3973/5305/2752 +f 3468/5042/2753 3710/4841/2753 3977/5445/2753 3971/5180/2753 +f 3404/4984/2754 3714/3935/2754 3976/5444/2754 3975/5361/2754 +f 3713/4183/2755 3404/4984/2755 3975/5361/2755 3974/5360/2755 +f 3705/4840/2756 3532/4986/2756 3973/5305/2756 3972/5304/2756 +f 3709/3934/2757 3468/5042/2757 3971/5180/2757 3970/5179/2757 +f 4117/5491/2758 4011/5492/2758 3980/4059/2758 3979/4058/2758 4116/5493/2758 +f 4118/5494/2759 3981/4074/2759 3980/4059/2759 4011/5492/2759 4092/5495/2759 +f 3984/4123/2760 4120/5496/2760 4098/3160/2760 4012/3159/2760 3985/4142/2760 +f 4122/5497/2761 3986/4161/2761 3985/4142/2761 4012/3159/2761 4100/3161/2761 +f 3989/4218/2762 3988/4199/2762 4124/5498/2762 4125/5499/2762 +f 3990/4237/2763 3989/4218/2763 4125/5499/2763 4127/5500/2763 +f 3991/4256/2764 3990/4237/2764 4127/5500/2764 4128/5501/2764 +f 4078/5502/2765 3994/4313/2765 3993/4294/2765 4130/5503/2765 +f 4131/5504/2766 3995/4332/2766 3994/4313/2766 4078/5502/2766 +f 4079/5505/2767 3998/4389/2767 3997/4370/2767 4080/5506/2767 +f 4081/5507/2768 3999/4408/2768 3998/4389/2768 4079/5505/2768 +f 4082/5508/2769 4000/4427/2769 3999/4408/2769 4081/5507/2769 +f 4084/5509/2770 4003/4484/2770 4002/4465/2770 4083/5510/2770 +f 4085/5511/2771 4004/4503/2771 4003/4484/2771 4084/5509/2771 +f 4086/5512/2772 4007/4560/2772 4006/4541/2772 4087/5513/2772 +f 4008/4579/2773 4007/4560/2773 4086/5512/2773 4088/3163/2773 4013/3162/2773 +f 4089/5514/2774 4009/4598/2774 4008/4579/2774 4013/3162/2774 4090/3165/2774 +f 4092/5495/1555 4011/5492/1555 4094/5515/1555 +f 4115/5516/2775 4020/5517/2775 4113/5518/2775 4112/5519/2775 4114/5520/2775 4010/4617/2775 4009/4598/2775 4089/5514/2775 +f 4116/5493/2776 3979/4058/2776 4010/4617/2776 4114/5520/2776 4119/5521/2776 4021/5522/2776 4121/5523/2776 +f 4094/5515/1555 4011/5492/1555 4117/5491/1555 +f 4154/5524/2777 4028/5525/2777 4153/5526/2777 4152/5527/2777 4005/4522/2777 4004/4503/2777 4085/5511/2777 +f 4158/5528/2778 4029/5529/2778 4155/5530/2778 4087/5513/2778 4006/4541/2778 4005/4522/2778 4152/5527/2778 4159/5531/2778 +f 4187/5532/2779 4036/5533/2779 4186/5534/2779 4184/5535/2779 4185/5536/2779 4001/4446/2779 4000/4427/2779 4082/5508/2779 +f 4185/5536/2780 4192/5537/2780 4037/5538/2780 4190/5539/2780 4083/5510/2780 4002/4465/2780 4001/4446/2780 +f 4216/5540/2781 4044/5541/2781 4213/5542/2781 4214/5543/2781 3996/4351/2781 3995/4332/2781 4131/5504/2781 +f 4218/5544/2782 4045/5545/2782 4219/5546/2782 4080/5506/2782 3997/4370/2782 3996/4351/2782 4214/5543/2782 4217/5547/2782 +f 4141/5548/2783 4052/5549/2783 4138/5550/2783 4140/5551/2783 4137/5552/2783 3992/4275/2783 3991/4256/2783 4128/5501/2783 +f 3993/4294/2784 3992/4275/2784 4137/5552/2784 4143/5553/2784 4053/5554/2784 4146/5555/2784 4130/5503/2784 +f 4171/5556/2785 4060/5557/2785 4169/5558/2785 4170/5559/2785 3987/4180/2785 3986/4161/2785 4122/5497/2785 +f 4176/5560/2786 4061/5561/2786 4173/5562/2786 4124/5498/2786 3988/4199/2786 3987/4180/2786 4170/5559/2786 4175/5563/2786 +f 4069/5564/2787 4068/5565/2787 3982/4089/2787 3981/4074/2787 4118/5494/2787 4195/5566/2787 +f 4202/5567/2788 4070/5568/2788 4198/5569/2788 4197/5570/2788 3983/4104/2788 3982/4089/2788 4068/5565/2788 4201/5571/2788 4203/5572/2788 +f 4120/5496/2789 3984/4123/2789 3983/4104/2789 4197/5570/2789 +o WBL_b1.003_Cylinder.034 +v 0.368342 0.079861 1.077260 +v 0.332479 0.079851 1.080433 +v 0.306225 0.079844 1.089103 +v 0.332479 0.079851 1.381048 +v 0.306225 0.079844 1.372378 +v 0.375873 0.003621 1.077260 +v 0.340700 -0.003385 1.080433 +v 0.314952 -0.008514 1.089103 +v 0.340700 -0.003385 1.381048 +v 0.314952 -0.008514 1.372378 +v 0.398131 -0.069684 1.077260 +v 0.365002 -0.083417 1.080433 +v 0.340750 -0.093471 1.089103 +v 0.365002 -0.083417 1.381048 +v 0.340750 -0.093471 1.372378 +v 0.434264 -0.137239 1.077260 +v 0.404450 -0.157171 1.080433 +v 0.382625 -0.171763 1.089103 +v 0.404450 -0.157171 1.381048 +v 0.382625 -0.171763 1.372378 +v 0.482881 -0.196446 1.077260 +v 0.457529 -0.221812 1.080433 +v 0.438970 -0.240381 1.089103 +v 0.457529 -0.221812 1.381048 +v 0.438970 -0.240381 1.372378 +v 0.542115 -0.245030 1.077260 +v 0.522198 -0.274855 1.080433 +v 0.507619 -0.296689 1.089103 +v 0.958475 -0.332859 1.303440 +v 0.522199 -0.274856 1.381048 +v 0.507619 -0.296689 1.372378 +v 0.609689 -0.281126 1.077260 +v 0.934694 -0.343520 1.238993 +v 0.595974 -0.314263 1.080433 +v 0.585933 -0.338521 1.089103 +v 0.958475 -0.332860 1.174546 +v 0.595974 -0.314263 1.381048 +v 0.585934 -0.338521 1.372378 +v 0.683007 -0.303345 1.077260 +v 0.933320 -0.340205 1.230741 +v 0.676020 -0.338521 1.080433 +v 0.670905 -0.364271 1.089103 +v 0.934694 -0.343520 1.222489 +v 0.676020 -0.338521 1.381048 +v 0.670905 -0.364271 1.372378 +v 0.759250 -0.310833 1.077260 +v 0.956914 -0.329629 1.294684 +v 0.759260 -0.346696 1.080433 +v 0.759267 -0.372950 1.089103 +v 0.958475 -0.332860 1.286936 +v 0.759260 -0.346696 1.381048 +v 0.759267 -0.372950 1.372378 +v 0.835489 -0.303303 1.077260 +v 0.956914 -0.329629 1.166797 +v 0.842496 -0.338475 1.080433 +v 0.847625 -0.364223 1.089103 +v 0.958475 -0.332859 1.158042 +v 0.842496 -0.338475 1.381048 +v 0.847625 -0.364223 1.372378 +v 0.908795 -0.281044 1.077260 +v 0.934694 -0.343520 1.359635 +v 0.922529 -0.314174 1.080433 +v 0.932582 -0.338426 1.089103 +v 0.934694 -0.343519 1.101847 +v 0.922529 -0.314174 1.381048 +v 0.932582 -0.338426 1.372378 +v 0.976349 -0.244912 1.077260 +v 1.035183 -0.286040 1.303440 +v 0.996282 -0.274726 1.080433 +v 1.010874 -0.296551 1.089103 +v 1.013939 -0.301134 1.238993 +v 0.996282 -0.274726 1.381048 +v 1.010874 -0.296551 1.372378 +v 1.035557 -0.196295 1.077260 +v 1.035183 -0.286040 1.174546 +v 1.060923 -0.221647 1.080433 +v 1.079492 -0.240206 1.089103 +v 1.033023 -0.283175 1.166797 +v 1.060923 -0.221647 1.381048 +v 1.079492 -0.240206 1.372378 +v 1.084142 -0.137061 1.077260 +v 1.035183 -0.286040 1.158042 +v 1.113966 -0.156977 1.080433 +v 1.135800 -0.171557 1.089103 +v 1.033023 -0.283175 1.294684 +v 1.113966 -0.156977 1.381048 +v 1.135800 -0.171557 1.372378 +v 1.120237 -0.069486 1.077260 +v 1.035183 -0.286040 1.286936 +v 1.153374 -0.083201 1.080433 +v 1.177632 -0.093242 1.089103 +v 1.011945 -0.298151 1.230741 +v 1.153374 -0.083201 1.381048 +v 1.177632 -0.093242 1.372378 +v 1.142456 0.003832 1.077260 +v 1.013939 -0.301134 1.222489 +v 1.177632 -0.003156 1.080433 +v 1.203382 -0.008270 1.089103 +v 1.013939 -0.301134 1.359635 +v 1.177632 -0.003156 1.381048 +v 1.203382 -0.008270 1.372378 +v 1.149944 0.080075 1.077260 +v 1.013939 -0.301134 1.101847 +v 1.185807 0.080085 1.080433 +v 1.212061 0.080092 1.089103 +v 1.101284 -0.225154 1.303440 +v 1.185807 0.080085 1.381048 +v 1.212061 0.080092 1.372378 +v 1.142414 0.156314 1.077260 +v 1.083393 -0.244103 1.238993 +v 1.177586 0.163321 1.080433 +v 1.203334 0.168450 1.089103 +v 1.101284 -0.225154 1.174546 +v 1.177586 0.163321 1.381048 +v 1.203334 0.168449 1.372378 +v 1.120155 0.229620 1.077260 +v 1.098606 -0.222766 1.294684 +v 1.153285 0.243353 1.080433 +v 1.177537 0.253407 1.089103 +v 1.101284 -0.225154 1.286936 +v 1.153285 0.243353 1.381048 +v 1.177537 0.253407 1.372378 +v 1.084023 0.297174 1.077260 +v 1.080855 -0.241566 1.230741 +v 1.113836 0.317107 1.080433 +v 1.135662 0.331699 1.089103 +v 1.083393 -0.244103 1.222489 +v 1.113837 0.317107 1.381048 +v 1.135662 0.331699 1.372378 +v 1.035405 0.356381 1.077260 +v 1.098606 -0.222766 1.166797 +v 1.060758 0.381748 1.080433 +v 1.079317 0.400317 1.089103 +v 1.101284 -0.225154 1.158042 +v 1.060758 0.381748 1.381048 +v 1.079317 0.400317 1.372378 +v 0.976171 0.404967 1.077260 +v 1.083393 -0.244103 1.359635 +v 0.996088 0.434791 1.080433 +v 1.010668 0.456624 1.089103 +v 1.083393 -0.244103 1.101847 +v 0.996088 0.434791 1.381048 +v 1.010668 0.456624 1.372378 +v 0.908597 0.441062 1.077260 +v 1.154236 -0.152543 1.303440 +v 0.922312 0.474199 1.080433 +v 0.932353 0.498457 1.089103 +v 1.140385 -0.174618 1.238993 +v 0.922312 0.474199 1.381048 +v 0.932353 0.498457 1.372378 +v 0.835279 0.463280 1.077260 +v 1.154236 -0.152543 1.174546 +v 0.842266 0.498457 1.080433 +v 0.847381 0.524207 1.089103 +v 1.137402 -0.172625 1.230741 +v 0.842266 0.498457 1.381048 +v 0.847381 0.524207 1.372378 +v 0.759036 0.470769 1.077260 +v 1.140385 -0.174618 1.222489 +v 0.759026 0.506632 1.080433 +v 0.759019 0.532886 1.089103 +v 1.151144 -0.150723 1.294684 +v 0.759026 0.506632 1.381048 +v 0.759019 0.532886 1.372378 +v 0.682796 0.463238 1.077260 +v 1.154236 -0.152543 1.286936 +v 0.675790 0.498411 1.080433 +v 0.670661 0.524159 1.089103 +v 1.151144 -0.150723 1.166797 +v 0.675790 0.498411 1.381048 +v 0.670661 0.524159 1.372378 +v 0.609491 0.440980 1.077260 +v 1.154236 -0.152543 1.158042 +v 0.595758 0.474109 1.080433 +v 0.585704 0.498362 1.089103 +v 1.140385 -0.174618 1.359635 +v 0.595758 0.474109 1.381048 +v 0.585704 0.498362 1.372379 +v 0.541937 0.404847 1.077260 +v 1.140385 -0.174618 1.101847 +v 0.522004 0.434661 1.080433 +v 0.507412 0.456486 1.089103 +v 1.192005 -0.070996 1.303440 +v 0.522004 0.434661 1.381048 +v 0.507412 0.456486 1.372379 +v 0.482729 0.356229 1.077260 +v 1.182727 -0.095349 1.238993 +v 0.457363 0.381582 1.080433 +v 0.438794 0.400141 1.089103 +v 1.192005 -0.070996 1.174546 +v 0.457363 0.381582 1.381048 +v 0.438794 0.400141 1.372379 +v 0.434144 0.296995 1.077260 +v 1.188617 -0.069815 1.166797 +v 0.404320 0.316912 1.080433 +v 0.382487 0.331492 1.089103 +v 1.192005 -0.070996 1.158042 +v 0.404320 0.316912 1.381048 +v 0.382487 0.331492 1.372379 +v 0.398049 0.229421 1.077260 +v 1.188617 -0.069815 1.294684 +v 0.364913 0.243137 1.080433 +v 0.340654 0.253177 1.089103 +v 1.192005 -0.070996 1.286936 +v 0.364913 0.243137 1.381048 +v 0.340654 0.253177 1.372379 +v 0.375831 0.156104 1.077260 +v 1.179412 -0.093977 1.230741 +v 0.340655 0.163091 1.080433 +v 0.314904 0.168205 1.089103 +v 1.182727 -0.095349 1.222489 +v 0.340655 0.163091 1.381048 +v 0.314904 0.168205 1.372378 +v 1.182727 -0.095350 1.359635 +v 1.182727 -0.095349 1.101847 +v 1.213140 0.016351 1.303440 +v 1.208791 -0.009344 1.238993 +v 1.213140 0.016351 1.174546 +v 1.205271 -0.008645 1.230741 +v 1.208791 -0.009344 1.222489 +v 1.209586 0.016849 1.166797 +v 1.213140 0.016352 1.158042 +v 1.209586 0.016849 1.294684 +v 1.213140 0.016351 1.286936 +v 1.208791 -0.009344 1.359635 +v 1.208791 -0.009344 1.101847 +v 1.216827 0.106144 1.303440 +v 1.217575 0.080094 1.238993 +v 1.216827 0.106144 1.174546 +v 1.213244 0.105939 1.166797 +v 1.216827 0.106144 1.158042 +v 1.213244 0.105939 1.294684 +v 1.216827 0.106144 1.286936 +v 1.213987 0.080093 1.230741 +v 1.217575 0.080094 1.222489 +v 1.217575 0.080094 1.359635 +v 1.217575 0.080094 1.101847 +v 1.202926 0.194931 1.303440 +v 1.208742 0.169528 1.238993 +v 1.202926 0.194931 1.174546 +v 1.205223 0.168827 1.230741 +v 1.208742 0.169528 1.222489 +v 1.199452 0.194031 1.294684 +v 1.202926 0.194931 1.286936 +v 1.199452 0.194031 1.166797 +v 1.202926 0.194931 1.158042 +v 1.208741 0.169527 1.359635 +v 1.208741 0.169527 1.101847 +v 1.171970 0.279300 1.303440 +v 1.182630 0.255519 1.238993 +v 1.171971 0.279300 1.174546 +v 1.168739 0.277740 1.166797 +v 1.171970 0.279300 1.158042 +v 1.168739 0.277740 1.294684 +v 1.171971 0.279300 1.286936 +v 1.179316 0.254145 1.230741 +v 1.182630 0.255519 1.222489 +v 1.182631 0.255519 1.359635 +v 1.182630 0.255519 1.101847 +v 1.125151 0.356008 1.303440 +v 1.140245 0.334764 1.238993 +v 1.125151 0.356008 1.174546 +v 1.122286 0.353848 1.294684 +v 1.125151 0.356008 1.286936 +v 1.137262 0.332770 1.230741 +v 1.140245 0.334764 1.222489 +v 1.122286 0.353848 1.166797 +v 1.125150 0.356008 1.158042 +v 1.140245 0.334764 1.359635 +v 1.140245 0.334764 1.101847 +v 1.064265 0.422108 1.303440 +v 1.083214 0.404218 1.238993 +v 1.064265 0.422109 1.174546 +v 1.080677 0.401680 1.230741 +v 1.083214 0.404218 1.222489 +v 1.061877 0.419431 1.294684 +v 1.064265 0.422109 1.286936 +v 1.061877 0.419431 1.166797 +v 1.064265 0.422108 1.158042 +v 1.083214 0.404217 1.359635 +v 1.083214 0.404217 1.101847 +v 0.991654 0.475061 1.303440 +v 1.013729 0.461210 1.238993 +v 0.991654 0.475061 1.174546 +v 0.989834 0.471968 1.166797 +v 0.991654 0.475061 1.158042 +v 0.989834 0.471968 1.294684 +v 0.991654 0.475061 1.286936 +v 1.011736 0.458226 1.230741 +v 1.013729 0.461210 1.222489 +v 1.013729 0.461210 1.359635 +v 1.013729 0.461210 1.101847 +v 0.910107 0.512830 1.303440 +v 0.934460 0.503552 1.238993 +v 0.910107 0.512830 1.174546 +v 0.933088 0.500237 1.230741 +v 0.934460 0.503552 1.222489 +v 0.908926 0.509442 1.166797 +v 0.910107 0.512830 1.158042 +v 0.908926 0.509442 1.294684 +v 0.910107 0.512830 1.286936 +v 0.934460 0.503552 1.359635 +v 0.934460 0.503552 1.101847 +v 0.822759 0.533964 1.303440 +v 0.848454 0.529616 1.238993 +v 0.822759 0.533964 1.174546 +v 0.822261 0.530410 1.166797 +v 0.822759 0.533964 1.158042 +v 0.822261 0.530410 1.294684 +v 0.822759 0.533964 1.286936 +v 0.847755 0.526096 1.230741 +v 0.848454 0.529616 1.222489 +v 0.848454 0.529615 1.359635 +v 0.848454 0.529615 1.101847 +v 0.732967 0.537651 1.303440 +v 0.759016 0.538399 1.238993 +v 0.732967 0.537651 1.174546 +v 0.759017 0.534811 1.230741 +v 0.759016 0.538399 1.222489 +v 0.733171 0.534069 1.294684 +v 0.732967 0.537651 1.286936 +v 0.733171 0.534069 1.166797 +v 0.732967 0.537651 1.158042 +v 0.759017 0.538399 1.359635 +v 0.759017 0.538399 1.101847 +v 0.644180 0.523750 1.303440 +v 0.669583 0.529566 1.238993 +v 0.644180 0.523750 1.174546 +v 0.645080 0.520277 1.166797 +v 0.644180 0.523750 1.158042 +v 0.645080 0.520277 1.294684 +v 0.644180 0.523750 1.286936 +v 0.670284 0.526047 1.230741 +v 0.669583 0.529566 1.222489 +v 0.669584 0.529566 1.359635 +v 0.669584 0.529566 1.101847 +v 0.559811 0.492795 1.303440 +v 0.583592 0.503455 1.238993 +v 0.559811 0.492795 1.174546 +v 0.561371 0.489564 1.294685 +v 0.559811 0.492795 1.286936 +v 0.584966 0.500140 1.230741 +v 0.583592 0.503455 1.222489 +v 0.561371 0.489564 1.166797 +v 0.559811 0.492795 1.158042 +v 0.583592 0.503455 1.359635 +v 0.583592 0.503455 1.101847 +v 0.483103 0.445975 1.303440 +v 0.504347 0.461069 1.238993 +v 0.483103 0.445975 1.174546 +v 0.506341 0.458086 1.230741 +v 0.504347 0.461069 1.222489 +v 0.485263 0.443110 1.294685 +v 0.483103 0.445975 1.286936 +v 0.485263 0.443110 1.166797 +v 0.483103 0.445975 1.158042 +v 0.504347 0.461069 1.359635 +v 0.504347 0.461069 1.101847 +v 0.417003 0.385089 1.303440 +v 0.434894 0.404038 1.238993 +v 0.417002 0.385089 1.174546 +v 0.419680 0.382701 1.166797 +v 0.417003 0.385089 1.158042 +v 0.419680 0.382701 1.294685 +v 0.417002 0.385089 1.286936 +v 0.437431 0.401501 1.230741 +v 0.434894 0.404038 1.222489 +v 0.434894 0.404038 1.359635 +v 0.434894 0.404038 1.101847 +v 0.364050 0.312478 1.303440 +v 0.377901 0.334553 1.238993 +v 0.364050 0.312478 1.174546 +v 0.380885 0.332560 1.230741 +v 0.377901 0.334553 1.222489 +v 0.367143 0.310658 1.166797 +v 0.364050 0.312478 1.158042 +v 0.367143 0.310658 1.294685 +v 0.364050 0.312478 1.286936 +v 0.377901 0.334553 1.359635 +v 0.377901 0.334553 1.101847 +v 0.326282 0.230931 1.303440 +v 0.335559 0.255285 1.238993 +v 0.326281 0.230932 1.174546 +v 0.338875 0.253912 1.230741 +v 0.335559 0.255285 1.222489 +v 0.329669 0.229750 1.294684 +v 0.326281 0.230932 1.286936 +v 0.329669 0.229750 1.166797 +v 0.326282 0.230931 1.158042 +v 0.335559 0.255284 1.359635 +v 0.335559 0.255284 1.101847 +v 0.305147 0.143583 1.286936 +v 0.309495 0.169278 1.222489 +v 0.305147 0.143583 1.158042 +v 0.308701 0.143086 1.166797 +v 0.305147 0.143583 1.174546 +v 0.308701 0.143086 1.294684 +v 0.305147 0.143583 1.303440 +v 0.313015 0.168580 1.230741 +v 0.309495 0.169278 1.238993 +v 0.309496 0.169279 1.359635 +v 0.309496 0.169279 1.101847 +v 0.301460 0.053791 1.303440 +v 0.300712 0.079841 1.238993 +v 0.301460 0.053791 1.174546 +v 0.304300 0.079842 1.230741 +v 0.300712 0.079841 1.222489 +v 0.305042 0.053996 1.166797 +v 0.301460 0.053791 1.158042 +v 0.305042 0.053996 1.294684 +v 0.301460 0.053791 1.286936 +v 0.300712 0.079842 1.359635 +v 0.300712 0.079842 1.101847 +v 0.315361 -0.034995 1.286936 +v 0.309545 -0.009592 1.222489 +v 0.315361 -0.034995 1.158042 +v 0.318834 -0.034095 1.294684 +v 0.315361 -0.034995 1.303440 +v 0.313064 -0.008891 1.230741 +v 0.309545 -0.009592 1.238993 +v 0.318834 -0.034095 1.166797 +v 0.315361 -0.034995 1.174546 +v 0.309545 -0.009592 1.359635 +v 0.309545 -0.009592 1.101847 +v 0.346316 -0.119364 1.286936 +v 0.335656 -0.095583 1.222489 +v 0.346316 -0.119364 1.158042 +v 0.349547 -0.117804 1.166797 +v 0.346316 -0.119364 1.174546 +v 0.349547 -0.117804 1.294684 +v 0.346316 -0.119364 1.303440 +v 0.338971 -0.094209 1.230741 +v 0.335656 -0.095583 1.238993 +v 0.335656 -0.095583 1.359635 +v 0.335656 -0.095583 1.101847 +v 0.393136 -0.196072 1.303440 +v 0.378042 -0.174828 1.238993 +v 0.393136 -0.196072 1.174546 +v 0.381025 -0.172834 1.230741 +v 0.378042 -0.174828 1.222489 +v 0.396001 -0.193912 1.294684 +v 0.393136 -0.196072 1.286936 +v 0.396001 -0.193912 1.166797 +v 0.393136 -0.196072 1.158042 +v 0.378042 -0.174828 1.359635 +v 0.378042 -0.174828 1.101847 +v 0.454021 -0.262173 1.303440 +v 0.435072 -0.244282 1.238993 +v 0.454021 -0.262173 1.174546 +v 0.456409 -0.259495 1.166797 +v 0.454021 -0.262173 1.158042 +v 0.456409 -0.259495 1.294684 +v 0.454021 -0.262173 1.286936 +v 0.437609 -0.241744 1.230741 +v 0.435072 -0.244282 1.222489 +v 0.435073 -0.244281 1.359635 +v 0.435073 -0.244281 1.101847 +v 0.526632 -0.315125 1.303440 +v 0.504558 -0.301275 1.238993 +v 0.526633 -0.315125 1.174546 +v 0.528452 -0.312033 1.294684 +v 0.526633 -0.315125 1.286936 +v 0.506550 -0.298290 1.230741 +v 0.504558 -0.301275 1.222489 +v 0.528452 -0.312033 1.166797 +v 0.526632 -0.315125 1.158042 +v 0.504557 -0.301274 1.359635 +v 0.504557 -0.301274 1.101847 +v 0.785319 -0.377716 1.303440 +v 0.759270 -0.378464 1.238993 +v 0.785319 -0.377716 1.174546 +v 0.759269 -0.374876 1.230741 +v 0.759270 -0.378464 1.222489 +v 0.785114 -0.374134 1.166797 +v 0.785319 -0.377716 1.158042 +v 0.785114 -0.374134 1.294684 +v 0.785319 -0.377716 1.286936 +v 0.759270 -0.378464 1.359635 +v 0.759270 -0.378463 1.101847 +v 0.695527 -0.374029 1.303440 +v 0.669832 -0.369680 1.238993 +v 0.695527 -0.374029 1.174546 +v 0.696025 -0.370475 1.166797 +v 0.695527 -0.374029 1.158042 +v 0.696025 -0.370475 1.294684 +v 0.695527 -0.374029 1.286936 +v 0.670531 -0.366161 1.230741 +v 0.669832 -0.369680 1.222489 +v 0.669832 -0.369680 1.359635 +v 0.669832 -0.369680 1.101847 +v 0.608179 -0.352894 1.303440 +v 0.583826 -0.343616 1.238993 +v 0.608179 -0.352894 1.174546 +v 0.585198 -0.340301 1.230741 +v 0.583826 -0.343616 1.222489 +v 0.609361 -0.349506 1.294684 +v 0.608179 -0.352894 1.286936 +v 0.609361 -0.349506 1.166797 +v 0.608179 -0.352894 1.158042 +v 0.583826 -0.343616 1.359635 +v 0.583826 -0.343616 1.101847 +v 0.297507 0.088918 1.100946 +v 0.297513 0.070763 1.100946 +v 0.298974 0.079841 1.098041 +v 0.297513 0.070763 1.360535 +v 0.297507 0.088918 1.360535 +v 0.298974 0.079841 1.363441 +v 0.304632 -0.001315 1.100946 +v 0.308178 -0.019119 1.100946 +v 0.307840 -0.009931 1.098041 +v 0.308178 -0.019119 1.360535 +v 0.304632 -0.001315 1.360535 +v 0.307840 -0.009931 1.363441 +v 0.329223 -0.088424 1.100946 +v 0.336174 -0.105194 1.100946 +v 0.334050 -0.096248 1.098041 +v 0.336174 -0.105194 1.360535 +v 0.329223 -0.088424 1.360535 +v 0.334050 -0.096248 1.363441 +v 0.370335 -0.169062 1.100946 +v 0.380425 -0.184154 1.100946 +v 0.376596 -0.175794 1.098041 +v 0.380425 -0.184154 1.360535 +v 0.370335 -0.169062 1.360535 +v 0.376596 -0.175794 1.363441 +v 0.426389 -0.240129 1.100946 +v 0.439229 -0.252963 1.100946 +v 0.433843 -0.245511 1.098041 +v 0.439229 -0.252963 1.360535 +v 0.426389 -0.240129 1.360535 +v 0.433843 -0.245511 1.363441 +v 0.495230 -0.298896 1.100946 +v 0.510328 -0.308978 1.100946 +v 0.503592 -0.302720 1.098041 +v 0.510328 -0.308978 1.360535 +v 0.495230 -0.298896 1.360535 +v 0.503592 -0.302720 1.363441 +v 0.574214 -0.343103 1.100946 +v 0.590989 -0.350046 1.100946 +v 0.583160 -0.345222 1.098041 +v 0.590989 -0.350046 1.360535 +v 0.574214 -0.343103 1.360535 +v 0.583160 -0.345222 1.363441 +v 0.660304 -0.371052 1.100946 +v 0.678111 -0.374589 1.100946 +v 0.669492 -0.371385 1.098041 +v 0.678111 -0.374589 1.360535 +v 0.660305 -0.371052 1.360535 +v 0.669492 -0.371385 1.363441 +v 0.750193 -0.381668 1.100946 +v 0.768348 -0.381663 1.100946 +v 0.759269 -0.380202 1.098041 +v 0.768348 -0.381663 1.360535 +v 0.750193 -0.381668 1.360535 +v 0.759269 -0.380202 1.363441 +v 0.840426 -0.374544 1.100946 +v 0.858230 -0.370997 1.100946 +v 0.849041 -0.371335 1.098041 +v 0.858231 -0.370997 1.360535 +v 0.840426 -0.374544 1.360535 +v 0.849041 -0.371335 1.363441 +v 0.927535 -0.349953 1.100946 +v 0.944305 -0.343001 1.100946 +v 0.935359 -0.345125 1.098041 +v 0.944305 -0.343001 1.360535 +v 0.927535 -0.349953 1.360535 +v 0.935359 -0.345125 1.363441 +v 1.008173 -0.308841 1.100946 +v 1.023264 -0.298751 1.100946 +v 1.014904 -0.302579 1.098041 +v 1.023265 -0.298751 1.360535 +v 1.008173 -0.308841 1.360535 +v 1.014905 -0.302579 1.363441 +v 1.079240 -0.252787 1.100946 +v 1.092074 -0.239946 1.100946 +v 1.084622 -0.245332 1.098041 +v 1.092074 -0.239946 1.360535 +v 1.079241 -0.252787 1.360535 +v 1.084622 -0.245332 1.363441 +v 1.138007 -0.183945 1.100946 +v 1.148089 -0.168847 1.100946 +v 1.141830 -0.175584 1.098041 +v 1.148089 -0.168848 1.360535 +v 1.138007 -0.183945 1.360535 +v 1.141830 -0.175584 1.363441 +v 1.182214 -0.104961 1.100946 +v 1.189157 -0.088187 1.100946 +v 1.184333 -0.096015 1.098041 +v 1.189157 -0.088187 1.360535 +v 1.182214 -0.104961 1.360535 +v 1.184333 -0.096015 1.363441 +v 1.210163 -0.018871 1.100946 +v 1.213699 -0.001064 1.100946 +v 1.210495 -0.009683 1.098041 +v 1.213700 -0.001064 1.360535 +v 1.210163 -0.018871 1.360535 +v 1.210496 -0.009683 1.363441 +v 1.220779 0.071018 1.100946 +v 1.220774 0.089172 1.100946 +v 1.219313 0.080094 1.098041 +v 1.220774 0.089172 1.360535 +v 1.220779 0.071018 1.360535 +v 1.219313 0.080094 1.363441 +v 1.213655 0.161251 1.100946 +v 1.210108 0.179055 1.100946 +v 1.210446 0.169866 1.098041 +v 1.210108 0.179055 1.360535 +v 1.213655 0.161250 1.360535 +v 1.210446 0.169866 1.363441 +v 1.189064 0.248360 1.100946 +v 1.182112 0.265130 1.100946 +v 1.184236 0.256184 1.098041 +v 1.182112 0.265130 1.360535 +v 1.189064 0.248359 1.360535 +v 1.184236 0.256184 1.363441 +v 1.147952 0.328997 1.100946 +v 1.137861 0.344089 1.100946 +v 1.141690 0.335730 1.098041 +v 1.137861 0.344089 1.360535 +v 1.147952 0.328997 1.360535 +v 1.141690 0.335729 1.363441 +v 1.091898 0.400065 1.100946 +v 1.079057 0.412899 1.100946 +v 1.084443 0.405446 1.098041 +v 1.079057 0.412899 1.360535 +v 1.091897 0.400065 1.360535 +v 1.084443 0.405446 1.363441 +v 1.023056 0.458832 1.100946 +v 1.007958 0.468914 1.100946 +v 1.014695 0.462655 1.098041 +v 1.007958 0.468914 1.360535 +v 1.023056 0.458832 1.360535 +v 1.014695 0.462655 1.363441 +v 0.944072 0.503039 1.100946 +v 0.927298 0.509982 1.100946 +v 0.935126 0.505157 1.098041 +v 0.927298 0.509982 1.360535 +v 0.944072 0.503039 1.360535 +v 0.935126 0.505157 1.363441 +v 0.857982 0.530987 1.100946 +v 0.840175 0.534524 1.100946 +v 0.848794 0.531320 1.098041 +v 0.840175 0.534524 1.360535 +v 0.857982 0.530987 1.360535 +v 0.848794 0.531320 1.363441 +v 0.768093 0.541603 1.100946 +v 0.749938 0.541599 1.100946 +v 0.759017 0.540137 1.098041 +v 0.749938 0.541599 1.360535 +v 0.768093 0.541604 1.360535 +v 0.759017 0.540137 1.363441 +v 0.677860 0.534479 1.100946 +v 0.660056 0.530932 1.100946 +v 0.669245 0.531271 1.098041 +v 0.660056 0.530932 1.360535 +v 0.677860 0.534479 1.360535 +v 0.669245 0.531271 1.363441 +v 0.590751 0.509888 1.100946 +v 0.573981 0.502937 1.100946 +v 0.582927 0.505061 1.098041 +v 0.573981 0.502937 1.360535 +v 0.590751 0.509888 1.360535 +v 0.582927 0.505061 1.363441 +v 0.510113 0.468776 1.100946 +v 0.495021 0.458686 1.100946 +v 0.503381 0.462514 1.098041 +v 0.495021 0.458686 1.360535 +v 0.510113 0.468776 1.360535 +v 0.503381 0.462514 1.363441 +v 0.439046 0.412722 1.100946 +v 0.426212 0.399881 1.100946 +v 0.433665 0.405267 1.098041 +v 0.426212 0.399881 1.360535 +v 0.439046 0.412722 1.360535 +v 0.433665 0.405267 1.363441 +v 0.380279 0.343880 1.100946 +v 0.370197 0.328782 1.100946 +v 0.376456 0.335519 1.098041 +v 0.370197 0.328782 1.360535 +v 0.380279 0.343880 1.360535 +v 0.376456 0.335519 1.363441 +v 0.336072 0.264896 1.100946 +v 0.329130 0.248122 1.100946 +v 0.333953 0.255950 1.098041 +v 0.329130 0.248122 1.360535 +v 0.336072 0.264896 1.360535 +v 0.333953 0.255950 1.363441 +v 0.308124 0.178806 1.100946 +v 0.304587 0.160999 1.100946 +v 0.307791 0.169618 1.098041 +v 0.304587 0.160999 1.360535 +v 0.308124 0.178806 1.360535 +v 0.307791 0.169618 1.363441 +v 0.388001 -0.188581 1.166350 +v 0.398928 -0.203068 1.166350 +v 0.447524 -0.255827 1.166350 +v 0.461067 -0.267905 1.166350 +v 0.519022 -0.310169 1.166350 +v 0.534660 -0.319372 1.166350 +v 0.599747 -0.349518 1.166350 +v 0.616881 -0.355493 1.166350 +v 0.686599 -0.372362 1.166350 +v 0.704569 -0.374880 1.166350 +v 0.776238 -0.377823 1.166350 +v 0.794354 -0.376787 1.166350 +v 0.865220 -0.365692 1.166350 +v 0.882786 -0.361142 1.166350 +v 0.950125 -0.336434 1.166350 +v 0.966466 -0.328544 1.166350 +v 1.027692 -0.291174 1.166350 +v 1.042180 -0.280248 1.166350 +v 1.094938 -0.231652 1.166350 +v 1.107016 -0.218109 1.166350 +v 1.149280 -0.160154 1.166350 +v 1.158483 -0.144515 1.166350 +v 1.188629 -0.079428 1.166350 +v 1.194605 -0.062294 1.166350 +v 1.211473 0.007423 1.166350 +v 1.213991 0.025394 1.166350 +v 1.216934 0.097063 1.166350 +v 1.215898 0.115179 1.166350 +v 1.204803 0.186045 1.166350 +v 1.200253 0.203611 1.166350 +v 1.175545 0.270950 1.166350 +v 1.167655 0.287291 1.166350 +v 1.130285 0.348517 1.166350 +v 1.119359 0.363004 1.166350 +v 1.070763 0.415763 1.166350 +v 1.057220 0.427841 1.166350 +v 0.999265 0.470105 1.166350 +v 0.983626 0.479308 1.166350 +v 0.918539 0.509453 1.166350 +v 0.901405 0.515429 1.166350 +v 0.831687 0.532297 1.166350 +v 0.813717 0.534816 1.166350 +v 0.742048 0.537759 1.166350 +v 0.723932 0.536723 1.166350 +v 0.653066 0.525627 1.166350 +v 0.635500 0.521077 1.166350 +v 0.568161 0.496370 1.166351 +v 0.551820 0.488479 1.166351 +v 0.490594 0.451110 1.166351 +v 0.476107 0.440183 1.166351 +v 0.423348 0.391587 1.166351 +v 0.411271 0.378044 1.166351 +v 0.369006 0.320089 1.166351 +v 0.359803 0.304450 1.166351 +v 0.304296 0.134541 1.166350 +v 0.306814 0.152511 1.166350 +v 0.329658 0.239363 1.166351 +v 0.323682 0.222229 1.166350 +v 0.350631 -0.127355 1.166350 +v 0.342741 -0.111015 1.166350 +v 0.318034 -0.043675 1.166350 +v 0.313484 -0.026109 1.166350 +v 0.301353 0.062873 1.166350 +v 0.302388 0.044757 1.166350 +v 0.373341 -0.167058 1.230741 +v 0.383426 -0.182142 1.230741 +v 0.428946 -0.237578 1.230741 +v 0.441781 -0.250404 1.230741 +v 0.497241 -0.295894 1.230741 +v 0.512331 -0.305971 1.230741 +v 0.575601 -0.339767 1.230741 +v 0.592366 -0.346706 1.230741 +v 0.661013 -0.367509 1.230741 +v 0.678810 -0.371044 1.230741 +v 0.750197 -0.378055 1.230741 +v 0.768342 -0.378050 1.230741 +v 0.839725 -0.371000 1.230741 +v 0.857520 -0.367455 1.230741 +v 0.926156 -0.346614 1.230741 +v 0.942917 -0.339665 1.230741 +v 1.006169 -0.305835 1.230741 +v 1.021253 -0.295750 1.230741 +v 1.076689 -0.250229 1.230741 +v 1.089515 -0.237395 1.230741 +v 1.135005 -0.181935 1.230741 +v 1.145082 -0.166845 1.230741 +v 1.178878 -0.103575 1.230741 +v 1.185817 -0.086809 1.230741 +v 1.206620 -0.018162 1.230741 +v 1.210155 -0.000365 1.230741 +v 1.217166 0.071022 1.230741 +v 1.217161 0.089167 1.230741 +v 1.210111 0.160549 1.230741 +v 1.206566 0.178345 1.230741 +v 1.185725 0.246981 1.230741 +v 1.178776 0.263742 1.230741 +v 1.144945 0.326994 1.230741 +v 1.134861 0.342078 1.230741 +v 1.089340 0.397513 1.230741 +v 1.076506 0.410340 1.230741 +v 1.021045 0.455830 1.230741 +v 1.005955 0.465906 1.230741 +v 0.942686 0.499703 1.230741 +v 0.925920 0.506641 1.230741 +v 0.857273 0.527445 1.230741 +v 0.839476 0.530979 1.230741 +v 0.768089 0.537991 1.230741 +v 0.749944 0.537986 1.230741 +v 0.678561 0.530935 1.230741 +v 0.660766 0.527390 1.230741 +v 0.592130 0.506549 1.230741 +v 0.575369 0.499600 1.230741 +v 0.512117 0.465770 1.230741 +v 0.497034 0.455685 1.230741 +v 0.441598 0.410164 1.230741 +v 0.428771 0.397330 1.230741 +v 0.383281 0.341869 1.230741 +v 0.373205 0.326780 1.230741 +v 0.308131 0.160300 1.230741 +v 0.311666 0.178097 1.230741 +v 0.339409 0.263510 1.230741 +v 0.332470 0.246745 1.230741 +v 0.339510 -0.103807 1.230741 +v 0.332562 -0.087045 1.230741 +v 0.311721 -0.018409 1.230741 +v 0.308176 -0.000614 1.230741 +v 0.301121 0.088914 1.230741 +v 0.301126 0.070769 1.230741 +v 0.388001 -0.188581 1.295131 +v 0.398928 -0.203068 1.295131 +v 0.447524 -0.255827 1.295131 +v 0.461067 -0.267905 1.295131 +v 0.519022 -0.310169 1.295131 +v 0.534660 -0.319372 1.295131 +v 0.599747 -0.349518 1.295131 +v 0.616881 -0.355493 1.295131 +v 0.686599 -0.372362 1.295131 +v 0.704569 -0.374880 1.295131 +v 0.776238 -0.377823 1.295131 +v 0.794354 -0.376787 1.295131 +v 0.865220 -0.365692 1.295131 +v 0.882786 -0.361142 1.295131 +v 0.950126 -0.336434 1.295131 +v 0.966466 -0.328544 1.295131 +v 1.027692 -0.291174 1.295131 +v 1.042180 -0.280248 1.295131 +v 1.094938 -0.231652 1.295131 +v 1.107016 -0.218109 1.295131 +v 1.149280 -0.160154 1.295131 +v 1.158483 -0.144515 1.295131 +v 1.188629 -0.079428 1.295131 +v 1.194605 -0.062294 1.295131 +v 1.211473 0.007423 1.295131 +v 1.213991 0.025394 1.295131 +v 1.216934 0.097063 1.295131 +v 1.215898 0.115179 1.295131 +v 1.204803 0.186045 1.295131 +v 1.200253 0.203611 1.295131 +v 1.175545 0.270950 1.295131 +v 1.167655 0.287291 1.295131 +v 1.130285 0.348517 1.295131 +v 1.119359 0.363004 1.295131 +v 1.070763 0.415763 1.295131 +v 1.057220 0.427841 1.295131 +v 0.999265 0.470105 1.295131 +v 0.983626 0.479308 1.295131 +v 0.918539 0.509453 1.295131 +v 0.901405 0.515429 1.295131 +v 0.831687 0.532297 1.295131 +v 0.813717 0.534816 1.295131 +v 0.742048 0.537759 1.295131 +v 0.723932 0.536723 1.295131 +v 0.653066 0.525627 1.295131 +v 0.635500 0.521077 1.295131 +v 0.568161 0.496370 1.295131 +v 0.551820 0.488479 1.295131 +v 0.490594 0.451110 1.295131 +v 0.476107 0.440183 1.295131 +v 0.423348 0.391587 1.295131 +v 0.411271 0.378044 1.295131 +v 0.369006 0.320089 1.295131 +v 0.359803 0.304450 1.295131 +v 0.304296 0.134541 1.295131 +v 0.306814 0.152511 1.295131 +v 0.329658 0.239363 1.295131 +v 0.323682 0.222229 1.295131 +v 0.350631 -0.127355 1.295131 +v 0.342741 -0.111015 1.295131 +v 0.318034 -0.043675 1.295131 +v 0.313484 -0.026109 1.295131 +v 0.301353 0.062873 1.295131 +v 0.302388 0.044757 1.295131 +v 0.298781 0.044548 1.157534 +v 0.297745 0.062669 1.157534 +v 0.297745 0.062668 1.174153 +v 0.298781 0.044550 1.174153 +v 0.297512 0.070766 1.222431 +v 0.297507 0.088915 1.222431 +v 0.297507 0.088915 1.239050 +v 0.297512 0.070766 1.239050 +v 0.298781 0.044550 1.287328 +v 0.297745 0.062668 1.287328 +v 0.297745 0.062669 1.303948 +v 0.298781 0.044548 1.303948 +v 0.309986 -0.027013 1.303948 +v 0.314537 -0.044583 1.303948 +v 0.314537 -0.044583 1.287328 +v 0.309986 -0.027013 1.287328 +v 0.304632 -0.001318 1.239050 +v 0.308178 -0.019117 1.239050 +v 0.308178 -0.019117 1.222431 +v 0.304632 -0.001318 1.222431 +v 0.309986 -0.027013 1.174153 +v 0.314537 -0.044583 1.174153 +v 0.314537 -0.044583 1.157534 +v 0.309986 -0.027013 1.157534 +v 0.303236 0.153014 1.174153 +v 0.300717 0.135041 1.174153 +v 0.300717 0.135041 1.157534 +v 0.303236 0.153015 1.157534 +v 0.308123 0.178803 1.239050 +v 0.304587 0.161002 1.239050 +v 0.304587 0.161002 1.222431 +v 0.308123 0.178803 1.222431 +v 0.303236 0.153015 1.303948 +v 0.300717 0.135041 1.303948 +v 0.300717 0.135041 1.287328 +v 0.303236 0.153014 1.287328 +v 0.339487 -0.112584 1.303948 +v 0.347379 -0.128929 1.303948 +v 0.347378 -0.128928 1.287328 +v 0.339487 -0.112585 1.287328 +v 0.329223 -0.088427 1.239050 +v 0.336173 -0.105192 1.239050 +v 0.336173 -0.105192 1.222431 +v 0.329223 -0.088427 1.222431 +v 0.339487 -0.112585 1.174153 +v 0.347378 -0.128928 1.174153 +v 0.347379 -0.128929 1.157534 +v 0.339487 -0.112584 1.157534 +v 0.396044 -0.205245 1.287328 +v 0.385116 -0.190756 1.287328 +v 0.385115 -0.190755 1.303948 +v 0.396044 -0.205246 1.303948 +v 0.380424 -0.184152 1.222431 +v 0.370336 -0.169065 1.222431 +v 0.370336 -0.169065 1.239050 +v 0.380424 -0.184152 1.239050 +v 0.396044 -0.205246 1.157534 +v 0.385115 -0.190755 1.157534 +v 0.385116 -0.190756 1.174153 +v 0.396044 -0.205245 1.174153 +v 0.458663 -0.270602 1.287328 +v 0.445118 -0.258523 1.287328 +v 0.445117 -0.258522 1.303948 +v 0.458663 -0.270603 1.303948 +v 0.439228 -0.252961 1.222431 +v 0.426391 -0.240132 1.222431 +v 0.426391 -0.240132 1.239050 +v 0.439228 -0.252961 1.239050 +v 0.458663 -0.270603 1.157534 +v 0.445117 -0.258522 1.157534 +v 0.445118 -0.258523 1.174153 +v 0.458663 -0.270602 1.174153 +v 0.532829 -0.322487 1.287328 +v 0.517188 -0.313282 1.287328 +v 0.517187 -0.313282 1.303948 +v 0.532830 -0.322487 1.303948 +v 0.510326 -0.308977 1.222431 +v 0.495233 -0.298898 1.222431 +v 0.495233 -0.298898 1.239050 +v 0.510326 -0.308977 1.239050 +v 0.532830 -0.322487 1.157534 +v 0.517187 -0.313282 1.157534 +v 0.517188 -0.313282 1.174153 +v 0.532829 -0.322487 1.174153 +v 0.615693 -0.358906 1.287328 +v 0.598556 -0.352929 1.287328 +v 0.598556 -0.352929 1.303948 +v 0.615694 -0.358906 1.303948 +v 0.590986 -0.350045 1.222431 +v 0.574217 -0.343105 1.222431 +v 0.574217 -0.343105 1.239050 +v 0.590986 -0.350045 1.239050 +v 0.615694 -0.358906 1.157534 +v 0.598556 -0.352929 1.157534 +v 0.598556 -0.352929 1.174153 +v 0.615693 -0.358906 1.174153 +v 0.704069 -0.378459 1.287328 +v 0.686096 -0.375940 1.287328 +v 0.686095 -0.375940 1.303948 +v 0.704070 -0.378459 1.303948 +v 0.678108 -0.374588 1.222431 +v 0.660307 -0.371053 1.222431 +v 0.660307 -0.371053 1.239050 +v 0.678108 -0.374588 1.239050 +v 0.704070 -0.378459 1.157534 +v 0.686095 -0.375940 1.157534 +v 0.686096 -0.375940 1.174153 +v 0.704069 -0.378459 1.174153 +v 0.794562 -0.380395 1.287328 +v 0.776443 -0.381431 1.287328 +v 0.776442 -0.381431 1.303948 +v 0.794562 -0.380395 1.303948 +v 0.768345 -0.381663 1.222431 +v 0.750196 -0.381669 1.222431 +v 0.750196 -0.381669 1.239050 +v 0.768345 -0.381663 1.239050 +v 0.794562 -0.380395 1.157534 +v 0.776442 -0.381431 1.157534 +v 0.776443 -0.381431 1.174153 +v 0.794562 -0.380395 1.174153 +v 0.883693 -0.364639 1.287328 +v 0.866125 -0.369190 1.287328 +v 0.866124 -0.369190 1.303948 +v 0.883694 -0.364639 1.303948 +v 0.858228 -0.370998 1.222431 +v 0.840429 -0.374544 1.222431 +v 0.840429 -0.374544 1.239050 +v 0.858228 -0.370998 1.239050 +v 0.883694 -0.364639 1.157534 +v 0.866124 -0.369190 1.157534 +v 0.866125 -0.369190 1.174153 +v 0.883693 -0.364639 1.174153 +v 0.968039 -0.331797 1.287328 +v 0.951695 -0.339689 1.287328 +v 0.951695 -0.339689 1.303948 +v 0.968039 -0.331797 1.303948 +v 0.944303 -0.343003 1.222431 +v 0.927538 -0.349953 1.222431 +v 0.927538 -0.349953 1.239050 +v 0.944303 -0.343003 1.239050 +v 0.968039 -0.331797 1.157534 +v 0.951695 -0.339689 1.157534 +v 0.951695 -0.339689 1.174153 +v 0.968039 -0.331797 1.174153 +v 1.044356 -0.283132 1.287328 +v 1.029866 -0.294060 1.287328 +v 1.029866 -0.294061 1.303948 +v 1.044357 -0.283131 1.303948 +v 1.023263 -0.298752 1.222431 +v 1.008175 -0.308839 1.222431 +v 1.008175 -0.308839 1.239050 +v 1.023263 -0.298752 1.239050 +v 1.044357 -0.283131 1.157534 +v 1.029866 -0.294061 1.157534 +v 1.029866 -0.294060 1.174153 +v 1.044356 -0.283132 1.174153 +v 1.109714 -0.220513 1.287328 +v 1.097634 -0.234058 1.287328 +v 1.097633 -0.234058 1.303948 +v 1.109714 -0.220512 1.303948 +v 1.092072 -0.239948 1.222431 +v 1.079243 -0.252785 1.222431 +v 1.079243 -0.252785 1.239050 +v 1.092072 -0.239948 1.239050 +v 1.109714 -0.220512 1.157534 +v 1.097633 -0.234058 1.157534 +v 1.097634 -0.234058 1.174153 +v 1.109714 -0.220513 1.174153 +v 1.161598 -0.146346 1.287328 +v 1.152393 -0.161988 1.287328 +v 1.152393 -0.161988 1.303948 +v 1.161598 -0.146346 1.303948 +v 1.148088 -0.168850 1.222431 +v 1.138009 -0.183943 1.222431 +v 1.138009 -0.183943 1.239050 +v 1.148088 -0.168850 1.239050 +v 1.161598 -0.146346 1.157534 +v 1.152392 -0.161988 1.157534 +v 1.152393 -0.161988 1.174153 +v 1.161598 -0.146346 1.174153 +v 1.198017 -0.063483 1.287328 +v 1.192040 -0.080619 1.287328 +v 1.192040 -0.080620 1.303948 +v 1.198017 -0.063482 1.303948 +v 1.189156 -0.088190 1.222431 +v 1.182215 -0.104959 1.222431 +v 1.182215 -0.104959 1.239050 +v 1.189156 -0.088190 1.239050 +v 1.198017 -0.063482 1.157534 +v 1.192040 -0.080620 1.157534 +v 1.192040 -0.080619 1.174153 +v 1.198017 -0.063483 1.174153 +v 1.217570 0.024894 1.287328 +v 1.215051 0.006921 1.287328 +v 1.215051 0.006920 1.303948 +v 1.217570 0.024894 1.303948 +v 1.213699 -0.001067 1.222431 +v 1.210164 -0.018868 1.222431 +v 1.210164 -0.018868 1.239050 +v 1.213699 -0.001067 1.239050 +v 1.217570 0.024894 1.157534 +v 1.215051 0.006920 1.157534 +v 1.215051 0.006921 1.174153 +v 1.217570 0.024894 1.174153 +v 1.219506 0.115387 1.287328 +v 1.220542 0.097267 1.287328 +v 1.220542 0.097267 1.303948 +v 1.219505 0.115387 1.303948 +v 1.220774 0.089170 1.222431 +v 1.220780 0.071021 1.222431 +v 1.220780 0.071021 1.239050 +v 1.220774 0.089170 1.239050 +v 1.219505 0.115387 1.157534 +v 1.220542 0.097267 1.157534 +v 1.220542 0.097267 1.174153 +v 1.219506 0.115387 1.174153 +v 1.203750 0.204518 1.287328 +v 1.208301 0.186949 1.287328 +v 1.208301 0.186949 1.303948 +v 1.203750 0.204519 1.303948 +v 1.210109 0.179052 1.222431 +v 1.213655 0.161254 1.222431 +v 1.213655 0.161254 1.239050 +v 1.210109 0.179052 1.239050 +v 1.203750 0.204519 1.157534 +v 1.208301 0.186949 1.157534 +v 1.208301 0.186949 1.174153 +v 1.203750 0.204518 1.174153 +v 1.170908 0.288863 1.287328 +v 1.178800 0.272520 1.287328 +v 1.178800 0.272520 1.303948 +v 1.170908 0.288864 1.303948 +v 1.182113 0.265128 1.222431 +v 1.189063 0.248362 1.222431 +v 1.189063 0.248362 1.239050 +v 1.182113 0.265128 1.239050 +v 1.170908 0.288864 1.157534 +v 1.178800 0.272520 1.157534 +v 1.178800 0.272520 1.174153 +v 1.170908 0.288863 1.174153 +v 1.122243 0.365181 1.287328 +v 1.133171 0.350691 1.287328 +v 1.133171 0.350691 1.303948 +v 1.122242 0.365182 1.303948 +v 1.137863 0.344087 1.222431 +v 1.147950 0.329000 1.222431 +v 1.147950 0.329000 1.239050 +v 1.137863 0.344087 1.239050 +v 1.122242 0.365182 1.157534 +v 1.133171 0.350691 1.157534 +v 1.133171 0.350691 1.174153 +v 1.122243 0.365181 1.174153 +v 1.059624 0.430538 1.287328 +v 1.073169 0.418459 1.287328 +v 1.073169 0.418458 1.303948 +v 1.059623 0.430539 1.303948 +v 1.079059 0.412897 1.222431 +v 1.091896 0.400068 1.222431 +v 1.091896 0.400068 1.239050 +v 1.079059 0.412897 1.239050 +v 1.059623 0.430539 1.157534 +v 1.073169 0.418458 1.157534 +v 1.073169 0.418459 1.174153 +v 1.059624 0.430538 1.174153 +v 0.985457 0.482423 1.287328 +v 1.001099 0.473218 1.287328 +v 1.001099 0.473218 1.303948 +v 0.985456 0.482423 1.303948 +v 1.007961 0.468912 1.222431 +v 1.023053 0.458834 1.222431 +v 1.023053 0.458834 1.239050 +v 1.007961 0.468912 1.239050 +v 0.985456 0.482423 1.157534 +v 1.001099 0.473218 1.157534 +v 1.001099 0.473218 1.174153 +v 0.985457 0.482423 1.174153 +v 0.902594 0.518841 1.287328 +v 0.919730 0.512865 1.287328 +v 0.919731 0.512865 1.303948 +v 0.902593 0.518842 1.303948 +v 0.927300 0.509981 1.222431 +v 0.944069 0.503040 1.222431 +v 0.944069 0.503040 1.239050 +v 0.927300 0.509981 1.239050 +v 0.902593 0.518842 1.157534 +v 0.919731 0.512865 1.157534 +v 0.919730 0.512865 1.174153 +v 0.902594 0.518841 1.174153 +v 0.814217 0.538394 1.287328 +v 0.832191 0.535876 1.287328 +v 0.832191 0.535875 1.303948 +v 0.814216 0.538394 1.303948 +v 0.840178 0.534524 1.222431 +v 0.857979 0.530988 1.222431 +v 0.857979 0.530988 1.239050 +v 0.840178 0.534524 1.239050 +v 0.814216 0.538394 1.157534 +v 0.832191 0.535875 1.157534 +v 0.832191 0.535876 1.174153 +v 0.814217 0.538394 1.174153 +v 0.723724 0.540330 1.287328 +v 0.741844 0.541366 1.287328 +v 0.741844 0.541367 1.303948 +v 0.723724 0.540330 1.303948 +v 0.749941 0.541599 1.222431 +v 0.768090 0.541604 1.222431 +v 0.768090 0.541604 1.239050 +v 0.749941 0.541599 1.239050 +v 0.723724 0.540330 1.157534 +v 0.741844 0.541367 1.157534 +v 0.741844 0.541366 1.174153 +v 0.723724 0.540330 1.174153 +v 0.634593 0.524574 1.287329 +v 0.652161 0.529126 1.287328 +v 0.652162 0.529126 1.303948 +v 0.634592 0.524574 1.303948 +v 0.660058 0.530934 1.222431 +v 0.677857 0.534479 1.222431 +v 0.677857 0.534479 1.239050 +v 0.660058 0.530934 1.239050 +v 0.634592 0.524574 1.157534 +v 0.652162 0.529126 1.157534 +v 0.652161 0.529126 1.174153 +v 0.634593 0.524574 1.174153 +v 0.550247 0.491733 1.287329 +v 0.566591 0.499624 1.287329 +v 0.566592 0.499624 1.303948 +v 0.550247 0.491732 1.303948 +v 0.573983 0.502938 1.222431 +v 0.590748 0.509888 1.222431 +v 0.590748 0.509888 1.239050 +v 0.573983 0.502938 1.239050 +v 0.550247 0.491732 1.157534 +v 0.566592 0.499624 1.157534 +v 0.566591 0.499624 1.174153 +v 0.550247 0.491733 1.174153 +v 0.473930 0.443067 1.287329 +v 0.488420 0.453995 1.287329 +v 0.488420 0.453996 1.303948 +v 0.473929 0.443067 1.303948 +v 0.495023 0.458687 1.222431 +v 0.510111 0.468774 1.222431 +v 0.510111 0.468774 1.239050 +v 0.495023 0.458687 1.239050 +v 0.473929 0.443067 1.157534 +v 0.488420 0.453996 1.157534 +v 0.488420 0.453995 1.174153 +v 0.473930 0.443067 1.174153 +v 0.408573 0.380448 1.287329 +v 0.420652 0.393993 1.287329 +v 0.420653 0.393993 1.303948 +v 0.408572 0.380447 1.303948 +v 0.426214 0.399883 1.222431 +v 0.439043 0.412720 1.222431 +v 0.439043 0.412720 1.239050 +v 0.426214 0.399883 1.239050 +v 0.408572 0.380447 1.157534 +v 0.420653 0.393993 1.157534 +v 0.420652 0.393993 1.174153 +v 0.408573 0.380448 1.174153 +v 0.356688 0.306281 1.287329 +v 0.365893 0.321923 1.287329 +v 0.365893 0.321923 1.303948 +v 0.356688 0.306280 1.303948 +v 0.370199 0.328785 1.222431 +v 0.380277 0.343878 1.222431 +v 0.380277 0.343878 1.239050 +v 0.370199 0.328785 1.239050 +v 0.356688 0.306280 1.157534 +v 0.365893 0.321923 1.157534 +v 0.365893 0.321923 1.174153 +v 0.356688 0.306281 1.174153 +v 0.320270 0.223418 1.287328 +v 0.326246 0.240554 1.287329 +v 0.326247 0.240555 1.303948 +v 0.320270 0.223417 1.303948 +v 0.329131 0.248125 1.222431 +v 0.336071 0.264894 1.222431 +v 0.336071 0.264894 1.239050 +v 0.329131 0.248125 1.239050 +v 0.320270 0.223417 1.157534 +v 0.326247 0.240555 1.157534 +v 0.326246 0.240555 1.174153 +v 0.320270 0.223418 1.174153 +v 0.848702 -0.369631 1.101847 +v 0.848702 -0.369631 1.359635 +v 0.848703 -0.369631 1.222489 +v 0.848002 -0.366112 1.230741 +v 0.874106 -0.363815 1.286936 +v 0.873206 -0.360341 1.294684 +v 0.874106 -0.363815 1.158042 +v 0.873206 -0.360341 1.166797 +v 0.874106 -0.363815 1.174546 +v 0.848703 -0.369631 1.238993 +v 0.874106 -0.363815 1.303440 +v 0.368342 0.079861 1.384222 +v 0.375873 0.003621 1.384222 +v 0.398131 -0.069684 1.384222 +v 0.434264 -0.137239 1.384222 +v 0.482881 -0.196446 1.384222 +v 0.542115 -0.245031 1.384222 +v 0.609689 -0.281126 1.384222 +v 0.683007 -0.303345 1.384222 +v 0.759250 -0.310833 1.384222 +v 0.835489 -0.303303 1.384222 +v 0.908795 -0.281044 1.384222 +v 0.976349 -0.244912 1.384222 +v 1.035557 -0.196295 1.384222 +v 1.084142 -0.137061 1.384222 +v 1.120237 -0.069486 1.384222 +v 1.142456 0.003831 1.384222 +v 1.149944 0.080075 1.384222 +v 1.142414 0.156314 1.384222 +v 1.120155 0.229620 1.384222 +v 1.084023 0.297174 1.384222 +v 1.035405 0.356381 1.384222 +v 0.976171 0.404967 1.384222 +v 0.908597 0.441062 1.384222 +v 0.835279 0.463280 1.384222 +v 0.759036 0.470769 1.384222 +v 0.682796 0.463238 1.384222 +v 0.609491 0.440980 1.384222 +v 0.541937 0.404847 1.384222 +v 0.482729 0.356229 1.384222 +v 0.434144 0.296995 1.384222 +v 0.398049 0.229421 1.384222 +v 0.375831 0.156104 1.384222 +v 0.426640 0.013734 1.377978 +v 0.629486 -0.233297 1.377978 +v 0.477193 0.268249 1.377978 +v 0.400843 0.124316 1.410284 +v 0.416263 0.194731 1.410284 +v 0.636126 0.072792 1.398083 +v 0.651546 0.143207 1.398083 +v 0.453122 0.112868 1.424607 +v 0.468542 0.183282 1.424607 +v 0.416263 0.194731 1.380890 +v 0.400843 0.124316 1.380828 +v 0.570172 0.391687 1.410284 +v 0.634791 0.423629 1.410284 +v 0.676901 0.175766 1.398083 +v 0.741521 0.207708 1.398083 +v 0.593887 0.343710 1.424607 +v 0.658506 0.375652 1.424607 +v 0.634791 0.423629 1.381319 +v 0.570172 0.391687 1.381202 +v 0.892692 0.426628 1.410284 +v 0.957571 0.395217 1.410284 +v 0.787733 0.209841 1.398083 +v 0.852612 0.178430 1.398083 +v 0.869370 0.378459 1.424607 +v 0.934249 0.347047 1.424607 +v 0.957571 0.395217 1.382117 +v 0.892692 0.426628 1.381989 +v 1.113355 0.198868 1.410284 +v 1.130000 0.128733 1.410284 +v 0.879005 0.143251 1.398084 +v 0.895650 0.073117 1.398084 +v 1.061283 0.186510 1.424607 +v 1.077928 0.116375 1.424607 +v 1.130000 0.128733 1.382396 +v 1.113355 0.198868 1.382350 +v 1.075331 -0.117869 1.410284 +v 1.030957 -0.174675 1.410284 +v 0.885516 0.030400 1.398084 +v 0.841143 -0.026407 1.398084 +v 1.033154 -0.084924 1.424606 +v 0.988781 -0.141731 1.424606 +v 1.030957 -0.174675 1.382129 +v 1.075331 -0.117869 1.382184 +v 0.805522 -0.286394 1.410284 +v 0.733439 -0.286531 1.410284 +v 0.805065 -0.045535 1.398083 +v 0.732982 -0.045672 1.398083 +v 0.805420 -0.232876 1.424607 +v 0.733337 -0.233013 1.424607 +v 0.733439 -0.286531 1.381596 +v 0.805522 -0.286394 1.381825 +v 0.500894 -0.176611 1.410284 +v 0.456057 -0.120169 1.410284 +v 0.689488 -0.026793 1.398083 +v 0.644651 0.029648 1.398083 +v 0.542799 -0.143322 1.424607 +v 0.497962 -0.086880 1.424607 +v 0.457354 -0.121801 1.380872 +v 0.456057 -0.120169 1.380917 +v 0.500894 -0.176611 1.381009 +v 0.395279 0.161012 1.394382 +v 0.471701 -0.158824 1.394382 +v 0.769407 -0.298489 1.394382 +v 1.064218 -0.152812 1.394382 +v 1.134135 0.168508 1.394382 +v 0.926510 0.423511 1.394382 +v 0.597688 0.420175 1.394382 +v 1.100132 0.012238 1.379017 +v 1.048636 0.273516 1.379088 +v 1.093406 0.218531 1.380729 +v 1.005516 0.326476 1.379122 +v 0.960598 0.381644 1.380839 +v 0.827180 0.422503 1.379207 +v 0.759049 0.421812 1.378317 +v 0.691186 0.421123 1.379042 +v 0.519244 0.319735 1.377995 +v 0.562129 0.374645 1.379840 +v 0.515668 0.315157 1.377978 +v 0.436332 0.213576 1.379224 +v 0.473213 0.260798 1.377978 +v 0.490607 -0.031350 1.377978 +v 0.444615 -0.045466 1.377978 +v 0.477418 0.023849 1.377978 +v 0.430296 0.014462 1.377978 +v 0.596120 -0.164159 1.377978 +v 0.648023 -0.188508 1.377978 +v 0.629642 -0.232920 1.377978 +v 0.622556 -0.229595 1.377978 +v 0.700891 -0.213310 1.377978 +v 0.632198 -0.234119 1.377978 +v 0.872673 -0.193906 1.377978 +v 0.924971 -0.168064 1.377978 +v 1.053031 0.021594 1.377978 +v 1.040402 -0.036443 1.377978 +v 1.008545 0.246712 1.377978 +v 0.971396 0.292338 1.377978 +v 0.817624 0.374390 1.377978 +v 0.759063 0.373796 1.377978 +v 0.478402 0.267441 1.377978 +v 0.518441 0.240704 1.377978 +v 0.553458 0.285540 1.377978 +v 0.395279 0.161012 1.382138 +v 0.414178 0.185209 1.380797 +v 0.397479 0.151804 1.381560 +v 0.420832 0.193730 1.380325 +v 0.414666 0.079873 1.378634 +v 0.423941 0.041060 1.377978 +v 0.445691 -0.049969 1.378012 +v 0.402375 0.131313 1.380726 +v 0.569153 -0.204542 1.378349 +v 0.404224 0.123576 1.380412 +v 0.691254 -0.261824 1.379116 +v 0.464028 0.079887 1.377978 +v 0.828695 -0.269192 1.380027 +v 0.891099 -0.238356 1.378648 +v 0.482372 0.194521 1.377978 +v 0.951885 -0.208320 1.378913 +v 1.015926 -0.176675 1.380874 +v 0.472856 0.182337 1.377978 +v 1.085479 -0.055100 1.379684 +v 1.114891 0.080065 1.379994 +v 0.456315 0.112168 1.377978 +v 1.073422 0.115306 1.377978 +v 1.077928 0.116375 1.379405 +v 1.061283 0.186510 1.378964 +v 1.058165 0.185770 1.377978 +v 1.069738 -0.127442 1.382133 +v 1.037862 -0.165836 1.382097 +v 0.414178 0.185209 1.394382 +v 1.064218 -0.152812 1.383565 +v 1.026701 -0.171351 1.381475 +v 0.402375 0.131313 1.394382 +v 1.070467 -0.124096 1.382019 +v 0.404224 0.123576 1.394382 +v 0.453122 0.112868 1.378983 +v 1.072331 -0.115526 1.381729 +v 0.420832 0.193730 1.394382 +v 0.468542 0.183282 1.379339 +v 0.980070 -0.140838 1.377978 +v 0.984705 -0.138547 1.377978 +v 1.030333 -0.082720 1.377978 +v 0.618030 0.420381 1.381532 +v 0.628436 0.420487 1.381178 +v 0.636305 0.420567 1.380910 +v 0.572213 0.387557 1.380643 +v 1.037862 -0.165836 1.394382 +v 1.070467 -0.124096 1.394382 +v 0.578751 0.395928 1.381164 +v 0.597688 0.420175 1.382673 +v 0.700731 0.373205 1.377978 +v 1.072331 -0.115526 1.394382 +v 1.033154 -0.084924 1.379080 +v 0.659920 0.372791 1.377978 +v 1.026701 -0.171351 1.394382 +v 0.590227 0.332618 1.377978 +v 0.595826 0.339787 1.377978 +v 0.988781 -0.141731 1.379570 +v 0.628436 0.420487 1.394382 +v 0.743876 -0.286511 1.381470 +v 0.759245 -0.293721 1.382158 +v 0.733430 -0.281610 1.381003 +v 0.578751 0.395928 1.394382 +v 0.805511 -0.280648 1.381132 +v 0.572213 0.387557 1.394382 +v 0.769407 -0.298489 1.382854 +v 0.793838 -0.286416 1.381689 +v 0.733329 -0.228529 1.377978 +v 0.818983 -0.220436 1.377978 +v 0.805410 -0.227143 1.377978 +v 0.593887 0.343710 1.379325 +v 0.636305 0.420567 1.394382 +v 0.658506 0.375652 1.378961 +v 0.743876 -0.286511 1.394382 +v 0.926510 0.423511 1.383368 +v 0.901227 0.423254 1.381897 +v 0.944326 0.401629 1.382046 +v 0.954579 0.389037 1.381286 +v 0.793838 -0.286416 1.394382 +v 0.805511 -0.280648 1.394382 +v 0.891008 0.423151 1.381526 +v 0.805420 -0.232876 1.379736 +v 0.899693 0.423239 1.381841 +v 0.733430 -0.281610 1.394382 +v 0.733337 -0.233013 1.379364 +v 0.461443 -0.115891 1.380097 +v 0.932699 0.339866 1.377978 +v 0.504911 -0.174404 1.380463 +v 0.504132 -0.174038 1.380508 +v 0.931491 0.341349 1.377978 +v 0.867647 0.374898 1.377978 +v 0.465221 -0.131706 1.380897 +v 0.495712 -0.170088 1.380993 +v 0.471701 -0.158824 1.382375 +v 0.944326 0.401629 1.394382 +v 0.899693 0.423239 1.394382 +v 0.918154 0.414301 1.391264 +v 0.891008 0.423151 1.394382 +v 0.869370 0.378459 1.379189 +v 0.502933 -0.082932 1.377978 +v 0.546105 -0.140695 1.377978 +v 0.954579 0.389037 1.394382 +v 0.934249 0.347047 1.379938 +v 1.127642 0.138667 1.382230 +v 1.130986 0.154038 1.382816 +v 0.465221 -0.131706 1.394382 +v 1.125234 0.127602 1.381808 +v 1.134135 0.168508 1.383691 +v 1.114975 0.192039 1.382298 +v 1.110054 0.198085 1.381940 +v 0.495712 -0.170088 1.394382 +v 0.483094 -0.154204 1.391300 +v 1.065751 0.080052 1.377978 +v 0.504132 -0.174038 1.394382 +v 1.047114 0.199342 1.377978 +v 0.542799 -0.143322 1.379270 +v 0.461443 -0.115891 1.394382 +v 0.497962 -0.086880 1.379943 +v 1.127642 0.138667 1.394382 +v 1.114975 0.192039 1.394382 +v 1.110054 0.198085 1.394382 +v 1.125234 0.127602 1.394382 +v 0.654734 0.167065 1.380172 +v 0.874678 0.169214 1.380172 +v 0.903001 0.050480 1.380172 +v 0.705771 -0.046886 1.380172 +v 0.713080 -0.046815 1.380172 +v 0.628735 0.047800 1.380172 +v 0.827830 -0.045694 1.380172 +v 0.764188 0.221100 1.380172 +v 0.931312 0.340979 1.377978 +v 0.932482 0.339541 1.377978 +v 0.817549 0.374017 1.377978 +v 0.867465 0.374523 1.377978 +v 0.931312 0.340979 1.406695 +v 0.853065 0.179364 1.380172 +v 0.826373 0.289649 1.391994 +v 0.867465 0.374523 1.406695 +v 0.787813 0.210005 1.380172 +v 1.065369 0.080052 1.377978 +v 1.052665 0.021666 1.377978 +v 1.073020 0.115210 1.377978 +v 1.057762 0.185674 1.377978 +v 1.046755 0.199193 1.377978 +v 1.008234 0.246504 1.377978 +v 1.073020 0.115210 1.406695 +v 0.897497 0.073555 1.380172 +v 1.057762 0.185674 1.406695 +v 0.477784 0.023922 1.377978 +v 0.880771 0.143670 1.380172 +v 0.490956 -0.031205 1.377978 +v 0.924762 -0.167752 1.377978 +v 0.979791 -0.140560 1.377978 +v 0.984380 -0.138292 1.377978 +v 1.040052 -0.036299 1.377978 +v 0.596329 -0.163845 1.377978 +v 1.030006 -0.082465 1.377978 +v 0.648166 -0.188164 1.377978 +v 0.700965 -0.212934 1.377978 +v 0.872530 -0.193561 1.377978 +v 0.984380 -0.138292 1.406695 +v 0.971131 0.292073 1.377978 +v 0.759063 0.373424 1.377978 +v 0.518752 0.240496 1.377978 +v 0.553724 0.285274 1.377978 +v 0.464411 0.079887 1.377978 +v 0.482729 0.194373 1.377978 +v 0.842237 -0.027261 1.380172 +v 0.473260 0.182249 1.377978 +v 1.030006 -0.082465 1.406695 +v 0.886627 0.029532 1.380172 +v 0.733328 -0.228117 1.377978 +v 0.456719 0.112080 1.377978 +v 0.805409 -0.226728 1.377978 +v 0.818907 -0.220058 1.377978 +v 0.473260 0.182249 1.406695 +v 0.733328 -0.228117 1.406695 +v 0.649624 0.143627 1.380172 +v 0.634272 0.073198 1.380172 +v 0.456719 0.112080 1.406695 +v 0.700805 0.372832 1.377978 +v 0.732984 -0.046620 1.380172 +v 0.805066 -0.045916 1.380172 +v 0.805409 -0.226728 1.406695 +v 0.660104 0.372420 1.377978 +v 0.590445 0.332292 1.377978 +v 0.596009 0.339416 1.377978 +v 0.503254 -0.082676 1.377978 +v 0.546431 -0.140436 1.377978 +v 0.660104 0.372420 1.406695 +v 0.740646 0.209478 1.380172 +v 0.503254 -0.082676 1.406695 +v 0.596009 0.339416 1.406695 +v 0.643954 0.029095 1.380172 +v 0.689449 -0.026824 1.380172 +v 0.620841 -0.081326 1.391878 +v 0.546431 -0.140436 1.406695 +v 0.676010 0.177568 1.380172 +v 0.706945 0.126256 1.391551 +v 0.693194 0.063177 1.391551 +v 0.733939 0.013097 1.391551 +v 0.798496 0.013728 1.391551 +v 0.838254 0.064594 1.391551 +v 0.823274 0.127393 1.391551 +v 0.764836 0.154835 1.391551 +v 0.671382 0.057973 1.402281 +v 0.689277 0.140065 1.402281 +v 0.724407 -0.007201 1.402281 +v 0.808423 -0.006380 1.402281 +v 0.860164 0.059818 1.402281 +v 0.840668 0.141545 1.402281 +v 0.764616 0.177258 1.402281 +v 0.678617 0.059699 1.402281 +v 0.695138 0.135485 1.402281 +v 0.727569 -0.000468 1.402281 +v 0.805130 0.000290 1.402281 +v 0.852896 0.061402 1.402281 +v 0.834898 0.136850 1.402281 +v 0.764689 0.169820 1.402281 +v 0.732984 -0.046620 1.371638 +v 0.636126 0.072792 1.373111 +v 0.732982 -0.045672 1.372373 +v 0.805065 -0.045535 1.371933 +v 0.651546 0.143207 1.373164 +v 0.805066 -0.045916 1.371638 +v 0.676901 0.175766 1.373198 +v 0.643954 0.029095 1.371638 +v 0.741521 0.207708 1.373169 +v 0.644651 0.029648 1.372329 +v 0.787733 0.209841 1.371779 +v 0.689488 -0.026793 1.371676 +v 0.852612 0.178430 1.372443 +v 0.689449 -0.026824 1.371638 +v 0.879005 0.143251 1.373046 +v 0.895650 0.073117 1.373110 +v 0.654734 0.167065 1.371638 +v 0.654734 0.167065 1.371638 +v 0.649624 0.143627 1.371638 +v 0.885516 0.030400 1.372732 +v 0.634272 0.073198 1.371638 +v 0.841143 -0.026407 1.372715 +v 0.628735 0.047800 1.371638 +v 0.628736 0.047800 1.371638 +v 0.705771 -0.046886 1.371638 +v 0.827830 -0.045694 1.371638 +v 0.827830 -0.045694 1.371638 +v 0.740646 0.209478 1.371638 +v 0.705771 -0.046886 1.371638 +v 0.886627 0.029532 1.371638 +v 0.676010 0.177568 1.371638 +v 0.853065 0.179364 1.371638 +v 0.903001 0.050480 1.371638 +v 0.903001 0.050480 1.371638 +v 0.842237 -0.027261 1.371638 +v 0.880771 0.143670 1.371638 +v 0.787813 0.210005 1.371638 +v 0.897497 0.073555 1.371638 +v 0.874678 0.169214 1.371638 +v 0.874678 0.169214 1.371638 +v 0.764188 0.221100 1.371638 +v 0.764188 0.221100 1.371638 +vt 0.750000 0.452782 +vt 0.710439 0.448886 +vt 0.672399 0.437346 +vt 0.637341 0.418607 +vt 0.606612 0.393389 +vt 0.581393 0.362660 +vt 0.562654 0.327601 +vt 0.551114 0.289561 +vt 0.547218 0.250000 +vt 0.551114 0.210439 +vt 0.562654 0.172399 +vt 0.581393 0.137341 +vt 0.606611 0.106612 +vt 0.637340 0.081393 +vt 0.672399 0.062654 +vt 0.710439 0.051114 +vt 0.750000 0.047218 +vt 0.789561 0.051114 +vt 0.827601 0.062654 +vt 0.862660 0.081393 +vt 0.893388 0.106612 +vt 0.918607 0.137340 +vt 0.937346 0.172399 +vt 0.948886 0.210439 +vt 0.952782 0.250000 +vt 0.948886 0.289561 +vt 0.937346 0.327601 +vt 0.918607 0.362660 +vt 0.893388 0.393388 +vt 0.862660 0.418607 +vt 0.827601 0.437346 +vt 0.789561 0.448886 +vt 0.375000 0.055549 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.625000 0.055549 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.055549 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.625000 0.055549 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.055549 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.625000 0.055549 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.055549 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.625000 0.055549 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.055549 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.625000 0.055549 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.055549 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.625000 0.055549 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.055549 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.625000 0.055549 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.412335 0.317241 +vt 0.410609 0.320917 +vt 0.412531 0.317322 +vt 0.412958 0.315915 +vt 0.152263 0.396274 +vt 0.152682 0.395647 +vt 0.127928 0.376303 +vt 0.156129 0.398340 +vt 0.591195 0.984481 +vt 0.399843 0.984481 +vt 0.399843 0.971155 +vt 0.375000 0.971255 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 0.971315 +vt 0.591195 0.971224 +vt 0.153745 0.750000 +vt 0.154903 0.746407 +vt 0.141327 0.746407 +vt 0.167165 0.694451 +vt 0.125000 0.694451 +vt 0.125000 0.750000 +vt 0.833163 0.694451 +vt 0.858389 0.745144 +vt 0.844748 0.745144 +vt 0.846315 0.750000 +vt 0.875000 0.750000 +vt 0.875000 0.694451 +vt 0.600410 0.984481 +vt 0.408190 0.984481 +vt 0.408190 0.971582 +vt 0.375000 0.971619 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 0.971733 +vt 0.600410 0.971596 +vt 0.153381 0.750000 +vt 0.154928 0.745218 +vt 0.141595 0.745218 +vt 0.166849 0.694451 +vt 0.125000 0.694451 +vt 0.125000 0.750000 +vt 0.832813 0.694451 +vt 0.858683 0.746455 +vt 0.845591 0.746455 +vt 0.846733 0.750000 +vt 0.875000 0.750000 +vt 0.875000 0.694451 +vt 0.573964 0.984481 +vt 0.473116 0.981439 +vt 0.401976 0.984481 +vt 0.401976 0.972243 +vt 0.375000 0.972387 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 0.972512 +vt 0.573964 0.972443 +vt 0.152613 0.750000 +vt 0.153908 0.745990 +vt 0.141422 0.745990 +vt 0.166976 0.694451 +vt 0.125000 0.694451 +vt 0.125000 0.750000 +vt 0.833717 0.694451 +vt 0.857878 0.742873 +vt 0.845202 0.742873 +vt 0.847513 0.750000 +vt 0.875000 0.750000 +vt 0.875000 0.694451 +vt 0.589589 0.984481 +vt 0.399342 0.984481 +vt 0.399342 0.972688 +vt 0.375000 0.972740 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 0.972784 +vt 0.589589 0.972622 +vt 0.152260 0.750000 +vt 0.153402 0.746478 +vt 0.141312 0.746478 +vt 0.167183 0.694451 +vt 0.125000 0.694451 +vt 0.125000 0.750000 +vt 0.833224 0.694451 +vt 0.858337 0.744916 +vt 0.846141 0.744916 +vt 0.847784 0.750000 +vt 0.875000 0.750000 +vt 0.875000 0.694451 +vt 0.380444 0.111203 +vt 0.383205 0.116795 +vt 0.393389 0.106612 +vt 0.362660 0.081393 +vt 0.357667 0.088865 +vt 0.370830 0.091733 +vt 0.377584 0.105411 +vt 0.382170 0.108995 +vt 0.586096 0.984481 +vt 0.402404 0.984481 +vt 0.402404 0.972417 +vt 0.375000 0.972577 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 0.972524 +vt 0.586097 0.972492 +vt 0.152423 0.750000 +vt 0.153697 0.746050 +vt 0.141408 0.746050 +vt 0.167076 0.694451 +vt 0.125000 0.694451 +vt 0.125000 0.750000 +vt 0.833377 0.694451 +vt 0.858220 0.744394 +vt 0.845706 0.744394 +vt 0.847524 0.750000 +vt 0.875000 0.750000 +vt 0.875000 0.694451 +vt 0.588803 0.984481 +vt 0.415522 0.984481 +vt 0.415522 0.972094 +vt 0.375000 0.972228 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 0.972004 +vt 0.588803 0.971881 +vt 0.152772 0.750000 +vt 0.154703 0.744036 +vt 0.141861 0.744036 +vt 0.166470 0.694451 +vt 0.125000 0.694451 +vt 0.125000 0.750000 +vt 0.833186 0.694451 +vt 0.858332 0.744893 +vt 0.845352 0.744893 +vt 0.847004 0.750000 +vt 0.875000 0.750000 +vt 0.875000 0.694451 +vt 0.573901 0.984481 +vt 0.474247 0.981473 +vt 0.403890 0.984481 +vt 0.403890 0.971415 +vt 0.375000 0.971431 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 0.971341 +vt 0.617771 0.971297 +vt 0.573901 0.971321 +vt 0.153569 0.750000 +vt 0.154943 0.745707 +vt 0.141484 0.745707 +vt 0.166900 0.694451 +vt 0.125000 0.694451 +vt 0.125000 0.750000 +vt 0.833722 0.694451 +vt 0.857876 0.742861 +vt 0.844047 0.742861 +vt 0.846341 0.750000 +vt 0.875000 0.750000 +vt 0.875000 0.694451 +vt 1.000000 1.000000 +vt 1.000000 0.977747 +vt 0.995887 0.976695 +vt 0.986735 0.975180 +vt 0.986735 1.000000 +vt 0.869255 1.000000 +vt 0.869255 0.975489 +vt 0.857143 0.978177 +vt 0.857143 1.000000 +vt 0.719162 0.977782 +vt 0.714286 0.979047 +vt 0.714286 1.000000 +vt 0.726537 1.000000 +vt 0.726537 0.976532 +vt 0.845621 1.000000 +vt 0.845621 0.975664 +vt 0.841207 0.974701 +vt 0.810380 0.970860 +vt 0.784754 0.970185 +vt 0.781354 0.970185 +vt 0.780127 0.970185 +vt 0.751788 0.972253 +vt 0.731550 0.975683 +vt 0.731550 1.000000 +vt 0.841581 1.000000 +vt 0.841581 0.974783 +vt 0.589608 1.000000 +vt 0.696791 1.000000 +vt 0.696791 0.975918 +vt 0.685556 0.973908 +vt 0.655317 0.971403 +vt 0.625862 0.971884 +vt 0.594829 0.975449 +vt 0.589608 0.976540 +vt 0.571429 1.000000 +vt 0.584200 1.000000 +vt 0.584200 0.977671 +vt 0.571429 0.980340 +vt 0.702447 0.976930 +vt 0.702447 1.000000 +vt 0.446758 1.000000 +vt 0.554851 1.000000 +vt 0.554851 0.977003 +vt 0.527986 0.973287 +vt 0.498048 0.972073 +vt 0.467892 0.973849 +vt 0.446758 0.977145 +vt 0.428571 1.000000 +vt 0.441838 1.000000 +vt 0.441838 0.977913 +vt 0.435005 0.978979 +vt 0.428571 0.980569 +vt 0.558661 0.977531 +vt 0.558661 1.000000 +vt 0.560149 0.977736 +vt 0.415389 0.978036 +vt 0.415389 1.000000 +vt 0.309169 0.975385 +vt 0.305027 0.976197 +vt 0.305027 1.000000 +vt 0.412002 1.000000 +vt 0.412002 0.977386 +vt 0.400548 0.975185 +vt 0.369744 0.972202 +vt 0.340075 0.972264 +vt 0.297973 1.000000 +vt 0.297973 0.977580 +vt 0.285714 0.979982 +vt 0.285714 1.000000 +vt 0.416059 0.357087 +vt 0.418109 0.358843 +vt 0.442688 0.377519 +vt 0.478382 0.221132 +vt 0.445992 0.234885 +vt 0.443039 0.236044 +vt 0.438297 0.257223 +vt 0.430581 0.291701 +vt 0.423064 0.325372 +vt 0.437640 0.399638 +vt 0.441377 0.383261 +vt 0.433246 0.393209 +vt 0.184488 0.071792 +vt 0.207513 0.071256 +vt 0.245500 0.070956 +vt 0.283013 0.071276 +vt 0.312784 0.071960 +vt 0.313923 0.069442 +vt 0.329965 0.033767 +vt 0.172381 0.033767 +vt 0.183417 0.068541 +vt 0.335519 0.033767 +vt 0.365740 0.048324 +vt 0.354132 0.033767 +vt 0.432525 0.191471 +vt 0.436311 0.189957 +vt 0.468080 0.176654 +vt 0.370656 0.054488 +vt 0.355136 0.088999 +vt 0.353492 0.092633 +vt 0.355564 0.095101 +vt 0.380082 0.124766 +vt 0.403170 0.153489 +vt 0.426641 0.183685 +vt 0.473222 0.183101 +vt 0.480008 0.214008 +vt 0.483983 0.196595 +vt 0.022842 0.200525 +vt 0.027160 0.182623 +vt 0.016017 0.196595 +vt 0.136101 0.099156 +vt 0.142886 0.090878 +vt 0.142141 0.088637 +vt 0.130807 0.052653 +vt 0.033572 0.174582 +vt 0.061005 0.185471 +vt 0.064758 0.186857 +vt 0.065503 0.185941 +vt 0.089426 0.156450 +vt 0.112362 0.128229 +vt 0.145868 0.033767 +vt 0.133885 0.048793 +vt 0.165209 0.033767 +vt 0.274063 0.977207 +vt 0.274063 1.000000 +vt 0.274730 0.977308 +vt 0.183477 0.972119 +vt 0.159634 0.975514 +vt 0.159634 1.000000 +vt 0.270291 1.000000 +vt 0.270291 0.976634 +vt 0.242560 0.972419 +vt 0.212961 0.970801 +vt 0.156216 1.000000 +vt 0.156216 0.976001 +vt 0.151695 0.976645 +vt 0.142857 0.978718 +vt 0.142857 1.000000 +vt 0.129492 0.975976 +vt 0.129491 1.000000 +vt 0.000000 0.977747 +vt 0.000000 1.000000 +vt 0.013338 1.000000 +vt 0.013338 0.975309 +vt 0.018035 0.974450 +vt 0.018035 1.000000 +vt 0.124878 1.000000 +vt 0.124878 0.975029 +vt 0.117760 0.973569 +vt 0.087492 0.970216 +vt 0.084969 0.970185 +vt 0.058667 0.970185 +vt 0.055005 0.970185 +vt 0.028975 0.972450 +vt 0.019797 0.213154 +vt 0.051909 0.224916 +vt 0.021021 0.218517 +vt 0.056918 0.375792 +vt 0.084307 0.348069 +vt 0.086020 0.346400 +vt 0.079806 0.322620 +vt 0.070975 0.288475 +vt 0.062090 0.254257 +vt 0.054327 0.225559 +vt 0.250000 0.490000 +vt 0.267423 0.481609 +vt 0.232480 0.481563 +vt 0.274590 0.439780 +vt 0.271963 0.479423 +vt 0.412452 0.411767 +vt 0.390902 0.389016 +vt 0.387945 0.385993 +vt 0.357919 0.399840 +vt 0.325828 0.414536 +vt 0.293364 0.429104 +vt 0.274738 0.437263 +vt 0.062360 0.399638 +vt 0.079916 0.408092 +vt 0.058027 0.380651 +vt 0.112684 0.384040 +vt 0.085976 0.411010 +vt 0.226311 0.478592 +vt 0.228861 0.439953 +vt 0.229066 0.436538 +vt 0.220119 0.432677 +vt 0.186405 0.417424 +vt 0.153938 0.401805 +vt 0.120154 0.384464 +vt 0.115045 0.381715 +vt 0.421730 0.407299 +vt 0.307648 0.389175 +vt 0.279042 0.396002 +vt 0.279079 0.396192 +vt 0.307723 0.389356 +vt 0.389114 0.307623 +vt 0.376489 0.334517 +vt 0.376651 0.334626 +vt 0.389293 0.307697 +vt 0.402170 0.280269 +vt 0.401975 0.280230 +vt 0.378724 0.163989 +vt 0.378562 0.164098 +vt 0.391947 0.191204 +vt 0.392126 0.191130 +vt 0.280294 0.097703 +vt 0.310369 0.104256 +vt 0.310444 0.104075 +vt 0.280331 0.097514 +vt 0.139971 0.139972 +vt 0.163622 0.120726 +vt 0.163514 0.120565 +vt 0.139834 0.139834 +vt 0.097536 0.250000 +vt 0.097729 0.250000 +vt 0.097430 0.219652 +vt 0.097236 0.219613 +vt 0.166562 0.374875 +vt 0.166669 0.374714 +vt 0.143440 0.356561 +vt 0.143302 0.356698 +vt 0.250000 0.402933 +vt 0.250000 0.403132 +vt 0.190597 0.393412 +vt 0.190520 0.393597 +vt 0.196887 0.398327 +vt 0.196841 0.398536 +vt 0.233294 0.406920 +vt 0.233248 0.407130 +vt 0.098028 0.280229 +vt 0.097835 0.280268 +vt 0.098236 0.301349 +vt 0.098044 0.301444 +vt 0.119048 0.337500 +vt 0.115352 0.334612 +vt 0.115160 0.334707 +vt 0.118879 0.337613 +vt 0.115335 0.160020 +vt 0.115167 0.159907 +vt 0.114589 0.160627 +vt 0.114397 0.160534 +vt 0.097174 0.193751 +vt 0.096980 0.193657 +vt 0.250000 0.091103 +vt 0.250000 0.090905 +vt 0.231758 0.087128 +vt 0.231708 0.086920 +vt 0.188176 0.100745 +vt 0.195193 0.095035 +vt 0.195143 0.094826 +vt 0.188099 0.100558 +vt 0.364605 0.135395 +vt 0.364460 0.135540 +vt 0.363417 0.132989 +vt 0.363285 0.133159 +vt 0.334323 0.109475 +vt 0.334455 0.109306 +vt 0.410071 0.263439 +vt 0.409858 0.263439 +vt 0.405885 0.218993 +vt 0.405688 0.219032 +vt 0.409147 0.226037 +vt 0.409363 0.226037 +vt 0.334490 0.382968 +vt 0.334358 0.382801 +vt 0.364335 0.360405 +vt 0.364469 0.360574 +vt 0.879125 0.952094 +vt 0.879125 1.000000 +vt 0.980478 1.000000 +vt 0.980478 0.952094 +vt 0.963724 0.952094 +vt 0.934599 0.952094 +vt 0.905911 0.952094 +vt 0.734152 0.952094 +vt 0.734153 1.000000 +vt 0.838646 1.000000 +vt 0.838646 0.952094 +vt 0.810748 0.952094 +vt 0.781767 0.952094 +vt 0.752247 0.952094 +vt 0.592608 0.952094 +vt 0.592608 1.000000 +vt 0.693652 1.000000 +vt 0.693652 0.952094 +vt 0.686031 0.952094 +vt 0.655756 0.952094 +vt 0.626267 0.952094 +vt 0.595198 0.952094 +vt 0.449715 0.952094 +vt 0.449715 1.000000 +vt 0.552112 1.000000 +vt 0.552112 0.952094 +vt 0.528197 0.952094 +vt 0.498171 0.952094 +vt 0.467927 0.952094 +vt 0.307849 0.952094 +vt 0.307849 1.000000 +vt 0.409220 1.000000 +vt 0.409220 0.952094 +vt 0.400396 0.952094 +vt 0.369515 0.952094 +vt 0.339771 0.952094 +vt 0.308788 0.952094 +vt 0.389345 0.328970 +vt 0.443640 0.373348 +vt 0.477538 0.224832 +vt 0.346726 0.253555 +vt 0.349989 0.267876 +vt 0.351188 0.273135 +vt 0.334909 0.201692 +vt 0.465228 0.173077 +vt 0.373383 0.057907 +vt 0.315627 0.177817 +vt 0.331177 0.185313 +vt 0.148795 0.273060 +vt 0.153088 0.254285 +vt 0.089612 0.238977 +vt 0.186333 0.176851 +vt 0.128278 0.055824 +vt 0.036137 0.171366 +vt 0.164944 0.202428 +vt 0.168871 0.185252 +vt 0.267712 0.154721 +vt 0.325971 0.033767 +vt 0.176691 0.033767 +vt 0.234265 0.153790 +vt 0.250039 0.146201 +vt 0.162409 0.952094 +vt 0.162409 1.000000 +vt 0.267372 1.000000 +vt 0.267372 0.952094 +vt 0.242106 0.952094 +vt 0.212500 0.952094 +vt 0.183011 0.952094 +vt 0.028760 0.952094 +vt 0.020973 0.952094 +vt 0.020973 1.000000 +vt 0.121913 1.000000 +vt 0.121913 0.952094 +vt 0.117337 0.952094 +vt 0.087140 0.952094 +vt 0.058382 0.952094 +vt 0.056018 0.371849 +vt 0.160868 0.288211 +vt 0.021967 0.222664 +vt 0.194017 0.329809 +vt 0.089871 0.412886 +vt 0.222452 0.476734 +vt 0.222629 0.343509 +vt 0.204928 0.343503 +vt 0.275820 0.343529 +vt 0.275642 0.477652 +vt 0.408767 0.413542 +vt 0.306102 0.329628 +vt 0.295002 0.343536 +vt 0.339283 0.288052 +vt 0.348645 0.328667 +vt 0.373008 0.221924 +vt 0.304744 0.136323 +vt 0.195256 0.136323 +vt 0.126992 0.221924 +vt 0.151355 0.328667 +vt 0.250000 0.376172 +vt 0.250000 0.401586 +vt 0.250000 0.414201 +vt 0.378377 0.352378 +vt 0.368515 0.344513 +vt 0.410084 0.213462 +vt 0.397786 0.216269 +vt 0.321244 0.102060 +vt 0.315771 0.113425 +vt 0.178756 0.102060 +vt 0.184229 0.113425 +vt 0.089916 0.213462 +vt 0.102214 0.216269 +vt 0.121623 0.352378 +vt 0.131485 0.344513 +vt 0.375000 0.275590 +vt 0.625000 0.275535 +vt 0.375000 0.275500 +vt 0.625000 0.275529 +vt 0.375000 0.276953 +vt 0.625000 0.276274 +vt 0.375000 0.275656 +vt 0.625000 0.275590 +vt 0.375000 0.275978 +vt 0.625000 0.275995 +vt 0.375000 0.276796 +vt 0.625000 0.276345 +vt 0.375000 0.277059 +vt 0.625000 0.276391 +vt 0.856398 0.502042 +vt 0.859050 0.689438 +vt 0.832459 0.689438 +vt 0.832412 0.689867 +vt 0.875000 0.500000 +vt 0.849465 0.500000 +vt 0.847674 0.502042 +vt 0.167652 0.690629 +vt 0.141088 0.690629 +vt 0.143593 0.501971 +vt 0.152318 0.501971 +vt 0.150590 0.500000 +vt 0.125000 0.500000 +vt 0.167701 0.691059 +vt 0.856398 0.502049 +vt 0.858902 0.690709 +vt 0.832340 0.690709 +vt 0.832290 0.691138 +vt 0.875000 0.500000 +vt 0.849471 0.500000 +vt 0.847676 0.502049 +vt 0.167557 0.689479 +vt 0.140957 0.689479 +vt 0.143607 0.502087 +vt 0.152330 0.502087 +vt 0.150500 0.500000 +vt 0.125000 0.500000 +vt 0.167604 0.689909 +vt 0.848726 0.500000 +vt 0.847785 0.501077 +vt 0.856517 0.501077 +vt 0.859288 0.687453 +vt 0.832575 0.687453 +vt 0.832534 0.687880 +vt 0.875000 0.500000 +vt 0.167566 0.689913 +vt 0.141000 0.689913 +vt 0.142774 0.592035 +vt 0.143377 0.500190 +vt 0.152119 0.500190 +vt 0.151953 0.500000 +vt 0.125000 0.500000 +vt 0.167616 0.690344 +vt 0.849410 0.500000 +vt 0.847690 0.501970 +vt 0.856410 0.501970 +vt 0.859085 0.689215 +vt 0.832513 0.689215 +vt 0.832463 0.689644 +vt 0.875000 0.500000 +vt 0.167672 0.690694 +vt 0.141100 0.690694 +vt 0.143580 0.501884 +vt 0.152302 0.501884 +vt 0.150656 0.500000 +vt 0.125000 0.500000 +vt 0.167720 0.691124 +vt 0.849005 0.500000 +vt 0.847746 0.501441 +vt 0.856473 0.501441 +vt 0.859141 0.688654 +vt 0.832504 0.688653 +vt 0.832460 0.689083 +vt 0.875000 0.500000 +vt 0.167612 0.690305 +vt 0.141048 0.690305 +vt 0.143529 0.501464 +vt 0.152256 0.501464 +vt 0.150978 0.500000 +vt 0.125000 0.500000 +vt 0.167662 0.690735 +vt 0.856527 0.500984 +vt 0.859066 0.689369 +vt 0.832497 0.689369 +vt 0.832447 0.689797 +vt 0.875000 0.500000 +vt 0.848655 0.500000 +vt 0.847793 0.500984 +vt 0.167396 0.688069 +vt 0.140785 0.688069 +vt 0.143402 0.500395 +vt 0.152141 0.500395 +vt 0.151796 0.500000 +vt 0.125000 0.500000 +vt 0.167443 0.688500 +vt 0.856534 0.500924 +vt 0.859303 0.687435 +vt 0.832721 0.687435 +vt 0.832672 0.687862 +vt 0.875000 0.500000 +vt 0.848609 0.500000 +vt 0.847799 0.500924 +vt 0.167534 0.689636 +vt 0.140966 0.689636 +vt 0.142767 0.590999 +vt 0.143360 0.500052 +vt 0.152104 0.500052 +vt 0.152059 0.500000 +vt 0.125000 0.500000 +vt 0.167585 0.690068 +vt 0.971926 0.953202 +vt 1.000000 0.953202 +vt 1.000000 0.953202 +vt 1.000000 0.970060 +vt 0.971926 0.970060 +vt 0.857143 0.953202 +vt 0.887565 0.953202 +vt 0.887565 0.970060 +vt 0.857143 0.970060 +vt 0.828921 0.953202 +vt 0.857143 0.953202 +vt 0.828921 0.970060 +vt 0.714286 0.953202 +vt 0.744554 0.953202 +vt 0.744554 0.970060 +vt 0.714286 0.970060 +vt 0.571429 0.970060 +vt 0.571429 0.953202 +vt 0.571429 0.953202 +vt 0.598072 0.953202 +vt 0.598072 0.970059 +vt 0.682436 0.953202 +vt 0.714286 0.953202 +vt 0.705731 0.970059 +vt 0.682436 0.970060 +vt 0.428571 0.970060 +vt 0.428571 0.953202 +vt 0.428572 0.953202 +vt 0.459688 0.953202 +vt 0.459688 0.970060 +vt 0.544050 0.953202 +vt 0.544050 0.970060 +vt 0.285714 0.953202 +vt 0.285714 0.953202 +vt 0.316448 0.953202 +vt 0.316448 0.970060 +vt 0.285714 0.970060 +vt 0.400809 0.953202 +vt 0.400809 0.970060 +vt 0.257770 0.953202 +vt 0.257770 0.970060 +vt 0.142857 0.953202 +vt 0.173403 0.953202 +vt 0.173403 0.970060 +vt 0.142857 0.970060 +vt 0.112131 0.953202 +vt 0.142857 0.953202 +vt 0.112131 0.970060 +vt 0.000000 0.953202 +vt 0.027770 0.953202 +vt 0.027770 0.970060 +vt 0.000000 0.970060 +vt 0.436509 0.398736 +vt 0.250000 0.488554 +vt 0.286652 0.470904 +vt 0.285207 0.467896 +vt 0.395397 0.414961 +vt 0.396791 0.417863 +vt 0.436509 0.398736 +vt 0.472813 0.239678 +vt 0.482573 0.196917 +vt 0.482573 0.196917 +vt 0.445609 0.358866 +vt 0.444141 0.358513 +vt 0.472731 0.239658 +vt 0.377577 0.065256 +vt 0.353505 0.035070 +vt 0.453798 0.160833 +vt 0.452533 0.161826 +vt 0.377069 0.065654 +vt 0.353505 0.035070 +vt 0.313830 0.035070 +vt 0.313831 0.037425 +vt 0.191586 0.037462 +vt 0.191586 0.035070 +vt 0.146495 0.035070 +vt 0.146495 0.035070 +vt 0.121412 0.066523 +vt 0.123927 0.068533 +vt 0.047598 0.164020 +vt 0.045194 0.162098 +vt 0.017427 0.196917 +vt 0.017427 0.196917 +vt 0.026437 0.236395 +vt 0.028158 0.236023 +vt 0.053944 0.355518 +vt 0.053641 0.355583 +vt 0.063491 0.398736 +vt 0.063491 0.398736 +vt 0.213745 0.471095 +vt 0.250000 0.488554 +vt 0.103606 0.418055 +vt 0.105057 0.415037 +vt 0.215223 0.468022 +vt 0.937420 0.533849 +vt 0.937175 0.519291 +vt 0.906575 0.519291 +vt 0.906330 0.533849 +vt 0.909393 0.538582 +vt 0.934356 0.538582 +vt 0.934358 0.657826 +vt 0.909393 0.657826 +vt 0.909392 0.736465 +vt 0.934357 0.736465 +vt 0.903108 0.657826 +vt 0.878143 0.657826 +vt 0.878142 0.736465 +vt 0.903107 0.736465 +vt 0.871858 0.657826 +vt 0.846893 0.657826 +vt 0.846892 0.736465 +vt 0.871857 0.736465 +vt 0.840608 0.657826 +vt 0.815643 0.657826 +vt 0.815642 0.736465 +vt 0.840607 0.736465 +vt 0.809358 0.657826 +vt 0.784393 0.657826 +vt 0.784392 0.736465 +vt 0.809357 0.736465 +vt 0.778108 0.657826 +vt 0.753143 0.657826 +vt 0.753142 0.736465 +vt 0.778107 0.736465 +vt 0.746858 0.657826 +vt 0.721893 0.657826 +vt 0.721892 0.736465 +vt 0.746857 0.736465 +vt 0.715608 0.657826 +vt 0.690643 0.657826 +vt 0.690642 0.736465 +vt 0.715607 0.736465 +vt 0.684358 0.657826 +vt 0.659393 0.657826 +vt 0.659392 0.736465 +vt 0.684357 0.736465 +vt 0.653108 0.657826 +vt 0.628143 0.657826 +vt 0.628142 0.736465 +vt 0.653107 0.736465 +vt 0.621858 0.657826 +vt 0.596893 0.657826 +vt 0.596892 0.736465 +vt 0.621857 0.736465 +vt 0.590608 0.657826 +vt 0.565643 0.657826 +vt 0.565642 0.736465 +vt 0.590607 0.736465 +vt 0.559358 0.657826 +vt 0.534393 0.657826 +vt 0.534392 0.736465 +vt 0.559357 0.736465 +vt 0.528108 0.657826 +vt 0.503143 0.657826 +vt 0.503142 0.736465 +vt 0.528107 0.736465 +vt 0.496858 0.657826 +vt 0.471893 0.657826 +vt 0.471892 0.736465 +vt 0.496857 0.736465 +vt 0.465608 0.657826 +vt 0.440643 0.657826 +vt 0.440642 0.736465 +vt 0.465607 0.736465 +vt 0.434358 0.657826 +vt 0.409393 0.657826 +vt 0.409392 0.736465 +vt 0.434357 0.736465 +vt 0.403108 0.657826 +vt 0.378143 0.657826 +vt 0.378142 0.736465 +vt 0.403107 0.736465 +vt 0.371858 0.657826 +vt 0.346893 0.657826 +vt 0.346892 0.736465 +vt 0.371857 0.736465 +vt 0.340608 0.657826 +vt 0.315643 0.657826 +vt 0.315642 0.736465 +vt 0.340607 0.736465 +vt 0.309358 0.657826 +vt 0.284393 0.657826 +vt 0.284392 0.736465 +vt 0.309357 0.736465 +vt 0.278108 0.657826 +vt 0.253143 0.657826 +vt 0.253142 0.736465 +vt 0.278107 0.736465 +vt 0.246858 0.657826 +vt 0.221893 0.657826 +vt 0.221892 0.736465 +vt 0.246857 0.736465 +vt 0.215608 0.657826 +vt 0.190643 0.657826 +vt 0.190642 0.736465 +vt 0.215607 0.736465 +vt 0.184358 0.657826 +vt 0.159393 0.657826 +vt 0.159392 0.736465 +vt 0.184357 0.736465 +vt 0.153108 0.657826 +vt 0.128143 0.657826 +vt 0.128142 0.736465 +vt 0.153107 0.736465 +vt 0.121858 0.657826 +vt 0.096893 0.657826 +vt 0.096892 0.736465 +vt 0.121857 0.736465 +vt 0.090608 0.657826 +vt 0.065643 0.657826 +vt 0.065642 0.736465 +vt 0.090607 0.736465 +vt 0.906170 0.533849 +vt 0.905925 0.519291 +vt 0.875325 0.519291 +vt 0.875080 0.533849 +vt 0.878143 0.538582 +vt 0.903106 0.538582 +vt 0.965608 0.657826 +vt 0.940643 0.657826 +vt 0.940642 0.736465 +vt 0.965607 0.736465 +vt 0.968670 0.533849 +vt 0.968425 0.519291 +vt 0.937825 0.519291 +vt 0.937580 0.533849 +vt 0.940643 0.538582 +vt 0.965606 0.538582 +vt 0.028106 0.538582 +vt 0.003143 0.538582 +vt 0.003143 0.630756 +vt 0.028107 0.630756 +vt 0.999675 0.519291 +vt 0.998788 0.500000 +vt 0.969962 0.500000 +vt 0.969075 0.519291 +vt 0.750000 0.471391 +vt 0.793191 0.467137 +vt 0.000080 0.966151 +vt 0.000325 0.980709 +vt 0.030925 0.980709 +vt 0.031170 0.966151 +vt 0.028106 0.961418 +vt 0.003143 0.961418 +vt 0.969075 0.980709 +vt 0.969962 1.000000 +vt 0.998788 1.000000 +vt 0.999675 0.980709 +vt 0.293191 0.467137 +vt 0.289561 0.448886 +vt 0.250000 0.452782 +vt 0.250000 0.471391 +vt 0.940643 0.630756 +vt 0.965607 0.630756 +vt 0.967538 0.500000 +vt 0.938712 0.500000 +vt 0.834722 0.454539 +vt 0.965607 0.869244 +vt 0.940643 0.869244 +vt 0.940643 0.961418 +vt 0.965606 0.961418 +vt 0.937825 0.980709 +vt 0.938712 1.000000 +vt 0.967538 1.000000 +vt 0.968425 0.980709 +vt 0.334723 0.454539 +vt 0.327601 0.437346 +vt 0.909393 0.630756 +vt 0.934357 0.630756 +vt 0.936288 0.500000 +vt 0.907461 0.500000 +vt 0.872998 0.434080 +vt 0.934357 0.869244 +vt 0.909393 0.869244 +vt 0.909393 0.961418 +vt 0.934356 0.961418 +vt 0.906575 0.980709 +vt 0.907462 1.000000 +vt 0.936288 1.000000 +vt 0.937175 0.980709 +vt 0.372998 0.434080 +vt 0.362660 0.418607 +vt 0.878143 0.630756 +vt 0.903107 0.630756 +vt 0.905038 0.500000 +vt 0.876212 0.500000 +vt 0.906547 0.406547 +vt 0.903107 0.869244 +vt 0.878143 0.869244 +vt 0.878143 0.961418 +vt 0.903106 0.961418 +vt 0.875325 0.980709 +vt 0.876212 1.000000 +vt 0.905038 1.000000 +vt 0.905925 0.980709 +vt 0.406547 0.406547 +vt 0.393388 0.393388 +vt 0.871856 0.538582 +vt 0.846893 0.538582 +vt 0.846893 0.630756 +vt 0.871857 0.630756 +vt 0.874675 0.519291 +vt 0.873788 0.500000 +vt 0.844962 0.500000 +vt 0.844075 0.519291 +vt 0.934080 0.372998 +vt 0.871857 0.869244 +vt 0.846893 0.869244 +vt 0.846893 0.961418 +vt 0.871856 0.961418 +vt 0.844075 0.980709 +vt 0.844962 1.000000 +vt 0.873788 1.000000 +vt 0.874675 0.980709 +vt 0.434080 0.372998 +vt 0.418607 0.362660 +vt 0.840606 0.538582 +vt 0.815643 0.538582 +vt 0.815643 0.630756 +vt 0.840607 0.630756 +vt 0.843425 0.519291 +vt 0.842538 0.500000 +vt 0.813712 0.500000 +vt 0.812825 0.519291 +vt 0.954539 0.334723 +vt 0.840607 0.869244 +vt 0.815643 0.869244 +vt 0.815643 0.961418 +vt 0.840606 0.961418 +vt 0.812825 0.980709 +vt 0.813712 1.000000 +vt 0.842538 1.000000 +vt 0.843425 0.980709 +vt 0.454539 0.334723 +vt 0.437346 0.327601 +vt 0.809356 0.538582 +vt 0.784393 0.538582 +vt 0.784393 0.630756 +vt 0.809357 0.630756 +vt 0.812175 0.519291 +vt 0.811288 0.500000 +vt 0.782462 0.500000 +vt 0.781575 0.519291 +vt 0.967137 0.293191 +vt 0.809357 0.869244 +vt 0.784393 0.869244 +vt 0.784393 0.961418 +vt 0.809356 0.961418 +vt 0.781575 0.980709 +vt 0.782462 1.000000 +vt 0.811288 1.000000 +vt 0.812175 0.980709 +vt 0.467137 0.293191 +vt 0.448886 0.289561 +vt 0.778106 0.538582 +vt 0.753143 0.538582 +vt 0.753143 0.630756 +vt 0.778107 0.630756 +vt 0.780925 0.519291 +vt 0.780038 0.500000 +vt 0.751211 0.500000 +vt 0.750325 0.519291 +vt 0.971391 0.250000 +vt 0.778107 0.869244 +vt 0.753143 0.869244 +vt 0.753143 0.961418 +vt 0.778106 0.961418 +vt 0.750325 0.980709 +vt 0.751212 1.000000 +vt 0.780038 1.000000 +vt 0.780925 0.980709 +vt 0.471391 0.250000 +vt 0.452782 0.250000 +vt 0.746856 0.538582 +vt 0.721893 0.538582 +vt 0.721893 0.630756 +vt 0.746857 0.630756 +vt 0.749675 0.519291 +vt 0.748788 0.500000 +vt 0.719962 0.500000 +vt 0.719075 0.519291 +vt 0.967137 0.206809 +vt 0.746857 0.869244 +vt 0.721893 0.869244 +vt 0.721893 0.961418 +vt 0.746856 0.961418 +vt 0.719075 0.980709 +vt 0.719962 1.000000 +vt 0.748788 1.000000 +vt 0.749675 0.980709 +vt 0.467137 0.206809 +vt 0.448886 0.210439 +vt 0.715606 0.538582 +vt 0.690643 0.538582 +vt 0.690643 0.630756 +vt 0.715607 0.630756 +vt 0.718425 0.519291 +vt 0.717538 0.500000 +vt 0.688712 0.500000 +vt 0.687825 0.519291 +vt 0.954539 0.165277 +vt 0.715607 0.869244 +vt 0.690643 0.869244 +vt 0.690643 0.961418 +vt 0.715606 0.961418 +vt 0.687825 0.980709 +vt 0.688712 1.000000 +vt 0.717538 1.000000 +vt 0.718425 0.980709 +vt 0.454539 0.165277 +vt 0.437346 0.172399 +vt 0.684356 0.538582 +vt 0.659393 0.538582 +vt 0.659393 0.630756 +vt 0.684357 0.630756 +vt 0.687175 0.519291 +vt 0.686288 0.500000 +vt 0.657462 0.500000 +vt 0.656575 0.519291 +vt 0.934080 0.127002 +vt 0.684357 0.869244 +vt 0.659393 0.869244 +vt 0.659393 0.961418 +vt 0.684356 0.961418 +vt 0.656575 0.980709 +vt 0.657462 1.000000 +vt 0.686288 1.000000 +vt 0.687175 0.980709 +vt 0.434080 0.127002 +vt 0.418607 0.137340 +vt 0.653106 0.538582 +vt 0.628143 0.538582 +vt 0.628143 0.630756 +vt 0.653107 0.630756 +vt 0.655925 0.519291 +vt 0.655039 0.500000 +vt 0.626212 0.500000 +vt 0.625325 0.519291 +vt 0.906547 0.093453 +vt 0.653107 0.869244 +vt 0.628143 0.869244 +vt 0.628143 0.961418 +vt 0.653106 0.961418 +vt 0.625325 0.980709 +vt 0.626212 1.000000 +vt 0.655038 1.000000 +vt 0.655925 0.980709 +vt 0.406547 0.093453 +vt 0.621856 0.538582 +vt 0.596893 0.538582 +vt 0.596893 0.630756 +vt 0.621857 0.630756 +vt 0.624675 0.519291 +vt 0.623788 0.500000 +vt 0.594962 0.500000 +vt 0.594075 0.519291 +vt 0.872998 0.065920 +vt 0.621857 0.869244 +vt 0.596893 0.869244 +vt 0.596893 0.961418 +vt 0.621856 0.961418 +vt 0.594075 0.980709 +vt 0.594962 1.000000 +vt 0.623788 1.000000 +vt 0.624675 0.980709 +vt 0.372998 0.065920 +vt 0.590606 0.538582 +vt 0.565643 0.538582 +vt 0.565643 0.630756 +vt 0.590607 0.630756 +vt 0.593425 0.519291 +vt 0.592538 0.500000 +vt 0.563712 0.500000 +vt 0.562825 0.519291 +vt 0.834723 0.045461 +vt 0.590607 0.869244 +vt 0.565643 0.869244 +vt 0.565643 0.961418 +vt 0.590606 0.961418 +vt 0.562825 0.980709 +vt 0.563712 1.000000 +vt 0.592538 1.000000 +vt 0.593425 0.980709 +vt 0.334723 0.045461 +vt 0.327601 0.062654 +vt 0.559356 0.538582 +vt 0.534393 0.538582 +vt 0.534393 0.630756 +vt 0.559357 0.630756 +vt 0.562175 0.519291 +vt 0.561288 0.500000 +vt 0.532462 0.500000 +vt 0.531575 0.519291 +vt 0.793191 0.032863 +vt 0.559357 0.869244 +vt 0.534393 0.869244 +vt 0.534393 0.961418 +vt 0.559356 0.961418 +vt 0.531575 0.980709 +vt 0.532462 1.000000 +vt 0.561289 1.000000 +vt 0.562175 0.980709 +vt 0.293191 0.032863 +vt 0.289561 0.051114 +vt 0.528106 0.538582 +vt 0.503143 0.538582 +vt 0.503143 0.630756 +vt 0.528107 0.630756 +vt 0.530925 0.519291 +vt 0.530038 0.500000 +vt 0.501212 0.500000 +vt 0.500325 0.519291 +vt 0.750000 0.028609 +vt 0.528107 0.869244 +vt 0.503143 0.869244 +vt 0.503143 0.961418 +vt 0.528106 0.961418 +vt 0.500325 0.980709 +vt 0.501212 1.000000 +vt 0.530038 1.000000 +vt 0.530925 0.980709 +vt 0.250000 0.028609 +vt 0.250000 0.047218 +vt 0.496856 0.538582 +vt 0.471893 0.538582 +vt 0.471893 0.630756 +vt 0.496857 0.630756 +vt 0.499675 0.519291 +vt 0.498788 0.500000 +vt 0.469962 0.500000 +vt 0.469075 0.519291 +vt 0.706809 0.032863 +vt 0.496857 0.869244 +vt 0.471893 0.869244 +vt 0.471893 0.961418 +vt 0.496856 0.961418 +vt 0.469075 0.980709 +vt 0.469962 1.000000 +vt 0.498789 1.000000 +vt 0.499675 0.980709 +vt 0.206809 0.032863 +vt 0.210439 0.051114 +vt 0.465606 0.538582 +vt 0.440643 0.538582 +vt 0.440643 0.630756 +vt 0.465607 0.630756 +vt 0.468425 0.519291 +vt 0.467538 0.500000 +vt 0.438712 0.500000 +vt 0.437825 0.519291 +vt 0.665277 0.045461 +vt 0.465607 0.869244 +vt 0.440643 0.869244 +vt 0.440643 0.961418 +vt 0.465606 0.961418 +vt 0.437825 0.980709 +vt 0.438712 1.000000 +vt 0.467538 1.000000 +vt 0.468425 0.980709 +vt 0.165277 0.045461 +vt 0.172399 0.062654 +vt 0.434356 0.538582 +vt 0.409393 0.538582 +vt 0.409393 0.630756 +vt 0.434357 0.630756 +vt 0.437175 0.519291 +vt 0.436288 0.500000 +vt 0.407461 0.500000 +vt 0.406575 0.519291 +vt 0.627002 0.065920 +vt 0.434357 0.869244 +vt 0.409393 0.869244 +vt 0.409393 0.961418 +vt 0.434356 0.961418 +vt 0.406575 0.980709 +vt 0.407462 1.000000 +vt 0.436289 1.000000 +vt 0.437175 0.980709 +vt 0.127002 0.065920 +vt 0.137340 0.081393 +vt 0.403106 0.538582 +vt 0.378143 0.538582 +vt 0.378143 0.630756 +vt 0.403107 0.630756 +vt 0.405925 0.519291 +vt 0.405038 0.500000 +vt 0.376212 0.500000 +vt 0.375325 0.519291 +vt 0.593453 0.093453 +vt 0.403107 0.869244 +vt 0.378143 0.869244 +vt 0.378143 0.961418 +vt 0.403106 0.961418 +vt 0.375325 0.980709 +vt 0.376212 1.000000 +vt 0.405038 1.000000 +vt 0.405925 0.980709 +vt 0.093453 0.093453 +vt 0.106611 0.106612 +vt 0.371856 0.538582 +vt 0.346893 0.538582 +vt 0.346893 0.630756 +vt 0.371857 0.630756 +vt 0.374675 0.519291 +vt 0.373788 0.500000 +vt 0.344962 0.500000 +vt 0.344075 0.519291 +vt 0.565920 0.127002 +vt 0.371857 0.869244 +vt 0.346893 0.869244 +vt 0.346893 0.961418 +vt 0.371856 0.961418 +vt 0.344075 0.980709 +vt 0.344962 1.000000 +vt 0.373788 1.000000 +vt 0.374675 0.980709 +vt 0.065920 0.127002 +vt 0.081393 0.137341 +vt 0.340606 0.538582 +vt 0.315643 0.538582 +vt 0.315643 0.630756 +vt 0.340607 0.630756 +vt 0.343425 0.519291 +vt 0.342539 0.500000 +vt 0.313711 0.500000 +vt 0.312825 0.519291 +vt 0.545461 0.165278 +vt 0.340607 0.869244 +vt 0.315643 0.869244 +vt 0.315643 0.961418 +vt 0.340606 0.961418 +vt 0.312825 0.980709 +vt 0.313712 1.000000 +vt 0.342539 1.000000 +vt 0.343425 0.980709 +vt 0.045461 0.165278 +vt 0.062654 0.172399 +vt 0.309356 0.538582 +vt 0.284393 0.538582 +vt 0.284393 0.630756 +vt 0.309357 0.630756 +vt 0.312175 0.519291 +vt 0.311288 0.500000 +vt 0.282462 0.500000 +vt 0.281575 0.519291 +vt 0.532863 0.206809 +vt 0.309357 0.869244 +vt 0.284393 0.869244 +vt 0.284393 0.961418 +vt 0.309356 0.961418 +vt 0.281575 0.980709 +vt 0.282462 1.000000 +vt 0.311288 1.000000 +vt 0.312175 0.980709 +vt 0.032863 0.206809 +vt 0.051114 0.210439 +vt 0.278106 0.538582 +vt 0.253143 0.538582 +vt 0.253143 0.630756 +vt 0.278107 0.630756 +vt 0.280925 0.519291 +vt 0.280038 0.500000 +vt 0.251212 0.500000 +vt 0.250325 0.519291 +vt 0.528609 0.250000 +vt 0.278107 0.869244 +vt 0.253143 0.869244 +vt 0.253143 0.961418 +vt 0.278106 0.961418 +vt 0.250325 0.980709 +vt 0.251212 1.000000 +vt 0.280038 1.000000 +vt 0.280925 0.980709 +vt 0.028609 0.250000 +vt 0.047218 0.250000 +vt 0.246856 0.538582 +vt 0.221893 0.538582 +vt 0.221893 0.630756 +vt 0.246857 0.630756 +vt 0.249675 0.519291 +vt 0.248788 0.500000 +vt 0.219962 0.500000 +vt 0.219075 0.519291 +vt 0.532863 0.293191 +vt 0.246857 0.869244 +vt 0.221893 0.869244 +vt 0.221893 0.961418 +vt 0.246856 0.961418 +vt 0.219075 0.980709 +vt 0.219962 1.000000 +vt 0.248788 1.000000 +vt 0.249675 0.980709 +vt 0.032863 0.293191 +vt 0.051115 0.289561 +vt 0.215606 0.538582 +vt 0.190643 0.538582 +vt 0.190643 0.630756 +vt 0.215607 0.630756 +vt 0.218425 0.519291 +vt 0.217538 0.500000 +vt 0.188712 0.500000 +vt 0.187825 0.519291 +vt 0.545462 0.334723 +vt 0.215607 0.869244 +vt 0.190643 0.869244 +vt 0.190643 0.961418 +vt 0.215606 0.961418 +vt 0.187825 0.980709 +vt 0.188712 1.000000 +vt 0.217538 1.000000 +vt 0.218425 0.980709 +vt 0.045462 0.334723 +vt 0.062654 0.327601 +vt 0.184356 0.538582 +vt 0.159393 0.538582 +vt 0.159393 0.630756 +vt 0.184357 0.630756 +vt 0.187175 0.519291 +vt 0.186288 0.500000 +vt 0.157462 0.500000 +vt 0.156575 0.519291 +vt 0.565920 0.372998 +vt 0.184357 0.869244 +vt 0.159393 0.869244 +vt 0.159393 0.961418 +vt 0.184356 0.961418 +vt 0.156575 0.980709 +vt 0.157462 1.000000 +vt 0.186288 1.000000 +vt 0.187175 0.980709 +vt 0.065920 0.372998 +vt 0.081393 0.362660 +vt 0.153106 0.538582 +vt 0.128143 0.538582 +vt 0.128143 0.630756 +vt 0.153107 0.630756 +vt 0.155925 0.519291 +vt 0.155038 0.500000 +vt 0.126212 0.500000 +vt 0.125325 0.519291 +vt 0.593453 0.406547 +vt 0.153107 0.869244 +vt 0.128143 0.869244 +vt 0.128143 0.961418 +vt 0.153106 0.961418 +vt 0.125325 0.980709 +vt 0.126212 1.000000 +vt 0.155038 1.000000 +vt 0.155925 0.980709 +vt 0.093453 0.406547 +vt 0.106612 0.393389 +vt 0.121856 0.538582 +vt 0.096893 0.538582 +vt 0.096893 0.630756 +vt 0.121857 0.630756 +vt 0.124675 0.519291 +vt 0.123788 0.500000 +vt 0.094962 0.500000 +vt 0.094075 0.519291 +vt 0.627002 0.434080 +vt 0.121857 0.869244 +vt 0.096893 0.869244 +vt 0.096893 0.961418 +vt 0.121856 0.961418 +vt 0.094075 0.980709 +vt 0.094962 1.000000 +vt 0.123788 1.000000 +vt 0.124675 0.980709 +vt 0.127002 0.434080 +vt 0.137341 0.418607 +vt 0.090606 0.538582 +vt 0.065643 0.538582 +vt 0.065643 0.630756 +vt 0.090607 0.630756 +vt 0.093425 0.519291 +vt 0.092538 0.500000 +vt 0.063712 0.500000 +vt 0.062825 0.519291 +vt 0.665278 0.454539 +vt 0.090607 0.869244 +vt 0.065643 0.869244 +vt 0.065643 0.961418 +vt 0.090606 0.961418 +vt 0.062825 0.980709 +vt 0.063712 1.000000 +vt 0.092538 1.000000 +vt 0.093425 0.980709 +vt 0.165278 0.454539 +vt 0.172399 0.437346 +vt 0.059356 0.538582 +vt 0.034393 0.538582 +vt 0.034393 0.630756 +vt 0.059357 0.630756 +vt 0.062175 0.519291 +vt 0.061288 0.500000 +vt 0.032462 0.500000 +vt 0.031575 0.519291 +vt 0.706809 0.467137 +vt 0.059357 0.869244 +vt 0.034393 0.869244 +vt 0.034393 0.961418 +vt 0.059356 0.961418 +vt 0.031575 0.980709 +vt 0.032462 1.000000 +vt 0.061288 1.000000 +vt 0.062175 0.980709 +vt 0.206809 0.467137 +vt 0.210440 0.448886 +vt 0.999920 0.533849 +vt 0.968830 0.533849 +vt 0.971893 0.538582 +vt 0.996856 0.538582 +vt 0.030925 0.519291 +vt 0.030038 0.500000 +vt 0.001212 0.500000 +vt 0.000325 0.519291 +vt 0.028107 0.869244 +vt 0.003143 0.869244 +vt 0.001212 1.000000 +vt 0.030038 1.000000 +vt 0.996857 0.763535 +vt 0.971892 0.763535 +vt 0.971893 0.842174 +vt 0.996858 0.842174 +vt 0.996857 0.869244 +vt 0.971893 0.869244 +vt 0.971893 0.961418 +vt 0.996856 0.961418 +vt 0.968830 0.966151 +vt 0.999920 0.966151 +vt 0.031330 0.966151 +vt 0.062420 0.966151 +vt 0.937580 0.966151 +vt 0.968670 0.966151 +vt 0.059358 0.657826 +vt 0.034393 0.657826 +vt 0.034392 0.736465 +vt 0.059357 0.736465 +vt 0.059357 0.763535 +vt 0.034392 0.763535 +vt 0.034393 0.842174 +vt 0.059358 0.842174 +vt 0.934357 0.763535 +vt 0.909392 0.763535 +vt 0.909393 0.842174 +vt 0.934358 0.842174 +vt 0.934333 0.644291 +vt 0.909417 0.644291 +vt 0.028083 0.855709 +vt 0.028108 0.842174 +vt 0.003143 0.842174 +vt 0.003167 0.855709 +vt 0.062580 0.966151 +vt 0.093670 0.966151 +vt 0.812500 0.630756 +vt 0.812500 0.538582 +vt 0.062420 0.533849 +vt 0.031330 0.533849 +vt 0.093830 0.966151 +vt 0.124920 0.966151 +vt 0.090607 0.763535 +vt 0.065642 0.763535 +vt 0.065643 0.842174 +vt 0.090608 0.842174 +vt 0.093670 0.533849 +vt 0.062580 0.533849 +vt 0.125080 0.966151 +vt 0.156170 0.966151 +vt 0.121857 0.763535 +vt 0.096892 0.763535 +vt 0.096893 0.842174 +vt 0.121858 0.842174 +vt 0.124920 0.533849 +vt 0.093830 0.533849 +vt 0.156330 0.966151 +vt 0.187420 0.966151 +vt 0.153107 0.763535 +vt 0.128142 0.763535 +vt 0.128143 0.842174 +vt 0.153108 0.842174 +vt 0.156170 0.533849 +vt 0.125080 0.533849 +vt 0.187580 0.966151 +vt 0.218670 0.966151 +vt 0.184357 0.763535 +vt 0.159392 0.763535 +vt 0.159393 0.842174 +vt 0.184358 0.842174 +vt 0.187420 0.533849 +vt 0.156330 0.533849 +vt 0.218830 0.966151 +vt 0.249920 0.966151 +vt 0.215607 0.763535 +vt 0.190642 0.763535 +vt 0.190643 0.842174 +vt 0.215608 0.842174 +vt 0.218670 0.533849 +vt 0.187580 0.533849 +vt 0.250080 0.966151 +vt 0.281170 0.966151 +vt 0.246857 0.763535 +vt 0.221892 0.763535 +vt 0.221893 0.842174 +vt 0.246858 0.842174 +vt 0.249920 0.533849 +vt 0.218830 0.533849 +vt 0.281330 0.966151 +vt 0.312420 0.966151 +vt 0.278107 0.763535 +vt 0.253142 0.763535 +vt 0.253143 0.842174 +vt 0.278108 0.842174 +vt 0.281170 0.533849 +vt 0.250080 0.533849 +vt 0.312580 0.966151 +vt 0.343670 0.966151 +vt 0.309357 0.763535 +vt 0.284392 0.763535 +vt 0.284393 0.842174 +vt 0.309358 0.842174 +vt 0.312420 0.533849 +vt 0.281330 0.533849 +vt 0.343830 0.966151 +vt 0.374920 0.966151 +vt 0.340607 0.763535 +vt 0.315642 0.763535 +vt 0.315643 0.842174 +vt 0.340608 0.842174 +vt 0.343670 0.533849 +vt 0.312580 0.533849 +vt 0.375080 0.966151 +vt 0.406170 0.966151 +vt 0.371857 0.763535 +vt 0.346892 0.763535 +vt 0.346893 0.842174 +vt 0.371858 0.842174 +vt 0.374920 0.533849 +vt 0.343830 0.533849 +vt 0.406330 0.966151 +vt 0.437420 0.966151 +vt 0.403107 0.763535 +vt 0.378142 0.763535 +vt 0.378143 0.842174 +vt 0.403108 0.842174 +vt 0.406170 0.533849 +vt 0.375080 0.533849 +vt 0.437580 0.966151 +vt 0.468670 0.966151 +vt 0.434357 0.763535 +vt 0.409392 0.763535 +vt 0.409393 0.842174 +vt 0.434358 0.842174 +vt 0.437420 0.533849 +vt 0.406330 0.533849 +vt 0.468830 0.966151 +vt 0.499920 0.966151 +vt 0.465607 0.763535 +vt 0.440642 0.763535 +vt 0.440643 0.842174 +vt 0.465608 0.842174 +vt 0.468670 0.533849 +vt 0.437580 0.533849 +vt 0.500080 0.966151 +vt 0.531170 0.966151 +vt 0.496857 0.763535 +vt 0.471892 0.763535 +vt 0.471893 0.842174 +vt 0.496858 0.842174 +vt 0.499920 0.533849 +vt 0.468830 0.533849 +vt 0.531330 0.966151 +vt 0.562420 0.966151 +vt 0.528107 0.763535 +vt 0.503142 0.763535 +vt 0.503143 0.842174 +vt 0.528108 0.842174 +vt 0.531170 0.533849 +vt 0.500080 0.533849 +vt 0.562580 0.966151 +vt 0.593670 0.966151 +vt 0.559357 0.763535 +vt 0.534392 0.763535 +vt 0.534393 0.842174 +vt 0.559358 0.842174 +vt 0.562420 0.533849 +vt 0.531330 0.533849 +vt 0.593830 0.966151 +vt 0.624920 0.966151 +vt 0.590607 0.763535 +vt 0.565642 0.763535 +vt 0.565643 0.842174 +vt 0.590608 0.842174 +vt 0.593670 0.533849 +vt 0.562580 0.533849 +vt 0.625080 0.966151 +vt 0.656170 0.966151 +vt 0.621857 0.763535 +vt 0.596892 0.763535 +vt 0.596893 0.842174 +vt 0.621858 0.842174 +vt 0.624920 0.533849 +vt 0.593830 0.533849 +vt 0.656330 0.966151 +vt 0.687420 0.966151 +vt 0.653107 0.763535 +vt 0.628142 0.763535 +vt 0.628143 0.842174 +vt 0.653108 0.842174 +vt 0.656170 0.533849 +vt 0.625080 0.533849 +vt 0.687580 0.966151 +vt 0.718670 0.966151 +vt 0.684357 0.763535 +vt 0.659392 0.763535 +vt 0.659393 0.842174 +vt 0.684358 0.842174 +vt 0.687420 0.533849 +vt 0.656330 0.533849 +vt 0.718830 0.966151 +vt 0.749920 0.966151 +vt 0.715607 0.763535 +vt 0.690642 0.763535 +vt 0.690643 0.842174 +vt 0.715608 0.842174 +vt 0.718670 0.533849 +vt 0.687580 0.533849 +vt 0.750080 0.966151 +vt 0.781170 0.966151 +vt 0.746857 0.763535 +vt 0.721892 0.763535 +vt 0.721893 0.842174 +vt 0.746858 0.842174 +vt 0.749920 0.533849 +vt 0.718830 0.533849 +vt 0.781330 0.966151 +vt 0.812420 0.966151 +vt 0.778107 0.763535 +vt 0.753142 0.763535 +vt 0.753143 0.842174 +vt 0.778108 0.842174 +vt 0.781170 0.533849 +vt 0.750080 0.533849 +vt 0.812580 0.966151 +vt 0.843670 0.966151 +vt 0.809357 0.763535 +vt 0.784392 0.763535 +vt 0.784393 0.842174 +vt 0.809358 0.842174 +vt 0.812420 0.533849 +vt 0.781330 0.533849 +vt 0.843830 0.966151 +vt 0.874920 0.966151 +vt 0.840607 0.763535 +vt 0.815642 0.763535 +vt 0.815643 0.842174 +vt 0.840608 0.842174 +vt 0.843670 0.533849 +vt 0.812580 0.533849 +vt 0.875080 0.966151 +vt 0.906170 0.966151 +vt 0.871857 0.763535 +vt 0.846892 0.763535 +vt 0.846893 0.842174 +vt 0.871858 0.842174 +vt 0.874920 0.533849 +vt 0.843830 0.533849 +vt 0.906330 0.966151 +vt 0.937420 0.966151 +vt 0.903107 0.763535 +vt 0.878142 0.763535 +vt 0.878143 0.842174 +vt 0.903108 0.842174 +vt 0.028108 0.657826 +vt 0.003143 0.657826 +vt 0.003142 0.736465 +vt 0.028107 0.736465 +vt 0.965607 0.763535 +vt 0.940642 0.763535 +vt 0.940643 0.842174 +vt 0.965608 0.842174 +vt 0.028107 0.763535 +vt 0.003142 0.763535 +vt 0.903083 0.750000 +vt 0.878166 0.750000 +vt 0.934333 0.855709 +vt 0.909417 0.855709 +vt 0.996858 0.657826 +vt 0.971893 0.657826 +vt 0.971892 0.736465 +vt 0.996857 0.736465 +vt 0.996833 0.644291 +vt 0.971917 0.644291 +vt 0.996833 0.750000 +vt 0.971916 0.750000 +vt 0.996833 0.855709 +vt 0.971917 0.855709 +vt 0.965583 0.644291 +vt 0.940667 0.644291 +vt 0.028083 0.750000 +vt 0.003166 0.750000 +vt 0.965583 0.855709 +vt 0.940667 0.855709 +vt 0.090583 0.644291 +vt 0.065667 0.644291 +vt 0.090583 0.855709 +vt 0.065667 0.855709 +vt 0.121833 0.750000 +vt 0.096916 0.750000 +vt 0.153083 0.644291 +vt 0.128167 0.644291 +vt 0.121833 0.855709 +vt 0.096917 0.855709 +vt 0.153083 0.750000 +vt 0.128166 0.750000 +vt 0.184333 0.855709 +vt 0.159417 0.855709 +vt 0.184333 0.644291 +vt 0.159417 0.644291 +vt 0.215583 0.750000 +vt 0.190666 0.750000 +vt 0.246833 0.644291 +vt 0.221917 0.644291 +vt 0.246833 0.855709 +vt 0.221917 0.855709 +vt 0.278083 0.750000 +vt 0.253166 0.750000 +vt 0.309333 0.644291 +vt 0.284417 0.644291 +vt 0.309333 0.855709 +vt 0.284417 0.855709 +vt 0.340583 0.750000 +vt 0.315666 0.750000 +vt 0.371833 0.644291 +vt 0.346917 0.644291 +vt 0.340583 0.855709 +vt 0.315667 0.855709 +vt 0.371833 0.750000 +vt 0.346916 0.750000 +vt 0.403083 0.855709 +vt 0.378167 0.855709 +vt 0.403083 0.644291 +vt 0.378167 0.644291 +vt 0.434333 0.750000 +vt 0.409416 0.750000 +vt 0.465583 0.644291 +vt 0.440667 0.644291 +vt 0.465583 0.855709 +vt 0.440667 0.855709 +vt 0.496833 0.750000 +vt 0.471916 0.750000 +vt 0.528083 0.644291 +vt 0.503167 0.644291 +vt 0.528083 0.855709 +vt 0.503167 0.855709 +vt 0.559333 0.750000 +vt 0.534416 0.750000 +vt 0.590583 0.644291 +vt 0.565667 0.644291 +vt 0.559333 0.855709 +vt 0.534417 0.855709 +vt 0.590583 0.750000 +vt 0.565666 0.750000 +vt 0.621833 0.855709 +vt 0.596917 0.855709 +vt 0.621833 0.644291 +vt 0.596917 0.644291 +vt 0.653083 0.750000 +vt 0.628166 0.750000 +vt 0.684333 0.644291 +vt 0.659417 0.644291 +vt 0.684333 0.855709 +vt 0.659417 0.855709 +vt 0.715583 0.750000 +vt 0.690666 0.750000 +vt 0.746833 0.644291 +vt 0.721917 0.644291 +vt 0.746833 0.855709 +vt 0.721917 0.855709 +vt 0.778083 0.750000 +vt 0.753166 0.750000 +vt 0.809333 0.644291 +vt 0.784417 0.644291 +vt 0.778083 0.855709 +vt 0.753167 0.855709 +vt 0.809333 0.750000 +vt 0.784416 0.750000 +vt 0.840583 0.855709 +vt 0.815667 0.855709 +vt 0.840583 0.644291 +vt 0.815667 0.644291 +vt 0.871833 0.750000 +vt 0.846916 0.750000 +vt 0.903083 0.644291 +vt 0.878167 0.644291 +vt 0.934333 0.750000 +vt 0.909416 0.750000 +vt 0.903083 0.855709 +vt 0.878167 0.855709 +vt 0.059333 0.644291 +vt 0.034417 0.644291 +vt 0.965583 0.750000 +vt 0.940666 0.750000 +vt 0.059333 0.855709 +vt 0.034417 0.855709 +vt 0.971893 0.630756 +vt 0.996857 0.630756 +vt 0.871833 0.855709 +vt 0.846917 0.855709 +vt 0.809333 0.855709 +vt 0.784417 0.855709 +vt 0.715583 0.855709 +vt 0.690667 0.855709 +vt 0.653083 0.855709 +vt 0.628167 0.855709 +vt 0.590583 0.855709 +vt 0.565667 0.855709 +vt 0.496833 0.855709 +vt 0.471917 0.855709 +vt 0.434333 0.855709 +vt 0.409417 0.855709 +vt 0.371833 0.855709 +vt 0.346917 0.855709 +vt 0.278083 0.855709 +vt 0.253167 0.855709 +vt 0.215583 0.855709 +vt 0.190667 0.855709 +vt 0.153083 0.855709 +vt 0.128167 0.855709 +vt 0.059333 0.750000 +vt 0.034416 0.750000 +vt 0.840583 0.750000 +vt 0.815666 0.750000 +vt 0.746833 0.750000 +vt 0.721916 0.750000 +vt 0.684333 0.750000 +vt 0.659416 0.750000 +vt 0.621833 0.750000 +vt 0.596916 0.750000 +vt 0.528083 0.750000 +vt 0.503166 0.750000 +vt 0.465583 0.750000 +vt 0.440666 0.750000 +vt 0.403083 0.750000 +vt 0.378166 0.750000 +vt 0.309333 0.750000 +vt 0.284416 0.750000 +vt 0.246833 0.750000 +vt 0.221916 0.750000 +vt 0.184333 0.750000 +vt 0.159416 0.750000 +vt 0.090583 0.750000 +vt 0.065666 0.750000 +vt 0.028083 0.644291 +vt 0.003167 0.644291 +vt 0.871833 0.644291 +vt 0.846917 0.644291 +vt 0.778083 0.644291 +vt 0.753167 0.644291 +vt 0.715583 0.644291 +vt 0.690667 0.644291 +vt 0.653083 0.644291 +vt 0.628167 0.644291 +vt 0.559333 0.644291 +vt 0.534417 0.644291 +vt 0.496833 0.644291 +vt 0.471917 0.644291 +vt 0.434333 0.644291 +vt 0.409417 0.644291 +vt 0.340583 0.644291 +vt 0.315667 0.644291 +vt 0.278083 0.644291 +vt 0.253167 0.644291 +vt 0.215583 0.644291 +vt 0.190667 0.644291 +vt 0.121833 0.644291 +vt 0.096917 0.644291 +vt 0.000080 0.533849 +vt 0.000002 0.538461 +vt 0.001573 0.538522 +vt -0.003083 0.961658 +vt 0.000030 0.961538 +vt 0.968771 0.538582 +vt 0.971816 0.961418 +vt 0.968711 0.961418 +vt 0.937521 0.538582 +vt 0.937461 0.961418 +vt 0.906271 0.538582 +vt 0.909316 0.961418 +vt 0.906211 0.961418 +vt 0.875021 0.538582 +vt 0.874961 0.961418 +vt 0.843771 0.538582 +vt 0.846816 0.961418 +vt 0.843711 0.961418 +vt 0.812461 0.961418 +vt 0.781271 0.538582 +vt 0.784316 0.961418 +vt 0.781211 0.961418 +vt 0.750021 0.538582 +vt 0.749961 0.961418 +vt 0.718771 0.538582 +vt 0.721816 0.961418 +vt 0.718711 0.961418 +vt 0.687521 0.538582 +vt 0.687461 0.961418 +vt 0.656271 0.538582 +vt 0.659316 0.961418 +vt 0.656211 0.961418 +vt 0.625021 0.538582 +vt 0.624961 0.961418 +vt 0.593771 0.538582 +vt 0.596816 0.961418 +vt 0.593711 0.961418 +vt 0.562521 0.538582 +vt 0.562461 0.961418 +vt 0.531271 0.538582 +vt 0.534316 0.961418 +vt 0.531211 0.961418 +vt 0.500011 0.538582 +vt 0.499980 0.961418 +vt 0.468771 0.538582 +vt 0.471816 0.961418 +vt 0.468711 0.961418 +vt 0.437521 0.538582 +vt 0.437461 0.961418 +vt 0.406271 0.538582 +vt 0.409316 0.961418 +vt 0.406211 0.961418 +vt 0.375021 0.538582 +vt 0.374961 0.961418 +vt 0.343771 0.538582 +vt 0.346816 0.961418 +vt 0.343711 0.961418 +vt 0.312521 0.538582 +vt 0.312461 0.961418 +vt 0.281271 0.538582 +vt 0.284316 0.961418 +vt 0.281211 0.961418 +vt 0.250021 0.538582 +vt 0.249961 0.961418 +vt 0.218771 0.538582 +vt 0.221816 0.961418 +vt 0.218711 0.961418 +vt 0.187521 0.538582 +vt 0.187461 0.961418 +vt 0.156271 0.538582 +vt 0.159316 0.961418 +vt 0.156211 0.961418 +vt 0.125021 0.538582 +vt 0.124961 0.961418 +vt 0.093771 0.538582 +vt 0.096816 0.961418 +vt 0.093711 0.961418 +vt 0.062521 0.538582 +vt 0.062461 0.961418 +vt 0.031170 0.533849 +vt 0.031271 0.538582 +vt 0.034316 0.961418 +vt 0.031211 0.961418 +vt 0.906250 0.630756 +vt 0.906250 0.644291 +vt 0.687500 0.630756 +vt 0.687500 0.644291 +vt 0.468750 0.630756 +vt 0.468750 0.644291 +vt 0.250000 0.630756 +vt 0.250000 0.644291 +vt 0.062500 0.630756 +vt 0.062500 0.644291 +vt 0.718750 0.736465 +vt 0.718750 0.750000 +vt 0.500000 0.736465 +vt 0.500000 0.750000 +vt 0.281250 0.736465 +vt 0.281250 0.750000 +vt 0.031250 0.763535 +vt 0.031250 0.750000 +vt 0.750000 0.842174 +vt 0.750000 0.855709 +vt 0.531250 0.842174 +vt 0.531250 0.855709 +vt 0.312500 0.842174 +vt 0.312500 0.855709 +vt 0.093750 0.842174 +vt 0.093750 0.855709 +vt 0.001571 0.842212 +vt 0.000000 0.842251 +vt 0.000000 0.855709 +vt 0.001584 0.855709 +vt 0.843750 0.630756 +vt 0.843750 0.644291 +vt 0.812500 0.644291 +vt 0.750000 0.630756 +vt 0.750000 0.644291 +vt 0.625000 0.630756 +vt 0.625000 0.644291 +vt 0.593750 0.630756 +vt 0.593750 0.644291 +vt 0.531250 0.630756 +vt 0.531250 0.644291 +vt 0.406250 0.630756 +vt 0.406250 0.644291 +vt 0.375000 0.630756 +vt 0.375000 0.644291 +vt 0.312500 0.630756 +vt 0.312500 0.644291 +vt 0.187500 0.630756 +vt 0.187500 0.644291 +vt 0.156250 0.630756 +vt 0.156250 0.644291 +vt 0.093750 0.630756 +vt 0.093750 0.644291 +vt 0.968750 0.657826 +vt 0.968750 0.644291 +vt 0.001572 0.630786 +vt 0.000000 0.630817 +vt 0.000000 0.644291 +vt 0.001584 0.644291 +vt 0.875000 0.736465 +vt 0.875000 0.750000 +vt 0.843750 0.736465 +vt 0.843750 0.750000 +vt 0.781250 0.736465 +vt 0.781250 0.750000 +vt 0.656250 0.736465 +vt 0.656250 0.750000 +vt 0.625000 0.736465 +vt 0.625000 0.750000 +vt 0.562500 0.736465 +vt 0.562500 0.750000 +vt 0.437500 0.736465 +vt 0.437500 0.750000 +vt 0.406250 0.736465 +vt 0.406250 0.750000 +vt 0.343750 0.736465 +vt 0.343750 0.750000 +vt 0.218750 0.736465 +vt 0.218750 0.750000 +vt 0.187500 0.736465 +vt 0.187500 0.750000 +vt 0.125000 0.736465 +vt 0.125000 0.750000 +vt 0.937500 0.763535 +vt 0.937500 0.750000 +vt 0.968750 0.763535 +vt 0.968750 0.750000 +vt 0.906250 0.842174 +vt 0.906250 0.855709 +vt 0.875000 0.842174 +vt 0.875000 0.855709 +vt 0.812500 0.842174 +vt 0.812500 0.855709 +vt 0.687500 0.842174 +vt 0.687500 0.855709 +vt 0.656250 0.842174 +vt 0.656250 0.855709 +vt 0.593750 0.842174 +vt 0.593750 0.855709 +vt 0.468750 0.842174 +vt 0.468750 0.855709 +vt 0.437500 0.842174 +vt 0.437500 0.855709 +vt 0.375000 0.842174 +vt 0.375000 0.855709 +vt 0.250000 0.842174 +vt 0.250000 0.855709 +vt 0.218750 0.842174 +vt 0.218750 0.855709 +vt 0.156250 0.842174 +vt 0.156250 0.855709 +vt 0.062500 0.842174 +vt 0.062500 0.855709 +vt 0.937500 0.869244 +vt 0.937500 0.855709 +vt 0.968750 0.869244 +vt 0.968750 0.855709 +vt 0.031250 0.869244 +vt 0.031250 0.855709 +vt 0.125000 0.842174 +vt 0.125000 0.855709 +vt 0.187500 0.842174 +vt 0.187500 0.855709 +vt 0.281250 0.842174 +vt 0.281250 0.855709 +vt 0.343750 0.842174 +vt 0.343750 0.855709 +vt 0.406250 0.842174 +vt 0.406250 0.855709 +vt 0.500000 0.842174 +vt 0.500000 0.855709 +vt 0.562500 0.842174 +vt 0.562500 0.855709 +vt 0.625000 0.842174 +vt 0.625000 0.855709 +vt 0.718750 0.842174 +vt 0.718750 0.855709 +vt 0.781250 0.842174 +vt 0.781250 0.855709 +vt 0.843750 0.842174 +vt 0.843750 0.855709 +vt 0.001571 0.736499 +vt 0.000000 0.736533 +vt 0.000000 0.750000 +vt 0.001583 0.750000 +vt 0.062500 0.736465 +vt 0.062500 0.750000 +vt 0.093750 0.736465 +vt 0.093750 0.750000 +vt 0.156250 0.736465 +vt 0.156250 0.750000 +vt 0.250000 0.736465 +vt 0.250000 0.750000 +vt 0.312500 0.736465 +vt 0.312500 0.750000 +vt 0.375000 0.736465 +vt 0.375000 0.750000 +vt 0.468750 0.736465 +vt 0.468750 0.750000 +vt 0.531250 0.736465 +vt 0.531250 0.750000 +vt 0.593750 0.736465 +vt 0.593750 0.750000 +vt 0.687500 0.736465 +vt 0.687500 0.750000 +vt 0.750000 0.736465 +vt 0.750000 0.750000 +vt 0.812500 0.736465 +vt 0.812500 0.750000 +vt 0.906250 0.736465 +vt 0.906250 0.750000 +vt 0.937500 0.657826 +vt 0.937500 0.644291 +vt 0.031250 0.657826 +vt 0.031250 0.644291 +vt 0.125000 0.630756 +vt 0.125000 0.644291 +vt 0.218750 0.630756 +vt 0.218750 0.644291 +vt 0.281250 0.630756 +vt 0.281250 0.644291 +vt 0.343750 0.630756 +vt 0.343750 0.644291 +vt 0.437500 0.630756 +vt 0.437500 0.644291 +vt 0.500000 0.630756 +vt 0.500000 0.644291 +vt 0.562500 0.630756 +vt 0.562500 0.644291 +vt 0.656250 0.630756 +vt 0.656250 0.644291 +vt 0.718750 0.630756 +vt 0.718750 0.644291 +vt 0.781250 0.630756 +vt 0.781250 0.644291 +vt 0.875000 0.630756 +vt 0.875000 0.644291 +vt 0.000000 0.657749 +vt 0.001571 0.657788 +vt 0.968750 0.630756 +vt 0.000000 0.763467 +vt 0.001571 0.763501 +vt 0.968750 0.736465 +vt 0.000000 0.869183 +vt 0.001572 0.869214 +vt 0.968750 0.842174 +vt 0.937500 0.630756 +vt 0.937500 0.736465 +vt 0.937500 0.842174 +vt 0.062500 0.657826 +vt 0.031250 0.630756 +vt 0.062500 0.763535 +vt 0.031250 0.736465 +vt 0.062500 0.869244 +vt 0.031250 0.842174 +vt 0.093750 0.657826 +vt 0.093750 0.763535 +vt 0.093750 0.869244 +vt 0.125000 0.657826 +vt 0.125000 0.763535 +vt 0.125000 0.869244 +vt 0.156250 0.657826 +vt 0.156250 0.763535 +vt 0.156250 0.869244 +vt 0.187500 0.657826 +vt 0.187500 0.763535 +vt 0.187500 0.869244 +vt 0.218750 0.657826 +vt 0.218750 0.763535 +vt 0.218750 0.869244 +vt 0.250000 0.657826 +vt 0.250000 0.763535 +vt 0.250000 0.869244 +vt 0.281250 0.657826 +vt 0.281250 0.763535 +vt 0.281250 0.869244 +vt 0.312500 0.657826 +vt 0.312500 0.763535 +vt 0.312500 0.869244 +vt 0.343750 0.657826 +vt 0.343750 0.763535 +vt 0.343750 0.869244 +vt 0.375000 0.657826 +vt 0.375000 0.763535 +vt 0.375000 0.869244 +vt 0.406250 0.657826 +vt 0.406250 0.763535 +vt 0.406250 0.869244 +vt 0.437500 0.657826 +vt 0.437500 0.763535 +vt 0.437500 0.869244 +vt 0.468750 0.657826 +vt 0.468750 0.763535 +vt 0.468750 0.869244 +vt 0.500000 0.657826 +vt 0.500000 0.763535 +vt 0.500000 0.869244 +vt 0.531250 0.657826 +vt 0.531250 0.763535 +vt 0.531250 0.869244 +vt 0.562500 0.657826 +vt 0.562500 0.763535 +vt 0.562500 0.869244 +vt 0.593750 0.657826 +vt 0.593750 0.763535 +vt 0.593750 0.869244 +vt 0.625000 0.657826 +vt 0.625000 0.763535 +vt 0.625000 0.869244 +vt 0.656250 0.657826 +vt 0.656250 0.763535 +vt 0.656250 0.869244 +vt 0.687500 0.657826 +vt 0.687500 0.763535 +vt 0.687500 0.869244 +vt 0.718750 0.657826 +vt 0.718750 0.763535 +vt 0.718750 0.869244 +vt 0.750000 0.657826 +vt 0.750000 0.763535 +vt 0.750000 0.869244 +vt 0.781250 0.657826 +vt 0.781250 0.763535 +vt 0.781250 0.869244 +vt 0.812500 0.657826 +vt 0.812500 0.763535 +vt 0.812500 0.869244 +vt 0.843750 0.657826 +vt 0.843750 0.763535 +vt 0.843750 0.869244 +vt 0.875000 0.657826 +vt 0.875000 0.763535 +vt 0.875000 0.869244 +vt 0.906250 0.657826 +vt 0.906250 0.763535 +vt 0.906250 0.869244 +vt 0.031250 0.538582 +vt 0.001572 0.538953 +vt 0.000000 0.657826 +vt 0.000000 0.735604 +vt 0.001571 0.736035 +vt 0.968750 0.538582 +vt 0.001571 0.763965 +vt 0.000000 0.960677 +vt 0.001572 0.961047 +vt 0.906250 0.538582 +vt 0.843750 0.538582 +vt 0.781250 0.538582 +vt 0.718750 0.538582 +vt 0.656250 0.538582 +vt 0.593750 0.538582 +vt 0.531250 0.538582 +vt 0.468750 0.538582 +vt 0.406250 0.538582 +vt 0.343750 0.538582 +vt 0.281250 0.538582 +vt 0.218750 0.538582 +vt 0.156250 0.538582 +vt 0.093750 0.538582 +vt 0.000000 0.842174 +vt 0.000000 0.764396 +vt 0.000000 0.539323 +vt 0.270141 0.423938 +vt 0.250000 0.428745 +vt 0.284321 0.422542 +vt 0.317378 0.412665 +vt 0.315041 0.413223 +vt 0.397602 0.348624 +vt 0.427342 0.285275 +vt 0.415193 0.181575 +vt 0.431185 0.213960 +vt 0.399616 0.150030 +vt 0.285193 0.073075 +vt 0.320132 0.080687 +vt 0.250000 0.065407 +vt 0.149611 0.099758 +vt 0.178149 0.076536 +vt 0.122125 0.122125 +vt 0.093492 0.145425 +vt 0.072621 0.250000 +vt 0.072272 0.214648 +vt 0.072969 0.285214 +vt 0.125553 0.374447 +vt 0.097067 0.352187 +vt 0.180626 0.417484 +vt 0.283943 0.420644 +vt 0.190922 0.425529 +vt 0.212674 0.437653 +vt 0.207896 0.438793 +vt 0.195343 0.428984 +vt 0.190402 0.427900 +vt 0.227322 0.434157 +vt 0.226937 0.435912 +vt 0.223307 0.435116 +vt 0.073250 0.313691 +vt 0.073343 0.323174 +vt 0.073290 0.317774 +vt 0.071661 0.314476 +vt 0.086027 0.343559 +vt 0.073448 0.333729 +vt 0.090369 0.346952 +vt 0.088226 0.348011 +vt 0.089655 0.148547 +vt 0.071893 0.176226 +vt 0.071763 0.163107 +vt 0.083120 0.153865 +vt 0.086449 0.146994 +vt 0.071945 0.181528 +vt 0.070141 0.180654 +vt 0.071901 0.177022 +vt 0.225335 0.060033 +vt 0.211619 0.057044 +vt 0.219594 0.058782 +vt 0.224749 0.057560 +vt 0.191898 0.065347 +vt 0.204111 0.055409 +vt 0.188761 0.067900 +vt 0.188354 0.066187 +vt 0.351484 0.087518 +vt 0.352700 0.085962 +vt 0.355930 0.088487 +vt 0.437615 0.263394 +vt 0.443903 0.250000 +vt 0.440159 0.257974 +vt 0.440168 0.263390 +vt 0.440117 0.232049 +vt 0.446378 0.244728 +vt 0.437126 0.225992 +vt 0.440107 0.225987 +vt 0.353806 0.407296 +vt 0.351586 0.404501 +vt 0.354653 0.406624 +vt 0.379714 0.386727 +vt 0.373865 0.399184 +vt 0.359793 0.402543 +vt 0.381954 0.381954 +vt 0.381764 0.382359 +vt 0.383099 0.384039 +vt 0.907775 0.970185 +vt 0.905764 0.970247 +vt 0.876319 0.974036 +vt 0.876319 1.000000 +vt 0.983279 1.000000 +vt 0.983279 0.974608 +vt 0.963759 0.971378 +vt 0.946423 0.970185 +vt 0.934543 0.970185 +vn -0.0000 0.0000 -1.0000 +vn 0.1369 -0.0300 0.9901 +vn -0.2525 0.0553 0.9660 +vn 0.0621 -0.1257 0.9901 +vn -0.1146 0.2318 0.9660 +vn -0.0611 -0.1262 0.9901 +vn 0.1127 0.2327 0.9660 +vn -0.1364 -0.0324 0.9901 +vn 0.2515 0.0597 0.9660 +vn -0.1105 0.0863 0.9901 +vn 0.2037 -0.1591 0.9660 +vn -0.0003 0.1402 0.9901 +vn 0.0005 -0.2585 0.9660 +vn 0.1098 0.0872 0.9901 +vn -0.2024 -0.1608 0.9660 +vn 0.0000 0.0000 1.0000 +vn -0.9769 0.2139 -0.0000 +vn -0.2139 -0.9769 -0.0000 +vn 0.2139 0.9769 0.0000 +vn -0.4431 0.8965 -0.0000 +vn -0.8965 -0.4431 -0.0000 +vn 0.8965 0.4431 0.0000 +vn 0.4358 0.9001 0.0000 +vn -0.9001 0.4358 0.0000 +vn 0.9001 -0.4358 -0.0000 +vn 0.9730 0.2309 -0.0000 +vn -0.2309 0.9730 0.0000 +vn 0.2309 -0.9730 -0.0000 +vn -0.0930 0.0763 0.9927 +vn 0.7881 -0.6156 -0.0000 +vn 0.6156 0.7881 -0.0000 +vn -0.6156 -0.7881 0.0000 +vn 0.0019 -1.0000 0.0000 +vn 1.0000 0.0019 -0.0000 +vn -1.0000 -0.0019 -0.0000 +vn -0.7830 -0.6220 0.0000 +vn 0.6220 -0.7830 0.0000 +vn -0.6220 0.7830 -0.0000 +vn -0.9726 -0.2324 0.0000 +vn -0.4247 -0.9053 0.0000 +vn 0.4430 -0.8965 0.0000 +vn 0.9771 -0.2126 0.0000 +vn 0.7755 0.6314 0.0000 +vn 0.1373 0.2927 0.9463 +vn -0.3159 0.0687 0.9463 +vn -0.1432 0.2898 0.9463 +vn -0.1906 -0.1552 0.9693 +vn -0.2507 -0.2041 0.9463 +vn -0.0101 0.9999 0.0000 +vn -0.7881 0.6155 0.0000 +vn 0.0033 -0.3233 0.9463 +vn 0.3144 0.0751 0.9463 +vn 0.2548 -0.1990 0.9463 +vn 0.2391 0.0571 0.9693 +vn 0.0002 0.0000 1.0000 +vn -0.0002 0.0000 1.0000 +vn 0.0003 0.0000 1.0000 +vn -0.0003 0.0000 1.0000 +vn 0.0001 0.0000 1.0000 +vn -0.0001 0.0000 1.0000 +vn 0.0004 0.0000 1.0000 +vn 0.0635 0.1540 0.9860 +vn -0.0723 0.1460 0.9866 +vn -0.0563 -0.1199 0.9912 +vn -0.1263 -0.1019 0.9867 +vn -0.1584 0.0353 0.9867 +vn 0.0094 -0.1664 0.9860 +vn 0.1282 -0.1001 0.9867 +vn 0.1580 0.0372 0.9867 +vn 0.1027 0.0836 0.9912 +vn 0.6079 -0.1325 0.7829 +vn 0.4826 0.3926 0.7829 +vn -0.0061 0.6221 0.7829 +vn -0.4902 0.3831 0.7829 +vn -0.6052 -0.1444 0.7829 +vn -0.2645 -0.5632 0.7829 +vn 0.2754 -0.5579 0.7829 +vn 0.9769 -0.2139 0.0000 +vn 0.4431 -0.8965 0.0000 +vn -0.4358 -0.9001 0.0000 +vn -0.9730 -0.2309 0.0000 +vn -0.7881 0.6156 0.0000 +vn -0.0019 1.0000 0.0000 +vn 0.7830 0.6220 0.0000 +vn 0.9771 -0.2130 0.0000 +vn 0.7757 0.6311 0.0000 +vn -0.0098 1.0000 0.0000 +vn -0.7879 0.6158 0.0000 +vn -0.9727 -0.2320 0.0000 +vn -0.4250 -0.9052 0.0000 +vn -0.4251 -0.9052 0.0000 +vn 0.4427 -0.8967 0.0000 +vn -0.5989 0.1305 0.7901 +vn -0.4755 -0.3868 0.7901 +vn 0.0060 -0.6129 0.7901 +vn 0.4829 -0.3775 0.7901 +vn 0.5962 0.1422 0.7901 +vn 0.2605 0.5548 0.7901 +vn -0.2713 0.5496 0.7901 +vn -0.6861 -0.3669 -0.6282 +vn -0.8680 -0.4965 -0.0000 +vn -0.7545 -0.6563 -0.0000 +vn -0.6120 -0.7909 -0.0000 +vn -0.4459 -0.8951 -0.0000 +vn -0.2627 -0.9649 -0.0000 +vn -0.0694 -0.9976 0.0000 +vn 0.1265 -0.9920 -0.0000 +vn 0.3176 -0.9482 -0.0000 +vn 0.4965 -0.8680 -0.0000 +vn 0.6563 -0.7545 0.0000 +vn 0.7909 -0.6119 0.0000 +vn 0.8951 -0.4459 -0.0000 +vn 0.9649 -0.2627 0.0000 +vn 0.9976 -0.0694 -0.0000 +vn 0.9920 0.1265 -0.0000 +vn 0.9482 0.3176 0.0000 +vn 0.8680 0.4965 0.0000 +vn 0.7545 0.6563 0.0000 +vn 0.6119 0.7909 0.0000 +vn 0.4459 0.8951 0.0000 +vn 0.2627 0.9649 0.0000 +vn 0.0694 0.9976 0.0000 +vn -0.1265 0.9920 0.0000 +vn -0.3176 0.9482 -0.0000 +vn -0.4965 0.8680 0.0000 +vn -0.6563 0.7545 -0.0000 +vn -0.7909 0.6120 -0.0000 +vn -0.8951 0.4459 0.0000 +vn -0.6013 -0.4937 -0.6282 +vn -0.9482 -0.3176 -0.0000 +vn -0.7445 -0.2261 -0.6282 +vn -0.9976 0.0694 0.0000 +vn -0.3134 -0.0310 -0.9491 +vn -0.0881 -0.0087 -0.9961 +vn -0.7743 0.0760 0.6282 +vn -0.3134 -0.0310 0.9491 +vn -0.0881 -0.0087 0.9961 +vn -0.3014 -0.0915 -0.9491 +vn -0.0847 -0.0257 -0.9961 +vn -0.3014 -0.0915 0.9491 +vn -0.0847 -0.0257 0.9961 +vn -0.2777 -0.1485 -0.9491 +vn -0.0781 -0.0418 -0.9961 +vn -0.2777 -0.1485 0.9491 +vn -0.0781 -0.0418 0.9961 +vn -0.2434 -0.1999 -0.9491 +vn -0.0684 -0.0562 -0.9961 +vn -0.2434 -0.1999 0.9491 +vn -0.0684 -0.0562 0.9961 +vn -0.1997 -0.2435 -0.9491 +vn -0.0562 -0.0685 -0.9961 +vn -0.1997 -0.2435 0.9491 +vn -0.0562 -0.0685 0.9961 +vn -0.1484 -0.2778 -0.9491 +vn -0.0417 -0.0781 -0.9961 +vn -0.1484 -0.2778 0.9491 +vn -0.0417 -0.0781 0.9961 +vn -0.0913 -0.3014 -0.9491 +vn -0.0257 -0.0848 -0.9961 +vn -0.0913 -0.3014 0.9491 +vn -0.0257 -0.0848 0.9961 +vn -0.0308 -0.3134 -0.9491 +vn -0.0087 -0.0881 -0.9961 +vn -0.0308 -0.3134 0.9491 +vn -0.0087 -0.0881 0.9961 +vn 0.0310 -0.3134 -0.9491 +vn 0.0087 -0.0881 -0.9961 +vn 0.0310 -0.3134 0.9491 +vn 0.0087 -0.0881 0.9961 +vn 0.0915 -0.3014 -0.9491 +vn 0.0257 -0.0847 -0.9961 +vn 0.0915 -0.3014 0.9491 +vn 0.0257 -0.0847 0.9961 +vn 0.1485 -0.2777 -0.9491 +vn 0.0418 -0.0781 -0.9961 +vn 0.1485 -0.2777 0.9491 +vn 0.0418 -0.0781 0.9961 +vn 0.1999 -0.2434 -0.9491 +vn 0.0562 -0.0684 -0.9961 +vn 0.1999 -0.2434 0.9491 +vn 0.0562 -0.0684 0.9961 +vn 0.2435 -0.1997 -0.9491 +vn 0.0685 -0.0562 -0.9961 +vn 0.2435 -0.1997 0.9491 +vn 0.0685 -0.0562 0.9961 +vn 0.2778 -0.1484 -0.9491 +vn 0.0781 -0.0417 -0.9961 +vn 0.2778 -0.1484 0.9491 +vn 0.0781 -0.0417 0.9961 +vn 0.3014 -0.0913 -0.9491 +vn 0.0848 -0.0257 -0.9961 +vn 0.3014 -0.0913 0.9491 +vn 0.0848 -0.0257 0.9961 +vn 0.3134 -0.0308 -0.9491 +vn 0.0881 -0.0087 -0.9961 +vn 0.3134 -0.0308 0.9491 +vn 0.0881 -0.0087 0.9961 +vn 0.3134 0.0310 -0.9491 +vn 0.0881 0.0087 -0.9961 +vn 0.3134 0.0310 0.9491 +vn 0.0881 0.0087 0.9961 +vn 0.3014 0.0915 -0.9491 +vn 0.0847 0.0257 -0.9961 +vn 0.3014 0.0915 0.9491 +vn 0.0847 0.0257 0.9961 +vn 0.2777 0.1485 -0.9491 +vn 0.0781 0.0418 -0.9961 +vn 0.2777 0.1485 0.9491 +vn 0.0781 0.0418 0.9961 +vn 0.2434 0.1999 -0.9491 +vn 0.0684 0.0562 -0.9961 +vn 0.2434 0.1999 0.9491 +vn 0.0684 0.0562 0.9961 +vn 0.1997 0.2435 -0.9491 +vn 0.0562 0.0685 -0.9961 +vn 0.1997 0.2435 0.9491 +vn 0.0562 0.0685 0.9961 +vn 0.1484 0.2778 -0.9491 +vn 0.0417 0.0781 -0.9961 +vn 0.1484 0.2778 0.9491 +vn 0.0417 0.0781 0.9961 +vn 0.0913 0.3014 -0.9491 +vn 0.0257 0.0848 -0.9961 +vn 0.0913 0.3014 0.9491 +vn 0.0257 0.0848 0.9961 +vn 0.0308 0.3134 -0.9491 +vn 0.0087 0.0881 -0.9961 +vn 0.0308 0.3134 0.9491 +vn 0.0087 0.0881 0.9961 +vn -0.0310 0.3134 -0.9491 +vn -0.0087 0.0881 -0.9961 +vn -0.0310 0.3134 0.9491 +vn -0.0087 0.0881 0.9961 +vn -0.0915 0.3014 -0.9491 +vn -0.0257 0.0847 -0.9961 +vn -0.0915 0.3014 0.9491 +vn -0.0257 0.0847 0.9961 +vn -0.1485 0.2777 -0.9491 +vn -0.0418 0.0781 -0.9961 +vn -0.1485 0.2777 0.9491 +vn -0.0418 0.0781 0.9961 +vn -0.1999 0.2434 -0.9491 +vn -0.0562 0.0684 -0.9961 +vn -0.1999 0.2434 0.9491 +vn -0.0562 0.0684 0.9961 +vn -0.7909 0.6119 0.0000 +vn -0.2435 0.1997 -0.9491 +vn -0.0685 0.0562 -0.9961 +vn -0.2435 0.1997 0.9491 +vn -0.0685 0.0562 0.9961 +vn -0.2778 0.1484 -0.9491 +vn -0.0781 0.0417 -0.9961 +vn -0.2778 0.1484 0.9491 +vn -0.0781 0.0417 0.9961 +vn -0.9649 0.2627 0.0000 +vn -0.3014 0.0913 -0.9491 +vn -0.0848 0.0257 -0.9961 +vn -0.3014 0.0913 0.9491 +vn -0.0848 0.0257 0.9961 +vn -0.7743 -0.0765 -0.6282 +vn -0.3134 0.0308 -0.9491 +vn -0.0881 0.0087 -0.9961 +vn -0.3134 0.0308 0.9491 +vn -0.0881 0.0087 0.9961 +vn -0.9920 -0.1265 0.0000 +vn -0.7742 -0.0765 0.6282 +vn -0.7446 0.2256 0.6282 +vn -0.7444 -0.2260 0.6283 +vn -0.7904 -0.4824 0.3777 +vn -0.9074 0.0373 0.4186 +vn -0.6862 0.3666 0.6283 +vn -0.6306 -0.7611 0.1519 +vn -0.7446 0.2256 -0.6282 +vn -0.6016 0.4934 0.6282 +vn -0.6863 0.3666 -0.6282 +vn -0.4937 0.6013 0.6282 +vn -0.6016 0.4934 -0.6282 +vn -0.3669 0.6861 0.6282 +vn -0.4937 0.6013 -0.6282 +vn -0.2261 0.7445 0.6282 +vn -0.3670 0.6861 -0.6282 +vn -0.0765 0.7742 0.6282 +vn -0.2261 0.7445 -0.6282 +vn 0.0760 0.7743 0.6282 +vn -0.0765 0.7743 -0.6282 +vn 0.2256 0.7446 0.6283 +vn 0.0760 0.7743 -0.6282 +vn 0.3666 0.6862 0.6283 +vn 0.2256 0.7446 -0.6282 +vn 0.4934 0.6015 0.6283 +vn 0.3666 0.6863 -0.6282 +vn 0.6013 0.4937 0.6282 +vn 0.4934 0.6016 -0.6282 +vn 0.6860 0.3669 0.6282 +vn 0.6013 0.4937 -0.6282 +vn 0.7444 0.2260 0.6282 +vn 0.6861 0.3669 -0.6282 +vn 0.7742 0.0765 0.6282 +vn 0.7445 0.2261 -0.6282 +vn 0.7743 -0.0760 0.6283 +vn 0.7743 0.0765 -0.6282 +vn 0.7446 -0.2256 0.6282 +vn 0.7743 -0.0760 -0.6282 +vn 0.6862 -0.3666 0.6283 +vn 0.7446 -0.2256 -0.6282 +vn 0.6015 -0.4934 0.6282 +vn 0.6863 -0.3666 -0.6282 +vn 0.4937 -0.6013 0.6282 +vn 0.6016 -0.4934 -0.6282 +vn 0.3669 -0.6860 0.6282 +vn 0.4937 -0.6013 -0.6282 +vn 0.2261 -0.7445 0.6282 +vn 0.3669 -0.6861 -0.6282 +vn 0.0765 -0.7743 0.6282 +vn 0.2261 -0.7445 -0.6282 +vn -0.0760 -0.7743 0.6282 +vn 0.0765 -0.7743 -0.6282 +vn -0.2256 -0.7446 0.6283 +vn -0.0760 -0.7743 -0.6282 +vn -0.3666 -0.6862 0.6282 +vn -0.2256 -0.7446 -0.6282 +vn -0.4934 -0.6015 0.6283 +vn -0.3666 -0.6863 -0.6282 +vn -0.6013 -0.4937 0.6282 +vn -0.6119 -0.7909 0.0000 +vn -0.4934 -0.6016 -0.6282 +vn -0.6860 -0.3669 0.6283 +vn -0.7093 -0.5824 -0.3971 +vn -0.7904 -0.4824 -0.3777 +vn -0.8973 -0.1405 -0.4185 +vn -0.9133 -0.0902 -0.3972 +vn -0.9148 -0.1432 -0.3776 +vn -0.8526 -0.3128 -0.4185 +vn -0.9133 0.0897 0.3972 +vn -0.8693 -0.3189 -0.3776 +vn -0.8241 0.3817 -0.4186 +vn -0.9133 0.0897 -0.3972 +vn -0.8402 0.3891 -0.3776 +vn -0.8402 0.3891 0.3777 +vn -0.7096 0.5820 -0.3971 +vn -0.8241 0.3817 0.4186 +vn -0.6153 0.6680 -0.4186 +vn -0.7096 0.5820 0.3972 +vn -0.7481 0.5456 -0.3777 +vn -0.6273 0.6811 0.3777 +vn -0.5824 0.7093 -0.3972 +vn -0.4824 0.7903 -0.3777 +vn -0.4732 0.7752 -0.4186 +vn -0.2666 0.8782 -0.3972 +vn -0.4731 0.7752 0.4186 +vn -0.1405 0.8972 -0.4186 +vn -0.2666 0.8781 0.3972 +vn -0.1432 0.9148 -0.3777 +vn -0.1432 0.9148 0.3777 +vn 0.0897 0.9133 -0.3972 +vn -0.1405 0.8972 0.4186 +vn 0.2136 0.8827 -0.4186 +vn 0.0897 0.9133 0.3972 +vn 0.2178 0.9000 -0.3777 +vn 0.2178 0.9000 0.3777 +vn 0.4324 0.8095 -0.3972 +vn 0.2136 0.8827 0.4186 +vn 0.5351 0.7338 -0.4185 +vn 0.4324 0.8095 0.3972 +vn 0.3891 0.8402 -0.3777 +vn 0.5456 0.7481 0.3777 +vn 0.5820 0.7096 -0.3972 +vn 0.6811 0.6273 -0.3776 +vn 0.6680 0.6153 -0.4186 +vn 0.8093 0.4328 -0.3972 +vn 0.6680 0.6153 0.4186 +vn 0.8526 0.3128 -0.4186 +vn 0.8093 0.4328 0.3972 +vn 0.8693 0.3189 -0.3777 +vn 0.8693 0.3189 0.3777 +vn 0.9133 0.0902 -0.3972 +vn 0.8526 0.3128 0.4186 +vn 0.9074 -0.0373 -0.4186 +vn 0.9133 0.0902 0.3972 +vn 0.9252 -0.0380 -0.3777 +vn 0.9252 -0.0380 0.3777 +vn 0.8783 -0.2662 -0.3972 +vn 0.9074 -0.0373 0.4186 +vn 0.8241 -0.3817 -0.4186 +vn 0.8783 -0.2662 0.3972 +vn 0.9000 -0.2178 -0.3777 +vn 0.8402 -0.3891 0.3777 +vn 0.8095 -0.4324 -0.3972 +vn 0.7481 -0.5456 -0.3777 +vn 0.7338 -0.5351 -0.4186 +vn 0.5824 -0.7093 -0.3972 +vn 0.7338 -0.5351 0.4186 +vn 0.4731 -0.7752 -0.4186 +vn 0.5824 -0.7093 0.3972 +vn 0.4824 -0.7904 -0.3777 +vn 0.4824 -0.7904 0.3777 +vn 0.2666 -0.8782 -0.3972 +vn 0.4731 -0.7752 0.4186 +vn 0.1405 -0.8973 -0.4186 +vn 0.2666 -0.8782 0.3972 +vn 0.1432 -0.9148 -0.3777 +vn 0.1432 -0.9148 0.3777 +vn -0.0897 -0.9134 -0.3972 +vn 0.1405 -0.8973 0.4186 +vn -0.2136 -0.8827 -0.4186 +vn -0.0897 -0.9134 0.3972 +vn -0.0380 -0.9252 -0.3777 +vn -0.2178 -0.9000 0.3777 +vn -0.2662 -0.8783 -0.3972 +vn -0.3891 -0.8402 -0.3776 +vn -0.3817 -0.8241 -0.4185 +vn -0.5820 -0.7096 -0.3972 +vn -0.3817 -0.8241 0.4186 +vn -0.6680 -0.6153 -0.4186 +vn -0.8093 -0.4328 0.3972 +vn -0.6811 -0.6273 -0.3777 +vn -0.7752 -0.4732 -0.4185 +vn -0.8093 -0.4328 -0.3972 +vn -0.6680 -0.6153 0.4186 +vn -0.9000 0.2177 0.3777 +vn -0.8782 -0.2666 -0.3972 +vn -0.8827 0.2136 0.4186 +vn -0.7752 -0.4732 0.4186 +vn -0.5456 -0.7481 -0.3777 +vn -0.5351 -0.7338 0.4185 +vn -0.2178 -0.9000 -0.3777 +vn -0.2136 -0.8827 0.4186 +vn -0.0373 -0.9074 0.4186 +vn 0.3189 -0.8693 -0.3777 +vn 0.3128 -0.8526 0.4186 +vn 0.6273 -0.6811 -0.3776 +vn 0.6153 -0.6680 0.4186 +vn 0.8402 -0.3891 -0.3777 +vn 0.8241 -0.3817 0.4186 +vn 0.8827 -0.2136 0.4186 +vn 0.9148 0.1432 -0.3777 +vn 0.8973 0.1405 0.4186 +vn 0.7903 0.4824 -0.3777 +vn 0.7752 0.4731 0.4186 +vn 0.5456 0.7481 -0.3777 +vn 0.5351 0.7338 0.4186 +vn 0.3817 0.8241 0.4186 +vn 0.0380 0.9252 -0.3777 +vn 0.0373 0.9074 0.4186 +vn -0.3189 0.8693 -0.3777 +vn -0.3128 0.8526 0.4186 +vn -0.6273 0.6811 -0.3777 +vn -0.6153 0.6680 0.4186 +vn -0.7338 0.5351 0.4185 +vn -0.9000 0.2178 -0.3777 +vn -0.9252 0.0380 -0.3777 +vn -0.8526 -0.3128 0.4185 +vn -0.8973 -0.1405 0.4186 +vn -0.8783 0.2662 -0.3972 +vn -0.5820 -0.7096 0.3972 +vn -0.7093 -0.5824 0.3972 +vn -0.4324 -0.8095 -0.3972 +vn -0.4324 -0.8095 0.3972 +vn -0.2662 -0.8783 0.3972 +vn 0.0902 -0.9133 -0.3972 +vn 0.0902 -0.9133 0.3972 +vn 0.4328 -0.8093 -0.3972 +vn 0.4328 -0.8093 0.3972 +vn 0.7096 -0.5820 -0.3971 +vn 0.7096 -0.5820 0.3971 +vn 0.8095 -0.4324 0.3971 +vn 0.9134 -0.0897 -0.3972 +vn 0.9134 -0.0897 0.3972 +vn 0.8782 0.2667 -0.3972 +vn 0.8782 0.2666 0.3972 +vn 0.7093 0.5824 -0.3972 +vn 0.7093 0.5824 0.3972 +vn 0.5820 0.7096 0.3972 +vn 0.2662 0.8783 -0.3972 +vn 0.2662 0.8783 0.3972 +vn -0.0902 0.9133 -0.3971 +vn -0.0902 0.9133 0.3972 +vn -0.4328 0.8093 -0.3972 +vn -0.4328 0.8093 0.3972 +vn -0.5824 0.7093 0.3972 +vn -0.8095 0.4324 -0.3972 +vn -0.8095 0.4324 0.3972 +vn -0.8783 0.2662 0.3972 +vn -0.8782 -0.2666 0.3972 +vn -0.9133 -0.0902 0.3972 +vn -0.9251 0.0380 0.3777 +vn -0.6810 -0.6273 0.3777 +vn -0.5351 -0.7338 -0.4185 +vn -0.5456 -0.7481 0.3777 +vn -0.3892 -0.8402 0.3776 +vn -0.0373 -0.9074 -0.4186 +vn -0.0380 -0.9252 0.3777 +vn 0.3128 -0.8526 -0.4186 +vn 0.3189 -0.8693 0.3777 +vn 0.6153 -0.6680 -0.4186 +vn 0.6273 -0.6811 0.3777 +vn 0.7481 -0.5456 0.3777 +vn 0.8827 -0.2136 -0.4186 +vn 0.9000 -0.2178 0.3777 +vn 0.8973 0.1405 -0.4186 +vn 0.9148 0.1432 0.3777 +vn 0.7752 0.4731 -0.4186 +vn 0.7903 0.4824 0.3777 +vn 0.6811 0.6273 0.3777 +vn 0.3817 0.8241 -0.4186 +vn 0.3891 0.8402 0.3777 +vn 0.0373 0.9074 -0.4186 +vn 0.0380 0.9252 0.3777 +vn -0.3128 0.8526 -0.4186 +vn -0.3189 0.8693 0.3777 +vn -0.4824 0.7903 0.3777 +vn -0.7338 0.5351 -0.4185 +vn -0.7481 0.5456 0.3777 +vn -0.8827 0.2136 -0.4186 +vn -0.9074 0.0373 -0.4186 +vn -0.8693 -0.3189 0.3777 +vn -0.9148 -0.1432 0.3776 +vn -0.9096 -0.0003 0.4154 +vn -0.9096 -0.0003 -0.4154 +vn -0.8921 -0.1777 0.4154 +vn -0.8921 -0.1777 -0.4154 +vn -0.8403 -0.3483 0.4154 +vn -0.8403 -0.3483 -0.4155 +vn -0.7562 -0.5056 0.4155 +vn -0.7561 -0.5056 -0.4155 +vn -0.6430 -0.6434 0.4155 +vn -0.6430 -0.6433 -0.4156 +vn -0.5051 -0.7565 0.4155 +vn -0.5051 -0.7565 -0.4155 +vn -0.3478 -0.8404 0.4155 +vn -0.3478 -0.8404 -0.4155 +vn -0.1772 -0.8922 0.4155 +vn -0.1772 -0.8922 -0.4155 +vn 0.0003 -0.9096 0.4155 +vn 0.0002 -0.9096 -0.4155 +vn 0.1777 -0.8921 0.4154 +vn 0.1777 -0.8921 -0.4154 +vn 0.3483 -0.8403 0.4154 +vn 0.3483 -0.8403 -0.4155 +vn 0.5056 -0.7562 0.4154 +vn 0.5056 -0.7562 -0.4155 +vn 0.6434 -0.6430 0.4155 +vn 0.6434 -0.6430 -0.4155 +vn 0.7564 -0.5051 0.4155 +vn 0.7564 -0.5051 -0.4155 +vn 0.8405 -0.3478 0.4155 +vn 0.8405 -0.3478 -0.4155 +vn 0.8922 -0.1772 0.4155 +vn 0.8922 -0.1772 -0.4155 +vn 0.9096 0.0002 0.4154 +vn 0.9096 0.0003 -0.4155 +vn 0.8921 0.1777 0.4155 +vn 0.8921 0.1777 -0.4155 +vn 0.8403 0.3483 0.4154 +vn 0.8403 0.3484 -0.4154 +vn 0.7562 0.5056 0.4154 +vn 0.7562 0.5056 -0.4154 +vn 0.6430 0.6434 0.4154 +vn 0.6430 0.6434 -0.4154 +vn 0.5051 0.7565 0.4155 +vn 0.5051 0.7565 -0.4155 +vn 0.3479 0.8405 0.4154 +vn 0.3479 0.8405 -0.4155 +vn 0.1772 0.8922 0.4155 +vn 0.1772 0.8922 -0.4155 +vn -0.0002 0.9096 0.4155 +vn -0.0002 0.9096 -0.4155 +vn -0.1777 0.8921 0.4154 +vn -0.1777 0.8921 -0.4154 +vn -0.3483 0.8403 0.4155 +vn -0.3483 0.8403 -0.4155 +vn -0.5056 0.7562 0.4154 +vn -0.5056 0.7562 -0.4154 +vn -0.6434 0.6430 0.4155 +vn -0.6433 0.6430 -0.4155 +vn -0.7565 0.5052 0.4154 +vn -0.7565 0.5052 -0.4154 +vn -0.8405 0.3478 0.4155 +vn -0.8405 0.3478 -0.4155 +vn -0.8922 0.1772 0.4155 +vn -0.8922 0.1772 -0.4155 +vn -0.8824 -0.2998 0.3627 +vn 0.1218 -0.9239 0.3626 +vn 0.9299 -0.0607 0.3626 +vn 0.2410 0.9002 0.3627 +vn -0.7395 0.5672 0.3627 +vn -0.1292 -0.9161 0.3796 +vn 0.8732 -0.3055 0.3797 +vn 0.4700 0.7969 0.3797 +vn -0.9160 -0.1298 -0.3797 +vn -0.2709 -0.8765 0.3980 +vn 0.8067 -0.4367 0.3981 +vn 0.5857 0.7061 0.3980 +vn -0.5782 0.7122 0.3980 +vn -0.8764 0.2710 0.3980 +vn -0.7005 -0.6146 0.3627 +vn -0.5672 -0.7395 0.3626 +vn -0.2410 -0.9002 0.3627 +vn 0.4662 -0.8070 0.3626 +vn 0.6146 -0.7005 0.3627 +vn 0.8359 -0.4120 0.3627 +vn 0.8824 0.2998 0.3627 +vn 0.8070 0.4661 0.3627 +vn 0.5672 0.7395 0.3627 +vn -0.1219 0.9239 0.3627 +vn -0.2997 0.8824 0.3627 +vn -0.6146 0.7005 0.3627 +vn -0.7517 -0.5259 -0.3980 +vn -0.9002 0.2410 0.3626 +vn -0.8335 -0.4015 0.3797 +vn -0.7392 -0.5564 0.3796 +vn -0.4700 -0.7969 0.3796 +vn 0.2312 -0.8958 0.3796 +vn 0.4015 -0.8335 0.3796 +vn 0.6899 -0.6164 0.3796 +vn 0.9237 0.0519 0.3796 +vn 0.8958 0.2312 0.3796 +vn 0.7391 0.5564 0.3797 +vn 0.1292 0.9161 0.3796 +vn -0.0520 0.9237 0.3797 +vn -0.4015 0.8335 0.3796 +vn -0.6895 -0.6168 -0.3796 +vn -0.7966 -0.4704 -0.3796 +vn -0.8793 -0.2617 0.3980 +vn -0.8113 -0.4282 0.3980 +vn -0.5857 -0.7060 0.3980 +vn 0.0851 -0.9134 0.3980 +vn 0.2616 -0.8793 0.3981 +vn 0.5782 -0.7122 0.3980 +vn 0.9125 -0.0948 0.3980 +vn 0.9134 0.0851 0.3980 +vn 0.8113 0.4282 0.3980 +vn 0.2710 0.8764 0.3980 +vn 0.0947 0.9125 0.3980 +vn -0.2617 0.8793 0.3980 +vn -0.7060 0.5857 0.3980 +vn -0.6700 -0.6478 -0.3626 +vn -0.7835 -0.5046 -0.3626 +vn -0.9170 -0.1663 -0.3627 +vn -0.4282 0.8113 0.3980 +vn -0.0851 0.9134 0.3980 +vn 0.4367 0.8067 0.3980 +vn 0.7122 0.5782 0.3980 +vn 0.8793 0.2617 0.3980 +vn 0.8765 -0.2709 0.3980 +vn 0.7060 -0.5857 0.3980 +vn 0.4281 -0.8113 0.3980 +vn -0.0948 -0.9125 0.3980 +vn -0.4367 -0.8068 0.3980 +vn -0.7122 -0.5782 0.3980 +vn -0.8732 0.3055 0.3797 +vn -0.6899 0.6164 0.3797 +vn -0.5564 0.7391 0.3796 +vn -0.2312 0.8958 0.3796 +vn 0.3055 0.8732 0.3796 +vn 0.6164 0.6899 0.3797 +vn 0.8335 0.4015 0.3796 +vn 0.9161 -0.1292 0.3796 +vn 0.7969 -0.4700 0.3797 +vn 0.5564 -0.7391 0.3796 +vn 0.0520 -0.9237 0.3797 +vn -0.3055 -0.8733 0.3796 +vn -0.6164 -0.6899 0.3797 +vn -0.8958 -0.2311 0.3796 +vn -0.6347 -0.6624 -0.3980 +vn -0.8957 -0.1981 -0.3980 +vn -0.4661 0.8070 0.3626 +vn 0.0607 0.9299 0.3626 +vn 0.4120 0.8359 0.3627 +vn 0.7005 0.6146 0.3627 +vn 0.9239 0.1219 0.3627 +vn 0.9002 -0.2410 0.3627 +vn 0.7395 -0.5672 0.3626 +vn 0.2998 -0.8824 0.3627 +vn -0.0608 -0.9299 0.3627 +vn -0.4120 -0.8359 0.3627 +vn -0.8069 -0.4662 0.3627 +vn -0.8764 0.2710 -0.3980 +vn -0.7835 -0.5046 0.3626 +vn -0.8732 0.3055 -0.3797 +vn -0.7966 -0.4704 0.3797 +vn -0.9002 0.2410 -0.3626 +vn -0.7517 -0.5258 0.3980 +vn -0.6700 -0.6478 0.3627 +vn -0.6895 -0.6168 0.3797 +vn -0.6347 -0.6624 0.3980 +vn -0.7060 0.5857 -0.3980 +vn -0.9169 -0.1663 0.3627 +vn -0.6899 0.6164 -0.3797 +vn -0.9160 -0.1298 0.3797 +vn -0.7395 0.5672 -0.3626 +vn -0.8957 -0.1981 0.3980 +vn -0.5782 0.7122 -0.3980 +vn -0.5564 0.7391 -0.3796 +vn -0.6146 0.7005 -0.3627 +vn -0.4282 0.8113 -0.3980 +vn -0.4015 0.8335 -0.3796 +vn -0.4661 0.8070 -0.3626 +vn -0.2617 0.8793 -0.3980 +vn -0.2312 0.8958 -0.3796 +vn -0.2997 0.8824 -0.3627 +vn -0.0851 0.9134 -0.3980 +vn -0.0520 0.9237 -0.3797 +vn -0.1219 0.9239 -0.3627 +vn 0.0947 0.9125 -0.3980 +vn 0.1292 0.9161 -0.3796 +vn 0.0607 0.9300 -0.3626 +vn 0.2710 0.8764 -0.3980 +vn 0.3055 0.8732 -0.3796 +vn 0.2410 0.9002 -0.3627 +vn 0.4367 0.8067 -0.3980 +vn 0.4700 0.7969 -0.3797 +vn 0.4120 0.8359 -0.3627 +vn 0.5857 0.7061 -0.3980 +vn 0.6164 0.6899 -0.3797 +vn 0.5672 0.7395 -0.3626 +vn 0.7122 0.5782 -0.3980 +vn 0.7391 0.5564 -0.3797 +vn 0.7005 0.6146 -0.3627 +vn 0.8113 0.4282 -0.3980 +vn 0.8335 0.4015 -0.3796 +vn 0.8070 0.4661 -0.3626 +vn 0.8793 0.2617 -0.3980 +vn 0.8958 0.2311 -0.3796 +vn 0.8824 0.2998 -0.3627 +vn 0.9134 0.0851 -0.3980 +vn 0.9237 0.0519 -0.3796 +vn 0.9239 0.1218 -0.3627 +vn 0.9125 -0.0948 -0.3980 +vn 0.9161 -0.1292 -0.3796 +vn 0.9299 -0.0607 -0.3626 +vn 0.8765 -0.2709 -0.3980 +vn 0.8732 -0.3055 -0.3797 +vn 0.9002 -0.2410 -0.3626 +vn 0.8067 -0.4367 -0.3980 +vn 0.7969 -0.4700 -0.3797 +vn 0.8359 -0.4120 -0.3627 +vn 0.7060 -0.5858 -0.3980 +vn 0.6899 -0.6164 -0.3796 +vn 0.7395 -0.5672 -0.3626 +vn 0.5782 -0.7122 -0.3980 +vn 0.5564 -0.7392 -0.3796 +vn 0.6146 -0.7005 -0.3627 +vn 0.4281 -0.8113 -0.3980 +vn 0.4015 -0.8335 -0.3796 +vn 0.4662 -0.8070 -0.3627 +vn 0.2616 -0.8793 -0.3980 +vn 0.2312 -0.8958 -0.3796 +vn 0.2998 -0.8824 -0.3627 +vn 0.0851 -0.9134 -0.3980 +vn 0.0519 -0.9237 -0.3797 +vn 0.1218 -0.9239 -0.3626 +vn -0.0948 -0.9125 -0.3980 +vn -0.1292 -0.9161 -0.3796 +vn -0.0608 -0.9299 -0.3627 +vn -0.2709 -0.8765 -0.3980 +vn -0.3055 -0.8733 -0.3796 +vn -0.2410 -0.9002 -0.3627 +vn -0.4367 -0.8068 -0.3980 +vn -0.4700 -0.7969 -0.3797 +vn -0.4120 -0.8359 -0.3627 +vn -0.5857 -0.7060 -0.3980 +vn -0.6164 -0.6899 -0.3797 +vn -0.5672 -0.7395 -0.3626 +vn -0.7122 -0.5782 -0.3980 +vn -0.7392 -0.5563 -0.3796 +vn -0.7005 -0.6146 -0.3626 +vn -0.8113 -0.4282 -0.3980 +vn -0.8335 -0.4015 -0.3797 +vn -0.8069 -0.4662 -0.3627 +vn -0.8793 -0.2617 -0.3980 +vn -0.8958 -0.2311 -0.3796 +vn -0.8824 -0.2998 -0.3627 +vn -0.8695 0.4700 0.1519 +vn -0.9165 -0.3659 -0.1617 +vn -0.9344 0.3044 -0.1849 +vn -0.8333 -0.5224 0.1807 +vn -0.8275 -0.5377 -0.1617 +vn -0.8571 0.4808 -0.1849 +vn -0.8571 0.4808 0.1849 +vn -0.9192 -0.3498 -0.1807 +vn -0.8333 -0.5224 -0.1807 +vn -0.9445 0.2913 -0.1519 +vn -0.8275 -0.5377 0.1617 +vn -0.8695 0.4700 -0.1519 +vn -0.7067 -0.6888 0.1617 +vn -0.7154 -0.6749 -0.1807 +vn -0.7154 -0.6749 0.1807 +vn -0.7067 -0.6888 -0.1617 +vn -0.7611 0.6306 0.1519 +vn -0.7468 0.6388 -0.1849 +vn -0.7468 0.6388 0.1849 +vn -0.7611 0.6306 -0.1519 +vn -0.5588 -0.8134 0.1617 +vn -0.5699 -0.8016 -0.1807 +vn -0.5699 -0.8016 0.1807 +vn -0.5588 -0.8134 -0.1617 +vn -0.3893 -0.9068 0.1617 +vn -0.4026 -0.8973 -0.1807 +vn -0.4026 -0.8973 0.1807 +vn -0.3893 -0.9068 -0.1617 +vn -0.2049 -0.9653 0.1617 +vn -0.2199 -0.9587 -0.1807 +vn -0.2199 -0.9586 0.1807 +vn -0.2049 -0.9653 -0.1617 +vn -0.0126 -0.9868 0.1617 +vn -0.0286 -0.9831 -0.1807 +vn -0.0286 -0.9831 0.1807 +vn -0.0127 -0.9868 -0.1617 +vn 0.1801 -0.9703 0.1617 +vn 0.1637 -0.9698 -0.1807 +vn 0.1637 -0.9698 0.1807 +vn 0.1801 -0.9703 -0.1617 +vn 0.3659 -0.9165 0.1617 +vn 0.3498 -0.9192 -0.1807 +vn 0.3498 -0.9192 0.1807 +vn 0.3659 -0.9165 -0.1617 +vn 0.5377 -0.8275 0.1617 +vn 0.5224 -0.8333 -0.1807 +vn 0.5224 -0.8333 0.1807 +vn 0.5377 -0.8275 -0.1617 +vn 0.6888 -0.7067 0.1617 +vn 0.6750 -0.7154 -0.1807 +vn 0.6749 -0.7154 0.1807 +vn 0.6888 -0.7067 -0.1617 +vn 0.8134 -0.5588 0.1617 +vn 0.8016 -0.5700 -0.1807 +vn 0.8015 -0.5700 0.1807 +vn 0.8134 -0.5588 -0.1617 +vn 0.9068 -0.3893 0.1617 +vn 0.8974 -0.4026 -0.1807 +vn 0.8973 -0.4026 0.1807 +vn 0.9068 -0.3893 -0.1617 +vn 0.9653 -0.2050 0.1617 +vn 0.9587 -0.2198 -0.1807 +vn 0.9587 -0.2198 0.1807 +vn 0.9653 -0.2050 -0.1617 +vn 0.9868 -0.0127 0.1617 +vn 0.9831 -0.0286 -0.1807 +vn 0.9831 -0.0286 0.1807 +vn 0.9868 -0.0127 -0.1617 +vn 0.9703 0.1801 0.1617 +vn 0.9698 0.1637 -0.1807 +vn 0.9698 0.1637 0.1807 +vn 0.9703 0.1801 -0.1617 +vn 0.9165 0.3659 0.1617 +vn 0.9192 0.3498 -0.1807 +vn 0.9192 0.3498 0.1807 +vn 0.9165 0.3659 -0.1617 +vn 0.8275 0.5377 0.1617 +vn 0.8333 0.5224 -0.1807 +vn 0.8333 0.5224 0.1807 +vn 0.8275 0.5377 -0.1617 +vn 0.7067 0.6888 0.1617 +vn 0.7154 0.6749 -0.1807 +vn 0.7154 0.6749 0.1807 +vn 0.7067 0.6888 -0.1617 +vn 0.5588 0.8134 0.1617 +vn 0.5700 0.8015 -0.1807 +vn 0.5700 0.8015 0.1807 +vn 0.5588 0.8134 -0.1617 +vn 0.3893 0.9068 0.1617 +vn 0.4026 0.8973 -0.1807 +vn 0.4026 0.8973 0.1807 +vn 0.3893 0.9068 -0.1617 +vn 0.2049 0.9653 0.1617 +vn 0.2198 0.9587 -0.1807 +vn 0.2198 0.9587 0.1807 +vn 0.2049 0.9653 -0.1617 +vn 0.0127 0.9868 0.1617 +vn 0.0286 0.9831 -0.1807 +vn 0.0286 0.9831 0.1807 +vn 0.0127 0.9868 -0.1617 +vn -0.1801 0.9703 0.1617 +vn -0.1637 0.9698 -0.1807 +vn -0.1637 0.9698 0.1807 +vn -0.1801 0.9703 -0.1617 +vn -0.3659 0.9165 0.1617 +vn -0.3498 0.9192 -0.1807 +vn -0.3498 0.9192 0.1807 +vn -0.3659 0.9165 -0.1617 +vn -0.5377 0.8275 0.1617 +vn -0.5224 0.8333 -0.1807 +vn -0.5224 0.8333 0.1807 +vn -0.5377 0.8275 -0.1617 +vn -0.6888 0.7067 0.1617 +vn -0.6750 0.7154 -0.1807 +vn -0.6750 0.7154 0.1807 +vn -0.6888 0.7067 -0.1617 +vn -0.8134 0.5588 0.1617 +vn -0.8015 0.5700 -0.1807 +vn -0.8015 0.5700 0.1807 +vn -0.8134 0.5588 -0.1617 +vn -0.9068 0.3893 0.1617 +vn -0.8973 0.4026 -0.1807 +vn -0.8973 0.4026 0.1807 +vn -0.9068 0.3893 -0.1617 +vn -0.9653 0.2050 0.1617 +vn -0.9587 0.2198 -0.1807 +vn -0.9587 0.2198 0.1807 +vn -0.9653 0.2050 -0.1617 +vn -0.7743 0.0760 -0.6282 +vn -0.6388 -0.7468 -0.1849 +vn -0.6388 -0.7468 0.1849 +vn -0.6306 -0.7611 -0.1519 +vn -0.0157 -0.9318 -0.3626 +vn -0.0514 -0.9237 -0.3797 +vn 0.0196 -0.9172 -0.3980 +vn -0.0514 -0.9237 0.3797 +vn 0.0196 -0.9172 0.3980 +vn -0.0157 -0.9318 0.3626 +vn -0.4700 -0.8695 0.1519 +vn -0.4808 -0.8571 -0.1849 +vn -0.4808 -0.8571 0.1849 +vn -0.4700 -0.8695 -0.1519 +vn 0.1664 -0.9169 -0.3627 +vn 0.1298 -0.9160 -0.3796 +vn 0.1982 -0.8957 -0.3980 +vn 0.1663 -0.9170 0.3627 +vn 0.1981 -0.8957 0.3980 +vn 0.1298 -0.9160 0.3796 +vn -0.2914 -0.9445 0.1519 +vn -0.3044 -0.9344 -0.1849 +vn -0.3044 -0.9344 0.1849 +vn -0.2914 -0.9445 -0.1519 +vn 0.3421 -0.8669 -0.3626 +vn 0.3060 -0.8731 -0.3797 +vn 0.3691 -0.8398 -0.3980 +vn 0.3060 -0.8731 0.3796 +vn 0.3421 -0.8669 0.3627 +vn 0.3691 -0.8398 0.3980 +vn -0.7670 -0.6235 0.1519 +vn -0.7722 -0.6078 -0.1849 +vn -0.7722 -0.6078 0.1849 +vn -0.7670 -0.6235 -0.1519 +vn -0.1972 -0.9108 -0.3626 +vn -0.2306 -0.8959 -0.3796 +vn -0.1597 -0.9034 -0.3980 +vn -0.1597 -0.9034 0.3980 +vn -0.2306 -0.8959 0.3796 +vn -0.1972 -0.9108 0.3626 +vn -0.8739 -0.4618 0.1519 +vn -0.8760 -0.4456 -0.1849 +vn -0.8760 -0.4456 0.1849 +vn -0.8739 -0.4618 -0.1519 +vn -0.3711 -0.8548 -0.3626 +vn -0.4010 -0.8337 -0.3797 +vn -0.3329 -0.8549 -0.3980 +vn -0.3711 -0.8548 0.3626 +vn -0.3329 -0.8549 0.3980 +vn -0.4010 -0.8337 0.3797 +vn -0.9472 -0.2825 0.1519 +vn -0.9461 -0.2660 -0.1849 +vn -0.9461 -0.2660 0.1849 +vn -0.9472 -0.2825 -0.1519 +vn -0.5308 -0.7660 -0.3627 +vn -0.5559 -0.7395 -0.3796 +vn -0.4933 -0.7735 -0.3980 +vn -0.5559 -0.7395 0.3797 +vn -0.4933 -0.7735 0.3980 +vn -0.5308 -0.7660 0.3627 +vn -0.9841 -0.0923 0.1519 +vn -0.9798 -0.0764 -0.1849 +vn -0.9798 -0.0764 0.1849 +vn -0.9841 -0.0923 -0.1519 +vn -0.9134 -0.0851 0.3980 +vn -0.9237 -0.0519 0.3797 +vn -0.9239 -0.1219 0.3626 +vn -0.9134 -0.0851 -0.3980 +vn -0.9239 -0.1219 -0.3626 +vn -0.9237 -0.0519 -0.3797 +vn -0.9832 0.1015 -0.1519 +vn -0.9759 0.1162 0.1849 +vn -0.9832 0.1015 0.1519 +vn -0.9759 0.1162 -0.1849 +vn -0.9125 0.0947 0.3980 +vn -0.9161 0.1292 0.3796 +vn -0.9300 0.0607 0.3626 +vn -0.9300 0.0607 -0.3626 +vn -0.9161 0.1292 -0.3796 +vn -0.9125 0.0947 -0.3980 +vn -0.9165 -0.3659 0.1617 +vn -0.9344 0.3044 0.1849 +vn -0.9192 -0.3498 0.1807 +vn -0.9445 0.2913 0.1519 +vn -0.8669 -0.3421 -0.3627 +vn -0.8731 -0.3059 -0.3797 +vn -0.8398 -0.3691 -0.3980 +vn -0.8731 -0.3059 0.3797 +vn -0.8669 -0.3420 0.3627 +vn -0.8398 -0.3691 0.3980 +vn -0.9703 -0.1801 0.1617 +vn -0.9698 -0.1638 -0.1807 +vn -0.9698 -0.1638 0.1807 +vn -0.9703 -0.1801 -0.1617 +vn -0.8068 0.4367 0.3980 +vn -0.7969 0.4700 0.3796 +vn -0.8359 0.4120 0.3627 +vn -0.8068 0.4367 -0.3980 +vn -0.8359 0.4120 -0.3626 +vn -0.7969 0.4700 -0.3796 +vn -0.9868 0.0127 0.1617 +vn -0.9831 0.0286 -0.1807 +vn -0.9831 0.0286 0.1807 +vn -0.9868 0.0127 -0.1617 +vn -0.9318 0.0157 -0.3626 +vn -0.9237 0.0515 -0.3797 +vn -0.9172 -0.0196 -0.3980 +vn -0.9237 0.0515 0.3797 +vn -0.9172 -0.0196 0.3980 +vn -0.9318 0.0157 0.3627 +vn -0.6235 0.7670 0.1519 +vn -0.6078 0.7722 -0.1849 +vn -0.6078 0.7722 0.1849 +vn -0.6235 0.7670 -0.1519 +vn -0.9108 0.1972 -0.3627 +vn -0.8959 0.2306 -0.3796 +vn -0.9034 0.1597 -0.3980 +vn -0.8959 0.2306 0.3796 +vn -0.9108 0.1972 0.3627 +vn -0.9034 0.1597 0.3980 +vn -0.4618 0.8739 0.1519 +vn -0.4455 0.8760 -0.1849 +vn -0.4455 0.8760 0.1849 +vn -0.4618 0.8739 -0.1519 +vn -0.8549 0.3711 -0.3626 +vn -0.8337 0.4010 -0.3796 +vn -0.8549 0.3329 -0.3980 +vn -0.8549 0.3711 0.3626 +vn -0.8549 0.3329 0.3980 +vn -0.8337 0.4010 0.3796 +vn -0.2825 0.9472 0.1519 +vn -0.2660 0.9461 -0.1849 +vn -0.2660 0.9461 0.1849 +vn -0.2825 0.9472 -0.1519 +vn -0.7660 0.5308 -0.3627 +vn -0.7395 0.5560 -0.3796 +vn -0.7735 0.4933 -0.3980 +vn -0.7395 0.5560 0.3796 +vn -0.7735 0.4933 0.3980 +vn -0.7660 0.5308 0.3627 +vn -0.0923 0.9841 0.1519 +vn -0.0764 0.9798 -0.1849 +vn -0.0764 0.9798 0.1849 +vn -0.0923 0.9841 -0.1519 +vn -0.6477 0.6700 -0.3627 +vn -0.6168 0.6895 -0.3796 +vn -0.6624 0.6347 -0.3980 +vn -0.6624 0.6347 0.3980 +vn -0.6168 0.6895 0.3797 +vn -0.6477 0.6700 0.3627 +vn 0.1015 0.9832 0.1519 +vn 0.1163 0.9759 -0.1849 +vn 0.1163 0.9759 0.1849 +vn 0.1015 0.9832 -0.1519 +vn -0.5046 0.7835 -0.3626 +vn -0.4704 0.7966 -0.3796 +vn -0.5258 0.7517 -0.3980 +vn -0.5046 0.7835 0.3627 +vn -0.5258 0.7517 0.3980 +vn -0.4704 0.7966 0.3796 +vn 0.2914 0.9445 0.1519 +vn 0.3044 0.9344 -0.1849 +vn 0.3044 0.9344 0.1849 +vn 0.2913 0.9445 -0.1519 +vn -0.3421 0.8669 -0.3627 +vn -0.3060 0.8731 -0.3796 +vn -0.3691 0.8398 -0.3980 +vn -0.3060 0.8731 0.3796 +vn -0.3691 0.8398 0.3980 +vn -0.3421 0.8669 0.3627 +vn 0.4700 0.8695 0.1519 +vn 0.4808 0.8571 -0.1849 +vn 0.4808 0.8571 0.1849 +vn 0.4700 0.8695 -0.1519 +vn -0.1663 0.9170 -0.3627 +vn -0.1297 0.9160 -0.3797 +vn -0.1981 0.8957 -0.3980 +vn -0.1663 0.9169 0.3627 +vn -0.1981 0.8957 0.3980 +vn -0.1297 0.9160 0.3797 +vn 0.6306 0.7611 0.1519 +vn 0.6388 0.7468 -0.1849 +vn 0.6388 0.7468 0.1849 +vn 0.6306 0.7611 -0.1519 +vn 0.0157 0.9318 -0.3627 +vn 0.0514 0.9237 -0.3796 +vn -0.0196 0.9172 -0.3980 +vn 0.0514 0.9237 0.3796 +vn 0.0157 0.9318 0.3627 +vn -0.0196 0.9172 0.3980 +vn 0.7670 0.6235 0.1519 +vn 0.7722 0.6078 -0.1849 +vn 0.7722 0.6078 0.1849 +vn 0.7670 0.6234 -0.1519 +vn 0.1972 0.9108 -0.3627 +vn 0.2307 0.8959 -0.3797 +vn 0.1597 0.9034 -0.3980 +vn 0.1972 0.9108 0.3627 +vn 0.1597 0.9034 0.3980 +vn 0.2307 0.8959 0.3797 +vn 0.8739 0.4618 0.1519 +vn 0.8760 0.4455 -0.1849 +vn 0.8760 0.4455 0.1849 +vn 0.8739 0.4618 -0.1519 +vn 0.3711 0.8549 -0.3626 +vn 0.4010 0.8337 -0.3796 +vn 0.3329 0.8549 -0.3980 +vn 0.4010 0.8337 0.3797 +vn 0.3329 0.8549 0.3980 +vn 0.3711 0.8549 0.3626 +vn 0.9472 0.2825 0.1519 +vn 0.9461 0.2661 -0.1849 +vn 0.9461 0.2661 0.1849 +vn 0.9472 0.2825 -0.1519 +vn 0.5308 0.7660 -0.3627 +vn 0.5559 0.7394 -0.3797 +vn 0.4933 0.7735 -0.3980 +vn 0.4933 0.7735 0.3980 +vn 0.5559 0.7394 0.3797 +vn 0.5308 0.7660 0.3627 +vn 0.9841 0.0923 0.1519 +vn 0.9798 0.0764 -0.1849 +vn 0.9798 0.0764 0.1849 +vn 0.9841 0.0923 -0.1519 +vn 0.6700 0.6478 -0.3627 +vn 0.6895 0.6168 -0.3797 +vn 0.6347 0.6624 -0.3980 +vn 0.6700 0.6477 0.3627 +vn 0.6347 0.6624 0.3980 +vn 0.6895 0.6168 0.3796 +vn 0.9832 -0.1015 0.1519 +vn 0.9758 -0.1163 -0.1849 +vn 0.9758 -0.1163 0.1849 +vn 0.9832 -0.1015 -0.1519 +vn 0.7835 0.5046 -0.3626 +vn 0.7966 0.4704 -0.3797 +vn 0.7517 0.5259 -0.3980 +vn 0.7966 0.4704 0.3797 +vn 0.7517 0.5259 0.3980 +vn 0.7835 0.5046 0.3626 +vn 0.9445 -0.2913 0.1519 +vn 0.9344 -0.3044 -0.1849 +vn 0.9344 -0.3044 0.1849 +vn 0.9445 -0.2913 -0.1519 +vn 0.8669 0.3421 -0.3627 +vn 0.8731 0.3060 -0.3797 +vn 0.8398 0.3691 -0.3980 +vn 0.8669 0.3421 0.3627 +vn 0.8398 0.3691 0.3980 +vn 0.8731 0.3060 0.3797 +vn 0.8695 -0.4700 0.1519 +vn 0.8571 -0.4808 -0.1849 +vn 0.8571 -0.4808 0.1849 +vn 0.8695 -0.4700 -0.1519 +vn 0.9169 0.1664 -0.3627 +vn 0.9160 0.1298 -0.3797 +vn 0.8957 0.1982 -0.3980 +vn 0.9160 0.1298 0.3797 +vn 0.9169 0.1664 0.3627 +vn 0.8957 0.1982 0.3981 +vn 0.7611 -0.6306 0.1519 +vn 0.7468 -0.6388 -0.1849 +vn 0.7468 -0.6388 0.1849 +vn 0.7611 -0.6306 -0.1519 +vn 0.9318 -0.0157 -0.3626 +vn 0.9237 -0.0514 -0.3796 +vn 0.9172 0.0196 -0.3980 +vn 0.9318 -0.0157 0.3627 +vn 0.9172 0.0196 0.3980 +vn 0.9237 -0.0514 0.3796 +vn 0.6235 -0.7670 0.1519 +vn 0.6078 -0.7722 -0.1849 +vn 0.6078 -0.7722 0.1849 +vn 0.6234 -0.7670 -0.1519 +vn 0.9108 -0.1972 -0.3627 +vn 0.8959 -0.2306 -0.3796 +vn 0.9034 -0.1597 -0.3980 +vn 0.8959 -0.2306 0.3796 +vn 0.9034 -0.1597 0.3980 +vn 0.9108 -0.1972 0.3627 +vn 0.4618 -0.8739 0.1519 +vn 0.4455 -0.8760 -0.1849 +vn 0.4455 -0.8760 0.1849 +vn 0.4618 -0.8739 -0.1519 +vn 0.8548 -0.3711 -0.3627 +vn 0.8337 -0.4010 -0.3796 +vn 0.8549 -0.3329 -0.3980 +vn 0.8549 -0.3328 0.3980 +vn 0.8337 -0.4010 0.3796 +vn 0.8549 -0.3711 0.3626 +vn 0.2825 -0.9472 0.1519 +vn 0.2660 -0.9461 -0.1849 +vn 0.2660 -0.9461 0.1849 +vn 0.2825 -0.9472 -0.1519 +vn 0.7660 -0.5308 -0.3626 +vn 0.7395 -0.5559 -0.3796 +vn 0.7735 -0.4933 -0.3980 +vn 0.7660 -0.5308 0.3627 +vn 0.7735 -0.4933 0.3980 +vn 0.7395 -0.5559 0.3796 +vn 0.0923 -0.9841 0.1519 +vn 0.0764 -0.9798 -0.1849 +vn 0.0764 -0.9798 0.1849 +vn 0.0923 -0.9841 -0.1519 +vn 0.6478 -0.6700 -0.3626 +vn 0.6168 -0.6895 -0.3797 +vn 0.6624 -0.6347 -0.3980 +vn 0.6168 -0.6895 0.3797 +vn 0.6624 -0.6347 0.3980 +vn 0.6477 -0.6700 0.3627 +vn -0.1015 -0.9832 0.1519 +vn -0.1163 -0.9758 -0.1849 +vn -0.1163 -0.9759 0.1849 +vn -0.1015 -0.9832 -0.1519 +vn 0.5046 -0.7835 -0.3627 +vn 0.4704 -0.7966 -0.3797 +vn 0.5259 -0.7517 -0.3980 +vn 0.5046 -0.7835 0.3627 +vn 0.5258 -0.7517 0.3980 +vn 0.4704 -0.7966 0.3797 +vn 0.1197 0.0118 0.9927 +vn 0.1151 0.0350 0.9927 +vn 0.0567 0.1061 0.9927 +vn 0.0349 0.1151 0.9927 +vn -0.0350 0.1151 0.9927 +vn -0.0567 0.1061 0.9927 +vn -0.0764 0.0930 0.9927 +vn -0.1151 0.0349 0.9927 +vn -0.1197 0.0118 0.9927 +vn -0.1061 -0.0567 0.9927 +vn -0.0930 -0.0764 0.9927 +vn -0.0763 -0.0930 0.9927 +vn -0.0118 -0.1197 0.9927 +vn 0.0118 -0.1197 0.9927 +vn 0.0764 -0.0930 0.9927 +vn 0.0930 -0.0763 0.9927 +vn 0.1061 -0.0567 0.9927 +vn 0.1151 -0.0349 0.9927 +vn 0.1197 -0.0118 0.9927 +vn 0.0350 -0.1151 0.9927 +vn 0.0567 -0.1061 0.9927 +vn -0.0567 -0.1061 0.9927 +vn -0.0349 -0.1151 0.9927 +vn -0.1197 -0.0118 0.9927 +vn -0.1151 -0.0350 0.9927 +vn -0.1061 0.0567 0.9927 +vn 0.0118 0.1197 0.9927 +vn -0.0118 0.1197 0.9927 +vn 0.1061 0.0567 0.9927 +vn 0.0930 0.0764 0.9927 +vn 0.0763 0.0930 0.9927 +usemtl besi_roda +s off +f 4371/5573/2790 4577/5574/2790 4570/5575/2790 4563/5576/2790 4556/5577/2790 4549/5578/2790 4542/5579/2790 4535/5580/2790 4528/5581/2790 4521/5582/2790 4514/5583/2790 4507/5584/2790 4500/5585/2790 4493/5586/2790 4486/5587/2790 4479/5588/2790 4472/5589/2790 4465/5590/2790 4458/5591/2790 4451/5592/2790 4444/5593/2790 4437/5594/2790 4430/5595/2790 4423/5596/2790 4416/5597/2790 4409/5598/2790 4402/5599/2790 4396/5600/2790 4391/5601/2790 4386/5602/2790 4381/5603/2790 4376/5604/2790 +f 5690/5605/2791 5688/5606/2791 5689/5607/2791 5691/5608/2791 +f 5686/5609/2792 5690/5605/2792 5691/5608/2792 5687/5610/2792 +f 5698/5611/2793 5696/5612/2793 5697/5613/2793 5699/5614/2793 +f 5694/5615/2794 5698/5611/2794 5699/5614/2794 5695/5616/2794 +f 5706/5617/2795 5704/5618/2795 5705/5619/2795 5707/5620/2795 +f 5702/5621/2796 5706/5617/2796 5707/5620/2796 5703/5622/2796 +f 5714/5623/2797 5712/5624/2797 5713/5625/2797 5715/5626/2797 +f 5710/5627/2798 5714/5623/2798 5715/5626/2798 5711/5628/2798 +f 5722/5629/2799 5720/5630/2799 5721/5631/2799 5723/5632/2799 +f 5718/5633/2800 5722/5629/2800 5723/5632/2800 5719/5634/2800 +f 5730/5635/2801 5728/5636/2801 5729/5637/2801 5731/5638/2801 +f 5726/5639/2802 5730/5635/2802 5731/5638/2802 5727/5640/2802 +f 5738/5641/2803 5736/5642/2803 5737/5643/2803 5739/5644/2803 +f 5734/5645/2804 5738/5641/2804 5739/5644/2804 5735/5646/2804 +f 5769/5647/2805 5770/5648/2805 5684/5649/2805 +f 5684/5649/2805 5772/5650/2805 5769/5647/2805 +f 5685/5651/2805 5781/5652/2805 5760/5653/2805 +f 5685/5651/2805 5762/5654/2805 5781/5652/2805 +f 5811/5655/2806 5814/5656/2806 5791/5657/2806 5693/5658/2806 5686/5659/2806 5687/5660/2806 5692/5661/2806 5785/5662/2806 +f 5693/5663/2807 5793/5664/2807 5816/5665/2807 5817/5666/2807 5690/5667/2807 5686/5668/2807 +f 5820/5669/2808 5819/5670/2808 5787/5671/2808 5692/5672/2808 5687/5673/2808 5691/5674/2808 +f 5840/5675/2809 5844/5676/2809 5830/5677/2809 5701/5678/2809 5694/5679/2809 5695/5680/2809 5700/5681/2809 5825/5682/2809 +f 5701/5683/2810 5827/5684/2810 5846/5685/2810 5852/5686/2810 5698/5687/2810 5694/5688/2810 +f 5854/5689/2811 5853/5690/2811 5826/5691/2811 5700/5692/2811 5695/5693/2811 5699/5694/2811 +f 5876/5695/2812 5878/5696/2812 5877/5697/2812 5864/5698/2812 5709/5699/2812 5702/5700/2812 5703/5701/2812 5708/5702/2812 5858/5703/2812 +f 5709/5704/2813 5862/5705/2813 5879/5706/2813 5880/5707/2813 5706/5708/2813 5702/5709/2813 +f 5884/5710/2814 5883/5711/2814 5859/5712/2814 5708/5713/2814 5703/5714/2814 5707/5715/2814 +f 5900/5716/2815 5901/5717/2815 5890/5718/2815 5717/5719/2815 5710/5720/2815 5711/5721/2815 5716/5722/2815 5885/5723/2815 +f 5717/5724/2816 5891/5725/2816 5902/5726/2816 5807/5727/2816 5714/5728/2816 5710/5729/2816 +f 5806/5730/2817 5903/5731/2817 5888/5732/2817 5716/5733/2817 5711/5734/2817 5715/5735/2817 +f 5813/5736/2818 5800/5737/2818 5663/5738/2818 5664/5739/2818 5809/5740/2818 5812/5741/2818 5810/5742/2818 5724/5743/2818 +f 5828/5744/2819 5829/5745/2819 5815/5746/2819 5725/5747/2819 5718/5748/2819 5719/5749/2819 5724/5750/2819 5810/5751/2819 +f 5725/5752/2820 5818/5753/2820 5833/5754/2820 5834/5755/2820 5722/5756/2820 5718/5757/2820 +f 5839/5758/2821 5836/5759/2821 5813/5760/2821 5724/5761/2821 5719/5762/2821 5723/5763/2821 +f 5855/5764/2822 5860/5765/2822 5848/5766/2822 5733/5767/2822 5726/5768/2822 5727/5769/2822 5732/5770/2822 5841/5771/2822 +f 5733/5772/2823 5845/5773/2823 5861/5774/2823 5863/5775/2823 5730/5776/2823 5726/5777/2823 +f 5866/5778/2824 5865/5779/2824 5843/5780/2824 5732/5781/2824 5727/5782/2824 5731/5783/2824 +f 5887/5784/2825 5893/5785/2825 5892/5786/2825 5874/5787/2825 5742/5788/2825 5734/5789/2825 5735/5790/2825 5741/5791/2825 5740/5792/2825 5873/5793/2825 +f 5742/5794/2826 5870/5795/2826 5895/5796/2826 5897/5797/2826 5738/5798/2826 5734/5799/2826 +f 5899/5800/2827 5898/5801/2827 5867/5802/2827 5741/5803/2827 5735/5804/2827 5739/5805/2827 +f 5743/5806/2828 5784/5807/2828 5786/5808/2828 5791/5809/2828 5814/5810/2828 +f 5887/5811/2828 5873/5812/2828 5875/5813/2828 5744/5814/2828 +f 5842/5815/2829 5847/5816/2829 5745/5817/2829 5855/5818/2829 5841/5819/2829 +f 5892/5820/2829 5744/5814/2829 5875/5813/2829 5874/5821/2829 +f 5869/5822/2829 5792/5823/2829 5770/5824/2829 5769/5825/2829 5772/5826/2829 5794/5827/2829 5843/5828/2829 5865/5829/2829 5895/5830/2829 5870/5831/2829 +f 5836/5832/2830 5861/5833/2830 5845/5834/2830 5796/5835/2830 5797/5836/2830 5799/5837/2830 5800/5838/2830 5813/5839/2830 +f 5746/5840/2830 5828/5841/2830 5810/5842/2830 5812/5843/2830 +f 5847/5816/2830 5848/5844/2830 5860/5845/2830 5745/5817/2830 +f 5903/5846/2831 5833/5847/2831 5818/5848/2831 5802/5849/2831 5750/5850/2831 5803/5851/2831 5888/5852/2831 +f 5747/5853/2831 5900/5854/2831 5885/5855/2831 5886/5856/2831 5889/5857/2831 +f 5815/5858/2831 5829/5859/2831 5746/5840/2831 5812/5843/2831 5809/5860/2831 +f 5747/5853/2832 5889/5857/2832 5890/5861/2832 5901/5862/2832 +f 5754/5863/2832 5859/5864/2832 5883/5865/2832 5902/5866/2832 5891/5867/2832 5752/5868/2832 5751/5869/2832 5753/5870/2832 +f 5876/5871/2832 5858/5872/2832 5856/5873/2832 5748/5874/2832 +f 5882/5875/2833 5897/5876/2833 5895/5877/2833 5865/5878/2833 5866/5879/2833 5849/5880/2833 5771/5881/2833 5768/5882/2833 5767/5883/2833 +f 5744/5884/2833 5892/5885/2833 5893/5886/2833 +f 5805/5887/2834 5894/5888/2834 5775/5889/2834 5776/5890/2834 5823/5891/2834 5834/5892/2834 5833/5893/2834 5903/5894/2834 5806/5895/2834 +f 5829/5896/2805 5828/5897/2805 5746/5898/2805 +f 5851/5899/2835 5863/5900/2835 5861/5901/2835 5836/5902/2835 5839/5903/2835 5822/5904/2835 5821/5905/2835 5774/5906/2835 5773/5907/2835 5850/5908/2835 +f 5860/5909/2805 5855/5910/2805 5745/5911/2805 +f 5878/5912/2836 5876/5913/2836 5748/5914/2836 +f 5896/5915/2837 5808/5916/2837 5807/5917/2837 5902/5918/2837 5883/5919/2837 5884/5920/2837 5871/5921/2837 5868/5922/2837 5778/5923/2837 5777/5924/2837 +f 5747/5925/2805 5901/5926/2805 5900/5927/2805 +f 5864/5928/2838 5877/5929/2838 5748/5874/2838 5856/5873/2838 5857/5930/2838 +f 5757/5931/2838 5826/5932/2838 5853/5933/2838 5879/5934/2838 5862/5935/2838 5755/5936/2838 5756/5937/2838 +f 5840/5938/2838 5825/5939/2838 5824/5940/2838 5831/5941/2838 5749/5942/2838 +f 5831/5941/2839 5830/5943/2839 5844/5944/2839 5749/5942/2839 +f 5784/5945/2839 5743/5946/2839 5811/5947/2839 5785/5948/2839 +f 5787/5949/2839 5819/5950/2839 5846/5951/2839 5827/5952/2839 5759/5953/2839 5758/5954/2839 5760/5955/2839 5781/5956/2839 5762/5957/2839 5761/5958/2839 +f 5877/5959/2840 5878/5912/2840 5748/5914/2840 +f 5880/5960/2840 5879/5961/2840 5853/5962/2840 5854/5963/2840 5835/5964/2840 5832/5965/2840 5780/5966/2840 5779/5967/2840 5872/5968/2840 +f 5743/5969/2805 5814/5970/2805 5811/5971/2805 +f 5817/5972/2841 5816/5973/2841 5898/5974/2841 5899/5975/2841 5881/5976/2841 5763/5977/2841 5765/5978/2841 5795/5979/2841 5804/5980/2841 +f 5749/5981/2805 5844/5982/2805 5840/5983/2805 +f 5852/5984/2842 5846/5985/2842 5819/5986/2842 5820/5987/2842 5801/5988/2842 5798/5989/2842 5782/5990/2842 5783/5991/2842 5837/5992/2842 5838/5993/2842 +f 5893/5886/2843 5887/5994/2843 5744/5884/2843 +f 5932/5995/2805 5930/5996/2805 5765/5997/2805 5763/5998/2805 +f 5939/5999/2844 5937/6000/2844 5767/6001/2844 5768/6002/2844 +f 5768/6002/2845 5771/6003/2845 5940/6004/2845 5939/5999/2845 +f 5774/6005/2805 5933/6006/2805 5941/6007/2805 5773/6008/2805 +f 5922/6009/2805 5936/6010/2805 5776/6011/2805 5775/6012/2805 +f 5943/6013/2846 5926/6014/2846 5777/6015/2846 5778/6016/2846 +f 5780/6017/2805 5944/6018/2805 5914/6019/2805 5779/6020/2805 +f 5782/6021/2805 5945/6022/2805 5946/6023/2805 5783/6024/2805 +f 5930/5996/2805 5947/6025/2805 5795/6026/2805 5765/5997/2805 +f 5948/6027/2847 5945/6022/2847 5782/6021/2847 5798/6028/2847 +f 5950/6029/2847 5948/6027/2847 5798/6028/2847 5801/6030/2847 +f 5947/6025/2805 5954/6031/2805 5804/6032/2805 5795/6026/2805 +f 5962/6033/2805 5944/6018/2805 5780/6017/2805 5832/6034/2805 +f 5966/6035/2805 5962/6033/2805 5832/6034/2805 5835/6036/2805 +f 5967/6037/2805 5968/6038/2805 5838/6039/2805 5837/6040/2805 +f 5946/6023/2805 5967/6037/2805 5837/6040/2805 5783/6024/2805 +f 5913/6041/2805 5943/6013/2805 5778/6016/2805 5868/6042/2805 +f 5912/6043/2805 5913/6041/2805 5868/6042/2805 5871/6044/2805 +f 5779/6020/2805 5914/6019/2805 5915/6045/2805 5872/6046/2805 +f 5921/6047/2805 5922/6009/2805 5775/6012/2805 5894/6048/2805 +f 5923/6049/2805 5921/6047/2805 5894/6048/2805 5805/6050/2805 +f 5925/6051/2847 5924/6052/2847 5808/6053/2847 5896/6054/2847 +f 5926/6014/2847 5925/6051/2847 5896/6054/2847 5777/6015/2847 +f 5821/6055/2848 5934/6056/2848 5933/6006/2848 5774/6005/2848 +f 5822/6057/2805 5935/6058/2805 5934/6056/2805 5821/6055/2805 +f 5936/6010/2805 5938/6059/2805 5823/6060/2805 5776/6011/2805 +f 5771/6003/2849 5849/6061/2849 5953/6062/2849 5940/6004/2849 +f 5850/6063/2849 5956/6064/2849 5955/6065/2849 5851/6066/2849 +f 5941/6007/2845 5956/6064/2845 5850/6063/2845 5773/6008/2845 +f 5763/5998/2850 5881/6067/2850 5969/6068/2850 5932/5995/2850 +f 5937/6000/2805 5970/6069/2805 5882/6070/2805 5767/6001/2805 +f 5969/6071/2828 5973/6072/2828 5961/6073/2828 5954/6074/2828 5947/6075/2828 5930/6076/2828 5932/6077/2828 +f 5953/6078/2829 5958/6079/2829 5978/6080/2829 5970/6081/2829 5937/6082/2829 5939/6083/2829 5940/6084/2829 +f 5935/6085/2830 5942/6086/2830 5965/6087/2830 5955/6088/2830 5956/6089/2830 5941/6090/2830 5933/6091/2830 5934/6092/2830 +f 5923/6093/2831 5927/6094/2831 5951/6095/2831 5938/6096/2831 5936/6097/2831 5922/6098/2831 5921/6099/2831 +f 5912/6100/2832 5916/6101/2832 5929/6102/2832 5924/6103/2832 5925/6104/2832 5926/6105/2832 5943/6106/2832 5913/6107/2832 +f 5977/6108/2851 5978/6109/2851 5958/6110/2851 5963/6111/2851 5908/6112/2851 5907/6113/2851 +f 5964/6114/2852 5965/6115/2852 5942/6116/2852 5949/6117/2852 5910/6118/2852 +f 5911/6119/2853 5920/6120/2853 5918/6121/2853 +f 5931/6122/2854 5929/6123/2854 5916/6124/2854 5917/6125/2854 5905/6126/2854 +f 5952/6127/2855 5951/6128/2855 5927/6129/2855 5928/6130/2855 5906/6131/2855 +f 5966/6132/2838 5971/6133/2838 5919/6134/2838 5915/6135/2838 5914/6136/2838 5944/6137/2838 5962/6138/2838 +f 5948/6139/2839 5950/6140/2839 5957/6141/2839 5974/6142/2839 5968/6143/2839 5967/6144/2839 5946/6145/2839 5945/6146/2839 +f 5971/6147/2856 5972/6148/2856 5911/6119/2856 5918/6121/2856 5919/6149/2856 +f 5979/6150/2857 5974/6151/2857 5957/6152/2857 5959/6153/2857 5904/6154/2857 +f 5960/6155/2858 5961/6156/2858 5973/6157/2858 5975/6158/2858 5909/6159/2858 +f 5907/6113/2859 5976/6160/2859 5977/6108/2859 +f 5981/6161/2805 5982/6162/2805 5983/6163/2805 5984/6164/2805 5985/6165/2805 5986/6166/2805 5980/6167/2805 +f 5995/6168/2805 5988/6169/2805 5987/6170/2805 5994/6171/2805 +f 5994/6171/2805 5987/6170/2805 5989/6172/2805 5996/6173/2805 +f 5996/6173/2805 5989/6172/2805 5990/6174/2805 5997/6175/2805 +f 5997/6175/2805 5990/6174/2805 5991/6176/2805 5998/6177/2805 +f 5998/6177/2805 5991/6176/2805 5992/6178/2805 5999/6179/2805 +f 5999/6179/2805 5992/6178/2805 5993/6180/2805 6000/6181/2805 +f 6000/6181/2805 5993/6180/2805 5988/6169/2805 5995/6168/2805 +f 5980/6167/2860 5995/6168/2860 5994/6171/2860 5981/6161/2860 +f 5981/6161/2861 5994/6171/2861 5996/6173/2861 5982/6162/2861 +f 5982/6162/2862 5996/6173/2862 5997/6175/2862 5983/6163/2862 +f 5983/6163/2863 5997/6175/2863 5998/6177/2863 5984/6164/2863 +f 5984/6164/2864 5998/6177/2864 5999/6179/2864 5985/6165/2864 +f 5985/6165/2865 5999/6179/2865 6000/6181/2865 5986/6166/2865 +f 5986/6166/2866 6000/6181/2866 5995/6168/2866 5980/6167/2866 +f 6002/6182/2867 6005/6183/2867 5689/5607/2867 5688/5606/2867 +f 6007/6184/2868 6009/6185/2868 5697/5613/2868 5696/5612/2868 +f 6011/6186/2869 6013/6187/2869 5705/5619/2869 5704/5618/2869 +f 6015/6188/2870 6016/6189/2870 5713/5625/2870 5712/5624/2870 +f 6020/6190/2871 6022/6191/2871 5721/5631/2871 5720/5630/2871 +f 6004/6192/2872 6003/6193/2872 5729/5637/2872 5728/5636/2872 +f 6012/6194/2873 6010/6195/2873 5737/5643/2873 5736/5642/2873 +f 5959/6196/2808 5957/6197/2808 5950/6198/2808 5801/6199/2808 5820/5669/2808 5691/5674/2808 5689/6200/2808 6005/6201/2808 6019/6202/2808 +f 5954/6203/2807 5961/6204/2807 5960/6205/2807 6021/6206/2807 6002/6207/2807 5688/6208/2807 5690/5667/2807 5817/5666/2807 5804/6209/2807 +f 5972/6210/2811 5971/6211/2811 5966/6212/2811 5835/6213/2811 5854/5689/2811 5699/5694/2811 5697/6214/2811 6009/6215/2811 6028/6216/2811 +f 5968/6217/2810 5974/6218/2810 5979/6219/2810 6031/6220/2810 6007/6221/2810 5696/6222/2810 5698/5687/2810 5852/5686/2810 5838/6223/2810 +f 6013/6224/2814 6032/6225/2814 5917/6226/2814 5916/6227/2814 5912/6228/2814 5871/6229/2814 5884/5710/2814 5707/5715/2814 5705/6230/2814 +f 5915/6231/2813 5919/6232/2813 5918/6233/2813 5920/6234/2813 6037/6235/2813 6011/6236/2813 5704/6237/2813 5706/5708/2813 5880/5707/2813 5872/6238/2813 +f 6016/6239/2817 6038/6240/2817 5928/6241/2817 5927/6242/2817 5923/6243/2817 5805/6244/2817 5806/5730/2817 5715/5735/2817 5713/6245/2817 +f 5924/6246/2816 5929/6247/2816 5931/6248/2816 6036/6249/2816 6015/6250/2816 5712/6251/2816 5714/5728/2816 5807/5727/2816 5808/6252/2816 +f 6022/6253/2821 6035/6254/2821 5949/6255/2821 5942/6256/2821 5935/6257/2821 5822/6258/2821 5839/5758/2821 5723/5763/2821 5721/6259/2821 +f 5938/6260/2820 5951/6261/2820 5952/6262/2820 6030/6263/2820 6020/6264/2820 5720/6265/2820 5722/5756/2820 5834/5755/2820 5823/6266/2820 +f 5963/6267/2824 5958/6268/2824 5953/6269/2824 5849/6270/2824 5866/5778/2824 5731/5783/2824 5729/6271/2824 6003/6272/2824 6001/6273/2824 +f 5955/6274/2823 5965/6275/2823 5964/6276/2823 6006/6277/2823 6004/6278/2823 5728/6279/2823 5730/5776/2823 5863/5775/2823 5851/6280/2823 +f 5975/6281/2827 5973/6282/2827 5969/6283/2827 5881/6284/2827 5899/5800/2827 5739/5805/2827 5737/6285/2827 6010/6286/2827 6008/6287/2827 +f 5970/6288/2826 5978/6289/2826 5977/6290/2826 5976/6291/2826 6014/6292/2826 6012/6293/2826 5736/6294/2826 5738/5798/2826 5897/5797/2826 5882/6295/2826 +f 6019/6296/2874 6017/6297/2874 6018/6298/2874 5904/6299/2874 5959/6300/2874 +f 6023/6301/2874 6021/6302/2874 5960/6303/2874 5909/6304/2874 +f 6008/6305/2875 6024/6306/2875 6023/6301/2875 5909/6304/2875 5975/6307/2875 +f 6025/6308/2875 6014/6309/2875 5976/6310/2875 5907/6311/2875 +f 5910/6312/2876 6026/6313/2876 6027/6314/2876 6006/6315/2876 5964/6316/2876 +f 6001/6317/2876 6029/6318/2876 6025/6308/2876 5907/6311/2876 5908/6319/2876 5963/6320/2876 +f 5906/6321/2877 6034/6322/2877 6033/6323/2877 6030/6324/2877 5952/6325/2877 +f 6035/6326/2877 6026/6313/2877 5910/6312/2877 5949/6327/2877 +f 6039/6328/2878 6040/6329/2878 6036/6330/2878 5931/6331/2878 5905/6332/2878 +f 6038/6333/2878 6034/6322/2878 5906/6321/2878 5928/6334/2878 +f 6032/6335/2879 6039/6328/2879 5905/6332/2879 5917/6336/2879 +f 6041/6337/2880 6037/6338/2880 5920/6339/2880 5911/6340/2880 +f 6028/6341/2881 6042/6342/2881 6041/6337/2881 5911/6340/2881 5972/6343/2881 +f 6018/6344/2881 6031/6345/2881 5979/6346/2881 5904/6347/2881 +f 6024/6348/2882 5987/6170/2882 5988/6169/2882 6017/6349/2882 6019/6350/2882 6005/6351/2882 6002/6352/2882 6021/6353/2882 6023/6354/2882 +f 6014/6355/2883 6025/6356/2883 6029/6357/2883 5989/6172/2883 5987/6170/2883 6024/6348/2883 6008/6358/2883 6010/6359/2883 6012/6360/2883 +f 6006/6361/2884 6027/6362/2884 5990/6174/2884 5989/6172/2884 6029/6357/2884 6001/6363/2884 6003/6364/2884 6004/6365/2884 +f 6026/6366/2885 6035/6367/2885 6022/6368/2885 6020/6369/2885 6030/6370/2885 6033/6371/2885 5991/6176/2885 5990/6174/2885 6027/6362/2885 +f 6034/6372/2886 6038/6373/2886 6016/6374/2886 6015/6375/2886 6036/6376/2886 6040/6377/2886 5992/6178/2886 5991/6176/2886 6033/6371/2886 +f 6039/6378/2887 6032/6379/2887 6013/6380/2887 6011/6381/2887 6037/6382/2887 6041/6383/2887 6042/6384/2887 5993/6180/2887 5992/6178/2887 6040/6377/2887 +f 6031/6385/2888 6018/6386/2888 6017/6349/2888 5988/6169/2888 5993/6180/2888 6042/6384/2888 6028/6387/2888 6009/6388/2888 6007/6389/2888 +usemtl Material.003 +f 4886/6390/2889 4383/6391/2889 4388/6392/2889 4892/6393/2889 4890/6394/2889 4885/6395/2889 +f 5301/6396/2890 5314/6397/2890 5309/6398/2890 5298/6399/2890 +f 5315/6400/2891 5326/6401/2891 5321/6402/2891 5308/6403/2891 +f 5327/6404/2892 5338/6405/2892 5333/6406/2892 5320/6407/2892 +f 5339/6408/2893 5350/6409/2893 5345/6410/2893 5332/6411/2893 +f 5351/6412/2894 5362/6413/2894 5357/6414/2894 5344/6415/2894 +f 5363/6416/2895 5374/6417/2895 5369/6418/2895 5356/6419/2895 +f 5375/6420/2896 5386/6421/2896 5381/6422/2896 5368/6423/2896 +f 5387/6424/2897 5398/6425/2897 5393/6426/2897 5380/6427/2897 +f 5399/6428/2898 5410/6429/2898 5405/6430/2898 5392/6431/2898 +f 5411/6432/2899 5422/6433/2899 5417/6434/2899 5404/6435/2899 +f 5423/6436/2900 5434/6437/2900 5429/6438/2900 5416/6439/2900 +f 5435/6440/2901 5446/6441/2901 5441/6442/2901 5428/6443/2901 +f 5447/6444/2902 5458/6445/2902 5453/6446/2902 5440/6447/2902 +f 5459/6448/2903 5470/6449/2903 5465/6450/2903 5452/6451/2903 +f 5471/6452/2904 5482/6453/2904 5477/6454/2904 5464/6455/2904 +f 5483/6456/2905 5494/6457/2905 5489/6458/2905 5476/6459/2905 +f 5495/6460/2906 5506/6461/2906 5501/6462/2906 5488/6463/2906 +f 5507/6464/2907 5518/6465/2907 5513/6466/2907 5500/6467/2907 +f 5519/6468/2908 5530/6469/2908 5525/6470/2908 5512/6471/2908 +f 5531/6472/2909 5542/6473/2909 5537/6474/2909 5524/6475/2909 +f 5543/6476/2910 5554/6477/2910 5549/6478/2910 5536/6479/2910 +f 5555/6480/2911 5566/6481/2911 5561/6482/2911 5548/6483/2911 +f 5567/6484/2912 5578/6485/2912 5573/6486/2912 5560/6487/2912 +f 5579/6488/2913 5590/6489/2913 5585/6490/2913 5572/6491/2913 +f 5591/6492/2914 5602/6493/2914 5597/6494/2914 5584/6495/2914 +f 5603/6496/2915 5614/6497/2915 5609/6498/2915 5596/6499/2915 +f 5615/6500/2916 5626/6501/2916 5621/6502/2916 5608/6503/2916 +f 5627/6504/2917 5638/6505/2917 5633/6506/2917 5620/6507/2917 +f 4892/6508/2918 4388/6509/2918 4393/6510/2918 4898/6511/2918 4896/6512/2918 4891/6513/2918 +f 5277/6514/2919 5300/6515/2919 5299/6516/2919 5274/6517/2919 +f 4880/6518/2920 4378/6519/2920 4383/6520/2920 4886/6521/2920 4884/6522/2920 4879/6523/2920 +f 5059/6524/2921 4872/6525/2921 5257/6526/2921 5282/6527/2921 +f 4373/6528/2922 4372/6529/2922 4377/6530/2922 4378/6531/2922 +f 4372/6532/2923 4371/5573/2923 4376/5604/2923 4377/6533/2923 +f 4877/6534/2924 4375/6535/2924 4583/6536/2924 5063/6537/2924 5061/6538/2924 4876/6539/2924 +f 4380/6540/2925 4379/6541/2925 4374/6542/2925 4375/6543/2925 +f 4379/6544/2926 5652/6545/2926 5651/6546/2926 4374/6547/2926 +f 4879/6523/2919 4884/6522/2919 5303/6548/2919 5278/6549/2919 +f 4378/6519/2927 4377/6550/2927 4382/6551/2927 4383/6520/2927 +f 4377/6533/2928 4376/5604/2928 4381/5603/2928 4382/6552/2928 +f 5269/6553/2919 5292/6554/2919 4888/6555/2919 4881/6556/2919 +f 4385/6557/2929 4384/6558/2929 4379/6559/2929 4380/6560/2929 +f 4384/6561/2930 5653/6562/2930 5652/6545/2930 4379/6544/2930 +f 4885/6395/2890 4890/6394/2890 5313/6563/2890 5302/6564/2890 +f 4383/6391/2931 4382/6565/2931 4387/6566/2931 4388/6392/2931 +f 4382/6552/2932 4381/5603/2932 4386/5602/2932 4387/6567/2932 +f 5293/6568/2890 5306/6569/2890 4894/6570/2890 4887/6571/2890 +f 4390/6572/2933 4389/6573/2933 4384/6574/2933 4385/6575/2933 +f 4389/6576/2934 5654/6577/2934 5653/6562/2934 4384/6561/2934 +f 4891/6513/2891 4896/6512/2891 5325/6578/2891 5312/6579/2891 +f 4388/6509/2935 4387/6580/2935 4392/6581/2935 4393/6510/2935 +f 4387/6567/2936 4386/5602/2936 4391/5601/2936 4392/6582/2936 +f 5307/6583/2891 5318/6584/2891 4900/6585/2891 4893/6586/2891 +f 4395/6587/2937 4394/6588/2937 4389/6589/2937 4390/6590/2937 +f 4394/6591/2938 5655/6592/2938 5654/6577/2938 4389/6576/2938 +f 4897/6593/2892 4902/6594/2892 5337/6595/2892 5324/6596/2892 +f 4393/6597/2939 4392/6598/2939 4397/6599/2939 4398/6600/2939 +f 4392/6582/2940 4391/5601/2940 4396/5600/2940 4397/6601/2940 +f 5319/6602/2892 5330/6603/2892 4906/6604/2892 4899/6605/2892 +f 4401/6606/2941 4400/6607/2941 4394/6608/2941 4395/6609/2941 +f 4400/6610/2942 5656/6611/2942 5655/6592/2942 4394/6591/2942 +f 4903/6612/2893 4908/6613/2893 5349/6614/2893 5336/6615/2893 +f 4398/6616/2943 4397/6617/2943 4404/6618/2943 4405/6619/2943 +f 4397/6601/2944 4396/5600/2944 4402/5599/2944 4404/6620/2944 +f 5331/6621/2893 5342/6622/2893 4912/6623/2893 4905/6624/2893 +f 4408/6625/2945 4407/6626/2945 4400/6627/2945 4401/6628/2945 +f 4407/6629/2946 5657/6630/2946 5656/6611/2946 4400/6610/2946 +f 4909/6631/2894 4914/6632/2894 5361/6633/2894 5348/6634/2894 +f 4405/6635/2947 4404/6636/2947 4411/6637/2947 4412/6638/2947 +f 4404/6620/2948 4402/5599/2948 4409/5598/2948 4411/6639/2948 +f 5343/6640/2894 5354/6641/2894 4918/6642/2894 4911/6643/2894 +f 4415/6644/2949 4414/6645/2949 4407/6646/2949 4408/6647/2949 +f 4414/6648/2950 5658/6649/2950 5657/6630/2950 4407/6629/2950 +f 4915/6650/2895 4920/6651/2895 5373/6652/2895 5360/6653/2895 +f 4412/6654/2951 4411/6655/2951 4418/6656/2951 4419/6657/2951 +f 4411/6639/2952 4409/5598/2952 4416/5597/2952 4418/6658/2952 +f 5355/6659/2895 5366/6660/2895 4924/6661/2895 4917/6662/2895 +f 4422/6663/2953 4421/6664/2953 4414/6665/2953 4415/6666/2953 +f 4421/6667/2954 5659/6668/2954 5658/6649/2954 4414/6648/2954 +f 4921/6669/2896 4926/6670/2896 5385/6671/2896 5372/6672/2896 +f 4419/6673/2955 4418/6674/2955 4425/6675/2955 4426/6676/2955 +f 4418/6658/2956 4416/5597/2956 4423/5596/2956 4425/6677/2956 +f 5367/6678/2896 5378/6679/2896 4930/6680/2896 4923/6681/2896 +f 4429/6682/2957 4428/6683/2957 4421/6684/2957 4422/6685/2957 +f 4428/6686/2958 5660/6687/2958 5659/6668/2958 4421/6667/2958 +f 4927/6688/2897 4932/6689/2897 5397/6690/2897 5384/6691/2897 +f 4426/6692/2959 4425/6693/2959 4432/6694/2959 4433/6695/2959 +f 4425/6677/2960 4423/5596/2960 4430/5595/2960 4432/6696/2960 +f 5379/6697/2897 5390/6698/2897 4936/6699/2897 4929/6700/2897 +f 4436/6701/2961 4435/6702/2961 4428/6703/2961 4429/6704/2961 +f 4435/6705/2962 5661/6706/2962 5660/6687/2962 4428/6686/2962 +f 4933/6707/2898 4938/6708/2898 5409/6709/2898 5396/6710/2898 +f 4433/6711/2963 4432/6712/2963 4439/6713/2963 4440/6714/2963 +f 4432/6696/2964 4430/5595/2964 4437/5594/2964 4439/6715/2964 +f 5391/6716/2898 5402/6717/2898 4942/6718/2898 4935/6719/2898 +f 4443/6720/2965 4442/6721/2965 4435/6722/2965 4436/6723/2965 +f 4442/6724/2966 5662/6725/2966 5661/6706/2966 4435/6705/2966 +f 4939/6726/2899 4944/6727/2899 5421/6728/2899 5408/6729/2899 +f 4440/6730/2967 4439/6731/2967 4446/6732/2967 4447/6733/2967 +f 4439/6715/2968 4437/5594/2968 4444/5593/2968 4446/6734/2968 +f 5403/6735/2899 5414/6736/2899 4948/6737/2899 4941/6738/2899 +f 4450/6739/2969 4449/6740/2969 4442/6741/2969 4443/6742/2969 +f 4449/6743/2970 5663/5738/2970 5662/6725/2970 4442/6724/2970 +f 4945/6744/2900 4950/6745/2900 5433/6746/2900 5420/6747/2900 +f 4447/6748/2971 4446/6749/2971 4453/6750/2971 4454/6751/2971 +f 4446/6734/2972 4444/5593/2972 4451/5592/2972 4453/6752/2972 +f 5415/6753/2900 5426/6754/2900 4954/6755/2900 4947/6756/2900 +f 4457/6757/2973 4456/6758/2973 4449/6759/2973 4450/6760/2973 +f 4456/6761/2974 5664/5739/2974 5663/5738/2974 4449/6743/2974 +f 4951/6762/2901 4956/6763/2901 5445/6764/2901 5432/6765/2901 +f 4454/6766/2975 4453/6767/2975 4460/6768/2975 4461/6769/2975 +f 4453/6752/2976 4451/5592/2976 4458/5591/2976 4460/6770/2976 +f 5427/6771/2901 5438/6772/2901 4960/6773/2901 4953/6774/2901 +f 4464/6775/2977 4463/6776/2977 4456/6777/2977 4457/6778/2977 +f 4463/6779/2978 5665/6780/2978 5664/5739/2978 4456/6761/2978 +f 4957/6781/2902 4962/6782/2902 5457/6783/2902 5444/6784/2902 +f 4461/6785/2979 4460/6786/2979 4467/6787/2979 4468/6788/2979 +f 4460/6770/2980 4458/5591/2980 4465/5590/2980 4467/6789/2980 +f 5439/6790/2902 5450/6791/2902 4966/6792/2902 4959/6793/2902 +f 4471/6794/2981 4470/6795/2981 4463/6796/2981 4464/6797/2981 +f 4470/6798/2982 5666/6799/2982 5665/6780/2982 4463/6779/2982 +f 4963/6800/2903 4968/6801/2903 5469/6802/2903 5456/6803/2903 +f 4468/6804/2983 4467/6805/2983 4474/6806/2983 4475/6807/2983 +f 4467/6789/2984 4465/5590/2984 4472/5589/2984 4474/6808/2984 +f 5451/6809/2903 5462/6810/2903 4972/6811/2903 4965/6812/2903 +f 4478/6813/2985 4477/6814/2985 4470/6815/2985 4471/6816/2985 +f 4477/6817/2986 5667/6818/2986 5666/6799/2986 4470/6798/2986 +f 4969/6819/2904 4974/6820/2904 5481/6821/2904 5468/6822/2904 +f 4475/6823/2987 4474/6824/2987 4481/6825/2987 4482/6826/2987 +f 4474/6808/2988 4472/5589/2988 4479/5588/2988 4481/6827/2988 +f 5463/6828/2904 5474/6829/2904 4978/6830/2904 4971/6831/2904 +f 4485/6832/2989 4484/6833/2989 4477/6834/2989 4478/6835/2989 +f 4484/6836/2990 5668/6837/2990 5667/6818/2990 4477/6817/2990 +f 4975/6838/2905 4980/6839/2905 5493/6840/2905 5480/6841/2905 +f 4482/6842/2991 4481/6843/2991 4488/6844/2991 4489/6845/2991 +f 4481/6827/2992 4479/5588/2992 4486/5587/2992 4488/6846/2992 +f 5475/6847/2905 5486/6848/2905 4984/6849/2905 4977/6850/2905 +f 4492/6851/2993 4491/6852/2993 4484/6853/2993 4485/6854/2993 +f 4491/6855/2994 5669/6856/2994 5668/6837/2994 4484/6836/2994 +f 4981/6857/2906 4986/6858/2906 5505/6859/2906 5492/6860/2906 +f 4489/6861/2995 4488/6862/2995 4495/6863/2995 4496/6864/2995 +f 4488/6846/2996 4486/5587/2996 4493/5586/2996 4495/6865/2996 +f 5487/6866/2906 5498/6867/2906 4990/6868/2906 4983/6869/2906 +f 4499/6870/2997 4498/6871/2997 4491/6872/2997 4492/6873/2997 +f 4498/6874/2998 5670/6875/2998 5669/6856/2998 4491/6855/2998 +f 4987/6876/2907 4992/6877/2907 5517/6878/2907 5504/6879/2907 +f 4496/6880/2999 4495/6881/2999 4502/6882/2999 4503/6883/2999 +f 4495/6865/3000 4493/5586/3000 4500/5585/3000 4502/6884/3000 +f 5499/6885/2907 5510/6886/2907 4996/6887/2907 4989/6888/2907 +f 4506/6889/3001 4505/6890/3001 4498/6891/3001 4499/6892/3001 +f 4505/6893/3002 5671/6894/3002 5670/6875/3002 4498/6874/3002 +f 4993/6895/2908 4998/6896/2908 5529/6897/2908 5516/6898/2908 +f 4503/6899/3003 4502/6900/3003 4509/6901/3003 4510/6902/3003 +f 4502/6884/3004 4500/5585/3004 4507/5584/3004 4509/6903/3004 +f 5511/6904/2908 5522/6905/2908 5002/6906/2908 4995/6907/2908 +f 4513/6908/3005 4512/6909/3005 4505/6910/3005 4506/6911/3005 +f 4512/6912/3006 5672/6913/3006 5671/6894/3006 4505/6893/3006 +f 4999/6914/2909 5004/6915/2909 5541/6916/2909 5528/6917/2909 +f 4510/6918/3007 4509/6919/3007 4516/6920/3007 4517/6921/3007 +f 4509/6903/3008 4507/5584/3008 4514/5583/3008 4516/6922/3008 +f 5523/6923/2909 5534/6924/2909 5008/6925/2909 5001/6926/2909 +f 4520/6927/3009 4519/6928/3009 4512/6929/3009 4513/6930/3009 +f 4519/6931/3010 5673/6932/3010 5672/6913/3010 4512/6912/3010 +f 5005/6933/2910 5010/6934/2910 5553/6935/2910 5540/6936/2910 +f 4517/6937/3011 4516/6938/3011 4523/6939/3011 4524/6940/3011 +f 4516/6922/3012 4514/5583/3012 4521/5582/3012 4523/6941/3012 +f 5535/6942/2910 5546/6943/2910 5014/6944/2910 5007/6945/2910 +f 4527/6946/3013 4526/6947/3013 4519/6948/3013 4520/6949/3013 +f 4526/6950/3014 5674/6951/3014 5673/6932/3014 4519/6931/3014 +f 5011/6952/2911 5016/6953/2911 5565/6954/2911 5552/6955/2911 +f 4524/6956/3015 4523/6957/3015 4530/6958/3015 4531/6959/3015 +f 4523/6941/3016 4521/5582/3016 4528/5581/3016 4530/6960/3016 +f 5547/6961/2911 5558/6962/2911 5020/6963/2911 5013/6964/2911 +f 4534/6965/3017 4533/6966/3017 4526/6967/3017 4527/6968/3017 +f 4533/6969/3018 5675/6970/3018 5674/6951/3018 4526/6950/3018 +f 5017/6971/2912 5022/6972/2912 5577/6973/2912 5564/6974/2912 +f 4531/6975/3019 4530/6976/3019 4537/6977/3019 4538/6978/3019 +f 4530/6960/3020 4528/5581/3020 4535/5580/3020 4537/6979/3020 +f 5559/6980/2912 5570/6981/2912 5026/6982/2912 5019/6983/2912 +f 4541/6984/3021 4540/6985/3021 4533/6986/3021 4534/6987/3021 +f 4540/6988/3022 5676/6989/3022 5675/6970/3022 4533/6969/3022 +f 5023/6990/2913 5028/6991/2913 5589/6992/2913 5576/6993/2913 +f 4538/6994/3023 4537/6995/3023 4544/6996/3023 4545/6997/3023 +f 4537/6979/3024 4535/5580/3024 4542/5579/3024 4544/6998/3024 +f 5571/6999/2913 5582/7000/2913 5032/7001/2913 5025/7002/2913 +f 4548/7003/3025 4547/7004/3025 4540/7005/3025 4541/7006/3025 +f 4547/7007/3026 5677/7008/3026 5676/6989/3026 4540/6988/3026 +f 5029/7009/2914 5034/7010/2914 5601/7011/2914 5588/7012/2914 +f 4545/7013/3027 4544/7014/3027 4551/7015/3027 4552/7016/3027 +f 4544/6998/3028 4542/5579/3028 4549/5578/3028 4551/7017/3028 +f 5583/7018/2914 5594/7019/2914 5038/7020/2914 5031/7021/2914 +f 4555/7022/3029 4554/7023/3029 4547/7024/3029 4548/7025/3029 +f 4554/7026/3030 5678/7027/3030 5677/7008/3030 4547/7007/3030 +f 5035/7028/2915 5040/7029/2915 5613/7030/2915 5600/7031/2915 +f 4552/7032/3031 4551/7033/3031 4558/7034/3031 4559/7035/3031 +f 4551/7017/3032 4549/5578/3032 4556/5577/3032 4558/7036/3032 +f 5595/7037/2915 5606/7038/2915 5044/7039/2915 5037/7040/2915 +f 4562/7041/3033 4561/7042/3033 4554/7043/3033 4555/7044/3033 +f 4561/7045/3034 5679/7046/3034 5678/7027/3034 4554/7026/3034 +f 5041/7047/3035 5046/7048/3035 5625/7049/3035 5612/7050/3035 +f 4559/7051/3036 4558/7052/3036 4565/7053/3036 4566/7054/3036 +f 4558/7036/3037 4556/5577/3037 4563/5576/3037 4565/7055/3037 +f 5607/7056/3035 5618/7057/3035 5050/7058/3035 5043/7059/3035 +f 4569/7060/3038 4568/7061/3038 4561/7062/3038 4562/7063/3038 +f 4568/7064/3039 5680/7065/3039 5679/7046/3039 4561/7045/3039 +f 5047/7066/2917 5052/7067/2917 5637/7068/2917 5624/7069/2917 +f 4566/7070/3040 4565/7071/3040 4572/7072/3040 4573/7073/3040 +f 4565/7055/3041 4563/5576/3041 4570/5575/3041 4572/7074/3041 +f 5619/7075/2917 5630/7076/2917 5056/7077/2917 5049/7078/2917 +f 4576/7079/3042 4575/7080/3042 4568/7081/3042 4569/7082/3042 +f 4575/7083/3043 5681/7084/3043 5680/7065/3043 4568/7064/3043 +f 5053/7085/3044 5058/7086/3044 5283/7087/3044 5636/7088/3044 +f 4573/7089/3045 4572/7090/3045 4579/7091/3045 4580/7092/3045 +f 4572/7074/3046 4570/5575/3046 4577/5574/3046 4579/7093/3046 +f 5631/7094/3044 5288/7095/3044 5062/7096/3044 5055/7097/3044 +f 4583/7098/3047 4582/7099/3047 4575/7100/3047 4576/7101/3047 +f 4582/7102/3048 5682/7103/3048 5681/7084/3048 4575/7083/3048 +f 4874/7104/3049 4373/6528/3049 4378/6531/3049 4880/7105/3049 4878/7106/3049 4873/7107/3049 +f 4580/7108/3050 4579/7109/3050 4372/7110/3050 4373/7111/3050 +f 4579/7093/3051 4577/5574/3051 4371/5573/3051 4372/6532/3051 +f 5289/7112/2921 5266/7113/2921 4876/6539/2921 5061/6538/2921 +f 4375/6535/3052 4374/7114/3052 4582/7115/3052 4583/6536/3052 +f 4374/6547/3053 5651/6546/3053 5682/7103/3053 4582/7102/3053 +f 5263/7116/3054 5272/7117/3054 5271/7118/3054 5264/7119/3054 +f 5267/7120/3054 5268/7121/3054 4882/7122/3054 4875/7123/3054 +f 4883/7124/3055 4380/6540/3055 4375/6543/3055 4877/7125/3055 4875/7123/3055 4882/7122/3055 +f 5063/7126/3056 4583/7098/3056 4576/7101/3056 5057/7127/3056 5055/7097/3056 5062/7096/3056 +f 4889/7128/3057 4385/6557/3057 4380/6560/3057 4883/7129/3057 4881/6556/3057 4888/6555/3057 +f 5639/7130/3044 5280/7131/3044 5287/7132/3044 5632/7133/3044 +f 5635/7134/3044 5284/7135/3044 5291/7136/3044 5628/7137/3044 +f 5297/7138/2890 5310/7139/2890 5305/7140/2890 5294/7141/2890 +f 5122/7142/3058 5302/6564/3058 5313/6563/3058 5064/7143/3058 +f 5246/7144/3059 5290/7145/3059 5265/7146/3059 5254/7147/3059 +f 5057/7148/3060 4576/7079/3060 4569/7082/3060 5051/7149/3060 5049/7078/3060 5056/7077/3060 +f 5348/6634/3061 4869/7150/3061 4871/7151/3061 4909/6631/3061 +f 5054/7152/3062 4573/7089/3062 4580/7092/3062 5060/7153/3062 5058/7086/3062 5053/7085/3062 +f 5051/7154/3063 4569/7060/3063 4562/7063/3063 5045/7155/3063 5043/7059/3063 5050/7058/3063 +f 5623/7156/2917 5634/7157/2917 5629/7158/2917 5616/7159/2917 +f 5048/7160/3064 4566/7070/3064 4573/7073/3064 5054/7161/3064 5052/7067/3064 5047/7066/3064 +f 5045/7162/3065 4562/7041/3065 4555/7044/3065 5039/7163/3065 5037/7040/3065 5044/7039/3065 +f 5611/7164/2916 5622/7165/2916 5617/7166/2916 5604/7167/2916 +f 5042/7168/3066 4559/7051/3066 4566/7054/3066 5048/7169/3066 5046/7048/3066 5041/7047/3066 +f 5039/7170/3067 4555/7022/3067 4548/7025/3067 5033/7171/3067 5031/7021/3067 5038/7020/3067 +f 5599/7172/2915 5610/7173/2915 5605/7174/2915 5592/7175/2915 +f 5036/7176/3068 4552/7032/3068 4559/7035/3068 5042/7177/3068 5040/7029/3068 5035/7028/3068 +f 5033/7178/3069 4548/7003/3069 4541/7006/3069 5027/7179/3069 5025/7002/3069 5032/7001/3069 +f 5587/7180/2914 5598/7181/2914 5593/7182/2914 5580/7183/2914 +f 5030/7184/3070 4545/7013/3070 4552/7016/3070 5036/7185/3070 5034/7010/3070 5029/7009/3070 +f 5027/7186/3071 4541/6984/3071 4534/6987/3071 5021/7187/3071 5019/6983/3071 5026/6982/3071 +f 5575/7188/2913 5586/7189/2913 5581/7190/2913 5568/7191/2913 +f 5024/7192/3072 4538/6994/3072 4545/6997/3072 5030/7193/3072 5028/6991/3072 5023/6990/3072 +f 5021/7194/3073 4534/6965/3073 4527/6968/3073 5015/7195/3073 5013/6964/3073 5020/6963/3073 +f 5563/7196/2912 5574/7197/2912 5569/7198/2912 5556/7199/2912 +f 5018/7200/3074 4531/6975/3074 4538/6978/3074 5024/7201/3074 5022/6972/3074 5017/6971/3074 +f 5015/7202/3075 4527/6946/3075 4520/6949/3075 5009/7203/3075 5007/6945/3075 5014/6944/3075 +f 5551/7204/2911 5562/7205/2911 5557/7206/2911 5544/7207/2911 +f 5012/7208/3076 4524/6956/3076 4531/6959/3076 5018/7209/3076 5016/6953/3076 5011/6952/3076 +f 5009/7210/3077 4520/6927/3077 4513/6930/3077 5003/7211/3077 5001/6926/3077 5008/6925/3077 +f 5539/7212/2910 5550/7213/2910 5545/7214/2910 5532/7215/2910 +f 5006/7216/3078 4517/6937/3078 4524/6940/3078 5012/7217/3078 5010/6934/3078 5005/6933/3078 +f 5003/7218/3079 4513/6908/3079 4506/6911/3079 4997/7219/3079 4995/6907/3079 5002/6906/3079 +f 5527/7220/2909 5538/7221/2909 5533/7222/2909 5520/7223/2909 +f 5000/7224/3080 4510/6918/3080 4517/6921/3080 5006/7225/3080 5004/6915/3080 4999/6914/3080 +f 4997/7226/3081 4506/6889/3081 4499/6892/3081 4991/7227/3081 4989/6888/3081 4996/6887/3081 +f 5515/7228/2908 5526/7229/2908 5521/7230/2908 5508/7231/2908 +f 4994/7232/3082 4503/6899/3082 4510/6902/3082 5000/7233/3082 4998/6896/3082 4993/6895/3082 +f 4991/7234/3083 4499/6870/3083 4492/6873/3083 4985/7235/3083 4983/6869/3083 4990/6868/3083 +f 5503/7236/2907 5514/7237/2907 5509/7238/2907 5496/7239/2907 +f 4988/7240/3084 4496/6880/3084 4503/6883/3084 4994/7241/3084 4992/6877/3084 4987/6876/3084 +f 4985/7242/3085 4492/6851/3085 4485/6854/3085 4979/7243/3085 4977/6850/3085 4984/6849/3085 +f 5491/7244/2906 5502/7245/2906 5497/7246/2906 5484/7247/2906 +f 4982/7248/3086 4489/6861/3086 4496/6864/3086 4988/7249/3086 4986/6858/3086 4981/6857/3086 +f 4979/7250/3087 4485/6832/3087 4478/6835/3087 4973/7251/3087 4971/6831/3087 4978/6830/3087 +f 5479/7252/2905 5490/7253/2905 5485/7254/2905 5472/7255/2905 +f 4976/7256/3088 4482/6842/3088 4489/6845/3088 4982/7257/3088 4980/6839/3088 4975/6838/3088 +f 4973/7258/3089 4478/6813/3089 4471/6816/3089 4967/7259/3089 4965/6812/3089 4972/6811/3089 +f 5467/7260/2904 5478/7261/2904 5473/7262/2904 5460/7263/2904 +f 4970/7264/3090 4475/6823/3090 4482/6826/3090 4976/7265/3090 4974/6820/3090 4969/6819/3090 +f 4967/7266/3091 4471/6794/3091 4464/6797/3091 4961/7267/3091 4959/6793/3091 4966/6792/3091 +f 5455/7268/2903 5466/7269/2903 5461/7270/2903 5448/7271/2903 +f 4964/7272/3092 4468/6804/3092 4475/6807/3092 4970/7273/3092 4968/6801/3092 4963/6800/3092 +f 4961/7274/3093 4464/6775/3093 4457/6778/3093 4955/7275/3093 4953/6774/3093 4960/6773/3093 +f 5443/7276/2902 5454/7277/2902 5449/7278/2902 5436/7279/2902 +f 4958/7280/3094 4461/6785/3094 4468/6788/3094 4964/7281/3094 4962/6782/3094 4957/6781/3094 +f 4955/7282/3095 4457/6757/3095 4450/6760/3095 4949/7283/3095 4947/6756/3095 4954/6755/3095 +f 5431/7284/2901 5442/7285/2901 5437/7286/2901 5424/7287/2901 +f 4952/7288/3096 4454/6766/3096 4461/6769/3096 4958/7289/3096 4956/6763/3096 4951/6762/3096 +f 4949/7290/3097 4450/6739/3097 4443/6742/3097 4943/7291/3097 4941/6738/3097 4948/6737/3097 +f 5419/7292/2900 5430/7293/2900 5425/7294/2900 5412/7295/2900 +f 4946/7296/3098 4447/6748/3098 4454/6751/3098 4952/7297/3098 4950/6745/3098 4945/6744/3098 +f 4943/7298/3099 4443/6720/3099 4436/6723/3099 4937/7299/3099 4935/6719/3099 4942/6718/3099 +f 5407/7300/2899 5418/7301/2899 5413/7302/2899 5400/7303/2899 +f 4940/7304/3100 4440/6730/3100 4447/6733/3100 4946/7305/3100 4944/6727/3100 4939/6726/3100 +f 4937/7306/3101 4436/6701/3101 4429/6704/3101 4931/7307/3101 4929/6700/3101 4936/6699/3101 +f 5395/7308/2898 5406/7309/2898 5401/7310/2898 5388/7311/2898 +f 4934/7312/3102 4433/6711/3102 4440/6714/3102 4940/7313/3102 4938/6708/3102 4933/6707/3102 +f 4931/7314/3103 4429/6682/3103 4422/6685/3103 4925/7315/3103 4923/6681/3103 4930/6680/3103 +f 5383/7316/2897 5394/7317/2897 5389/7318/2897 5376/7319/2897 +f 4928/7320/3104 4426/6692/3104 4433/6695/3104 4934/7321/3104 4932/6689/3104 4927/6688/3104 +f 4925/7322/3105 4422/6663/3105 4415/6666/3105 4919/7323/3105 4917/6662/3105 4924/6661/3105 +f 5371/7324/2896 5382/7325/2896 5377/7326/2896 5364/7327/2896 +f 4922/7328/3106 4419/6673/3106 4426/6676/3106 4928/7329/3106 4926/6670/3106 4921/6669/3106 +f 4919/7330/3107 4415/6644/3107 4408/6647/3107 4913/7331/3107 4911/6643/3107 4918/6642/3107 +f 5359/7332/2895 5370/7333/2895 5365/7334/2895 5352/7335/2895 +f 4916/7336/3108 4412/6654/3108 4419/6657/3108 4922/7337/3108 4920/6651/3108 4915/6650/3108 +f 4913/7338/3109 4408/6625/3109 4401/6628/3109 4907/7339/3109 4905/6624/3109 4912/6623/3109 +f 5347/7340/2894 5358/7341/2894 5353/7342/2894 5340/7343/2894 +f 4910/7344/3110 4405/6635/3110 4412/6638/3110 4916/7345/3110 4914/6632/3110 4909/6631/3110 +f 4907/7346/3111 4401/6606/3111 4395/6609/3111 4901/7347/3111 4899/6605/3111 4906/6604/3111 +f 5335/7348/2893 5346/7349/2893 5341/7350/2893 5328/7351/2893 +f 4904/7352/3112 4398/6616/3112 4405/6619/3112 4910/7353/3112 4908/6613/3112 4903/6612/3112 +f 4901/7354/3113 4395/6587/3113 4390/6590/3113 4895/7355/3113 4893/6586/3113 4900/6585/3113 +f 5323/7356/3114 5334/7357/3114 5329/7358/3114 5316/7359/3114 +f 4898/7360/3115 4393/6597/3115 4398/6600/3115 4904/7361/3115 4902/6594/3115 4897/6593/3115 +f 4895/7362/3116 4390/6572/3116 4385/6575/3116 4889/7363/3116 4887/6571/3116 4894/6570/3116 +f 5311/7364/2891 5322/7365/2891 5317/7366/2891 5304/7367/2891 +f 5281/7368/2921 5258/7369/2921 5261/7370/2921 5286/7371/2921 +f 5273/7372/2919 5296/7373/2919 5295/7374/2919 5270/7375/2919 +f 5285/7376/2921 5262/7377/2921 5265/7146/2921 5290/7145/2921 +f 5311/7364/3117 5129/7378/3117 5130/7379/3117 5322/7365/3117 +f 5293/6568/3118 5250/7380/3118 5192/7381/3118 5306/6569/3118 +f 5259/7382/3054 5276/7383/3054 5275/7384/3054 5260/7385/3054 +f 5259/7382/3119 5127/7386/3119 5125/7387/3119 5276/7383/3119 +f 5263/7116/3120 5191/7388/3120 5189/7389/3120 5272/7117/3120 +f 5267/7120/3121 5255/7390/3121 5253/7391/3121 5268/7121/3121 +f 5277/6514/3122 5124/7392/3122 5123/7393/3122 5300/6515/3122 +f 5182/7394/3123 5286/7371/3123 5261/7370/3123 5190/7395/3123 +f 5269/6553/3124 5252/7396/3124 5251/7397/3124 5292/6554/3124 +f 5627/6504/3125 5117/7398/3125 5120/7399/3125 5638/6505/3125 +f 5285/7376/3126 5182/7394/3126 5190/7395/3126 5262/7377/3126 +f 5619/7075/3127 5245/7400/3127 5248/7401/3127 5630/7076/3127 +f 5117/7398/3128 5624/7069/3128 5637/7068/3128 5120/7399/3128 +f 5611/7164/3129 5179/7402/3129 5180/7403/3129 5622/7165/3129 +f 5245/7400/3130 5616/7159/3130 5629/7158/3130 5248/7401/3130 +f 5603/6496/3131 5113/7404/3131 5114/7405/3131 5614/6497/3131 +f 5179/7402/3132 5608/6503/3132 5621/6502/3132 5180/7403/3132 +f 5607/7056/3133 5243/7406/3133 5244/7407/3133 5618/7057/3133 +f 5113/7404/3134 5600/7031/3134 5613/7030/3134 5114/7405/3134 +f 5599/7172/3135 5177/7408/3135 5178/7409/3135 5610/7173/3135 +f 5583/7018/3136 5239/7410/3136 5240/7411/3136 5594/7019/3136 +f 5591/6492/3137 5111/7412/3137 5112/7413/3137 5602/6493/3137 +f 5575/7188/3138 5173/7414/3138 5174/7415/3138 5586/7189/3138 +f 5239/7410/3139 5580/7183/3139 5593/7182/3139 5240/7411/3139 +f 5567/6484/3140 5107/7416/3140 5108/7417/3140 5578/6485/3140 +f 5173/7414/3141 5572/6491/3141 5585/6490/3141 5174/7415/3141 +f 5559/6980/3142 5235/7418/3142 5236/7419/3142 5570/6981/3142 +f 5107/7416/3143 5564/6974/3143 5577/6973/3143 5108/7417/3143 +f 5551/7204/3144 5169/7420/3144 5170/7421/3144 5562/7205/3144 +f 5235/7418/3145 5556/7199/3145 5569/7198/3145 5236/7419/3145 +f 5543/6476/3146 5103/7422/3146 5104/7423/3146 5554/6477/3146 +f 5169/7420/3147 5548/6483/3147 5561/6482/3147 5170/7421/3147 +f 5535/6942/3148 5231/7424/3148 5232/7425/3148 5546/6943/3148 +f 5103/7422/3149 5540/6936/3149 5553/6935/3149 5104/7423/3149 +f 5527/7220/3150 5165/7426/3150 5166/7427/3150 5538/7221/3150 +f 5231/7424/3151 5532/7215/3151 5545/7214/3151 5232/7425/3151 +f 5519/6468/3152 5099/7428/3152 5100/7429/3152 5530/6469/3152 +f 5165/7426/3153 5524/6475/3153 5537/6474/3153 5166/7427/3153 +f 5523/6923/3154 5229/7430/3154 5230/7431/3154 5534/6924/3154 +f 5099/7428/3155 5516/6898/3155 5529/6897/3155 5100/7429/3155 +f 5515/7228/3156 5163/7432/3156 5164/7433/3156 5526/7229/3156 +f 5499/6885/3157 5225/7434/3157 5226/7435/3157 5510/6886/3157 +f 5507/6464/3158 5097/7436/3158 5098/7437/3158 5518/6465/3158 +f 5491/7244/3159 5159/7438/3159 5160/7439/3159 5502/7245/3159 +f 5225/7434/3160 5496/7239/3160 5509/7238/3160 5226/7435/3160 +f 5483/6456/3161 5093/7440/3161 5094/7441/3161 5494/6457/3161 +f 5159/7438/3162 5488/6463/3162 5501/6462/3162 5160/7439/3162 +f 5475/6847/3163 5221/7442/3163 5222/7443/3163 5486/6848/3163 +f 5093/7440/3164 5480/6841/3164 5493/6840/3164 5094/7441/3164 +f 5467/7260/3165 5155/7444/3165 5156/7445/3165 5478/7261/3165 +f 5221/7442/3166 5472/7255/3166 5485/7254/3166 5222/7443/3166 +f 5459/6448/3167 5089/7446/3167 5090/7447/3167 5470/6449/3167 +f 5155/7444/3168 5464/6455/3168 5477/6454/3168 5156/7445/3168 +f 5451/6809/3169 5217/7448/3169 5218/7449/3169 5462/6810/3169 +f 5089/7446/3170 5456/6803/3170 5469/6802/3170 5090/7447/3170 +f 5443/7276/3171 5151/7450/3171 5152/7451/3171 5454/7277/3171 +f 5217/7448/3172 5448/7271/3172 5461/7270/3172 5218/7449/3172 +f 5435/6440/3173 5085/7452/3173 5086/7453/3173 5446/6441/3173 +f 5151/7450/3174 5440/6447/3174 5453/6446/3174 5152/7451/3174 +f 5439/6790/3175 5215/7454/3175 5216/7455/3175 5450/6791/3175 +f 5085/7452/3176 5432/6765/3176 5445/6764/3176 5086/7453/3176 +f 5431/7284/3177 5149/7456/3177 5150/7457/3177 5442/7285/3177 +f 5415/6753/3178 5211/7458/3178 5212/7459/3178 5426/6754/3178 +f 5423/6436/3179 5083/7460/3179 5084/7461/3179 5434/6437/3179 +f 5407/7300/3180 5145/7462/3180 5146/7463/3180 5418/7301/3180 +f 5211/7458/3181 5412/7295/3181 5425/7294/3181 5212/7459/3181 +f 5399/6428/3182 5079/7464/3182 5080/7465/3182 5410/6429/3182 +f 5145/7462/3183 5404/6435/3183 5417/6434/3183 5146/7463/3183 +f 5391/6716/3184 5207/7466/3184 5208/7467/3184 5402/6717/3184 +f 5079/7464/3185 5396/6710/3185 5409/6709/3185 5080/7465/3185 +f 5383/7316/3186 5141/7468/3186 5142/7469/3186 5394/7317/3186 +f 5207/7466/3187 5388/7311/3187 5401/7310/3187 5208/7467/3187 +f 5375/6420/3188 5075/7470/3188 5076/7471/3188 5386/6421/3188 +f 5141/7468/3189 5380/6427/3189 5393/6426/3189 5142/7469/3189 +f 5367/6678/3190 5203/7472/3190 5204/7473/3190 5378/6679/3190 +f 5075/7470/3191 5372/6672/3191 5385/6671/3191 5076/7471/3191 +f 5359/7332/3192 5137/7474/3192 5138/7475/3192 5370/7333/3192 +f 5203/7472/3193 5364/7327/3193 5377/7326/3193 5204/7473/3193 +f 5351/6412/3194 5071/7476/3194 5072/7477/3194 5362/6413/3194 +f 5137/7474/3195 5356/6419/3195 5369/6418/3195 5138/7475/3195 +f 5355/6659/3196 5201/7478/3196 5202/7479/3196 5366/6660/3196 +f 5071/7476/3197 5348/6634/3197 5361/6633/3197 5072/7477/3197 +f 5347/7340/3198 5135/7480/3198 5136/7481/3198 5358/7341/3198 +f 5331/6621/3199 5197/7482/3199 5198/7483/3199 5342/6622/3199 +f 5339/6408/3200 5069/7484/3200 5070/7485/3200 5350/6409/3200 +f 5323/7356/3201 5131/7486/3201 5132/7487/3201 5334/7357/3201 +f 5197/7482/3202 5328/7351/3202 5341/7350/3202 5198/7483/3202 +f 5315/6400/3203 5065/7488/3203 5066/7489/3203 5326/6401/3203 +f 5186/7490/3204 5298/6399/3204 5309/6398/3204 5128/7491/3204 +f 5307/6583/3205 5193/7492/3205 5194/7493/3205 5318/6584/3205 +f 5301/6396/3206 5122/7142/3206 5064/7143/3206 5314/6397/3206 +f 5297/7138/3207 5186/7490/3207 5128/7491/3207 5310/7139/3207 +f 5193/7492/3208 5304/7367/3208 5317/7366/3208 5194/7493/3208 +f 5121/7494/3209 5636/7088/3209 5283/7087/3209 5119/7495/3209 +f 5273/7372/3210 5188/7496/3210 5187/7497/3210 5296/7373/3210 +f 5249/7498/3211 5628/7137/3211 5291/7136/3211 5247/7499/3211 +f 4873/7107/3054 4878/7106/3054 5279/7500/3054 5256/7501/3054 +f 5250/7380/3212 5294/7141/3212 5305/7140/3212 5192/7381/3212 +f 5319/6602/3213 5195/7502/3213 5196/7503/3213 5330/6603/3213 +f 5195/7502/3214 5316/7359/3214 5329/7358/3214 5196/7503/3214 +f 5343/6640/3215 5199/7504/3215 5200/7505/3215 5354/6641/3215 +f 5199/7504/3216 5340/7343/3216 5353/7342/3216 5200/7505/3216 +f 5201/7478/3217 5352/7335/3217 5365/7334/3217 5202/7479/3217 +f 5379/6697/3218 5205/7506/3218 5206/7507/3218 5390/6698/3218 +f 5205/7506/3219 5376/7319/3219 5389/7318/3219 5206/7507/3219 +f 5403/6735/3220 5209/7508/3220 5210/7509/3220 5414/6736/3220 +f 5209/7508/3221 5400/7303/3221 5413/7302/3221 5210/7509/3221 +f 5427/6771/3222 5213/7510/3222 5214/7511/3222 5438/6772/3222 +f 5213/7510/3223 5424/7287/3223 5437/7286/3223 5214/7511/3223 +f 5215/7454/3224 5436/7279/3224 5449/7278/3224 5216/7455/3224 +f 5463/6828/3225 5219/7512/3225 5220/7513/3225 5474/6829/3225 +f 5219/7512/3226 5460/7263/3226 5473/7262/3226 5220/7513/3226 +f 5487/6866/3227 5223/7514/3227 5224/7515/3227 5498/6867/3227 +f 5223/7514/3228 5484/7247/3228 5497/7246/3228 5224/7515/3228 +f 5511/6904/3229 5227/7516/3229 5228/7517/3229 5522/6905/3229 +f 5227/7516/3230 5508/7231/3230 5521/7230/3230 5228/7517/3230 +f 5229/7430/3231 5520/7223/3231 5533/7222/3231 5230/7431/3231 +f 5547/6961/3232 5233/7518/3232 5234/7519/3232 5558/6962/3232 +f 5233/7518/3233 5544/7207/3233 5557/7206/3233 5234/7519/3233 +f 5571/6999/3234 5237/7520/3234 5238/7521/3234 5582/7000/3234 +f 5237/7520/3235 5568/7191/3235 5581/7190/3235 5238/7521/3235 +f 5595/7037/3236 5241/7522/3236 5242/7523/3236 5606/7038/3236 +f 5241/7522/3237 5592/7175/3237 5605/7174/3237 5242/7523/3237 +f 5243/7406/3238 5604/7167/3238 5617/7166/3238 5244/7407/3238 +f 5631/7094/3239 5249/7498/3239 5247/7499/3239 5288/7095/3239 +f 5289/7112/3240 5246/7144/3240 5254/7147/3240 5266/7113/3240 +f 5252/7396/3241 5270/7375/3241 5295/7374/3241 5251/7397/3241 +f 5255/7390/3242 5264/7119/3242 5271/7118/3242 5253/7391/3242 +f 5635/7134/3243 5185/7524/3243 5183/7525/3243 5284/7135/3243 +f 5131/7486/3244 5320/6407/3244 5333/6406/3244 5132/7487/3244 +f 5129/7378/3245 5308/6403/3245 5321/6402/3245 5130/7379/3245 +f 5335/7348/3246 5133/7526/3246 5134/7527/3246 5346/7349/3246 +f 5133/7526/3247 5332/6411/3247 5345/6410/3247 5134/7527/3247 +f 5135/7480/3248 5344/6415/3248 5357/6414/3248 5136/7481/3248 +f 5371/7324/3249 5139/7528/3249 5140/7529/3249 5382/7325/3249 +f 5139/7528/3250 5368/6423/3250 5381/6422/3250 5140/7529/3250 +f 5395/7308/3251 5143/7530/3251 5144/7531/3251 5406/7309/3251 +f 5143/7530/3252 5392/6431/3252 5405/6430/3252 5144/7531/3252 +f 5419/7292/3253 5147/7532/3253 5148/7533/3253 5430/7293/3253 +f 5147/7532/3254 5416/6439/3254 5429/6438/3254 5148/7533/3254 +f 5149/7456/3255 5428/6443/3255 5441/6442/3255 5150/7457/3255 +f 5455/7268/3256 5153/7534/3256 5154/7535/3256 5466/7269/3256 +f 5153/7534/3257 5452/6451/3257 5465/6450/3257 5154/7535/3257 +f 5479/7252/3258 5157/7536/3258 5158/7537/3258 5490/7253/3258 +f 5157/7536/3259 5476/6459/3259 5489/6458/3259 5158/7537/3259 +f 5503/7236/3260 5161/7538/3260 5162/7539/3260 5514/7237/3260 +f 5161/7538/3261 5500/6467/3261 5513/6466/3261 5162/7539/3261 +f 5163/7432/3262 5512/6471/3262 5525/6470/3262 5164/7433/3262 +f 5539/7212/3263 5167/7540/3263 5168/7541/3263 5550/7213/3263 +f 5167/7540/3264 5536/6479/3264 5549/6478/3264 5168/7541/3264 +f 5563/7196/3265 5171/7542/3265 5172/7543/3265 5574/7197/3265 +f 5171/7542/3266 5560/6487/3266 5573/6486/3266 5172/7543/3266 +f 5587/7180/3267 5175/7544/3267 5176/7545/3267 5598/7181/3267 +f 5175/7544/3268 5584/6495/3268 5597/6494/3268 5176/7545/3268 +f 5177/7408/3269 5596/6499/3269 5609/6498/3269 5178/7409/3269 +f 5623/7156/3270 5181/7546/3270 5184/7547/3270 5634/7157/3270 +f 5181/7546/3271 5620/6507/3271 5633/6506/3271 5184/7547/3271 +f 5185/7524/3272 5632/7133/3272 5287/7132/3272 5183/7525/3272 +f 5188/7496/3273 5274/6517/3273 5299/6516/3273 5187/7497/3273 +f 5191/7388/3274 5260/7385/3274 5275/7384/3274 5189/7389/3274 +f 5118/7548/3275 5282/6527/3275 5257/6526/3275 5126/7549/3275 +f 5065/7488/3276 5312/6579/3276 5325/6578/3276 5066/7489/3276 +f 5327/6404/3277 5067/7550/3277 5068/7551/3277 5338/6405/3277 +f 5067/7550/3278 5324/6596/3278 5337/6595/3278 5068/7551/3278 +f 5069/7484/3279 5336/6615/3279 5349/6614/3279 5070/7485/3279 +f 5363/6416/3280 5073/7552/3280 5074/7553/3280 5374/6417/3280 +f 5073/7552/3281 5360/6653/3281 5373/6652/3281 5074/7553/3281 +f 5387/6424/3282 5077/7554/3282 5078/7555/3282 5398/6425/3282 +f 5077/7554/3283 5384/6691/3283 5397/6690/3283 5078/7555/3283 +f 5411/6432/3284 5081/7556/3284 5082/7557/3284 5422/6433/3284 +f 5081/7556/3285 5408/6729/3285 5421/6728/3285 5082/7557/3285 +f 5083/7460/3286 5420/6747/3286 5433/6746/3286 5084/7461/3286 +f 5447/6444/3287 5087/7558/3287 5088/7559/3287 5458/6445/3287 +f 5087/7558/3288 5444/6784/3288 5457/6783/3288 5088/7559/3288 +f 5471/6452/3289 5091/7560/3289 5092/7561/3289 5482/6453/3289 +f 5091/7560/3290 5468/6822/3290 5481/6821/3290 5092/7561/3290 +f 5495/6460/3291 5095/7562/3291 5096/7563/3291 5506/6461/3291 +f 5095/7562/3292 5492/6860/3292 5505/6859/3292 5096/7563/3292 +f 5097/7436/3293 5504/6879/3293 5517/6878/3293 5098/7437/3293 +f 5531/6472/3294 5101/7564/3294 5102/7565/3294 5542/6473/3294 +f 5101/7564/3295 5528/6917/3295 5541/6916/3295 5102/7565/3295 +f 5555/6480/3296 5105/7566/3296 5106/7567/3296 5566/6481/3296 +f 5105/7566/3297 5552/6955/3297 5565/6954/3297 5106/7567/3297 +f 5579/6488/3298 5109/7568/3298 5110/7569/3298 5590/6489/3298 +f 5109/7568/3299 5576/6993/3299 5589/6992/3299 5110/7569/3299 +f 5111/7412/3300 5588/7012/3300 5601/7011/3300 5112/7413/3300 +f 5615/6500/3301 5115/7570/3301 5116/7571/3301 5626/6501/3301 +f 5115/7570/3302 5612/7050/3302 5625/7049/3302 5116/7571/3302 +f 5639/7130/3303 5121/7494/3303 5119/7495/3303 5280/7131/3303 +f 5281/7368/3304 5118/7548/3304 5126/7549/3304 5258/7369/3304 +f 5124/7392/3305 5278/6549/3305 5303/6548/3305 5123/7393/3305 +f 5127/7386/3306 5256/7501/3306 5279/7500/3306 5125/7387/3306 +f 4872/6525/3307 4874/7572/3307 4873/7573/3307 4783/7574/3307 +f 4875/7575/3308 4877/6534/3308 4876/6539/3308 4782/7576/3308 +f 4878/7106/3309 4880/6518/3309 4879/6523/3309 4794/7577/3309 +f 4881/6556/3310 4883/7124/3310 4882/7578/3310 4793/7579/3310 +f 4884/6522/3311 4886/6390/3311 4885/6395/3311 4805/7580/3311 +f 4887/6571/3312 4889/7128/3312 4888/6555/3312 4804/7581/3312 +f 4890/6394/3313 4892/6508/3313 4891/6513/3313 4816/7582/3313 +f 4893/6586/3314 4895/7362/3314 4894/7583/3314 4815/7584/3314 +f 4896/6512/3315 4898/7360/3315 4897/6593/3315 4827/7585/3315 +f 4899/6605/3316 4901/7354/3316 4900/6585/3316 4826/7586/3316 +f 4902/6594/3317 4904/7352/3317 4903/6612/3317 4838/7587/3317 +f 4905/6624/3318 4907/7346/3318 4906/7588/3318 4837/7589/3318 +f 4908/6613/3319 4910/7344/3319 4909/6631/3319 4871/7151/3319 +f 4911/6643/3320 4913/7338/3320 4912/6623/3320 4870/7590/3320 +f 4914/6632/3321 4916/7336/3321 4915/6650/3321 4860/7591/3321 +f 4917/6662/3322 4919/7330/3322 4918/7592/3322 4859/7593/3322 +f 4920/6651/3323 4922/7328/3323 4921/6669/3323 4849/7594/3323 +f 4923/6681/3324 4925/7322/3324 4924/6661/3324 4848/7595/3324 +f 4926/6670/3325 4928/7320/3325 4927/6688/3325 5640/7596/3325 +f 4929/6700/3326 4931/7314/3326 4930/7597/3326 5641/7598/3326 +f 4932/6689/3327 4934/7312/3327 4933/6707/3327 4434/7599/3327 +f 4935/6719/3328 4937/7306/3328 4936/6699/3328 4431/7600/3328 +f 4938/6708/3329 4940/7304/3329 4939/6726/3329 4473/7601/3329 +f 4941/6738/3330 4943/7298/3330 4942/7602/3330 4469/7603/3330 +f 4944/6727/3331 4946/7296/3331 4945/6744/3331 4511/7604/3331 +f 4947/6756/3332 4949/7290/3332 4948/6737/3332 4508/7605/3332 +f 4950/6745/3333 4952/7288/3333 4951/6762/3333 4550/7606/3333 +f 4953/6774/3334 4955/7282/3334 4954/7607/3334 4546/7608/3334 +f 4956/6763/3335 4958/7280/3335 4957/6781/3335 4585/7609/3335 +f 4959/6793/3336 4961/7274/3336 4960/6773/3336 4584/7610/3336 +f 4962/6782/3337 4964/7272/3337 4963/6800/3337 4596/7611/3337 +f 4965/6812/3338 4967/7266/3338 4966/7612/3338 4595/7613/3338 +f 4968/6801/3339 4970/7264/3339 4969/6819/3339 4607/7614/3339 +f 4971/6831/3340 4973/7258/3340 4972/6811/3340 4606/7615/3340 +f 4974/6820/3341 4976/7256/3341 4975/6838/3341 4618/7616/3341 +f 4977/6850/3342 4979/7250/3342 4978/7617/3342 4617/7618/3342 +f 4980/6839/3343 4982/7248/3343 4981/6857/3343 4629/7619/3343 +f 4983/6869/3344 4985/7242/3344 4984/6849/3344 4628/7620/3344 +f 4986/6858/3345 4988/7240/3345 4987/6876/3345 4640/7621/3345 +f 4989/6888/3346 4991/7234/3346 4990/7622/3346 4639/7623/3346 +f 4992/6877/3347 4994/7232/3347 4993/6895/3347 4651/7624/3347 +f 4995/6907/3348 4997/7226/3348 4996/6887/3348 4650/7625/3348 +f 4998/6896/3349 5000/7224/3349 4999/6914/3349 4662/7626/3349 +f 5001/6926/3350 5003/7218/3350 5002/7627/3350 4661/7628/3350 +f 5004/6915/3351 5006/7216/3351 5005/6933/3351 4673/7629/3351 +f 5007/6945/3352 5009/7210/3352 5008/6925/3352 4672/7630/3352 +f 5010/6934/3353 5012/7208/3353 5011/6952/3353 4684/7631/3353 +f 5013/6964/3354 5015/7202/3354 5014/7632/3354 4683/7633/3354 +f 5016/6953/3355 5018/7200/3355 5017/6971/3355 4695/7634/3355 +f 5019/6983/3356 5021/7194/3356 5020/6963/3356 4694/7635/3356 +f 5022/6972/3357 5024/7192/3357 5023/6990/3357 4706/7636/3357 +f 5025/7002/3358 5027/7186/3358 5026/7637/3358 4705/7638/3358 +f 5028/6991/3359 5030/7184/3359 5029/7009/3359 4717/7639/3359 +f 5031/7021/3360 5033/7178/3360 5032/7001/3360 4716/7640/3360 +f 5034/7010/3361 5036/7176/3361 5035/7028/3361 4728/7641/3361 +f 5037/7040/3362 5039/7170/3362 5038/7642/3362 4727/7643/3362 +f 5040/7029/3363 5042/7168/3363 5041/7047/3363 4739/7644/3363 +f 5043/7059/3364 5045/7162/3364 5044/7039/3364 4738/7645/3364 +f 5046/7048/3365 5048/7160/3365 5047/7066/3365 4750/7646/3365 +f 5049/7078/3366 5051/7154/3366 5050/7647/3366 4749/7648/3366 +f 5052/7067/3367 5054/7152/3367 5053/7085/3367 4761/7649/3367 +f 5055/7097/3368 5057/7148/3368 5056/7077/3368 4760/7650/3368 +f 5058/7086/3369 5060/7651/3369 5059/6524/3369 4772/7652/3369 +f 5061/6538/3370 5063/7126/3370 5062/7653/3370 4771/7654/3370 +f 4814/7655/3371 5312/6579/3371 5065/7488/3371 4813/7656/3371 +f 4427/7657/3372 5396/6710/3372 5079/7464/3372 4424/7658/3372 +f 4616/7659/3373 5480/6841/3373 5093/7440/3373 4615/7660/3373 +f 4693/7661/3374 5564/6974/3374 5107/7416/3374 4692/7662/3374 +f 4759/7663/3375 5636/7088/3375 5121/7494/3375 4758/7664/3375 +f 5642/7665/3376 5380/6427/3376 5141/7468/3376 5643/7666/3376 +f 4605/7667/3377 5464/6455/3377 5155/7444/3377 4604/7668/3377 +f 4682/7669/3378 5548/6483/3378 5169/7420/3378 4681/7670/3378 +f 4770/7671/3379 5284/7135/3379 5183/7525/3379 4769/7672/3379 +f 4847/7673/3380 5364/7327/3380 5203/7472/3380 4846/7674/3380 +f 4594/7675/3381 5448/7271/3381 5217/7448/3381 4593/7676/3381 +f 4671/7677/3382 5532/7215/3382 5231/7424/3382 4670/7678/3382 +f 4748/7679/3383 5616/7159/3383 5245/7400/3383 4747/7680/3383 +f 4781/7681/3384 5264/7682/3384 5255/7683/3384 4780/7684/3384 +f 4836/7685/3385 5336/6615/3385 5069/7484/3385 4835/7686/3385 +f 4869/7150/3386 5348/6634/3386 5071/7476/3386 4868/7687/3386 +f 4845/7688/3387 5372/6672/3387 5075/7470/3387 4844/7689/3387 +f 4504/7690/3388 5420/6747/3388 5083/7460/3388 4501/7691/3388 +f 4543/7692/3389 5432/6765/3389 5085/7452/3389 4539/7693/3389 +f 4592/7694/3390 5456/6803/3390 5089/7446/3390 4591/7695/3390 +f 4638/7696/3391 5504/6879/3391 5097/7436/3391 4637/7697/3391 +f 4649/7698/3392 5516/6898/3392 5099/7428/3392 4648/7699/3392 +f 4669/7700/3393 5540/6936/3393 5103/7422/3393 4668/7701/3393 +f 4715/7702/3394 5588/7012/3394 5111/7412/3394 4714/7703/3394 +f 4726/7704/3395 5600/7031/3395 5113/7404/3395 4725/7705/3395 +f 4746/7706/3396 5624/7069/3396 5117/7398/3396 4745/7707/3396 +f 4792/7708/3397 5276/7383/3397 5125/7387/3397 4791/7709/3397 +f 4779/7710/3398 5256/7711/3398 5127/7712/3398 4778/7713/3398 +f 4825/7714/3399 5320/6407/3399 5131/7486/3399 4824/7715/3399 +f 4834/7716/3400 5332/6411/3400 5133/7526/3400 4833/7717/3400 +f 4858/7718/3401 5356/6419/3401 5137/7474/3401 4857/7719/3401 +f 4466/7720/3402 5404/6435/3402 5145/7462/3402 4462/7721/3402 +f 4497/7722/3403 5416/6439/3403 5147/7532/3403 4494/7723/3403 +f 4581/7724/3404 5440/6447/3404 5151/7450/3404 4578/7725/3404 +f 4627/7726/3405 5488/6463/3405 5159/7438/3405 4626/7727/3405 +f 4636/7728/3406 5500/6467/3406 5161/7538/3406 4635/7729/3406 +f 4660/7730/3407 5524/6475/3407 5165/7426/3407 4659/7731/3407 +f 4704/7732/3408 5572/6491/3408 5173/7414/3408 4703/7733/3408 +f 4713/7734/3409 5584/6495/3409 5175/7544/3409 4712/7735/3409 +f 4737/7736/3410 5608/6503/3410 5179/7402/3410 4736/7737/3410 +f 4803/7738/3411 5296/7373/3411 5187/7497/3411 4802/7739/3411 +f 4790/7740/3412 5272/7117/3412 5189/7389/3412 4789/7741/3412 +f 4812/7742/3413 5304/7367/3413 5193/7492/3413 4811/7743/3413 +f 4823/7744/3414 5316/7359/3414 5195/7502/3414 4822/7745/3414 +f 4867/7746/3415 5340/7343/3415 5199/7504/3415 4866/7747/3415 +f 4420/7748/3416 5388/7311/3416 5207/7466/3416 4417/7749/3416 +f 4459/7750/3417 5400/7303/3417 5209/7508/3417 4455/7751/3417 +f 4536/7752/3418 5424/7287/3418 5213/7510/3418 4532/7753/3418 +f 4614/7754/3419 5472/7255/3419 5221/7442/3419 4613/7755/3419 +f 4625/7756/3420 5484/7247/3420 5223/7514/3420 4624/7757/3420 +f 4647/7758/3421 5508/7231/3421 5227/7516/3421 4646/7759/3421 +f 4691/7760/3422 5556/7199/3422 5235/7418/3422 4690/7761/3422 +f 4702/7762/3423 5568/7191/3423 5237/7520/3423 4701/7763/3423 +f 4724/7764/3424 5592/7175/3424 5241/7522/3424 4723/7765/3424 +f 4757/7766/3425 5628/7137/3425 5249/7498/3425 4756/7767/3425 +f 4801/7768/3426 5292/6554/3426 5251/7397/3426 4800/7769/3426 +f 4788/7770/3427 5268/7121/3427 5253/7391/3427 4787/7771/3427 +f 4768/7772/3428 5288/7095/3428 5247/7499/3428 4767/7773/3428 +f 4735/7774/3429 5604/7167/3429 5243/7406/3429 4734/7775/3429 +f 4711/7776/3430 5580/7183/3430 5239/7410/3430 4710/7777/3430 +f 4680/7778/3431 5544/7207/3431 5233/7518/3431 4679/7779/3431 +f 4658/7780/3432 5520/7223/3432 5229/7430/3432 4657/7781/3432 +f 4634/7782/3433 5496/7239/3433 5225/7434/3433 4633/7783/3433 +f 4603/7784/3434 5460/7263/3434 5219/7512/3434 4602/7785/3434 +f 4574/7786/3435 5436/7279/3435 5215/7454/3435 4571/7787/3435 +f 4490/7788/3436 5412/7295/3436 5211/7458/3436 4487/7789/3436 +f 5644/7790/3437 5376/7319/3437 5205/7506/3437 5645/7791/3437 +f 4856/7792/3438 5352/7335/3438 5201/7478/3438 4855/7793/3438 +f 4832/7794/3439 5328/7351/3439 5197/7482/3439 4831/7795/3439 +f 4777/7796/3440 5260/7797/3440 5191/7798/3440 4776/7799/3440 +f 4755/7800/3441 5632/7133/3441 5185/7524/3441 4754/7801/3441 +f 4744/7802/3442 5620/6507/3442 5181/7546/3442 4743/7803/3442 +f 4722/7804/3443 5596/6499/3443 5177/7408/3443 4721/7805/3443 +f 4689/7806/3444 5560/6487/3444 5171/7542/3444 4688/7807/3444 +f 4667/7808/3445 5536/6479/3445 5167/7540/3445 4666/7809/3445 +f 4645/7810/3446 5512/6471/3446 5163/7432/3446 4644/7811/3446 +f 4612/7812/3447 5476/6459/3447 5157/7536/3447 4611/7813/3447 +f 4590/7814/3448 5452/6451/3448 5153/7534/3448 4589/7815/3448 +f 4529/7816/3449 5428/6443/3449 5149/7456/3449 4525/7817/3449 +f 4413/7818/3450 5392/6431/3450 5143/7530/3450 4410/7819/3450 +f 4843/7820/3451 5368/6423/3451 5139/7528/3451 4842/7821/3451 +f 4865/7822/3452 5344/6415/3452 5135/7480/3452 4864/7823/3452 +f 4810/7824/3453 5308/6403/3453 5129/7378/3453 4809/7825/3453 +f 4799/7826/3454 5300/6515/3454 5123/7393/3454 4798/7827/3454 +f 4766/7828/3455 5280/7131/3455 5119/7495/3455 4765/7829/3455 +f 4733/7830/3456 5612/7050/3456 5115/7570/3456 4732/7831/3456 +f 4700/7832/3457 5576/6993/3457 5109/7568/3457 4699/7833/3457 +f 4678/7834/3458 5552/6955/3458 5105/7566/3458 4677/7835/3458 +f 4656/7836/3459 5528/6917/3459 5101/7564/3459 4655/7837/3459 +f 4623/7838/3460 5492/6860/3460 5095/7562/3460 4622/7839/3460 +f 4601/7840/3461 5468/6822/3461 5091/7560/3461 4600/7841/3461 +f 4567/7842/3462 5444/6784/3462 5087/7558/3462 4564/7843/3462 +f 4452/7844/3463 5408/6729/3463 5081/7556/3463 4448/7845/3463 +f 5646/7846/3464 5384/6691/3464 5077/7554/3464 5647/7847/3464 +f 4854/7848/3465 5360/6653/3465 5073/7552/3465 4853/7849/3465 +f 4821/7850/3466 5324/6596/3466 5067/7550/3466 4820/7851/3466 +f 4778/7713/3467 5127/7712/3467 5259/7852/3467 4775/7853/3467 +f 4791/7709/3468 5125/7387/3468 5279/7500/3468 4786/7854/3468 +f 4776/7799/3469 5191/7798/3469 5263/7855/3469 4774/7856/3469 +f 4789/7741/3470 5189/7389/3470 5275/7384/3470 4785/7857/3470 +f 4780/7684/3471 5255/7683/3471 5267/7858/3471 4773/7859/3471 +f 4787/7771/3472 5253/7391/3472 5271/7118/3472 4784/7860/3472 +f 4798/7827/3473 5123/7393/3473 5303/6548/3473 4797/7861/3473 +f 4802/7739/3474 5187/7497/3474 5299/6516/3474 4796/7862/3474 +f 4800/7769/3475 5251/7397/3475 5295/7374/3475 4795/7863/3475 +f 4758/7664/3476 5121/7494/3476 5639/7130/3476 4753/7864/3476 +f 4765/7829/3477 5119/7495/3477 5283/7087/3477 4764/7865/3477 +f 4754/7801/3478 5185/7524/3478 5635/7134/3478 4752/7866/3478 +f 4769/7672/3479 5183/7525/3479 5287/7132/3479 4763/7867/3479 +f 4756/7767/3480 5249/7498/3480 5631/7094/3480 4751/7868/3480 +f 4767/7773/3481 5247/7499/3481 5291/7136/3481 4762/7869/3481 +f 4745/7707/3482 5117/7398/3482 5627/6504/3482 4742/7870/3482 +f 4743/7803/3483 5181/7546/3483 5623/7156/3483 4741/7871/3483 +f 4747/7680/3484 5245/7400/3484 5619/7075/3484 4740/7872/3484 +f 4732/7831/3485 5115/7570/3485 5615/6500/3485 4731/7873/3485 +f 4736/7737/3486 5179/7402/3486 5611/7164/3486 4730/7874/3486 +f 4734/7775/3487 5243/7406/3487 5607/7056/3487 4729/7875/3487 +f 4725/7705/3488 5113/7404/3488 5603/6496/3488 4720/7876/3488 +f 4721/7805/3489 5177/7408/3489 5599/7172/3489 4719/7877/3489 +f 4723/7765/3490 5241/7522/3490 5595/7037/3490 4718/7878/3490 +f 4714/7703/3491 5111/7412/3491 5591/6492/3491 4709/7879/3491 +f 4712/7735/3492 5175/7544/3492 5587/7180/3492 4708/7880/3492 +f 4710/7777/3493 5239/7410/3493 5583/7018/3493 4707/7881/3493 +f 4699/7833/3494 5109/7568/3494 5579/6488/3494 4698/7882/3494 +f 4703/7733/3495 5173/7414/3495 5575/7188/3495 4697/7883/3495 +f 4701/7763/3496 5237/7520/3496 5571/6999/3496 4696/7884/3496 +f 4692/7662/3497 5107/7416/3497 5567/6484/3497 4687/7885/3497 +f 4688/7807/3498 5171/7542/3498 5563/7196/3498 4686/7886/3498 +f 4690/7761/3499 5235/7418/3499 5559/6980/3499 4685/7887/3499 +f 4677/7835/3500 5105/7566/3500 5555/6480/3500 4676/7888/3500 +f 4681/7670/3501 5169/7420/3501 5551/7204/3501 4675/7889/3501 +f 4679/7779/3502 5233/7518/3502 5547/6961/3502 4674/7890/3502 +f 4668/7701/3503 5103/7422/3503 5543/6476/3503 4665/7891/3503 +f 4666/7809/3504 5167/7540/3504 5539/7212/3504 4664/7892/3504 +f 4670/7678/3505 5231/7424/3505 5535/6942/3505 4663/7893/3505 +f 4655/7837/3506 5101/7564/3506 5531/6472/3506 4654/7894/3506 +f 4659/7731/3507 5165/7426/3507 5527/7220/3507 4653/7895/3507 +f 4657/7781/3508 5229/7430/3508 5523/6923/3508 4652/7896/3508 +f 4648/7699/3509 5099/7428/3509 5519/6468/3509 4643/7897/3509 +f 4644/7811/3510 5163/7432/3510 5515/7228/3510 4642/7898/3510 +f 4646/7759/3511 5227/7516/3511 5511/6904/3511 4641/7899/3511 +f 4637/7697/3512 5097/7436/3512 5507/6464/3512 4632/7900/3512 +f 4635/7729/3513 5161/7538/3513 5503/7236/3513 4631/7901/3513 +f 4633/7783/3514 5225/7434/3514 5499/6885/3514 4630/7902/3514 +f 4622/7839/3515 5095/7562/3515 5495/6460/3515 4621/7903/3515 +f 4626/7727/3516 5159/7438/3516 5491/7244/3516 4620/7904/3516 +f 4624/7757/3517 5223/7514/3517 5487/6866/3517 4619/7905/3517 +f 4615/7660/3518 5093/7440/3518 5483/6456/3518 4610/7906/3518 +f 4611/7813/3519 5157/7536/3519 5479/7252/3519 4609/7907/3519 +f 4613/7755/3520 5221/7442/3520 5475/6847/3520 4608/7908/3520 +f 4600/7841/3521 5091/7560/3521 5471/6452/3521 4599/7909/3521 +f 4604/7668/3522 5155/7444/3522 5467/7260/3522 4598/7910/3522 +f 4602/7785/3523 5219/7512/3523 5463/6828/3523 4597/7911/3523 +f 4591/7695/3524 5089/7446/3524 5459/6448/3524 4588/7912/3524 +f 4589/7815/3525 5153/7534/3525 5455/7268/3525 4587/7913/3525 +f 4593/7676/3526 5217/7448/3526 5451/6809/3526 4586/7914/3526 +f 4564/7843/3527 5087/7558/3527 5447/6444/3527 4560/7915/3527 +f 4578/7725/3528 5151/7450/3528 5443/7276/3528 4557/7916/3528 +f 4571/7787/3529 5215/7454/3529 5439/6790/3529 4553/7917/3529 +f 4539/7693/3530 5085/7452/3530 5435/6440/3530 4522/7918/3530 +f 4525/7817/3531 5149/7456/3531 5431/7284/3531 4518/7919/3531 +f 4532/7753/3532 5213/7510/3532 5427/6771/3532 4515/7920/3532 +f 4501/7691/3533 5083/7460/3533 5423/6436/3533 4483/7921/3533 +f 4494/7723/3534 5147/7532/3534 5419/7292/3534 4480/7922/3534 +f 4487/7789/3535 5211/7458/3535 5415/6753/3535 4476/7923/3535 +f 4448/7845/3536 5081/7556/3536 5411/6432/3536 4445/7924/3536 +f 4462/7721/3537 5145/7462/3537 5407/7300/3537 4441/7925/3537 +f 4455/7751/3538 5209/7508/3538 5403/6735/3538 4438/7926/3538 +f 4424/7658/3539 5079/7464/3539 5399/6428/3539 4406/7927/3539 +f 4410/7819/3540 5143/7530/3540 5395/7308/3540 4403/7928/3540 +f 4417/7749/3541 5207/7466/3541 5391/6716/3541 4399/7929/3541 +f 5647/7847/3542 5077/7554/3542 5387/6424/3542 5648/7930/3542 +f 5643/7666/3543 5141/7468/3543 5383/7316/3543 5649/7931/3543 +f 5645/7791/3544 5205/7506/3544 5379/6697/3544 5650/7932/3544 +f 4844/7689/3545 5075/7470/3545 5375/6420/3545 4841/7933/3545 +f 4842/7821/3546 5139/7528/3546 5371/7324/3546 4840/7934/3546 +f 4846/7674/3547 5203/7472/3547 5367/6678/3547 4839/7935/3547 +f 4853/7849/3548 5073/7552/3548 5363/6416/3548 4852/7936/3548 +f 4857/7719/3549 5137/7474/3549 5359/7332/3549 4851/7937/3549 +f 4855/7793/3550 5201/7478/3550 5355/6659/3550 4850/7938/3550 +f 4868/7687/3551 5071/7476/3551 5351/6412/3551 4863/7939/3551 +f 4864/7823/3552 5135/7480/3552 5347/7340/3552 4862/7940/3552 +f 4866/7747/3553 5199/7504/3553 5343/6640/3553 4861/7941/3553 +f 4835/7686/3554 5069/7484/3554 5339/6408/3554 4830/7942/3554 +f 4833/7717/3555 5133/7526/3555 5335/7348/3555 4829/7943/3555 +f 4831/7795/3556 5197/7482/3556 5331/6621/3556 4828/7944/3556 +f 4820/7851/3557 5067/7550/3557 5327/6404/3557 4819/7945/3557 +f 4824/7715/3558 5131/7486/3558 5323/7356/3558 4818/7946/3558 +f 4822/7745/3559 5195/7502/3559 5319/6602/3559 4817/7947/3559 +f 4813/7656/3560 5065/7488/3560 5315/6400/3560 4808/7948/3560 +f 4809/7825/3561 5129/7378/3561 5311/7364/3561 4807/7949/3561 +f 4811/7743/3562 5193/7492/3562 5307/6583/3562 4806/7950/3562 +f 4772/7951/3563 5059/6524/3563 5282/6527/3563 4764/7865/3563 +f 4779/7710/3564 5257/6526/3564 4872/6525/3564 4783/7952/3564 +f 4775/7853/3565 5259/7953/3565 5260/7954/3565 4777/7955/3565 +f 4785/7857/3566 5275/7384/3566 5276/7383/3566 4792/7708/3566 +f 4786/7854/3567 5279/7500/3567 4878/7106/3567 4794/7956/3567 +f 4766/7828/3568 5281/7368/3568 5286/7371/3568 4763/7867/3568 +f 4770/7671/3569 5285/7376/3569 5290/7145/3569 4762/7869/3569 +f 4781/7681/3570 5265/7146/3570 5262/7377/3570 4774/7957/3570 +f 4784/7860/3571 5271/7118/3571 5272/7117/3571 4790/7740/3571 +f 4773/7859/3572 5267/7858/3572 4875/7958/3572 4782/7959/3572 +f 4793/7579/3573 4882/7122/3573 5268/7121/3573 4788/7770/3573 +f 4768/7772/3574 5289/7112/3574 5061/6538/3574 4771/7654/3574 +f 4804/7581/3575 4888/6555/3575 5292/6554/3575 4801/7768/3575 +f 4795/7863/3576 5295/7374/3576 5296/7373/3576 4803/7738/3576 +f 4796/7862/3577 5299/6516/3577 5300/6515/3577 4799/7826/3577 +f 4797/7861/3578 5303/6548/3578 4884/6522/3578 4805/7580/3578 +f 4761/7649/3579 5053/7085/3579 5636/7088/3579 4759/7663/3579 +f 4753/7864/3580 5639/7130/3580 5632/7133/3580 4755/7800/3580 +f 4752/7866/3581 5635/7134/3581 5628/7137/3581 4757/7766/3581 +f 4751/7868/3582 5631/7094/3582 5055/7097/3582 4760/7650/3582 +f 4815/7584/3583 4894/6570/3583 5306/6569/3583 4806/7950/3583 +f 4812/7742/3584 5305/7140/3584 5310/7139/3584 4807/7949/3584 +f 4810/7824/3585 5309/6398/3585 5314/6397/3585 4808/7948/3585 +f 4814/7655/3586 5313/6563/3586 4890/6394/3586 4816/7960/3586 +f 4826/7586/3587 4900/6585/3587 5318/6584/3587 4817/7947/3587 +f 4823/7744/3588 5317/7366/3588 5322/7365/3588 4818/7946/3588 +f 4825/7714/3589 5321/6402/3589 5326/6401/3589 4819/7945/3589 +f 4821/7850/3590 5325/6578/3590 4896/6512/3590 4827/7585/3590 +f 4837/7589/3591 4906/6604/3591 5330/6603/3591 4828/7944/3591 +f 4832/7794/3592 5329/7358/3592 5334/7357/3592 4829/7943/3592 +f 4834/7716/3593 5333/6406/3593 5338/6405/3593 4830/7942/3593 +f 4836/7685/3594 5337/6595/3594 4902/6594/3594 4838/7961/3594 +f 4870/7590/3595 4912/6623/3595 5342/6622/3595 4861/7941/3595 +f 4867/7746/3596 5341/7350/3596 5346/7349/3596 4862/7940/3596 +f 4865/7822/3597 5345/6410/3597 5350/6409/3597 4863/7939/3597 +f 4869/7150/3598 5349/6614/3598 4908/6613/3598 4871/7151/3598 +f 4859/7593/3599 4918/6642/3599 5354/6641/3599 4850/7938/3599 +f 4856/7792/3600 5353/7342/3600 5358/7341/3600 4851/7937/3600 +f 4858/7718/3601 5357/6414/3601 5362/6413/3601 4852/7936/3601 +f 4854/7848/3602 5361/6633/3602 4914/6632/3602 4860/7962/3602 +f 4848/7595/3603 4924/6661/3603 5366/6660/3603 4839/7935/3603 +f 4847/7673/3604 5365/7334/3604 5370/7333/3604 4840/7934/3604 +f 4843/7820/3605 5369/6418/3605 5374/6417/3605 4841/7933/3605 +f 4845/7688/3606 5373/6652/3606 4920/6651/3606 4849/7594/3606 +f 5641/7598/3607 4930/6680/3607 5378/6679/3607 5650/7932/3607 +f 5644/7790/3608 5377/7326/3608 5382/7325/3608 5649/7931/3608 +f 5642/7665/3609 5381/6422/3609 5386/6421/3609 5648/7930/3609 +f 5646/7846/3610 5385/6671/3610 4926/6670/3610 5640/7963/3610 +f 4431/7600/3611 4936/6699/3611 5390/6698/3611 4399/7929/3611 +f 4420/7748/3612 5389/7318/3612 5394/7317/3612 4403/7928/3612 +f 4413/7818/3613 5393/6426/3613 5398/6425/3613 4406/7927/3613 +f 4427/7657/3614 5397/6690/3614 4932/6689/3614 4434/7599/3614 +f 4469/7603/3615 4942/6718/3615 5402/6717/3615 4438/7926/3615 +f 4459/7750/3616 5401/7310/3616 5406/7309/3616 4441/7925/3616 +f 4466/7720/3617 5405/6430/3617 5410/6429/3617 4445/7924/3617 +f 4452/7844/3618 5409/6709/3618 4938/6708/3618 4473/7964/3618 +f 4508/7605/3619 4948/6737/3619 5414/6736/3619 4476/7923/3619 +f 4490/7788/3620 5413/7302/3620 5418/7301/3620 4480/7922/3620 +f 4497/7722/3621 5417/6434/3621 5422/6433/3621 4483/7921/3621 +f 4504/7690/3622 5421/6728/3622 4944/6727/3622 4511/7604/3622 +f 4546/7608/3623 4954/6755/3623 5426/6754/3623 4515/7920/3623 +f 4536/7752/3624 5425/7294/3624 5430/7293/3624 4518/7919/3624 +f 4529/7816/3625 5429/6438/3625 5434/6437/3625 4522/7918/3625 +f 4543/7692/3626 5433/6746/3626 4950/6745/3626 4550/7965/3626 +f 4584/7610/3627 4960/6773/3627 5438/6772/3627 4553/7917/3627 +f 4574/7786/3628 5437/7286/3628 5442/7285/3628 4557/7916/3628 +f 4581/7724/3629 5441/6442/3629 5446/6441/3629 4560/7915/3629 +f 4567/7842/3630 5445/6764/3630 4956/6763/3630 4585/7609/3630 +f 4595/7613/3631 4966/6792/3631 5450/6791/3631 4586/7914/3631 +f 4594/7675/3632 5449/7278/3632 5454/7277/3632 4587/7913/3632 +f 4590/7814/3633 5453/6446/3633 5458/6445/3633 4588/7912/3633 +f 4592/7694/3634 5457/6783/3634 4962/6782/3634 4596/7966/3634 +f 4606/7615/3635 4972/6811/3635 5462/6810/3635 4597/7911/3635 +f 4603/7784/3636 5461/7270/3636 5466/7269/3636 4598/7910/3636 +f 4605/7667/3637 5465/6450/3637 5470/6449/3637 4599/7909/3637 +f 4601/7840/3638 5469/6802/3638 4968/6801/3638 4607/7614/3638 +f 4617/7618/3639 4978/6830/3639 5474/6829/3639 4608/7908/3639 +f 4614/7754/3640 5473/7262/3640 5478/7261/3640 4609/7907/3640 +f 4612/7812/3641 5477/6454/3641 5482/6453/3641 4610/7906/3641 +f 4616/7659/3642 5481/6821/3642 4974/6820/3642 4618/7967/3642 +f 4628/7620/3643 4984/6849/3643 5486/6848/3643 4619/7905/3643 +f 4625/7756/3644 5485/7254/3644 5490/7253/3644 4620/7904/3644 +f 4627/7726/3645 5489/6458/3645 5494/6457/3645 4621/7903/3645 +f 4623/7838/3646 5493/6840/3646 4980/6839/3646 4629/7619/3646 +f 4639/7623/3647 4990/6868/3647 5498/6867/3647 4630/7902/3647 +f 4634/7782/3648 5497/7246/3648 5502/7245/3648 4631/7901/3648 +f 4636/7728/3649 5501/6462/3649 5506/6461/3649 4632/7900/3649 +f 4638/7696/3650 5505/6859/3650 4986/6858/3650 4640/7968/3650 +f 4650/7625/3651 4996/6887/3651 5510/6886/3651 4641/7899/3651 +f 4647/7758/3652 5509/7238/3652 5514/7237/3652 4642/7898/3652 +f 4645/7810/3653 5513/6466/3653 5518/6465/3653 4643/7897/3653 +f 4649/7698/3654 5517/6878/3654 4992/6877/3654 4651/7624/3654 +f 4661/7628/3655 5002/6906/3655 5522/6905/3655 4652/7896/3655 +f 4658/7780/3656 5521/7230/3656 5526/7229/3656 4653/7895/3656 +f 4660/7730/3657 5525/6470/3657 5530/6469/3657 4654/7894/3657 +f 4656/7836/3658 5529/6897/3658 4998/6896/3658 4662/7969/3658 +f 4672/7630/3659 5008/6925/3659 5534/6924/3659 4663/7893/3659 +f 4671/7677/3660 5533/7222/3660 5538/7221/3660 4664/7892/3660 +f 4667/7808/3661 5537/6474/3661 5542/6473/3661 4665/7891/3661 +f 4669/7700/3662 5541/6916/3662 5004/6915/3662 4673/7629/3662 +f 4683/7633/3663 5014/6944/3663 5546/6943/3663 4674/7890/3663 +f 4680/7778/3664 5545/7214/3664 5550/7213/3664 4675/7889/3664 +f 4682/7669/3665 5549/6478/3665 5554/6477/3665 4676/7888/3665 +f 4678/7834/3666 5553/6935/3666 5010/6934/3666 4684/7970/3666 +f 4694/7635/3667 5020/6963/3667 5558/6962/3667 4685/7887/3667 +f 4691/7760/3668 5557/7206/3668 5562/7205/3668 4686/7886/3668 +f 4689/7806/3669 5561/6482/3669 5566/6481/3669 4687/7885/3669 +f 4693/7661/3670 5565/6954/3670 5016/6953/3670 4695/7634/3670 +f 4705/7638/3671 5026/6982/3671 5570/6981/3671 4696/7884/3671 +f 4702/7762/3672 5569/7198/3672 5574/7197/3672 4697/7883/3672 +f 4704/7732/3673 5573/6486/3673 5578/6485/3673 4698/7882/3673 +f 4700/7832/3674 5577/6973/3674 5022/6972/3674 4706/7971/3674 +f 4716/7640/3675 5032/7001/3675 5582/7000/3675 4707/7881/3675 +f 4711/7776/3676 5581/7190/3676 5586/7189/3676 4708/7880/3676 +f 4713/7734/3677 5585/6490/3677 5590/6489/3677 4709/7879/3677 +f 4715/7702/3678 5589/6992/3678 5028/6991/3678 4717/7639/3678 +f 4727/7643/3679 5038/7020/3679 5594/7019/3679 4718/7878/3679 +f 4724/7764/3680 5593/7182/3680 5598/7181/3680 4719/7877/3680 +f 4722/7804/3681 5597/6494/3681 5602/6493/3681 4720/7876/3681 +f 4726/7704/3682 5601/7011/3682 5034/7010/3682 4728/7972/3682 +f 4738/7645/3683 5044/7039/3683 5606/7038/3683 4729/7875/3683 +f 4735/7774/3684 5605/7174/3684 5610/7173/3684 4730/7874/3684 +f 4737/7736/3685 5609/6498/3685 5614/6497/3685 4731/7873/3685 +f 4733/7830/3686 5613/7030/3686 5040/7029/3686 4739/7644/3686 +f 4749/7648/3687 5050/7058/3687 5618/7057/3687 4740/7872/3687 +f 4748/7679/3688 5617/7166/3688 5622/7165/3688 4741/7871/3688 +f 4744/7802/3689 5621/6502/3689 5626/6501/3689 4742/7870/3689 +f 4746/7706/3690 5625/7049/3690 5046/7048/3690 4750/7973/3690 +f 5060/7651/3691 4580/7108/3691 4373/7111/3691 4874/7572/3691 4872/6525/3691 5059/6524/3691 +f 5344/6415/3692 4865/7822/3692 4863/7939/3692 5351/6412/3692 +f 5340/7343/3693 4867/7746/3693 4862/7940/3693 5347/7340/3693 +f 4911/6643/3694 4870/7590/3694 4861/7941/3694 5343/6640/3694 +f 5198/7483/3695 4866/7747/3695 4861/7941/3695 5342/6622/3695 +f 5134/7527/3696 4864/7823/3696 4862/7940/3696 5346/7349/3696 +f 5070/7485/3697 4868/7687/3697 4863/7939/3697 5350/6409/3697 +f 5345/6410/3698 4865/7822/3698 4864/7823/3698 5134/7527/3698 +f 5341/7350/3699 4867/7746/3699 4866/7747/3699 5198/7483/3699 +f 5349/6614/3700 4869/7150/3700 4868/7687/3700 5070/7485/3700 +f 5360/6653/3701 4854/7848/3701 4860/7962/3701 4915/6650/3701 +f 5356/6419/3702 4858/7718/3702 4852/7936/3702 5363/6416/3702 +f 5352/7335/3703 4856/7792/3703 4851/7937/3703 5359/7332/3703 +f 4917/6662/3704 4859/7593/3704 4850/7938/3704 5355/6659/3704 +f 5200/7505/3705 4855/7793/3705 4850/7938/3705 5354/6641/3705 +f 5136/7481/3706 4857/7719/3706 4851/7937/3706 5358/7341/3706 +f 5072/7477/3707 4853/7849/3707 4852/7936/3707 5362/6413/3707 +f 5361/6633/3708 4854/7848/3708 4853/7849/3708 5072/7477/3708 +f 5353/7342/3709 4856/7792/3709 4855/7793/3709 5200/7505/3709 +f 5357/6414/3710 4858/7718/3710 4857/7719/3710 5136/7481/3710 +f 5372/6672/3711 4845/7688/3711 4849/7594/3711 4921/6669/3711 +f 5368/6423/3712 4843/7820/3712 4841/7933/3712 5375/6420/3712 +f 5364/7327/3713 4847/7673/3713 4840/7934/3713 5371/7324/3713 +f 4923/6681/3714 4848/7595/3714 4839/7935/3714 5367/6678/3714 +f 5202/7479/3715 4846/7674/3715 4839/7935/3715 5366/6660/3715 +f 5138/7475/3716 4842/7821/3716 4840/7934/3716 5370/7333/3716 +f 5074/7553/3717 4844/7689/3717 4841/7933/3717 5374/6417/3717 +f 5369/6418/3718 4843/7820/3718 4842/7821/3718 5138/7475/3718 +f 5373/6652/3719 4845/7688/3719 4844/7689/3719 5074/7553/3719 +f 5365/7334/3720 4847/7673/3720 4846/7674/3720 5202/7479/3720 +f 5336/6615/3721 4836/7685/3721 4838/7961/3721 4903/6612/3721 +f 5332/6411/3722 4834/7716/3722 4830/7942/3722 5339/6408/3722 +f 5328/7351/3723 4832/7794/3723 4829/7943/3723 5335/7348/3723 +f 4905/6624/3724 4837/7589/3724 4828/7944/3724 5331/6621/3724 +f 5196/7503/3725 4831/7795/3725 4828/7944/3725 5330/6603/3725 +f 5132/7487/3726 4833/7717/3726 4829/7943/3726 5334/7357/3726 +f 5068/7551/3727 4835/7686/3727 4830/7942/3727 5338/6405/3727 +f 5329/7358/3728 4832/7794/3728 4831/7795/3728 5196/7503/3728 +f 5333/6406/3729 4834/7716/3729 4833/7717/3729 5132/7487/3729 +f 5337/6595/3730 4836/7685/3730 4835/7686/3730 5068/7551/3730 +f 5324/6596/3731 4821/7850/3731 4827/7585/3731 4897/6593/3731 +f 5320/6407/3732 4825/7714/3732 4819/7945/3732 5327/6404/3732 +f 5316/7359/3733 4823/7744/3733 4818/7946/3733 5323/7356/3733 +f 4899/6605/3734 4826/7586/3734 4817/7947/3734 5319/6602/3734 +f 5194/7493/3735 4822/7745/3735 4817/7947/3735 5318/6584/3735 +f 5130/7379/3736 4824/7715/3736 4818/7946/3736 5322/7365/3736 +f 5066/7489/3737 4820/7851/3737 4819/7945/3737 5326/6401/3737 +f 5325/6578/3738 4821/7850/3738 4820/7851/3738 5066/7489/3738 +f 5317/7366/3739 4823/7744/3739 4822/7745/3739 5194/7493/3739 +f 5321/6402/3740 4825/7714/3740 4824/7715/3740 5130/7379/3740 +f 5312/6579/3741 4814/7655/3741 4816/7960/3741 4891/6513/3741 +f 5308/6403/3742 4810/7824/3742 4808/7948/3742 5315/6400/3742 +f 5304/7367/3743 4812/7742/3743 4807/7949/3743 5311/7364/3743 +f 4893/6586/3744 4815/7584/3744 4806/7950/3744 5307/6583/3744 +f 5192/7381/3745 4811/7743/3745 4806/7950/3745 5306/6569/3745 +f 5128/7491/3746 4809/7825/3746 4807/7949/3746 5310/7139/3746 +f 5064/7143/3747 4813/7656/3747 4808/7948/3747 5314/6397/3747 +f 5309/6398/3748 4810/7824/3748 4809/7825/3748 5128/7491/3748 +f 5305/7140/3749 4812/7742/3749 4811/7743/3749 5192/7381/3749 +f 5313/6563/3750 4814/7655/3750 4813/7656/3750 5064/7143/3750 +f 5302/6564/3751 4797/7861/3751 4805/7580/3751 4885/6395/3751 +f 5298/6399/3752 4796/7862/3752 4799/7826/3752 5301/6396/3752 +f 5294/7141/3753 4795/7863/3753 4803/7738/3753 5297/7138/3753 +f 4887/6571/3754 4804/7581/3754 4801/7768/3754 5293/6568/3754 +f 5250/7380/3755 4800/7769/3755 4795/7863/3755 5294/7141/3755 +f 5186/7490/3756 4802/7739/3756 4796/7862/3756 5298/6399/3756 +f 5122/7142/3757 4798/7827/3757 4797/7861/3757 5302/6564/3757 +f 5301/6396/3758 4799/7826/3758 4798/7827/3758 5122/7142/3758 +f 5293/6568/3759 4801/7768/3759 4800/7769/3759 5250/7380/3759 +f 5297/7138/3760 4803/7738/3760 4802/7739/3760 5186/7490/3760 +f 4881/6556/3761 4793/7579/3761 4788/7770/3761 5269/6553/3761 +f 5270/7375/3762 4784/7860/3762 4790/7740/3762 5273/7372/3762 +f 5278/6549/3763 4786/7854/3763 4794/7956/3763 4879/6523/3763 +f 5274/6517/3764 4785/7857/3764 4792/7708/3764 5277/6514/3764 +f 5252/7396/3765 4787/7771/3765 4784/7860/3765 5270/7375/3765 +f 5188/7496/3766 4789/7741/3766 4785/7857/3766 5274/6517/3766 +f 5124/7392/3767 4791/7709/3767 4786/7854/3767 5278/6549/3767 +f 5269/6553/3768 4788/7770/3768 4787/7771/3768 5252/7396/3768 +f 5273/7372/3769 4790/7740/3769 4789/7741/3769 5188/7496/3769 +f 5277/6514/3770 4792/7708/3770 4791/7709/3770 5124/7392/3770 +f 5266/7113/3771 4773/7859/3771 4782/7959/3771 4876/6539/3771 +f 5264/7974/3772 4781/7681/3772 4774/7957/3772 5263/7975/3772 +f 5258/7369/3773 4775/7853/3773 4777/7955/3773 5261/7370/3773 +f 5256/7711/3774 4779/7710/3774 4783/7952/3774 4873/7976/3774 +f 5254/7147/3775 4780/7684/3775 4773/7859/3775 5266/7113/3775 +f 5190/7395/3776 4776/7799/3776 4774/7856/3776 5262/7377/3776 +f 5126/7549/3777 4778/7713/3777 4775/7853/3777 5258/7369/3777 +f 5261/7370/3778 4777/7796/3778 4776/7799/3778 5190/7395/3778 +f 5257/6526/3779 4779/7710/3779 4778/7713/3779 5126/7549/3779 +f 5265/7146/3780 4781/7681/3780 4780/7684/3780 5254/7147/3780 +f 5288/7095/3781 4768/7772/3781 4771/7654/3781 5062/7096/3781 +f 5284/7135/3782 4770/7671/3782 4762/7869/3782 5291/7136/3782 +f 5280/7131/3783 4766/7828/3783 4763/7867/3783 5287/7132/3783 +f 5058/7086/3784 4772/7951/3784 4764/7865/3784 5283/7087/3784 +f 5246/7144/3785 4767/7773/3785 4762/7869/3785 5290/7145/3785 +f 5182/7394/3786 4769/7672/3786 4763/7867/3786 5286/7371/3786 +f 5118/7548/3787 4765/7829/3787 4764/7865/3787 5282/6527/3787 +f 5281/7368/3788 4766/7828/3788 4765/7829/3788 5118/7548/3788 +f 5289/7112/3789 4768/7772/3789 4767/7773/3789 5246/7144/3789 +f 5285/7376/3790 4770/7671/3790 4769/7672/3790 5182/7394/3790 +f 5630/7076/3791 4751/7868/3791 4760/7650/3791 5056/7077/3791 +f 5634/7157/3792 4752/7866/3792 4757/7766/3792 5629/7158/3792 +f 5638/6505/3793 4753/7864/3793 4755/7800/3793 5633/6506/3793 +f 5052/7067/3794 4761/7649/3794 4759/7663/3794 5637/7068/3794 +f 5248/7401/3795 4756/7767/3795 4751/7868/3795 5630/7076/3795 +f 5184/7547/3796 4754/7801/3796 4752/7866/3796 5634/7157/3796 +f 5120/7399/3797 4758/7664/3797 4753/7864/3797 5638/6505/3797 +f 5633/6506/3798 4755/7800/3798 4754/7801/3798 5184/7547/3798 +f 5629/7158/3799 4757/7766/3799 4756/7767/3799 5248/7401/3799 +f 5637/7068/3800 4759/7663/3800 4758/7664/3800 5120/7399/3800 +f 5624/7069/3801 4746/7706/3801 4750/7973/3801 5047/7066/3801 +f 5620/6507/3802 4744/7802/3802 4742/7870/3802 5627/6504/3802 +f 5616/7159/3803 4748/7679/3803 4741/7871/3803 5623/7156/3803 +f 5049/7078/3804 4749/7648/3804 4740/7872/3804 5619/7075/3804 +f 5244/7407/3805 4747/7680/3805 4740/7872/3805 5618/7057/3805 +f 5180/7403/3806 4743/7803/3806 4741/7871/3806 5622/7165/3806 +f 5116/7571/3807 4745/7707/3807 4742/7870/3807 5626/6501/3807 +f 5621/6502/3808 4744/7802/3808 4743/7803/3808 5180/7403/3808 +f 5625/7049/3809 4746/7706/3809 4745/7707/3809 5116/7571/3809 +f 5617/7166/3810 4748/7679/3810 4747/7680/3810 5244/7407/3810 +f 5612/7050/3811 4733/7830/3811 4739/7644/3811 5041/7047/3811 +f 5608/6503/3812 4737/7736/3812 4731/7873/3812 5615/6500/3812 +f 5604/7167/3813 4735/7774/3813 4730/7874/3813 5611/7164/3813 +f 5043/7059/3814 4738/7645/3814 4729/7875/3814 5607/7056/3814 +f 5242/7523/3815 4734/7775/3815 4729/7875/3815 5606/7038/3815 +f 5178/7409/3816 4736/7737/3816 4730/7874/3816 5610/7173/3816 +f 5114/7405/3817 4732/7831/3817 4731/7873/3817 5614/6497/3817 +f 5613/7030/3818 4733/7830/3818 4732/7831/3818 5114/7405/3818 +f 5605/7174/3819 4735/7774/3819 4734/7775/3819 5242/7523/3819 +f 5609/6498/3820 4737/7736/3820 4736/7737/3820 5178/7409/3820 +f 5600/7031/3821 4726/7704/3821 4728/7972/3821 5035/7028/3821 +f 5596/6499/3822 4722/7804/3822 4720/7876/3822 5603/6496/3822 +f 5592/7175/3823 4724/7764/3823 4719/7877/3823 5599/7172/3823 +f 5037/7040/3824 4727/7643/3824 4718/7878/3824 5595/7037/3824 +f 5240/7411/3825 4723/7765/3825 4718/7878/3825 5594/7019/3825 +f 5176/7545/3826 4721/7805/3826 4719/7877/3826 5598/7181/3826 +f 5112/7413/3827 4725/7705/3827 4720/7876/3827 5602/6493/3827 +f 5597/6494/3828 4722/7804/3828 4721/7805/3828 5176/7545/3828 +f 5593/7182/3829 4724/7764/3829 4723/7765/3829 5240/7411/3829 +f 5601/7011/3830 4726/7704/3830 4725/7705/3830 5112/7413/3830 +f 5588/7012/3831 4715/7702/3831 4717/7639/3831 5029/7009/3831 +f 5584/6495/3832 4713/7734/3832 4709/7879/3832 5591/6492/3832 +f 5580/7183/3833 4711/7776/3833 4708/7880/3833 5587/7180/3833 +f 5031/7021/3834 4716/7640/3834 4707/7881/3834 5583/7018/3834 +f 5238/7521/3835 4710/7777/3835 4707/7881/3835 5582/7000/3835 +f 5174/7415/3836 4712/7735/3836 4708/7880/3836 5586/7189/3836 +f 5110/7569/3837 4714/7703/3837 4709/7879/3837 5590/6489/3837 +f 5581/7190/3838 4711/7776/3838 4710/7777/3838 5238/7521/3838 +f 5585/6490/3839 4713/7734/3839 4712/7735/3839 5174/7415/3839 +f 5589/6992/3840 4715/7702/3840 4714/7703/3840 5110/7569/3840 +f 5576/6993/3841 4700/7832/3841 4706/7971/3841 5023/6990/3841 +f 5572/6491/3842 4704/7732/3842 4698/7882/3842 5579/6488/3842 +f 5568/7191/3843 4702/7762/3843 4697/7883/3843 5575/7188/3843 +f 5025/7002/3844 4705/7638/3844 4696/7884/3844 5571/6999/3844 +f 5236/7419/3845 4701/7763/3845 4696/7884/3845 5570/6981/3845 +f 5172/7543/3846 4703/7733/3846 4697/7883/3846 5574/7197/3846 +f 5108/7417/3847 4699/7833/3847 4698/7882/3847 5578/6485/3847 +f 5577/6973/3848 4700/7832/3848 4699/7833/3848 5108/7417/3848 +f 5569/7198/3849 4702/7762/3849 4701/7763/3849 5236/7419/3849 +f 5573/6486/3850 4704/7732/3850 4703/7733/3850 5172/7543/3850 +f 5564/6974/3851 4693/7661/3851 4695/7634/3851 5017/6971/3851 +f 5560/6487/3852 4689/7806/3852 4687/7885/3852 5567/6484/3852 +f 5556/7199/3853 4691/7760/3853 4686/7886/3853 5563/7196/3853 +f 5019/6983/3854 4694/7635/3854 4685/7887/3854 5559/6980/3854 +f 5234/7519/3855 4690/7761/3855 4685/7887/3855 5558/6962/3855 +f 5170/7421/3856 4688/7807/3856 4686/7886/3856 5562/7205/3856 +f 5106/7567/3857 4692/7662/3857 4687/7885/3857 5566/6481/3857 +f 5561/6482/3858 4689/7806/3858 4688/7807/3858 5170/7421/3858 +f 5557/7206/3859 4691/7760/3859 4690/7761/3859 5234/7519/3859 +f 5565/6954/3860 4693/7661/3860 4692/7662/3860 5106/7567/3860 +f 5552/6955/3861 4678/7834/3861 4684/7970/3861 5011/6952/3861 +f 5548/6483/3862 4682/7669/3862 4676/7888/3862 5555/6480/3862 +f 5544/7207/3863 4680/7778/3863 4675/7889/3863 5551/7204/3863 +f 5013/6964/3864 4683/7633/3864 4674/7890/3864 5547/6961/3864 +f 5232/7425/3865 4679/7779/3865 4674/7890/3865 5546/6943/3865 +f 5168/7541/3866 4681/7670/3866 4675/7889/3866 5550/7213/3866 +f 5104/7423/3867 4677/7835/3867 4676/7888/3867 5554/6477/3867 +f 5553/6935/3868 4678/7834/3868 4677/7835/3868 5104/7423/3868 +f 5545/7214/3869 4680/7778/3869 4679/7779/3869 5232/7425/3869 +f 5549/6478/3870 4682/7669/3870 4681/7670/3870 5168/7541/3870 +f 5540/6936/3871 4669/7700/3871 4673/7629/3871 5005/6933/3871 +f 5536/6479/3872 4667/7808/3872 4665/7891/3872 5543/6476/3872 +f 5532/7215/3873 4671/7677/3873 4664/7892/3873 5539/7212/3873 +f 5007/6945/3874 4672/7630/3874 4663/7893/3874 5535/6942/3874 +f 5230/7431/3875 4670/7678/3875 4663/7893/3875 5534/6924/3875 +f 5166/7427/3876 4666/7809/3876 4664/7892/3876 5538/7221/3876 +f 5102/7565/3877 4668/7701/3877 4665/7891/3877 5542/6473/3877 +f 5537/6474/3878 4667/7808/3878 4666/7809/3878 5166/7427/3878 +f 5541/6916/3879 4669/7700/3879 4668/7701/3879 5102/7565/3879 +f 5533/7222/3880 4671/7677/3880 4670/7678/3880 5230/7431/3880 +f 5528/6917/3881 4656/7836/3881 4662/7969/3881 4999/6914/3881 +f 5524/6475/3882 4660/7730/3882 4654/7894/3882 5531/6472/3882 +f 5520/7223/3883 4658/7780/3883 4653/7895/3883 5527/7220/3883 +f 5001/6926/3884 4661/7628/3884 4652/7896/3884 5523/6923/3884 +f 5228/7517/3885 4657/7781/3885 4652/7896/3885 5522/6905/3885 +f 5164/7433/3886 4659/7731/3886 4653/7895/3886 5526/7229/3886 +f 5100/7429/3887 4655/7837/3887 4654/7894/3887 5530/6469/3887 +f 5529/6897/3888 4656/7836/3888 4655/7837/3888 5100/7429/3888 +f 5521/7230/3889 4658/7780/3889 4657/7781/3889 5228/7517/3889 +f 5525/6470/3890 4660/7730/3890 4659/7731/3890 5164/7433/3890 +f 5516/6898/3891 4649/7698/3891 4651/7624/3891 4993/6895/3891 +f 5512/6471/3892 4645/7810/3892 4643/7897/3892 5519/6468/3892 +f 5508/7231/3893 4647/7758/3893 4642/7898/3893 5515/7228/3893 +f 4995/6907/3894 4650/7625/3894 4641/7899/3894 5511/6904/3894 +f 5226/7435/3895 4646/7759/3895 4641/7899/3895 5510/6886/3895 +f 5162/7539/3896 4644/7811/3896 4642/7898/3896 5514/7237/3896 +f 5098/7437/3897 4648/7699/3897 4643/7897/3897 5518/6465/3897 +f 5513/6466/3898 4645/7810/3898 4644/7811/3898 5162/7539/3898 +f 5509/7238/3899 4647/7758/3899 4646/7759/3899 5226/7435/3899 +f 5517/6878/3900 4649/7698/3900 4648/7699/3900 5098/7437/3900 +f 5504/6879/3901 4638/7696/3901 4640/7968/3901 4987/6876/3901 +f 5500/6467/3902 4636/7728/3902 4632/7900/3902 5507/6464/3902 +f 5496/7239/3903 4634/7782/3903 4631/7901/3903 5503/7236/3903 +f 4989/6888/3904 4639/7623/3904 4630/7902/3904 5499/6885/3904 +f 5224/7515/3905 4633/7783/3905 4630/7902/3905 5498/6867/3905 +f 5160/7439/3906 4635/7729/3906 4631/7901/3906 5502/7245/3906 +f 5096/7563/3907 4637/7697/3907 4632/7900/3907 5506/6461/3907 +f 5497/7246/3908 4634/7782/3908 4633/7783/3908 5224/7515/3908 +f 5501/6462/3909 4636/7728/3909 4635/7729/3909 5160/7439/3909 +f 5505/6859/3910 4638/7696/3910 4637/7697/3910 5096/7563/3910 +f 5492/6860/3911 4623/7838/3911 4629/7619/3911 4981/6857/3911 +f 5488/6463/3912 4627/7726/3912 4621/7903/3912 5495/6460/3912 +f 5484/7247/3913 4625/7756/3913 4620/7904/3913 5491/7244/3913 +f 4983/6869/3914 4628/7620/3914 4619/7905/3914 5487/6866/3914 +f 5222/7443/3915 4624/7757/3915 4619/7905/3915 5486/6848/3915 +f 5158/7537/3916 4626/7727/3916 4620/7904/3916 5490/7253/3916 +f 5094/7441/3917 4622/7839/3917 4621/7903/3917 5494/6457/3917 +f 5493/6840/3918 4623/7838/3918 4622/7839/3918 5094/7441/3918 +f 5485/7254/3919 4625/7756/3919 4624/7757/3919 5222/7443/3919 +f 5489/6458/3920 4627/7726/3920 4626/7727/3920 5158/7537/3920 +f 5480/6841/3921 4616/7659/3921 4618/7967/3921 4975/6838/3921 +f 5476/6459/3922 4612/7812/3922 4610/7906/3922 5483/6456/3922 +f 5472/7255/3923 4614/7754/3923 4609/7907/3923 5479/7252/3923 +f 4977/6850/3924 4617/7618/3924 4608/7908/3924 5475/6847/3924 +f 5220/7513/3925 4613/7755/3925 4608/7908/3925 5474/6829/3925 +f 5156/7445/3926 4611/7813/3926 4609/7907/3926 5478/7261/3926 +f 5092/7561/3927 4615/7660/3927 4610/7906/3927 5482/6453/3927 +f 5477/6454/3928 4612/7812/3928 4611/7813/3928 5156/7445/3928 +f 5473/7262/3929 4614/7754/3929 4613/7755/3929 5220/7513/3929 +f 5481/6821/3930 4616/7659/3930 4615/7660/3930 5092/7561/3930 +f 5468/6822/3931 4601/7840/3931 4607/7614/3931 4969/6819/3931 +f 5464/6455/3932 4605/7667/3932 4599/7909/3932 5471/6452/3932 +f 5460/7263/3933 4603/7784/3933 4598/7910/3933 5467/7260/3933 +f 4971/6831/3934 4606/7615/3934 4597/7911/3934 5463/6828/3934 +f 5218/7449/3935 4602/7785/3935 4597/7911/3935 5462/6810/3935 +f 5154/7535/3936 4604/7668/3936 4598/7910/3936 5466/7269/3936 +f 5090/7447/3937 4600/7841/3937 4599/7909/3937 5470/6449/3937 +f 5469/6802/3938 4601/7840/3938 4600/7841/3938 5090/7447/3938 +f 5461/7270/3939 4603/7784/3939 4602/7785/3939 5218/7449/3939 +f 5465/6450/3940 4605/7667/3940 4604/7668/3940 5154/7535/3940 +f 5456/6803/3941 4592/7694/3941 4596/7966/3941 4963/6800/3941 +f 5452/6451/3942 4590/7814/3942 4588/7912/3942 5459/6448/3942 +f 5448/7271/3943 4594/7675/3943 4587/7913/3943 5455/7268/3943 +f 4965/6812/3944 4595/7613/3944 4586/7914/3944 5451/6809/3944 +f 5216/7455/3945 4593/7676/3945 4586/7914/3945 5450/6791/3945 +f 5152/7451/3946 4589/7815/3946 4587/7913/3946 5454/7277/3946 +f 5088/7559/3947 4591/7695/3947 4588/7912/3947 5458/6445/3947 +f 5453/6446/3948 4590/7814/3948 4589/7815/3948 5152/7451/3948 +f 5457/6783/3949 4592/7694/3949 4591/7695/3949 5088/7559/3949 +f 5449/7278/3950 4594/7675/3950 4593/7676/3950 5216/7455/3950 +f 5444/6784/3951 4567/7842/3951 4585/7609/3951 4957/6781/3951 +f 5440/6447/3952 4581/7724/3952 4560/7915/3952 5447/6444/3952 +f 5436/7279/3953 4574/7786/3953 4557/7916/3953 5443/7276/3953 +f 4959/6793/3954 4584/7610/3954 4553/7917/3954 5439/6790/3954 +f 5214/7511/3955 4571/7787/3955 4553/7917/3955 5438/6772/3955 +f 5150/7457/3956 4578/7725/3956 4557/7916/3956 5442/7285/3956 +f 5086/7453/3957 4564/7843/3957 4560/7915/3957 5446/6441/3957 +f 5445/6764/3958 4567/7842/3958 4564/7843/3958 5086/7453/3958 +f 5437/7286/3959 4574/7786/3959 4571/7787/3959 5214/7511/3959 +f 5441/6442/3960 4581/7724/3960 4578/7725/3960 5150/7457/3960 +f 5432/6765/3961 4543/7692/3961 4550/7965/3961 4951/6762/3961 +f 5428/6443/3962 4529/7816/3962 4522/7918/3962 5435/6440/3962 +f 5424/7287/3963 4536/7752/3963 4518/7919/3963 5431/7284/3963 +f 4953/6774/3964 4546/7608/3964 4515/7920/3964 5427/6771/3964 +f 5212/7459/3965 4532/7753/3965 4515/7920/3965 5426/6754/3965 +f 5148/7533/3966 4525/7817/3966 4518/7919/3966 5430/7293/3966 +f 5084/7461/3967 4539/7693/3967 4522/7918/3967 5434/6437/3967 +f 5429/6438/3968 4529/7816/3968 4525/7817/3968 5148/7533/3968 +f 5425/7294/3969 4536/7752/3969 4532/7753/3969 5212/7459/3969 +f 5433/6746/3970 4543/7692/3970 4539/7693/3970 5084/7461/3970 +f 5420/6747/3971 4504/7690/3971 4511/7604/3971 4945/6744/3971 +f 5416/6439/3972 4497/7722/3972 4483/7921/3972 5423/6436/3972 +f 5412/7295/3973 4490/7788/3973 4480/7922/3973 5419/7292/3973 +f 4947/6756/3974 4508/7605/3974 4476/7923/3974 5415/6753/3974 +f 5210/7509/3975 4487/7789/3975 4476/7923/3975 5414/6736/3975 +f 5146/7463/3976 4494/7723/3976 4480/7922/3976 5418/7301/3976 +f 5082/7557/3977 4501/7691/3977 4483/7921/3977 5422/6433/3977 +f 5413/7302/3978 4490/7788/3978 4487/7789/3978 5210/7509/3978 +f 5417/6434/3979 4497/7722/3979 4494/7723/3979 5146/7463/3979 +f 5421/6728/3980 4504/7690/3980 4501/7691/3980 5082/7557/3980 +f 5408/6729/3981 4452/7844/3981 4473/7964/3981 4939/6726/3981 +f 5404/6435/3982 4466/7720/3982 4445/7924/3982 5411/6432/3982 +f 5400/7303/3983 4459/7750/3983 4441/7925/3983 5407/7300/3983 +f 4941/6738/3984 4469/7603/3984 4438/7926/3984 5403/6735/3984 +f 5208/7467/3985 4455/7751/3985 4438/7926/3985 5402/6717/3985 +f 5144/7531/3986 4462/7721/3986 4441/7925/3986 5406/7309/3986 +f 5080/7465/3987 4448/7845/3987 4445/7924/3987 5410/6429/3987 +f 5409/6709/3988 4452/7844/3988 4448/7845/3988 5080/7465/3988 +f 5401/7310/3989 4459/7750/3989 4455/7751/3989 5208/7467/3989 +f 5405/6430/3990 4466/7720/3990 4462/7721/3990 5144/7531/3990 +f 5396/6710/3991 4427/7657/3991 4434/7599/3991 4933/6707/3991 +f 5392/6431/3992 4413/7818/3992 4406/7927/3992 5399/6428/3992 +f 5388/7311/3993 4420/7748/3993 4403/7928/3993 5395/7308/3993 +f 4935/6719/3994 4431/7600/3994 4399/7929/3994 5391/6716/3994 +f 5206/7507/3995 4417/7749/3995 4399/7929/3995 5390/6698/3995 +f 5142/7469/3996 4410/7819/3996 4403/7928/3996 5394/7317/3996 +f 5078/7555/3997 4424/7658/3997 4406/7927/3997 5398/6425/3997 +f 5393/6426/3998 4413/7818/3998 4410/7819/3998 5142/7469/3998 +f 5389/7318/3999 4420/7748/3999 4417/7749/3999 5206/7507/3999 +f 5397/6690/4000 4427/7657/4000 4424/7658/4000 5078/7555/4000 +f 5384/6691/4001 5646/7846/4001 5640/7963/4001 4927/6688/4001 +f 5380/6427/4002 5642/7665/4002 5648/7930/4002 5387/6424/4002 +f 5376/7319/4003 5644/7790/4003 5649/7931/4003 5383/7316/4003 +f 4929/6700/4004 5641/7598/4004 5650/7932/4004 5379/6697/4004 +f 5204/7473/4005 5645/7791/4005 5650/7932/4005 5378/6679/4005 +f 5140/7529/4006 5643/7666/4006 5649/7931/4006 5382/7325/4006 +f 5076/7471/4007 5647/7847/4007 5648/7930/4007 5386/6421/4007 +f 5385/6671/4008 5646/7846/4008 5647/7847/4008 5076/7471/4008 +f 5377/7326/4009 5644/7790/4009 5645/7791/4009 5204/7473/4009 +f 5381/6422/4010 5642/7665/4010 5643/7666/4010 5140/7529/4010 +f 5789/7977/4011 5788/7978/4011 5651/6546/4011 5652/6545/4011 5683/7979/4011 +f 5790/7980/4012 5764/7981/4012 5683/7979/4012 5652/6545/4012 5653/6562/4012 +f 5656/6611/4013 5657/6630/4013 5684/5649/4013 5770/5648/4013 5792/7982/4013 +f 5794/7983/4014 5772/5650/4014 5684/5649/4014 5657/6630/4014 5658/6649/4014 +f 5661/6706/4015 5797/7984/4015 5796/7985/4015 5660/6687/4015 +f 5662/6725/4016 5799/7986/4016 5797/7984/4016 5661/6706/4016 +f 5663/5738/4017 5800/5737/4017 5799/7986/4017 5662/6725/4017 +f 5750/7987/4018 5802/7988/4018 5665/6780/4018 5666/6799/4018 +f 5803/7989/4019 5750/7987/4019 5666/6799/4019 5667/6818/4019 +f 5751/7990/4020 5752/7991/4020 5669/6856/4020 5670/6875/4020 +f 5753/7992/4021 5751/7990/4021 5670/6875/4021 5671/6894/4021 +f 5754/7993/4022 5753/7992/4022 5671/6894/4022 5672/6913/4022 +f 5756/7994/4023 5755/7995/4023 5674/6951/4023 5675/6970/4023 +f 5757/7996/4024 5756/7994/4024 5675/6970/4024 5676/6989/4024 +f 5758/7997/4025 5759/7998/4025 5678/7027/4025 5679/7046/4025 +f 5680/7065/4026 5685/5651/4026 5760/5653/4026 5758/7997/4026 5679/7046/4026 +f 5761/7999/4027 5762/5654/4027 5685/5651/4027 5680/7065/4027 5681/7084/4027 +f 5764/7981/2805 5766/8000/2805 5683/7979/2805 +f 5787/8001/4028 5761/7999/4028 5681/7084/4028 5682/7103/4028 5786/8002/4028 5784/8003/4028 5785/8004/4028 5692/8005/4028 +f 5788/7978/4029 5793/8006/4029 5693/8007/4029 5791/8008/4029 5786/8002/4029 5682/7103/4029 5651/6546/4029 +f 5766/8000/2805 5789/7977/2805 5683/7979/2805 +f 5826/8009/4030 5757/7996/4030 5676/6989/4030 5677/7008/4030 5824/8010/4030 5825/8011/4030 5700/8012/4030 +f 5830/8013/4031 5831/8014/4031 5824/8010/4031 5677/7008/4031 5678/7027/4031 5759/7998/4031 5827/8015/4031 5701/8016/4031 +f 5859/8017/4032 5754/7993/4032 5672/6913/4032 5673/6932/4032 5857/8018/4032 5856/8019/4032 5858/8020/4032 5708/8021/4032 +f 5857/8018/4033 5673/6932/4033 5674/6951/4033 5755/7995/4033 5862/8022/4033 5709/8023/4033 5864/8024/4033 +f 5888/8025/4034 5803/7989/4034 5667/6818/4034 5668/6837/4034 5886/8026/4034 5885/8027/4034 5716/8028/4034 +f 5890/8029/4035 5889/8030/4035 5886/8026/4035 5668/6837/4035 5669/6856/4035 5752/7991/4035 5891/8031/4035 5717/8032/4035 +f 5665/6780/4036 5802/7988/4036 5818/8033/4036 5725/8034/4036 5815/8035/4036 5809/5740/4036 5664/5739/4036 +f 5843/8036/4037 5794/7983/4037 5658/6649/4037 5659/6668/4037 5842/8037/4037 5841/8038/4037 5732/8039/4037 +f 5848/8040/4038 5847/8041/4038 5842/8037/4038 5659/6668/4038 5660/6687/4038 5796/7985/4038 5845/8042/4038 5733/8043/4038 +f 5741/8044/4039 5867/8045/4039 5790/7980/4039 5653/6562/4039 5654/6577/4039 5740/8046/4039 +f 5874/8047/4040 5875/8048/4040 5873/8049/4040 5740/8046/4040 5654/6577/4040 5655/6592/4040 5869/8050/4040 5870/8051/4040 5742/8052/4040 +f 5792/7982/4041 5869/8050/4041 5655/6592/4041 5656/6611/4041 +f 5764/8053/2828 5790/8054/2828 5867/8055/2828 5898/8056/2828 5816/8057/2828 5793/8058/2828 5788/8059/2828 5789/8060/2828 5766/8061/2828 +o WBL_b1.004_Cylinder.035 +v 4.018566 0.080860 1.077260 +v 3.982702 0.080851 1.080433 +v 3.956448 0.080843 1.089103 +v 3.982702 0.080850 1.381049 +v 3.956448 0.080843 1.372379 +v 4.026095 0.004621 1.077260 +v 3.990923 -0.002385 1.080433 +v 3.965175 -0.007514 1.089103 +v 3.990923 -0.002385 1.381049 +v 3.965175 -0.007514 1.372379 +v 4.048355 -0.068684 1.077260 +v 4.015225 -0.082418 1.080433 +v 3.990973 -0.092471 1.089103 +v 4.015225 -0.082418 1.381049 +v 3.990973 -0.092471 1.372379 +v 4.084486 -0.136239 1.077260 +v 4.054673 -0.156172 1.080433 +v 4.032848 -0.170763 1.089103 +v 4.054673 -0.156172 1.381048 +v 4.032848 -0.170763 1.372379 +v 4.133104 -0.195447 1.077260 +v 4.107752 -0.220812 1.080433 +v 4.089193 -0.239382 1.089103 +v 4.107752 -0.220812 1.381048 +v 4.089193 -0.239382 1.372379 +v 4.192338 -0.244031 1.077260 +v 4.172421 -0.273856 1.080433 +v 4.157842 -0.295689 1.089103 +v 4.608698 -0.331860 1.303440 +v 4.172421 -0.273856 1.381048 +v 4.157842 -0.295689 1.372379 +v 4.259912 -0.280127 1.077260 +v 4.584917 -0.342520 1.238993 +v 4.246197 -0.313264 1.080433 +v 4.236157 -0.337522 1.089103 +v 4.608697 -0.331861 1.174546 +v 4.246197 -0.313264 1.381048 +v 4.236157 -0.337522 1.372379 +v 4.333230 -0.302345 1.077260 +v 4.583543 -0.339205 1.230741 +v 4.326243 -0.337522 1.080433 +v 4.321128 -0.363272 1.089103 +v 4.584917 -0.342520 1.222489 +v 4.326243 -0.337522 1.381048 +v 4.321128 -0.363272 1.372379 +v 4.409473 -0.309834 1.077260 +v 4.607138 -0.328629 1.294684 +v 4.409483 -0.345697 1.080433 +v 4.409490 -0.371951 1.089103 +v 4.608697 -0.331861 1.286936 +v 4.409483 -0.345697 1.381048 +v 4.409490 -0.371951 1.372379 +v 4.485713 -0.302304 1.077260 +v 4.607138 -0.328629 1.166797 +v 4.492719 -0.337476 1.080433 +v 4.497848 -0.363224 1.089103 +v 4.608698 -0.331860 1.158042 +v 4.492719 -0.337476 1.381048 +v 4.497848 -0.363224 1.372379 +v 4.559018 -0.280045 1.077260 +v 4.584917 -0.342520 1.359635 +v 4.572752 -0.313174 1.080433 +v 4.582805 -0.337427 1.089103 +v 4.584917 -0.342520 1.101847 +v 4.572752 -0.313174 1.381048 +v 4.582805 -0.337427 1.372378 +v 4.626572 -0.243912 1.077260 +v 4.685407 -0.285040 1.303440 +v 4.646505 -0.273726 1.080433 +v 4.661097 -0.295551 1.089103 +v 4.664162 -0.300135 1.238993 +v 4.646505 -0.273726 1.381048 +v 4.661097 -0.295551 1.372378 +v 4.685780 -0.195295 1.077260 +v 4.685406 -0.285040 1.174546 +v 4.711146 -0.220647 1.080433 +v 4.729715 -0.239206 1.089103 +v 4.683246 -0.282175 1.166797 +v 4.711146 -0.220647 1.381048 +v 4.729715 -0.239206 1.372378 +v 4.734365 -0.136061 1.077260 +v 4.685407 -0.285040 1.158042 +v 4.764189 -0.155977 1.080433 +v 4.786023 -0.170557 1.089103 +v 4.683246 -0.282175 1.294684 +v 4.764189 -0.155977 1.381048 +v 4.786023 -0.170557 1.372378 +v 4.770460 -0.068487 1.077260 +v 4.685406 -0.285040 1.286936 +v 4.803597 -0.082202 1.080433 +v 4.827856 -0.092242 1.089103 +v 4.662168 -0.297152 1.230741 +v 4.803597 -0.082202 1.381048 +v 4.827856 -0.092242 1.372378 +v 4.792678 0.004831 1.077260 +v 4.664162 -0.300135 1.222489 +v 4.827855 -0.002156 1.080433 +v 4.853606 -0.007271 1.089103 +v 4.664162 -0.300135 1.359635 +v 4.827855 -0.002156 1.381048 +v 4.853606 -0.007271 1.372379 +v 4.800167 0.081074 1.077260 +v 4.664162 -0.300134 1.101847 +v 4.836030 0.081084 1.080433 +v 4.862284 0.081092 1.089103 +v 4.751507 -0.224154 1.303440 +v 4.836030 0.081084 1.381048 +v 4.862284 0.081092 1.372379 +v 4.792637 0.157314 1.077260 +v 4.733616 -0.243104 1.238993 +v 4.827809 0.164320 1.080433 +v 4.853557 0.169449 1.089103 +v 4.751507 -0.224154 1.174546 +v 4.827809 0.164320 1.381048 +v 4.853557 0.169449 1.372379 +v 4.770378 0.230619 1.077260 +v 4.748828 -0.221766 1.294684 +v 4.803507 0.244353 1.080433 +v 4.827760 0.254406 1.089103 +v 4.751507 -0.224154 1.286936 +v 4.803507 0.244353 1.381048 +v 4.827760 0.254406 1.372379 +v 4.734246 0.298174 1.077260 +v 4.731078 -0.240567 1.230741 +v 4.764060 0.318106 1.080433 +v 4.785885 0.332698 1.089103 +v 4.733616 -0.243104 1.222489 +v 4.764060 0.318106 1.381048 +v 4.785885 0.332698 1.372379 +v 4.685628 0.357381 1.077260 +v 4.748828 -0.221766 1.166797 +v 4.710980 0.382747 1.080433 +v 4.729539 0.401317 1.089103 +v 4.751507 -0.224154 1.158042 +v 4.710980 0.382747 1.381048 +v 4.729539 0.401317 1.372379 +v 4.626394 0.405966 1.077260 +v 4.733615 -0.243103 1.359635 +v 4.646311 0.435790 1.080433 +v 4.660890 0.457624 1.089103 +v 4.733615 -0.243103 1.101847 +v 4.646311 0.435790 1.381049 +v 4.660890 0.457624 1.372379 +v 4.558820 0.442061 1.077260 +v 4.804459 -0.151544 1.303440 +v 4.572535 0.475198 1.080433 +v 4.582575 0.499456 1.089103 +v 4.790608 -0.173619 1.238993 +v 4.572535 0.475198 1.381049 +v 4.582575 0.499456 1.372379 +v 4.485502 0.464280 1.077260 +v 4.804459 -0.151544 1.174546 +v 4.492489 0.499456 1.080433 +v 4.497604 0.525207 1.089103 +v 4.787624 -0.171626 1.230741 +v 4.492489 0.499456 1.381049 +v 4.497604 0.525207 1.372379 +v 4.409259 0.471768 1.077260 +v 4.790608 -0.173619 1.222489 +v 4.409249 0.507631 1.080433 +v 4.409242 0.533885 1.089103 +v 4.801366 -0.149724 1.294684 +v 4.409249 0.507631 1.381049 +v 4.409242 0.533885 1.372379 +v 4.333019 0.464238 1.077260 +v 4.804459 -0.151544 1.286936 +v 4.326013 0.499410 1.080433 +v 4.320884 0.525158 1.089103 +v 4.801366 -0.149723 1.166797 +v 4.326013 0.499410 1.381049 +v 4.320884 0.525158 1.372379 +v 4.259714 0.441979 1.077260 +v 4.804459 -0.151544 1.158042 +v 4.245981 0.475109 1.080433 +v 4.235927 0.499361 1.089103 +v 4.790608 -0.173619 1.359635 +v 4.245981 0.475109 1.381049 +v 4.235927 0.499361 1.372379 +v 4.192160 0.405847 1.077260 +v 4.790608 -0.173619 1.101847 +v 4.172227 0.435660 1.080433 +v 4.157635 0.457485 1.089103 +v 4.842228 -0.069997 1.303440 +v 4.172227 0.435660 1.381049 +v 4.157635 0.457485 1.372379 +v 4.132952 0.357229 1.077260 +v 4.832950 -0.094350 1.238993 +v 4.107586 0.382581 1.080433 +v 4.089017 0.401140 1.089103 +v 4.842228 -0.069997 1.174546 +v 4.107586 0.382581 1.381049 +v 4.089017 0.401140 1.372379 +v 4.084367 0.297995 1.077260 +v 4.838840 -0.068815 1.166797 +v 4.054543 0.317912 1.080433 +v 4.032710 0.332491 1.089103 +v 4.842228 -0.069997 1.158042 +v 4.054543 0.317912 1.381049 +v 4.032710 0.332491 1.372379 +v 4.048272 0.230421 1.077260 +v 4.838840 -0.068815 1.294684 +v 4.015135 0.244136 1.080433 +v 3.990877 0.254176 1.089103 +v 4.842228 -0.069997 1.286936 +v 4.015135 0.244136 1.381049 +v 3.990877 0.254176 1.372379 +v 4.026053 0.157103 1.077260 +v 4.829635 -0.092978 1.230741 +v 3.990878 0.164090 1.080433 +v 3.965127 0.169205 1.089103 +v 4.832950 -0.094350 1.222489 +v 3.990878 0.164090 1.381049 +v 3.965127 0.169205 1.372379 +v 4.832950 -0.094350 1.359635 +v 4.832950 -0.094350 1.101847 +v 4.863363 0.017351 1.303440 +v 4.859014 -0.008344 1.238993 +v 4.863363 0.017351 1.174546 +v 4.855494 -0.007645 1.230741 +v 4.859014 -0.008344 1.222489 +v 4.859809 0.017849 1.166797 +v 4.863363 0.017351 1.158042 +v 4.859809 0.017849 1.294685 +v 4.863363 0.017351 1.286936 +v 4.859014 -0.008344 1.359635 +v 4.859014 -0.008344 1.101847 +v 4.867050 0.107143 1.303440 +v 4.867798 0.081094 1.238993 +v 4.867050 0.107143 1.174546 +v 4.863468 0.106939 1.166797 +v 4.867050 0.107143 1.158042 +v 4.863468 0.106939 1.294685 +v 4.867050 0.107143 1.286936 +v 4.864209 0.081093 1.230741 +v 4.867798 0.081094 1.222489 +v 4.867798 0.081094 1.359635 +v 4.867798 0.081094 1.101847 +v 4.853149 0.195930 1.303440 +v 4.858964 0.170527 1.238993 +v 4.853149 0.195930 1.174546 +v 4.855445 0.169826 1.230741 +v 4.858964 0.170527 1.222489 +v 4.849676 0.195031 1.294685 +v 4.853149 0.195930 1.286936 +v 4.849676 0.195031 1.166797 +v 4.853149 0.195930 1.158042 +v 4.858964 0.170527 1.359635 +v 4.858964 0.170527 1.101847 +v 4.822194 0.280299 1.303440 +v 4.832854 0.256519 1.238993 +v 4.822194 0.280299 1.174546 +v 4.818962 0.278739 1.166797 +v 4.822194 0.280299 1.158042 +v 4.818962 0.278739 1.294685 +v 4.822194 0.280299 1.286936 +v 4.829538 0.255145 1.230741 +v 4.832854 0.256519 1.222489 +v 4.832853 0.256518 1.359635 +v 4.832853 0.256518 1.101847 +v 4.775373 0.357008 1.303440 +v 4.790468 0.335764 1.238993 +v 4.775373 0.357008 1.174546 +v 4.772509 0.354847 1.294685 +v 4.775373 0.357008 1.286936 +v 4.787485 0.333769 1.230741 +v 4.790468 0.335764 1.222489 +v 4.772509 0.354847 1.166797 +v 4.775373 0.357008 1.158042 +v 4.790468 0.335764 1.359635 +v 4.790468 0.335764 1.101847 +v 4.714488 0.423108 1.303440 +v 4.733437 0.405217 1.238993 +v 4.714488 0.423108 1.174546 +v 4.730900 0.402679 1.230741 +v 4.733437 0.405217 1.222489 +v 4.712100 0.420430 1.294685 +v 4.714488 0.423108 1.286936 +v 4.712100 0.420430 1.166797 +v 4.714488 0.423108 1.158042 +v 4.733437 0.405217 1.359635 +v 4.733437 0.405217 1.101847 +v 4.641877 0.476060 1.303440 +v 4.663952 0.462210 1.238993 +v 4.641877 0.476060 1.174546 +v 4.640057 0.472968 1.166797 +v 4.641877 0.476060 1.158042 +v 4.640057 0.472968 1.294685 +v 4.641877 0.476060 1.286936 +v 4.661959 0.459226 1.230741 +v 4.663952 0.462210 1.222489 +v 4.663952 0.462209 1.359635 +v 4.663952 0.462210 1.101847 +v 4.560330 0.513829 1.303440 +v 4.584683 0.504552 1.238993 +v 4.560330 0.513829 1.174546 +v 4.583311 0.501236 1.230741 +v 4.584683 0.504552 1.222489 +v 4.559149 0.510441 1.166797 +v 4.560330 0.513829 1.158042 +v 4.559149 0.510441 1.294685 +v 4.560330 0.513829 1.286936 +v 4.584683 0.504551 1.359635 +v 4.584683 0.504551 1.101847 +v 4.472982 0.534963 1.303440 +v 4.498677 0.530615 1.238993 +v 4.472982 0.534963 1.174546 +v 4.472484 0.531410 1.166797 +v 4.472982 0.534963 1.158042 +v 4.472485 0.531410 1.294685 +v 4.472982 0.534963 1.286936 +v 4.497978 0.527096 1.230741 +v 4.498677 0.530615 1.222489 +v 4.498678 0.530615 1.359635 +v 4.498678 0.530615 1.101847 +v 4.383190 0.538651 1.303440 +v 4.409239 0.539399 1.238993 +v 4.383190 0.538651 1.174546 +v 4.409240 0.535810 1.230741 +v 4.409239 0.539399 1.222489 +v 4.383394 0.535069 1.294685 +v 4.383190 0.538651 1.286936 +v 4.383394 0.535069 1.166797 +v 4.383190 0.538651 1.158042 +v 4.409240 0.539399 1.359635 +v 4.409239 0.539399 1.101847 +v 4.294403 0.524750 1.303440 +v 4.319806 0.530565 1.238993 +v 4.294403 0.524750 1.174546 +v 4.295303 0.521276 1.166797 +v 4.294403 0.524750 1.158042 +v 4.295303 0.521276 1.294685 +v 4.294403 0.524750 1.286936 +v 4.320507 0.527047 1.230741 +v 4.319806 0.530565 1.222489 +v 4.319807 0.530565 1.359635 +v 4.319807 0.530566 1.101847 +v 4.210034 0.493794 1.303440 +v 4.233815 0.504454 1.238993 +v 4.210034 0.493794 1.174546 +v 4.211594 0.490563 1.294685 +v 4.210034 0.493794 1.286936 +v 4.235189 0.501139 1.230741 +v 4.233815 0.504454 1.222489 +v 4.211594 0.490563 1.166797 +v 4.210034 0.493795 1.158042 +v 4.233815 0.504454 1.359635 +v 4.233815 0.504454 1.101847 +v 4.133326 0.446974 1.303440 +v 4.154570 0.462069 1.238993 +v 4.133326 0.446974 1.174546 +v 4.156564 0.459086 1.230741 +v 4.154570 0.462069 1.222489 +v 4.135486 0.444110 1.294685 +v 4.133326 0.446974 1.286936 +v 4.135486 0.444110 1.166797 +v 4.133326 0.446974 1.158042 +v 4.154570 0.462068 1.359635 +v 4.154570 0.462069 1.101847 +v 4.067225 0.386089 1.303440 +v 4.085116 0.405038 1.238993 +v 4.067225 0.386089 1.174546 +v 4.069903 0.383701 1.166797 +v 4.067225 0.386089 1.158042 +v 4.069903 0.383701 1.294685 +v 4.067225 0.386089 1.286936 +v 4.087654 0.402501 1.230741 +v 4.085116 0.405038 1.222489 +v 4.085116 0.405038 1.359635 +v 4.085116 0.405038 1.101847 +v 4.014273 0.313477 1.303440 +v 4.028124 0.335553 1.238993 +v 4.014273 0.313478 1.174546 +v 4.031108 0.333560 1.230741 +v 4.028124 0.335553 1.222489 +v 4.017365 0.311657 1.166797 +v 4.014273 0.313477 1.158042 +v 4.017365 0.311657 1.294685 +v 4.014273 0.313478 1.286936 +v 4.028124 0.335553 1.359635 +v 4.028124 0.335553 1.101847 +v 3.976504 0.231931 1.303440 +v 3.985782 0.256284 1.238993 +v 3.976504 0.231931 1.174546 +v 3.989098 0.254912 1.230741 +v 3.985782 0.256284 1.222489 +v 3.979892 0.230749 1.294685 +v 3.976504 0.231931 1.286936 +v 3.979892 0.230749 1.166797 +v 3.976504 0.231931 1.158042 +v 3.985782 0.256284 1.359635 +v 3.985782 0.256284 1.101847 +v 3.955370 0.144583 1.286936 +v 3.959718 0.170278 1.222489 +v 3.955370 0.144583 1.158042 +v 3.958923 0.144085 1.166797 +v 3.955370 0.144583 1.174546 +v 3.958923 0.144085 1.294685 +v 3.955370 0.144583 1.303440 +v 3.963238 0.169579 1.230741 +v 3.959718 0.170278 1.238993 +v 3.959719 0.170278 1.359635 +v 3.959719 0.170278 1.101847 +v 3.951683 0.054791 1.303440 +v 3.950934 0.080841 1.238993 +v 3.951683 0.054791 1.174546 +v 3.954523 0.080842 1.230741 +v 3.950934 0.080841 1.222489 +v 3.955265 0.054996 1.166797 +v 3.951683 0.054791 1.158042 +v 3.955265 0.054996 1.294685 +v 3.951683 0.054791 1.286936 +v 3.950935 0.080841 1.359635 +v 3.950935 0.080841 1.101847 +v 3.965584 -0.033995 1.286936 +v 3.959768 -0.008592 1.222489 +v 3.965583 -0.033996 1.158042 +v 3.969057 -0.033096 1.294685 +v 3.965583 -0.033996 1.303440 +v 3.963287 -0.007891 1.230741 +v 3.959768 -0.008592 1.238993 +v 3.969057 -0.033096 1.166797 +v 3.965584 -0.033995 1.174546 +v 3.959768 -0.008592 1.359635 +v 3.959768 -0.008592 1.101847 +v 3.996539 -0.118364 1.286936 +v 3.985879 -0.094584 1.222489 +v 3.996539 -0.118364 1.158042 +v 3.999770 -0.116804 1.166797 +v 3.996539 -0.118364 1.174546 +v 3.999770 -0.116804 1.294685 +v 3.996539 -0.118364 1.303440 +v 3.989194 -0.093210 1.230741 +v 3.985879 -0.094584 1.238993 +v 3.985879 -0.094584 1.359635 +v 3.985879 -0.094583 1.101847 +v 4.043359 -0.195073 1.303440 +v 4.028265 -0.173829 1.238993 +v 4.043359 -0.195073 1.174546 +v 4.031248 -0.171835 1.230741 +v 4.028265 -0.173829 1.222489 +v 4.046224 -0.192912 1.294685 +v 4.043359 -0.195073 1.286936 +v 4.046224 -0.192912 1.166797 +v 4.043359 -0.195073 1.158042 +v 4.028265 -0.173829 1.359635 +v 4.028265 -0.173829 1.101847 +v 4.104245 -0.261173 1.303440 +v 4.085296 -0.243282 1.238993 +v 4.104245 -0.261173 1.174546 +v 4.106633 -0.258495 1.166797 +v 4.104245 -0.261173 1.158042 +v 4.106633 -0.258495 1.294685 +v 4.104245 -0.261173 1.286936 +v 4.087832 -0.240744 1.230741 +v 4.085296 -0.243282 1.222489 +v 4.085296 -0.243282 1.359635 +v 4.085296 -0.243282 1.101847 +v 4.176856 -0.314126 1.303440 +v 4.154780 -0.300275 1.238993 +v 4.176856 -0.314126 1.174546 +v 4.178675 -0.311033 1.294685 +v 4.176856 -0.314126 1.286936 +v 4.156773 -0.297291 1.230741 +v 4.154780 -0.300275 1.222489 +v 4.178675 -0.311033 1.166797 +v 4.176856 -0.314126 1.158042 +v 4.154780 -0.300275 1.359635 +v 4.154780 -0.300275 1.101847 +v 4.435543 -0.376716 1.303440 +v 4.409493 -0.377464 1.238993 +v 4.435543 -0.376716 1.174546 +v 4.409492 -0.373877 1.230741 +v 4.409493 -0.377464 1.222489 +v 4.435338 -0.373134 1.166797 +v 4.435543 -0.376716 1.158042 +v 4.435338 -0.373134 1.294685 +v 4.435543 -0.376716 1.286936 +v 4.409492 -0.377464 1.359635 +v 4.409492 -0.377464 1.101847 +v 4.345750 -0.373029 1.303440 +v 4.320055 -0.368681 1.238993 +v 4.345750 -0.373029 1.174546 +v 4.346248 -0.369475 1.166797 +v 4.345750 -0.373029 1.158042 +v 4.346248 -0.369475 1.294685 +v 4.345750 -0.373029 1.286936 +v 4.320754 -0.365161 1.230741 +v 4.320055 -0.368681 1.222489 +v 4.320055 -0.368680 1.359635 +v 4.320055 -0.368680 1.101847 +v 4.258402 -0.351895 1.303440 +v 4.234049 -0.342617 1.238993 +v 4.258402 -0.351895 1.174546 +v 4.235421 -0.339301 1.230741 +v 4.234049 -0.342617 1.222489 +v 4.259583 -0.348507 1.294685 +v 4.258402 -0.351895 1.286936 +v 4.259583 -0.348507 1.166797 +v 4.258402 -0.351895 1.158042 +v 4.234049 -0.342617 1.359635 +v 4.234049 -0.342617 1.101847 +v 3.947730 0.089917 1.100947 +v 3.947735 0.071763 1.100947 +v 3.949196 0.080841 1.098041 +v 3.947735 0.071763 1.360535 +v 3.947731 0.089917 1.360535 +v 3.949196 0.080841 1.363441 +v 3.954854 -0.000315 1.100947 +v 3.958401 -0.018120 1.100947 +v 3.958063 -0.008931 1.098041 +v 3.958401 -0.018120 1.360535 +v 3.954854 -0.000315 1.360535 +v 3.958063 -0.008931 1.363441 +v 3.979445 -0.087424 1.100947 +v 3.986397 -0.104195 1.100947 +v 3.984273 -0.095249 1.098041 +v 3.986397 -0.104195 1.360535 +v 3.979445 -0.087424 1.360535 +v 3.984273 -0.095249 1.363441 +v 4.020557 -0.168062 1.100947 +v 4.030648 -0.183154 1.100946 +v 4.026819 -0.174794 1.098041 +v 4.030648 -0.183154 1.360535 +v 4.020557 -0.168062 1.360535 +v 4.026819 -0.174794 1.363441 +v 4.076612 -0.239130 1.100946 +v 4.089452 -0.251964 1.100946 +v 4.084066 -0.244511 1.098041 +v 4.089452 -0.251964 1.360535 +v 4.076612 -0.239130 1.360535 +v 4.084066 -0.244511 1.363441 +v 4.145453 -0.297897 1.100946 +v 4.160551 -0.307979 1.100946 +v 4.153814 -0.301720 1.098041 +v 4.160551 -0.307979 1.360535 +v 4.145453 -0.297897 1.360535 +v 4.153814 -0.301720 1.363441 +v 4.224437 -0.342104 1.100946 +v 4.241211 -0.349046 1.100946 +v 4.233383 -0.344222 1.098041 +v 4.241211 -0.349046 1.360535 +v 4.224437 -0.342104 1.360535 +v 4.233383 -0.344222 1.363441 +v 4.310527 -0.370052 1.100946 +v 4.328334 -0.373589 1.100946 +v 4.319715 -0.370385 1.098041 +v 4.328334 -0.373589 1.360535 +v 4.310527 -0.370052 1.360535 +v 4.319715 -0.370385 1.363441 +v 4.400416 -0.380669 1.100946 +v 4.418571 -0.380664 1.100946 +v 4.409492 -0.379202 1.098041 +v 4.418571 -0.380664 1.360535 +v 4.400416 -0.380669 1.360535 +v 4.409492 -0.379202 1.363441 +v 4.490649 -0.373545 1.100946 +v 4.508453 -0.369997 1.100946 +v 4.499264 -0.370336 1.098041 +v 4.508453 -0.369997 1.360535 +v 4.490649 -0.373545 1.360535 +v 4.499264 -0.370336 1.363441 +v 4.577758 -0.348954 1.100946 +v 4.594528 -0.342001 1.100946 +v 4.585582 -0.344126 1.098041 +v 4.594528 -0.342002 1.360535 +v 4.577758 -0.348954 1.360535 +v 4.585582 -0.344126 1.363441 +v 4.658396 -0.307842 1.100946 +v 4.673488 -0.297751 1.100946 +v 4.665128 -0.301580 1.098041 +v 4.673488 -0.297751 1.360535 +v 4.658396 -0.307842 1.360535 +v 4.665128 -0.301580 1.363441 +v 4.729464 -0.251787 1.100946 +v 4.742297 -0.238946 1.100946 +v 4.734845 -0.244333 1.098041 +v 4.742297 -0.238947 1.360535 +v 4.729464 -0.251787 1.360535 +v 4.734845 -0.244333 1.363441 +v 4.788230 -0.182946 1.100946 +v 4.798312 -0.167848 1.100946 +v 4.792053 -0.174584 1.098041 +v 4.798312 -0.167848 1.360535 +v 4.788230 -0.182946 1.360535 +v 4.792053 -0.174584 1.363441 +v 4.832437 -0.103962 1.100946 +v 4.839380 -0.087187 1.100946 +v 4.834556 -0.095015 1.098041 +v 4.839380 -0.087187 1.360535 +v 4.832437 -0.103962 1.360535 +v 4.834556 -0.095015 1.363441 +v 4.860385 -0.017872 1.100946 +v 4.863923 -0.000065 1.100946 +v 4.860719 -0.008684 1.098041 +v 4.863923 -0.000065 1.360535 +v 4.860385 -0.017872 1.360535 +v 4.860719 -0.008684 1.363441 +v 4.871002 0.072017 1.100946 +v 4.870997 0.090172 1.100946 +v 4.869536 0.081093 1.098041 +v 4.870997 0.090172 1.360535 +v 4.871002 0.072017 1.360535 +v 4.869536 0.081093 1.363441 +v 4.863878 0.162250 1.100946 +v 4.860331 0.180055 1.100946 +v 4.860669 0.170865 1.098041 +v 4.860331 0.180055 1.360535 +v 4.863878 0.162250 1.360535 +v 4.860669 0.170865 1.363441 +v 4.839287 0.249359 1.100946 +v 4.832335 0.266130 1.100946 +v 4.834459 0.257183 1.098041 +v 4.832335 0.266130 1.360535 +v 4.839287 0.249359 1.360535 +v 4.834459 0.257183 1.363441 +v 4.798175 0.329997 1.100946 +v 4.788085 0.345089 1.100946 +v 4.791913 0.336729 1.098041 +v 4.788085 0.345089 1.360535 +v 4.798175 0.329997 1.360535 +v 4.791913 0.336729 1.363441 +v 4.742121 0.401065 1.100946 +v 4.729280 0.413898 1.100946 +v 4.734666 0.406446 1.098041 +v 4.729280 0.413898 1.360535 +v 4.742121 0.401065 1.360535 +v 4.734666 0.406446 1.363441 +v 4.673279 0.459831 1.100947 +v 4.658181 0.469913 1.100947 +v 4.664918 0.463655 1.098041 +v 4.658181 0.469913 1.360535 +v 4.673279 0.459831 1.360535 +v 4.664918 0.463655 1.363441 +v 4.594295 0.504038 1.100947 +v 4.577521 0.510981 1.100947 +v 4.585349 0.506157 1.098041 +v 4.577521 0.510981 1.360535 +v 4.594295 0.504038 1.360535 +v 4.585349 0.506157 1.363441 +v 4.508205 0.531987 1.100947 +v 4.490398 0.535524 1.100947 +v 4.499017 0.532320 1.098041 +v 4.490398 0.535524 1.360535 +v 4.508205 0.531987 1.360535 +v 4.499017 0.532320 1.363441 +v 4.418316 0.542603 1.100947 +v 4.400161 0.542598 1.100947 +v 4.409240 0.541137 1.098041 +v 4.400161 0.542598 1.360535 +v 4.418316 0.542603 1.360535 +v 4.409240 0.541137 1.363441 +v 4.328084 0.535479 1.100947 +v 4.310278 0.531932 1.100947 +v 4.319468 0.532270 1.098041 +v 4.310279 0.531932 1.360535 +v 4.328084 0.535479 1.360535 +v 4.319468 0.532270 1.363441 +v 4.240974 0.510888 1.100947 +v 4.224204 0.503936 1.100947 +v 4.233150 0.506061 1.098041 +v 4.224204 0.503936 1.360535 +v 4.240974 0.510888 1.360535 +v 4.233150 0.506060 1.363441 +v 4.160336 0.469776 1.100947 +v 4.145244 0.459685 1.100947 +v 4.153605 0.463514 1.098041 +v 4.145244 0.459685 1.360535 +v 4.160336 0.469776 1.360535 +v 4.153605 0.463514 1.363441 +v 4.089269 0.413722 1.100947 +v 4.076435 0.400881 1.100947 +v 4.083888 0.406267 1.098041 +v 4.076435 0.400881 1.360535 +v 4.089269 0.413721 1.360535 +v 4.083888 0.406267 1.363441 +v 4.030502 0.344880 1.100947 +v 4.020420 0.329782 1.100947 +v 4.026679 0.336519 1.098041 +v 4.020421 0.329782 1.360535 +v 4.030502 0.344880 1.360535 +v 4.026679 0.336518 1.363441 +v 3.986295 0.265896 1.100947 +v 3.979352 0.249121 1.100947 +v 3.984177 0.256950 1.098041 +v 3.979352 0.249121 1.360535 +v 3.986295 0.265896 1.360535 +v 3.984177 0.256950 1.363441 +v 3.958346 0.179805 1.100947 +v 3.954810 0.161999 1.100947 +v 3.958014 0.170618 1.098041 +v 3.954810 0.161999 1.360535 +v 3.958346 0.179805 1.360535 +v 3.958014 0.170618 1.363441 +v 4.038224 -0.187582 1.166350 +v 4.049150 -0.202069 1.166350 +v 4.097747 -0.254828 1.166350 +v 4.111290 -0.266905 1.166350 +v 4.169245 -0.309170 1.166350 +v 4.184884 -0.318373 1.166350 +v 4.249970 -0.348518 1.166350 +v 4.267104 -0.354494 1.166350 +v 4.336822 -0.371363 1.166350 +v 4.354792 -0.373881 1.166350 +v 4.426461 -0.376824 1.166350 +v 4.444577 -0.375788 1.166350 +v 4.515443 -0.364693 1.166350 +v 4.533009 -0.360142 1.166350 +v 4.600348 -0.335435 1.166350 +v 4.616689 -0.327545 1.166350 +v 4.677915 -0.290175 1.166350 +v 4.692402 -0.279248 1.166350 +v 4.745161 -0.230652 1.166350 +v 4.757239 -0.217109 1.166350 +v 4.799503 -0.159154 1.166350 +v 4.808706 -0.143515 1.166350 +v 4.838852 -0.078429 1.166350 +v 4.844828 -0.061295 1.166350 +v 4.861696 0.008423 1.166350 +v 4.864214 0.026393 1.166350 +v 4.867157 0.098062 1.166350 +v 4.866121 0.116178 1.166350 +v 4.855026 0.187044 1.166350 +v 4.850475 0.204610 1.166350 +v 4.825768 0.271950 1.166350 +v 4.817878 0.288291 1.166350 +v 4.780508 0.349516 1.166350 +v 4.769582 0.364004 1.166350 +v 4.720985 0.416763 1.166350 +v 4.707443 0.428840 1.166350 +v 4.649487 0.471104 1.166351 +v 4.633849 0.480307 1.166351 +v 4.568762 0.510453 1.166351 +v 4.551628 0.516428 1.166351 +v 4.481910 0.533297 1.166351 +v 4.463940 0.535815 1.166351 +v 4.392271 0.538758 1.166351 +v 4.374155 0.537722 1.166351 +v 4.303289 0.526627 1.166351 +v 4.285723 0.522076 1.166351 +v 4.218383 0.497369 1.166351 +v 4.202043 0.489479 1.166351 +v 4.140817 0.452109 1.166351 +v 4.126329 0.441183 1.166351 +v 4.073571 0.392586 1.166351 +v 4.061493 0.379044 1.166351 +v 4.019229 0.321088 1.166351 +v 4.010026 0.305450 1.166351 +v 3.954518 0.135541 1.166351 +v 3.957036 0.153511 1.166351 +v 3.979880 0.240362 1.166351 +v 3.973905 0.223229 1.166351 +v 4.000854 -0.126356 1.166351 +v 3.992964 -0.110015 1.166351 +v 3.968257 -0.042675 1.166351 +v 3.963706 -0.025109 1.166351 +v 3.951575 0.063873 1.166351 +v 3.952611 0.045757 1.166351 +v 4.023564 -0.166058 1.230741 +v 4.033649 -0.181142 1.230741 +v 4.079169 -0.236578 1.230741 +v 4.092003 -0.249405 1.230741 +v 4.147464 -0.294895 1.230741 +v 4.162554 -0.304971 1.230741 +v 4.225823 -0.338767 1.230741 +v 4.242589 -0.345706 1.230741 +v 4.311236 -0.366510 1.230741 +v 4.329033 -0.370044 1.230741 +v 4.400420 -0.377056 1.230741 +v 4.418565 -0.377051 1.230741 +v 4.489948 -0.370000 1.230741 +v 4.507743 -0.366456 1.230741 +v 4.576379 -0.345615 1.230741 +v 4.593141 -0.338666 1.230741 +v 4.656392 -0.304835 1.230741 +v 4.671476 -0.294750 1.230741 +v 4.726912 -0.249230 1.230741 +v 4.739738 -0.236396 1.230741 +v 4.785228 -0.180935 1.230741 +v 4.795305 -0.165845 1.230741 +v 4.829101 -0.102576 1.230741 +v 4.836040 -0.085810 1.230741 +v 4.856843 -0.017163 1.230741 +v 4.860378 0.000635 1.230741 +v 4.867389 0.072021 1.230741 +v 4.867384 0.090166 1.230741 +v 4.860334 0.161549 1.230741 +v 4.856789 0.179345 1.230741 +v 4.835948 0.247980 1.230741 +v 4.828999 0.264742 1.230741 +v 4.795168 0.327993 1.230741 +v 4.785083 0.343077 1.230741 +v 4.739563 0.398513 1.230741 +v 4.726729 0.411340 1.230741 +v 4.671268 0.456829 1.230741 +v 4.656178 0.466906 1.230741 +v 4.592909 0.500702 1.230741 +v 4.576143 0.507641 1.230741 +v 4.507496 0.528444 1.230741 +v 4.489699 0.531979 1.230741 +v 4.418312 0.538990 1.230741 +v 4.400167 0.538985 1.230741 +v 4.328784 0.531935 1.230741 +v 4.310989 0.528390 1.230741 +v 4.242353 0.507548 1.230741 +v 4.225592 0.500600 1.230741 +v 4.162340 0.466769 1.230741 +v 4.147256 0.456684 1.230741 +v 4.091821 0.411164 1.230741 +v 4.078994 0.398330 1.230741 +v 4.033504 0.342869 1.230741 +v 4.023427 0.327779 1.230741 +v 3.958354 0.161299 1.230741 +v 3.961889 0.179097 1.230741 +v 3.989632 0.264510 1.230741 +v 3.982693 0.247744 1.230741 +v 3.989733 -0.102807 1.230741 +v 3.982785 -0.086046 1.230741 +v 3.961944 -0.017410 1.230741 +v 3.958399 0.000386 1.230741 +v 3.951344 0.089913 1.230741 +v 3.951348 0.071768 1.230741 +v 4.038224 -0.187582 1.295131 +v 4.049150 -0.202069 1.295131 +v 4.097747 -0.254828 1.295131 +v 4.111290 -0.266905 1.295131 +v 4.169245 -0.309170 1.295131 +v 4.184884 -0.318373 1.295131 +v 4.249970 -0.348518 1.295131 +v 4.267104 -0.354494 1.295131 +v 4.336822 -0.371363 1.295131 +v 4.354792 -0.373881 1.295131 +v 4.426461 -0.376824 1.295131 +v 4.444577 -0.375788 1.295131 +v 4.515443 -0.364693 1.295131 +v 4.533009 -0.360142 1.295131 +v 4.600348 -0.335435 1.295131 +v 4.616689 -0.327545 1.295131 +v 4.677915 -0.290175 1.295131 +v 4.692402 -0.279248 1.295131 +v 4.745161 -0.230652 1.295131 +v 4.757239 -0.217109 1.295131 +v 4.799503 -0.159154 1.295131 +v 4.808706 -0.143515 1.295131 +v 4.838852 -0.078429 1.295131 +v 4.844828 -0.061295 1.295131 +v 4.861696 0.008423 1.295131 +v 4.864214 0.026393 1.295131 +v 4.867157 0.098062 1.295131 +v 4.866121 0.116178 1.295131 +v 4.855026 0.187044 1.295131 +v 4.850475 0.204610 1.295131 +v 4.825768 0.271950 1.295131 +v 4.817878 0.288291 1.295131 +v 4.780508 0.349516 1.295131 +v 4.769582 0.364004 1.295131 +v 4.720985 0.416763 1.295131 +v 4.707443 0.428840 1.295131 +v 4.649487 0.471104 1.295131 +v 4.633849 0.480307 1.295131 +v 4.568762 0.510453 1.295131 +v 4.551628 0.516428 1.295131 +v 4.481910 0.533297 1.295131 +v 4.463940 0.535815 1.295131 +v 4.392271 0.538758 1.295131 +v 4.374155 0.537722 1.295131 +v 4.303289 0.526627 1.295131 +v 4.285723 0.522076 1.295131 +v 4.218383 0.497369 1.295131 +v 4.202043 0.489479 1.295131 +v 4.140817 0.452109 1.295131 +v 4.126329 0.441183 1.295131 +v 4.073571 0.392586 1.295131 +v 4.061493 0.379043 1.295131 +v 4.019229 0.321088 1.295131 +v 4.010026 0.305450 1.295131 +v 3.954518 0.135541 1.295131 +v 3.957036 0.153511 1.295131 +v 3.979880 0.240362 1.295131 +v 3.973905 0.223229 1.295131 +v 4.000854 -0.126356 1.295131 +v 3.992964 -0.110015 1.295131 +v 3.968257 -0.042675 1.295131 +v 3.963706 -0.025110 1.295131 +v 3.951575 0.063873 1.295131 +v 3.952611 0.045756 1.295131 +v 3.949004 0.045548 1.157534 +v 3.947968 0.063669 1.157534 +v 3.947968 0.063668 1.174153 +v 3.949004 0.045549 1.174153 +v 3.947735 0.071766 1.222431 +v 3.947730 0.089914 1.222431 +v 3.947730 0.089914 1.239051 +v 3.947735 0.071766 1.239051 +v 3.949004 0.045549 1.287329 +v 3.947968 0.063668 1.287329 +v 3.947968 0.063668 1.303948 +v 3.949004 0.045548 1.303948 +v 3.960208 -0.026013 1.303948 +v 3.964760 -0.043584 1.303948 +v 3.964760 -0.043583 1.287329 +v 3.960208 -0.026014 1.287329 +v 3.954855 -0.000319 1.239051 +v 3.958400 -0.018118 1.239051 +v 3.958400 -0.018118 1.222431 +v 3.954855 -0.000319 1.222431 +v 3.960208 -0.026014 1.174153 +v 3.964760 -0.043583 1.174153 +v 3.964760 -0.043584 1.157534 +v 3.960208 -0.026013 1.157534 +v 3.953458 0.154014 1.174153 +v 3.950940 0.136041 1.174153 +v 3.950940 0.136040 1.157534 +v 3.953458 0.154015 1.157534 +v 3.958346 0.179802 1.239051 +v 3.954810 0.162001 1.239051 +v 3.954810 0.162001 1.222431 +v 3.958346 0.179802 1.222431 +v 3.953458 0.154014 1.303948 +v 3.950940 0.136040 1.303948 +v 3.950940 0.136041 1.287329 +v 3.953458 0.154014 1.287329 +v 3.989709 -0.111584 1.303948 +v 3.997602 -0.127929 1.303948 +v 3.997601 -0.127928 1.287329 +v 3.989710 -0.111585 1.287329 +v 3.979446 -0.087428 1.239051 +v 3.986396 -0.104192 1.239051 +v 3.986396 -0.104192 1.222431 +v 3.979446 -0.087428 1.222431 +v 3.989710 -0.111585 1.174153 +v 3.997601 -0.127928 1.174153 +v 3.997601 -0.127929 1.157534 +v 3.989709 -0.111584 1.157534 +v 4.046267 -0.204246 1.287329 +v 4.035338 -0.189756 1.287329 +v 4.035338 -0.189756 1.303948 +v 4.046267 -0.204246 1.303948 +v 4.030646 -0.183153 1.222431 +v 4.020559 -0.168065 1.222431 +v 4.020559 -0.168065 1.239051 +v 4.030646 -0.183153 1.239050 +v 4.046267 -0.204246 1.157534 +v 4.035338 -0.189756 1.157534 +v 4.035338 -0.189756 1.174153 +v 4.046267 -0.204246 1.174153 +v 4.108886 -0.269603 1.287329 +v 4.095341 -0.257523 1.287329 +v 4.095340 -0.257523 1.303948 +v 4.108886 -0.269603 1.303948 +v 4.089450 -0.251962 1.222431 +v 4.076613 -0.239132 1.222431 +v 4.076613 -0.239132 1.239050 +v 4.089450 -0.251962 1.239050 +v 4.108886 -0.269603 1.157534 +v 4.095340 -0.257523 1.157534 +v 4.095341 -0.257523 1.174153 +v 4.108886 -0.269603 1.174153 +v 4.183052 -0.321488 1.287329 +v 4.167411 -0.312282 1.287329 +v 4.167410 -0.312282 1.303948 +v 4.183053 -0.321488 1.303948 +v 4.160549 -0.307977 1.222431 +v 4.145456 -0.297899 1.222431 +v 4.145456 -0.297899 1.239050 +v 4.160549 -0.307977 1.239050 +v 4.183053 -0.321488 1.157534 +v 4.167410 -0.312282 1.157534 +v 4.167411 -0.312282 1.174153 +v 4.183052 -0.321488 1.174153 +v 4.265916 -0.357906 1.287329 +v 4.248779 -0.351930 1.287329 +v 4.248778 -0.351930 1.303948 +v 4.265916 -0.357906 1.303948 +v 4.241209 -0.349045 1.222431 +v 4.224440 -0.342105 1.222431 +v 4.224440 -0.342105 1.239050 +v 4.241209 -0.349045 1.239050 +v 4.265916 -0.357906 1.157534 +v 4.248778 -0.351930 1.157534 +v 4.248779 -0.351930 1.174153 +v 4.265916 -0.357906 1.174153 +v 4.354292 -0.377459 1.287329 +v 4.336319 -0.374941 1.287329 +v 4.336318 -0.374941 1.303948 +v 4.354293 -0.377459 1.303948 +v 4.328331 -0.373589 1.222431 +v 4.310530 -0.370053 1.222431 +v 4.310530 -0.370053 1.239050 +v 4.328331 -0.373589 1.239050 +v 4.354293 -0.377459 1.157534 +v 4.336318 -0.374941 1.157534 +v 4.336319 -0.374941 1.174153 +v 4.354292 -0.377459 1.174153 +v 4.444785 -0.379395 1.287329 +v 4.426665 -0.380432 1.287329 +v 4.426665 -0.380431 1.303948 +v 4.444785 -0.379395 1.303948 +v 4.418568 -0.380664 1.222431 +v 4.400419 -0.380669 1.222431 +v 4.400419 -0.380669 1.239050 +v 4.418568 -0.380664 1.239050 +v 4.444785 -0.379395 1.157534 +v 4.426665 -0.380431 1.157534 +v 4.426665 -0.380432 1.174153 +v 4.444785 -0.379395 1.174153 +v 4.533916 -0.363640 1.287329 +v 4.516347 -0.368191 1.287329 +v 4.516347 -0.368191 1.303948 +v 4.533917 -0.363639 1.303948 +v 4.508451 -0.369999 1.222431 +v 4.490652 -0.373544 1.222431 +v 4.490652 -0.373544 1.239050 +v 4.508451 -0.369999 1.239050 +v 4.533917 -0.363639 1.157534 +v 4.516347 -0.368191 1.157534 +v 4.516347 -0.368191 1.174153 +v 4.533916 -0.363640 1.174153 +v 4.618262 -0.330798 1.287329 +v 4.601918 -0.338689 1.287329 +v 4.601918 -0.338690 1.303948 +v 4.618262 -0.330798 1.303948 +v 4.594526 -0.342003 1.222431 +v 4.577761 -0.348953 1.222431 +v 4.577761 -0.348953 1.239050 +v 4.594526 -0.342003 1.239050 +v 4.618262 -0.330798 1.157534 +v 4.601918 -0.338690 1.157534 +v 4.601918 -0.338689 1.174153 +v 4.618262 -0.330798 1.174153 +v 4.694580 -0.282132 1.287329 +v 4.680089 -0.293061 1.287329 +v 4.680089 -0.293061 1.303948 +v 4.694580 -0.282132 1.303948 +v 4.673486 -0.297753 1.222431 +v 4.658398 -0.307840 1.222431 +v 4.658398 -0.307840 1.239050 +v 4.673486 -0.297753 1.239050 +v 4.694580 -0.282132 1.157534 +v 4.680089 -0.293061 1.157534 +v 4.680089 -0.293061 1.174153 +v 4.694580 -0.282132 1.174153 +v 4.759936 -0.219513 1.287329 +v 4.747857 -0.233058 1.287329 +v 4.747856 -0.233059 1.303948 +v 4.759937 -0.219513 1.303948 +v 4.742295 -0.238949 1.222431 +v 4.729466 -0.251785 1.222431 +v 4.729466 -0.251785 1.239050 +v 4.742295 -0.238949 1.239050 +v 4.759937 -0.219513 1.157534 +v 4.747856 -0.233059 1.157534 +v 4.747857 -0.233058 1.174153 +v 4.759936 -0.219513 1.174153 +v 4.811821 -0.145347 1.287329 +v 4.802616 -0.160988 1.287329 +v 4.802616 -0.160988 1.303948 +v 4.811821 -0.145346 1.303948 +v 4.798311 -0.167850 1.222431 +v 4.788232 -0.182943 1.222431 +v 4.788232 -0.182943 1.239050 +v 4.798311 -0.167850 1.239050 +v 4.811821 -0.145346 1.157534 +v 4.802616 -0.160988 1.157534 +v 4.802616 -0.160988 1.174153 +v 4.811821 -0.145347 1.174153 +v 4.848240 -0.062483 1.287329 +v 4.842263 -0.079620 1.287329 +v 4.842263 -0.079620 1.303948 +v 4.848240 -0.062483 1.303948 +v 4.839379 -0.087190 1.222431 +v 4.832439 -0.103959 1.222431 +v 4.832439 -0.103959 1.239050 +v 4.839379 -0.087190 1.239050 +v 4.848240 -0.062483 1.157534 +v 4.842263 -0.079620 1.157534 +v 4.842263 -0.079620 1.174153 +v 4.848240 -0.062483 1.174153 +v 4.867793 0.025893 1.287329 +v 4.865274 0.007920 1.287329 +v 4.865274 0.007919 1.303948 +v 4.867793 0.025894 1.303948 +v 4.863923 -0.000067 1.222431 +v 4.860387 -0.017868 1.222431 +v 4.860387 -0.017868 1.239050 +v 4.863923 -0.000067 1.239050 +v 4.867793 0.025894 1.157534 +v 4.865274 0.007919 1.157534 +v 4.865274 0.007920 1.174153 +v 4.867793 0.025893 1.174153 +v 4.869729 0.116386 1.287329 +v 4.870765 0.098267 1.287329 +v 4.870764 0.098266 1.303948 +v 4.869729 0.116387 1.303948 +v 4.870997 0.090169 1.222431 +v 4.871002 0.072021 1.222431 +v 4.871002 0.072021 1.239050 +v 4.870997 0.090169 1.239050 +v 4.869729 0.116387 1.157534 +v 4.870764 0.098266 1.157534 +v 4.870765 0.098267 1.174153 +v 4.869729 0.116386 1.174153 +v 4.853973 0.205518 1.287329 +v 4.858524 0.187949 1.287329 +v 4.858524 0.187948 1.303948 +v 4.853972 0.205519 1.303948 +v 4.860332 0.180052 1.222431 +v 4.863878 0.162253 1.222431 +v 4.863878 0.162253 1.239050 +v 4.860332 0.180052 1.239050 +v 4.853972 0.205519 1.157534 +v 4.858524 0.187948 1.157534 +v 4.858524 0.187949 1.174153 +v 4.853973 0.205518 1.174153 +v 4.821132 0.289863 1.287329 +v 4.829022 0.273520 1.287329 +v 4.829023 0.273519 1.303948 +v 4.821131 0.289864 1.303948 +v 4.832336 0.266127 1.222431 +v 4.839286 0.249362 1.222431 +v 4.839286 0.249362 1.239050 +v 4.832336 0.266127 1.239050 +v 4.821131 0.289864 1.157534 +v 4.829023 0.273519 1.157534 +v 4.829022 0.273520 1.174153 +v 4.821132 0.289863 1.174153 +v 4.772466 0.366181 1.287329 +v 4.783394 0.351691 1.287329 +v 4.783394 0.351690 1.303948 +v 4.772465 0.366181 1.303948 +v 4.788086 0.345087 1.222431 +v 4.798173 0.330000 1.222431 +v 4.798173 0.330000 1.239050 +v 4.788086 0.345087 1.239050 +v 4.772465 0.366181 1.157534 +v 4.783394 0.351690 1.157534 +v 4.783394 0.351691 1.174153 +v 4.772466 0.366181 1.174153 +v 4.709847 0.431537 1.287329 +v 4.723392 0.419458 1.287329 +v 4.723392 0.419458 1.303948 +v 4.709846 0.431538 1.303948 +v 4.729282 0.413896 1.222431 +v 4.742118 0.401067 1.222431 +v 4.742118 0.401067 1.239050 +v 4.729282 0.413896 1.239050 +v 4.709846 0.431538 1.157534 +v 4.723392 0.419458 1.157534 +v 4.723392 0.419458 1.174153 +v 4.709847 0.431537 1.174153 +v 4.635680 0.483422 1.287329 +v 4.651321 0.474217 1.287329 +v 4.651322 0.474217 1.303948 +v 4.635680 0.483423 1.303948 +v 4.658184 0.469912 1.222431 +v 4.673276 0.459833 1.222431 +v 4.673276 0.459833 1.239051 +v 4.658184 0.469912 1.239051 +v 4.635680 0.483423 1.157534 +v 4.651322 0.474217 1.157534 +v 4.651321 0.474217 1.174153 +v 4.635680 0.483422 1.174153 +v 4.552816 0.519841 1.287329 +v 4.569953 0.513864 1.287329 +v 4.569953 0.513864 1.303948 +v 4.552815 0.519841 1.303948 +v 4.577524 0.510980 1.222431 +v 4.594292 0.504040 1.222431 +v 4.594292 0.504040 1.239051 +v 4.577524 0.510980 1.239051 +v 4.552815 0.519841 1.157534 +v 4.569953 0.513864 1.157534 +v 4.569953 0.513864 1.174153 +v 4.552816 0.519841 1.174153 +v 4.464440 0.539394 1.287329 +v 4.482413 0.536875 1.287329 +v 4.482414 0.536875 1.303948 +v 4.464439 0.539394 1.303948 +v 4.490401 0.535523 1.222431 +v 4.508202 0.531988 1.222431 +v 4.508202 0.531988 1.239051 +v 4.490401 0.535523 1.239051 +v 4.464439 0.539394 1.157534 +v 4.482414 0.536875 1.157534 +v 4.482413 0.536875 1.174153 +v 4.464440 0.539394 1.174153 +v 4.373947 0.541330 1.287329 +v 4.392066 0.542366 1.287329 +v 4.392067 0.542366 1.303948 +v 4.373947 0.541330 1.303948 +v 4.400164 0.542598 1.222431 +v 4.418313 0.542603 1.222431 +v 4.418313 0.542603 1.239051 +v 4.400164 0.542598 1.239051 +v 4.373947 0.541330 1.157534 +v 4.392067 0.542366 1.157534 +v 4.392066 0.542366 1.174153 +v 4.373947 0.541330 1.174153 +v 4.284815 0.525574 1.287329 +v 4.302384 0.530125 1.287329 +v 4.302385 0.530125 1.303948 +v 4.284815 0.525574 1.303948 +v 4.310281 0.531933 1.222431 +v 4.328080 0.535479 1.222431 +v 4.328080 0.535479 1.239051 +v 4.310281 0.531933 1.239051 +v 4.284815 0.525574 1.157534 +v 4.302385 0.530125 1.157534 +v 4.302384 0.530125 1.174153 +v 4.284815 0.525574 1.174153 +v 4.200470 0.492732 1.287329 +v 4.216814 0.500623 1.287329 +v 4.216815 0.500624 1.303948 +v 4.200469 0.492732 1.303948 +v 4.224206 0.503937 1.222431 +v 4.240971 0.510887 1.222431 +v 4.240971 0.510887 1.239051 +v 4.224206 0.503937 1.239051 +v 4.200469 0.492732 1.157534 +v 4.216815 0.500624 1.157534 +v 4.216814 0.500623 1.174153 +v 4.200470 0.492732 1.174153 +v 4.124153 0.444067 1.287329 +v 4.138643 0.454995 1.287329 +v 4.138643 0.454995 1.303948 +v 4.124152 0.444066 1.303948 +v 4.145246 0.459687 1.222431 +v 4.160334 0.469774 1.222431 +v 4.160334 0.469774 1.239051 +v 4.145246 0.459687 1.239051 +v 4.124152 0.444066 1.157534 +v 4.138643 0.454995 1.157534 +v 4.138643 0.454995 1.174153 +v 4.124153 0.444067 1.174153 +v 4.058796 0.381448 1.287329 +v 4.070876 0.394993 1.287329 +v 4.070876 0.394993 1.303948 +v 4.058795 0.381447 1.303948 +v 4.076437 0.400883 1.222431 +v 4.089266 0.413719 1.222431 +v 4.089266 0.413719 1.239051 +v 4.076437 0.400883 1.239051 +v 4.058795 0.381447 1.157534 +v 4.070876 0.394993 1.157534 +v 4.070876 0.394993 1.174153 +v 4.058796 0.381448 1.174153 +v 4.006911 0.307281 1.287329 +v 4.016116 0.322922 1.287329 +v 4.016116 0.322923 1.303948 +v 4.006911 0.307280 1.303948 +v 4.020422 0.329784 1.222431 +v 4.030500 0.344877 1.222431 +v 4.030500 0.344877 1.239051 +v 4.020422 0.329784 1.239051 +v 4.006911 0.307280 1.157534 +v 4.016116 0.322923 1.157534 +v 4.016116 0.322922 1.174153 +v 4.006911 0.307281 1.174153 +v 3.970492 0.224417 1.287329 +v 3.976470 0.241554 1.287329 +v 3.976470 0.241554 1.303948 +v 3.970492 0.224416 1.303948 +v 3.979353 0.249124 1.222431 +v 3.986293 0.265893 1.222431 +v 3.986293 0.265893 1.239051 +v 3.979353 0.249124 1.239051 +v 3.970492 0.224417 1.157534 +v 3.976470 0.241554 1.157534 +v 3.976470 0.241554 1.174153 +v 3.970492 0.224417 1.174153 +v 4.498926 -0.368631 1.101847 +v 4.498926 -0.368631 1.359635 +v 4.498926 -0.368631 1.222489 +v 4.498225 -0.365112 1.230741 +v 4.524329 -0.362816 1.286936 +v 4.523429 -0.359342 1.294684 +v 4.524329 -0.362816 1.158042 +v 4.523429 -0.359342 1.166797 +v 4.524329 -0.362816 1.174546 +v 4.498926 -0.368631 1.238993 +v 4.524329 -0.362816 1.303440 +v 4.018566 0.080860 1.384222 +v 4.026095 0.004621 1.384222 +v 4.048355 -0.068685 1.384222 +v 4.084486 -0.136239 1.384222 +v 4.133104 -0.195447 1.384222 +v 4.192338 -0.244031 1.384222 +v 4.259912 -0.280127 1.384222 +v 4.333230 -0.302345 1.384222 +v 4.409473 -0.309834 1.384222 +v 4.485713 -0.302304 1.384222 +v 4.559018 -0.280045 1.384222 +v 4.626572 -0.243912 1.384222 +v 4.685780 -0.195295 1.384222 +v 4.734365 -0.136061 1.384222 +v 4.770460 -0.068487 1.384222 +v 4.792678 0.004831 1.384222 +v 4.800167 0.081074 1.384222 +v 4.792637 0.157314 1.384222 +v 4.770378 0.230619 1.384222 +v 4.734246 0.298174 1.384222 +v 4.685628 0.357381 1.384222 +v 4.626394 0.405966 1.384222 +v 4.558820 0.442061 1.384222 +v 4.485502 0.464280 1.384222 +v 4.409259 0.471768 1.384222 +v 4.333019 0.464238 1.384222 +v 4.259714 0.441979 1.384222 +v 4.192160 0.405847 1.384222 +v 4.132952 0.357229 1.384222 +v 4.084367 0.297995 1.384222 +v 4.048272 0.230421 1.384222 +v 4.026053 0.157103 1.384222 +v 4.076862 0.014733 1.377978 +v 4.279708 -0.232297 1.377978 +v 4.127416 0.269248 1.377978 +v 4.051066 0.125316 1.410284 +v 4.066485 0.195730 1.410284 +v 4.286349 0.073792 1.398084 +v 4.301769 0.144206 1.398084 +v 4.103345 0.113867 1.424606 +v 4.118765 0.184282 1.424606 +v 4.066485 0.195730 1.380890 +v 4.051066 0.125316 1.380828 +v 4.220395 0.392687 1.410284 +v 4.285015 0.424628 1.410284 +v 4.327124 0.176765 1.398084 +v 4.391744 0.208707 1.398084 +v 4.244110 0.344710 1.424606 +v 4.308729 0.376651 1.424606 +v 4.285015 0.424628 1.381319 +v 4.220395 0.392687 1.381202 +v 4.542915 0.427628 1.410284 +v 4.607794 0.396216 1.410284 +v 4.437956 0.210840 1.398084 +v 4.502835 0.179429 1.398084 +v 4.519593 0.379458 1.424607 +v 4.584472 0.348047 1.424607 +v 4.607794 0.396216 1.382118 +v 4.542915 0.427628 1.381989 +v 4.763578 0.199868 1.410284 +v 4.780222 0.129733 1.410284 +v 4.529228 0.144251 1.398084 +v 4.545873 0.074116 1.398084 +v 4.711506 0.187510 1.424607 +v 4.728151 0.117375 1.424607 +v 4.780222 0.129733 1.382396 +v 4.763578 0.199868 1.382350 +v 4.725554 -0.116869 1.410284 +v 4.681180 -0.173676 1.410284 +v 4.535739 0.031399 1.398084 +v 4.491366 -0.025407 1.398084 +v 4.683377 -0.083925 1.424606 +v 4.639004 -0.140731 1.424606 +v 4.681180 -0.173676 1.382129 +v 4.725554 -0.116869 1.382184 +v 4.455745 -0.285394 1.410284 +v 4.383662 -0.285531 1.410284 +v 4.455288 -0.044536 1.398084 +v 4.383205 -0.044673 1.398084 +v 4.455644 -0.231877 1.424607 +v 4.383561 -0.232013 1.424607 +v 4.383662 -0.285531 1.381596 +v 4.455745 -0.285394 1.381825 +v 4.151116 -0.175611 1.410284 +v 4.106280 -0.119170 1.410284 +v 4.339711 -0.025794 1.398084 +v 4.294875 0.030648 1.398084 +v 4.193022 -0.142322 1.424607 +v 4.148185 -0.085881 1.424607 +v 4.107576 -0.120802 1.380872 +v 4.106280 -0.119170 1.380917 +v 4.151116 -0.175611 1.381009 +v 4.045502 0.162011 1.394382 +v 4.121924 -0.157824 1.394382 +v 4.419630 -0.297489 1.394382 +v 4.714441 -0.151813 1.394382 +v 4.784358 0.169507 1.394382 +v 4.576733 0.424511 1.394382 +v 4.247911 0.421174 1.394382 +v 4.750355 0.013238 1.379017 +v 4.698860 0.274516 1.379088 +v 4.743629 0.219530 1.380729 +v 4.655739 0.327475 1.379122 +v 4.610821 0.382644 1.380839 +v 4.477403 0.423503 1.379207 +v 4.409272 0.422811 1.378317 +v 4.341409 0.422123 1.379042 +v 4.169466 0.320735 1.377995 +v 4.212352 0.375644 1.379840 +v 4.165891 0.316157 1.377978 +v 4.086555 0.214576 1.379225 +v 4.123436 0.261797 1.377978 +v 4.140830 -0.030350 1.377978 +v 4.094838 -0.044467 1.377978 +v 4.127641 0.024848 1.377978 +v 4.080519 0.015462 1.377978 +v 4.246343 -0.163159 1.377978 +v 4.298245 -0.187509 1.377978 +v 4.279864 -0.231920 1.377978 +v 4.272779 -0.228596 1.377978 +v 4.351113 -0.212311 1.377978 +v 4.282421 -0.233119 1.377978 +v 4.522896 -0.192907 1.377978 +v 4.575194 -0.167065 1.377978 +v 4.703254 0.022593 1.377978 +v 4.690625 -0.035444 1.377978 +v 4.658769 0.247711 1.377978 +v 4.621619 0.293337 1.377978 +v 4.467846 0.375390 1.377978 +v 4.409286 0.374796 1.377978 +v 4.128624 0.268441 1.377978 +v 4.168664 0.241704 1.377978 +v 4.203681 0.286539 1.377978 +v 4.045502 0.162011 1.382138 +v 4.064400 0.186209 1.380797 +v 4.047702 0.152803 1.381560 +v 4.071055 0.194729 1.380325 +v 4.064889 0.080873 1.378635 +v 4.074163 0.042060 1.377978 +v 4.095914 -0.048970 1.378012 +v 4.052598 0.132313 1.380726 +v 4.219376 -0.203543 1.378350 +v 4.054447 0.124575 1.380412 +v 4.341477 -0.260825 1.379116 +v 4.114251 0.080886 1.377978 +v 4.478918 -0.268193 1.380027 +v 4.541323 -0.237357 1.378648 +v 4.132595 0.195520 1.377978 +v 4.602108 -0.207320 1.378913 +v 4.666149 -0.175675 1.380874 +v 4.123079 0.183337 1.377978 +v 4.735703 -0.054101 1.379685 +v 4.765113 0.081065 1.379994 +v 4.106537 0.113168 1.377978 +v 4.723645 0.116305 1.377978 +v 4.728151 0.117375 1.379405 +v 4.711506 0.187510 1.378964 +v 4.708387 0.186769 1.377978 +v 4.719961 -0.126442 1.382133 +v 4.688086 -0.164836 1.382097 +v 4.064400 0.186209 1.394382 +v 4.714441 -0.151813 1.383566 +v 4.676924 -0.170351 1.381475 +v 4.052598 0.132313 1.394382 +v 4.720689 -0.123096 1.382019 +v 4.054447 0.124575 1.394382 +v 4.103345 0.113867 1.378984 +v 4.722554 -0.114526 1.381729 +v 4.071055 0.194729 1.394382 +v 4.118765 0.184282 1.379339 +v 4.630292 -0.139838 1.377978 +v 4.634928 -0.137547 1.377978 +v 4.680555 -0.081720 1.377978 +v 4.268253 0.421381 1.381532 +v 4.278658 0.421486 1.381178 +v 4.286528 0.421566 1.380911 +v 4.222436 0.388557 1.380643 +v 4.688086 -0.164836 1.394382 +v 4.720689 -0.123096 1.394382 +v 4.228973 0.396927 1.381164 +v 4.247911 0.421174 1.382673 +v 4.350954 0.374204 1.377978 +v 4.722554 -0.114526 1.394382 +v 4.683377 -0.083925 1.379080 +v 4.310143 0.373790 1.377978 +v 4.676924 -0.170351 1.394382 +v 4.240450 0.333618 1.377978 +v 4.246048 0.340787 1.377978 +v 4.639004 -0.140731 1.379570 +v 4.278658 0.421486 1.394382 +v 4.394099 -0.285512 1.381470 +v 4.409468 -0.292722 1.382158 +v 4.383653 -0.280611 1.381003 +v 4.228973 0.396927 1.394382 +v 4.455734 -0.279649 1.381132 +v 4.222436 0.388557 1.394382 +v 4.419630 -0.297489 1.382854 +v 4.444061 -0.285416 1.381689 +v 4.383552 -0.227529 1.377978 +v 4.469206 -0.219437 1.377978 +v 4.455633 -0.226144 1.377978 +v 4.244110 0.344710 1.379326 +v 4.286528 0.421566 1.394382 +v 4.308729 0.376651 1.378961 +v 4.394099 -0.285512 1.394382 +v 4.576733 0.424511 1.383368 +v 4.551450 0.424254 1.381897 +v 4.594549 0.402629 1.382047 +v 4.604802 0.390036 1.381286 +v 4.444061 -0.285416 1.394382 +v 4.455734 -0.279649 1.394382 +v 4.541231 0.424150 1.381526 +v 4.455644 -0.231877 1.379736 +v 4.549915 0.424238 1.381842 +v 4.383653 -0.280611 1.394382 +v 4.383561 -0.232013 1.379364 +v 4.111666 -0.114891 1.380097 +v 4.582922 0.340865 1.377978 +v 4.155134 -0.173404 1.380463 +v 4.154355 -0.173039 1.380508 +v 4.581714 0.342349 1.377978 +v 4.517869 0.375897 1.377978 +v 4.115445 -0.130706 1.380897 +v 4.145935 -0.169089 1.380993 +v 4.121924 -0.157824 1.382375 +v 4.594549 0.402629 1.394382 +v 4.549915 0.424238 1.394382 +v 4.568377 0.415300 1.391264 +v 4.541231 0.424150 1.394382 +v 4.519593 0.379458 1.379189 +v 4.153155 -0.081932 1.377978 +v 4.196328 -0.139695 1.377978 +v 4.604802 0.390036 1.394382 +v 4.584472 0.348047 1.379938 +v 4.777865 0.139667 1.382230 +v 4.781209 0.155038 1.382816 +v 4.115445 -0.130706 1.394382 +v 4.775457 0.128602 1.381808 +v 4.784358 0.169507 1.383691 +v 4.765199 0.193039 1.382298 +v 4.760276 0.199084 1.381940 +v 4.145935 -0.169089 1.394382 +v 4.133317 -0.153204 1.391300 +v 4.715974 0.081051 1.377978 +v 4.154355 -0.173039 1.394382 +v 4.697337 0.200341 1.377978 +v 4.193022 -0.142322 1.379270 +v 4.111666 -0.114891 1.394382 +v 4.148185 -0.085881 1.379943 +v 4.777865 0.139667 1.394382 +v 4.765199 0.193039 1.394382 +v 4.760276 0.199084 1.394382 +v 4.775457 0.128602 1.394382 +v 4.304956 0.168065 1.380172 +v 4.524900 0.170214 1.380172 +v 4.553224 0.051480 1.380172 +v 4.355994 -0.045887 1.380172 +v 4.363303 -0.045815 1.380172 +v 4.278958 0.048800 1.380172 +v 4.478054 -0.044694 1.380172 +v 4.414411 0.222099 1.380172 +v 4.581534 0.341979 1.377978 +v 4.582705 0.340541 1.377978 +v 4.467772 0.375017 1.377978 +v 4.517688 0.375523 1.377978 +v 4.581534 0.341979 1.406695 +v 4.503287 0.180363 1.380172 +v 4.476595 0.290648 1.391994 +v 4.517688 0.375523 1.406695 +v 4.438036 0.211005 1.380172 +v 4.715592 0.081051 1.377978 +v 4.702888 0.022666 1.377978 +v 4.723243 0.116210 1.377978 +v 4.707984 0.186674 1.377978 +v 4.696978 0.200192 1.377978 +v 4.658457 0.247503 1.377978 +v 4.723243 0.116210 1.406695 +v 4.547720 0.074554 1.380172 +v 4.707984 0.186674 1.406695 +v 4.128006 0.024921 1.377978 +v 4.530994 0.144670 1.380172 +v 4.141179 -0.030206 1.377978 +v 4.574985 -0.166752 1.377978 +v 4.630014 -0.139560 1.377978 +v 4.634603 -0.137293 1.377978 +v 4.690275 -0.035299 1.377978 +v 4.246552 -0.162846 1.377978 +v 4.680230 -0.081466 1.377978 +v 4.298388 -0.187164 1.377978 +v 4.351188 -0.211934 1.377978 +v 4.522753 -0.192561 1.377978 +v 4.634603 -0.137293 1.406695 +v 4.621355 0.293072 1.377978 +v 4.409286 0.374423 1.377978 +v 4.168975 0.241496 1.377978 +v 4.203947 0.286274 1.377978 +v 4.114634 0.080886 1.377978 +v 4.132952 0.195373 1.377978 +v 4.492460 -0.026262 1.380172 +v 4.123483 0.183248 1.377978 +v 4.680230 -0.081466 1.406695 +v 4.536850 0.030531 1.380172 +v 4.383551 -0.227117 1.377978 +v 4.106942 0.113080 1.377978 +v 4.455632 -0.225728 1.377978 +v 4.469131 -0.219058 1.377978 +v 4.123483 0.183248 1.406695 +v 4.383551 -0.227117 1.406695 +v 4.299847 0.144627 1.380172 +v 4.284495 0.074198 1.380172 +v 4.106942 0.113080 1.406695 +v 4.351028 0.373832 1.377978 +v 4.383207 -0.045621 1.380172 +v 4.455288 -0.044916 1.380172 +v 4.455632 -0.225728 1.406695 +v 4.310327 0.373419 1.377978 +v 4.240668 0.333292 1.377978 +v 4.246232 0.340416 1.377978 +v 4.153477 -0.081677 1.377978 +v 4.196654 -0.139437 1.377978 +v 4.310327 0.373419 1.406695 +v 4.390869 0.210477 1.380172 +v 4.153477 -0.081677 1.406695 +v 4.246232 0.340416 1.406695 +v 4.294177 0.030094 1.380172 +v 4.339672 -0.025825 1.380172 +v 4.271063 -0.080327 1.391878 +v 4.196654 -0.139437 1.406695 +v 4.326233 0.178568 1.380172 +v 4.357168 0.127255 1.391552 +v 4.343417 0.064176 1.391552 +v 4.384161 0.014096 1.391552 +v 4.448719 0.014727 1.391552 +v 4.488477 0.065594 1.391552 +v 4.473496 0.128392 1.391552 +v 4.415059 0.155834 1.391552 +v 4.321605 0.058973 1.402281 +v 4.339500 0.141065 1.402281 +v 4.374630 -0.006201 1.402281 +v 4.458646 -0.005380 1.402281 +v 4.510387 0.060818 1.402281 +v 4.490891 0.142544 1.402281 +v 4.414839 0.178258 1.402281 +v 4.328840 0.060699 1.402281 +v 4.345361 0.136484 1.402281 +v 4.377791 0.000532 1.402281 +v 4.455353 0.001290 1.402281 +v 4.503119 0.062402 1.402281 +v 4.485121 0.137850 1.402281 +v 4.414912 0.170820 1.402281 +v 4.383207 -0.045621 1.371638 +v 4.286349 0.073792 1.373111 +v 4.383205 -0.044673 1.372373 +v 4.455288 -0.044536 1.371933 +v 4.301769 0.144206 1.373164 +v 4.455288 -0.044916 1.371638 +v 4.327124 0.176765 1.373198 +v 4.294177 0.030094 1.371638 +v 4.391744 0.208707 1.373169 +v 4.294875 0.030648 1.372329 +v 4.437956 0.210840 1.371780 +v 4.339711 -0.025794 1.371677 +v 4.502835 0.179429 1.372443 +v 4.339672 -0.025825 1.371638 +v 4.529228 0.144251 1.373046 +v 4.545873 0.074116 1.373111 +v 4.304956 0.168065 1.371638 +v 4.304956 0.168065 1.371638 +v 4.299847 0.144627 1.371638 +v 4.535739 0.031399 1.372732 +v 4.284495 0.074198 1.371638 +v 4.491366 -0.025407 1.372715 +v 4.278958 0.048800 1.371638 +v 4.278958 0.048800 1.371638 +v 4.355994 -0.045887 1.371638 +v 4.478054 -0.044694 1.371638 +v 4.478054 -0.044694 1.371638 +v 4.390869 0.210477 1.371638 +v 4.355994 -0.045887 1.371638 +v 4.536850 0.030531 1.371638 +v 4.326233 0.178568 1.371638 +v 4.503287 0.180363 1.371638 +v 4.553224 0.051480 1.371638 +v 4.553224 0.051480 1.371638 +v 4.492460 -0.026262 1.371638 +v 4.530994 0.144670 1.371638 +v 4.438036 0.211005 1.371638 +v 4.547720 0.074554 1.371638 +v 4.524900 0.170214 1.371638 +v 4.524900 0.170214 1.371638 +v 4.414411 0.222099 1.371638 +v 4.414411 0.222099 1.371638 +vt 0.750000 0.452782 +vt 0.710439 0.448886 +vt 0.672399 0.437346 +vt 0.637341 0.418607 +vt 0.606612 0.393389 +vt 0.581393 0.362660 +vt 0.562654 0.327601 +vt 0.551114 0.289561 +vt 0.547218 0.250000 +vt 0.551114 0.210439 +vt 0.562654 0.172399 +vt 0.581393 0.137341 +vt 0.606611 0.106612 +vt 0.637340 0.081393 +vt 0.672399 0.062654 +vt 0.710439 0.051114 +vt 0.750000 0.047218 +vt 0.789561 0.051114 +vt 0.827601 0.062654 +vt 0.862660 0.081393 +vt 0.893388 0.106612 +vt 0.918607 0.137340 +vt 0.937346 0.172399 +vt 0.948886 0.210439 +vt 0.952782 0.250000 +vt 0.948886 0.289561 +vt 0.937346 0.327601 +vt 0.918607 0.362660 +vt 0.893388 0.393388 +vt 0.862660 0.418607 +vt 0.827601 0.437346 +vt 0.789561 0.448886 +vt 0.375000 0.055549 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.625000 0.055549 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.055549 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.625000 0.055549 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.055549 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.625000 0.055549 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.055549 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.625000 0.055549 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.055549 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.625000 0.055549 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.055549 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.625000 0.055549 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.055549 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.625000 0.055549 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.412335 0.317241 +vt 0.410609 0.320917 +vt 0.412531 0.317322 +vt 0.412958 0.315915 +vt 0.591195 0.984481 +vt 0.399843 0.984481 +vt 0.399843 0.971155 +vt 0.375000 0.971255 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 0.971315 +vt 0.591195 0.971224 +vt 0.153745 0.750000 +vt 0.154903 0.746407 +vt 0.141327 0.746407 +vt 0.167165 0.694451 +vt 0.125000 0.694451 +vt 0.125000 0.750000 +vt 0.833163 0.694451 +vt 0.858389 0.745144 +vt 0.844748 0.745144 +vt 0.846315 0.750000 +vt 0.875000 0.750000 +vt 0.875000 0.694451 +vt 0.600410 0.984481 +vt 0.408190 0.984481 +vt 0.408190 0.971582 +vt 0.375000 0.971619 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 0.971733 +vt 0.600410 0.971596 +vt 0.153381 0.750000 +vt 0.154928 0.745218 +vt 0.141595 0.745218 +vt 0.166849 0.694451 +vt 0.125000 0.694451 +vt 0.125000 0.750000 +vt 0.832813 0.694451 +vt 0.858683 0.746455 +vt 0.845591 0.746455 +vt 0.846733 0.750000 +vt 0.875000 0.750000 +vt 0.875000 0.694451 +vt 0.573964 0.984481 +vt 0.473116 0.981439 +vt 0.401976 0.984481 +vt 0.401976 0.972243 +vt 0.375000 0.972387 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 0.972512 +vt 0.573964 0.972443 +vt 0.152613 0.750000 +vt 0.153908 0.745990 +vt 0.141422 0.745990 +vt 0.166976 0.694451 +vt 0.125000 0.694451 +vt 0.125000 0.750000 +vt 0.833717 0.694451 +vt 0.857878 0.742873 +vt 0.845202 0.742873 +vt 0.847513 0.750000 +vt 0.875000 0.750000 +vt 0.875000 0.694451 +vt 0.589589 0.984481 +vt 0.399342 0.984481 +vt 0.399342 0.972688 +vt 0.375000 0.972740 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 0.972784 +vt 0.589589 0.972622 +vt 0.152260 0.750000 +vt 0.153402 0.746478 +vt 0.141312 0.746478 +vt 0.167183 0.694451 +vt 0.125000 0.694451 +vt 0.125000 0.750000 +vt 0.833224 0.694451 +vt 0.858337 0.744916 +vt 0.846141 0.744916 +vt 0.847784 0.750000 +vt 0.875000 0.750000 +vt 0.875000 0.694451 +vt 0.586096 0.984481 +vt 0.402404 0.984481 +vt 0.402404 0.972417 +vt 0.375000 0.972577 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 0.972524 +vt 0.586097 0.972492 +vt 0.152423 0.750000 +vt 0.153697 0.746050 +vt 0.141408 0.746050 +vt 0.167076 0.694451 +vt 0.125000 0.694451 +vt 0.125000 0.750000 +vt 0.833377 0.694451 +vt 0.858220 0.744394 +vt 0.845706 0.744394 +vt 0.847524 0.750000 +vt 0.875000 0.750000 +vt 0.875000 0.694451 +vt 0.588803 0.984481 +vt 0.415522 0.984481 +vt 0.415522 0.972094 +vt 0.375000 0.972228 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 0.972004 +vt 0.588803 0.971881 +vt 0.152772 0.750000 +vt 0.154703 0.744036 +vt 0.141861 0.744036 +vt 0.166470 0.694451 +vt 0.125000 0.694451 +vt 0.125000 0.750000 +vt 0.833186 0.694451 +vt 0.858332 0.744893 +vt 0.845352 0.744893 +vt 0.847004 0.750000 +vt 0.875000 0.750000 +vt 0.875000 0.694451 +vt 0.573901 0.984481 +vt 0.474247 0.981473 +vt 0.403890 0.984481 +vt 0.403890 0.971415 +vt 0.375000 0.971431 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 0.971341 +vt 0.617771 0.971297 +vt 0.573901 0.971321 +vt 0.153569 0.750000 +vt 0.154943 0.745707 +vt 0.141484 0.745707 +vt 0.166900 0.694451 +vt 0.125000 0.694451 +vt 0.125000 0.750000 +vt 0.833722 0.694451 +vt 0.857876 0.742861 +vt 0.844047 0.742861 +vt 0.846341 0.750000 +vt 0.875000 0.750000 +vt 0.875000 0.694451 +vt 1.000000 1.000000 +vt 1.000000 0.977747 +vt 0.995887 0.976695 +vt 0.986735 0.975180 +vt 0.986735 1.000000 +vt 0.907775 0.970185 +vt 0.905764 0.970247 +vt 0.876319 0.974036 +vt 0.876319 1.000000 +vt 0.983279 1.000000 +vt 0.983279 0.974608 +vt 0.963759 0.971378 +vt 0.946423 0.970185 +vt 0.934543 0.970185 +vt 0.869255 1.000000 +vt 0.869255 0.975489 +vt 0.857143 0.978177 +vt 0.857143 1.000000 +vt 0.719162 0.977782 +vt 0.714286 0.979047 +vt 0.714286 1.000000 +vt 0.726537 1.000000 +vt 0.726537 0.976532 +vt 0.845621 1.000000 +vt 0.845621 0.975664 +vt 0.841207 0.974701 +vt 0.810380 0.970860 +vt 0.784754 0.970185 +vt 0.781354 0.970185 +vt 0.780127 0.970185 +vt 0.751788 0.972253 +vt 0.731550 0.975683 +vt 0.731550 1.000000 +vt 0.841581 1.000000 +vt 0.841581 0.974783 +vt 0.589608 1.000000 +vt 0.696791 1.000000 +vt 0.696791 0.975918 +vt 0.685556 0.973908 +vt 0.655317 0.971403 +vt 0.625862 0.971884 +vt 0.594829 0.975449 +vt 0.589608 0.976540 +vt 0.571429 1.000000 +vt 0.584200 1.000000 +vt 0.584200 0.977671 +vt 0.571429 0.980340 +vt 0.702447 0.976930 +vt 0.702447 1.000000 +vt 0.446758 1.000000 +vt 0.554851 1.000000 +vt 0.554851 0.977003 +vt 0.527986 0.973287 +vt 0.498048 0.972073 +vt 0.467892 0.973849 +vt 0.446758 0.977145 +vt 0.428571 1.000000 +vt 0.441838 1.000000 +vt 0.441838 0.977913 +vt 0.435005 0.978979 +vt 0.428571 0.980569 +vt 0.558661 0.977531 +vt 0.558661 1.000000 +vt 0.560149 0.977736 +vt 0.415389 0.978036 +vt 0.415389 1.000000 +vt 0.309169 0.975385 +vt 0.305027 0.976197 +vt 0.305027 1.000000 +vt 0.412002 1.000000 +vt 0.412002 0.977386 +vt 0.400548 0.975185 +vt 0.369744 0.972202 +vt 0.340075 0.972264 +vt 0.297973 1.000000 +vt 0.297973 0.977580 +vt 0.285714 0.979982 +vt 0.285714 1.000000 +vt 0.416059 0.357087 +vt 0.418109 0.358843 +vt 0.442688 0.377519 +vt 0.478382 0.221132 +vt 0.445992 0.234885 +vt 0.443039 0.236044 +vt 0.438297 0.257223 +vt 0.430581 0.291701 +vt 0.423064 0.325372 +vt 0.437640 0.399638 +vt 0.441377 0.383261 +vt 0.433246 0.393209 +vt 0.184488 0.071792 +vt 0.207513 0.071256 +vt 0.245500 0.070956 +vt 0.283013 0.071276 +vt 0.312784 0.071960 +vt 0.313923 0.069442 +vt 0.329965 0.033767 +vt 0.172381 0.033767 +vt 0.183417 0.068541 +vt 0.335519 0.033767 +vt 0.365740 0.048324 +vt 0.354132 0.033767 +vt 0.432525 0.191471 +vt 0.436311 0.189957 +vt 0.468080 0.176654 +vt 0.370656 0.054488 +vt 0.355136 0.088999 +vt 0.353492 0.092633 +vt 0.355564 0.095101 +vt 0.380082 0.124766 +vt 0.403170 0.153489 +vt 0.426641 0.183685 +vt 0.473222 0.183101 +vt 0.480008 0.214008 +vt 0.483983 0.196595 +vt 0.022842 0.200525 +vt 0.027160 0.182623 +vt 0.016017 0.196595 +vt 0.136101 0.099156 +vt 0.142886 0.090878 +vt 0.142141 0.088637 +vt 0.130807 0.052653 +vt 0.033572 0.174582 +vt 0.061005 0.185471 +vt 0.064758 0.186857 +vt 0.065503 0.185941 +vt 0.089426 0.156450 +vt 0.112362 0.128229 +vt 0.145868 0.033767 +vt 0.133885 0.048793 +vt 0.165209 0.033767 +vt 0.274063 0.977207 +vt 0.274063 1.000000 +vt 0.274730 0.977308 +vt 0.183477 0.972119 +vt 0.159634 0.975514 +vt 0.159634 1.000000 +vt 0.270291 1.000000 +vt 0.270291 0.976634 +vt 0.242560 0.972419 +vt 0.212961 0.970801 +vt 0.156216 1.000000 +vt 0.156216 0.976001 +vt 0.151695 0.976645 +vt 0.142857 0.978718 +vt 0.142857 1.000000 +vt 0.129492 0.975976 +vt 0.129491 1.000000 +vt 0.000000 0.977747 +vt 0.000000 1.000000 +vt 0.013338 1.000000 +vt 0.013338 0.975309 +vt 0.018035 0.974450 +vt 0.018035 1.000000 +vt 0.124878 1.000000 +vt 0.124878 0.975029 +vt 0.117760 0.973569 +vt 0.087492 0.970216 +vt 0.084969 0.970185 +vt 0.058667 0.970185 +vt 0.055005 0.970185 +vt 0.028975 0.972450 +vt 0.019797 0.213154 +vt 0.051909 0.224916 +vt 0.021021 0.218517 +vt 0.056918 0.375792 +vt 0.084307 0.348069 +vt 0.086020 0.346400 +vt 0.079806 0.322620 +vt 0.070975 0.288475 +vt 0.062090 0.254257 +vt 0.054327 0.225559 +vt 0.250000 0.490000 +vt 0.267423 0.481609 +vt 0.232480 0.481563 +vt 0.274590 0.439780 +vt 0.271963 0.479423 +vt 0.412452 0.411767 +vt 0.390902 0.389016 +vt 0.387945 0.385993 +vt 0.357919 0.399840 +vt 0.325828 0.414536 +vt 0.293364 0.429104 +vt 0.274738 0.437263 +vt 0.062360 0.399638 +vt 0.079916 0.408092 +vt 0.058027 0.380651 +vt 0.112684 0.384040 +vt 0.085976 0.411010 +vt 0.226311 0.478592 +vt 0.228861 0.439953 +vt 0.229066 0.436538 +vt 0.220119 0.432677 +vt 0.186405 0.417424 +vt 0.153938 0.401805 +vt 0.120154 0.384464 +vt 0.115045 0.381715 +vt 0.421730 0.407299 +vt 0.307648 0.389175 +vt 0.279042 0.396002 +vt 0.279079 0.396192 +vt 0.307723 0.389356 +vt 0.389114 0.307623 +vt 0.376489 0.334517 +vt 0.376651 0.334626 +vt 0.389293 0.307697 +vt 0.402170 0.280269 +vt 0.401975 0.280230 +vt 0.378724 0.163989 +vt 0.378562 0.164098 +vt 0.391947 0.191204 +vt 0.392126 0.191130 +vt 0.280294 0.097703 +vt 0.310369 0.104256 +vt 0.310444 0.104075 +vt 0.280331 0.097514 +vt 0.139971 0.139972 +vt 0.163622 0.120726 +vt 0.163514 0.120565 +vt 0.139834 0.139834 +vt 0.097536 0.250000 +vt 0.097729 0.250000 +vt 0.097430 0.219652 +vt 0.097236 0.219613 +vt 0.166562 0.374875 +vt 0.166669 0.374714 +vt 0.143440 0.356561 +vt 0.143302 0.356698 +vt 0.250000 0.402933 +vt 0.250000 0.403132 +vt 0.190597 0.393412 +vt 0.190520 0.393597 +vt 0.196887 0.398327 +vt 0.196841 0.398536 +vt 0.233294 0.406920 +vt 0.233248 0.407130 +vt 0.098028 0.280229 +vt 0.097835 0.280268 +vt 0.098236 0.301349 +vt 0.098044 0.301444 +vt 0.119048 0.337500 +vt 0.115352 0.334612 +vt 0.115160 0.334707 +vt 0.118879 0.337613 +vt 0.115335 0.160020 +vt 0.115167 0.159907 +vt 0.114589 0.160627 +vt 0.114397 0.160534 +vt 0.097174 0.193751 +vt 0.096980 0.193657 +vt 0.250000 0.091103 +vt 0.250000 0.090905 +vt 0.231758 0.087128 +vt 0.231708 0.086920 +vt 0.188176 0.100745 +vt 0.195193 0.095035 +vt 0.195143 0.094826 +vt 0.188099 0.100558 +vt 0.364605 0.135395 +vt 0.364460 0.135540 +vt 0.363417 0.132989 +vt 0.363285 0.133159 +vt 0.334323 0.109475 +vt 0.334455 0.109306 +vt 0.410071 0.263439 +vt 0.409858 0.263439 +vt 0.405885 0.218993 +vt 0.405688 0.219032 +vt 0.409147 0.226037 +vt 0.409363 0.226037 +vt 0.334490 0.382968 +vt 0.334358 0.382801 +vt 0.364335 0.360405 +vt 0.364469 0.360574 +vt 0.879125 0.952094 +vt 0.879125 1.000000 +vt 0.980478 1.000000 +vt 0.980478 0.952094 +vt 0.963724 0.952094 +vt 0.934599 0.952094 +vt 0.905911 0.952094 +vt 0.734152 0.952094 +vt 0.734153 1.000000 +vt 0.838646 1.000000 +vt 0.838646 0.952094 +vt 0.810748 0.952094 +vt 0.781767 0.952094 +vt 0.752247 0.952094 +vt 0.592608 0.952094 +vt 0.592608 1.000000 +vt 0.693652 1.000000 +vt 0.693652 0.952094 +vt 0.686031 0.952094 +vt 0.655756 0.952094 +vt 0.626267 0.952094 +vt 0.595198 0.952094 +vt 0.449715 0.952094 +vt 0.449715 1.000000 +vt 0.552112 1.000000 +vt 0.552112 0.952094 +vt 0.528197 0.952094 +vt 0.498171 0.952094 +vt 0.467927 0.952094 +vt 0.307849 0.952094 +vt 0.307849 1.000000 +vt 0.409220 1.000000 +vt 0.409220 0.952094 +vt 0.400396 0.952094 +vt 0.369515 0.952094 +vt 0.339771 0.952094 +vt 0.308788 0.952094 +vt 0.389345 0.328970 +vt 0.443640 0.373348 +vt 0.477538 0.224832 +vt 0.346726 0.253555 +vt 0.349989 0.267876 +vt 0.351188 0.273135 +vt 0.334909 0.201692 +vt 0.465228 0.173077 +vt 0.373383 0.057907 +vt 0.315627 0.177817 +vt 0.331177 0.185313 +vt 0.148795 0.273060 +vt 0.153088 0.254285 +vt 0.089612 0.238977 +vt 0.186333 0.176851 +vt 0.128278 0.055824 +vt 0.036137 0.171366 +vt 0.164944 0.202428 +vt 0.168871 0.185252 +vt 0.267712 0.154721 +vt 0.325971 0.033767 +vt 0.176691 0.033767 +vt 0.234265 0.153790 +vt 0.250039 0.146201 +vt 0.162409 0.952094 +vt 0.162409 1.000000 +vt 0.267372 1.000000 +vt 0.267372 0.952094 +vt 0.242106 0.952094 +vt 0.212500 0.952094 +vt 0.183011 0.952094 +vt 0.028760 0.952094 +vt 0.020973 0.952094 +vt 0.020973 1.000000 +vt 0.121913 1.000000 +vt 0.121913 0.952094 +vt 0.117337 0.952094 +vt 0.087140 0.952094 +vt 0.058382 0.952094 +vt 0.056018 0.371849 +vt 0.160868 0.288211 +vt 0.021967 0.222664 +vt 0.194017 0.329809 +vt 0.089871 0.412886 +vt 0.222452 0.476734 +vt 0.222629 0.343509 +vt 0.204928 0.343503 +vt 0.275820 0.343529 +vt 0.275642 0.477652 +vt 0.408767 0.413542 +vt 0.306102 0.329628 +vt 0.295002 0.343536 +vt 0.339283 0.288052 +vt 0.348645 0.328667 +vt 0.373008 0.221924 +vt 0.304744 0.136323 +vt 0.195256 0.136323 +vt 0.126992 0.221924 +vt 0.151355 0.328667 +vt 0.250000 0.376172 +vt 0.250000 0.401586 +vt 0.250000 0.414201 +vt 0.378377 0.352378 +vt 0.368515 0.344513 +vt 0.410084 0.213462 +vt 0.397786 0.216269 +vt 0.321244 0.102060 +vt 0.315771 0.113425 +vt 0.178756 0.102060 +vt 0.184229 0.113425 +vt 0.089916 0.213462 +vt 0.102214 0.216269 +vt 0.121623 0.352378 +vt 0.131485 0.344513 +vt 0.375000 0.275590 +vt 0.625000 0.275535 +vt 0.375000 0.275500 +vt 0.625000 0.275529 +vt 0.375000 0.276953 +vt 0.625000 0.276274 +vt 0.375000 0.275656 +vt 0.625000 0.275590 +vt 0.375000 0.275978 +vt 0.625000 0.275995 +vt 0.375000 0.276796 +vt 0.625000 0.276345 +vt 0.375000 0.277059 +vt 0.625000 0.276391 +vt 0.856398 0.502042 +vt 0.859050 0.689438 +vt 0.832459 0.689438 +vt 0.832412 0.689867 +vt 0.875000 0.500000 +vt 0.849465 0.500000 +vt 0.847674 0.502042 +vt 0.167652 0.690629 +vt 0.141088 0.690629 +vt 0.143593 0.501971 +vt 0.152318 0.501971 +vt 0.150590 0.500000 +vt 0.125000 0.500000 +vt 0.167701 0.691059 +vt 0.856398 0.502049 +vt 0.858902 0.690709 +vt 0.832340 0.690709 +vt 0.832290 0.691138 +vt 0.875000 0.500000 +vt 0.849471 0.500000 +vt 0.847676 0.502049 +vt 0.167557 0.689479 +vt 0.140957 0.689479 +vt 0.143607 0.502087 +vt 0.152330 0.502087 +vt 0.150500 0.500000 +vt 0.125000 0.500000 +vt 0.167604 0.689909 +vt 0.848726 0.500000 +vt 0.847785 0.501077 +vt 0.856517 0.501077 +vt 0.859288 0.687453 +vt 0.832575 0.687453 +vt 0.832534 0.687880 +vt 0.875000 0.500000 +vt 0.167566 0.689913 +vt 0.141000 0.689913 +vt 0.142774 0.592035 +vt 0.143377 0.500190 +vt 0.152119 0.500190 +vt 0.151953 0.500000 +vt 0.125000 0.500000 +vt 0.167616 0.690344 +vt 0.849410 0.500000 +vt 0.847690 0.501970 +vt 0.856410 0.501970 +vt 0.859085 0.689215 +vt 0.832513 0.689215 +vt 0.832463 0.689644 +vt 0.875000 0.500000 +vt 0.167672 0.690694 +vt 0.141100 0.690694 +vt 0.143580 0.501884 +vt 0.152302 0.501884 +vt 0.150656 0.500000 +vt 0.125000 0.500000 +vt 0.167720 0.691124 +vt 0.849005 0.500000 +vt 0.847746 0.501441 +vt 0.856473 0.501441 +vt 0.859141 0.688654 +vt 0.832504 0.688653 +vt 0.832460 0.689083 +vt 0.875000 0.500000 +vt 0.167612 0.690305 +vt 0.141048 0.690305 +vt 0.143529 0.501464 +vt 0.152256 0.501464 +vt 0.150978 0.500000 +vt 0.125000 0.500000 +vt 0.167662 0.690735 +vt 0.856527 0.500984 +vt 0.859066 0.689369 +vt 0.832497 0.689369 +vt 0.832447 0.689797 +vt 0.875000 0.500000 +vt 0.848655 0.500000 +vt 0.847793 0.500984 +vt 0.167396 0.688069 +vt 0.140785 0.688069 +vt 0.143402 0.500395 +vt 0.152141 0.500395 +vt 0.151796 0.500000 +vt 0.125000 0.500000 +vt 0.167443 0.688500 +vt 0.856534 0.500924 +vt 0.859303 0.687435 +vt 0.832721 0.687435 +vt 0.832672 0.687862 +vt 0.875000 0.500000 +vt 0.848609 0.500000 +vt 0.847799 0.500924 +vt 0.167534 0.689636 +vt 0.140966 0.689636 +vt 0.142767 0.590999 +vt 0.143360 0.500052 +vt 0.152104 0.500052 +vt 0.152059 0.500000 +vt 0.125000 0.500000 +vt 0.167585 0.690068 +vt 0.971926 0.953202 +vt 1.000000 0.953202 +vt 1.000000 0.953202 +vt 1.000000 0.970060 +vt 0.971926 0.970060 +vt 0.857143 0.953202 +vt 0.887565 0.953202 +vt 0.887565 0.970060 +vt 0.857143 0.970060 +vt 0.828921 0.953202 +vt 0.857143 0.953202 +vt 0.828921 0.970060 +vt 0.714286 0.953202 +vt 0.744554 0.953202 +vt 0.744554 0.970060 +vt 0.714286 0.970060 +vt 0.571429 0.970060 +vt 0.571429 0.953202 +vt 0.571429 0.953202 +vt 0.598072 0.953202 +vt 0.598072 0.970059 +vt 0.682436 0.953202 +vt 0.714286 0.953202 +vt 0.705731 0.970059 +vt 0.682436 0.970060 +vt 0.428571 0.970060 +vt 0.428571 0.953202 +vt 0.428572 0.953202 +vt 0.459688 0.953202 +vt 0.459688 0.970060 +vt 0.544050 0.953202 +vt 0.544050 0.970060 +vt 0.285714 0.953202 +vt 0.285714 0.953202 +vt 0.316448 0.953202 +vt 0.316448 0.970060 +vt 0.285714 0.970060 +vt 0.400809 0.953202 +vt 0.400809 0.970060 +vt 0.257770 0.953202 +vt 0.257770 0.970060 +vt 0.142857 0.953202 +vt 0.173403 0.953202 +vt 0.173403 0.970060 +vt 0.142857 0.970060 +vt 0.112131 0.953202 +vt 0.142857 0.953202 +vt 0.112131 0.970060 +vt 0.000000 0.953202 +vt 0.027770 0.953202 +vt 0.027770 0.970060 +vt 0.000000 0.970060 +vt 0.436509 0.398736 +vt 0.250000 0.488554 +vt 0.286652 0.470904 +vt 0.285207 0.467896 +vt 0.395397 0.414961 +vt 0.396791 0.417863 +vt 0.436509 0.398736 +vt 0.472813 0.239678 +vt 0.482573 0.196917 +vt 0.482573 0.196917 +vt 0.445609 0.358866 +vt 0.444141 0.358513 +vt 0.472731 0.239658 +vt 0.377577 0.065256 +vt 0.353505 0.035070 +vt 0.453798 0.160833 +vt 0.452533 0.161826 +vt 0.377069 0.065654 +vt 0.353505 0.035070 +vt 0.313830 0.035070 +vt 0.313831 0.037425 +vt 0.191586 0.037462 +vt 0.191586 0.035070 +vt 0.146495 0.035070 +vt 0.146495 0.035070 +vt 0.121412 0.066523 +vt 0.123927 0.068533 +vt 0.047598 0.164020 +vt 0.045194 0.162098 +vt 0.017427 0.196917 +vt 0.017427 0.196917 +vt 0.026437 0.236395 +vt 0.028158 0.236023 +vt 0.053944 0.355518 +vt 0.053641 0.355583 +vt 0.063491 0.398736 +vt 0.063491 0.398736 +vt 0.213745 0.471095 +vt 0.250000 0.488554 +vt 0.103606 0.418055 +vt 0.105057 0.415037 +vt 0.215223 0.468022 +vt 0.937420 0.533849 +vt 0.937175 0.519291 +vt 0.906575 0.519291 +vt 0.906330 0.533849 +vt 0.909393 0.538582 +vt 0.934356 0.538582 +vt 0.934358 0.657826 +vt 0.909393 0.657826 +vt 0.909392 0.736465 +vt 0.934357 0.736465 +vt 0.903108 0.657826 +vt 0.878143 0.657826 +vt 0.878142 0.736465 +vt 0.903107 0.736465 +vt 0.871858 0.657826 +vt 0.846893 0.657826 +vt 0.846892 0.736465 +vt 0.871857 0.736465 +vt 0.840608 0.657826 +vt 0.815643 0.657826 +vt 0.815642 0.736465 +vt 0.840607 0.736465 +vt 0.809358 0.657826 +vt 0.784393 0.657826 +vt 0.784392 0.736465 +vt 0.809357 0.736465 +vt 0.778108 0.657826 +vt 0.753143 0.657826 +vt 0.753142 0.736465 +vt 0.778107 0.736465 +vt 0.746858 0.657826 +vt 0.721893 0.657826 +vt 0.721892 0.736465 +vt 0.746857 0.736465 +vt 0.715608 0.657826 +vt 0.690643 0.657826 +vt 0.690642 0.736465 +vt 0.715607 0.736465 +vt 0.684358 0.657826 +vt 0.659393 0.657826 +vt 0.659392 0.736465 +vt 0.684357 0.736465 +vt 0.653108 0.657826 +vt 0.628143 0.657826 +vt 0.628142 0.736465 +vt 0.653107 0.736465 +vt 0.621858 0.657826 +vt 0.596893 0.657826 +vt 0.596892 0.736465 +vt 0.621857 0.736465 +vt 0.590608 0.657826 +vt 0.565643 0.657826 +vt 0.565642 0.736465 +vt 0.590607 0.736465 +vt 0.559358 0.657826 +vt 0.534393 0.657826 +vt 0.534392 0.736465 +vt 0.559357 0.736465 +vt 0.528108 0.657826 +vt 0.503143 0.657826 +vt 0.503142 0.736465 +vt 0.528107 0.736465 +vt 0.496858 0.657826 +vt 0.471893 0.657826 +vt 0.471892 0.736465 +vt 0.496857 0.736465 +vt 0.465608 0.657826 +vt 0.440643 0.657826 +vt 0.440642 0.736465 +vt 0.465607 0.736465 +vt 0.434358 0.657826 +vt 0.409393 0.657826 +vt 0.409392 0.736465 +vt 0.434357 0.736465 +vt 0.403108 0.657826 +vt 0.378143 0.657826 +vt 0.378142 0.736465 +vt 0.403107 0.736465 +vt 0.371858 0.657826 +vt 0.346893 0.657826 +vt 0.346892 0.736465 +vt 0.371857 0.736465 +vt 0.340608 0.657826 +vt 0.315643 0.657826 +vt 0.315642 0.736465 +vt 0.340607 0.736465 +vt 0.309358 0.657826 +vt 0.284393 0.657826 +vt 0.284392 0.736465 +vt 0.309357 0.736465 +vt 0.278108 0.657826 +vt 0.253143 0.657826 +vt 0.253142 0.736465 +vt 0.278107 0.736465 +vt 0.246858 0.657826 +vt 0.221893 0.657826 +vt 0.221892 0.736465 +vt 0.246857 0.736465 +vt 0.215608 0.657826 +vt 0.190643 0.657826 +vt 0.190642 0.736465 +vt 0.215607 0.736465 +vt 0.184358 0.657826 +vt 0.159393 0.657826 +vt 0.159392 0.736465 +vt 0.184357 0.736465 +vt 0.153108 0.657826 +vt 0.128143 0.657826 +vt 0.128142 0.736465 +vt 0.153107 0.736465 +vt 0.121858 0.657826 +vt 0.096893 0.657826 +vt 0.096892 0.736465 +vt 0.121857 0.736465 +vt 0.090608 0.657826 +vt 0.065643 0.657826 +vt 0.065642 0.736465 +vt 0.090607 0.736465 +vt 0.906170 0.533849 +vt 0.905925 0.519291 +vt 0.875325 0.519291 +vt 0.875080 0.533849 +vt 0.878143 0.538582 +vt 0.903106 0.538582 +vt 0.965608 0.657826 +vt 0.940643 0.657826 +vt 0.940642 0.736465 +vt 0.965607 0.736465 +vt 0.968670 0.533849 +vt 0.968425 0.519291 +vt 0.937825 0.519291 +vt 0.937580 0.533849 +vt 0.940643 0.538582 +vt 0.965606 0.538582 +vt 0.028106 0.538582 +vt 0.003143 0.538582 +vt 0.003143 0.630756 +vt 0.028107 0.630756 +vt 0.999675 0.519291 +vt 0.998788 0.500000 +vt 0.969962 0.500000 +vt 0.969075 0.519291 +vt 0.750000 0.471391 +vt 0.793191 0.467137 +vt 0.000080 0.966151 +vt 0.000325 0.980709 +vt 0.030925 0.980709 +vt 0.031170 0.966151 +vt 0.028106 0.961418 +vt 0.003143 0.961418 +vt 0.969075 0.980709 +vt 0.969962 1.000000 +vt 0.998788 1.000000 +vt 0.999675 0.980709 +vt 0.293191 0.467137 +vt 0.289561 0.448886 +vt 0.250000 0.452782 +vt 0.250000 0.471391 +vt 0.940643 0.630756 +vt 0.965607 0.630756 +vt 0.967538 0.500000 +vt 0.938712 0.500000 +vt 0.834722 0.454539 +vt 0.965607 0.869244 +vt 0.940643 0.869244 +vt 0.940643 0.961418 +vt 0.965606 0.961418 +vt 0.937825 0.980709 +vt 0.938712 1.000000 +vt 0.967538 1.000000 +vt 0.968425 0.980709 +vt 0.334723 0.454539 +vt 0.327601 0.437346 +vt 0.909393 0.630756 +vt 0.934357 0.630756 +vt 0.936288 0.500000 +vt 0.907461 0.500000 +vt 0.872998 0.434080 +vt 0.934357 0.869244 +vt 0.909393 0.869244 +vt 0.909393 0.961418 +vt 0.934356 0.961418 +vt 0.906575 0.980709 +vt 0.907462 1.000000 +vt 0.936288 1.000000 +vt 0.937175 0.980709 +vt 0.372998 0.434080 +vt 0.362660 0.418607 +vt 0.878143 0.630756 +vt 0.903107 0.630756 +vt 0.905038 0.500000 +vt 0.876212 0.500000 +vt 0.906547 0.406547 +vt 0.903107 0.869244 +vt 0.878143 0.869244 +vt 0.878143 0.961418 +vt 0.903106 0.961418 +vt 0.875325 0.980709 +vt 0.876212 1.000000 +vt 0.905038 1.000000 +vt 0.905925 0.980709 +vt 0.406547 0.406547 +vt 0.393388 0.393388 +vt 0.871856 0.538582 +vt 0.846893 0.538582 +vt 0.846893 0.630756 +vt 0.871857 0.630756 +vt 0.874675 0.519291 +vt 0.873788 0.500000 +vt 0.844962 0.500000 +vt 0.844075 0.519291 +vt 0.934080 0.372998 +vt 0.871857 0.869244 +vt 0.846893 0.869244 +vt 0.846893 0.961418 +vt 0.871856 0.961418 +vt 0.844075 0.980709 +vt 0.844962 1.000000 +vt 0.873788 1.000000 +vt 0.874675 0.980709 +vt 0.434080 0.372998 +vt 0.418607 0.362660 +vt 0.840606 0.538582 +vt 0.815643 0.538582 +vt 0.815643 0.630756 +vt 0.840607 0.630756 +vt 0.843425 0.519291 +vt 0.842538 0.500000 +vt 0.813712 0.500000 +vt 0.812825 0.519291 +vt 0.954539 0.334723 +vt 0.840607 0.869244 +vt 0.815643 0.869244 +vt 0.815643 0.961418 +vt 0.840606 0.961418 +vt 0.812825 0.980709 +vt 0.813712 1.000000 +vt 0.842538 1.000000 +vt 0.843425 0.980709 +vt 0.454539 0.334723 +vt 0.437346 0.327601 +vt 0.809356 0.538582 +vt 0.784393 0.538582 +vt 0.784393 0.630756 +vt 0.809357 0.630756 +vt 0.812175 0.519291 +vt 0.811288 0.500000 +vt 0.782462 0.500000 +vt 0.781575 0.519291 +vt 0.967137 0.293191 +vt 0.809357 0.869244 +vt 0.784393 0.869244 +vt 0.784393 0.961418 +vt 0.809356 0.961418 +vt 0.781575 0.980709 +vt 0.782462 1.000000 +vt 0.811288 1.000000 +vt 0.812175 0.980709 +vt 0.467137 0.293191 +vt 0.448886 0.289561 +vt 0.778106 0.538582 +vt 0.753143 0.538582 +vt 0.753143 0.630756 +vt 0.778107 0.630756 +vt 0.780925 0.519291 +vt 0.780038 0.500000 +vt 0.751211 0.500000 +vt 0.750325 0.519291 +vt 0.971391 0.250000 +vt 0.778107 0.869244 +vt 0.753143 0.869244 +vt 0.753143 0.961418 +vt 0.778106 0.961418 +vt 0.750325 0.980709 +vt 0.751212 1.000000 +vt 0.780038 1.000000 +vt 0.780925 0.980709 +vt 0.471391 0.250000 +vt 0.452782 0.250000 +vt 0.746856 0.538582 +vt 0.721893 0.538582 +vt 0.721893 0.630756 +vt 0.746857 0.630756 +vt 0.749675 0.519291 +vt 0.748788 0.500000 +vt 0.719962 0.500000 +vt 0.719075 0.519291 +vt 0.967137 0.206809 +vt 0.746857 0.869244 +vt 0.721893 0.869244 +vt 0.721893 0.961418 +vt 0.746856 0.961418 +vt 0.719075 0.980709 +vt 0.719962 1.000000 +vt 0.748788 1.000000 +vt 0.749675 0.980709 +vt 0.467137 0.206809 +vt 0.448886 0.210439 +vt 0.715606 0.538582 +vt 0.690643 0.538582 +vt 0.690643 0.630756 +vt 0.715607 0.630756 +vt 0.718425 0.519291 +vt 0.717538 0.500000 +vt 0.688712 0.500000 +vt 0.687825 0.519291 +vt 0.954539 0.165277 +vt 0.715607 0.869244 +vt 0.690643 0.869244 +vt 0.690643 0.961418 +vt 0.715606 0.961418 +vt 0.687825 0.980709 +vt 0.688712 1.000000 +vt 0.717538 1.000000 +vt 0.718425 0.980709 +vt 0.454539 0.165277 +vt 0.437346 0.172399 +vt 0.684356 0.538582 +vt 0.659393 0.538582 +vt 0.659393 0.630756 +vt 0.684357 0.630756 +vt 0.687175 0.519291 +vt 0.686288 0.500000 +vt 0.657462 0.500000 +vt 0.656575 0.519291 +vt 0.934080 0.127002 +vt 0.684357 0.869244 +vt 0.659393 0.869244 +vt 0.659393 0.961418 +vt 0.684356 0.961418 +vt 0.656575 0.980709 +vt 0.657462 1.000000 +vt 0.686288 1.000000 +vt 0.687175 0.980709 +vt 0.434080 0.127002 +vt 0.418607 0.137340 +vt 0.653106 0.538582 +vt 0.628143 0.538582 +vt 0.628143 0.630756 +vt 0.653107 0.630756 +vt 0.655925 0.519291 +vt 0.655039 0.500000 +vt 0.626212 0.500000 +vt 0.625325 0.519291 +vt 0.906547 0.093453 +vt 0.653107 0.869244 +vt 0.628143 0.869244 +vt 0.628143 0.961418 +vt 0.653106 0.961418 +vt 0.625325 0.980709 +vt 0.626212 1.000000 +vt 0.655038 1.000000 +vt 0.655925 0.980709 +vt 0.406547 0.093453 +vt 0.393389 0.106612 +vt 0.621856 0.538582 +vt 0.596893 0.538582 +vt 0.596893 0.630756 +vt 0.621857 0.630756 +vt 0.624675 0.519291 +vt 0.623788 0.500000 +vt 0.594962 0.500000 +vt 0.594075 0.519291 +vt 0.872998 0.065920 +vt 0.621857 0.869244 +vt 0.596893 0.869244 +vt 0.596893 0.961418 +vt 0.621856 0.961418 +vt 0.594075 0.980709 +vt 0.594962 1.000000 +vt 0.623788 1.000000 +vt 0.624675 0.980709 +vt 0.372998 0.065920 +vt 0.362660 0.081393 +vt 0.590606 0.538582 +vt 0.565643 0.538582 +vt 0.565643 0.630756 +vt 0.590607 0.630756 +vt 0.593425 0.519291 +vt 0.592538 0.500000 +vt 0.563712 0.500000 +vt 0.562825 0.519291 +vt 0.834723 0.045461 +vt 0.590607 0.869244 +vt 0.565643 0.869244 +vt 0.565643 0.961418 +vt 0.590606 0.961418 +vt 0.562825 0.980709 +vt 0.563712 1.000000 +vt 0.592538 1.000000 +vt 0.593425 0.980709 +vt 0.334723 0.045461 +vt 0.327601 0.062654 +vt 0.559356 0.538582 +vt 0.534393 0.538582 +vt 0.534393 0.630756 +vt 0.559357 0.630756 +vt 0.562175 0.519291 +vt 0.561288 0.500000 +vt 0.532462 0.500000 +vt 0.531575 0.519291 +vt 0.793191 0.032863 +vt 0.559357 0.869244 +vt 0.534393 0.869244 +vt 0.534393 0.961418 +vt 0.559356 0.961418 +vt 0.531575 0.980709 +vt 0.532462 1.000000 +vt 0.561289 1.000000 +vt 0.562175 0.980709 +vt 0.293191 0.032863 +vt 0.289561 0.051114 +vt 0.528106 0.538582 +vt 0.503143 0.538582 +vt 0.503143 0.630756 +vt 0.528107 0.630756 +vt 0.530925 0.519291 +vt 0.530038 0.500000 +vt 0.501212 0.500000 +vt 0.500325 0.519291 +vt 0.750000 0.028609 +vt 0.528107 0.869244 +vt 0.503143 0.869244 +vt 0.503143 0.961418 +vt 0.528106 0.961418 +vt 0.500325 0.980709 +vt 0.501212 1.000000 +vt 0.530038 1.000000 +vt 0.530925 0.980709 +vt 0.250000 0.028609 +vt 0.250000 0.047218 +vt 0.496856 0.538582 +vt 0.471893 0.538582 +vt 0.471893 0.630756 +vt 0.496857 0.630756 +vt 0.499675 0.519291 +vt 0.498788 0.500000 +vt 0.469962 0.500000 +vt 0.469075 0.519291 +vt 0.706809 0.032863 +vt 0.496857 0.869244 +vt 0.471893 0.869244 +vt 0.471893 0.961418 +vt 0.496856 0.961418 +vt 0.469075 0.980709 +vt 0.469962 1.000000 +vt 0.498789 1.000000 +vt 0.499675 0.980709 +vt 0.206809 0.032863 +vt 0.210439 0.051114 +vt 0.465606 0.538582 +vt 0.440643 0.538582 +vt 0.440643 0.630756 +vt 0.465607 0.630756 +vt 0.468425 0.519291 +vt 0.467538 0.500000 +vt 0.438712 0.500000 +vt 0.437825 0.519291 +vt 0.665277 0.045461 +vt 0.465607 0.869244 +vt 0.440643 0.869244 +vt 0.440643 0.961418 +vt 0.465606 0.961418 +vt 0.437825 0.980709 +vt 0.438712 1.000000 +vt 0.467538 1.000000 +vt 0.468425 0.980709 +vt 0.165277 0.045461 +vt 0.172399 0.062654 +vt 0.434356 0.538582 +vt 0.409393 0.538582 +vt 0.409393 0.630756 +vt 0.434357 0.630756 +vt 0.437175 0.519291 +vt 0.436288 0.500000 +vt 0.407461 0.500000 +vt 0.406575 0.519291 +vt 0.627002 0.065920 +vt 0.434357 0.869244 +vt 0.409393 0.869244 +vt 0.409393 0.961418 +vt 0.434356 0.961418 +vt 0.406575 0.980709 +vt 0.407462 1.000000 +vt 0.436289 1.000000 +vt 0.437175 0.980709 +vt 0.127002 0.065920 +vt 0.137340 0.081393 +vt 0.403106 0.538582 +vt 0.378143 0.538582 +vt 0.378143 0.630756 +vt 0.403107 0.630756 +vt 0.405925 0.519291 +vt 0.405038 0.500000 +vt 0.376212 0.500000 +vt 0.375325 0.519291 +vt 0.593453 0.093453 +vt 0.403107 0.869244 +vt 0.378143 0.869244 +vt 0.378143 0.961418 +vt 0.403106 0.961418 +vt 0.375325 0.980709 +vt 0.376212 1.000000 +vt 0.405038 1.000000 +vt 0.405925 0.980709 +vt 0.093453 0.093453 +vt 0.106611 0.106612 +vt 0.371856 0.538582 +vt 0.346893 0.538582 +vt 0.346893 0.630756 +vt 0.371857 0.630756 +vt 0.374675 0.519291 +vt 0.373788 0.500000 +vt 0.344962 0.500000 +vt 0.344075 0.519291 +vt 0.565920 0.127002 +vt 0.371857 0.869244 +vt 0.346893 0.869244 +vt 0.346893 0.961418 +vt 0.371856 0.961418 +vt 0.344075 0.980709 +vt 0.344962 1.000000 +vt 0.373788 1.000000 +vt 0.374675 0.980709 +vt 0.065920 0.127002 +vt 0.081393 0.137341 +vt 0.340606 0.538582 +vt 0.315643 0.538582 +vt 0.315643 0.630756 +vt 0.340607 0.630756 +vt 0.343425 0.519291 +vt 0.342539 0.500000 +vt 0.313711 0.500000 +vt 0.312825 0.519291 +vt 0.545461 0.165278 +vt 0.340607 0.869244 +vt 0.315643 0.869244 +vt 0.315643 0.961418 +vt 0.340606 0.961418 +vt 0.312825 0.980709 +vt 0.313712 1.000000 +vt 0.342539 1.000000 +vt 0.343425 0.980709 +vt 0.045461 0.165278 +vt 0.062654 0.172399 +vt 0.309356 0.538582 +vt 0.284393 0.538582 +vt 0.284393 0.630756 +vt 0.309357 0.630756 +vt 0.312175 0.519291 +vt 0.311288 0.500000 +vt 0.282462 0.500000 +vt 0.281575 0.519291 +vt 0.532863 0.206809 +vt 0.309357 0.869244 +vt 0.284393 0.869244 +vt 0.284393 0.961418 +vt 0.309356 0.961418 +vt 0.281575 0.980709 +vt 0.282462 1.000000 +vt 0.311288 1.000000 +vt 0.312175 0.980709 +vt 0.032863 0.206809 +vt 0.051114 0.210439 +vt 0.278106 0.538582 +vt 0.253143 0.538582 +vt 0.253143 0.630756 +vt 0.278107 0.630756 +vt 0.280925 0.519291 +vt 0.280038 0.500000 +vt 0.251212 0.500000 +vt 0.250325 0.519291 +vt 0.528609 0.250000 +vt 0.278107 0.869244 +vt 0.253143 0.869244 +vt 0.253143 0.961418 +vt 0.278106 0.961418 +vt 0.250325 0.980709 +vt 0.251212 1.000000 +vt 0.280038 1.000000 +vt 0.280925 0.980709 +vt 0.028609 0.250000 +vt 0.047218 0.250000 +vt 0.246856 0.538582 +vt 0.221893 0.538582 +vt 0.221893 0.630756 +vt 0.246857 0.630756 +vt 0.249675 0.519291 +vt 0.248788 0.500000 +vt 0.219962 0.500000 +vt 0.219075 0.519291 +vt 0.532863 0.293191 +vt 0.246857 0.869244 +vt 0.221893 0.869244 +vt 0.221893 0.961418 +vt 0.246856 0.961418 +vt 0.219075 0.980709 +vt 0.219962 1.000000 +vt 0.248788 1.000000 +vt 0.249675 0.980709 +vt 0.032863 0.293191 +vt 0.051115 0.289561 +vt 0.215606 0.538582 +vt 0.190643 0.538582 +vt 0.190643 0.630756 +vt 0.215607 0.630756 +vt 0.218425 0.519291 +vt 0.217538 0.500000 +vt 0.188712 0.500000 +vt 0.187825 0.519291 +vt 0.545462 0.334723 +vt 0.215607 0.869244 +vt 0.190643 0.869244 +vt 0.190643 0.961418 +vt 0.215606 0.961418 +vt 0.187825 0.980709 +vt 0.188712 1.000000 +vt 0.217538 1.000000 +vt 0.218425 0.980709 +vt 0.045462 0.334723 +vt 0.062654 0.327601 +vt 0.184356 0.538582 +vt 0.159393 0.538582 +vt 0.159393 0.630756 +vt 0.184357 0.630756 +vt 0.187175 0.519291 +vt 0.186288 0.500000 +vt 0.157462 0.500000 +vt 0.156575 0.519291 +vt 0.565920 0.372998 +vt 0.184357 0.869244 +vt 0.159393 0.869244 +vt 0.159393 0.961418 +vt 0.184356 0.961418 +vt 0.156575 0.980709 +vt 0.157462 1.000000 +vt 0.186288 1.000000 +vt 0.187175 0.980709 +vt 0.065920 0.372998 +vt 0.081393 0.362660 +vt 0.153106 0.538582 +vt 0.128143 0.538582 +vt 0.128143 0.630756 +vt 0.153107 0.630756 +vt 0.155925 0.519291 +vt 0.155038 0.500000 +vt 0.126212 0.500000 +vt 0.125325 0.519291 +vt 0.593453 0.406547 +vt 0.153107 0.869244 +vt 0.128143 0.869244 +vt 0.128143 0.961418 +vt 0.153106 0.961418 +vt 0.125325 0.980709 +vt 0.126212 1.000000 +vt 0.155038 1.000000 +vt 0.155925 0.980709 +vt 0.093453 0.406547 +vt 0.106612 0.393389 +vt 0.121856 0.538582 +vt 0.096893 0.538582 +vt 0.096893 0.630756 +vt 0.121857 0.630756 +vt 0.124675 0.519291 +vt 0.123788 0.500000 +vt 0.094962 0.500000 +vt 0.094075 0.519291 +vt 0.627002 0.434080 +vt 0.121857 0.869244 +vt 0.096893 0.869244 +vt 0.096893 0.961418 +vt 0.121856 0.961418 +vt 0.094075 0.980709 +vt 0.094962 1.000000 +vt 0.123788 1.000000 +vt 0.124675 0.980709 +vt 0.127002 0.434080 +vt 0.137341 0.418607 +vt 0.090606 0.538582 +vt 0.065643 0.538582 +vt 0.065643 0.630756 +vt 0.090607 0.630756 +vt 0.093425 0.519291 +vt 0.092538 0.500000 +vt 0.063712 0.500000 +vt 0.062825 0.519291 +vt 0.665278 0.454539 +vt 0.090607 0.869244 +vt 0.065643 0.869244 +vt 0.065643 0.961418 +vt 0.090606 0.961418 +vt 0.062825 0.980709 +vt 0.063712 1.000000 +vt 0.092538 1.000000 +vt 0.093425 0.980709 +vt 0.165278 0.454539 +vt 0.172399 0.437346 +vt 0.059356 0.538582 +vt 0.034393 0.538582 +vt 0.034393 0.630756 +vt 0.059357 0.630756 +vt 0.062175 0.519291 +vt 0.061288 0.500000 +vt 0.032462 0.500000 +vt 0.031575 0.519291 +vt 0.706809 0.467137 +vt 0.059357 0.869244 +vt 0.034393 0.869244 +vt 0.034393 0.961418 +vt 0.059356 0.961418 +vt 0.031575 0.980709 +vt 0.032462 1.000000 +vt 0.061288 1.000000 +vt 0.062175 0.980709 +vt 0.206809 0.467137 +vt 0.210440 0.448886 +vt 0.999920 0.533849 +vt 0.968830 0.533849 +vt 0.971893 0.538582 +vt 0.996856 0.538582 +vt 0.030925 0.519291 +vt 0.030038 0.500000 +vt 0.001212 0.500000 +vt 0.000325 0.519291 +vt 0.028107 0.869244 +vt 0.003143 0.869244 +vt 0.001212 1.000000 +vt 0.030038 1.000000 +vt 0.996857 0.763535 +vt 0.971892 0.763535 +vt 0.971893 0.842174 +vt 0.996858 0.842174 +vt 0.996857 0.869244 +vt 0.971893 0.869244 +vt 0.971893 0.961418 +vt 0.996856 0.961418 +vt 0.968830 0.966151 +vt 0.999920 0.966151 +vt 0.031330 0.966151 +vt 0.062420 0.966151 +vt 0.937580 0.966151 +vt 0.968670 0.966151 +vt 0.059358 0.657826 +vt 0.034393 0.657826 +vt 0.034392 0.736465 +vt 0.059357 0.736465 +vt 0.059357 0.763535 +vt 0.034392 0.763535 +vt 0.034393 0.842174 +vt 0.059358 0.842174 +vt 0.934357 0.763535 +vt 0.909392 0.763535 +vt 0.909393 0.842174 +vt 0.934358 0.842174 +vt 0.934333 0.644291 +vt 0.909417 0.644291 +vt 0.028083 0.855709 +vt 0.028108 0.842174 +vt 0.003143 0.842174 +vt 0.003167 0.855709 +vt 0.062580 0.966151 +vt 0.093670 0.966151 +vt 0.812500 0.630756 +vt 0.812500 0.538582 +vt 0.062420 0.533849 +vt 0.031330 0.533849 +vt 0.093830 0.966151 +vt 0.124920 0.966151 +vt 0.090607 0.763535 +vt 0.065642 0.763535 +vt 0.065643 0.842174 +vt 0.090608 0.842174 +vt 0.093670 0.533849 +vt 0.062580 0.533849 +vt 0.125080 0.966151 +vt 0.156170 0.966151 +vt 0.121857 0.763535 +vt 0.096892 0.763535 +vt 0.096893 0.842174 +vt 0.121858 0.842174 +vt 0.124920 0.533849 +vt 0.093830 0.533849 +vt 0.156330 0.966151 +vt 0.187420 0.966151 +vt 0.153107 0.763535 +vt 0.128142 0.763535 +vt 0.128143 0.842174 +vt 0.153108 0.842174 +vt 0.156170 0.533849 +vt 0.125080 0.533849 +vt 0.187580 0.966151 +vt 0.218670 0.966151 +vt 0.184357 0.763535 +vt 0.159392 0.763535 +vt 0.159393 0.842174 +vt 0.184358 0.842174 +vt 0.187420 0.533849 +vt 0.156330 0.533849 +vt 0.218830 0.966151 +vt 0.249920 0.966151 +vt 0.215607 0.763535 +vt 0.190642 0.763535 +vt 0.190643 0.842174 +vt 0.215608 0.842174 +vt 0.218670 0.533849 +vt 0.187580 0.533849 +vt 0.250080 0.966151 +vt 0.281170 0.966151 +vt 0.246857 0.763535 +vt 0.221892 0.763535 +vt 0.221893 0.842174 +vt 0.246858 0.842174 +vt 0.249920 0.533849 +vt 0.218830 0.533849 +vt 0.281330 0.966151 +vt 0.312420 0.966151 +vt 0.278107 0.763535 +vt 0.253142 0.763535 +vt 0.253143 0.842174 +vt 0.278108 0.842174 +vt 0.281170 0.533849 +vt 0.250080 0.533849 +vt 0.312580 0.966151 +vt 0.343670 0.966151 +vt 0.309357 0.763535 +vt 0.284392 0.763535 +vt 0.284393 0.842174 +vt 0.309358 0.842174 +vt 0.312420 0.533849 +vt 0.281330 0.533849 +vt 0.343830 0.966151 +vt 0.374920 0.966151 +vt 0.340607 0.763535 +vt 0.315642 0.763535 +vt 0.315643 0.842174 +vt 0.340608 0.842174 +vt 0.343670 0.533849 +vt 0.312580 0.533849 +vt 0.375080 0.966151 +vt 0.406170 0.966151 +vt 0.371857 0.763535 +vt 0.346892 0.763535 +vt 0.346893 0.842174 +vt 0.371858 0.842174 +vt 0.374920 0.533849 +vt 0.343830 0.533849 +vt 0.406330 0.966151 +vt 0.437420 0.966151 +vt 0.403107 0.763535 +vt 0.378142 0.763535 +vt 0.378143 0.842174 +vt 0.403108 0.842174 +vt 0.406170 0.533849 +vt 0.375080 0.533849 +vt 0.437580 0.966151 +vt 0.468670 0.966151 +vt 0.434357 0.763535 +vt 0.409392 0.763535 +vt 0.409393 0.842174 +vt 0.434358 0.842174 +vt 0.437420 0.533849 +vt 0.406330 0.533849 +vt 0.468830 0.966151 +vt 0.499920 0.966151 +vt 0.465607 0.763535 +vt 0.440642 0.763535 +vt 0.440643 0.842174 +vt 0.465608 0.842174 +vt 0.468670 0.533849 +vt 0.437580 0.533849 +vt 0.500080 0.966151 +vt 0.531170 0.966151 +vt 0.496857 0.763535 +vt 0.471892 0.763535 +vt 0.471893 0.842174 +vt 0.496858 0.842174 +vt 0.499920 0.533849 +vt 0.468830 0.533849 +vt 0.531330 0.966151 +vt 0.562420 0.966151 +vt 0.528107 0.763535 +vt 0.503142 0.763535 +vt 0.503143 0.842174 +vt 0.528108 0.842174 +vt 0.531170 0.533849 +vt 0.500080 0.533849 +vt 0.562580 0.966151 +vt 0.593670 0.966151 +vt 0.559357 0.763535 +vt 0.534392 0.763535 +vt 0.534393 0.842174 +vt 0.559358 0.842174 +vt 0.562420 0.533849 +vt 0.531330 0.533849 +vt 0.593830 0.966151 +vt 0.624920 0.966151 +vt 0.590607 0.763535 +vt 0.565642 0.763535 +vt 0.565643 0.842174 +vt 0.590608 0.842174 +vt 0.593670 0.533849 +vt 0.562580 0.533849 +vt 0.625080 0.966151 +vt 0.656170 0.966151 +vt 0.621857 0.763535 +vt 0.596892 0.763535 +vt 0.596893 0.842174 +vt 0.621858 0.842174 +vt 0.624920 0.533849 +vt 0.593830 0.533849 +vt 0.656330 0.966151 +vt 0.687420 0.966151 +vt 0.653107 0.763535 +vt 0.628142 0.763535 +vt 0.628143 0.842174 +vt 0.653108 0.842174 +vt 0.656170 0.533849 +vt 0.625080 0.533849 +vt 0.687580 0.966151 +vt 0.718670 0.966151 +vt 0.684357 0.763535 +vt 0.659392 0.763535 +vt 0.659393 0.842174 +vt 0.684358 0.842174 +vt 0.687420 0.533849 +vt 0.656330 0.533849 +vt 0.718830 0.966151 +vt 0.749920 0.966151 +vt 0.715607 0.763535 +vt 0.690642 0.763535 +vt 0.690643 0.842174 +vt 0.715608 0.842174 +vt 0.718670 0.533849 +vt 0.687580 0.533849 +vt 0.750080 0.966151 +vt 0.781170 0.966151 +vt 0.746857 0.763535 +vt 0.721892 0.763535 +vt 0.721893 0.842174 +vt 0.746858 0.842174 +vt 0.749920 0.533849 +vt 0.718830 0.533849 +vt 0.781330 0.966151 +vt 0.812420 0.966151 +vt 0.778107 0.763535 +vt 0.753142 0.763535 +vt 0.753143 0.842174 +vt 0.778108 0.842174 +vt 0.781170 0.533849 +vt 0.750080 0.533849 +vt 0.812580 0.966151 +vt 0.843670 0.966151 +vt 0.809357 0.763535 +vt 0.784392 0.763535 +vt 0.784393 0.842174 +vt 0.809358 0.842174 +vt 0.812420 0.533849 +vt 0.781330 0.533849 +vt 0.843830 0.966151 +vt 0.874920 0.966151 +vt 0.840607 0.763535 +vt 0.815642 0.763535 +vt 0.815643 0.842174 +vt 0.840608 0.842174 +vt 0.843670 0.533849 +vt 0.812580 0.533849 +vt 0.875080 0.966151 +vt 0.906170 0.966151 +vt 0.871857 0.763535 +vt 0.846892 0.763535 +vt 0.846893 0.842174 +vt 0.871858 0.842174 +vt 0.874920 0.533849 +vt 0.843830 0.533849 +vt 0.906330 0.966151 +vt 0.937420 0.966151 +vt 0.903107 0.763535 +vt 0.878142 0.763535 +vt 0.878143 0.842174 +vt 0.903108 0.842174 +vt 0.028108 0.657826 +vt 0.003143 0.657826 +vt 0.003142 0.736465 +vt 0.028107 0.736465 +vt 0.965607 0.763535 +vt 0.940642 0.763535 +vt 0.940643 0.842174 +vt 0.965608 0.842174 +vt 0.028107 0.763535 +vt 0.003142 0.763535 +vt 0.903083 0.750000 +vt 0.878166 0.750000 +vt 0.934333 0.855709 +vt 0.909417 0.855709 +vt 0.996858 0.657826 +vt 0.971893 0.657826 +vt 0.971892 0.736465 +vt 0.996857 0.736465 +vt 0.996833 0.644291 +vt 0.971917 0.644291 +vt 0.996833 0.750000 +vt 0.971916 0.750000 +vt 0.996833 0.855709 +vt 0.971917 0.855709 +vt 0.965583 0.644291 +vt 0.940667 0.644291 +vt 0.028083 0.750000 +vt 0.003166 0.750000 +vt 0.965583 0.855709 +vt 0.940667 0.855709 +vt 0.090583 0.644291 +vt 0.065667 0.644291 +vt 0.090583 0.855709 +vt 0.065667 0.855709 +vt 0.121833 0.750000 +vt 0.096916 0.750000 +vt 0.153083 0.644291 +vt 0.128167 0.644291 +vt 0.121833 0.855709 +vt 0.096917 0.855709 +vt 0.153083 0.750000 +vt 0.128166 0.750000 +vt 0.184333 0.855709 +vt 0.159417 0.855709 +vt 0.184333 0.644291 +vt 0.159417 0.644291 +vt 0.215583 0.750000 +vt 0.190666 0.750000 +vt 0.246833 0.644291 +vt 0.221917 0.644291 +vt 0.246833 0.855709 +vt 0.221917 0.855709 +vt 0.278083 0.750000 +vt 0.253166 0.750000 +vt 0.309333 0.644291 +vt 0.284417 0.644291 +vt 0.309333 0.855709 +vt 0.284417 0.855709 +vt 0.340583 0.750000 +vt 0.315666 0.750000 +vt 0.371833 0.644291 +vt 0.346917 0.644291 +vt 0.340583 0.855709 +vt 0.315667 0.855709 +vt 0.371833 0.750000 +vt 0.346916 0.750000 +vt 0.403083 0.855709 +vt 0.378167 0.855709 +vt 0.403083 0.644291 +vt 0.378167 0.644291 +vt 0.434333 0.750000 +vt 0.409416 0.750000 +vt 0.465583 0.644291 +vt 0.440667 0.644291 +vt 0.465583 0.855709 +vt 0.440667 0.855709 +vt 0.496833 0.750000 +vt 0.471916 0.750000 +vt 0.528083 0.644291 +vt 0.503167 0.644291 +vt 0.528083 0.855709 +vt 0.503167 0.855709 +vt 0.559333 0.750000 +vt 0.534416 0.750000 +vt 0.590583 0.644291 +vt 0.565667 0.644291 +vt 0.559333 0.855709 +vt 0.534417 0.855709 +vt 0.590583 0.750000 +vt 0.565666 0.750000 +vt 0.621833 0.855709 +vt 0.596917 0.855709 +vt 0.621833 0.644291 +vt 0.596917 0.644291 +vt 0.653083 0.750000 +vt 0.628166 0.750000 +vt 0.684333 0.644291 +vt 0.659417 0.644291 +vt 0.684333 0.855709 +vt 0.659417 0.855709 +vt 0.715583 0.750000 +vt 0.690666 0.750000 +vt 0.746833 0.644291 +vt 0.721917 0.644291 +vt 0.746833 0.855709 +vt 0.721917 0.855709 +vt 0.778083 0.750000 +vt 0.753166 0.750000 +vt 0.809333 0.644291 +vt 0.784417 0.644291 +vt 0.778083 0.855709 +vt 0.753167 0.855709 +vt 0.809333 0.750000 +vt 0.784416 0.750000 +vt 0.840583 0.855709 +vt 0.815667 0.855709 +vt 0.840583 0.644291 +vt 0.815667 0.644291 +vt 0.871833 0.750000 +vt 0.846916 0.750000 +vt 0.903083 0.644291 +vt 0.878167 0.644291 +vt 0.934333 0.750000 +vt 0.909416 0.750000 +vt 0.903083 0.855709 +vt 0.878167 0.855709 +vt 0.059333 0.644291 +vt 0.034417 0.644291 +vt 0.965583 0.750000 +vt 0.940666 0.750000 +vt 0.059333 0.855709 +vt 0.034417 0.855709 +vt 0.971893 0.630756 +vt 0.996857 0.630756 +vt 0.871833 0.855709 +vt 0.846917 0.855709 +vt 0.809333 0.855709 +vt 0.784417 0.855709 +vt 0.715583 0.855709 +vt 0.690667 0.855709 +vt 0.653083 0.855709 +vt 0.628167 0.855709 +vt 0.590583 0.855709 +vt 0.565667 0.855709 +vt 0.496833 0.855709 +vt 0.471917 0.855709 +vt 0.434333 0.855709 +vt 0.409417 0.855709 +vt 0.371833 0.855709 +vt 0.346917 0.855709 +vt 0.278083 0.855709 +vt 0.253167 0.855709 +vt 0.215583 0.855709 +vt 0.190667 0.855709 +vt 0.153083 0.855709 +vt 0.128167 0.855709 +vt 0.059333 0.750000 +vt 0.034416 0.750000 +vt 0.840583 0.750000 +vt 0.815666 0.750000 +vt 0.746833 0.750000 +vt 0.721916 0.750000 +vt 0.684333 0.750000 +vt 0.659416 0.750000 +vt 0.621833 0.750000 +vt 0.596916 0.750000 +vt 0.528083 0.750000 +vt 0.503166 0.750000 +vt 0.465583 0.750000 +vt 0.440666 0.750000 +vt 0.403083 0.750000 +vt 0.378166 0.750000 +vt 0.309333 0.750000 +vt 0.284416 0.750000 +vt 0.246833 0.750000 +vt 0.221916 0.750000 +vt 0.184333 0.750000 +vt 0.159416 0.750000 +vt 0.090583 0.750000 +vt 0.065666 0.750000 +vt 0.028083 0.644291 +vt 0.003167 0.644291 +vt 0.871833 0.644291 +vt 0.846917 0.644291 +vt 0.778083 0.644291 +vt 0.753167 0.644291 +vt 0.715583 0.644291 +vt 0.690667 0.644291 +vt 0.653083 0.644291 +vt 0.628167 0.644291 +vt 0.559333 0.644291 +vt 0.534417 0.644291 +vt 0.496833 0.644291 +vt 0.471917 0.644291 +vt 0.434333 0.644291 +vt 0.409417 0.644291 +vt 0.340583 0.644291 +vt 0.315667 0.644291 +vt 0.278083 0.644291 +vt 0.253167 0.644291 +vt 0.215583 0.644291 +vt 0.190667 0.644291 +vt 0.121833 0.644291 +vt 0.096917 0.644291 +vt 0.000080 0.533849 +vt 0.000002 0.538461 +vt 0.001573 0.538522 +vt -0.003083 0.961658 +vt 0.000030 0.961538 +vt 0.968771 0.538582 +vt 0.971816 0.961418 +vt 0.968711 0.961418 +vt 0.937521 0.538582 +vt 0.937461 0.961418 +vt 0.906271 0.538582 +vt 0.909316 0.961418 +vt 0.906211 0.961418 +vt 0.875021 0.538582 +vt 0.874961 0.961418 +vt 0.843771 0.538582 +vt 0.846816 0.961418 +vt 0.843711 0.961418 +vt 0.812461 0.961418 +vt 0.781271 0.538582 +vt 0.784316 0.961418 +vt 0.781211 0.961418 +vt 0.750021 0.538582 +vt 0.749961 0.961418 +vt 0.718771 0.538582 +vt 0.721816 0.961418 +vt 0.718711 0.961418 +vt 0.687521 0.538582 +vt 0.687461 0.961418 +vt 0.656271 0.538582 +vt 0.659316 0.961418 +vt 0.656211 0.961418 +vt 0.625021 0.538582 +vt 0.624961 0.961418 +vt 0.593771 0.538582 +vt 0.596816 0.961418 +vt 0.593711 0.961418 +vt 0.562521 0.538582 +vt 0.562461 0.961418 +vt 0.531271 0.538582 +vt 0.534316 0.961418 +vt 0.531211 0.961418 +vt 0.500011 0.538582 +vt 0.499980 0.961418 +vt 0.468771 0.538582 +vt 0.471816 0.961418 +vt 0.468711 0.961418 +vt 0.437521 0.538582 +vt 0.437461 0.961418 +vt 0.406271 0.538582 +vt 0.409316 0.961418 +vt 0.406211 0.961418 +vt 0.375021 0.538582 +vt 0.374961 0.961418 +vt 0.343771 0.538582 +vt 0.346816 0.961418 +vt 0.343711 0.961418 +vt 0.312521 0.538582 +vt 0.312461 0.961418 +vt 0.281271 0.538582 +vt 0.284316 0.961418 +vt 0.281211 0.961418 +vt 0.250021 0.538582 +vt 0.249961 0.961418 +vt 0.218771 0.538582 +vt 0.221816 0.961418 +vt 0.218711 0.961418 +vt 0.187521 0.538582 +vt 0.187461 0.961418 +vt 0.156271 0.538582 +vt 0.159316 0.961418 +vt 0.156211 0.961418 +vt 0.125021 0.538582 +vt 0.124961 0.961418 +vt 0.093771 0.538582 +vt 0.096816 0.961418 +vt 0.093711 0.961418 +vt 0.062521 0.538582 +vt 0.062461 0.961418 +vt 0.031170 0.533849 +vt 0.031271 0.538582 +vt 0.034316 0.961418 +vt 0.031211 0.961418 +vt 0.906250 0.630756 +vt 0.906250 0.644291 +vt 0.687500 0.630756 +vt 0.687500 0.644291 +vt 0.468750 0.630756 +vt 0.468750 0.644291 +vt 0.250000 0.630756 +vt 0.250000 0.644291 +vt 0.062500 0.630756 +vt 0.062500 0.644291 +vt 0.718750 0.736465 +vt 0.718750 0.750000 +vt 0.500000 0.736465 +vt 0.500000 0.750000 +vt 0.281250 0.736465 +vt 0.281250 0.750000 +vt 0.031250 0.763535 +vt 0.031250 0.750000 +vt 0.750000 0.842174 +vt 0.750000 0.855709 +vt 0.531250 0.842174 +vt 0.531250 0.855709 +vt 0.312500 0.842174 +vt 0.312500 0.855709 +vt 0.093750 0.842174 +vt 0.093750 0.855709 +vt 0.001571 0.842212 +vt 0.000000 0.842251 +vt 0.000000 0.855709 +vt 0.001584 0.855709 +vt 0.843750 0.630756 +vt 0.843750 0.644291 +vt 0.812500 0.644291 +vt 0.750000 0.630756 +vt 0.750000 0.644291 +vt 0.625000 0.630756 +vt 0.625000 0.644291 +vt 0.593750 0.630756 +vt 0.593750 0.644291 +vt 0.531250 0.630756 +vt 0.531250 0.644291 +vt 0.406250 0.630756 +vt 0.406250 0.644291 +vt 0.375000 0.630756 +vt 0.375000 0.644291 +vt 0.312500 0.630756 +vt 0.312500 0.644291 +vt 0.187500 0.630756 +vt 0.187500 0.644291 +vt 0.156250 0.630756 +vt 0.156250 0.644291 +vt 0.093750 0.630756 +vt 0.093750 0.644291 +vt 0.968750 0.657826 +vt 0.968750 0.644291 +vt 0.001572 0.630786 +vt 0.000000 0.630817 +vt 0.000000 0.644291 +vt 0.001584 0.644291 +vt 0.875000 0.736465 +vt 0.875000 0.750000 +vt 0.843750 0.736465 +vt 0.843750 0.750000 +vt 0.781250 0.736465 +vt 0.781250 0.750000 +vt 0.656250 0.736465 +vt 0.656250 0.750000 +vt 0.625000 0.736465 +vt 0.625000 0.750000 +vt 0.562500 0.736465 +vt 0.562500 0.750000 +vt 0.437500 0.736465 +vt 0.437500 0.750000 +vt 0.406250 0.736465 +vt 0.406250 0.750000 +vt 0.343750 0.736465 +vt 0.343750 0.750000 +vt 0.218750 0.736465 +vt 0.218750 0.750000 +vt 0.187500 0.736465 +vt 0.187500 0.750000 +vt 0.125000 0.736465 +vt 0.125000 0.750000 +vt 0.937500 0.763535 +vt 0.937500 0.750000 +vt 0.968750 0.763535 +vt 0.968750 0.750000 +vt 0.906250 0.842174 +vt 0.906250 0.855709 +vt 0.875000 0.842174 +vt 0.875000 0.855709 +vt 0.812500 0.842174 +vt 0.812500 0.855709 +vt 0.687500 0.842174 +vt 0.687500 0.855709 +vt 0.656250 0.842174 +vt 0.656250 0.855709 +vt 0.593750 0.842174 +vt 0.593750 0.855709 +vt 0.468750 0.842174 +vt 0.468750 0.855709 +vt 0.437500 0.842174 +vt 0.437500 0.855709 +vt 0.375000 0.842174 +vt 0.375000 0.855709 +vt 0.250000 0.842174 +vt 0.250000 0.855709 +vt 0.218750 0.842174 +vt 0.218750 0.855709 +vt 0.156250 0.842174 +vt 0.156250 0.855709 +vt 0.062500 0.842174 +vt 0.062500 0.855709 +vt 0.937500 0.869244 +vt 0.937500 0.855709 +vt 0.968750 0.869244 +vt 0.968750 0.855709 +vt 0.031250 0.869244 +vt 0.031250 0.855709 +vt 0.125000 0.842174 +vt 0.125000 0.855709 +vt 0.187500 0.842174 +vt 0.187500 0.855709 +vt 0.281250 0.842174 +vt 0.281250 0.855709 +vt 0.343750 0.842174 +vt 0.343750 0.855709 +vt 0.406250 0.842174 +vt 0.406250 0.855709 +vt 0.500000 0.842174 +vt 0.500000 0.855709 +vt 0.562500 0.842174 +vt 0.562500 0.855709 +vt 0.625000 0.842174 +vt 0.625000 0.855709 +vt 0.718750 0.842174 +vt 0.718750 0.855709 +vt 0.781250 0.842174 +vt 0.781250 0.855709 +vt 0.843750 0.842174 +vt 0.843750 0.855709 +vt 0.001571 0.736499 +vt 0.000000 0.736533 +vt 0.000000 0.750000 +vt 0.001583 0.750000 +vt 0.062500 0.736465 +vt 0.062500 0.750000 +vt 0.093750 0.736465 +vt 0.093750 0.750000 +vt 0.156250 0.736465 +vt 0.156250 0.750000 +vt 0.250000 0.736465 +vt 0.250000 0.750000 +vt 0.312500 0.736465 +vt 0.312500 0.750000 +vt 0.375000 0.736465 +vt 0.375000 0.750000 +vt 0.468750 0.736465 +vt 0.468750 0.750000 +vt 0.531250 0.736465 +vt 0.531250 0.750000 +vt 0.593750 0.736465 +vt 0.593750 0.750000 +vt 0.687500 0.736465 +vt 0.687500 0.750000 +vt 0.750000 0.736465 +vt 0.750000 0.750000 +vt 0.812500 0.736465 +vt 0.812500 0.750000 +vt 0.906250 0.736465 +vt 0.906250 0.750000 +vt 0.937500 0.657826 +vt 0.937500 0.644291 +vt 0.031250 0.657826 +vt 0.031250 0.644291 +vt 0.125000 0.630756 +vt 0.125000 0.644291 +vt 0.218750 0.630756 +vt 0.218750 0.644291 +vt 0.281250 0.630756 +vt 0.281250 0.644291 +vt 0.343750 0.630756 +vt 0.343750 0.644291 +vt 0.437500 0.630756 +vt 0.437500 0.644291 +vt 0.500000 0.630756 +vt 0.500000 0.644291 +vt 0.562500 0.630756 +vt 0.562500 0.644291 +vt 0.656250 0.630756 +vt 0.656250 0.644291 +vt 0.718750 0.630756 +vt 0.718750 0.644291 +vt 0.781250 0.630756 +vt 0.781250 0.644291 +vt 0.875000 0.630756 +vt 0.875000 0.644291 +vt 0.000000 0.657749 +vt 0.001571 0.657788 +vt 0.968750 0.630756 +vt 0.000000 0.763467 +vt 0.001571 0.763501 +vt 0.968750 0.736465 +vt 0.000000 0.869183 +vt 0.001572 0.869214 +vt 0.968750 0.842174 +vt 0.937500 0.630756 +vt 0.937500 0.736465 +vt 0.937500 0.842174 +vt 0.062500 0.657826 +vt 0.031250 0.630756 +vt 0.062500 0.763535 +vt 0.031250 0.736465 +vt 0.062500 0.869244 +vt 0.031250 0.842174 +vt 0.093750 0.657826 +vt 0.093750 0.763535 +vt 0.093750 0.869244 +vt 0.125000 0.657826 +vt 0.125000 0.763535 +vt 0.125000 0.869244 +vt 0.156250 0.657826 +vt 0.156250 0.763535 +vt 0.156250 0.869244 +vt 0.187500 0.657826 +vt 0.187500 0.763535 +vt 0.187500 0.869244 +vt 0.218750 0.657826 +vt 0.218750 0.763535 +vt 0.218750 0.869244 +vt 0.250000 0.657826 +vt 0.250000 0.763535 +vt 0.250000 0.869244 +vt 0.281250 0.657826 +vt 0.281250 0.763535 +vt 0.281250 0.869244 +vt 0.312500 0.657826 +vt 0.312500 0.763535 +vt 0.312500 0.869244 +vt 0.343750 0.657826 +vt 0.343750 0.763535 +vt 0.343750 0.869244 +vt 0.375000 0.657826 +vt 0.375000 0.763535 +vt 0.375000 0.869244 +vt 0.406250 0.657826 +vt 0.406250 0.763535 +vt 0.406250 0.869244 +vt 0.437500 0.657826 +vt 0.437500 0.763535 +vt 0.437500 0.869244 +vt 0.468750 0.657826 +vt 0.468750 0.763535 +vt 0.468750 0.869244 +vt 0.500000 0.657826 +vt 0.500000 0.763535 +vt 0.500000 0.869244 +vt 0.531250 0.657826 +vt 0.531250 0.763535 +vt 0.531250 0.869244 +vt 0.562500 0.657826 +vt 0.562500 0.763535 +vt 0.562500 0.869244 +vt 0.593750 0.657826 +vt 0.593750 0.763535 +vt 0.593750 0.869244 +vt 0.625000 0.657826 +vt 0.625000 0.763535 +vt 0.625000 0.869244 +vt 0.656250 0.657826 +vt 0.656250 0.763535 +vt 0.656250 0.869244 +vt 0.687500 0.657826 +vt 0.687500 0.763535 +vt 0.687500 0.869244 +vt 0.718750 0.657826 +vt 0.718750 0.763535 +vt 0.718750 0.869244 +vt 0.750000 0.657826 +vt 0.750000 0.763535 +vt 0.750000 0.869244 +vt 0.781250 0.657826 +vt 0.781250 0.763535 +vt 0.781250 0.869244 +vt 0.812500 0.657826 +vt 0.812500 0.763535 +vt 0.812500 0.869244 +vt 0.843750 0.657826 +vt 0.843750 0.763535 +vt 0.843750 0.869244 +vt 0.875000 0.657826 +vt 0.875000 0.763535 +vt 0.875000 0.869244 +vt 0.906250 0.657826 +vt 0.906250 0.763535 +vt 0.906250 0.869244 +vt 0.031250 0.538582 +vt 0.001572 0.538953 +vt 0.000000 0.657826 +vt 0.000000 0.735604 +vt 0.001571 0.736035 +vt 0.968750 0.538582 +vt 0.001571 0.763965 +vt 0.000000 0.960677 +vt 0.001572 0.961047 +vt 0.906250 0.538582 +vt 0.843750 0.538582 +vt 0.781250 0.538582 +vt 0.718750 0.538582 +vt 0.656250 0.538582 +vt 0.593750 0.538582 +vt 0.531250 0.538582 +vt 0.468750 0.538582 +vt 0.406250 0.538582 +vt 0.343750 0.538582 +vt 0.281250 0.538582 +vt 0.218750 0.538582 +vt 0.156250 0.538582 +vt 0.093750 0.538582 +vt 0.000000 0.842174 +vt 0.000000 0.764396 +vt 0.000000 0.539323 +vt 0.270141 0.423938 +vt 0.250000 0.428745 +vt 0.284321 0.422542 +vt 0.317378 0.412665 +vt 0.315041 0.413223 +vt 0.397602 0.348624 +vt 0.427342 0.285275 +vt 0.415193 0.181575 +vt 0.431185 0.213960 +vt 0.399616 0.150030 +vt 0.383205 0.116795 +vt 0.285193 0.073075 +vt 0.320132 0.080687 +vt 0.250000 0.065407 +vt 0.149611 0.099758 +vt 0.178149 0.076536 +vt 0.122125 0.122125 +vt 0.093492 0.145425 +vt 0.072621 0.250000 +vt 0.072272 0.214648 +vt 0.072969 0.285214 +vt 0.125553 0.374447 +vt 0.097067 0.352187 +vt 0.152263 0.396274 +vt 0.127928 0.376303 +vt 0.180626 0.417484 +vt 0.156129 0.398340 +vt 0.283943 0.420644 +vt 0.152682 0.395647 +vt 0.190922 0.425529 +vt 0.212674 0.437653 +vt 0.207896 0.438793 +vt 0.195343 0.428984 +vt 0.190402 0.427900 +vt 0.227322 0.434157 +vt 0.226937 0.435912 +vt 0.223307 0.435116 +vt 0.073250 0.313691 +vt 0.073343 0.323174 +vt 0.073290 0.317774 +vt 0.071661 0.314476 +vt 0.086027 0.343559 +vt 0.073448 0.333729 +vt 0.090369 0.346952 +vt 0.088226 0.348011 +vt 0.089655 0.148547 +vt 0.071893 0.176226 +vt 0.071763 0.163107 +vt 0.083120 0.153865 +vt 0.086449 0.146994 +vt 0.071945 0.181528 +vt 0.070141 0.180654 +vt 0.071901 0.177022 +vt 0.225335 0.060033 +vt 0.211619 0.057044 +vt 0.219594 0.058782 +vt 0.224749 0.057560 +vt 0.191898 0.065347 +vt 0.204111 0.055409 +vt 0.188761 0.067900 +vt 0.188354 0.066187 +vt 0.380444 0.111203 +vt 0.357667 0.088865 +vt 0.370830 0.091733 +vt 0.377584 0.105411 +vt 0.382170 0.108995 +vt 0.351484 0.087518 +vt 0.352700 0.085962 +vt 0.355930 0.088487 +vt 0.437615 0.263394 +vt 0.443903 0.250000 +vt 0.440159 0.257974 +vt 0.440168 0.263390 +vt 0.440117 0.232049 +vt 0.446378 0.244728 +vt 0.437126 0.225992 +vt 0.440107 0.225987 +vt 0.353806 0.407296 +vt 0.351586 0.404501 +vt 0.354653 0.406624 +vt 0.379714 0.386727 +vt 0.373865 0.399184 +vt 0.359793 0.402543 +vt 0.381954 0.381954 +vt 0.381764 0.382359 +vt 0.383099 0.384039 +vn -0.0000 0.0000 -1.0000 +vn 0.1369 -0.0300 0.9901 +vn -0.2525 0.0553 0.9660 +vn 0.0621 -0.1257 0.9901 +vn -0.1146 0.2318 0.9660 +vn -0.0611 -0.1262 0.9901 +vn 0.1127 0.2327 0.9660 +vn -0.1364 -0.0324 0.9901 +vn 0.2515 0.0597 0.9660 +vn -0.1105 0.0863 0.9901 +vn 0.2037 -0.1591 0.9660 +vn -0.0003 0.1402 0.9901 +vn 0.0005 -0.2585 0.9660 +vn 0.1098 0.0872 0.9901 +vn -0.2024 -0.1608 0.9660 +vn 0.0003 0.0000 1.0000 +vn 0.0000 0.0000 1.0000 +vn -0.9769 0.2139 0.0000 +vn -0.2139 -0.9769 0.0000 +vn 0.2139 0.9769 -0.0000 +vn -0.4431 0.8965 0.0000 +vn -0.8965 -0.4431 0.0000 +vn 0.8965 0.4431 -0.0000 +vn 0.4358 0.9001 -0.0000 +vn -0.9001 0.4358 0.0000 +vn 0.9001 -0.4358 0.0000 +vn 0.9730 0.2309 0.0000 +vn -0.2309 0.9730 0.0000 +vn 0.2309 -0.9730 -0.0000 +vn 0.7881 -0.6156 0.0000 +vn 0.6156 0.7881 0.0000 +vn -0.6156 -0.7881 -0.0000 +vn 0.0019 -1.0000 0.0000 +vn 1.0000 0.0019 -0.0000 +vn -1.0000 -0.0019 -0.0000 +vn -0.7830 -0.6220 0.0000 +vn 0.6220 -0.7830 0.0000 +vn -0.6220 0.7830 0.0000 +vn -0.9726 -0.2324 0.0000 +vn -0.4247 -0.9053 0.0000 +vn 0.4430 -0.8965 -0.0000 +vn 0.9771 -0.2126 0.0000 +vn 0.7755 0.6314 0.0000 +vn 0.1373 0.2927 0.9463 +vn -0.3159 0.0687 0.9463 +vn -0.1432 0.2898 0.9463 +vn -0.1906 -0.1552 0.9693 +vn -0.2507 -0.2041 0.9463 +vn -0.0102 0.9999 0.0000 +vn -0.0101 0.9999 -0.0000 +vn -0.7881 0.6155 0.0000 +vn 0.0033 -0.3233 0.9463 +vn 0.3145 0.0751 0.9463 +vn 0.2548 -0.1990 0.9463 +vn 0.2391 0.0571 0.9693 +vn -0.0004 0.0000 1.0000 +vn 0.0001 0.0000 1.0000 +vn -0.0001 0.0000 1.0000 +vn -0.0002 0.0000 1.0000 +vn 0.0004 0.0000 1.0000 +vn 0.0635 0.1540 0.9860 +vn -0.0723 0.1460 0.9866 +vn -0.0563 -0.1199 0.9912 +vn -0.1263 -0.1019 0.9867 +vn -0.1584 0.0353 0.9867 +vn 0.0094 -0.1664 0.9860 +vn 0.1282 -0.1001 0.9867 +vn 0.1580 0.0372 0.9867 +vn 0.1027 0.0836 0.9912 +vn 0.6079 -0.1325 0.7829 +vn 0.4826 0.3926 0.7829 +vn -0.0061 0.6221 0.7829 +vn -0.4902 0.3831 0.7829 +vn -0.6052 -0.1444 0.7829 +vn -0.2644 -0.5631 0.7829 +vn 0.2754 -0.5579 0.7829 +vn 0.9769 -0.2139 0.0000 +vn 0.4431 -0.8965 0.0000 +vn -0.4358 -0.9001 0.0000 +vn -0.9730 -0.2309 0.0000 +vn -0.7881 0.6156 0.0000 +vn -0.0019 1.0000 0.0000 +vn 0.7830 0.6220 0.0000 +vn 0.9771 -0.2130 0.0000 +vn 0.7757 0.6311 -0.0000 +vn -0.0098 1.0000 0.0000 +vn -0.7879 0.6158 -0.0000 +vn -0.9727 -0.2320 0.0000 +vn -0.4251 -0.9052 0.0000 +vn 0.4427 -0.8967 0.0000 +vn -0.5989 0.1305 0.7901 +vn -0.4755 -0.3868 0.7901 +vn 0.0060 -0.6129 0.7901 +vn 0.4829 -0.3775 0.7901 +vn 0.5962 0.1422 0.7901 +vn 0.2605 0.5548 0.7901 +vn -0.2713 0.5496 0.7901 +vn -0.6860 -0.3669 -0.6282 +vn -0.8680 -0.4965 0.0000 +vn -0.7545 -0.6563 -0.0000 +vn -0.6119 -0.7909 -0.0000 +vn -0.4459 -0.8951 -0.0000 +vn -0.2627 -0.9649 -0.0000 +vn -0.0694 -0.9976 -0.0000 +vn 0.1265 -0.9920 0.0000 +vn 0.3176 -0.9482 -0.0000 +vn 0.4965 -0.8680 0.0000 +vn 0.6563 -0.7545 -0.0000 +vn 0.7909 -0.6119 -0.0000 +vn 0.8951 -0.4459 0.0000 +vn 0.9649 -0.2627 0.0000 +vn 0.9976 -0.0694 -0.0000 +vn 0.9920 0.1265 0.0000 +vn 0.9482 0.3176 0.0000 +vn 0.8680 0.4965 -0.0000 +vn 0.7545 0.6563 -0.0000 +vn 0.6119 0.7909 0.0000 +vn 0.4459 0.8951 -0.0000 +vn 0.2627 0.9649 -0.0000 +vn 0.0694 0.9976 0.0000 +vn -0.1265 0.9920 -0.0000 +vn -0.3176 0.9482 0.0000 +vn -0.4965 0.8680 0.0000 +vn -0.6563 0.7545 -0.0000 +vn -0.7909 0.6119 0.0000 +vn -0.8951 0.4459 -0.0000 +vn -0.6013 -0.4937 -0.6282 +vn -0.9482 -0.3176 -0.0000 +vn -0.7445 -0.2261 -0.6282 +vn -0.9976 0.0694 0.0000 +vn -0.3134 -0.0310 -0.9491 +vn -0.0881 -0.0087 -0.9961 +vn -0.7743 0.0761 0.6282 +vn -0.3134 -0.0310 0.9491 +vn -0.0881 -0.0087 0.9961 +vn -0.3014 -0.0915 -0.9491 +vn -0.0847 -0.0257 -0.9961 +vn -0.3014 -0.0915 0.9491 +vn -0.0847 -0.0257 0.9961 +vn -0.2777 -0.1485 -0.9491 +vn -0.0781 -0.0418 -0.9961 +vn -0.2777 -0.1485 0.9491 +vn -0.0781 -0.0418 0.9961 +vn -0.2434 -0.1999 -0.9491 +vn -0.0684 -0.0562 -0.9961 +vn -0.2434 -0.1999 0.9491 +vn -0.0684 -0.0562 0.9961 +vn -0.1997 -0.2435 -0.9491 +vn -0.0562 -0.0685 -0.9961 +vn -0.1997 -0.2435 0.9491 +vn -0.0562 -0.0685 0.9961 +vn -0.1484 -0.2778 -0.9491 +vn -0.0417 -0.0781 -0.9961 +vn -0.1484 -0.2778 0.9491 +vn -0.0417 -0.0781 0.9961 +vn -0.0913 -0.3014 -0.9491 +vn -0.0257 -0.0848 -0.9961 +vn -0.0913 -0.3014 0.9491 +vn -0.0257 -0.0848 0.9961 +vn -0.0308 -0.3134 -0.9491 +vn -0.0087 -0.0881 -0.9961 +vn -0.0308 -0.3134 0.9491 +vn -0.0087 -0.0881 0.9961 +vn 0.0310 -0.3134 -0.9491 +vn 0.0087 -0.0881 -0.9961 +vn 0.0310 -0.3134 0.9491 +vn 0.0087 -0.0881 0.9961 +vn 0.0915 -0.3014 -0.9491 +vn 0.0257 -0.0847 -0.9961 +vn 0.0915 -0.3014 0.9491 +vn 0.0257 -0.0847 0.9961 +vn 0.1485 -0.2777 -0.9491 +vn 0.0418 -0.0781 -0.9961 +vn 0.1485 -0.2777 0.9491 +vn 0.0418 -0.0781 0.9961 +vn 0.1999 -0.2434 -0.9491 +vn 0.0562 -0.0684 -0.9961 +vn 0.1999 -0.2434 0.9491 +vn 0.0562 -0.0684 0.9961 +vn 0.2435 -0.1997 -0.9491 +vn 0.0685 -0.0562 -0.9961 +vn 0.2435 -0.1997 0.9491 +vn 0.0685 -0.0562 0.9961 +vn 0.2778 -0.1484 -0.9491 +vn 0.0781 -0.0417 -0.9961 +vn 0.2778 -0.1484 0.9491 +vn 0.0781 -0.0417 0.9961 +vn 0.3014 -0.0913 -0.9491 +vn 0.0848 -0.0257 -0.9961 +vn 0.3014 -0.0913 0.9491 +vn 0.0848 -0.0257 0.9961 +vn 0.3134 -0.0308 -0.9491 +vn 0.0881 -0.0087 -0.9961 +vn 0.3134 -0.0308 0.9491 +vn 0.0881 -0.0087 0.9961 +vn 0.3134 0.0310 -0.9491 +vn 0.0881 0.0087 -0.9961 +vn 0.3134 0.0310 0.9491 +vn 0.0881 0.0087 0.9961 +vn 0.3014 0.0915 -0.9491 +vn 0.0847 0.0257 -0.9961 +vn 0.3014 0.0915 0.9491 +vn 0.0847 0.0257 0.9961 +vn 0.2777 0.1485 -0.9491 +vn 0.0781 0.0418 -0.9961 +vn 0.2777 0.1485 0.9491 +vn 0.0781 0.0418 0.9961 +vn 0.2434 0.1999 -0.9491 +vn 0.0684 0.0562 -0.9961 +vn 0.2434 0.1999 0.9491 +vn 0.0684 0.0562 0.9961 +vn 0.1997 0.2435 -0.9491 +vn 0.0562 0.0685 -0.9961 +vn 0.1997 0.2435 0.9491 +vn 0.0562 0.0685 0.9961 +vn 0.1484 0.2778 -0.9491 +vn 0.0417 0.0781 -0.9961 +vn 0.1484 0.2778 0.9491 +vn 0.0417 0.0781 0.9961 +vn 0.0913 0.3014 -0.9491 +vn 0.0257 0.0848 -0.9961 +vn 0.0913 0.3014 0.9491 +vn 0.0257 0.0848 0.9961 +vn 0.0308 0.3134 -0.9491 +vn 0.0087 0.0881 -0.9961 +vn 0.0308 0.3134 0.9491 +vn 0.0087 0.0881 0.9961 +vn -0.0310 0.3134 -0.9491 +vn -0.0087 0.0881 -0.9961 +vn -0.0310 0.3134 0.9491 +vn -0.0087 0.0881 0.9961 +vn -0.0915 0.3014 -0.9491 +vn -0.0257 0.0847 -0.9961 +vn -0.0915 0.3014 0.9491 +vn -0.0257 0.0847 0.9961 +vn -0.1485 0.2777 -0.9491 +vn -0.0418 0.0781 -0.9961 +vn -0.1485 0.2777 0.9491 +vn -0.0418 0.0781 0.9961 +vn -0.1999 0.2434 -0.9491 +vn -0.0562 0.0684 -0.9961 +vn -0.1999 0.2434 0.9491 +vn -0.0562 0.0684 0.9961 +vn -0.7909 0.6120 0.0000 +vn -0.2435 0.1997 -0.9491 +vn -0.0685 0.0562 -0.9961 +vn -0.2435 0.1997 0.9491 +vn -0.0685 0.0562 0.9961 +vn -0.2778 0.1484 -0.9491 +vn -0.0781 0.0417 -0.9961 +vn -0.2778 0.1484 0.9491 +vn -0.0781 0.0417 0.9961 +vn -0.9649 0.2627 0.0000 +vn -0.3014 0.0913 -0.9491 +vn -0.0848 0.0257 -0.9961 +vn -0.3014 0.0913 0.9491 +vn -0.0848 0.0257 0.9961 +vn -0.7743 -0.0765 -0.6282 +vn -0.3134 0.0308 -0.9491 +vn -0.0881 0.0087 -0.9961 +vn -0.3134 0.0308 0.9491 +vn -0.0881 0.0087 0.9961 +vn -0.9920 -0.1265 -0.0000 +vn -0.7743 -0.0765 0.6282 +vn -0.7446 0.2256 0.6282 +vn -0.7445 -0.2261 0.6282 +vn -0.7903 -0.4824 0.3777 +vn -0.9074 0.0373 0.4186 +vn -0.6863 0.3666 0.6282 +vn -0.6306 -0.7611 0.1519 +vn -0.7446 0.2256 -0.6282 +vn -0.6015 0.4934 0.6282 +vn -0.6863 0.3666 -0.6282 +vn -0.4937 0.6013 0.6282 +vn -0.6016 0.4934 -0.6282 +vn -0.3669 0.6860 0.6282 +vn -0.4937 0.6013 -0.6282 +vn -0.2260 0.7445 0.6282 +vn -0.3669 0.6861 -0.6282 +vn -0.0765 0.7743 0.6282 +vn -0.2261 0.7445 -0.6282 +vn 0.0760 0.7743 0.6282 +vn -0.0765 0.7743 -0.6282 +vn 0.2256 0.7446 0.6282 +vn 0.0760 0.7743 -0.6282 +vn 0.3666 0.6862 0.6282 +vn 0.2256 0.7446 -0.6282 +vn 0.4934 0.6015 0.6283 +vn 0.3666 0.6863 -0.6282 +vn 0.6013 0.4937 0.6282 +vn 0.4934 0.6016 -0.6282 +vn 0.6861 0.3669 0.6282 +vn 0.6013 0.4937 -0.6282 +vn 0.7445 0.2261 0.6282 +vn 0.6861 0.3670 -0.6282 +vn 0.7742 0.0765 0.6282 +vn 0.7445 0.2261 -0.6282 +vn 0.7743 -0.0760 0.6282 +vn 0.7743 0.0765 -0.6282 +vn 0.7446 -0.2257 0.6282 +vn 0.7743 -0.0760 -0.6282 +vn 0.6863 -0.3666 0.6282 +vn 0.7446 -0.2257 -0.6282 +vn 0.6015 -0.4934 0.6282 +vn 0.6863 -0.3666 -0.6282 +vn 0.4937 -0.6013 0.6282 +vn 0.6016 -0.4934 -0.6282 +vn 0.3669 -0.6860 0.6282 +vn 0.4937 -0.6013 -0.6282 +vn 0.2261 -0.7445 0.6282 +vn 0.3669 -0.6861 -0.6282 +vn 0.0765 -0.7743 0.6282 +vn 0.2261 -0.7445 -0.6282 +vn -0.0760 -0.7743 0.6282 +vn 0.0765 -0.7743 -0.6282 +vn -0.2256 -0.7446 0.6282 +vn -0.0760 -0.7743 -0.6282 +vn -0.3666 -0.6862 0.6283 +vn -0.2256 -0.7446 -0.6282 +vn -0.4934 -0.6015 0.6283 +vn -0.3666 -0.6862 -0.6282 +vn -0.6013 -0.4937 0.6283 +vn -0.4934 -0.6015 -0.6282 +vn -0.6860 -0.3669 0.6283 +vn -0.7093 -0.5824 -0.3972 +vn -0.7904 -0.4824 -0.3777 +vn -0.8973 -0.1405 -0.4186 +vn -0.9133 -0.0902 -0.3971 +vn -0.9148 -0.1432 -0.3776 +vn -0.8526 -0.3128 -0.4186 +vn -0.9133 0.0897 0.3972 +vn -0.8693 -0.3189 -0.3777 +vn -0.8241 0.3817 -0.4186 +vn -0.9134 0.0897 -0.3972 +vn -0.8402 0.3891 -0.3777 +vn -0.8402 0.3891 0.3777 +vn -0.7096 0.5820 -0.3971 +vn -0.8241 0.3817 0.4186 +vn -0.6153 0.6680 -0.4185 +vn -0.7096 0.5820 0.3971 +vn -0.7481 0.5456 -0.3777 +vn -0.6273 0.6811 0.3776 +vn -0.5824 0.7093 -0.3972 +vn -0.4824 0.7904 -0.3776 +vn -0.4732 0.7752 -0.4186 +vn -0.2667 0.8782 -0.3972 +vn -0.4732 0.7752 0.4186 +vn -0.1405 0.8973 -0.4186 +vn -0.2666 0.8782 0.3972 +vn -0.1432 0.9148 -0.3777 +vn -0.1432 0.9148 0.3777 +vn 0.0897 0.9134 -0.3971 +vn -0.1405 0.8973 0.4186 +vn 0.2136 0.8827 -0.4186 +vn 0.0897 0.9134 0.3971 +vn 0.2178 0.9000 -0.3777 +vn 0.2178 0.9000 0.3777 +vn 0.4324 0.8095 -0.3972 +vn 0.2136 0.8827 0.4186 +vn 0.5351 0.7338 -0.4186 +vn 0.4324 0.8095 0.3972 +vn 0.3891 0.8402 -0.3777 +vn 0.5456 0.7481 0.3777 +vn 0.5820 0.7096 -0.3972 +vn 0.6810 0.6273 -0.3777 +vn 0.6680 0.6153 -0.4186 +vn 0.8093 0.4328 -0.3972 +vn 0.6680 0.6153 0.4186 +vn 0.8526 0.3128 -0.4186 +vn 0.8092 0.4328 0.3972 +vn 0.8693 0.3189 -0.3777 +vn 0.8693 0.3189 0.3777 +vn 0.9133 0.0902 -0.3971 +vn 0.8526 0.3128 0.4186 +vn 0.9074 -0.0373 -0.4186 +vn 0.9133 0.0902 0.3971 +vn 0.9252 -0.0380 -0.3776 +vn 0.9252 -0.0380 0.3776 +vn 0.8783 -0.2662 -0.3972 +vn 0.9074 -0.0373 0.4186 +vn 0.8241 -0.3817 -0.4186 +vn 0.8783 -0.2662 0.3972 +vn 0.9000 -0.2178 -0.3776 +vn 0.8402 -0.3891 0.3777 +vn 0.8095 -0.4324 -0.3972 +vn 0.7481 -0.5456 -0.3777 +vn 0.7338 -0.5351 -0.4185 +vn 0.5824 -0.7093 -0.3972 +vn 0.7338 -0.5351 0.4185 +vn 0.4731 -0.7752 -0.4186 +vn 0.5824 -0.7093 0.3972 +vn 0.4824 -0.7903 -0.3777 +vn 0.4824 -0.7903 0.3777 +vn 0.2666 -0.8782 -0.3972 +vn 0.4732 -0.7752 0.4186 +vn 0.1405 -0.8973 -0.4186 +vn 0.2666 -0.8782 0.3972 +vn 0.1432 -0.9148 -0.3776 +vn 0.1432 -0.9148 0.3776 +vn -0.0897 -0.9133 -0.3972 +vn 0.1405 -0.8973 0.4186 +vn -0.2136 -0.8827 -0.4186 +vn -0.0897 -0.9133 0.3972 +vn -0.0380 -0.9252 -0.3777 +vn -0.2178 -0.9000 0.3777 +vn -0.2662 -0.8783 -0.3972 +vn -0.3891 -0.8402 -0.3777 +vn -0.3817 -0.8241 -0.4186 +vn -0.5820 -0.7096 -0.3972 +vn -0.3817 -0.8241 0.4186 +vn -0.6680 -0.6153 -0.4185 +vn -0.8093 -0.4328 0.3972 +vn -0.6810 -0.6273 -0.3777 +vn -0.7752 -0.4731 -0.4186 +vn -0.8093 -0.4328 -0.3972 +vn -0.6680 -0.6153 0.4186 +vn -0.9000 0.2177 0.3777 +vn -0.8782 -0.2666 -0.3972 +vn -0.8827 0.2136 0.4186 +vn -0.7752 -0.4732 0.4186 +vn -0.5456 -0.7481 -0.3777 +vn -0.5351 -0.7338 0.4185 +vn -0.2178 -0.9000 -0.3777 +vn -0.2136 -0.8827 0.4186 +vn -0.0373 -0.9074 0.4186 +vn 0.3189 -0.8693 -0.3777 +vn 0.3128 -0.8526 0.4186 +vn 0.6273 -0.6811 -0.3777 +vn 0.6153 -0.6680 0.4186 +vn 0.8402 -0.3891 -0.3777 +vn 0.8241 -0.3817 0.4186 +vn 0.8827 -0.2136 0.4185 +vn 0.9148 0.1432 -0.3777 +vn 0.8972 0.1405 0.4186 +vn 0.7904 0.4824 -0.3777 +vn 0.7752 0.4732 0.4186 +vn 0.5456 0.7481 -0.3777 +vn 0.5351 0.7338 0.4186 +vn 0.3817 0.8241 0.4186 +vn 0.0380 0.9252 -0.3777 +vn 0.0373 0.9074 0.4186 +vn -0.3189 0.8693 -0.3777 +vn -0.3128 0.8526 0.4186 +vn -0.6273 0.6811 -0.3777 +vn -0.6153 0.6680 0.4186 +vn -0.7338 0.5351 0.4186 +vn -0.9000 0.2177 -0.3777 +vn -0.9252 0.0380 -0.3777 +vn -0.8526 -0.3128 0.4186 +vn -0.8973 -0.1405 0.4186 +vn -0.8783 0.2662 -0.3971 +vn -0.5820 -0.7096 0.3972 +vn -0.7093 -0.5824 0.3972 +vn -0.4324 -0.8095 -0.3972 +vn -0.4324 -0.8095 0.3972 +vn -0.2662 -0.8783 0.3972 +vn 0.0902 -0.9133 -0.3971 +vn 0.0902 -0.9133 0.3971 +vn 0.4328 -0.8093 -0.3972 +vn 0.4328 -0.8093 0.3972 +vn 0.7096 -0.5820 -0.3972 +vn 0.7096 -0.5820 0.3972 +vn 0.8095 -0.4324 0.3972 +vn 0.9134 -0.0897 -0.3972 +vn 0.9133 -0.0897 0.3972 +vn 0.8782 0.2666 -0.3972 +vn 0.8781 0.2666 0.3972 +vn 0.7093 0.5824 -0.3972 +vn 0.7093 0.5824 0.3972 +vn 0.5820 0.7096 0.3972 +vn 0.2662 0.8783 -0.3972 +vn 0.2662 0.8783 0.3972 +vn -0.0902 0.9133 -0.3972 +vn -0.0902 0.9133 0.3972 +vn -0.4328 0.8093 -0.3972 +vn -0.4328 0.8093 0.3972 +vn -0.5824 0.7093 0.3972 +vn -0.8095 0.4324 -0.3972 +vn -0.8095 0.4324 0.3972 +vn -0.8783 0.2662 0.3972 +vn -0.8781 -0.2666 0.3972 +vn -0.9133 -0.0902 0.3971 +vn -0.9252 0.0380 0.3777 +vn -0.6811 -0.6273 0.3777 +vn -0.5351 -0.7338 -0.4185 +vn -0.5456 -0.7481 0.3777 +vn -0.3891 -0.8402 0.3777 +vn -0.0373 -0.9074 -0.4186 +vn -0.0380 -0.9252 0.3777 +vn 0.3128 -0.8526 -0.4186 +vn 0.3189 -0.8693 0.3777 +vn 0.6153 -0.6680 -0.4186 +vn 0.6273 -0.6811 0.3777 +vn 0.7481 -0.5456 0.3777 +vn 0.8827 -0.2136 -0.4185 +vn 0.9000 -0.2178 0.3777 +vn 0.8973 0.1405 -0.4186 +vn 0.9148 0.1432 0.3777 +vn 0.7752 0.4732 -0.4186 +vn 0.7903 0.4824 0.3777 +vn 0.6811 0.6273 0.3777 +vn 0.3817 0.8241 -0.4186 +vn 0.3891 0.8402 0.3777 +vn 0.0373 0.9074 -0.4186 +vn 0.0380 0.9252 0.3777 +vn -0.3128 0.8526 -0.4186 +vn -0.3189 0.8693 0.3777 +vn -0.4824 0.7903 0.3777 +vn -0.7338 0.5351 -0.4186 +vn -0.7481 0.5456 0.3777 +vn -0.8827 0.2136 -0.4186 +vn -0.9074 0.0373 -0.4186 +vn -0.8693 -0.3189 0.3777 +vn -0.9148 -0.1432 0.3776 +vn -0.9096 -0.0003 0.4155 +vn -0.9096 -0.0002 -0.4155 +vn -0.8921 -0.1777 0.4154 +vn -0.8921 -0.1777 -0.4154 +vn -0.8403 -0.3484 0.4154 +vn -0.8403 -0.3483 -0.4155 +vn -0.7562 -0.5056 0.4154 +vn -0.7562 -0.5056 -0.4154 +vn -0.6430 -0.6434 0.4155 +vn -0.6430 -0.6434 -0.4156 +vn -0.5051 -0.7565 0.4155 +vn -0.5051 -0.7565 -0.4155 +vn -0.3479 -0.8405 0.4155 +vn -0.3478 -0.8405 -0.4155 +vn -0.1772 -0.8922 0.4155 +vn -0.1772 -0.8922 -0.4155 +vn 0.0003 -0.9096 0.4155 +vn 0.0003 -0.9096 -0.4154 +vn 0.1777 -0.8921 0.4155 +vn 0.1777 -0.8921 -0.4155 +vn 0.3483 -0.8403 0.4155 +vn 0.3483 -0.8403 -0.4154 +vn 0.5056 -0.7562 0.4154 +vn 0.5055 -0.7562 -0.4155 +vn 0.6434 -0.6430 0.4155 +vn 0.6433 -0.6430 -0.4156 +vn 0.7565 -0.5051 0.4155 +vn 0.7565 -0.5051 -0.4155 +vn 0.8405 -0.3479 0.4154 +vn 0.8405 -0.3479 -0.4154 +vn 0.8921 -0.1773 0.4155 +vn 0.8921 -0.1773 -0.4155 +vn 0.9096 0.0002 0.4154 +vn 0.9096 0.0002 -0.4154 +vn 0.8921 0.1777 0.4155 +vn 0.8921 0.1777 -0.4155 +vn 0.8403 0.3483 0.4155 +vn 0.8403 0.3484 -0.4155 +vn 0.7562 0.5056 0.4154 +vn 0.7562 0.5056 -0.4154 +vn 0.6430 0.6434 0.4154 +vn 0.6430 0.6434 -0.4155 +vn 0.5051 0.7565 0.4155 +vn 0.5052 0.7565 -0.4154 +vn 0.3479 0.8404 0.4155 +vn 0.3479 0.8404 -0.4155 +vn 0.1772 0.8922 0.4155 +vn 0.1772 0.8922 -0.4154 +vn -0.0003 0.9096 0.4155 +vn -0.0003 0.9096 -0.4155 +vn -0.1777 0.8921 0.4154 +vn -0.1777 0.8921 -0.4154 +vn -0.3483 0.8403 0.4155 +vn -0.3483 0.8402 -0.4155 +vn -0.5055 0.7562 0.4155 +vn -0.5056 0.7562 -0.4155 +vn -0.6434 0.6431 0.4154 +vn -0.6434 0.6431 -0.4154 +vn -0.7564 0.5052 0.4155 +vn -0.7565 0.5051 -0.4154 +vn -0.8405 0.3479 0.4154 +vn -0.8405 0.3479 -0.4154 +vn -0.8922 0.1772 0.4154 +vn -0.8922 0.1772 -0.4154 +vn -0.8824 -0.2998 0.3627 +vn 0.1218 -0.9239 0.3627 +vn 0.9299 -0.0607 0.3627 +vn 0.2410 0.9002 0.3627 +vn -0.7395 0.5672 0.3626 +vn -0.1293 -0.9161 0.3796 +vn 0.8732 -0.3055 0.3797 +vn 0.4700 0.7969 0.3797 +vn -0.9160 -0.1297 -0.3796 +vn -0.2710 -0.8765 0.3980 +vn 0.8068 -0.4367 0.3981 +vn 0.5857 0.7061 0.3980 +vn -0.5782 0.7122 0.3980 +vn -0.8765 0.2709 0.3980 +vn -0.7005 -0.6146 0.3627 +vn -0.5672 -0.7394 0.3627 +vn -0.2410 -0.9002 0.3627 +vn 0.4661 -0.8070 0.3627 +vn 0.6146 -0.7005 0.3627 +vn 0.8359 -0.4119 0.3627 +vn 0.8824 0.2998 0.3627 +vn 0.8069 0.4662 0.3627 +vn 0.5672 0.7395 0.3627 +vn -0.1218 0.9239 0.3626 +vn -0.2998 0.8824 0.3626 +vn -0.6146 0.7005 0.3627 +vn -0.7517 -0.5259 -0.3980 +vn -0.9002 0.2410 0.3626 +vn -0.8335 -0.4015 0.3796 +vn -0.7391 -0.5564 0.3797 +vn -0.4699 -0.7969 0.3797 +vn 0.2312 -0.8958 0.3796 +vn 0.4015 -0.8335 0.3797 +vn 0.6899 -0.6164 0.3796 +vn 0.9236 0.0520 0.3797 +vn 0.8958 0.2311 0.3797 +vn 0.7391 0.5564 0.3797 +vn 0.1293 0.9161 0.3796 +vn -0.0519 0.9237 0.3797 +vn -0.4015 0.8335 0.3796 +vn -0.6895 -0.6168 -0.3797 +vn -0.7966 -0.4704 -0.3796 +vn -0.8793 -0.2617 0.3980 +vn -0.8114 -0.4281 0.3980 +vn -0.5857 -0.7061 0.3980 +vn 0.0851 -0.9134 0.3981 +vn 0.2617 -0.8793 0.3980 +vn 0.5782 -0.7122 0.3981 +vn 0.9125 -0.0948 0.3980 +vn 0.9134 0.0851 0.3981 +vn 0.8113 0.4282 0.3980 +vn 0.2709 0.8765 0.3980 +vn 0.0947 0.9125 0.3980 +vn -0.2616 0.8793 0.3980 +vn -0.7060 0.5857 0.3980 +vn -0.6700 -0.6478 -0.3627 +vn -0.7835 -0.5046 -0.3627 +vn -0.9170 -0.1664 -0.3627 +vn -0.4281 0.8113 0.3980 +vn -0.0851 0.9134 0.3980 +vn 0.4367 0.8068 0.3980 +vn 0.7122 0.5782 0.3980 +vn 0.8793 0.2617 0.3980 +vn 0.8765 -0.2709 0.3980 +vn 0.7060 -0.5857 0.3980 +vn 0.4281 -0.8113 0.3980 +vn -0.0947 -0.9125 0.3980 +vn -0.4367 -0.8068 0.3980 +vn -0.7122 -0.5782 0.3980 +vn -0.8733 0.3054 0.3796 +vn -0.6899 0.6164 0.3796 +vn -0.5564 0.7391 0.3797 +vn -0.2312 0.8958 0.3797 +vn 0.3055 0.8732 0.3796 +vn 0.6164 0.6898 0.3797 +vn 0.8335 0.4015 0.3797 +vn 0.9161 -0.1293 0.3797 +vn 0.7968 -0.4700 0.3797 +vn 0.5563 -0.7391 0.3797 +vn 0.0519 -0.9237 0.3797 +vn -0.3055 -0.8733 0.3796 +vn -0.6164 -0.6899 0.3796 +vn -0.8958 -0.2311 0.3797 +vn -0.6347 -0.6624 -0.3980 +vn -0.8957 -0.1981 -0.3980 +vn -0.4661 0.8070 0.3626 +vn 0.0607 0.9299 0.3627 +vn 0.4120 0.8359 0.3626 +vn 0.7005 0.6146 0.3627 +vn 0.9239 0.1218 0.3627 +vn 0.9002 -0.2409 0.3627 +vn 0.7395 -0.5671 0.3627 +vn 0.2998 -0.8824 0.3627 +vn -0.0607 -0.9299 0.3627 +vn -0.4120 -0.8359 0.3627 +vn -0.8070 -0.4662 0.3626 +vn -0.8765 0.2710 -0.3980 +vn -0.7835 -0.5046 0.3627 +vn -0.8732 0.3055 -0.3796 +vn -0.7966 -0.4704 0.3797 +vn -0.9002 0.2410 -0.3626 +vn -0.7517 -0.5259 0.3980 +vn -0.6700 -0.6478 0.3627 +vn -0.6895 -0.6168 0.3797 +vn -0.6347 -0.6624 0.3980 +vn -0.7061 0.5857 -0.3980 +vn -0.9169 -0.1664 0.3627 +vn -0.6899 0.6164 -0.3796 +vn -0.9160 -0.1297 0.3796 +vn -0.7395 0.5672 -0.3626 +vn -0.8957 -0.1982 0.3980 +vn -0.5782 0.7122 -0.3980 +vn -0.5564 0.7391 -0.3797 +vn -0.6146 0.7005 -0.3627 +vn -0.4282 0.8113 -0.3980 +vn -0.4015 0.8335 -0.3796 +vn -0.4661 0.8070 -0.3626 +vn -0.2617 0.8793 -0.3980 +vn -0.2312 0.8958 -0.3797 +vn -0.2998 0.8824 -0.3626 +vn -0.0851 0.9134 -0.3980 +vn -0.0519 0.9237 -0.3796 +vn -0.1218 0.9239 -0.3626 +vn 0.0947 0.9125 -0.3980 +vn 0.1293 0.9161 -0.3796 +vn 0.0607 0.9299 -0.3627 +vn 0.2710 0.8765 -0.3980 +vn 0.3055 0.8732 -0.3796 +vn 0.2410 0.9002 -0.3627 +vn 0.4367 0.8068 -0.3980 +vn 0.4700 0.7969 -0.3796 +vn 0.4120 0.8359 -0.3627 +vn 0.5857 0.7060 -0.3980 +vn 0.6164 0.6898 -0.3797 +vn 0.5672 0.7394 -0.3627 +vn 0.7122 0.5782 -0.3980 +vn 0.7391 0.5564 -0.3797 +vn 0.7005 0.6146 -0.3627 +vn 0.8113 0.4282 -0.3980 +vn 0.8335 0.4015 -0.3797 +vn 0.8070 0.4661 -0.3627 +vn 0.8793 0.2617 -0.3980 +vn 0.8958 0.2311 -0.3796 +vn 0.8824 0.2997 -0.3627 +vn 0.9134 0.0851 -0.3981 +vn 0.9237 0.0520 -0.3797 +vn 0.9239 0.1218 -0.3627 +vn 0.9125 -0.0947 -0.3980 +vn 0.9161 -0.1293 -0.3796 +vn 0.9299 -0.0607 -0.3626 +vn 0.8765 -0.2709 -0.3980 +vn 0.8732 -0.3054 -0.3797 +vn 0.9002 -0.2410 -0.3626 +vn 0.8068 -0.4367 -0.3980 +vn 0.7968 -0.4700 -0.3797 +vn 0.8359 -0.4119 -0.3627 +vn 0.7060 -0.5857 -0.3980 +vn 0.6899 -0.6164 -0.3796 +vn 0.7395 -0.5671 -0.3627 +vn 0.5782 -0.7122 -0.3981 +vn 0.5563 -0.7392 -0.3796 +vn 0.6146 -0.7005 -0.3627 +vn 0.4281 -0.8113 -0.3980 +vn 0.4015 -0.8335 -0.3797 +vn 0.4661 -0.8070 -0.3627 +vn 0.2617 -0.8793 -0.3980 +vn 0.2312 -0.8958 -0.3797 +vn 0.2998 -0.8824 -0.3627 +vn 0.0851 -0.9134 -0.3981 +vn 0.0519 -0.9237 -0.3797 +vn 0.1218 -0.9239 -0.3627 +vn -0.0948 -0.9125 -0.3980 +vn -0.1293 -0.9161 -0.3796 +vn -0.0607 -0.9299 -0.3627 +vn -0.2710 -0.8764 -0.3980 +vn -0.3055 -0.8732 -0.3796 +vn -0.2410 -0.9002 -0.3626 +vn -0.4367 -0.8067 -0.3980 +vn -0.4700 -0.7969 -0.3797 +vn -0.4120 -0.8359 -0.3627 +vn -0.5857 -0.7061 -0.3980 +vn -0.6164 -0.6899 -0.3796 +vn -0.5672 -0.7395 -0.3626 +vn -0.7122 -0.5782 -0.3980 +vn -0.7391 -0.5564 -0.3796 +vn -0.7005 -0.6146 -0.3627 +vn -0.8113 -0.4282 -0.3980 +vn -0.8335 -0.4015 -0.3796 +vn -0.8070 -0.4661 -0.3626 +vn -0.8793 -0.2617 -0.3980 +vn -0.8958 -0.2311 -0.3797 +vn -0.8824 -0.2997 -0.3627 +vn -0.8695 0.4700 0.1519 +vn -0.9165 -0.3659 -0.1617 +vn -0.9344 0.3044 -0.1849 +vn -0.8333 -0.5224 0.1807 +vn -0.8275 -0.5377 -0.1616 +vn -0.8571 0.4808 -0.1849 +vn -0.8571 0.4808 0.1849 +vn -0.9192 -0.3498 -0.1807 +vn -0.8333 -0.5224 -0.1807 +vn -0.9445 0.2913 -0.1519 +vn -0.8275 -0.5376 0.1616 +vn -0.8695 0.4700 -0.1519 +vn -0.7067 -0.6888 0.1617 +vn -0.7154 -0.6750 -0.1807 +vn -0.7154 -0.6749 0.1807 +vn -0.7067 -0.6888 -0.1617 +vn -0.7611 0.6306 0.1519 +vn -0.7468 0.6388 -0.1849 +vn -0.7468 0.6388 0.1849 +vn -0.7611 0.6306 -0.1519 +vn -0.5588 -0.8134 0.1617 +vn -0.5700 -0.8015 -0.1807 +vn -0.5700 -0.8015 0.1807 +vn -0.5588 -0.8134 -0.1617 +vn -0.3893 -0.9068 0.1617 +vn -0.4026 -0.8974 -0.1807 +vn -0.4026 -0.8974 0.1807 +vn -0.3893 -0.9068 -0.1617 +vn -0.2049 -0.9653 0.1617 +vn -0.2198 -0.9587 -0.1807 +vn -0.2198 -0.9587 0.1807 +vn -0.2049 -0.9653 -0.1617 +vn -0.0127 -0.9868 0.1617 +vn -0.0286 -0.9831 -0.1807 +vn -0.0286 -0.9831 0.1807 +vn -0.0127 -0.9868 -0.1617 +vn 0.1800 -0.9703 0.1617 +vn 0.1638 -0.9698 -0.1807 +vn 0.1638 -0.9698 0.1807 +vn 0.1800 -0.9703 -0.1617 +vn 0.3659 -0.9165 0.1617 +vn 0.3498 -0.9192 -0.1807 +vn 0.3498 -0.9192 0.1807 +vn 0.3659 -0.9165 -0.1617 +vn 0.5377 -0.8275 0.1617 +vn 0.5224 -0.8333 -0.1807 +vn 0.5224 -0.8333 0.1807 +vn 0.5377 -0.8275 -0.1617 +vn 0.6888 -0.7067 0.1617 +vn 0.6750 -0.7154 -0.1807 +vn 0.6749 -0.7154 0.1807 +vn 0.6888 -0.7067 -0.1617 +vn 0.8134 -0.5588 0.1617 +vn 0.8016 -0.5700 -0.1807 +vn 0.8016 -0.5700 0.1807 +vn 0.8134 -0.5588 -0.1617 +vn 0.9068 -0.3893 0.1617 +vn 0.8973 -0.4027 -0.1807 +vn 0.8973 -0.4026 0.1807 +vn 0.9068 -0.3893 -0.1617 +vn 0.9653 -0.2050 0.1617 +vn 0.9586 -0.2199 -0.1807 +vn 0.9586 -0.2199 0.1807 +vn 0.9653 -0.2050 -0.1617 +vn 0.9868 -0.0127 0.1617 +vn 0.9831 -0.0286 -0.1807 +vn 0.9831 -0.0286 0.1807 +vn 0.9868 -0.0127 -0.1617 +vn 0.9703 0.1800 0.1617 +vn 0.9698 0.1637 -0.1807 +vn 0.9698 0.1637 0.1807 +vn 0.9703 0.1800 -0.1617 +vn 0.9165 0.3658 0.1617 +vn 0.9192 0.3498 -0.1807 +vn 0.9192 0.3498 0.1807 +vn 0.9165 0.3658 -0.1617 +vn 0.8275 0.5377 0.1617 +vn 0.8333 0.5225 -0.1807 +vn 0.8333 0.5224 0.1807 +vn 0.8275 0.5377 -0.1617 +vn 0.7067 0.6888 0.1617 +vn 0.7154 0.6749 -0.1807 +vn 0.7155 0.6749 0.1807 +vn 0.7067 0.6888 -0.1617 +vn 0.5588 0.8134 0.1617 +vn 0.5699 0.8016 -0.1807 +vn 0.5699 0.8016 0.1807 +vn 0.5588 0.8134 -0.1617 +vn 0.3893 0.9068 0.1617 +vn 0.4027 0.8973 -0.1807 +vn 0.4027 0.8973 0.1807 +vn 0.3893 0.9068 -0.1617 +vn 0.2050 0.9653 0.1617 +vn 0.2199 0.9587 -0.1807 +vn 0.2199 0.9587 0.1807 +vn 0.2050 0.9653 -0.1617 +vn 0.0127 0.9868 0.1617 +vn 0.0286 0.9831 -0.1807 +vn 0.0286 0.9831 0.1807 +vn 0.0127 0.9868 -0.1617 +vn -0.1801 0.9703 0.1617 +vn -0.1637 0.9698 -0.1807 +vn -0.1637 0.9698 0.1807 +vn -0.1801 0.9703 -0.1617 +vn -0.3659 0.9165 0.1617 +vn -0.3498 0.9192 -0.1807 +vn -0.3498 0.9192 0.1807 +vn -0.3659 0.9165 -0.1617 +vn -0.5377 0.8275 0.1617 +vn -0.5224 0.8333 -0.1807 +vn -0.5224 0.8333 0.1807 +vn -0.5377 0.8275 -0.1617 +vn -0.6888 0.7067 0.1617 +vn -0.6750 0.7154 -0.1807 +vn -0.6750 0.7154 0.1807 +vn -0.6888 0.7067 -0.1617 +vn -0.8134 0.5588 0.1617 +vn -0.8015 0.5700 -0.1807 +vn -0.8015 0.5700 0.1807 +vn -0.8134 0.5588 -0.1617 +vn -0.9068 0.3893 0.1617 +vn -0.8973 0.4027 -0.1807 +vn -0.8973 0.4027 0.1807 +vn -0.9068 0.3894 -0.1617 +vn -0.9653 0.2049 0.1617 +vn -0.9586 0.2199 -0.1807 +vn -0.9587 0.2198 0.1807 +vn -0.9653 0.2049 -0.1617 +vn -0.7743 0.0760 -0.6282 +vn -0.6388 -0.7468 -0.1849 +vn -0.6388 -0.7468 0.1849 +vn -0.6306 -0.7611 -0.1519 +vn -0.0157 -0.9318 -0.3627 +vn -0.0515 -0.9237 -0.3797 +vn 0.0196 -0.9172 -0.3980 +vn -0.0514 -0.9237 0.3797 +vn 0.0196 -0.9172 0.3980 +vn -0.0157 -0.9318 0.3627 +vn -0.4700 -0.8695 0.1519 +vn -0.4808 -0.8571 -0.1849 +vn -0.4808 -0.8571 0.1849 +vn -0.4700 -0.8695 -0.1519 +vn 0.1664 -0.9169 -0.3627 +vn 0.1298 -0.9160 -0.3796 +vn 0.1982 -0.8957 -0.3980 +vn 0.1663 -0.9169 0.3627 +vn 0.1982 -0.8957 0.3980 +vn 0.1298 -0.9160 0.3797 +vn -0.2914 -0.9445 0.1519 +vn -0.3044 -0.9344 -0.1849 +vn -0.3044 -0.9344 0.1849 +vn -0.2914 -0.9445 -0.1519 +vn 0.3421 -0.8669 -0.3627 +vn 0.3060 -0.8731 -0.3796 +vn 0.3691 -0.8398 -0.3980 +vn 0.3060 -0.8731 0.3796 +vn 0.3421 -0.8669 0.3627 +vn 0.3691 -0.8398 0.3980 +vn -0.7670 -0.6234 0.1519 +vn -0.7722 -0.6078 -0.1849 +vn -0.7722 -0.6078 0.1849 +vn -0.7670 -0.6234 -0.1519 +vn -0.1972 -0.9108 -0.3626 +vn -0.2306 -0.8959 -0.3796 +vn -0.1597 -0.9034 -0.3980 +vn -0.1597 -0.9034 0.3980 +vn -0.2306 -0.8959 0.3796 +vn -0.1972 -0.9108 0.3627 +vn -0.8739 -0.4618 0.1519 +vn -0.8760 -0.4454 -0.1849 +vn -0.8760 -0.4454 0.1849 +vn -0.8739 -0.4618 -0.1519 +vn -0.3711 -0.8549 -0.3626 +vn -0.4010 -0.8337 -0.3796 +vn -0.3329 -0.8549 -0.3980 +vn -0.3711 -0.8549 0.3626 +vn -0.3329 -0.8549 0.3980 +vn -0.4010 -0.8337 0.3796 +vn -0.9472 -0.2825 0.1519 +vn -0.9461 -0.2661 -0.1849 +vn -0.9460 -0.2661 0.1849 +vn -0.9472 -0.2825 -0.1519 +vn -0.5307 -0.7660 -0.3627 +vn -0.5560 -0.7394 -0.3797 +vn -0.4932 -0.7735 -0.3980 +vn -0.5559 -0.7395 0.3797 +vn -0.4932 -0.7735 0.3980 +vn -0.5308 -0.7660 0.3627 +vn -0.9841 -0.0922 0.1519 +vn -0.9798 -0.0763 -0.1849 +vn -0.9798 -0.0763 0.1849 +vn -0.9841 -0.0922 -0.1519 +vn -0.9134 -0.0851 0.3980 +vn -0.9237 -0.0519 0.3797 +vn -0.9239 -0.1218 0.3627 +vn -0.9134 -0.0851 -0.3980 +vn -0.9239 -0.1218 -0.3626 +vn -0.9237 -0.0520 -0.3797 +vn -0.9832 0.1014 -0.1519 +vn -0.9759 0.1162 0.1849 +vn -0.9832 0.1014 0.1519 +vn -0.9759 0.1162 -0.1849 +vn -0.9125 0.0947 0.3980 +vn -0.9161 0.1292 0.3796 +vn -0.9299 0.0607 0.3627 +vn -0.9299 0.0607 -0.3627 +vn -0.9161 0.1292 -0.3797 +vn -0.9125 0.0947 -0.3980 +vn -0.9165 -0.3659 0.1617 +vn -0.9344 0.3044 0.1849 +vn -0.9192 -0.3498 0.1807 +vn -0.9445 0.2913 0.1519 +vn -0.8669 -0.3420 -0.3627 +vn -0.8731 -0.3060 -0.3797 +vn -0.8399 -0.3691 -0.3980 +vn -0.8731 -0.3059 0.3797 +vn -0.8669 -0.3420 0.3627 +vn -0.8399 -0.3691 0.3980 +vn -0.9703 -0.1801 0.1617 +vn -0.9698 -0.1637 -0.1807 +vn -0.9698 -0.1637 0.1807 +vn -0.9703 -0.1801 -0.1617 +vn -0.8068 0.4367 0.3980 +vn -0.7969 0.4700 0.3796 +vn -0.8359 0.4120 0.3627 +vn -0.8068 0.4367 -0.3980 +vn -0.8359 0.4120 -0.3627 +vn -0.7969 0.4699 -0.3796 +vn -0.9868 0.0127 0.1617 +vn -0.9831 0.0286 -0.1807 +vn -0.9831 0.0286 0.1807 +vn -0.9868 0.0127 -0.1617 +vn -0.9318 0.0158 -0.3626 +vn -0.9237 0.0514 -0.3797 +vn -0.9172 -0.0196 -0.3980 +vn -0.9237 0.0514 0.3797 +vn -0.9172 -0.0196 0.3980 +vn -0.9318 0.0158 0.3627 +vn -0.6234 0.7670 0.1519 +vn -0.6078 0.7722 -0.1849 +vn -0.6078 0.7722 0.1849 +vn -0.6235 0.7670 -0.1519 +vn -0.9108 0.1972 -0.3627 +vn -0.8959 0.2307 -0.3796 +vn -0.9034 0.1597 -0.3980 +vn -0.8959 0.2307 0.3796 +vn -0.9108 0.1972 0.3627 +vn -0.9034 0.1597 0.3980 +vn -0.4618 0.8739 0.1519 +vn -0.4455 0.8760 -0.1849 +vn -0.4455 0.8760 0.1849 +vn -0.4619 0.8739 -0.1519 +vn -0.8548 0.3711 -0.3627 +vn -0.8337 0.4010 -0.3796 +vn -0.8549 0.3329 -0.3980 +vn -0.8549 0.3711 0.3626 +vn -0.8548 0.3329 0.3980 +vn -0.8337 0.4010 0.3796 +vn -0.2825 0.9472 0.1519 +vn -0.2660 0.9461 -0.1849 +vn -0.2660 0.9461 0.1849 +vn -0.2825 0.9472 -0.1519 +vn -0.7660 0.5308 -0.3626 +vn -0.7394 0.5560 -0.3796 +vn -0.7735 0.4933 -0.3980 +vn -0.7394 0.5560 0.3796 +vn -0.7735 0.4932 0.3980 +vn -0.7660 0.5308 0.3626 +vn -0.0923 0.9841 0.1519 +vn -0.0764 0.9798 -0.1849 +vn -0.0764 0.9798 0.1849 +vn -0.0923 0.9841 -0.1519 +vn -0.6478 0.6700 -0.3626 +vn -0.6168 0.6895 -0.3797 +vn -0.6624 0.6347 -0.3980 +vn -0.6624 0.6347 0.3980 +vn -0.6168 0.6895 0.3797 +vn -0.6477 0.6700 0.3627 +vn 0.1015 0.9832 0.1519 +vn 0.1163 0.9758 -0.1849 +vn 0.1163 0.9758 0.1849 +vn 0.1015 0.9832 -0.1519 +vn -0.5046 0.7835 -0.3627 +vn -0.4704 0.7966 -0.3797 +vn -0.5259 0.7517 -0.3980 +vn -0.5046 0.7835 0.3627 +vn -0.5259 0.7517 0.3980 +vn -0.4704 0.7966 0.3797 +vn 0.2913 0.9445 0.1519 +vn 0.3044 0.9344 -0.1849 +vn 0.3044 0.9344 0.1849 +vn 0.2913 0.9445 -0.1519 +vn -0.3420 0.8669 -0.3627 +vn -0.3060 0.8731 -0.3797 +vn -0.3691 0.8399 -0.3980 +vn -0.3060 0.8730 0.3797 +vn -0.3691 0.8398 0.3980 +vn -0.3420 0.8669 0.3627 +vn 0.4700 0.8695 0.1519 +vn 0.4808 0.8571 -0.1849 +vn 0.4808 0.8571 0.1849 +vn 0.4700 0.8695 -0.1519 +vn -0.1664 0.9170 -0.3627 +vn -0.1298 0.9160 -0.3797 +vn -0.1982 0.8957 -0.3980 +vn -0.1664 0.9169 0.3627 +vn -0.1982 0.8957 0.3980 +vn -0.1298 0.9160 0.3797 +vn 0.6306 0.7611 0.1519 +vn 0.6388 0.7468 -0.1849 +vn 0.6388 0.7468 0.1849 +vn 0.6306 0.7611 -0.1519 +vn 0.0157 0.9318 -0.3627 +vn 0.0514 0.9237 -0.3797 +vn -0.0196 0.9172 -0.3980 +vn 0.0514 0.9237 0.3797 +vn 0.0157 0.9318 0.3627 +vn -0.0196 0.9172 0.3980 +vn 0.7670 0.6235 0.1519 +vn 0.7722 0.6078 -0.1849 +vn 0.7722 0.6078 0.1849 +vn 0.7670 0.6234 -0.1519 +vn 0.1972 0.9108 -0.3627 +vn 0.2307 0.8959 -0.3796 +vn 0.1597 0.9034 -0.3980 +vn 0.1972 0.9108 0.3626 +vn 0.1597 0.9034 0.3980 +vn 0.2307 0.8959 0.3797 +vn 0.8739 0.4618 0.1519 +vn 0.8760 0.4455 -0.1849 +vn 0.8760 0.4455 0.1849 +vn 0.8739 0.4618 -0.1519 +vn 0.3711 0.8548 -0.3627 +vn 0.4010 0.8337 -0.3796 +vn 0.3329 0.8549 -0.3980 +vn 0.4010 0.8337 0.3797 +vn 0.3329 0.8548 0.3980 +vn 0.3711 0.8548 0.3627 +vn 0.9472 0.2825 0.1519 +vn 0.9460 0.2661 -0.1849 +vn 0.9461 0.2661 0.1849 +vn 0.9472 0.2825 -0.1519 +vn 0.5307 0.7660 -0.3627 +vn 0.5559 0.7395 -0.3796 +vn 0.4932 0.7735 -0.3980 +vn 0.4933 0.7735 0.3980 +vn 0.5559 0.7395 0.3797 +vn 0.5308 0.7660 0.3627 +vn 0.9841 0.0923 0.1519 +vn 0.9798 0.0764 -0.1849 +vn 0.9798 0.0764 0.1849 +vn 0.9841 0.0923 -0.1519 +vn 0.6700 0.6478 -0.3627 +vn 0.6895 0.6168 -0.3797 +vn 0.6347 0.6624 -0.3981 +vn 0.6700 0.6478 0.3627 +vn 0.6347 0.6624 0.3980 +vn 0.6895 0.6168 0.3797 +vn 0.9832 -0.1015 0.1519 +vn 0.9758 -0.1163 -0.1849 +vn 0.9758 -0.1163 0.1849 +vn 0.9832 -0.1015 -0.1519 +vn 0.7835 0.5046 -0.3626 +vn 0.7966 0.4704 -0.3796 +vn 0.7517 0.5258 -0.3980 +vn 0.7966 0.4704 0.3796 +vn 0.7517 0.5258 0.3980 +vn 0.7835 0.5046 0.3627 +vn 0.9445 -0.2913 0.1519 +vn 0.9344 -0.3044 -0.1849 +vn 0.9344 -0.3044 0.1849 +vn 0.9445 -0.2913 -0.1519 +vn 0.8669 0.3420 -0.3626 +vn 0.8731 0.3060 -0.3796 +vn 0.8398 0.3691 -0.3980 +vn 0.8669 0.3421 0.3626 +vn 0.8399 0.3691 0.3980 +vn 0.8730 0.3060 0.3797 +vn 0.8695 -0.4700 0.1519 +vn 0.8571 -0.4809 -0.1849 +vn 0.8571 -0.4808 0.1849 +vn 0.8695 -0.4700 -0.1519 +vn 0.9169 0.1664 -0.3627 +vn 0.9160 0.1298 -0.3797 +vn 0.8957 0.1982 -0.3980 +vn 0.9160 0.1298 0.3797 +vn 0.9169 0.1664 0.3627 +vn 0.8957 0.1982 0.3980 +vn 0.7611 -0.6306 0.1519 +vn 0.7468 -0.6388 -0.1849 +vn 0.7468 -0.6388 0.1849 +vn 0.7611 -0.6306 -0.1519 +vn 0.9318 -0.0158 -0.3627 +vn 0.9237 -0.0514 -0.3797 +vn 0.9172 0.0196 -0.3980 +vn 0.9318 -0.0158 0.3627 +vn 0.9172 0.0197 0.3980 +vn 0.9237 -0.0514 0.3797 +vn 0.6234 -0.7670 0.1519 +vn 0.6078 -0.7722 -0.1849 +vn 0.6078 -0.7722 0.1849 +vn 0.6234 -0.7670 -0.1519 +vn 0.9108 -0.1972 -0.3627 +vn 0.8959 -0.2307 -0.3796 +vn 0.9034 -0.1597 -0.3980 +vn 0.8959 -0.2307 0.3796 +vn 0.9034 -0.1597 0.3980 +vn 0.9108 -0.1972 0.3627 +vn 0.4618 -0.8739 0.1519 +vn 0.4455 -0.8760 -0.1849 +vn 0.4455 -0.8760 0.1849 +vn 0.4618 -0.8739 -0.1519 +vn 0.8548 -0.3711 -0.3627 +vn 0.8337 -0.4010 -0.3796 +vn 0.8548 -0.3329 -0.3980 +vn 0.8548 -0.3329 0.3980 +vn 0.8337 -0.4010 0.3797 +vn 0.8548 -0.3711 0.3627 +vn 0.2825 -0.9472 0.1519 +vn 0.2661 -0.9460 -0.1849 +vn 0.2661 -0.9460 0.1849 +vn 0.2825 -0.9472 -0.1519 +vn 0.7660 -0.5308 -0.3627 +vn 0.7395 -0.5559 -0.3796 +vn 0.7735 -0.4933 -0.3980 +vn 0.7660 -0.5308 0.3627 +vn 0.7735 -0.4933 0.3980 +vn 0.7395 -0.5559 0.3796 +vn 0.0923 -0.9841 0.1519 +vn 0.0763 -0.9798 -0.1849 +vn 0.0764 -0.9798 0.1849 +vn 0.0923 -0.9841 -0.1519 +vn 0.6477 -0.6700 -0.3627 +vn 0.6168 -0.6895 -0.3796 +vn 0.6623 -0.6347 -0.3980 +vn 0.6168 -0.6895 0.3797 +vn 0.6624 -0.6347 0.3980 +vn 0.6477 -0.6700 0.3627 +vn -0.1015 -0.9832 0.1519 +vn -0.1163 -0.9759 -0.1849 +vn -0.1163 -0.9759 0.1849 +vn -0.1015 -0.9832 -0.1519 +vn 0.5046 -0.7835 -0.3626 +vn 0.4704 -0.7966 -0.3797 +vn 0.5259 -0.7517 -0.3980 +vn 0.5046 -0.7835 0.3626 +vn 0.5259 -0.7517 0.3980 +vn 0.4704 -0.7966 0.3797 +vn 0.1197 0.0118 0.9927 +vn 0.1151 0.0350 0.9927 +vn 0.0567 0.1061 0.9927 +vn 0.0349 0.1151 0.9927 +vn -0.0350 0.1151 0.9927 +vn -0.0568 0.1061 0.9927 +vn -0.0764 0.0930 0.9927 +vn -0.1151 0.0349 0.9927 +vn -0.1197 0.0118 0.9927 +vn -0.1061 -0.0567 0.9927 +vn -0.0930 -0.0764 0.9927 +vn -0.0763 -0.0930 0.9927 +vn -0.0118 -0.1197 0.9927 +vn 0.0118 -0.1197 0.9927 +vn 0.0764 -0.0930 0.9927 +vn 0.0930 -0.0763 0.9927 +vn 0.1061 -0.0567 0.9927 +vn 0.1151 -0.0349 0.9927 +vn 0.1197 -0.0118 0.9927 +vn 0.0350 -0.1151 0.9927 +vn 0.0568 -0.1061 0.9927 +vn -0.0567 -0.1061 0.9927 +vn -0.0349 -0.1151 0.9927 +vn -0.1197 -0.0118 0.9927 +vn -0.1151 -0.0350 0.9927 +vn -0.0930 0.0763 0.9927 +vn -0.1061 0.0567 0.9927 +vn 0.0118 0.1197 0.9927 +vn -0.0118 0.1197 0.9927 +vn 0.1061 0.0567 0.9927 +vn 0.0930 0.0764 0.9927 +vn 0.0763 0.0930 0.9927 +usemtl besi_roda +s off +f 6043/8062/4042 6249/8063/4042 6242/8064/4042 6235/8065/4042 6228/8066/4042 6221/8067/4042 6214/8068/4042 6207/8069/4042 6200/8070/4042 6193/8071/4042 6186/8072/4042 6179/8073/4042 6172/8074/4042 6165/8075/4042 6158/8076/4042 6151/8077/4042 6144/8078/4042 6137/8079/4042 6130/8080/4042 6123/8081/4042 6116/8082/4042 6109/8083/4042 6102/8084/4042 6095/8085/4042 6088/8086/4042 6081/8087/4042 6074/8088/4042 6068/8089/4042 6063/8090/4042 6058/8091/4042 6053/8092/4042 6048/8093/4042 +f 7362/8094/4043 7360/8095/4043 7361/8096/4043 7363/8097/4043 +f 7358/8098/4044 7362/8094/4044 7363/8097/4044 7359/8099/4044 +f 7370/8100/4045 7368/8101/4045 7369/8102/4045 7371/8103/4045 +f 7366/8104/4046 7370/8100/4046 7371/8103/4046 7367/8105/4046 +f 7378/8106/4047 7376/8107/4047 7377/8108/4047 7379/8109/4047 +f 7374/8110/4048 7378/8106/4048 7379/8109/4048 7375/8111/4048 +f 7386/8112/4049 7384/8113/4049 7385/8114/4049 7387/8115/4049 +f 7382/8116/4050 7386/8112/4050 7387/8115/4050 7383/8117/4050 +f 7394/8118/4051 7392/8119/4051 7393/8120/4051 7395/8121/4051 +f 7390/8122/4052 7394/8118/4052 7395/8121/4052 7391/8123/4052 +f 7402/8124/4053 7400/8125/4053 7401/8126/4053 7403/8127/4053 +f 7398/8128/4054 7402/8124/4054 7403/8127/4054 7399/8129/4054 +f 7410/8130/4055 7408/8131/4055 7409/8132/4055 7411/8133/4055 +f 7406/8134/4056 7410/8130/4056 7411/8133/4056 7407/8135/4056 +f 7441/8136/4057 7442/8137/4057 7356/8138/4057 +f 7356/8138/4058 7444/8139/4058 7441/8136/4058 +f 7483/8140/4059 7486/8141/4059 7463/8142/4059 7365/8143/4059 7358/8144/4059 7359/8145/4059 7364/8146/4059 7457/8147/4059 +f 7365/8148/4060 7465/8149/4060 7488/8150/4060 7489/8151/4060 7362/8152/4060 7358/8153/4060 +f 7492/8154/4061 7491/8155/4061 7459/8156/4061 7364/8157/4061 7359/8158/4061 7363/8159/4061 +f 7512/8160/4062 7516/8161/4062 7502/8162/4062 7373/8163/4062 7366/8164/4062 7367/8165/4062 7372/8166/4062 7497/8167/4062 +f 7373/8168/4063 7499/8169/4063 7518/8170/4063 7524/8171/4063 7370/8172/4063 7366/8173/4063 +f 7526/8174/4064 7525/8175/4064 7498/8176/4064 7372/8177/4064 7367/8178/4064 7371/8179/4064 +f 7548/8180/4065 7550/8181/4065 7549/8182/4065 7536/8183/4065 7381/8184/4065 7374/8185/4065 7375/8186/4065 7380/8187/4065 7530/8188/4065 +f 7381/8189/4066 7534/8190/4066 7551/8191/4066 7552/8192/4066 7378/8193/4066 7374/8194/4066 +f 7556/8195/4067 7555/8196/4067 7531/8197/4067 7380/8198/4067 7375/8199/4067 7379/8200/4067 +f 7572/8201/4068 7573/8202/4068 7562/8203/4068 7389/8204/4068 7382/8205/4068 7383/8206/4068 7388/8207/4068 7557/8208/4068 +f 7389/8209/4069 7563/8210/4069 7574/8211/4069 7479/8212/4069 7386/8213/4069 7382/8214/4069 +f 7478/8215/4070 7575/8216/4070 7560/8217/4070 7388/8218/4070 7383/8219/4070 7387/8220/4070 +f 7500/8221/4071 7501/8222/4071 7487/8223/4071 7397/8224/4071 7390/8225/4071 7391/8226/4071 7396/8227/4071 7482/8228/4071 +f 7397/8229/4072 7490/8230/4072 7505/8231/4072 7506/8232/4072 7394/8233/4072 7390/8234/4072 +f 7511/8235/4073 7508/8236/4073 7485/8237/4073 7396/8238/4073 7391/8239/4073 7395/8240/4073 +f 7527/8241/4074 7532/8242/4074 7520/8243/4074 7405/8244/4074 7398/8245/4074 7399/8246/4074 7404/8247/4074 7513/8248/4074 +f 7405/8249/4075 7517/8250/4075 7533/8251/4075 7535/8252/4075 7402/8253/4075 7398/8254/4075 +f 7538/8255/4076 7537/8256/4076 7515/8257/4076 7404/8258/4076 7399/8259/4076 7403/8260/4076 +f 7559/8261/4077 7565/8262/4077 7564/8263/4077 7546/8264/4077 7414/8265/4077 7406/8266/4077 7407/8267/4077 7413/8268/4077 7412/8269/4077 7545/8270/4077 +f 7414/8271/4078 7542/8272/4078 7567/8273/4078 7569/8274/4078 7410/8275/4078 7406/8276/4078 +f 7571/8277/4079 7570/8278/4079 7539/8279/4079 7413/8280/4079 7407/8281/4079 7411/8282/4079 +f 7415/8283/4080 7456/8284/4080 7458/8285/4080 7463/8286/4080 7486/8287/4080 +f 7436/8288/4080 7462/8289/4080 7539/8290/4080 7570/8291/4080 7488/8292/4080 7465/8293/4080 7460/8294/4080 7461/8295/4080 7438/8296/4080 +f 7559/8297/4080 7545/8298/4080 7547/8299/4080 7416/8300/4080 +f 7514/8301/4081 7519/8302/4081 7417/8303/4081 7527/8304/4081 7513/8305/4081 +f 7564/8306/4081 7416/8300/4081 7547/8299/4081 7546/8307/4081 +f 7541/8308/4081 7464/8309/4081 7442/8310/4081 7441/8311/4081 7444/8312/4081 7466/8313/4081 7515/8314/4081 7537/8315/4081 7567/8316/4081 7542/8317/4081 +f 7508/8318/4082 7533/8319/4082 7517/8320/4082 7468/8321/4082 7469/8322/4082 7471/8323/4082 7472/8324/4082 7485/8325/4082 +f 7418/8326/4082 7500/8327/4082 7482/8328/4082 7484/8329/4082 +f 7519/8302/4082 7520/8330/4082 7532/8331/4082 7417/8303/4082 +f 7575/8332/4083 7505/8333/4083 7490/8334/4083 7474/8335/4083 7422/8336/4083 7475/8337/4083 7560/8338/4083 +f 7419/8339/4083 7572/8340/4083 7557/8341/4083 7558/8342/4083 7561/8343/4083 +f 7487/8344/4083 7501/8345/4083 7418/8326/4083 7484/8329/4083 7481/8346/4083 +f 7419/8339/4084 7561/8343/4084 7562/8347/4084 7573/8348/4084 +f 7426/8349/4084 7531/8350/4084 7555/8351/4084 7574/8352/4084 7563/8353/4084 7424/8354/4084 7423/8355/4084 7425/8356/4084 +f 7548/8357/4084 7530/8358/4084 7528/8359/4084 7420/8360/4084 +f 7554/8361/4085 7569/8362/4085 7567/8363/4085 7537/8364/4085 7538/8365/4085 7521/8366/4085 7443/8367/4085 7440/8368/4085 7439/8369/4085 +f 7416/8370/4085 7564/8371/4085 7565/8372/4085 +f 7477/8373/4086 7566/8374/4086 7447/8375/4086 7448/8376/4086 7495/8377/4086 7506/8378/4086 7505/8379/4086 7575/8380/4086 7478/8381/4086 +f 7501/8382/4058 7500/8383/4058 7418/8384/4058 +f 7523/8385/4087 7535/8386/4087 7533/8387/4087 7508/8388/4087 7511/8389/4087 7494/8390/4087 7493/8391/4087 7446/8392/4087 7445/8393/4087 7522/8394/4087 +f 7532/8395/4058 7527/8396/4058 7417/8397/4058 +f 7550/8398/4088 7548/8399/4088 7420/8400/4088 +f 7568/8401/4089 7480/8402/4089 7479/8403/4089 7574/8404/4089 7555/8405/4089 7556/8406/4089 7543/8407/4089 7540/8408/4089 7450/8409/4089 7449/8410/4089 +f 7419/8411/4058 7573/8412/4058 7572/8413/4058 +f 7536/8414/4090 7549/8415/4090 7420/8360/4090 7528/8359/4090 7529/8416/4090 +f 7429/8417/4091 7498/8418/4091 7525/8419/4091 7551/8420/4091 7534/8421/4091 7427/8422/4091 7428/8423/4091 +f 7512/8424/4091 7497/8425/4091 7496/8426/4091 7503/8427/4091 7421/8428/4091 +f 7503/8427/4092 7502/8429/4092 7516/8430/4092 7421/8428/4092 +f 7456/8431/4092 7415/8432/4092 7483/8433/4092 7457/8434/4092 +f 7459/8435/4092 7491/8436/4092 7518/8437/4092 7499/8438/4092 7431/8439/4092 7430/8440/4092 7432/8441/4092 7453/8442/4092 7434/8443/4092 7433/8444/4092 +f 7549/8445/4093 7550/8398/4093 7420/8400/4093 +f 7552/8446/4093 7551/8447/4093 7525/8448/4093 7526/8449/4093 7507/8450/4093 7504/8451/4093 7452/8452/4093 7451/8453/4093 7544/8454/4093 +f 7415/8455/4058 7486/8456/4058 7483/8457/4058 +f 7489/8458/4094 7488/8459/4094 7570/8460/4094 7571/8461/4094 7553/8462/4094 7435/8463/4094 7437/8464/4094 7467/8465/4094 7476/8466/4094 +f 7421/8467/4058 7516/8468/4058 7512/8469/4058 +f 7524/8470/4095 7518/8471/4095 7491/8472/4095 7492/8473/4095 7473/8474/4095 7470/8475/4095 7454/8476/4095 7455/8477/4095 7509/8478/4095 7510/8479/4095 +f 7565/8372/4096 7559/8480/4096 7416/8370/4096 +f 7604/8481/4097 7602/8482/4097 7437/8483/4097 7435/8484/4097 +f 7611/8485/4058 7609/8486/4058 7439/8487/4058 7440/8488/4058 +f 7440/8488/4058 7443/8489/4058 7612/8490/4058 7611/8485/4058 +f 7446/8491/4058 7605/8492/4058 7613/8493/4058 7445/8494/4058 +f 7594/8495/4058 7608/8496/4058 7448/8497/4058 7447/8498/4058 +f 7615/8499/4058 7598/8500/4058 7449/8501/4058 7450/8502/4058 +f 7452/8503/4058 7616/8504/4058 7586/8505/4058 7451/8506/4058 +f 7454/8507/4098 7617/8508/4098 7618/8509/4098 7455/8510/4098 +f 7602/8482/4058 7619/8511/4058 7467/8512/4058 7437/8483/4058 +f 7620/8513/4058 7617/8508/4058 7454/8507/4058 7470/8514/4058 +f 7622/8515/4058 7620/8513/4058 7470/8514/4058 7473/8516/4058 +f 7619/8511/4058 7626/8517/4058 7476/8518/4058 7467/8512/4058 +f 7634/8519/4058 7616/8504/4058 7452/8503/4058 7504/8520/4058 +f 7638/8521/4058 7634/8519/4058 7504/8520/4058 7507/8522/4058 +f 7639/8523/4058 7640/8524/4058 7510/8525/4058 7509/8526/4058 +f 7618/8509/4058 7639/8523/4058 7509/8526/4058 7455/8510/4058 +f 7585/8527/4057 7615/8499/4057 7450/8502/4057 7540/8528/4057 +f 7584/8529/4058 7585/8527/4058 7540/8528/4058 7543/8530/4058 +f 7451/8506/4058 7586/8505/4058 7587/8531/4058 7544/8532/4058 +f 7593/8533/4058 7594/8495/4058 7447/8498/4058 7566/8534/4058 +f 7595/8535/4058 7593/8533/4058 7566/8534/4058 7477/8536/4058 +f 7597/8537/4058 7596/8538/4058 7480/8539/4058 7568/8540/4058 +f 7598/8500/4058 7597/8537/4058 7568/8540/4058 7449/8501/4058 +f 7493/8541/4058 7606/8542/4058 7605/8492/4058 7446/8491/4058 +f 7494/8543/4099 7607/8544/4099 7606/8542/4099 7493/8541/4099 +f 7608/8496/4058 7610/8545/4058 7495/8546/4058 7448/8497/4058 +f 7443/8489/4058 7521/8547/4058 7625/8548/4058 7612/8490/4058 +f 7522/8549/4098 7628/8550/4098 7627/8551/4098 7523/8552/4098 +f 7613/8493/4100 7628/8550/4100 7522/8549/4100 7445/8494/4100 +f 7435/8484/4101 7553/8553/4101 7641/8554/4101 7604/8481/4101 +f 7609/8486/4058 7642/8555/4058 7554/8556/4058 7439/8487/4058 +f 7641/8557/4080 7645/8558/4080 7633/8559/4080 7626/8560/4080 7619/8561/4080 7602/8562/4080 7604/8563/4080 +f 7625/8564/4081 7630/8565/4081 7650/8566/4081 7642/8567/4081 7609/8568/4081 7611/8569/4081 7612/8570/4081 +f 7607/8571/4082 7614/8572/4082 7637/8573/4082 7627/8574/4082 7628/8575/4082 7613/8576/4082 7605/8577/4082 7606/8578/4082 +f 7595/8579/4083 7599/8580/4083 7623/8581/4083 7610/8582/4083 7608/8583/4083 7594/8584/4083 7593/8585/4083 +f 7584/8586/4084 7588/8587/4084 7601/8588/4084 7596/8589/4084 7597/8590/4084 7598/8591/4084 7615/8592/4084 7585/8593/4084 +f 7649/8594/4102 7650/8595/4102 7630/8596/4102 7635/8597/4102 7580/8598/4102 7579/8599/4102 +f 7636/8600/4103 7637/8601/4103 7614/8602/4103 7621/8603/4103 7582/8604/4103 +f 7583/8605/4104 7592/8606/4104 7590/8607/4104 +f 7603/8608/4105 7601/8609/4105 7588/8610/4105 7589/8611/4105 7577/8612/4105 +f 7624/8613/4106 7623/8614/4106 7599/8615/4106 7600/8616/4106 7578/8617/4106 +f 7638/8618/4091 7643/8619/4091 7591/8620/4091 7587/8621/4091 7586/8622/4091 7616/8623/4091 7634/8624/4091 +f 7620/8625/4092 7622/8626/4092 7629/8627/4092 7646/8628/4092 7640/8629/4092 7639/8630/4092 7618/8631/4092 7617/8632/4092 +f 7643/8633/4107 7644/8634/4107 7583/8605/4107 7590/8607/4107 7591/8635/4107 +f 7651/8636/4108 7646/8637/4108 7629/8638/4108 7631/8639/4108 7576/8640/4108 +f 7632/8641/4109 7633/8642/4109 7645/8643/4109 7647/8644/4109 7581/8645/4109 +f 7579/8599/4110 7648/8646/4110 7649/8594/4110 +f 7653/8647/4058 7654/8648/4058 7655/8649/4058 7656/8650/4058 7657/8651/4058 7658/8652/4058 7652/8653/4058 +f 7667/8654/4058 7660/8655/4058 7659/8656/4058 7666/8657/4058 +f 7666/8657/4058 7659/8656/4058 7661/8658/4058 7668/8659/4058 +f 7668/8659/4058 7661/8658/4058 7662/8660/4058 7669/8661/4058 +f 7669/8661/4058 7662/8660/4058 7663/8662/4058 7670/8663/4058 +f 7670/8663/4058 7663/8662/4058 7664/8664/4058 7671/8665/4058 +f 7671/8665/4058 7664/8664/4058 7665/8666/4058 7672/8667/4058 +f 7672/8667/4058 7665/8666/4058 7660/8655/4058 7667/8654/4058 +f 7652/8653/4111 7667/8654/4111 7666/8657/4111 7653/8647/4111 +f 7653/8647/4112 7666/8657/4112 7668/8659/4112 7654/8648/4112 +f 7654/8648/4113 7668/8659/4113 7669/8661/4113 7655/8649/4113 +f 7655/8649/4114 7669/8661/4114 7670/8663/4114 7656/8650/4114 +f 7656/8650/4115 7670/8663/4115 7671/8665/4115 7657/8651/4115 +f 7657/8651/4116 7671/8665/4116 7672/8667/4116 7658/8652/4116 +f 7658/8652/4117 7672/8667/4117 7667/8654/4117 7652/8653/4117 +f 7674/8668/4118 7677/8669/4118 7361/8096/4118 7360/8095/4118 +f 7679/8670/4119 7681/8671/4119 7369/8102/4119 7368/8101/4119 +f 7683/8672/4120 7685/8673/4120 7377/8108/4120 7376/8107/4120 +f 7687/8674/4121 7688/8675/4121 7385/8114/4121 7384/8113/4121 +f 7692/8676/4122 7694/8677/4122 7393/8120/4122 7392/8119/4122 +f 7676/8678/4123 7675/8679/4123 7401/8126/4123 7400/8125/4123 +f 7684/8680/4124 7682/8681/4124 7409/8132/4124 7408/8131/4124 +f 7631/8682/4061 7629/8683/4061 7622/8684/4061 7473/8685/4061 7492/8154/4061 7363/8159/4061 7361/8686/4061 7677/8687/4061 7691/8688/4061 +f 7626/8689/4060 7633/8690/4060 7632/8691/4060 7693/8692/4060 7674/8693/4060 7360/8694/4060 7362/8152/4060 7489/8151/4060 7476/8695/4060 +f 7644/8696/4064 7643/8697/4064 7638/8698/4064 7507/8699/4064 7526/8174/4064 7371/8179/4064 7369/8700/4064 7681/8701/4064 7700/8702/4064 +f 7640/8703/4063 7646/8704/4063 7651/8705/4063 7703/8706/4063 7679/8707/4063 7368/8708/4063 7370/8172/4063 7524/8171/4063 7510/8709/4063 +f 7685/8710/4067 7704/8711/4067 7589/8712/4067 7588/8713/4067 7584/8714/4067 7543/8715/4067 7556/8195/4067 7379/8200/4067 7377/8716/4067 +f 7587/8717/4066 7591/8718/4066 7590/8719/4066 7592/8720/4066 7709/8721/4066 7683/8722/4066 7376/8723/4066 7378/8193/4066 7552/8192/4066 7544/8724/4066 +f 7688/8725/4070 7710/8726/4070 7600/8727/4070 7599/8728/4070 7595/8729/4070 7477/8730/4070 7478/8215/4070 7387/8220/4070 7385/8731/4070 +f 7596/8732/4069 7601/8733/4069 7603/8734/4069 7708/8735/4069 7687/8736/4069 7384/8737/4069 7386/8213/4069 7479/8212/4069 7480/8738/4069 +f 7694/8739/4073 7707/8740/4073 7621/8741/4073 7614/8742/4073 7607/8743/4073 7494/8744/4073 7511/8235/4073 7395/8240/4073 7393/8745/4073 +f 7610/8746/4072 7623/8747/4072 7624/8748/4072 7702/8749/4072 7692/8750/4072 7392/8751/4072 7394/8233/4072 7506/8232/4072 7495/8752/4072 +f 7635/8753/4076 7630/8754/4076 7625/8755/4076 7521/8756/4076 7538/8255/4076 7403/8260/4076 7401/8757/4076 7675/8758/4076 7673/8759/4076 +f 7627/8760/4075 7637/8761/4075 7636/8762/4075 7678/8763/4075 7676/8764/4075 7400/8765/4075 7402/8253/4075 7535/8252/4075 7523/8766/4075 +f 7647/8767/4079 7645/8768/4079 7641/8769/4079 7553/8770/4079 7571/8277/4079 7411/8282/4079 7409/8771/4079 7682/8772/4079 7680/8773/4079 +f 7642/8774/4078 7650/8775/4078 7649/8776/4078 7648/8777/4078 7686/8778/4078 7684/8779/4078 7408/8780/4078 7410/8275/4078 7569/8274/4078 7554/8781/4078 +f 7691/8782/4125 7689/8783/4125 7690/8784/4125 7576/8785/4125 7631/8786/4125 +f 7695/8787/4125 7693/8788/4125 7632/8789/4125 7581/8790/4125 +f 7680/8791/4126 7696/8792/4126 7695/8787/4126 7581/8790/4126 7647/8793/4126 +f 7697/8794/4126 7686/8795/4126 7648/8796/4126 7579/8797/4126 +f 7582/8798/4127 7698/8799/4127 7699/8800/4127 7678/8801/4127 7636/8802/4127 +f 7673/8803/4127 7701/8804/4127 7697/8794/4127 7579/8797/4127 7580/8805/4127 7635/8806/4127 +f 7578/8807/4128 7706/8808/4128 7705/8809/4128 7702/8810/4128 7624/8811/4128 +f 7707/8812/4128 7698/8799/4128 7582/8798/4128 7621/8813/4128 +f 7711/8814/4129 7712/8815/4129 7708/8816/4129 7603/8817/4129 7577/8818/4129 +f 7710/8819/4129 7706/8808/4129 7578/8807/4129 7600/8820/4129 +f 7704/8821/4130 7711/8814/4130 7577/8818/4130 7589/8822/4130 +f 7713/8823/4130 7709/8824/4130 7592/8825/4130 7583/8826/4130 +f 7700/8827/4131 7714/8828/4131 7713/8823/4131 7583/8826/4131 7644/8829/4131 +f 7690/8830/4131 7703/8831/4131 7651/8832/4131 7576/8833/4131 +f 7696/8834/4132 7659/8656/4132 7660/8655/4132 7689/8835/4132 7691/8836/4132 7677/8837/4132 7674/8838/4132 7693/8839/4132 7695/8840/4132 +f 7686/8841/4133 7697/8842/4133 7701/8843/4133 7661/8658/4133 7659/8656/4133 7696/8834/4133 7680/8844/4133 7682/8845/4133 7684/8846/4133 +f 7678/8847/4134 7699/8848/4134 7662/8660/4134 7661/8658/4134 7701/8843/4134 7673/8849/4134 7675/8850/4134 7676/8851/4134 +f 7698/8852/4135 7707/8853/4135 7694/8854/4135 7692/8855/4135 7702/8856/4135 7705/8857/4135 7663/8662/4135 7662/8660/4135 7699/8848/4135 +f 7706/8858/4136 7710/8859/4136 7688/8860/4136 7687/8861/4136 7708/8862/4136 7712/8863/4136 7664/8664/4136 7663/8662/4136 7705/8857/4136 +f 7711/8864/4137 7704/8865/4137 7685/8866/4137 7683/8867/4137 7709/8868/4137 7713/8869/4137 7714/8870/4137 7665/8666/4137 7664/8664/4137 7712/8863/4137 +f 7703/8871/4138 7690/8872/4138 7689/8835/4138 7660/8655/4138 7665/8666/4138 7714/8870/4138 7700/8873/4138 7681/8874/4138 7679/8875/4138 +usemtl Material.006 +f 6558/8876/4139 6055/8877/4139 6060/8878/4139 6564/8879/4139 6562/8880/4139 6557/8881/4139 +f 6973/8882/4140 6986/8883/4140 6981/8884/4140 6970/8885/4140 +f 6987/8886/4141 6998/8887/4141 6993/8888/4141 6980/8889/4141 +f 6999/8890/4142 7010/8891/4142 7005/8892/4142 6992/8893/4142 +f 7011/8894/4143 7022/8895/4143 7017/8896/4143 7004/8897/4143 +f 7023/8898/4144 7034/8899/4144 7029/8900/4144 7016/8901/4144 +f 7035/8902/4145 7046/8903/4145 7041/8904/4145 7028/8905/4145 +f 7047/8906/4146 7058/8907/4146 7053/8908/4146 7040/8909/4146 +f 7059/8910/4147 7070/8911/4147 7065/8912/4147 7052/8913/4147 +f 7071/8914/4148 7082/8915/4148 7077/8916/4148 7064/8917/4148 +f 7083/8918/4149 7094/8919/4149 7089/8920/4149 7076/8921/4149 +f 7095/8922/4150 7106/8923/4150 7101/8924/4150 7088/8925/4150 +f 7107/8926/4151 7118/8927/4151 7113/8928/4151 7100/8929/4151 +f 7119/8930/4152 7130/8931/4152 7125/8932/4152 7112/8933/4152 +f 7131/8934/4153 7142/8935/4153 7137/8936/4153 7124/8937/4153 +f 7143/8938/4154 7154/8939/4154 7149/8940/4154 7136/8941/4154 +f 7155/8942/4155 7166/8943/4155 7161/8944/4155 7148/8945/4155 +f 7167/8946/4156 7178/8947/4156 7173/8948/4156 7160/8949/4156 +f 7179/8950/4157 7190/8951/4157 7185/8952/4157 7172/8953/4157 +f 7191/8954/4158 7202/8955/4158 7197/8956/4158 7184/8957/4158 +f 7203/8958/4159 7214/8959/4159 7209/8960/4159 7196/8961/4159 +f 7215/8962/4160 7226/8963/4160 7221/8964/4160 7208/8965/4160 +f 7227/8966/4161 7238/8967/4161 7233/8968/4161 7220/8969/4161 +f 7239/8970/4162 7250/8971/4162 7245/8972/4162 7232/8973/4162 +f 7251/8974/4163 7262/8975/4163 7257/8976/4163 7244/8977/4163 +f 7263/8978/4164 7274/8979/4164 7269/8980/4164 7256/8981/4164 +f 7275/8982/4165 7286/8983/4165 7281/8984/4165 7268/8985/4165 +f 7287/8986/4166 7298/8987/4166 7293/8988/4166 7280/8989/4166 +f 7299/8990/4167 7310/8991/4167 7305/8992/4167 7292/8993/4167 +f 6564/8994/4168 6060/8995/4168 6065/8996/4168 6570/8997/4168 6568/8998/4168 6563/8999/4168 +f 6949/9000/4169 6972/9001/4169 6971/9002/4169 6946/9003/4169 +f 6552/9004/4170 6050/9005/4170 6055/9006/4170 6558/9007/4170 6556/9008/4170 6551/9009/4170 +f 6731/9010/4171 6544/9011/4171 6929/9012/4171 6954/9013/4171 +f 6045/9014/4172 6044/9015/4172 6049/9016/4172 6050/9017/4172 +f 6044/9018/4173 6043/8062/4173 6048/8093/4173 6049/9019/4173 +f 6549/9020/4174 6047/9021/4174 6255/9022/4174 6735/9023/4174 6733/9024/4174 6548/9025/4174 +f 6052/9026/4175 6051/9027/4175 6046/9028/4175 6047/9029/4175 +f 6051/9030/4176 7324/9031/4176 7323/9032/4176 6046/9033/4176 +f 6551/9009/4169 6556/9008/4169 6975/9034/4169 6950/9035/4169 +f 6050/9005/4177 6049/9036/4177 6054/9037/4177 6055/9006/4177 +f 6049/9019/4178 6048/8093/4178 6053/8092/4178 6054/9038/4178 +f 6941/9039/4169 6964/9040/4169 6560/9041/4169 6553/9042/4169 +f 6057/9043/4179 6056/9044/4179 6051/9045/4179 6052/9046/4179 +f 6056/9047/4180 7325/9048/4180 7324/9031/4180 6051/9030/4180 +f 6557/8881/4140 6562/8880/4140 6985/9049/4140 6974/9050/4140 +f 6055/8877/4181 6054/9051/4181 6059/9052/4181 6060/8878/4181 +f 6054/9038/4182 6053/8092/4182 6058/8091/4182 6059/9053/4182 +f 6965/9054/4140 6978/9055/4140 6566/9056/4140 6559/9057/4140 +f 6062/9058/4183 6061/9059/4183 6056/9060/4183 6057/9061/4183 +f 6061/9062/4184 7326/9063/4184 7325/9048/4184 6056/9047/4184 +f 6563/8999/4141 6568/8998/4141 6997/9064/4141 6984/9065/4141 +f 6060/8995/4185 6059/9066/4185 6064/9067/4185 6065/8996/4185 +f 6059/9053/4186 6058/8091/4186 6063/8090/4186 6064/9068/4186 +f 6979/9069/4141 6990/9070/4141 6572/9071/4141 6565/9072/4141 +f 6067/9073/4187 6066/9074/4187 6061/9075/4187 6062/9076/4187 +f 6066/9077/4188 7327/9078/4188 7326/9063/4188 6061/9062/4188 +f 6569/9079/4142 6574/9080/4142 7009/9081/4142 6996/9082/4142 +f 6065/9083/4189 6064/9084/4189 6069/9085/4189 6070/9086/4189 +f 6064/9068/4190 6063/8090/4190 6068/8089/4190 6069/9087/4190 +f 6991/9088/4142 7002/9089/4142 6578/9090/4142 6571/9091/4142 +f 6073/9092/4191 6072/9093/4191 6066/9094/4191 6067/9095/4191 +f 6072/9096/4192 7328/9097/4192 7327/9078/4192 6066/9077/4192 +f 6575/9098/4143 6580/9099/4143 7021/9100/4143 7008/9101/4143 +f 6070/9102/4193 6069/9103/4193 6076/9104/4193 6077/9105/4193 +f 6069/9087/4194 6068/8089/4194 6074/8088/4194 6076/9106/4194 +f 7003/9107/4143 7014/9108/4143 6584/9109/4143 6577/9110/4143 +f 6080/9111/4195 6079/9112/4195 6072/9113/4195 6073/9114/4195 +f 6079/9115/4196 7329/9116/4196 7328/9097/4196 6072/9096/4196 +f 6581/9117/4144 6586/9118/4144 7033/9119/4144 7020/9120/4144 +f 6077/9121/4197 6076/9122/4197 6083/9123/4197 6084/9124/4197 +f 6076/9106/4198 6074/8088/4198 6081/8087/4198 6083/9125/4198 +f 7015/9126/4144 7026/9127/4144 6590/9128/4144 6583/9129/4144 +f 6087/9130/4199 6086/9131/4199 6079/9132/4199 6080/9133/4199 +f 6086/9134/4200 7330/9135/4200 7329/9116/4200 6079/9115/4200 +f 6587/9136/4145 6592/9137/4145 7045/9138/4145 7032/9139/4145 +f 6084/9140/4201 6083/9141/4201 6090/9142/4201 6091/9143/4201 +f 6083/9125/4202 6081/8087/4202 6088/8086/4202 6090/9144/4202 +f 7027/9145/4145 7038/9146/4145 6596/9147/4145 6589/9148/4145 +f 6094/9149/4203 6093/9150/4203 6086/9151/4203 6087/9152/4203 +f 6093/9153/4204 7331/9154/4204 7330/9135/4204 6086/9134/4204 +f 6593/9155/4146 6598/9156/4146 7057/9157/4146 7044/9158/4146 +f 6091/9159/4205 6090/9160/4205 6097/9161/4205 6098/9162/4205 +f 6090/9144/4206 6088/8086/4206 6095/8085/4206 6097/9163/4206 +f 7039/9164/4146 7050/9165/4146 6602/9166/4146 6595/9167/4146 +f 6101/9168/4207 6100/9169/4207 6093/9170/4207 6094/9171/4207 +f 6100/9172/4208 7332/9173/4208 7331/9154/4208 6093/9153/4208 +f 6599/9174/4147 6604/9175/4147 7069/9176/4147 7056/9177/4147 +f 6098/9178/4209 6097/9179/4209 6104/9180/4209 6105/9181/4209 +f 6097/9163/4210 6095/8085/4210 6102/8084/4210 6104/9182/4210 +f 7051/9183/4147 7062/9184/4147 6608/9185/4147 6601/9186/4147 +f 6108/9187/4211 6107/9188/4211 6100/9189/4211 6101/9190/4211 +f 6107/9191/4212 7333/9192/4212 7332/9173/4212 6100/9172/4212 +f 6605/9193/4148 6610/9194/4148 7081/9195/4148 7068/9196/4148 +f 6105/9197/4213 6104/9198/4213 6111/9199/4213 6112/9200/4213 +f 6104/9182/4214 6102/8084/4214 6109/8083/4214 6111/9201/4214 +f 7063/9202/4148 7074/9203/4148 6614/9204/4148 6607/9205/4148 +f 6115/9206/4215 6114/9207/4215 6107/9208/4215 6108/9209/4215 +f 6114/9210/4216 7334/9211/4216 7333/9192/4216 6107/9191/4216 +f 6611/9212/4149 6616/9213/4149 7093/9214/4149 7080/9215/4149 +f 6112/9216/4217 6111/9217/4217 6118/9218/4217 6119/9219/4217 +f 6111/9201/4218 6109/8083/4218 6116/8082/4218 6118/9220/4218 +f 7075/9221/4149 7086/9222/4149 6620/9223/4149 6613/9224/4149 +f 6122/9225/4219 6121/9226/4219 6114/9227/4219 6115/9228/4219 +f 6121/9229/4220 7335/9230/4220 7334/9211/4220 6114/9210/4220 +f 6617/9231/4150 6622/9232/4150 7105/9233/4150 7092/9234/4150 +f 6119/9235/4221 6118/9236/4221 6125/9237/4221 6126/9238/4221 +f 6118/9220/4222 6116/8082/4222 6123/8081/4222 6125/9239/4222 +f 7087/9240/4150 7098/9241/4150 6626/9242/4150 6619/9243/4150 +f 6129/9244/4223 6128/9245/4223 6121/9246/4223 6122/9247/4223 +f 6128/9248/4224 7336/9249/4224 7335/9230/4224 6121/9229/4224 +f 6623/9250/4151 6628/9251/4151 7117/9252/4151 7104/9253/4151 +f 6126/9254/4225 6125/9255/4225 6132/9256/4225 6133/9257/4225 +f 6125/9239/4226 6123/8081/4226 6130/8080/4226 6132/9258/4226 +f 7099/9259/4151 7110/9260/4151 6632/9261/4151 6625/9262/4151 +f 6136/9263/4227 6135/9264/4227 6128/9265/4227 6129/9266/4227 +f 6135/9267/4228 7337/9268/4228 7336/9249/4228 6128/9248/4228 +f 6629/9269/4152 6634/9270/4152 7129/9271/4152 7116/9272/4152 +f 6133/9273/4229 6132/9274/4229 6139/9275/4229 6140/9276/4229 +f 6132/9258/4230 6130/8080/4230 6137/8079/4230 6139/9277/4230 +f 7111/9278/4152 7122/9279/4152 6638/9280/4152 6631/9281/4152 +f 6143/9282/4231 6142/9283/4231 6135/9284/4231 6136/9285/4231 +f 6142/9286/4232 7338/9287/4232 7337/9268/4232 6135/9267/4232 +f 6635/9288/4153 6640/9289/4153 7141/9290/4153 7128/9291/4153 +f 6140/9292/4233 6139/9293/4233 6146/9294/4233 6147/9295/4233 +f 6139/9277/4234 6137/8079/4234 6144/8078/4234 6146/9296/4234 +f 7123/9297/4153 7134/9298/4153 6644/9299/4153 6637/9300/4153 +f 6150/9301/4235 6149/9302/4235 6142/9303/4235 6143/9304/4235 +f 6149/9305/4236 7339/9306/4236 7338/9287/4236 6142/9286/4236 +f 6641/9307/4154 6646/9308/4154 7153/9309/4154 7140/9310/4154 +f 6147/9311/4237 6146/9312/4237 6153/9313/4237 6154/9314/4237 +f 6146/9296/4238 6144/8078/4238 6151/8077/4238 6153/9315/4238 +f 7135/9316/4154 7146/9317/4154 6650/9318/4154 6643/9319/4154 +f 6157/9320/4239 6156/9321/4239 6149/9322/4239 6150/9323/4239 +f 6156/9324/4240 7340/9325/4240 7339/9306/4240 6149/9305/4240 +f 6647/9326/4155 6652/9327/4155 7165/9328/4155 7152/9329/4155 +f 6154/9330/4241 6153/9331/4241 6160/9332/4241 6161/9333/4241 +f 6153/9315/4242 6151/8077/4242 6158/8076/4242 6160/9334/4242 +f 7147/9335/4155 7158/9336/4155 6656/9337/4155 6649/9338/4155 +f 6164/9339/4243 6163/9340/4243 6156/9341/4243 6157/9342/4243 +f 6163/9343/4244 7341/9344/4244 7340/9325/4244 6156/9324/4244 +f 6653/9345/4156 6658/9346/4156 7177/9347/4156 7164/9348/4156 +f 6161/9349/4245 6160/9350/4245 6167/9351/4245 6168/9352/4245 +f 6160/9334/4246 6158/8076/4246 6165/8075/4246 6167/9353/4246 +f 7159/9354/4156 7170/9355/4156 6662/9356/4156 6655/9357/4156 +f 6171/9358/4247 6170/9359/4247 6163/9360/4247 6164/9361/4247 +f 6170/9362/4248 7342/9363/4248 7341/9344/4248 6163/9343/4248 +f 6659/9364/4157 6664/9365/4157 7189/9366/4157 7176/9367/4157 +f 6168/9368/4249 6167/9369/4249 6174/9370/4249 6175/9371/4249 +f 6167/9353/4250 6165/8075/4250 6172/8074/4250 6174/9372/4250 +f 7171/9373/4157 7182/9374/4157 6668/9375/4157 6661/9376/4157 +f 6178/9377/4251 6177/9378/4251 6170/9379/4251 6171/9380/4251 +f 6177/9381/4252 7343/9382/4252 7342/9363/4252 6170/9362/4252 +f 6665/9383/4158 6670/9384/4158 7201/9385/4158 7188/9386/4158 +f 6175/9387/4253 6174/9388/4253 6181/9389/4253 6182/9390/4253 +f 6174/9372/4254 6172/8074/4254 6179/8073/4254 6181/9391/4254 +f 7183/9392/4158 7194/9393/4158 6674/9394/4158 6667/9395/4158 +f 6185/9396/4255 6184/9397/4255 6177/9398/4255 6178/9399/4255 +f 6184/9400/4256 7344/9401/4256 7343/9382/4256 6177/9381/4256 +f 6671/9402/4159 6676/9403/4159 7213/9404/4159 7200/9405/4159 +f 6182/9406/4257 6181/9407/4257 6188/9408/4257 6189/9409/4257 +f 6181/9391/4258 6179/8073/4258 6186/8072/4258 6188/9410/4258 +f 7195/9411/4159 7206/9412/4159 6680/9413/4159 6673/9414/4159 +f 6192/9415/4259 6191/9416/4259 6184/9417/4259 6185/9418/4259 +f 6191/9419/4260 7345/9420/4260 7344/9401/4260 6184/9400/4260 +f 6677/9421/4160 6682/9422/4160 7225/9423/4160 7212/9424/4160 +f 6189/9425/4261 6188/9426/4261 6195/9427/4261 6196/9428/4261 +f 6188/9410/4262 6186/8072/4262 6193/8071/4262 6195/9429/4262 +f 7207/9430/4160 7218/9431/4160 6686/9432/4160 6679/9433/4160 +f 6199/9434/4263 6198/9435/4263 6191/9436/4263 6192/9437/4263 +f 6198/9438/4264 7346/9439/4264 7345/9420/4264 6191/9419/4264 +f 6683/9440/4161 6688/9441/4161 7237/9442/4161 7224/9443/4161 +f 6196/9444/4265 6195/9445/4265 6202/9446/4265 6203/9447/4265 +f 6195/9429/4266 6193/8071/4266 6200/8070/4266 6202/9448/4266 +f 7219/9449/4161 7230/9450/4161 6692/9451/4161 6685/9452/4161 +f 6206/9453/4267 6205/9454/4267 6198/9455/4267 6199/9456/4267 +f 6205/9457/4268 7347/9458/4268 7346/9439/4268 6198/9438/4268 +f 6689/9459/4162 6694/9460/4162 7249/9461/4162 7236/9462/4162 +f 6203/9463/4269 6202/9464/4269 6209/9465/4269 6210/9466/4269 +f 6202/9448/4270 6200/8070/4270 6207/8069/4270 6209/9467/4270 +f 7231/9468/4162 7242/9469/4162 6698/9470/4162 6691/9471/4162 +f 6213/9472/4271 6212/9473/4271 6205/9474/4271 6206/9475/4271 +f 6212/9476/4272 7348/9477/4272 7347/9458/4272 6205/9457/4272 +f 6695/9478/4163 6700/9479/4163 7261/9480/4163 7248/9481/4163 +f 6210/9482/4273 6209/9483/4273 6216/9484/4273 6217/9485/4273 +f 6209/9467/4274 6207/8069/4274 6214/8068/4274 6216/9486/4274 +f 7243/9487/4163 7254/9488/4163 6704/9489/4163 6697/9490/4163 +f 6220/9491/4275 6219/9492/4275 6212/9493/4275 6213/9494/4275 +f 6219/9495/4276 7349/9496/4276 7348/9477/4276 6212/9476/4276 +f 6701/9497/4164 6706/9498/4164 7273/9499/4164 7260/9500/4164 +f 6217/9501/4277 6216/9502/4277 6223/9503/4277 6224/9504/4277 +f 6216/9486/4278 6214/8068/4278 6221/8067/4278 6223/9505/4278 +f 7255/9506/4164 7266/9507/4164 6710/9508/4164 6703/9509/4164 +f 6227/9510/4279 6226/9511/4279 6219/9512/4279 6220/9513/4279 +f 6226/9514/4280 7350/9515/4280 7349/9496/4280 6219/9495/4280 +f 6707/9516/4165 6712/9517/4165 7285/9518/4165 7272/9519/4165 +f 6224/9520/4281 6223/9521/4281 6230/9522/4281 6231/9523/4281 +f 6223/9505/4282 6221/8067/4282 6228/8066/4282 6230/9524/4282 +f 7267/9525/4165 7278/9526/4165 6716/9527/4165 6709/9528/4165 +f 6234/9529/4283 6233/9530/4283 6226/9531/4283 6227/9532/4283 +f 6233/9533/4284 7351/9534/4284 7350/9515/4284 6226/9514/4284 +f 6713/9535/4285 6718/9536/4285 7297/9537/4285 7284/9538/4285 +f 6231/9539/4286 6230/9540/4286 6237/9541/4286 6238/9542/4286 +f 6230/9524/4287 6228/8066/4287 6235/8065/4287 6237/9543/4287 +f 7279/9544/4285 7290/9545/4285 6722/9546/4285 6715/9547/4285 +f 6241/9548/4288 6240/9549/4288 6233/9550/4288 6234/9551/4288 +f 6240/9552/4289 7352/9553/4289 7351/9534/4289 6233/9533/4289 +f 6719/9554/4167 6724/9555/4167 7309/9556/4167 7296/9557/4167 +f 6238/9558/4290 6237/9559/4290 6244/9560/4290 6245/9561/4290 +f 6237/9543/4291 6235/8065/4291 6242/8064/4291 6244/9562/4291 +f 7291/9563/4167 7302/9564/4167 6728/9565/4167 6721/9566/4167 +f 6248/9567/4292 6247/9568/4292 6240/9569/4292 6241/9570/4292 +f 6247/9571/4293 7353/9572/4293 7352/9553/4293 6240/9552/4293 +f 6725/9573/4294 6730/9574/4294 6955/9575/4294 7308/9576/4294 +f 6245/9577/4295 6244/9578/4295 6251/9579/4295 6252/9580/4295 +f 6244/9562/4296 6242/8064/4296 6249/8063/4296 6251/9581/4296 +f 7303/9582/4294 6960/9583/4294 6734/9584/4294 6727/9585/4294 +f 6255/9586/4297 6254/9587/4297 6247/9588/4297 6248/9589/4297 +f 6254/9590/4298 7354/9591/4298 7353/9572/4298 6247/9571/4298 +f 6546/9592/4299 6045/9014/4299 6050/9017/4299 6552/9593/4299 6550/9594/4299 6545/9595/4299 +f 6252/9596/4300 6251/9597/4300 6044/9598/4300 6045/9599/4300 +f 6251/9581/4301 6249/8063/4301 6043/8062/4301 6044/9018/4301 +f 6961/9600/4171 6938/9601/4171 6548/9025/4171 6733/9024/4171 +f 6047/9021/4302 6046/9602/4302 6254/9603/4302 6255/9022/4302 +f 6046/9033/4303 7323/9032/4303 7354/9591/4303 6254/9590/4303 +f 6935/9604/4304 6944/9605/4304 6943/9606/4304 6936/9607/4304 +f 6939/9608/4304 6940/9609/4304 6554/9610/4304 6547/9611/4304 +f 6555/9612/4305 6052/9026/4305 6047/9029/4305 6549/9613/4305 6547/9611/4305 6554/9610/4305 +f 6735/9614/4306 6255/9586/4306 6248/9589/4306 6729/9615/4306 6727/9585/4306 6734/9584/4306 +f 6561/9616/4307 6057/9043/4307 6052/9046/4307 6555/9617/4307 6553/9042/4307 6560/9041/4307 +f 7311/9618/4294 6952/9619/4294 6959/9620/4294 7304/9621/4294 +f 7307/9622/4294 6956/9623/4294 6963/9624/4294 7300/9625/4294 +f 6969/9626/4140 6982/9627/4140 6977/9628/4140 6966/9629/4140 +f 6794/9630/4308 6974/9050/4308 6985/9049/4308 6736/9631/4308 +f 6918/9632/4309 6962/9633/4309 6937/9634/4309 6926/9635/4309 +f 6729/9636/4310 6248/9567/4310 6241/9570/4310 6723/9637/4310 6721/9566/4310 6728/9565/4310 +f 7020/9120/4311 6541/9638/4311 6543/9639/4311 6581/9117/4311 +f 6726/9640/4312 6245/9577/4312 6252/9580/4312 6732/9641/4312 6730/9574/4312 6725/9573/4312 +f 6723/9642/4313 6241/9548/4313 6234/9551/4313 6717/9643/4313 6715/9547/4313 6722/9546/4313 +f 7295/9644/4167 7306/9645/4167 7301/9646/4167 7288/9647/4167 +f 6720/9648/4314 6238/9558/4314 6245/9561/4314 6726/9649/4314 6724/9555/4314 6719/9554/4314 +f 6717/9650/4315 6234/9529/4315 6227/9532/4315 6711/9651/4315 6709/9528/4315 6716/9527/4315 +f 7283/9652/4166 7294/9653/4166 7289/9654/4166 7276/9655/4166 +f 6714/9656/4316 6231/9539/4316 6238/9542/4316 6720/9657/4316 6718/9536/4316 6713/9535/4316 +f 6711/9658/4317 6227/9510/4317 6220/9513/4317 6705/9659/4317 6703/9509/4317 6710/9508/4317 +f 7271/9660/4165 7282/9661/4165 7277/9662/4165 7264/9663/4165 +f 6708/9664/4318 6224/9520/4318 6231/9523/4318 6714/9665/4318 6712/9517/4318 6707/9516/4318 +f 6705/9666/4319 6220/9491/4319 6213/9494/4319 6699/9667/4319 6697/9490/4319 6704/9489/4319 +f 7259/9668/4164 7270/9669/4164 7265/9670/4164 7252/9671/4164 +f 6702/9672/4320 6217/9501/4320 6224/9504/4320 6708/9673/4320 6706/9498/4320 6701/9497/4320 +f 6699/9674/4321 6213/9472/4321 6206/9475/4321 6693/9675/4321 6691/9471/4321 6698/9470/4321 +f 7247/9676/4163 7258/9677/4163 7253/9678/4163 7240/9679/4163 +f 6696/9680/4322 6210/9482/4322 6217/9485/4322 6702/9681/4322 6700/9479/4322 6695/9478/4322 +f 6693/9682/4323 6206/9453/4323 6199/9456/4323 6687/9683/4323 6685/9452/4323 6692/9451/4323 +f 7235/9684/4162 7246/9685/4162 7241/9686/4162 7228/9687/4162 +f 6690/9688/4324 6203/9463/4324 6210/9466/4324 6696/9689/4324 6694/9460/4324 6689/9459/4324 +f 6687/9690/4325 6199/9434/4325 6192/9437/4325 6681/9691/4325 6679/9433/4325 6686/9432/4325 +f 7223/9692/4161 7234/9693/4161 7229/9694/4161 7216/9695/4161 +f 6684/9696/4326 6196/9444/4326 6203/9447/4326 6690/9697/4326 6688/9441/4326 6683/9440/4326 +f 6681/9698/4327 6192/9415/4327 6185/9418/4327 6675/9699/4327 6673/9414/4327 6680/9413/4327 +f 7211/9700/4160 7222/9701/4160 7217/9702/4160 7204/9703/4160 +f 6678/9704/4328 6189/9425/4328 6196/9428/4328 6684/9705/4328 6682/9422/4328 6677/9421/4328 +f 6675/9706/4329 6185/9396/4329 6178/9399/4329 6669/9707/4329 6667/9395/4329 6674/9394/4329 +f 7199/9708/4159 7210/9709/4159 7205/9710/4159 7192/9711/4159 +f 6672/9712/4330 6182/9406/4330 6189/9409/4330 6678/9713/4330 6676/9403/4330 6671/9402/4330 +f 6669/9714/4331 6178/9377/4331 6171/9380/4331 6663/9715/4331 6661/9376/4331 6668/9375/4331 +f 7187/9716/4158 7198/9717/4158 7193/9718/4158 7180/9719/4158 +f 6666/9720/4332 6175/9387/4332 6182/9390/4332 6672/9721/4332 6670/9384/4332 6665/9383/4332 +f 6663/9722/4333 6171/9358/4333 6164/9361/4333 6657/9723/4333 6655/9357/4333 6662/9356/4333 +f 7175/9724/4157 7186/9725/4157 7181/9726/4157 7168/9727/4157 +f 6660/9728/4334 6168/9368/4334 6175/9371/4334 6666/9729/4334 6664/9365/4334 6659/9364/4334 +f 6657/9730/4335 6164/9339/4335 6157/9342/4335 6651/9731/4335 6649/9338/4335 6656/9337/4335 +f 7163/9732/4156 7174/9733/4156 7169/9734/4156 7156/9735/4156 +f 6654/9736/4336 6161/9349/4336 6168/9352/4336 6660/9737/4336 6658/9346/4336 6653/9345/4336 +f 6651/9738/4337 6157/9320/4337 6150/9323/4337 6645/9739/4337 6643/9319/4337 6650/9318/4337 +f 7151/9740/4155 7162/9741/4155 7157/9742/4155 7144/9743/4155 +f 6648/9744/4338 6154/9330/4338 6161/9333/4338 6654/9745/4338 6652/9327/4338 6647/9326/4338 +f 6645/9746/4339 6150/9301/4339 6143/9304/4339 6639/9747/4339 6637/9300/4339 6644/9299/4339 +f 7139/9748/4154 7150/9749/4154 7145/9750/4154 7132/9751/4154 +f 6642/9752/4340 6147/9311/4340 6154/9314/4340 6648/9753/4340 6646/9308/4340 6641/9307/4340 +f 6639/9754/4341 6143/9282/4341 6136/9285/4341 6633/9755/4341 6631/9281/4341 6638/9280/4341 +f 7127/9756/4153 7138/9757/4153 7133/9758/4153 7120/9759/4153 +f 6636/9760/4342 6140/9292/4342 6147/9295/4342 6642/9761/4342 6640/9289/4342 6635/9288/4342 +f 6633/9762/4343 6136/9263/4343 6129/9266/4343 6627/9763/4343 6625/9262/4343 6632/9261/4343 +f 7115/9764/4152 7126/9765/4152 7121/9766/4152 7108/9767/4152 +f 6630/9768/4344 6133/9273/4344 6140/9276/4344 6636/9769/4344 6634/9270/4344 6629/9269/4344 +f 6627/9770/4345 6129/9244/4345 6122/9247/4345 6621/9771/4345 6619/9243/4345 6626/9242/4345 +f 7103/9772/4151 7114/9773/4151 7109/9774/4151 7096/9775/4151 +f 6624/9776/4346 6126/9254/4346 6133/9257/4346 6630/9777/4346 6628/9251/4346 6623/9250/4346 +f 6621/9778/4347 6122/9225/4347 6115/9228/4347 6615/9779/4347 6613/9224/4347 6620/9223/4347 +f 7091/9780/4150 7102/9781/4150 7097/9782/4150 7084/9783/4150 +f 6618/9784/4348 6119/9235/4348 6126/9238/4348 6624/9785/4348 6622/9232/4348 6617/9231/4348 +f 6615/9786/4349 6115/9206/4349 6108/9209/4349 6609/9787/4349 6607/9205/4349 6614/9204/4349 +f 7079/9788/4149 7090/9789/4149 7085/9790/4149 7072/9791/4149 +f 6612/9792/4350 6112/9216/4350 6119/9219/4350 6618/9793/4350 6616/9213/4350 6611/9212/4350 +f 6609/9794/4351 6108/9187/4351 6101/9190/4351 6603/9795/4351 6601/9186/4351 6608/9185/4351 +f 7067/9796/4148 7078/9797/4148 7073/9798/4148 7060/9799/4148 +f 6606/9800/4352 6105/9197/4352 6112/9200/4352 6612/9801/4352 6610/9194/4352 6605/9193/4352 +f 6603/9802/4353 6101/9168/4353 6094/9171/4353 6597/9803/4353 6595/9167/4353 6602/9166/4353 +f 7055/9804/4147 7066/9805/4147 7061/9806/4147 7048/9807/4147 +f 6600/9808/4354 6098/9178/4354 6105/9181/4354 6606/9809/4354 6604/9175/4354 6599/9174/4354 +f 6597/9810/4355 6094/9149/4355 6087/9152/4355 6591/9811/4355 6589/9148/4355 6596/9147/4355 +f 7043/9812/4146 7054/9813/4146 7049/9814/4146 7036/9815/4146 +f 6594/9816/4356 6091/9159/4356 6098/9162/4356 6600/9817/4356 6598/9156/4356 6593/9155/4356 +f 6591/9818/4357 6087/9130/4357 6080/9133/4357 6585/9819/4357 6583/9129/4357 6590/9128/4357 +f 7031/9820/4145 7042/9821/4145 7037/9822/4145 7024/9823/4145 +f 6588/9824/4358 6084/9140/4358 6091/9143/4358 6594/9825/4358 6592/9137/4358 6587/9136/4358 +f 6585/9826/4359 6080/9111/4359 6073/9114/4359 6579/9827/4359 6577/9110/4359 6584/9109/4359 +f 7019/9828/4144 7030/9829/4144 7025/9830/4144 7012/9831/4144 +f 6582/9832/4360 6077/9121/4360 6084/9124/4360 6588/9833/4360 6586/9118/4360 6581/9117/4360 +f 6579/9834/4361 6073/9092/4361 6067/9095/4361 6573/9835/4361 6571/9091/4361 6578/9090/4361 +f 7007/9836/4143 7018/9837/4143 7013/9838/4143 7000/9839/4143 +f 6576/9840/4362 6070/9102/4362 6077/9105/4362 6582/9841/4362 6580/9099/4362 6575/9098/4362 +f 6573/9842/4363 6067/9073/4363 6062/9076/4363 6567/9843/4363 6565/9072/4363 6572/9071/4363 +f 6995/9844/4142 7006/9845/4142 7001/9846/4142 6988/9847/4142 +f 6570/9848/4364 6065/9083/4364 6070/9086/4364 6576/9849/4364 6574/9080/4364 6569/9079/4364 +f 6567/9850/4365 6062/9058/4365 6057/9061/4365 6561/9851/4365 6559/9057/4365 6566/9056/4365 +f 6983/9852/4141 6994/9853/4141 6989/9854/4141 6976/9855/4141 +f 6953/9856/4171 6930/9857/4171 6933/9858/4171 6958/9859/4171 +f 6945/9860/4169 6968/9861/4169 6967/9862/4169 6942/9863/4169 +f 6957/9864/4171 6934/9865/4171 6937/9634/4171 6962/9633/4171 +f 6983/9852/4366 6801/9866/4366 6802/9867/4366 6994/9853/4366 +f 6965/9054/4367 6922/9868/4367 6864/9869/4367 6978/9055/4367 +f 6931/9870/4304 6948/9871/4304 6947/9872/4304 6932/9873/4304 +f 6931/9870/4368 6799/9874/4368 6797/9875/4368 6948/9871/4368 +f 6935/9604/4369 6863/9876/4369 6861/9877/4369 6944/9605/4369 +f 6939/9608/4370 6927/9878/4370 6925/9879/4370 6940/9609/4370 +f 6949/9000/4371 6796/9880/4371 6795/9881/4371 6972/9001/4371 +f 6854/9882/4372 6958/9859/4372 6933/9858/4372 6862/9883/4372 +f 6941/9039/4373 6924/9884/4373 6923/9885/4373 6964/9040/4373 +f 7299/8990/4374 6789/9886/4374 6792/9887/4374 7310/8991/4374 +f 6957/9864/4375 6854/9882/4375 6862/9883/4375 6934/9865/4375 +f 7291/9563/4376 6917/9888/4376 6920/9889/4376 7302/9564/4376 +f 6789/9886/4377 7296/9557/4377 7309/9556/4377 6792/9887/4377 +f 7283/9652/4378 6851/9890/4378 6852/9891/4378 7294/9653/4378 +f 6917/9888/4379 7288/9647/4379 7301/9646/4379 6920/9889/4379 +f 7275/8982/4380 6785/9892/4380 6786/9893/4380 7286/8983/4380 +f 6851/9890/4381 7280/8989/4381 7293/8988/4381 6852/9891/4381 +f 7279/9544/4382 6915/9894/4382 6916/9895/4382 7290/9545/4382 +f 6785/9892/4383 7272/9519/4383 7285/9518/4383 6786/9893/4383 +f 7271/9660/4384 6849/9896/4384 6850/9897/4384 7282/9661/4384 +f 7255/9506/4385 6911/9898/4385 6912/9899/4385 7266/9507/4385 +f 7263/8978/4386 6783/9900/4386 6784/9901/4386 7274/8979/4386 +f 7247/9676/4387 6845/9902/4387 6846/9903/4387 7258/9677/4387 +f 6911/9898/4388 7252/9671/4388 7265/9670/4388 6912/9899/4388 +f 7239/8970/4389 6779/9904/4389 6780/9905/4389 7250/8971/4389 +f 6845/9902/4390 7244/8977/4390 7257/8976/4390 6846/9903/4390 +f 7231/9468/4391 6907/9906/4391 6908/9907/4391 7242/9469/4391 +f 6779/9904/4392 7236/9462/4392 7249/9461/4392 6780/9905/4392 +f 7223/9692/4393 6841/9908/4393 6842/9909/4393 7234/9693/4393 +f 6907/9906/4394 7228/9687/4394 7241/9686/4394 6908/9907/4394 +f 7215/8962/4395 6775/9910/4395 6776/9911/4395 7226/8963/4395 +f 6841/9908/4396 7220/8969/4396 7233/8968/4396 6842/9909/4396 +f 7207/9430/4397 6903/9912/4397 6904/9913/4397 7218/9431/4397 +f 6775/9910/4398 7212/9424/4398 7225/9423/4398 6776/9911/4398 +f 7199/9708/4399 6837/9914/4399 6838/9915/4399 7210/9709/4399 +f 6903/9912/4400 7204/9703/4400 7217/9702/4400 6904/9913/4400 +f 7191/8954/4401 6771/9916/4401 6772/9917/4401 7202/8955/4401 +f 6837/9914/4402 7196/8961/4402 7209/8960/4402 6838/9915/4402 +f 7195/9411/4403 6901/9918/4403 6902/9919/4403 7206/9412/4403 +f 6771/9916/4404 7188/9386/4404 7201/9385/4404 6772/9917/4404 +f 7187/9716/4405 6835/9920/4405 6836/9921/4405 7198/9717/4405 +f 7171/9373/4406 6897/9922/4406 6898/9923/4406 7182/9374/4406 +f 7179/8950/4407 6769/9924/4407 6770/9925/4407 7190/8951/4407 +f 7163/9732/4408 6831/9926/4408 6832/9927/4408 7174/9733/4408 +f 6897/9922/4409 7168/9727/4409 7181/9726/4409 6898/9923/4409 +f 7155/8942/4410 6765/9928/4410 6766/9929/4410 7166/8943/4410 +f 6831/9926/4411 7160/8949/4411 7173/8948/4411 6832/9927/4411 +f 7147/9335/4412 6893/9930/4412 6894/9931/4412 7158/9336/4412 +f 6765/9928/4413 7152/9329/4413 7165/9328/4413 6766/9929/4413 +f 7139/9748/4414 6827/9932/4414 6828/9933/4414 7150/9749/4414 +f 6893/9930/4415 7144/9743/4415 7157/9742/4415 6894/9931/4415 +f 7131/8934/4416 6761/9934/4416 6762/9935/4416 7142/8935/4416 +f 6827/9932/4417 7136/8941/4417 7149/8940/4417 6828/9933/4417 +f 7123/9297/4418 6889/9936/4418 6890/9937/4418 7134/9298/4418 +f 6761/9934/4419 7128/9291/4419 7141/9290/4419 6762/9935/4419 +f 7115/9764/4420 6823/9938/4420 6824/9939/4420 7126/9765/4420 +f 6889/9936/4421 7120/9759/4421 7133/9758/4421 6890/9937/4421 +f 7107/8926/4422 6757/9940/4422 6758/9941/4422 7118/8927/4422 +f 6823/9938/4423 7112/8933/4423 7125/8932/4423 6824/9939/4423 +f 7111/9278/4424 6887/9942/4424 6888/9943/4424 7122/9279/4424 +f 6757/9940/4425 7104/9253/4425 7117/9252/4425 6758/9941/4425 +f 7103/9772/4426 6821/9944/4426 6822/9945/4426 7114/9773/4426 +f 7087/9240/4427 6883/9946/4427 6884/9947/4427 7098/9241/4427 +f 7095/8922/4428 6755/9948/4428 6756/9949/4428 7106/8923/4428 +f 7079/9788/4429 6817/9950/4429 6818/9951/4429 7090/9789/4429 +f 6883/9946/4430 7084/9783/4430 7097/9782/4430 6884/9947/4430 +f 7071/8914/4431 6751/9952/4431 6752/9953/4431 7082/8915/4431 +f 6817/9950/4432 7076/8921/4432 7089/8920/4432 6818/9951/4432 +f 7063/9202/4433 6879/9954/4433 6880/9955/4433 7074/9203/4433 +f 6751/9952/4434 7068/9196/4434 7081/9195/4434 6752/9953/4434 +f 7055/9804/4435 6813/9956/4435 6814/9957/4435 7066/9805/4435 +f 6879/9954/4436 7060/9799/4436 7073/9798/4436 6880/9955/4436 +f 7047/8906/4437 6747/9958/4437 6748/9959/4437 7058/8907/4437 +f 6813/9956/4438 7052/8913/4438 7065/8912/4438 6814/9957/4438 +f 7039/9164/4439 6875/9960/4439 6876/9961/4439 7050/9165/4439 +f 6747/9958/4440 7044/9158/4440 7057/9157/4440 6748/9959/4440 +f 7031/9820/4441 6809/9962/4441 6810/9963/4441 7042/9821/4441 +f 6875/9960/4442 7036/9815/4442 7049/9814/4442 6876/9961/4442 +f 7023/8898/4443 6743/9964/4443 6744/9965/4443 7034/8899/4443 +f 6809/9962/4444 7028/8905/4444 7041/8904/4444 6810/9963/4444 +f 7027/9145/4445 6873/9966/4445 6874/9967/4445 7038/9146/4445 +f 6743/9964/4446 7020/9120/4446 7033/9119/4446 6744/9965/4446 +f 7019/9828/4447 6807/9968/4447 6808/9969/4447 7030/9829/4447 +f 7003/9107/4448 6869/9970/4448 6870/9971/4448 7014/9108/4448 +f 7011/8894/4449 6741/9972/4449 6742/9973/4449 7022/8895/4449 +f 6995/9844/4450 6803/9974/4450 6804/9975/4450 7006/9845/4450 +f 6869/9970/4451 7000/9839/4451 7013/9838/4451 6870/9971/4451 +f 6987/8886/4452 6737/9976/4452 6738/9977/4452 6998/8887/4452 +f 6858/9978/4453 6970/8885/4453 6981/8884/4453 6800/9979/4453 +f 6979/9069/4454 6865/9980/4454 6866/9981/4454 6990/9070/4454 +f 6973/8882/4455 6794/9630/4455 6736/9631/4455 6986/8883/4455 +f 6969/9626/4456 6858/9978/4456 6800/9979/4456 6982/9627/4456 +f 6865/9980/4457 6976/9855/4457 6989/9854/4457 6866/9981/4457 +f 6793/9982/4458 7308/9576/4458 6955/9575/4458 6791/9983/4458 +f 6945/9860/4459 6860/9984/4459 6859/9985/4459 6968/9861/4459 +f 6921/9986/4460 7300/9625/4460 6963/9624/4460 6919/9987/4460 +f 6545/9595/4304 6550/9594/4304 6951/9988/4304 6928/9989/4304 +f 6922/9868/4461 6966/9629/4461 6977/9628/4461 6864/9869/4461 +f 6991/9088/4462 6867/9990/4462 6868/9991/4462 7002/9089/4462 +f 6867/9990/4463 6988/9847/4463 7001/9846/4463 6868/9991/4463 +f 7015/9126/4464 6871/9992/4464 6872/9993/4464 7026/9127/4464 +f 6871/9992/4465 7012/9831/4465 7025/9830/4465 6872/9993/4465 +f 6873/9966/4466 7024/9823/4466 7037/9822/4466 6874/9967/4466 +f 7051/9183/4467 6877/9994/4467 6878/9995/4467 7062/9184/4467 +f 6877/9994/4468 7048/9807/4468 7061/9806/4468 6878/9995/4468 +f 7075/9221/4469 6881/9996/4469 6882/9997/4469 7086/9222/4469 +f 6881/9996/4470 7072/9791/4470 7085/9790/4470 6882/9997/4470 +f 7099/9259/4471 6885/9998/4471 6886/9999/4471 7110/9260/4471 +f 6885/9998/4472 7096/9775/4472 7109/9774/4472 6886/9999/4472 +f 6887/9942/4473 7108/9767/4473 7121/9766/4473 6888/9943/4473 +f 7135/9316/4474 6891/10000/4474 6892/10001/4474 7146/9317/4474 +f 6891/10000/4475 7132/9751/4475 7145/9750/4475 6892/10001/4475 +f 7159/9354/4476 6895/10002/4476 6896/10003/4476 7170/9355/4476 +f 6895/10002/4477 7156/9735/4477 7169/9734/4477 6896/10003/4477 +f 7183/9392/4478 6899/10004/4478 6900/10005/4478 7194/9393/4478 +f 6899/10004/4479 7180/9719/4479 7193/9718/4479 6900/10005/4479 +f 6901/9918/4480 7192/9711/4480 7205/9710/4480 6902/9919/4480 +f 7219/9449/4481 6905/10006/4481 6906/10007/4481 7230/9450/4481 +f 6905/10006/4482 7216/9695/4482 7229/9694/4482 6906/10007/4482 +f 7243/9487/4483 6909/10008/4483 6910/10009/4483 7254/9488/4483 +f 6909/10008/4484 7240/9679/4484 7253/9678/4484 6910/10009/4484 +f 7267/9525/4485 6913/10010/4485 6914/10011/4485 7278/9526/4485 +f 6913/10010/4486 7264/9663/4486 7277/9662/4486 6914/10011/4486 +f 6915/9894/4487 7276/9655/4487 7289/9654/4487 6916/9895/4487 +f 7303/9582/4488 6921/9986/4488 6919/9987/4488 6960/9583/4488 +f 6961/9600/4489 6918/9632/4489 6926/9635/4489 6938/9601/4489 +f 6924/9884/4490 6942/9863/4490 6967/9862/4490 6923/9885/4490 +f 6927/9878/4491 6936/9607/4491 6943/9606/4491 6925/9879/4491 +f 7307/9622/4492 6857/10012/4492 6855/10013/4492 6956/9623/4492 +f 6803/9974/4493 6992/8893/4493 7005/8892/4493 6804/9975/4493 +f 6801/9866/4494 6980/8889/4494 6993/8888/4494 6802/9867/4494 +f 7007/9836/4495 6805/10014/4495 6806/10015/4495 7018/9837/4495 +f 6805/10014/4496 7004/8897/4496 7017/8896/4496 6806/10015/4496 +f 6807/9968/4497 7016/8901/4497 7029/8900/4497 6808/9969/4497 +f 7043/9812/4498 6811/10016/4498 6812/10017/4498 7054/9813/4498 +f 6811/10016/4499 7040/8909/4499 7053/8908/4499 6812/10017/4499 +f 7067/9796/4500 6815/10018/4500 6816/10019/4500 7078/9797/4500 +f 6815/10018/4501 7064/8917/4501 7077/8916/4501 6816/10019/4501 +f 7091/9780/4502 6819/10020/4502 6820/10021/4502 7102/9781/4502 +f 6819/10020/4503 7088/8925/4503 7101/8924/4503 6820/10021/4503 +f 6821/9944/4504 7100/8929/4504 7113/8928/4504 6822/9945/4504 +f 7127/9756/4505 6825/10022/4505 6826/10023/4505 7138/9757/4505 +f 6825/10022/4506 7124/8937/4506 7137/8936/4506 6826/10023/4506 +f 7151/9740/4507 6829/10024/4507 6830/10025/4507 7162/9741/4507 +f 6829/10024/4508 7148/8945/4508 7161/8944/4508 6830/10025/4508 +f 7175/9724/4509 6833/10026/4509 6834/10027/4509 7186/9725/4509 +f 6833/10026/4510 7172/8953/4510 7185/8952/4510 6834/10027/4510 +f 6835/9920/4511 7184/8957/4511 7197/8956/4511 6836/9921/4511 +f 7211/9700/4512 6839/10028/4512 6840/10029/4512 7222/9701/4512 +f 6839/10028/4513 7208/8965/4513 7221/8964/4513 6840/10029/4513 +f 7235/9684/4514 6843/10030/4514 6844/10031/4514 7246/9685/4514 +f 6843/10030/4515 7232/8973/4515 7245/8972/4515 6844/10031/4515 +f 7259/9668/4516 6847/10032/4516 6848/10033/4516 7270/9669/4516 +f 6847/10032/4517 7256/8981/4517 7269/8980/4517 6848/10033/4517 +f 6849/9896/4518 7268/8985/4518 7281/8984/4518 6850/9897/4518 +f 7295/9644/4519 6853/10034/4519 6856/10035/4519 7306/9645/4519 +f 6853/10034/4520 7292/8993/4520 7305/8992/4520 6856/10035/4520 +f 6857/10012/4521 7304/9621/4521 6959/9620/4521 6855/10013/4521 +f 6860/9984/4522 6946/9003/4522 6971/9002/4522 6859/9985/4522 +f 6863/9876/4523 6932/9873/4523 6947/9872/4523 6861/9877/4523 +f 6790/10036/4524 6954/9013/4524 6929/9012/4524 6798/10037/4524 +f 6737/9976/4525 6984/9065/4525 6997/9064/4525 6738/9977/4525 +f 6999/8890/4526 6739/10038/4526 6740/10039/4526 7010/8891/4526 +f 6739/10038/4527 6996/9082/4527 7009/9081/4527 6740/10039/4527 +f 6741/9972/4528 7008/9101/4528 7021/9100/4528 6742/9973/4528 +f 7035/8902/4529 6745/10040/4529 6746/10041/4529 7046/8903/4529 +f 6745/10040/4530 7032/9139/4530 7045/9138/4530 6746/10041/4530 +f 7059/8910/4531 6749/10042/4531 6750/10043/4531 7070/8911/4531 +f 6749/10042/4532 7056/9177/4532 7069/9176/4532 6750/10043/4532 +f 7083/8918/4533 6753/10044/4533 6754/10045/4533 7094/8919/4533 +f 6753/10044/4534 7080/9215/4534 7093/9214/4534 6754/10045/4534 +f 6755/9948/4535 7092/9234/4535 7105/9233/4535 6756/9949/4535 +f 7119/8930/4536 6759/10046/4536 6760/10047/4536 7130/8931/4536 +f 6759/10046/4537 7116/9272/4537 7129/9271/4537 6760/10047/4537 +f 7143/8938/4538 6763/10048/4538 6764/10049/4538 7154/8939/4538 +f 6763/10048/4539 7140/9310/4539 7153/9309/4539 6764/10049/4539 +f 7167/8946/4540 6767/10050/4540 6768/10051/4540 7178/8947/4540 +f 6767/10050/4541 7164/9348/4541 7177/9347/4541 6768/10051/4541 +f 6769/9924/4542 7176/9367/4542 7189/9366/4542 6770/9925/4542 +f 7203/8958/4543 6773/10052/4543 6774/10053/4543 7214/8959/4543 +f 6773/10052/4544 7200/9405/4544 7213/9404/4544 6774/10053/4544 +f 7227/8966/4545 6777/10054/4545 6778/10055/4545 7238/8967/4545 +f 6777/10054/4546 7224/9443/4546 7237/9442/4546 6778/10055/4546 +f 7251/8974/4547 6781/10056/4547 6782/10057/4547 7262/8975/4547 +f 6781/10056/4548 7248/9481/4548 7261/9480/4548 6782/10057/4548 +f 6783/9900/4549 7260/9500/4549 7273/9499/4549 6784/9901/4549 +f 7287/8986/4550 6787/10058/4550 6788/10059/4550 7298/8987/4550 +f 6787/10058/4551 7284/9538/4551 7297/9537/4551 6788/10059/4551 +f 7311/9618/4552 6793/9982/4552 6791/9983/4552 6952/9619/4552 +f 6953/9856/4553 6790/10036/4553 6798/10037/4553 6930/9857/4553 +f 6796/9880/4554 6950/9035/4554 6975/9034/4554 6795/9881/4554 +f 6799/9874/4555 6928/9989/4555 6951/9988/4555 6797/9875/4555 +f 6544/9011/4556 6546/10060/4556 6545/10061/4556 6455/10062/4556 +f 6547/10063/4557 6549/9020/4557 6548/9025/4557 6454/10064/4557 +f 6550/9594/4558 6552/9004/4558 6551/9009/4558 6466/10065/4558 +f 6553/9042/4559 6555/9612/4559 6554/10066/4559 6465/10067/4559 +f 6556/9008/4560 6558/8876/4560 6557/8881/4560 6477/10068/4560 +f 6559/9057/4561 6561/9616/4561 6560/9041/4561 6476/10069/4561 +f 6562/8880/4562 6564/8994/4562 6563/8999/4562 6488/10070/4562 +f 6565/9072/4563 6567/9850/4563 6566/10071/4563 6487/10072/4563 +f 6568/8998/4564 6570/9848/4564 6569/9079/4564 6499/10073/4564 +f 6571/9091/4565 6573/9842/4565 6572/9071/4565 6498/10074/4565 +f 6574/9080/4566 6576/9840/4566 6575/9098/4566 6510/10075/4566 +f 6577/9110/4567 6579/9834/4567 6578/10076/4567 6509/10077/4567 +f 6580/9099/4568 6582/9832/4568 6581/9117/4568 6543/9639/4568 +f 6583/9129/4569 6585/9826/4569 6584/9109/4569 6542/10078/4569 +f 6586/9118/4570 6588/9824/4570 6587/9136/4570 6532/10079/4570 +f 6589/9148/4571 6591/9818/4571 6590/10080/4571 6531/10081/4571 +f 6592/9137/4572 6594/9816/4572 6593/9155/4572 6521/10082/4572 +f 6595/9167/4573 6597/9810/4573 6596/9147/4573 6520/10083/4573 +f 6598/9156/4574 6600/9808/4574 6599/9174/4574 7312/10084/4574 +f 6601/9186/4575 6603/9802/4575 6602/10085/4575 7313/10086/4575 +f 6604/9175/4576 6606/9800/4576 6605/9193/4576 6106/10087/4576 +f 6607/9205/4577 6609/9794/4577 6608/9185/4577 6103/10088/4577 +f 6610/9194/4578 6612/9792/4578 6611/9212/4578 6145/10089/4578 +f 6613/9224/4579 6615/9786/4579 6614/10090/4579 6141/10091/4579 +f 6616/9213/4580 6618/9784/4580 6617/9231/4580 6183/10092/4580 +f 6619/9243/4581 6621/9778/4581 6620/9223/4581 6180/10093/4581 +f 6622/9232/4582 6624/9776/4582 6623/9250/4582 6222/10094/4582 +f 6625/9262/4583 6627/9770/4583 6626/10095/4583 6218/10096/4583 +f 6628/9251/4584 6630/9768/4584 6629/9269/4584 6257/10097/4584 +f 6631/9281/4585 6633/9762/4585 6632/9261/4585 6256/10098/4585 +f 6634/9270/4586 6636/9760/4586 6635/9288/4586 6268/10099/4586 +f 6637/9300/4587 6639/9754/4587 6638/10100/4587 6267/10101/4587 +f 6640/9289/4588 6642/9752/4588 6641/9307/4588 6279/10102/4588 +f 6643/9319/4589 6645/9746/4589 6644/9299/4589 6278/10103/4589 +f 6646/9308/4590 6648/9744/4590 6647/9326/4590 6290/10104/4590 +f 6649/9338/4591 6651/9738/4591 6650/10105/4591 6289/10106/4591 +f 6652/9327/4592 6654/9736/4592 6653/9345/4592 6301/10107/4592 +f 6655/9357/4593 6657/9730/4593 6656/9337/4593 6300/10108/4593 +f 6658/9346/4594 6660/9728/4594 6659/9364/4594 6312/10109/4594 +f 6661/9376/4595 6663/9722/4595 6662/10110/4595 6311/10111/4595 +f 6664/9365/4596 6666/9720/4596 6665/9383/4596 6323/10112/4596 +f 6667/9395/4597 6669/9714/4597 6668/9375/4597 6322/10113/4597 +f 6670/9384/4598 6672/9712/4598 6671/9402/4598 6334/10114/4598 +f 6673/9414/4599 6675/9706/4599 6674/10115/4599 6333/10116/4599 +f 6676/9403/4600 6678/9704/4600 6677/9421/4600 6345/10117/4600 +f 6679/9433/4601 6681/9698/4601 6680/9413/4601 6344/10118/4601 +f 6682/9422/4602 6684/9696/4602 6683/9440/4602 6356/10119/4602 +f 6685/9452/4603 6687/9690/4603 6686/10120/4603 6355/10121/4603 +f 6688/9441/4604 6690/9688/4604 6689/9459/4604 6367/10122/4604 +f 6691/9471/4605 6693/9682/4605 6692/9451/4605 6366/10123/4605 +f 6694/9460/4606 6696/9680/4606 6695/9478/4606 6378/10124/4606 +f 6697/9490/4607 6699/9674/4607 6698/10125/4607 6377/10126/4607 +f 6700/9479/4608 6702/9672/4608 6701/9497/4608 6389/10127/4608 +f 6703/9509/4609 6705/9666/4609 6704/9489/4609 6388/10128/4609 +f 6706/9498/4610 6708/9664/4610 6707/9516/4610 6400/10129/4610 +f 6709/9528/4611 6711/9658/4611 6710/10130/4611 6399/10131/4611 +f 6712/9517/4612 6714/9656/4612 6713/9535/4612 6411/10132/4612 +f 6715/9547/4613 6717/9650/4613 6716/9527/4613 6410/10133/4613 +f 6718/9536/4614 6720/9648/4614 6719/9554/4614 6422/10134/4614 +f 6721/9566/4615 6723/9642/4615 6722/10135/4615 6421/10136/4615 +f 6724/9555/4616 6726/9640/4616 6725/9573/4616 6433/10137/4616 +f 6727/9585/4617 6729/9636/4617 6728/9565/4617 6432/10138/4617 +f 6730/9574/4618 6732/10139/4618 6731/9010/4618 6444/10140/4618 +f 6733/9024/4619 6735/9614/4619 6734/10141/4619 6443/10142/4619 +f 6486/10143/4620 6984/9065/4620 6737/9976/4620 6485/10144/4620 +f 6099/10145/4621 7068/9196/4621 6751/9952/4621 6096/10146/4621 +f 6288/10147/4622 7152/9329/4622 6765/9928/4622 6287/10148/4622 +f 6365/10149/4623 7236/9462/4623 6779/9904/4623 6364/10150/4623 +f 6431/10151/4624 7308/9576/4624 6793/9982/4624 6430/10152/4624 +f 7314/10153/4625 7052/8913/4625 6813/9956/4625 7315/10154/4625 +f 6277/10155/4626 7136/8941/4626 6827/9932/4626 6276/10156/4626 +f 6354/10157/4627 7220/8969/4627 6841/9908/4627 6353/10158/4627 +f 6442/10159/4628 6956/9623/4628 6855/10013/4628 6441/10160/4628 +f 6519/10161/4629 7036/9815/4629 6875/9960/4629 6518/10162/4629 +f 6266/10163/4630 7120/9759/4630 6889/9936/4630 6265/10164/4630 +f 6343/10165/4631 7204/9703/4631 6903/9912/4631 6342/10166/4631 +f 6420/10167/4632 7288/9647/4632 6917/9888/4632 6419/10168/4632 +f 6453/10169/4633 6936/10170/4633 6927/10171/4633 6452/10172/4633 +f 6508/10173/4634 7008/9101/4634 6741/9972/4634 6507/10174/4634 +f 6541/9638/4635 7020/9120/4635 6743/9964/4635 6540/10175/4635 +f 6517/10176/4636 7044/9158/4636 6747/9958/4636 6516/10177/4636 +f 6176/10178/4637 7092/9234/4637 6755/9948/4637 6173/10179/4637 +f 6215/10180/4638 7104/9253/4638 6757/9940/4638 6211/10181/4638 +f 6264/10182/4639 7128/9291/4639 6761/9934/4639 6263/10183/4639 +f 6310/10184/4640 7176/9367/4640 6769/9924/4640 6309/10185/4640 +f 6321/10186/4641 7188/9386/4641 6771/9916/4641 6320/10187/4641 +f 6341/10188/4642 7212/9424/4642 6775/9910/4642 6340/10189/4642 +f 6387/10190/4643 7260/9500/4643 6783/9900/4643 6386/10191/4643 +f 6398/10192/4644 7272/9519/4644 6785/9892/4644 6397/10193/4644 +f 6418/10194/4645 7296/9557/4645 6789/9886/4645 6417/10195/4645 +f 6464/10196/4646 6948/9871/4646 6797/9875/4646 6463/10197/4646 +f 6451/10198/4647 6928/10199/4647 6799/10200/4647 6450/10201/4647 +f 6497/10202/4648 6992/8893/4648 6803/9974/4648 6496/10203/4648 +f 6506/10204/4649 7004/8897/4649 6805/10014/4649 6505/10205/4649 +f 6530/10206/4650 7028/8905/4650 6809/9962/4650 6529/10207/4650 +f 6138/10208/4651 7076/8921/4651 6817/9950/4651 6134/10209/4651 +f 6169/10210/4652 7088/8925/4652 6819/10020/4652 6166/10211/4652 +f 6253/10212/4653 7112/8933/4653 6823/9938/4653 6250/10213/4653 +f 6299/10214/4654 7160/8949/4654 6831/9926/4654 6298/10215/4654 +f 6308/10216/4655 7172/8953/4655 6833/10026/4655 6307/10217/4655 +f 6332/10218/4656 7196/8961/4656 6837/9914/4656 6331/10219/4656 +f 6376/10220/4657 7244/8977/4657 6845/9902/4657 6375/10221/4657 +f 6385/10222/4658 7256/8981/4658 6847/10032/4658 6384/10223/4658 +f 6409/10224/4659 7280/8989/4659 6851/9890/4659 6408/10225/4659 +f 6475/10226/4660 6968/9861/4660 6859/9985/4660 6474/10227/4660 +f 6462/10228/4661 6944/9605/4661 6861/9877/4661 6461/10229/4661 +f 6484/10230/4662 6976/9855/4662 6865/9980/4662 6483/10231/4662 +f 6495/10232/4663 6988/9847/4663 6867/9990/4663 6494/10233/4663 +f 6539/10234/4664 7012/9831/4664 6871/9992/4664 6538/10235/4664 +f 6092/10236/4665 7060/9799/4665 6879/9954/4665 6089/10237/4665 +f 6131/10238/4666 7072/9791/4666 6881/9996/4666 6127/10239/4666 +f 6208/10240/4667 7096/9775/4667 6885/9998/4667 6204/10241/4667 +f 6286/10242/4668 7144/9743/4668 6893/9930/4668 6285/10243/4668 +f 6297/10244/4669 7156/9735/4669 6895/10002/4669 6296/10245/4669 +f 6319/10246/4670 7180/9719/4670 6899/10004/4670 6318/10247/4670 +f 6363/10248/4671 7228/9687/4671 6907/9906/4671 6362/10249/4671 +f 6374/10250/4672 7240/9679/4672 6909/10008/4672 6373/10251/4672 +f 6396/10252/4673 7264/9663/4673 6913/10010/4673 6395/10253/4673 +f 6429/10254/4674 7300/9625/4674 6921/9986/4674 6428/10255/4674 +f 6473/10256/4675 6964/9040/4675 6923/9885/4675 6472/10257/4675 +f 6460/10258/4676 6940/9609/4676 6925/9879/4676 6459/10259/4676 +f 6440/10260/4677 6960/9583/4677 6919/9987/4677 6439/10261/4677 +f 6407/10262/4678 7276/9655/4678 6915/9894/4678 6406/10263/4678 +f 6383/10264/4679 7252/9671/4679 6911/9898/4679 6382/10265/4679 +f 6352/10266/4680 7216/9695/4680 6905/10006/4680 6351/10267/4680 +f 6330/10268/4681 7192/9711/4681 6901/9918/4681 6329/10269/4681 +f 6306/10270/4682 7168/9727/4682 6897/9922/4682 6305/10271/4682 +f 6275/10272/4683 7132/9751/4683 6891/10000/4683 6274/10273/4683 +f 6246/10274/4684 7108/9767/4684 6887/9942/4684 6243/10275/4684 +f 6162/10276/4685 7084/9783/4685 6883/9946/4685 6159/10277/4685 +f 7316/10278/4686 7048/9807/4686 6877/9994/4686 7317/10279/4686 +f 6528/10280/4687 7024/9823/4687 6873/9966/4687 6527/10281/4687 +f 6504/10282/4688 7000/9839/4688 6869/9970/4688 6503/10283/4688 +f 6449/10284/4689 6932/10285/4689 6863/10286/4689 6448/10287/4689 +f 6427/10288/4690 7304/9621/4690 6857/10012/4690 6426/10289/4690 +f 6416/10290/4691 7292/8993/4691 6853/10034/4691 6415/10291/4691 +f 6394/10292/4692 7268/8985/4692 6849/9896/4692 6393/10293/4692 +f 6361/10294/4693 7232/8973/4693 6843/10030/4693 6360/10295/4693 +f 6339/10296/4694 7208/8965/4694 6839/10028/4694 6338/10297/4694 +f 6317/10298/4695 7184/8957/4695 6835/9920/4695 6316/10299/4695 +f 6284/10300/4696 7148/8945/4696 6829/10024/4696 6283/10301/4696 +f 6262/10302/4697 7124/8937/4697 6825/10022/4697 6261/10303/4697 +f 6201/10304/4698 7100/8929/4698 6821/9944/4698 6197/10305/4698 +f 6085/10306/4699 7064/8917/4699 6815/10018/4699 6082/10307/4699 +f 6515/10308/4700 7040/8909/4700 6811/10016/4700 6514/10309/4700 +f 6537/10310/4701 7016/8901/4701 6807/9968/4701 6536/10311/4701 +f 6482/10312/4702 6980/8889/4702 6801/9866/4702 6481/10313/4702 +f 6471/10314/4703 6972/9001/4703 6795/9881/4703 6470/10315/4703 +f 6438/10316/4704 6952/9619/4704 6791/9983/4704 6437/10317/4704 +f 6405/10318/4705 7284/9538/4705 6787/10058/4705 6404/10319/4705 +f 6372/10320/4706 7248/9481/4706 6781/10056/4706 6371/10321/4706 +f 6350/10322/4707 7224/9443/4707 6777/10054/4707 6349/10323/4707 +f 6328/10324/4708 7200/9405/4708 6773/10052/4708 6327/10325/4708 +f 6295/10326/4709 7164/9348/4709 6767/10050/4709 6294/10327/4709 +f 6273/10328/4710 7140/9310/4710 6763/10048/4710 6272/10329/4710 +f 6239/10330/4711 7116/9272/4711 6759/10046/4711 6236/10331/4711 +f 6124/10332/4712 7080/9215/4712 6753/10044/4712 6120/10333/4712 +f 7318/10334/4713 7056/9177/4713 6749/10042/4713 7319/10335/4713 +f 6526/10336/4714 7032/9139/4714 6745/10040/4714 6525/10337/4714 +f 6493/10338/4715 6996/9082/4715 6739/10038/4715 6492/10339/4715 +f 6450/10201/4716 6799/10200/4716 6931/10340/4716 6447/10341/4716 +f 6463/10197/4717 6797/9875/4717 6951/9988/4717 6458/10342/4717 +f 6448/10287/4718 6863/10286/4718 6935/10343/4718 6446/10344/4718 +f 6461/10229/4719 6861/9877/4719 6947/9872/4719 6457/10345/4719 +f 6452/10172/4720 6927/10171/4720 6939/10346/4720 6445/10347/4720 +f 6459/10259/4721 6925/9879/4721 6943/9606/4721 6456/10348/4721 +f 6470/10315/4722 6795/9881/4722 6975/9034/4722 6469/10349/4722 +f 6474/10227/4723 6859/9985/4723 6971/9002/4723 6468/10350/4723 +f 6472/10257/4724 6923/9885/4724 6967/9862/4724 6467/10351/4724 +f 6430/10152/4725 6793/9982/4725 7311/9618/4725 6425/10352/4725 +f 6437/10317/4726 6791/9983/4726 6955/9575/4726 6436/10353/4726 +f 6426/10289/4727 6857/10012/4727 7307/9622/4727 6424/10354/4727 +f 6441/10160/4728 6855/10013/4728 6959/9620/4728 6435/10355/4728 +f 6428/10255/4729 6921/9986/4729 7303/9582/4729 6423/10356/4729 +f 6439/10261/4730 6919/9987/4730 6963/9624/4730 6434/10357/4730 +f 6417/10195/4731 6789/9886/4731 7299/8990/4731 6414/10358/4731 +f 6415/10291/4732 6853/10034/4732 7295/9644/4732 6413/10359/4732 +f 6419/10168/4733 6917/9888/4733 7291/9563/4733 6412/10360/4733 +f 6404/10319/4734 6787/10058/4734 7287/8986/4734 6403/10361/4734 +f 6408/10225/4735 6851/9890/4735 7283/9652/4735 6402/10362/4735 +f 6406/10263/4736 6915/9894/4736 7279/9544/4736 6401/10363/4736 +f 6397/10193/4737 6785/9892/4737 7275/8982/4737 6392/10364/4737 +f 6393/10293/4738 6849/9896/4738 7271/9660/4738 6391/10365/4738 +f 6395/10253/4739 6913/10010/4739 7267/9525/4739 6390/10366/4739 +f 6386/10191/4740 6783/9900/4740 7263/8978/4740 6381/10367/4740 +f 6384/10223/4741 6847/10032/4741 7259/9668/4741 6380/10368/4741 +f 6382/10265/4742 6911/9898/4742 7255/9506/4742 6379/10369/4742 +f 6371/10321/4743 6781/10056/4743 7251/8974/4743 6370/10370/4743 +f 6375/10221/4744 6845/9902/4744 7247/9676/4744 6369/10371/4744 +f 6373/10251/4745 6909/10008/4745 7243/9487/4745 6368/10372/4745 +f 6364/10150/4746 6779/9904/4746 7239/8970/4746 6359/10373/4746 +f 6360/10295/4747 6843/10030/4747 7235/9684/4747 6358/10374/4747 +f 6362/10249/4748 6907/9906/4748 7231/9468/4748 6357/10375/4748 +f 6349/10323/4749 6777/10054/4749 7227/8966/4749 6348/10376/4749 +f 6353/10158/4750 6841/9908/4750 7223/9692/4750 6347/10377/4750 +f 6351/10267/4751 6905/10006/4751 7219/9449/4751 6346/10378/4751 +f 6340/10189/4752 6775/9910/4752 7215/8962/4752 6337/10379/4752 +f 6338/10297/4753 6839/10028/4753 7211/9700/4753 6336/10380/4753 +f 6342/10166/4754 6903/9912/4754 7207/9430/4754 6335/10381/4754 +f 6327/10325/4755 6773/10052/4755 7203/8958/4755 6326/10382/4755 +f 6331/10219/4756 6837/9914/4756 7199/9708/4756 6325/10383/4756 +f 6329/10269/4757 6901/9918/4757 7195/9411/4757 6324/10384/4757 +f 6320/10187/4758 6771/9916/4758 7191/8954/4758 6315/10385/4758 +f 6316/10299/4759 6835/9920/4759 7187/9716/4759 6314/10386/4759 +f 6318/10247/4760 6899/10004/4760 7183/9392/4760 6313/10387/4760 +f 6309/10185/4761 6769/9924/4761 7179/8950/4761 6304/10388/4761 +f 6307/10217/4762 6833/10026/4762 7175/9724/4762 6303/10389/4762 +f 6305/10271/4763 6897/9922/4763 7171/9373/4763 6302/10390/4763 +f 6294/10327/4764 6767/10050/4764 7167/8946/4764 6293/10391/4764 +f 6298/10215/4765 6831/9926/4765 7163/9732/4765 6292/10392/4765 +f 6296/10245/4766 6895/10002/4766 7159/9354/4766 6291/10393/4766 +f 6287/10148/4767 6765/9928/4767 7155/8942/4767 6282/10394/4767 +f 6283/10301/4768 6829/10024/4768 7151/9740/4768 6281/10395/4768 +f 6285/10243/4769 6893/9930/4769 7147/9335/4769 6280/10396/4769 +f 6272/10329/4770 6763/10048/4770 7143/8938/4770 6271/10397/4770 +f 6276/10156/4771 6827/9932/4771 7139/9748/4771 6270/10398/4771 +f 6274/10273/4772 6891/10000/4772 7135/9316/4772 6269/10399/4772 +f 6263/10183/4773 6761/9934/4773 7131/8934/4773 6260/10400/4773 +f 6261/10303/4774 6825/10022/4774 7127/9756/4774 6259/10401/4774 +f 6265/10164/4775 6889/9936/4775 7123/9297/4775 6258/10402/4775 +f 6236/10331/4776 6759/10046/4776 7119/8930/4776 6232/10403/4776 +f 6250/10213/4777 6823/9938/4777 7115/9764/4777 6229/10404/4777 +f 6243/10275/4778 6887/9942/4778 7111/9278/4778 6225/10405/4778 +f 6211/10181/4779 6757/9940/4779 7107/8926/4779 6194/10406/4779 +f 6197/10305/4780 6821/9944/4780 7103/9772/4780 6190/10407/4780 +f 6204/10241/4781 6885/9998/4781 7099/9259/4781 6187/10408/4781 +f 6173/10179/4782 6755/9948/4782 7095/8922/4782 6155/10409/4782 +f 6166/10211/4783 6819/10020/4783 7091/9780/4783 6152/10410/4783 +f 6159/10277/4784 6883/9946/4784 7087/9240/4784 6148/10411/4784 +f 6120/10333/4785 6753/10044/4785 7083/8918/4785 6117/10412/4785 +f 6134/10209/4786 6817/9950/4786 7079/9788/4786 6113/10413/4786 +f 6127/10239/4787 6881/9996/4787 7075/9221/4787 6110/10414/4787 +f 6096/10146/4788 6751/9952/4788 7071/8914/4788 6078/10415/4788 +f 6082/10307/4789 6815/10018/4789 7067/9796/4789 6075/10416/4789 +f 6089/10237/4790 6879/9954/4790 7063/9202/4790 6071/10417/4790 +f 7319/10335/4791 6749/10042/4791 7059/8910/4791 7320/10418/4791 +f 7315/10154/4792 6813/9956/4792 7055/9804/4792 7321/10419/4792 +f 7317/10279/4793 6877/9994/4793 7051/9183/4793 7322/10420/4793 +f 6516/10177/4794 6747/9958/4794 7047/8906/4794 6513/10421/4794 +f 6514/10309/4795 6811/10016/4795 7043/9812/4795 6512/10422/4795 +f 6518/10162/4796 6875/9960/4796 7039/9164/4796 6511/10423/4796 +f 6525/10337/4797 6745/10040/4797 7035/8902/4797 6524/10424/4797 +f 6529/10207/4798 6809/9962/4798 7031/9820/4798 6523/10425/4798 +f 6527/10281/4799 6873/9966/4799 7027/9145/4799 6522/10426/4799 +f 6540/10175/4800 6743/9964/4800 7023/8898/4800 6535/10427/4800 +f 6536/10311/4801 6807/9968/4801 7019/9828/4801 6534/10428/4801 +f 6538/10235/4802 6871/9992/4802 7015/9126/4802 6533/10429/4802 +f 6507/10174/4803 6741/9972/4803 7011/8894/4803 6502/10430/4803 +f 6505/10205/4804 6805/10014/4804 7007/9836/4804 6501/10431/4804 +f 6503/10283/4805 6869/9970/4805 7003/9107/4805 6500/10432/4805 +f 6492/10339/4806 6739/10038/4806 6999/8890/4806 6491/10433/4806 +f 6496/10203/4807 6803/9974/4807 6995/9844/4807 6490/10434/4807 +f 6494/10233/4808 6867/9990/4808 6991/9088/4808 6489/10435/4808 +f 6485/10144/4809 6737/9976/4809 6987/8886/4809 6480/10436/4809 +f 6481/10313/4810 6801/9866/4810 6983/9852/4810 6479/10437/4810 +f 6483/10231/4811 6865/9980/4811 6979/9069/4811 6478/10438/4811 +f 6444/10439/4812 6731/9010/4812 6954/9013/4812 6436/10353/4812 +f 6451/10198/4813 6929/9012/4813 6544/9011/4813 6455/10440/4813 +f 6447/10341/4814 6931/10441/4814 6932/10442/4814 6449/10443/4814 +f 6457/10345/4815 6947/9872/4815 6948/9871/4815 6464/10196/4815 +f 6458/10342/4816 6951/9988/4816 6550/9594/4816 6466/10444/4816 +f 6438/10316/4817 6953/9856/4817 6958/9859/4817 6435/10355/4817 +f 6442/10159/4818 6957/9864/4818 6962/9633/4818 6434/10357/4818 +f 6453/10169/4819 6937/9634/4819 6934/9865/4819 6446/10445/4819 +f 6456/10348/4820 6943/9606/4820 6944/9605/4820 6462/10228/4820 +f 6445/10347/4821 6939/10346/4821 6547/10446/4821 6454/10447/4821 +f 6465/10067/4822 6554/9610/4822 6940/9609/4822 6460/10258/4822 +f 6440/10260/4823 6961/9600/4823 6733/9024/4823 6443/10142/4823 +f 6476/10069/4824 6560/9041/4824 6964/9040/4824 6473/10256/4824 +f 6467/10351/4825 6967/9862/4825 6968/9861/4825 6475/10226/4825 +f 6468/10350/4826 6971/9002/4826 6972/9001/4826 6471/10314/4826 +f 6469/10349/4827 6975/9034/4827 6556/9008/4827 6477/10068/4827 +f 6433/10137/4828 6725/9573/4828 7308/9576/4828 6431/10151/4828 +f 6425/10352/4829 7311/9618/4829 7304/9621/4829 6427/10288/4829 +f 6424/10354/4830 7307/9622/4830 7300/9625/4830 6429/10254/4830 +f 6423/10356/4831 7303/9582/4831 6727/9585/4831 6432/10138/4831 +f 6487/10072/4832 6566/9056/4832 6978/9055/4832 6478/10438/4832 +f 6484/10230/4833 6977/9628/4833 6982/9627/4833 6479/10437/4833 +f 6482/10312/4834 6981/8884/4834 6986/8883/4834 6480/10436/4834 +f 6486/10143/4835 6985/9049/4835 6562/8880/4835 6488/10448/4835 +f 6498/10074/4836 6572/9071/4836 6990/9070/4836 6489/10435/4836 +f 6495/10232/4837 6989/9854/4837 6994/9853/4837 6490/10434/4837 +f 6497/10202/4838 6993/8888/4838 6998/8887/4838 6491/10433/4838 +f 6493/10338/4839 6997/9064/4839 6568/8998/4839 6499/10073/4839 +f 6509/10077/4840 6578/9090/4840 7002/9089/4840 6500/10432/4840 +f 6504/10282/4841 7001/9846/4841 7006/9845/4841 6501/10431/4841 +f 6506/10204/4842 7005/8892/4842 7010/8891/4842 6502/10430/4842 +f 6508/10173/4843 7009/9081/4843 6574/9080/4843 6510/10449/4843 +f 6542/10078/4844 6584/9109/4844 7014/9108/4844 6533/10429/4844 +f 6539/10234/4845 7013/9838/4845 7018/9837/4845 6534/10428/4845 +f 6537/10310/4846 7017/8896/4846 7022/8895/4846 6535/10427/4846 +f 6541/9638/4847 7021/9100/4847 6580/9099/4847 6543/9639/4847 +f 6531/10081/4848 6590/9128/4848 7026/9127/4848 6522/10426/4848 +f 6528/10280/4849 7025/9830/4849 7030/9829/4849 6523/10425/4849 +f 6530/10206/4850 7029/8900/4850 7034/8899/4850 6524/10424/4850 +f 6526/10336/4851 7033/9119/4851 6586/9118/4851 6532/10450/4851 +f 6520/10083/4852 6596/9147/4852 7038/9146/4852 6511/10423/4852 +f 6519/10161/4853 7037/9822/4853 7042/9821/4853 6512/10422/4853 +f 6515/10308/4854 7041/8904/4854 7046/8903/4854 6513/10421/4854 +f 6517/10176/4855 7045/9138/4855 6592/9137/4855 6521/10082/4855 +f 7313/10086/4856 6602/9166/4856 7050/9165/4856 7322/10420/4856 +f 7316/10278/4857 7049/9814/4857 7054/9813/4857 7321/10419/4857 +f 7314/10153/4858 7053/8908/4858 7058/8907/4858 7320/10418/4858 +f 7318/10334/4859 7057/9157/4859 6598/9156/4859 7312/10451/4859 +f 6103/10088/4860 6608/9185/4860 7062/9184/4860 6071/10417/4860 +f 6092/10236/4861 7061/9806/4861 7066/9805/4861 6075/10416/4861 +f 6085/10306/4862 7065/8912/4862 7070/8911/4862 6078/10415/4862 +f 6099/10145/4863 7069/9176/4863 6604/9175/4863 6106/10087/4863 +f 6141/10091/4864 6614/9204/4864 7074/9203/4864 6110/10414/4864 +f 6131/10238/4865 7073/9798/4865 7078/9797/4865 6113/10413/4865 +f 6138/10208/4866 7077/8916/4866 7082/8915/4866 6117/10412/4866 +f 6124/10332/4867 7081/9195/4867 6610/9194/4867 6145/10452/4867 +f 6180/10093/4868 6620/9223/4868 7086/9222/4868 6148/10411/4868 +f 6162/10276/4869 7085/9790/4869 7090/9789/4869 6152/10410/4869 +f 6169/10210/4870 7089/8920/4870 7094/8919/4870 6155/10409/4870 +f 6176/10178/4871 7093/9214/4871 6616/9213/4871 6183/10092/4871 +f 6218/10096/4872 6626/9242/4872 7098/9241/4872 6187/10408/4872 +f 6208/10240/4873 7097/9782/4873 7102/9781/4873 6190/10407/4873 +f 6201/10304/4874 7101/8924/4874 7106/8923/4874 6194/10406/4874 +f 6215/10180/4875 7105/9233/4875 6622/9232/4875 6222/10453/4875 +f 6256/10098/4876 6632/9261/4876 7110/9260/4876 6225/10405/4876 +f 6246/10274/4877 7109/9774/4877 7114/9773/4877 6229/10404/4877 +f 6253/10212/4878 7113/8928/4878 7118/8927/4878 6232/10403/4878 +f 6239/10330/4879 7117/9252/4879 6628/9251/4879 6257/10097/4879 +f 6267/10101/4880 6638/9280/4880 7122/9279/4880 6258/10402/4880 +f 6266/10163/4881 7121/9766/4881 7126/9765/4881 6259/10401/4881 +f 6262/10302/4882 7125/8932/4882 7130/8931/4882 6260/10400/4882 +f 6264/10182/4883 7129/9271/4883 6634/9270/4883 6268/10454/4883 +f 6278/10103/4884 6644/9299/4884 7134/9298/4884 6269/10399/4884 +f 6275/10272/4885 7133/9758/4885 7138/9757/4885 6270/10398/4885 +f 6277/10155/4886 7137/8936/4886 7142/8935/4886 6271/10397/4886 +f 6273/10328/4887 7141/9290/4887 6640/9289/4887 6279/10102/4887 +f 6289/10106/4888 6650/9318/4888 7146/9317/4888 6280/10396/4888 +f 6286/10242/4889 7145/9750/4889 7150/9749/4889 6281/10395/4889 +f 6284/10300/4890 7149/8940/4890 7154/8939/4890 6282/10394/4890 +f 6288/10147/4891 7153/9309/4891 6646/9308/4891 6290/10455/4891 +f 6300/10108/4892 6656/9337/4892 7158/9336/4892 6291/10393/4892 +f 6297/10244/4893 7157/9742/4893 7162/9741/4893 6292/10392/4893 +f 6299/10214/4894 7161/8944/4894 7166/8943/4894 6293/10391/4894 +f 6295/10326/4895 7165/9328/4895 6652/9327/4895 6301/10107/4895 +f 6311/10111/4896 6662/9356/4896 7170/9355/4896 6302/10390/4896 +f 6306/10270/4897 7169/9734/4897 7174/9733/4897 6303/10389/4897 +f 6308/10216/4898 7173/8948/4898 7178/8947/4898 6304/10388/4898 +f 6310/10184/4899 7177/9347/4899 6658/9346/4899 6312/10456/4899 +f 6322/10113/4900 6668/9375/4900 7182/9374/4900 6313/10387/4900 +f 6319/10246/4901 7181/9726/4901 7186/9725/4901 6314/10386/4901 +f 6317/10298/4902 7185/8952/4902 7190/8951/4902 6315/10385/4902 +f 6321/10186/4903 7189/9366/4903 6664/9365/4903 6323/10112/4903 +f 6333/10116/4904 6674/9394/4904 7194/9393/4904 6324/10384/4904 +f 6330/10268/4905 7193/9718/4905 7198/9717/4905 6325/10383/4905 +f 6332/10218/4906 7197/8956/4906 7202/8955/4906 6326/10382/4906 +f 6328/10324/4907 7201/9385/4907 6670/9384/4907 6334/10457/4907 +f 6344/10118/4908 6680/9413/4908 7206/9412/4908 6335/10381/4908 +f 6343/10165/4909 7205/9710/4909 7210/9709/4909 6336/10380/4909 +f 6339/10296/4910 7209/8960/4910 7214/8959/4910 6337/10379/4910 +f 6341/10188/4911 7213/9404/4911 6676/9403/4911 6345/10117/4911 +f 6355/10121/4912 6686/9432/4912 7218/9431/4912 6346/10378/4912 +f 6352/10266/4913 7217/9702/4913 7222/9701/4913 6347/10377/4913 +f 6354/10157/4914 7221/8964/4914 7226/8963/4914 6348/10376/4914 +f 6350/10322/4915 7225/9423/4915 6682/9422/4915 6356/10458/4915 +f 6366/10123/4916 6692/9451/4916 7230/9450/4916 6357/10375/4916 +f 6363/10248/4917 7229/9694/4917 7234/9693/4917 6358/10374/4917 +f 6361/10294/4918 7233/8968/4918 7238/8967/4918 6359/10373/4918 +f 6365/10149/4919 7237/9442/4919 6688/9441/4919 6367/10122/4919 +f 6377/10126/4920 6698/9470/4920 7242/9469/4920 6368/10372/4920 +f 6374/10250/4921 7241/9686/4921 7246/9685/4921 6369/10371/4921 +f 6376/10220/4922 7245/8972/4922 7250/8971/4922 6370/10370/4922 +f 6372/10320/4923 7249/9461/4923 6694/9460/4923 6378/10459/4923 +f 6388/10128/4924 6704/9489/4924 7254/9488/4924 6379/10369/4924 +f 6383/10264/4925 7253/9678/4925 7258/9677/4925 6380/10368/4925 +f 6385/10222/4926 7257/8976/4926 7262/8975/4926 6381/10367/4926 +f 6387/10190/4927 7261/9480/4927 6700/9479/4927 6389/10127/4927 +f 6399/10131/4928 6710/9508/4928 7266/9507/4928 6390/10366/4928 +f 6396/10252/4929 7265/9670/4929 7270/9669/4929 6391/10365/4929 +f 6394/10292/4930 7269/8980/4930 7274/8979/4930 6392/10364/4930 +f 6398/10192/4931 7273/9499/4931 6706/9498/4931 6400/10460/4931 +f 6410/10133/4932 6716/9527/4932 7278/9526/4932 6401/10363/4932 +f 6407/10262/4933 7277/9662/4933 7282/9661/4933 6402/10362/4933 +f 6409/10224/4934 7281/8984/4934 7286/8983/4934 6403/10361/4934 +f 6405/10318/4935 7285/9518/4935 6712/9517/4935 6411/10132/4935 +f 6421/10136/4936 6722/9546/4936 7290/9545/4936 6412/10360/4936 +f 6420/10167/4937 7289/9654/4937 7294/9653/4937 6413/10359/4937 +f 6416/10290/4938 7293/8988/4938 7298/8987/4938 6414/10358/4938 +f 6418/10194/4939 7297/9537/4939 6718/9536/4939 6422/10461/4939 +f 6732/10139/4940 6252/9596/4940 6045/9599/4940 6546/10060/4940 6544/9011/4940 6731/9010/4940 +f 7016/8901/4941 6537/10310/4941 6535/10427/4941 7023/8898/4941 +f 7012/9831/4942 6539/10234/4942 6534/10428/4942 7019/9828/4942 +f 6583/9129/4943 6542/10078/4943 6533/10429/4943 7015/9126/4943 +f 6870/9971/4944 6538/10235/4944 6533/10429/4944 7014/9108/4944 +f 6806/10015/4945 6536/10311/4945 6534/10428/4945 7018/9837/4945 +f 6742/9973/4946 6540/10175/4946 6535/10427/4946 7022/8895/4946 +f 7017/8896/4947 6537/10310/4947 6536/10311/4947 6806/10015/4947 +f 7013/9838/4948 6539/10234/4948 6538/10235/4948 6870/9971/4948 +f 7021/9100/4949 6541/9638/4949 6540/10175/4949 6742/9973/4949 +f 7032/9139/4950 6526/10336/4950 6532/10450/4950 6587/9136/4950 +f 7028/8905/4951 6530/10206/4951 6524/10424/4951 7035/8902/4951 +f 7024/9823/4952 6528/10280/4952 6523/10425/4952 7031/9820/4952 +f 6589/9148/4953 6531/10081/4953 6522/10426/4953 7027/9145/4953 +f 6872/9993/4954 6527/10281/4954 6522/10426/4954 7026/9127/4954 +f 6808/9969/4955 6529/10207/4955 6523/10425/4955 7030/9829/4955 +f 6744/9965/4956 6525/10337/4956 6524/10424/4956 7034/8899/4956 +f 7033/9119/4957 6526/10336/4957 6525/10337/4957 6744/9965/4957 +f 7025/9830/4958 6528/10280/4958 6527/10281/4958 6872/9993/4958 +f 7029/8900/4959 6530/10206/4959 6529/10207/4959 6808/9969/4959 +f 7044/9158/4960 6517/10176/4960 6521/10082/4960 6593/9155/4960 +f 7040/8909/4961 6515/10308/4961 6513/10421/4961 7047/8906/4961 +f 7036/9815/4962 6519/10161/4962 6512/10422/4962 7043/9812/4962 +f 6595/9167/4963 6520/10083/4963 6511/10423/4963 7039/9164/4963 +f 6874/9967/4964 6518/10162/4964 6511/10423/4964 7038/9146/4964 +f 6810/9963/4965 6514/10309/4965 6512/10422/4965 7042/9821/4965 +f 6746/10041/4966 6516/10177/4966 6513/10421/4966 7046/8903/4966 +f 7041/8904/4967 6515/10308/4967 6514/10309/4967 6810/9963/4967 +f 7045/9138/4968 6517/10176/4968 6516/10177/4968 6746/10041/4968 +f 7037/9822/4969 6519/10161/4969 6518/10162/4969 6874/9967/4969 +f 7008/9101/4970 6508/10173/4970 6510/10449/4970 6575/9098/4970 +f 7004/8897/4971 6506/10204/4971 6502/10430/4971 7011/8894/4971 +f 7000/9839/4972 6504/10282/4972 6501/10431/4972 7007/9836/4972 +f 6577/9110/4973 6509/10077/4973 6500/10432/4973 7003/9107/4973 +f 6868/9991/4974 6503/10283/4974 6500/10432/4974 7002/9089/4974 +f 6804/9975/4975 6505/10205/4975 6501/10431/4975 7006/9845/4975 +f 6740/10039/4976 6507/10174/4976 6502/10430/4976 7010/8891/4976 +f 7001/9846/4977 6504/10282/4977 6503/10283/4977 6868/9991/4977 +f 7005/8892/4978 6506/10204/4978 6505/10205/4978 6804/9975/4978 +f 7009/9081/4979 6508/10173/4979 6507/10174/4979 6740/10039/4979 +f 6996/9082/4980 6493/10338/4980 6499/10073/4980 6569/9079/4980 +f 6992/8893/4981 6497/10202/4981 6491/10433/4981 6999/8890/4981 +f 6988/9847/4982 6495/10232/4982 6490/10434/4982 6995/9844/4982 +f 6571/9091/4983 6498/10074/4983 6489/10435/4983 6991/9088/4983 +f 6866/9981/4984 6494/10233/4984 6489/10435/4984 6990/9070/4984 +f 6802/9867/4985 6496/10203/4985 6490/10434/4985 6994/9853/4985 +f 6738/9977/4986 6492/10339/4986 6491/10433/4986 6998/8887/4986 +f 6997/9064/4987 6493/10338/4987 6492/10339/4987 6738/9977/4987 +f 6989/9854/4988 6495/10232/4988 6494/10233/4988 6866/9981/4988 +f 6993/8888/4989 6497/10202/4989 6496/10203/4989 6802/9867/4989 +f 6984/9065/4990 6486/10143/4990 6488/10448/4990 6563/8999/4990 +f 6980/8889/4991 6482/10312/4991 6480/10436/4991 6987/8886/4991 +f 6976/9855/4992 6484/10230/4992 6479/10437/4992 6983/9852/4992 +f 6565/9072/4993 6487/10072/4993 6478/10438/4993 6979/9069/4993 +f 6864/9869/4994 6483/10231/4994 6478/10438/4994 6978/9055/4994 +f 6800/9979/4995 6481/10313/4995 6479/10437/4995 6982/9627/4995 +f 6736/9631/4996 6485/10144/4996 6480/10436/4996 6986/8883/4996 +f 6981/8884/4997 6482/10312/4997 6481/10313/4997 6800/9979/4997 +f 6977/9628/4998 6484/10230/4998 6483/10231/4998 6864/9869/4998 +f 6985/9049/4999 6486/10143/4999 6485/10144/4999 6736/9631/4999 +f 6974/9050/5000 6469/10349/5000 6477/10068/5000 6557/8881/5000 +f 6970/8885/5001 6468/10350/5001 6471/10314/5001 6973/8882/5001 +f 6966/9629/5002 6467/10351/5002 6475/10226/5002 6969/9626/5002 +f 6559/9057/5003 6476/10069/5003 6473/10256/5003 6965/9054/5003 +f 6922/9868/5004 6472/10257/5004 6467/10351/5004 6966/9629/5004 +f 6858/9978/5005 6474/10227/5005 6468/10350/5005 6970/8885/5005 +f 6794/9630/5006 6470/10315/5006 6469/10349/5006 6974/9050/5006 +f 6973/8882/5007 6471/10314/5007 6470/10315/5007 6794/9630/5007 +f 6965/9054/5008 6473/10256/5008 6472/10257/5008 6922/9868/5008 +f 6969/9626/5009 6475/10226/5009 6474/10227/5009 6858/9978/5009 +f 6553/9042/5010 6465/10067/5010 6460/10258/5010 6941/9039/5010 +f 6942/9863/5011 6456/10348/5011 6462/10228/5011 6945/9860/5011 +f 6950/9035/5012 6458/10342/5012 6466/10444/5012 6551/9009/5012 +f 6946/9003/5013 6457/10345/5013 6464/10196/5013 6949/9000/5013 +f 6924/9884/5014 6459/10259/5014 6456/10348/5014 6942/9863/5014 +f 6860/9984/5015 6461/10229/5015 6457/10345/5015 6946/9003/5015 +f 6796/9880/5016 6463/10197/5016 6458/10342/5016 6950/9035/5016 +f 6941/9039/5017 6460/10258/5017 6459/10259/5017 6924/9884/5017 +f 6945/9860/5018 6462/10228/5018 6461/10229/5018 6860/9984/5018 +f 6949/9000/5019 6464/10196/5019 6463/10197/5019 6796/9880/5019 +f 6938/9601/5020 6445/10347/5020 6454/10447/5020 6548/9025/5020 +f 6936/10462/5021 6453/10169/5021 6446/10445/5021 6935/10463/5021 +f 6930/9857/5022 6447/10341/5022 6449/10443/5022 6933/9858/5022 +f 6928/10199/5023 6451/10198/5023 6455/10440/5023 6545/10464/5023 +f 6926/9635/5024 6452/10172/5024 6445/10347/5024 6938/9601/5024 +f 6862/9883/5025 6448/10287/5025 6446/10344/5025 6934/9865/5025 +f 6798/10037/5026 6450/10201/5026 6447/10341/5026 6930/9857/5026 +f 6933/9858/5027 6449/10284/5027 6448/10287/5027 6862/9883/5027 +f 6929/9012/5028 6451/10198/5028 6450/10201/5028 6798/10037/5028 +f 6937/9634/5029 6453/10169/5029 6452/10172/5029 6926/9635/5029 +f 6960/9583/5030 6440/10260/5030 6443/10142/5030 6734/9584/5030 +f 6956/9623/5031 6442/10159/5031 6434/10357/5031 6963/9624/5031 +f 6952/9619/5032 6438/10316/5032 6435/10355/5032 6959/9620/5032 +f 6730/9574/5033 6444/10439/5033 6436/10353/5033 6955/9575/5033 +f 6918/9632/5034 6439/10261/5034 6434/10357/5034 6962/9633/5034 +f 6854/9882/5035 6441/10160/5035 6435/10355/5035 6958/9859/5035 +f 6790/10036/5036 6437/10317/5036 6436/10353/5036 6954/9013/5036 +f 6953/9856/5037 6438/10316/5037 6437/10317/5037 6790/10036/5037 +f 6961/9600/5038 6440/10260/5038 6439/10261/5038 6918/9632/5038 +f 6957/9864/5039 6442/10159/5039 6441/10160/5039 6854/9882/5039 +f 7302/9564/5040 6423/10356/5040 6432/10138/5040 6728/9565/5040 +f 7306/9645/5041 6424/10354/5041 6429/10254/5041 7301/9646/5041 +f 7310/8991/5042 6425/10352/5042 6427/10288/5042 7305/8992/5042 +f 6724/9555/5043 6433/10137/5043 6431/10151/5043 7309/9556/5043 +f 6920/9889/5044 6428/10255/5044 6423/10356/5044 7302/9564/5044 +f 6856/10035/5045 6426/10289/5045 6424/10354/5045 7306/9645/5045 +f 6792/9887/5046 6430/10152/5046 6425/10352/5046 7310/8991/5046 +f 7305/8992/5047 6427/10288/5047 6426/10289/5047 6856/10035/5047 +f 7301/9646/5048 6429/10254/5048 6428/10255/5048 6920/9889/5048 +f 7309/9556/5049 6431/10151/5049 6430/10152/5049 6792/9887/5049 +f 7296/9557/5050 6418/10194/5050 6422/10461/5050 6719/9554/5050 +f 7292/8993/5051 6416/10290/5051 6414/10358/5051 7299/8990/5051 +f 7288/9647/5052 6420/10167/5052 6413/10359/5052 7295/9644/5052 +f 6721/9566/5053 6421/10136/5053 6412/10360/5053 7291/9563/5053 +f 6916/9895/5054 6419/10168/5054 6412/10360/5054 7290/9545/5054 +f 6852/9891/5055 6415/10291/5055 6413/10359/5055 7294/9653/5055 +f 6788/10059/5056 6417/10195/5056 6414/10358/5056 7298/8987/5056 +f 7293/8988/5057 6416/10290/5057 6415/10291/5057 6852/9891/5057 +f 7297/9537/5058 6418/10194/5058 6417/10195/5058 6788/10059/5058 +f 7289/9654/5059 6420/10167/5059 6419/10168/5059 6916/9895/5059 +f 7284/9538/5060 6405/10318/5060 6411/10132/5060 6713/9535/5060 +f 7280/8989/5061 6409/10224/5061 6403/10361/5061 7287/8986/5061 +f 7276/9655/5062 6407/10262/5062 6402/10362/5062 7283/9652/5062 +f 6715/9547/5063 6410/10133/5063 6401/10363/5063 7279/9544/5063 +f 6914/10011/5064 6406/10263/5064 6401/10363/5064 7278/9526/5064 +f 6850/9897/5065 6408/10225/5065 6402/10362/5065 7282/9661/5065 +f 6786/9893/5066 6404/10319/5066 6403/10361/5066 7286/8983/5066 +f 7285/9518/5067 6405/10318/5067 6404/10319/5067 6786/9893/5067 +f 7277/9662/5068 6407/10262/5068 6406/10263/5068 6914/10011/5068 +f 7281/8984/5069 6409/10224/5069 6408/10225/5069 6850/9897/5069 +f 7272/9519/5070 6398/10192/5070 6400/10460/5070 6707/9516/5070 +f 7268/8985/5071 6394/10292/5071 6392/10364/5071 7275/8982/5071 +f 7264/9663/5072 6396/10252/5072 6391/10365/5072 7271/9660/5072 +f 6709/9528/5073 6399/10131/5073 6390/10366/5073 7267/9525/5073 +f 6912/9899/5074 6395/10253/5074 6390/10366/5074 7266/9507/5074 +f 6848/10033/5075 6393/10293/5075 6391/10365/5075 7270/9669/5075 +f 6784/9901/5076 6397/10193/5076 6392/10364/5076 7274/8979/5076 +f 7269/8980/5077 6394/10292/5077 6393/10293/5077 6848/10033/5077 +f 7265/9670/5078 6396/10252/5078 6395/10253/5078 6912/9899/5078 +f 7273/9499/5079 6398/10192/5079 6397/10193/5079 6784/9901/5079 +f 7260/9500/5080 6387/10190/5080 6389/10127/5080 6701/9497/5080 +f 7256/8981/5081 6385/10222/5081 6381/10367/5081 7263/8978/5081 +f 7252/9671/5082 6383/10264/5082 6380/10368/5082 7259/9668/5082 +f 6703/9509/5083 6388/10128/5083 6379/10369/5083 7255/9506/5083 +f 6910/10009/5084 6382/10265/5084 6379/10369/5084 7254/9488/5084 +f 6846/9903/5085 6384/10223/5085 6380/10368/5085 7258/9677/5085 +f 6782/10057/5086 6386/10191/5086 6381/10367/5086 7262/8975/5086 +f 7253/9678/5087 6383/10264/5087 6382/10265/5087 6910/10009/5087 +f 7257/8976/5088 6385/10222/5088 6384/10223/5088 6846/9903/5088 +f 7261/9480/5089 6387/10190/5089 6386/10191/5089 6782/10057/5089 +f 7248/9481/5090 6372/10320/5090 6378/10459/5090 6695/9478/5090 +f 7244/8977/5091 6376/10220/5091 6370/10370/5091 7251/8974/5091 +f 7240/9679/5092 6374/10250/5092 6369/10371/5092 7247/9676/5092 +f 6697/9490/5093 6377/10126/5093 6368/10372/5093 7243/9487/5093 +f 6908/9907/5094 6373/10251/5094 6368/10372/5094 7242/9469/5094 +f 6844/10031/5095 6375/10221/5095 6369/10371/5095 7246/9685/5095 +f 6780/9905/5096 6371/10321/5096 6370/10370/5096 7250/8971/5096 +f 7249/9461/5097 6372/10320/5097 6371/10321/5097 6780/9905/5097 +f 7241/9686/5098 6374/10250/5098 6373/10251/5098 6908/9907/5098 +f 7245/8972/5099 6376/10220/5099 6375/10221/5099 6844/10031/5099 +f 7236/9462/5100 6365/10149/5100 6367/10122/5100 6689/9459/5100 +f 7232/8973/5101 6361/10294/5101 6359/10373/5101 7239/8970/5101 +f 7228/9687/5102 6363/10248/5102 6358/10374/5102 7235/9684/5102 +f 6691/9471/5103 6366/10123/5103 6357/10375/5103 7231/9468/5103 +f 6906/10007/5104 6362/10249/5104 6357/10375/5104 7230/9450/5104 +f 6842/9909/5105 6360/10295/5105 6358/10374/5105 7234/9693/5105 +f 6778/10055/5106 6364/10150/5106 6359/10373/5106 7238/8967/5106 +f 7233/8968/5107 6361/10294/5107 6360/10295/5107 6842/9909/5107 +f 7229/9694/5108 6363/10248/5108 6362/10249/5108 6906/10007/5108 +f 7237/9442/5109 6365/10149/5109 6364/10150/5109 6778/10055/5109 +f 7224/9443/5110 6350/10322/5110 6356/10458/5110 6683/9440/5110 +f 7220/8969/5111 6354/10157/5111 6348/10376/5111 7227/8966/5111 +f 7216/9695/5112 6352/10266/5112 6347/10377/5112 7223/9692/5112 +f 6685/9452/5113 6355/10121/5113 6346/10378/5113 7219/9449/5113 +f 6904/9913/5114 6351/10267/5114 6346/10378/5114 7218/9431/5114 +f 6840/10029/5115 6353/10158/5115 6347/10377/5115 7222/9701/5115 +f 6776/9911/5116 6349/10323/5116 6348/10376/5116 7226/8963/5116 +f 7225/9423/5117 6350/10322/5117 6349/10323/5117 6776/9911/5117 +f 7217/9702/5118 6352/10266/5118 6351/10267/5118 6904/9913/5118 +f 7221/8964/5119 6354/10157/5119 6353/10158/5119 6840/10029/5119 +f 7212/9424/5120 6341/10188/5120 6345/10117/5120 6677/9421/5120 +f 7208/8965/5121 6339/10296/5121 6337/10379/5121 7215/8962/5121 +f 7204/9703/5122 6343/10165/5122 6336/10380/5122 7211/9700/5122 +f 6679/9433/5123 6344/10118/5123 6335/10381/5123 7207/9430/5123 +f 6902/9919/5124 6342/10166/5124 6335/10381/5124 7206/9412/5124 +f 6838/9915/5125 6338/10297/5125 6336/10380/5125 7210/9709/5125 +f 6774/10053/5126 6340/10189/5126 6337/10379/5126 7214/8959/5126 +f 7209/8960/5127 6339/10296/5127 6338/10297/5127 6838/9915/5127 +f 7213/9404/5128 6341/10188/5128 6340/10189/5128 6774/10053/5128 +f 7205/9710/5129 6343/10165/5129 6342/10166/5129 6902/9919/5129 +f 7200/9405/5130 6328/10324/5130 6334/10457/5130 6671/9402/5130 +f 7196/8961/5131 6332/10218/5131 6326/10382/5131 7203/8958/5131 +f 7192/9711/5132 6330/10268/5132 6325/10383/5132 7199/9708/5132 +f 6673/9414/5133 6333/10116/5133 6324/10384/5133 7195/9411/5133 +f 6900/10005/5134 6329/10269/5134 6324/10384/5134 7194/9393/5134 +f 6836/9921/5135 6331/10219/5135 6325/10383/5135 7198/9717/5135 +f 6772/9917/5136 6327/10325/5136 6326/10382/5136 7202/8955/5136 +f 7201/9385/5137 6328/10324/5137 6327/10325/5137 6772/9917/5137 +f 7193/9718/5138 6330/10268/5138 6329/10269/5138 6900/10005/5138 +f 7197/8956/5139 6332/10218/5139 6331/10219/5139 6836/9921/5139 +f 7188/9386/5140 6321/10186/5140 6323/10112/5140 6665/9383/5140 +f 7184/8957/5141 6317/10298/5141 6315/10385/5141 7191/8954/5141 +f 7180/9719/5142 6319/10246/5142 6314/10386/5142 7187/9716/5142 +f 6667/9395/5143 6322/10113/5143 6313/10387/5143 7183/9392/5143 +f 6898/9923/5144 6318/10247/5144 6313/10387/5144 7182/9374/5144 +f 6834/10027/5145 6316/10299/5145 6314/10386/5145 7186/9725/5145 +f 6770/9925/5146 6320/10187/5146 6315/10385/5146 7190/8951/5146 +f 7185/8952/5147 6317/10298/5147 6316/10299/5147 6834/10027/5147 +f 7181/9726/5148 6319/10246/5148 6318/10247/5148 6898/9923/5148 +f 7189/9366/5149 6321/10186/5149 6320/10187/5149 6770/9925/5149 +f 7176/9367/5150 6310/10184/5150 6312/10456/5150 6659/9364/5150 +f 7172/8953/5151 6308/10216/5151 6304/10388/5151 7179/8950/5151 +f 7168/9727/5152 6306/10270/5152 6303/10389/5152 7175/9724/5152 +f 6661/9376/5153 6311/10111/5153 6302/10390/5153 7171/9373/5153 +f 6896/10003/5154 6305/10271/5154 6302/10390/5154 7170/9355/5154 +f 6832/9927/5155 6307/10217/5155 6303/10389/5155 7174/9733/5155 +f 6768/10051/5156 6309/10185/5156 6304/10388/5156 7178/8947/5156 +f 7169/9734/5157 6306/10270/5157 6305/10271/5157 6896/10003/5157 +f 7173/8948/5158 6308/10216/5158 6307/10217/5158 6832/9927/5158 +f 7177/9347/5159 6310/10184/5159 6309/10185/5159 6768/10051/5159 +f 7164/9348/5160 6295/10326/5160 6301/10107/5160 6653/9345/5160 +f 7160/8949/5161 6299/10214/5161 6293/10391/5161 7167/8946/5161 +f 7156/9735/5162 6297/10244/5162 6292/10392/5162 7163/9732/5162 +f 6655/9357/5163 6300/10108/5163 6291/10393/5163 7159/9354/5163 +f 6894/9931/5164 6296/10245/5164 6291/10393/5164 7158/9336/5164 +f 6830/10025/5165 6298/10215/5165 6292/10392/5165 7162/9741/5165 +f 6766/9929/5166 6294/10327/5166 6293/10391/5166 7166/8943/5166 +f 7165/9328/5167 6295/10326/5167 6294/10327/5167 6766/9929/5167 +f 7157/9742/5168 6297/10244/5168 6296/10245/5168 6894/9931/5168 +f 7161/8944/5169 6299/10214/5169 6298/10215/5169 6830/10025/5169 +f 7152/9329/5170 6288/10147/5170 6290/10455/5170 6647/9326/5170 +f 7148/8945/5171 6284/10300/5171 6282/10394/5171 7155/8942/5171 +f 7144/9743/5172 6286/10242/5172 6281/10395/5172 7151/9740/5172 +f 6649/9338/5173 6289/10106/5173 6280/10396/5173 7147/9335/5173 +f 6892/10001/5174 6285/10243/5174 6280/10396/5174 7146/9317/5174 +f 6828/9933/5175 6283/10301/5175 6281/10395/5175 7150/9749/5175 +f 6764/10049/5176 6287/10148/5176 6282/10394/5176 7154/8939/5176 +f 7149/8940/5177 6284/10300/5177 6283/10301/5177 6828/9933/5177 +f 7145/9750/5178 6286/10242/5178 6285/10243/5178 6892/10001/5178 +f 7153/9309/5179 6288/10147/5179 6287/10148/5179 6764/10049/5179 +f 7140/9310/5180 6273/10328/5180 6279/10102/5180 6641/9307/5180 +f 7136/8941/5181 6277/10155/5181 6271/10397/5181 7143/8938/5181 +f 7132/9751/5182 6275/10272/5182 6270/10398/5182 7139/9748/5182 +f 6643/9319/5183 6278/10103/5183 6269/10399/5183 7135/9316/5183 +f 6890/9937/5184 6274/10273/5184 6269/10399/5184 7134/9298/5184 +f 6826/10023/5185 6276/10156/5185 6270/10398/5185 7138/9757/5185 +f 6762/9935/5186 6272/10329/5186 6271/10397/5186 7142/8935/5186 +f 7141/9290/5187 6273/10328/5187 6272/10329/5187 6762/9935/5187 +f 7133/9758/5188 6275/10272/5188 6274/10273/5188 6890/9937/5188 +f 7137/8936/5189 6277/10155/5189 6276/10156/5189 6826/10023/5189 +f 7128/9291/5190 6264/10182/5190 6268/10454/5190 6635/9288/5190 +f 7124/8937/5191 6262/10302/5191 6260/10400/5191 7131/8934/5191 +f 7120/9759/5192 6266/10163/5192 6259/10401/5192 7127/9756/5192 +f 6637/9300/5193 6267/10101/5193 6258/10402/5193 7123/9297/5193 +f 6888/9943/5194 6265/10164/5194 6258/10402/5194 7122/9279/5194 +f 6824/9939/5195 6261/10303/5195 6259/10401/5195 7126/9765/5195 +f 6760/10047/5196 6263/10183/5196 6260/10400/5196 7130/8931/5196 +f 7125/8932/5197 6262/10302/5197 6261/10303/5197 6824/9939/5197 +f 7129/9271/5198 6264/10182/5198 6263/10183/5198 6760/10047/5198 +f 7121/9766/5199 6266/10163/5199 6265/10164/5199 6888/9943/5199 +f 7116/9272/5200 6239/10330/5200 6257/10097/5200 6629/9269/5200 +f 7112/8933/5201 6253/10212/5201 6232/10403/5201 7119/8930/5201 +f 7108/9767/5202 6246/10274/5202 6229/10404/5202 7115/9764/5202 +f 6631/9281/5203 6256/10098/5203 6225/10405/5203 7111/9278/5203 +f 6886/9999/5204 6243/10275/5204 6225/10405/5204 7110/9260/5204 +f 6822/9945/5205 6250/10213/5205 6229/10404/5205 7114/9773/5205 +f 6758/9941/5206 6236/10331/5206 6232/10403/5206 7118/8927/5206 +f 7117/9252/5207 6239/10330/5207 6236/10331/5207 6758/9941/5207 +f 7109/9774/5208 6246/10274/5208 6243/10275/5208 6886/9999/5208 +f 7113/8928/5209 6253/10212/5209 6250/10213/5209 6822/9945/5209 +f 7104/9253/5210 6215/10180/5210 6222/10453/5210 6623/9250/5210 +f 7100/8929/5211 6201/10304/5211 6194/10406/5211 7107/8926/5211 +f 7096/9775/5212 6208/10240/5212 6190/10407/5212 7103/9772/5212 +f 6625/9262/5213 6218/10096/5213 6187/10408/5213 7099/9259/5213 +f 6884/9947/5214 6204/10241/5214 6187/10408/5214 7098/9241/5214 +f 6820/10021/5215 6197/10305/5215 6190/10407/5215 7102/9781/5215 +f 6756/9949/5216 6211/10181/5216 6194/10406/5216 7106/8923/5216 +f 7101/8924/5217 6201/10304/5217 6197/10305/5217 6820/10021/5217 +f 7097/9782/5218 6208/10240/5218 6204/10241/5218 6884/9947/5218 +f 7105/9233/5219 6215/10180/5219 6211/10181/5219 6756/9949/5219 +f 7092/9234/5220 6176/10178/5220 6183/10092/5220 6617/9231/5220 +f 7088/8925/5221 6169/10210/5221 6155/10409/5221 7095/8922/5221 +f 7084/9783/5222 6162/10276/5222 6152/10410/5222 7091/9780/5222 +f 6619/9243/5223 6180/10093/5223 6148/10411/5223 7087/9240/5223 +f 6882/9997/5224 6159/10277/5224 6148/10411/5224 7086/9222/5224 +f 6818/9951/5225 6166/10211/5225 6152/10410/5225 7090/9789/5225 +f 6754/10045/5226 6173/10179/5226 6155/10409/5226 7094/8919/5226 +f 7085/9790/5227 6162/10276/5227 6159/10277/5227 6882/9997/5227 +f 7089/8920/5228 6169/10210/5228 6166/10211/5228 6818/9951/5228 +f 7093/9214/5229 6176/10178/5229 6173/10179/5229 6754/10045/5229 +f 7080/9215/5230 6124/10332/5230 6145/10452/5230 6611/9212/5230 +f 7076/8921/5231 6138/10208/5231 6117/10412/5231 7083/8918/5231 +f 7072/9791/5232 6131/10238/5232 6113/10413/5232 7079/9788/5232 +f 6613/9224/5233 6141/10091/5233 6110/10414/5233 7075/9221/5233 +f 6880/9955/5234 6127/10239/5234 6110/10414/5234 7074/9203/5234 +f 6816/10019/5235 6134/10209/5235 6113/10413/5235 7078/9797/5235 +f 6752/9953/5236 6120/10333/5236 6117/10412/5236 7082/8915/5236 +f 7081/9195/5237 6124/10332/5237 6120/10333/5237 6752/9953/5237 +f 7073/9798/5238 6131/10238/5238 6127/10239/5238 6880/9955/5238 +f 7077/8916/5239 6138/10208/5239 6134/10209/5239 6816/10019/5239 +f 7068/9196/5240 6099/10145/5240 6106/10087/5240 6605/9193/5240 +f 7064/8917/5241 6085/10306/5241 6078/10415/5241 7071/8914/5241 +f 7060/9799/5242 6092/10236/5242 6075/10416/5242 7067/9796/5242 +f 6607/9205/5243 6103/10088/5243 6071/10417/5243 7063/9202/5243 +f 6878/9995/5244 6089/10237/5244 6071/10417/5244 7062/9184/5244 +f 6814/9957/5245 6082/10307/5245 6075/10416/5245 7066/9805/5245 +f 6750/10043/5246 6096/10146/5246 6078/10415/5246 7070/8911/5246 +f 7065/8912/5247 6085/10306/5247 6082/10307/5247 6814/9957/5247 +f 7061/9806/5248 6092/10236/5248 6089/10237/5248 6878/9995/5248 +f 7069/9176/5249 6099/10145/5249 6096/10146/5249 6750/10043/5249 +f 7056/9177/5250 7318/10334/5250 7312/10451/5250 6599/9174/5250 +f 7052/8913/5251 7314/10153/5251 7320/10418/5251 7059/8910/5251 +f 7048/9807/5252 7316/10278/5252 7321/10419/5252 7055/9804/5252 +f 6601/9186/5253 7313/10086/5253 7322/10420/5253 7051/9183/5253 +f 6876/9961/5254 7317/10279/5254 7322/10420/5254 7050/9165/5254 +f 6812/10017/5255 7315/10154/5255 7321/10419/5255 7054/9813/5255 +f 6748/9959/5256 7319/10335/5256 7320/10418/5256 7058/8907/5256 +f 7057/9157/5257 7318/10334/5257 7319/10335/5257 6748/9959/5257 +f 7049/9814/5258 7316/10278/5258 7317/10279/5258 6876/9961/5258 +f 7053/8908/5259 7314/10153/5259 7315/10154/5259 6812/10017/5259 +f 7461/10465/5260 7460/10466/5260 7323/9032/5260 7324/9031/5260 7355/10467/5260 +f 7462/10468/5261 7436/10469/5261 7355/10467/5261 7324/9031/5261 7325/9048/5261 +f 7328/9097/5262 7329/9116/5262 7356/8138/5262 7442/8137/5262 7464/10470/5262 +f 7466/10471/5263 7444/8139/5263 7356/8138/5263 7329/9116/5263 7330/9135/5263 +f 7333/9192/5264 7469/10472/5264 7468/10473/5264 7332/9173/5264 +f 7334/9211/5265 7471/10474/5265 7469/10472/5265 7333/9192/5265 +f 7335/9230/5266 7472/10475/5266 7471/10474/5266 7334/9211/5266 +f 7422/10476/5267 7474/10477/5267 7337/9268/5267 7338/9287/5267 +f 7475/10478/5268 7422/10476/5268 7338/9287/5268 7339/9306/5268 +f 7423/10479/5269 7424/10480/5269 7341/9344/5269 7342/9363/5269 +f 7425/10481/5270 7423/10479/5270 7342/9363/5270 7343/9382/5270 +f 7426/10482/5271 7425/10481/5271 7343/9382/5271 7344/9401/5271 +f 7428/10483/5272 7427/10484/5272 7346/9439/5272 7347/9458/5272 +f 7429/10485/5273 7428/10483/5273 7347/9458/5273 7348/9477/5273 +f 7430/10486/5274 7431/10487/5274 7350/9515/5274 7351/9534/5274 +f 7352/9553/5275 7357/10488/5275 7432/10489/5275 7430/10486/5275 7351/9534/5275 +f 7433/10490/5276 7434/10491/5276 7357/10488/5276 7352/9553/5276 7353/9572/5276 +f 7436/10469/4058 7438/10492/4058 7355/10467/4058 +f 7357/10488/4058 7453/10493/4058 7432/10489/4058 +f 7459/10494/5277 7433/10490/5277 7353/9572/5277 7354/9591/5277 7458/10495/5277 7456/10496/5277 7457/10497/5277 7364/10498/5277 +f 7460/10466/5278 7465/10499/5278 7365/10500/5278 7463/10501/5278 7458/10495/5278 7354/9591/5278 7323/9032/5278 +f 7438/10492/4058 7461/10465/4058 7355/10467/4058 +f 7357/10488/4058 7434/10491/4058 7453/10493/4058 +f 7498/10502/5279 7429/10485/5279 7348/9477/5279 7349/9496/5279 7496/10503/5279 7497/10504/5279 7372/10505/5279 +f 7502/10506/5280 7503/10507/5280 7496/10503/5280 7349/9496/5280 7350/9515/5280 7431/10487/5280 7499/10508/5280 7373/10509/5280 +f 7531/10510/5281 7426/10482/5281 7344/9401/5281 7345/9420/5281 7529/10511/5281 7528/10512/5281 7530/10513/5281 7380/10514/5281 +f 7529/10511/5282 7345/9420/5282 7346/9439/5282 7427/10484/5282 7534/10515/5282 7381/10516/5282 7536/10517/5282 +f 7560/10518/5283 7475/10478/5283 7339/9306/5283 7340/9325/5283 7558/10519/5283 7557/10520/5283 7388/10521/5283 +f 7562/10522/5284 7561/10523/5284 7558/10519/5284 7340/9325/5284 7341/9344/5284 7424/10480/5284 7563/10524/5284 7389/10525/5284 +f 7485/10526/5285 7472/10475/5285 7335/9230/5285 7336/9249/5285 7481/10527/5285 7484/10528/5285 7482/10529/5285 7396/10530/5285 +f 7337/9268/5286 7474/10477/5286 7490/10531/5286 7397/10532/5286 7487/10533/5286 7481/10527/5286 7336/9249/5286 +f 7515/10534/5287 7466/10471/5287 7330/9135/5287 7331/9154/5287 7514/10535/5287 7513/10536/5287 7404/10537/5287 +f 7520/10538/5288 7519/10539/5288 7514/10535/5288 7331/9154/5288 7332/9173/5288 7468/10473/5288 7517/10540/5288 7405/10541/5288 +f 7413/10542/5289 7539/10543/5289 7462/10468/5289 7325/9048/5289 7326/9063/5289 7412/10544/5289 +f 7546/10545/5290 7547/10546/5290 7545/10547/5290 7412/10544/5290 7326/9063/5290 7327/9078/5290 7541/10548/5290 7542/10549/5290 7414/10550/5290 +f 7464/10470/5291 7541/10548/5291 7327/9078/5291 7328/9097/5291 diff --git a/f1tenth_gym/envs/rendering/mesh_renderer.py b/f1tenth_gym/envs/rendering/mesh_renderer.py new file mode 100644 index 00000000..76bb8320 --- /dev/null +++ b/f1tenth_gym/envs/rendering/mesh_renderer.py @@ -0,0 +1,162 @@ +import sys +import numpy as np +from pathlib import Path +from pyqtgraph.opengl import MeshData, GLMeshItem + +from .renderer import RenderSpec, EnvRenderer, ObjectRenderer + +class MeshRenderer(ObjectRenderer): + def __init__(self, + env_renderer: EnvRenderer, + render_spec: RenderSpec, + map_origin: tuple[float, float], + resolution: float, + car_length: float, + car_width: float, + color: list[int] | None = None, + wheel_size: float = 0.2 + ): + super().__init__() + import trimesh + self.trimesh = trimesh + self.car_length = car_length + self.car_width = car_width + self.wheel_size = wheel_size + self.view = env_renderer.view + + self.load_obj() + self.mesh_dict = self.get_mesh_dict() + + + self.origin = map_origin + self.resolution = resolution + + self.color = color + self.pose = (0, 0, 0) + self.steering = 0 + + # Tire params need to be updated + self.tire_width = 0.1 + self.tire_length = self.wheel_size + + + def load_obj(self): + # Load meshes (skip the ground plane) + scene = self.trimesh.load(OBJ_PATH, process=False) + self.parts = {n:m for n,m in scene.geometry.items() if n != "Plane.002"} + + # Compute wheel center + centers = [self.parts[w].vertices.mean(axis=0) for w in WHEEL_NAMES] + self.wheel_center = np.stack(centers).mean(axis=0) + # print(self.wheel_center) + + all_vs = np.vstack([m.vertices for m in self.parts.values()]) + self.center_xy = np.array([all_vs[:,0].mean(), all_vs[:,1].mean(), 0], dtype=np.float32) + + self.car_pose = { + "x": 0.0, # position east + "y": 0.0, # position north + "z": 0.0, # height above ground plane + "roll": 0.0, # rotation about vehicle X axis + "pitch": 0.0, # rotation about vehicle Y axis + "yaw": 0.0 # rotation about vehicle Z axis + } + + # Build the 3D pose transform + R = euler_to_matrix(self.car_pose["roll"] + 90, self.car_pose["pitch"], self.car_pose["yaw"]) + t = np.array([self.car_pose["x"], self.car_pose["y"], self.car_pose["z"]], dtype=np.float32) + + # Find the lowest Z after rotating about wheel center + minz = np.inf + for mesh in self.parts.values(): + V = mesh.vertices.astype(np.float32) + Vc = V - self.wheel_center + Vr = Vc @ R.T + minz = min(minz, Vr[:,2].min()) + # Lift so wheels sit on Z=0, then add self.car_pose z + self.z_lift = -minz + self.car_pose["z"] + + def update(self, obs: dict[str, np.ndarray], id: str): + state = obs[id]["std_state"].astype(float) + self.car_pose['x'] = state[0] + self.car_pose['y'] = state[1] + self.car_pose['yaw'] = state[4] / np.pi * 180 + self.steering = state[2] + + + def get_mesh_dict(self): + mesh_dict = {} + for name, mesh in self.parts.items(): + V = mesh.vertices.astype(np.float32) + F = mesh.faces.astype(np.int32) + # center on wheels, rotate, then translate+lift + Vc = V - self.wheel_center + Vfinal = Vc + np.array([self.car_pose["x"], self.car_pose["y"], self.z_lift],dtype=np.float32) + + md = MeshData(vertexes=Vfinal, faces=F) + item = GLMeshItem(meshdata=md, smooth=True, + shader='shaded', drawFaces=True, drawEdges=False) + item.setColor(COLOR_MAP.get(name, DEFAULT_COLOR)) + item.setGLOptions('opaque') + self.view.addItem(item) + mesh_dict[name] = item + return mesh_dict + + def render(self, scale=1.0): + # Render each part with the full pose + R = euler_to_matrix(self.car_pose["roll"] + 90, self.car_pose["pitch"], self.car_pose["yaw"]) + t = np.array([self.car_pose["x"], self.car_pose["y"], self.car_pose["z"]], dtype=np.float32) + tx, ty = self.car_pose["x"], self.car_pose["y"] + for name, mesh in self.parts.items(): + item = self.mesh_dict[name] + item.resetTransform() + # 2) center on wheels, apply rotation + # and apply global translation & lift in one go + # note translate is post-multiplied, so do them in reverse order: + item.translate(-self.wheel_center[0], + -self.wheel_center[1], + -self.wheel_center[2]) + + item.rotate(self.car_pose["roll"]+90, 1, 0, 0) + item.rotate(self.car_pose["yaw"], 0, 0, 1) + item.rotate(self.car_pose["pitch"], 0, 1, 0) + + item.translate(tx, ty, self.z_lift) + + + +OBJ_PATH = Path(__file__).parent / "example_mesh_cyber.obj" +# Exact object‐name → RGBA color +COLOR_MAP = { + "WBL_b1.004_Cylinder.035": (0.35, 0.35, 0.35, 1.0), # wheels + "WBL_b1.003_Cylinder.034": (0.35, 0.35, 0.35, 1.0), + "WBL_b1.002_Cylinder.033": (0.35, 0.35, 0.35, 1.0), + "WBL_b1_Cylinder.020": (0.35, 0.35, 0.35, 1.0), + "WBL_b1.004_Cylinder.035_1": (0.35, 0.35, 0.35, 1.0), + "bamper_l_Cube.001": (1.0, 0.7, 0.2, 0.8), # turning light + "bamper_d_Cube.005": (0.7, 0.7, 0.7, 1.0), # wheel arch + "body_Cube": (1.0, 0.2, 0.2, 1.0), # tail light + "body_Cube_1": (1.0, 0.75, 0.65, 1.0), # front light + "body_Cube_2": (0.3, 0.3, 0.3, 0.3), # glass + "bamper_l_Cube.001_1": (0.85, 0.85, 0.87, 1.0), # body + # add any others here... +} +DEFAULT_COLOR = (0.6, 0.6, 0.6, 1.0) + +# Names of the four wheels (for centering) +WHEEL_NAMES = [ + "WBL_b1.004_Cylinder.035", + "WBL_b1.003_Cylinder.034", + "WBL_b1.002_Cylinder.033", + "WBL_b1_Cylinder.020", +] + +def euler_to_matrix(roll, pitch, yaw): + """Build rotation matrix from roll, pitch, yaw (degrees).""" + r, p, y = np.deg2rad([roll, pitch, yaw]) + Rx = np.array([[1,0,0],[0,np.cos(r),-np.sin(r)],[0,np.sin(r),np.cos(r)]],dtype=np.float32) + Ry = np.array([[np.cos(p),0,np.sin(p)],[0,1,0],[-np.sin(p),0,np.cos(p)]],dtype=np.float32) + Rz = np.array([[np.cos(y),-np.sin(y),0],[np.sin(y),np.cos(y),0],[0,0,1]],dtype=np.float32) + return Rz @ Ry @ Rx # apply roll, then pitch, then yaw + + diff --git a/f1tenth_gym/envs/rendering/renderer.py b/f1tenth_gym/envs/rendering/renderer.py index 7ac101f9..47520483 100644 --- a/f1tenth_gym/envs/rendering/renderer.py +++ b/f1tenth_gym/envs/rendering/renderer.py @@ -142,7 +142,7 @@ def __init__(self): Initialize the point renderer. This should set up the necessary parameters for rendering points. """ - raise NotImplementedError() + pass @abstractmethod def update(self): diff --git a/f1tenth_gym/envs/rendering/rendering.yaml b/f1tenth_gym/envs/rendering/rendering.yaml index a5d4ed6d..361d1e7c 100644 --- a/f1tenth_gym/envs/rendering/rendering.yaml +++ b/f1tenth_gym/envs/rendering/rendering.yaml @@ -7,6 +7,7 @@ show_wheels: True # [bool] it toggles the visualization of the vehicle wheel car_tickness: 1 # [px] thickness of the car show_info: True # [bool] it toggles the visualization of the instruction text render_type: "pyqt6gl" # [str] rendering type. Options: "pyqt6gl", "pyqt6" NOTE: pygame not supported until reimplemented +car_model: "3d" # [str] car model to use. Options: "2d", "3d" vehicle_palette: # [list] cyclic list of colors for the vehicles - "#FD3754" - "#377eb8" diff --git a/f1tenth_gym/envs/rendering/rendering_pyqtgl.py b/f1tenth_gym/envs/rendering/rendering_pyqtgl.py index 0ac19655..1e276cff 100644 --- a/f1tenth_gym/envs/rendering/rendering_pyqtgl.py +++ b/f1tenth_gym/envs/rendering/rendering_pyqtgl.py @@ -1,12 +1,14 @@ import time, logging +import numpy as np import pyqtgraph.opengl as gl from PyQt6 import QtWidgets, QtCore, QtGui -import numpy as np +from typing import Any, Optional +from PIL import ImageColor + from ..track import Track from .renderer import EnvRenderer, RenderSpec, ObjectRenderer -from PIL import ImageColor -from typing import Any, Callable, Optional from .pyqtgl_objects import PointsRenderer, LinesRenderer, ClosedLinesRenderer, CarRenderer +from .mesh_renderer import MeshRenderer class PyQtEnvRendererGL(EnvRenderer): def __init__( @@ -43,7 +45,8 @@ def __init__( self.window.setWindowTitle("F1Tenth Gym - OpenGL") self.window.setGeometry(0, 0, self.render_spec.window_size, self.render_spec.window_size) - self._enable_pan_only() + if self.render_spec.car_model == "2d": + self._enable_pan_only() self._init_map(track) # FPS label @@ -183,8 +186,19 @@ def update(self, obs: dict) -> None: obs: simulation obs as dictionary """ if self.cars is None: - self.cars = [ - CarRenderer( + if self.render_spec.car_model == "3d": + self.cars = [MeshRenderer( + env_renderer=self, + car_length=self.params["length"], + car_width=self.params["width"], + color=self.car_colors[ic], + render_spec=self.render_spec, + map_origin=self.map_origin[:2], + resolution=self.map_resolution, + ) for ic in range(len(self.agent_ids)) + ] + elif self.render_spec.car_model == "2d": + [CarRenderer( env_renderer=self, car_length=self.params["length"], car_width=self.params["width"], @@ -192,9 +206,8 @@ def update(self, obs: dict) -> None: render_spec=self.render_spec, map_origin=self.map_origin[:2], resolution=self.map_resolution, - ) - for ic in range(len(self.agent_ids)) - ] + ) for ic in range(len(self.agent_ids)) + ] # update cars obs and zoom level (updating points-per-unit) for i, id in enumerate(self.agent_ids): @@ -210,7 +223,7 @@ def render(self): # call callbacks for callback_fn in self.callbacks: callback_fn(self) - if self.agent_to_follow is not None: + if self.agent_to_follow is not None and self.render_spec.car_model == "2d": self._center_camera_on_car(self.agent_to_follow) # draw cars for i in range(len(self.agent_ids)): @@ -220,9 +233,10 @@ def render(self): if self.render_mode in ["human", "human_fast"]: self._update_fps() - # elapsed = time.time() - start_time - # sleep_time = max(0.0, 1/self.render_fps - elapsed) - # time.sleep(sleep_time) + if self.render_fps < 1500: + elapsed = time.time() - start_time + sleep_time = max(0.0, 1/self.render_fps - elapsed) + time.sleep(sleep_time) def add_renderer_callback(self, callback_fn): """ diff --git a/f1tenth_gym/envs/track/cubic_spline.py b/f1tenth_gym/envs/track/cubic_spline.py index dccaf59f..59e94c74 100644 --- a/f1tenth_gym/envs/track/cubic_spline.py +++ b/f1tenth_gym/envs/track/cubic_spline.py @@ -47,6 +47,7 @@ def __init__(self, x, y, else: self.points[-1] = self.points[0] self.s = ss if ss is not None else self.__calc_s(self.points[:, 0], self.points[:, 1]) + self.ss, self.psis, self.ks = self.s, psis, ks self.s_interval = (self.s[-1] - self.s[0]) / len(self.s) self.s_frame_max = self.s[-1] From ebc5b0c87dd9a34cbe8b6fe89e8a191b1e63fd13 Mon Sep 17 00:00:00 2001 From: zzangupenn Date: Wed, 18 Jun 2025 02:47:06 -0400 Subject: [PATCH 22/54] bug fix and optimize --- examples/waypoint_follow.py | 10 +++++----- f1tenth_gym/envs/f110_env.py | 6 +++++- f1tenth_gym/envs/rendering/__init__.py | 2 +- f1tenth_gym/envs/rendering/mesh_renderer.py | 1 - f1tenth_gym/envs/rendering/pyqtgl_objects.py | 19 +++++++++++++------ f1tenth_gym/envs/rendering/rendering.yaml | 2 +- f1tenth_gym/envs/rendering/rendering_pyqt.py | 8 ++++---- .../envs/rendering/rendering_pyqtgl.py | 8 ++++---- 8 files changed, 33 insertions(+), 23 deletions(-) diff --git a/examples/waypoint_follow.py b/examples/waypoint_follow.py index 9402769a..08353e34 100644 --- a/examples/waypoint_follow.py +++ b/examples/waypoint_follow.py @@ -208,7 +208,7 @@ def render_lookahead_point(self, e): points = self.lookahead_point[:2][None] # shape (1, 2)~ if self.lookahead_point_render is None: self.lookahead_point_render = e.get_points_renderer( - points, color=(200, 0, 0), size=5 + points, color=(200, 0, 0), size=10 ) else: self.lookahead_point_render.update(points) @@ -221,7 +221,7 @@ def render_local_plan(self, e): points = self.waypoints[self.current_index : self.current_index + 10, :2] if self.local_plan_render is None: self.local_plan_render = e.get_lines_renderer( - points, color=(0, 128, 0), size=1 + points, color=(0, 128, 0), size=5 ) else: self.local_plan_render.update(points) @@ -325,12 +325,12 @@ def main(): "reset_config": {"type": "rl_random_static"}, "map_scale": 1.0, "enable_rendering": 1, - "enable_scan": 1, + "enable_scan": 0, "lidar_num_beams": 270, - "compute_frenet": 1, + "compute_frenet": 0, "max_laps": 2, # 'inf' for infinite laps, or a positive integer }, - render_mode="human_fast", + render_mode="unlimited", ) track = env.unwrapped.track diff --git a/f1tenth_gym/envs/f110_env.py b/f1tenth_gym/envs/f110_env.py index b8f55ca4..2d39965f 100644 --- a/f1tenth_gym/envs/f110_env.py +++ b/f1tenth_gym/envs/f110_env.py @@ -80,7 +80,7 @@ class F110Env(gym.Env): """ # NOTE: change matadata with default rendering-modes, add definition of render_fps - metadata = {"render_modes": ["human", "human_fast", "rgb_array"], "render_fps": 100} + metadata = {"render_modes": ["human", "human_fast", "rgb_array", "unlimited"], "render_fps": 100} def __init__(self, config: dict = None, render_mode=None, **kwargs): super().__init__() @@ -88,6 +88,8 @@ def __init__(self, config: dict = None, render_mode=None, **kwargs): # Configuration self.config = self.default_config() self.configure(config) + if self.config['loop_counting_method'] == "frenet_based": + self.config["compute_frenet"] = True # NOTE always compute frenet pose for lap counting self.seed = self.config["seed"] self.map = self.config["map"] @@ -170,6 +172,8 @@ def __init__(self, config: dict = None, render_mode=None, **kwargs): self.metadata["render_fps"] = int(1.0 / self.timestep) if self.render_mode == "human_fast": self.metadata["render_fps"] *= 10 # boost fps by 10x + elif self.render_mode == "unlimited": + self.metadata["render_fps"] = float('inf') if self.config["enable_rendering"]: self.renderer, self.render_spec = make_renderer( params=self.params, diff --git a/f1tenth_gym/envs/rendering/__init__.py b/f1tenth_gym/envs/rendering/__init__.py index dee8db9c..c1b95d63 100644 --- a/f1tenth_gym/envs/rendering/__init__.py +++ b/f1tenth_gym/envs/rendering/__init__.py @@ -47,7 +47,7 @@ def make_renderer( else: raise ValueError(f"Unknown render type: {render_spec.render_type}") - if render_mode in ["human", "rgb_array", "human_fast"]: + if render_mode in ["human", "rgb_array", 'unlimited', "human_fast"]: renderer = EnvRenderer( params=params, track=track, diff --git a/f1tenth_gym/envs/rendering/mesh_renderer.py b/f1tenth_gym/envs/rendering/mesh_renderer.py index 76bb8320..7c93d1ad 100644 --- a/f1tenth_gym/envs/rendering/mesh_renderer.py +++ b/f1tenth_gym/envs/rendering/mesh_renderer.py @@ -120,7 +120,6 @@ def render(self, scale=1.0): item.rotate(self.car_pose["roll"]+90, 1, 0, 0) item.rotate(self.car_pose["yaw"], 0, 0, 1) item.rotate(self.car_pose["pitch"], 0, 1, 0) - item.translate(tx, ty, self.z_lift) diff --git a/f1tenth_gym/envs/rendering/pyqtgl_objects.py b/f1tenth_gym/envs/rendering/pyqtgl_objects.py index 8c1eb9ee..ba4af501 100644 --- a/f1tenth_gym/envs/rendering/pyqtgl_objects.py +++ b/f1tenth_gym/envs/rendering/pyqtgl_objects.py @@ -28,6 +28,7 @@ def __init__( self.show_wheels = render_spec.show_wheels self.rgba = [c / 255 for c in color] + [1.0] self.rgba = np.array([self.rgba] * 2) + self.scale = 1.0 # Define centered rectangle in local coords hl = self.car_length / 2 # half-length @@ -86,12 +87,18 @@ def update(self, obs: dict[str, np.ndarray], id: str): def render(self, scale=1.0): # pass - transformed = self.apply_pose(self.pose, scale) - self.mesh.setMeshData(vertexes=transformed, - faces=self.faces, - faceColors=self.rgba, - smooth=False, - drawEdges=False,) + if scale != 1.0: + transformed = self.apply_pose(self.pose, scale) + self.mesh.resetTransform() + self.mesh.setMeshData(vertexes=transformed, + faces=self.faces, + faceColors=self.rgba, + smooth=False, + drawEdges=False,) + else: + self.mesh.resetTransform() + self.mesh.rotate(self.pose[2] / np.pi * 180, 0, 0, 1) + self.mesh.translate(self.pose[0], self.pose[1], 0.01) class LinesRenderer(ObjectRenderer): def __init__( diff --git a/f1tenth_gym/envs/rendering/rendering.yaml b/f1tenth_gym/envs/rendering/rendering.yaml index 361d1e7c..3d26c984 100644 --- a/f1tenth_gym/envs/rendering/rendering.yaml +++ b/f1tenth_gym/envs/rendering/rendering.yaml @@ -7,7 +7,7 @@ show_wheels: True # [bool] it toggles the visualization of the vehicle wheel car_tickness: 1 # [px] thickness of the car show_info: True # [bool] it toggles the visualization of the instruction text render_type: "pyqt6gl" # [str] rendering type. Options: "pyqt6gl", "pyqt6" NOTE: pygame not supported until reimplemented -car_model: "3d" # [str] car model to use. Options: "2d", "3d" +car_model: "2d" # [str] car model to use. Options: "2d", "3d" vehicle_palette: # [list] cyclic list of colors for the vehicles - "#FD3754" - "#377eb8" diff --git a/f1tenth_gym/envs/rendering/rendering_pyqt.py b/f1tenth_gym/envs/rendering/rendering_pyqt.py index 14b08904..27bd5535 100644 --- a/f1tenth_gym/envs/rendering/rendering_pyqt.py +++ b/f1tenth_gym/envs/rendering/rendering_pyqt.py @@ -73,7 +73,7 @@ def __init__( render_spec : RenderSpec rendering specification render_mode : str - rendering mode in ["human", "human_fast", "rgb_array"] + rendering mode in ["human", "human_fast", 'unlimited', "rgb_array"] render_fps : int number of frames per second """ @@ -128,7 +128,7 @@ def __init__( ) self.top_info_renderer = TextRenderer(parent=self.canvas, position="top_center") - if self.render_mode in ["human", "human_fast"]: + if self.render_mode in ["human", "human_fast", 'unlimited']: self.clock.sigFpsUpdate.connect( lambda fps: self.fps_renderer.render(f"FPS: {fps:.1f}") ) @@ -181,7 +181,7 @@ def __init__( self.follow_agent_flag: bool = False self.agent_to_follow: int = None - if self.render_mode in ["human", "human_fast"]: + if self.render_mode in ["human", "human_fast", 'unlimited']: signal.signal(signal.SIGINT, signal.SIG_DFL) self.window.show() elif self.render_mode == "rgb_array": @@ -321,7 +321,7 @@ def render(self) -> Optional[np.ndarray]: self.clock.update() self.app.processEvents() - if self.render_mode in ["human", "human_fast"]: + if self.render_mode in ["human", "human_fast", 'unlimited']: assert self.window is not None else: diff --git a/f1tenth_gym/envs/rendering/rendering_pyqtgl.py b/f1tenth_gym/envs/rendering/rendering_pyqtgl.py index 1e276cff..7b49fa72 100644 --- a/f1tenth_gym/envs/rendering/rendering_pyqtgl.py +++ b/f1tenth_gym/envs/rendering/rendering_pyqtgl.py @@ -50,7 +50,7 @@ def __init__( self._init_map(track) # FPS label - if self.render_mode in ["human", "human_fast"]: + if self.render_mode in ["human", "human_fast", 'unlimited']: text_rgb = (140, 140, 140) self.fps_label = QtWidgets.QLabel(self.window) font = QtGui.QFont("Arial", 14) @@ -198,7 +198,7 @@ def update(self, obs: dict) -> None: ) for ic in range(len(self.agent_ids)) ] elif self.render_spec.car_model == "2d": - [CarRenderer( + self.cars = [CarRenderer( env_renderer=self, car_length=self.params["length"], car_width=self.params["width"], @@ -231,9 +231,9 @@ def render(self): self.app.processEvents() - if self.render_mode in ["human", "human_fast"]: + if self.render_mode in ["human", "human_fast", 'unlimited']: self._update_fps() - if self.render_fps < 1500: + if self.render_fps < float('inf'): elapsed = time.time() - start_time sleep_time = max(0.0, 1/self.render_fps - elapsed) time.sleep(sleep_time) From a1415f90e55af59211995f378bfc60ee0e544b20 Mon Sep 17 00:00:00 2001 From: zzangupenn Date: Wed, 18 Jun 2025 03:12:33 -0400 Subject: [PATCH 23/54] restore observations, bug fix --- README.md | 1 + f1tenth_gym/envs/f110_env.py | 23 +-- f1tenth_gym/envs/observation.py | 134 +++++++++++++++++- f1tenth_gym/envs/rendering/pyqtgl_objects.py | 3 +- .../envs/rendering/rendering_pyqtgl.py | 5 +- 5 files changed, 154 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 06e13087..ac9f7396 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,7 @@ Zirui branch TODO list: - [ ] double check dynamics result - [x] implemented new rendering with pyqtgraph.opengl - [x] added 3d mesh renderering for proof of concept +- [ ] merge lidar scan fix ## Quickstart We recommend installing the simulation inside a virtualenv. You can install the environment by running: diff --git a/f1tenth_gym/envs/f110_env.py b/f1tenth_gym/envs/f110_env.py index 2d39965f..727532e7 100644 --- a/f1tenth_gym/envs/f110_env.py +++ b/f1tenth_gym/envs/f110_env.py @@ -152,6 +152,8 @@ def __init__(self, config: dict = None, render_mode=None, **kwargs): ), "observation_config must contain 'type' key" self.observation_type = observation_factory(env=self, **self.observation_config) self.observation_space = self.observation_type.space() + self.render_obs_type = observation_factory(env=self, type='direct') + self.render_obs = None # action space self.action_space = from_single_to_multi_action_space( @@ -165,7 +167,6 @@ def __init__(self, config: dict = None, render_mode=None, **kwargs): # stateful observations for rendering # add choice of colors (same, random, ...) - self.obs = None self.render_mode = render_mode # match render_fps to integration timestep @@ -434,17 +435,17 @@ def _check_done(self): if self.config['loop_counting_method'] == "frenet_based": for ind, agent_id in enumerate(self.agent_ids): if self.agents_prev_s[ind] is None: - self.agents_prev_s[ind] = self.obs[agent_id]['frenet_pose'][0] + self.agents_prev_s[ind] = self.render_obs[agent_id]['frenet_pose'][0] else: - agent_curr_s = self.obs[agent_id]['frenet_pose'][0] + agent_curr_s = self.render_obs[agent_id]['frenet_pose'][0] if self.agents_prev_s[ind] - agent_curr_s > self.sim.track.centerline.spline.s_frame_max * 0.85 \ and self.sim_time > self.timestep: self.lap_counts[ind] += 1 self.lap_times[ind] = self.sim_time - self.lap_times_finish[ind] self.lap_times_finish[ind] = self.sim_time self.agents_prev_s[ind] = agent_curr_s - self.obs[agent_id]['lap_time'] = self.lap_times[ind] - self.obs[agent_id]['lap_count'] = [ind] + self.render_obs[agent_id]['lap_time'] = self.lap_times[ind] + self.render_obs[agent_id]['lap_count'] = [ind] done = (self.collisions[self.ego_idx]) or self.lap_counts >= float(self.config["max_laps"]) return bool(done) @@ -476,7 +477,13 @@ def step(self, action): self.sim.step(action) # observation - self.obs = self.observation_type.observe() + obs = self.observation_type.observe() + if self.observation_config["type"] == "direct": + # for direct observation, also update the render_obs + self.render_obs = obs + else: + # for other observation types, update the render_obs + self.render_obs = self.render_obs_type.observe() # times reward = self.timestep @@ -492,7 +499,7 @@ def step(self, action): "lap_counts": self.lap_counts, "sim_time": self.sim_time} - return self.obs, reward, done, truncated, info + return obs, reward, done, truncated, info def reset(self, seed=None, options=None): """ @@ -624,7 +631,7 @@ def render(self, mode="human"): if self.render_mode not in self.metadata["render_modes"] or not self.config["enable_rendering"]: return - self.renderer.update(obs=self.obs) + self.renderer.update(obs=self.render_obs) return self.renderer.render() def close(self): diff --git a/f1tenth_gym/envs/observation.py b/f1tenth_gym/envs/observation.py index c43ef64d..b7e99c95 100644 --- a/f1tenth_gym/envs/observation.py +++ b/f1tenth_gym/envs/observation.py @@ -228,13 +228,145 @@ def observe(self): return observations +class FeaturesObservation(Observation): + def __init__(self, env, features: List[str]): + super().__init__(env) + self.features = features + + def space(self): + scan_size = self.env.unwrapped.sim.agents[0].scan_simulator.num_beams + scan_range = self.env.unwrapped.sim.agents[0].scan_simulator.max_range + large_num = 1e30 # large number to avoid unbounded obs space (ie., low=-inf or high=inf) + + complete_space = {} + for agent_id in self.env.unwrapped.agent_ids: + agent_dict = { + "scan": gym.spaces.Box( + low=0.0, high=scan_range, shape=(scan_size,), dtype=np.float32 + ), + "pose_x": gym.spaces.Box( + low=-large_num, high=large_num, shape=(), dtype=np.float32 + ), + "pose_y": gym.spaces.Box( + low=-large_num, high=large_num, shape=(), dtype=np.float32 + ), + "pose_theta": gym.spaces.Box( + low=-large_num, high=large_num, shape=(), dtype=np.float32 + ), + "linear_vel_x": gym.spaces.Box( + low=-large_num, high=large_num, shape=(), dtype=np.float32 + ), + "linear_vel_y": gym.spaces.Box( + low=-large_num, high=large_num, shape=(), dtype=np.float32 + ), + "ang_vel_z": gym.spaces.Box( + low=-large_num, high=large_num, shape=(), dtype=np.float32 + ), + "delta": gym.spaces.Box( + low=-large_num, high=large_num, shape=(), dtype=np.float32 + ), + "beta": gym.spaces.Box( + low=-large_num, high=large_num, shape=(), dtype=np.float32 + ), + "collision": gym.spaces.Box( + low=0.0, high=1.0, shape=(), dtype=np.float32 + ), + "lap_time": gym.spaces.Box( + low=0.0, high=large_num, shape=(), dtype=np.float32 + ), + "lap_count": gym.spaces.Box( + low=0.0, high=large_num, shape=(), dtype=np.float32 + ), + } + complete_space[agent_id] = gym.spaces.Dict( + {k: agent_dict[k] for k in self.features} + ) + + obs_space = gym.spaces.Dict(complete_space) + return obs_space + + def observe(self): + obs = {} # dictionary agent_id -> observation dict + + for i, agent_id in enumerate(self.env.unwrapped.agent_ids): + scan = self.env.unwrapped.sim.agent_scans[i] + agent = self.env.unwrapped.sim.agents[i] + lap_time = self.env.unwrapped.lap_times[i] + lap_count = self.env.unwrapped.lap_counts[i] + + std_state = agent.standard_state + + x, y, theta = std_state["x"], std_state["y"], std_state["yaw"] + delta = std_state["delta"] + beta = std_state["slip"] + vx = std_state["v_x"] + vy = std_state["v_y"] + angvel = std_state["yaw_rate"] + + # create agent's observation dict + agent_obs = { + "scan": scan, + "pose_x": x, + "pose_y": y, + "pose_theta": theta, + "linear_vel_x": vx, + "linear_vel_y": vy, + "ang_vel_z": angvel, + "delta": delta, + "beta": beta, + "collision": int(agent.in_collision), + "lap_time": lap_time, + "lap_count": lap_count, + } + + # add agent's observation to multi-agent observation + obs[agent_id] = {k: agent_obs[k] for k in self.features} + + # cast to match observation space + for key in obs[agent_id].keys(): + if isinstance(obs[agent_id][key], np.ndarray) or isinstance( + obs[agent_id][key], list) or isinstance( + obs[agent_id][key], float + ): + obs[agent_id][key] = np.array(obs[agent_id][key], dtype=np.float32) + + return obs + -def observation_factory(env, type: str | None) -> Observation: +def observation_factory(env, type: str | None, **kwargs) -> Observation: type = type or "original" if type == "original": return OriginalObservation(env) elif type == "direct": return DirectObservation(env) + elif type == "features": + return FeaturesObservation(env, **kwargs) + elif type == "kinematic_state": + features = ["pose_x", "pose_y", "delta", "linear_vel_x", "pose_theta"] + return FeaturesObservation(env, features=features) + elif type == "dynamic_state": + features = [ + "pose_x", + "pose_y", + "delta", + "linear_vel_x", + "pose_theta", + "ang_vel_z", + "beta", + ] + return FeaturesObservation(env, features=features) + elif type == "frenet_dynamic_state": + features = [ + "pose_x", + "pose_y", + "delta", + "linear_vel_x", + "linear_vel_y", + "pose_theta", + "ang_vel_z", + "beta", + ] + return FeaturesObservation(env, features=features) else: raise ValueError(f"Invalid observation type {type}.") diff --git a/f1tenth_gym/envs/rendering/pyqtgl_objects.py b/f1tenth_gym/envs/rendering/pyqtgl_objects.py index ba4af501..c3db0620 100644 --- a/f1tenth_gym/envs/rendering/pyqtgl_objects.py +++ b/f1tenth_gym/envs/rendering/pyqtgl_objects.py @@ -87,7 +87,7 @@ def update(self, obs: dict[str, np.ndarray], id: str): def render(self, scale=1.0): # pass - if scale != 1.0: + if scale != 1.0 or self.scale != scale: transformed = self.apply_pose(self.pose, scale) self.mesh.resetTransform() self.mesh.setMeshData(vertexes=transformed, @@ -95,6 +95,7 @@ def render(self, scale=1.0): faceColors=self.rgba, smooth=False, drawEdges=False,) + self.scale = scale else: self.mesh.resetTransform() self.mesh.rotate(self.pose[2] / np.pi * 180, 0, 0, 1) diff --git a/f1tenth_gym/envs/rendering/rendering_pyqtgl.py b/f1tenth_gym/envs/rendering/rendering_pyqtgl.py index 7b49fa72..594350c8 100644 --- a/f1tenth_gym/envs/rendering/rendering_pyqtgl.py +++ b/f1tenth_gym/envs/rendering/rendering_pyqtgl.py @@ -32,13 +32,14 @@ def __init__( else: self.agent_to_follow = None self.car_scale = 1.0 + self.default_camera_dist = self.params['width'] * 70 fmt = QtGui.QSurfaceFormat() fmt.setSwapInterval(0) # 0 = no vsync, 1 = vsync QtGui.QSurfaceFormat.setDefaultFormat(fmt) self.app = QtWidgets.QApplication.instance() or QtWidgets.QApplication([]) self.view = gl.GLViewWidget() - self.view.setCameraPosition(pos=QtGui.QVector3D(0, 0, 0), distance=20, elevation=90, azimuth=0) + self.view.setCameraPosition(pos=QtGui.QVector3D(0, 0, 0), distance=self.default_camera_dist, elevation=90, azimuth=0) self.view.setBackgroundColor((25, 25, 25)) self.window = QtWidgets.QMainWindow() self.window.setCentralWidget(self.view) @@ -128,7 +129,7 @@ def _center_camera_on_car(self, car_idx=0, distance_reset=False): self.car_scale = 1.0 if distance_reset: self.view.setCameraPosition( - distance=self.params['width'] * 50, # zoom level + distance=self.default_camera_dist, # zoom level ) self.view.setCameraPosition( pos=QtGui.QVector3D(x, y, 1), # camera position From 144637ddd69d90053867b2fefdf5715cbe452d7d Mon Sep 17 00:00:00 2001 From: zzangupenn Date: Fri, 20 Jun 2025 03:16:29 -0400 Subject: [PATCH 24/54] add lap count, bug fix --- examples/waypoint_follow.py | 9 ++++--- f1tenth_gym/envs/f110_env.py | 27 +++++++++---------- f1tenth_gym/envs/observation.py | 3 +-- f1tenth_gym/envs/rendering/pyqtgl_objects.py | 10 ++++--- .../envs/rendering/rendering_pyqtgl.py | 17 ++++++++++++ 5 files changed, 42 insertions(+), 24 deletions(-) diff --git a/examples/waypoint_follow.py b/examples/waypoint_follow.py index 08353e34..78c0c7e8 100644 --- a/examples/waypoint_follow.py +++ b/examples/waypoint_follow.py @@ -308,7 +308,7 @@ def main(): "vgain": 0.5, } - num_agents = 1 + num_agents = 2 env = gym.make( "f1tenth_gym:f1tenth-v0", config={ @@ -348,7 +348,10 @@ def main(): for r in planner.get_render_callbacks(): env.unwrapped.add_render_callback(r) - obs, info = env.reset() + frenet_start = np.array(env.unwrapped.track.frenet_to_cartesian(0, 0, 0)) + frenet_start2 = np.array(env.unwrapped.track.frenet_to_cartesian(10, 0, 0)) + init_poses = np.array([frenet_start, frenet_start2]) + obs, info = env.reset(options={'poses':init_poses}) done = False env.render() @@ -367,7 +370,6 @@ def main(): work["vgain"], ) action[i] = np.array([steer, speed]) - # print("frenet_pose", obs[agent_id]["frenet_pose"]) t1 = time.time() obs, step_reward, done, truncated, info = env.step(action) @@ -381,7 +383,6 @@ def main(): print("Sim elapsed time:", laptime, "Real elapsed time:", time.time() - start) - if __name__ == "__main__": main() # %% diff --git a/f1tenth_gym/envs/f110_env.py b/f1tenth_gym/envs/f110_env.py index 727532e7..c73bd5a3 100644 --- a/f1tenth_gym/envs/f110_env.py +++ b/f1tenth_gym/envs/f110_env.py @@ -433,22 +433,20 @@ def _check_done(self): Check if the current rollout is done """ if self.config['loop_counting_method'] == "frenet_based": + # print(self.agents_prev_s) for ind, agent_id in enumerate(self.agent_ids): if self.agents_prev_s[ind] is None: - self.agents_prev_s[ind] = self.render_obs[agent_id]['frenet_pose'][0] + self.agents_prev_s[ind] = self.sim.agents[ind].frenet_pose[0] else: - agent_curr_s = self.render_obs[agent_id]['frenet_pose'][0] + agent_curr_s = self.sim.agents[ind].frenet_pose[0] if self.agents_prev_s[ind] - agent_curr_s > self.sim.track.centerline.spline.s_frame_max * 0.85 \ and self.sim_time > self.timestep: self.lap_counts[ind] += 1 self.lap_times[ind] = self.sim_time - self.lap_times_finish[ind] self.lap_times_finish[ind] = self.sim_time self.agents_prev_s[ind] = agent_curr_s - self.render_obs[agent_id]['lap_time'] = self.lap_times[ind] - self.render_obs[agent_id]['lap_count'] = [ind] - - done = (self.collisions[self.ego_idx]) or self.lap_counts >= float(self.config["max_laps"]) - return bool(done) + done = (self.collisions[self.ego_idx]) or self.lap_counts[self.ego_idx] >= float(self.config["max_laps"]) + return bool(np.any(done)) def _update_state(self): """ @@ -475,6 +473,12 @@ def step(self, action): # call simulation step self.sim.step(action) + + # update data member + self._update_state() + + # check done + done = self._check_done() # observation obs = self.observation_type.observe() @@ -489,11 +493,6 @@ def step(self, action): reward = self.timestep self.sim_time = self.sim_time + self.timestep - # update data member - self._update_state() - - # check done - done = self._check_done() truncated = False info = {"lap_times": self.lap_times, "lap_counts": self.lap_counts, @@ -531,8 +530,8 @@ def reset(self, seed=None, options=None): if options is not None and "poses" in options: poses = options["poses"] option = "pose" - elif options is not None and "state" in options: - poses = options["state"] + elif options is not None and "states" in options: + poses = options["states"] option = "state" else: poses = self.reset_fn.sample() diff --git a/f1tenth_gym/envs/observation.py b/f1tenth_gym/envs/observation.py index b7e99c95..837c7491 100644 --- a/f1tenth_gym/envs/observation.py +++ b/f1tenth_gym/envs/observation.py @@ -90,8 +90,7 @@ def observe(self): "sim_time": self.env.unwrapped.sim_time, } if self.env.unwrapped.config["compute_frenet"]: - agent_obs["frenet_pose"] = agent.frenet_pose if hasattr(agent, 'frenet_pose') else np.zeros(3, dtype=np.float32) - + agent_obs["frenet_pose"] = agent.frenet_pose if hasattr(agent, 'frenet_pose') else np.zeros(3) # add agent's observation to multi-agent observation obs[agent_id] = agent_obs diff --git a/f1tenth_gym/envs/rendering/pyqtgl_objects.py b/f1tenth_gym/envs/rendering/pyqtgl_objects.py index c3db0620..73c928dd 100644 --- a/f1tenth_gym/envs/rendering/pyqtgl_objects.py +++ b/f1tenth_gym/envs/rendering/pyqtgl_objects.py @@ -1,5 +1,6 @@ from __future__ import annotations import numpy as np +import time import pyqtgraph.opengl as gl from .renderer import RenderSpec, EnvRenderer, ObjectRenderer @@ -86,15 +87,16 @@ def update(self, obs: dict[str, np.ndarray], id: str): self.steering = state[2] def render(self, scale=1.0): - # pass - if scale != 1.0 or self.scale != scale: - transformed = self.apply_pose(self.pose, scale) + if self.scale != scale: + # transformed = self.apply_pose(self.pose, 1.0) self.mesh.resetTransform() - self.mesh.setMeshData(vertexes=transformed, + self.mesh.setMeshData(vertexes=self.base_rect * scale, faces=self.faces, faceColors=self.rgba, smooth=False, drawEdges=False,) + self.mesh.rotate(self.pose[2] / np.pi * 180, 0, 0, 1) + self.mesh.translate(self.pose[0], self.pose[1], 0.01) self.scale = scale else: self.mesh.resetTransform() diff --git a/f1tenth_gym/envs/rendering/rendering_pyqtgl.py b/f1tenth_gym/envs/rendering/rendering_pyqtgl.py index 594350c8..9e965ba4 100644 --- a/f1tenth_gym/envs/rendering/rendering_pyqtgl.py +++ b/f1tenth_gym/envs/rendering/rendering_pyqtgl.py @@ -33,6 +33,7 @@ def __init__( self.agent_to_follow = None self.car_scale = 1.0 self.default_camera_dist = self.params['width'] * 70 + self.obs = None fmt = QtGui.QSurfaceFormat() fmt.setSwapInterval(0) # 0 = no vsync, 1 = vsync @@ -63,6 +64,17 @@ def __init__( self.fps_label.resize(100, 20) self.fps_label.setAttribute(QtCore.Qt.WidgetAttribute.WA_TransparentForMouseEvents) self.fps_label.show() + + self.lap_label = QtWidgets.QLabel(self.window) + font = QtGui.QFont("Arial", 14) + self.lap_label.setFont(font) + self.lap_label.setStyleSheet( + f"color: rgb({text_rgb[0]}, {text_rgb[1]}, {text_rgb[2]}); background-color: transparent; padding: 2px;" + ) + self.lap_label.move(int(self.render_spec.window_size) - 220, 10) + self.lap_label.resize(220, 30) + self.lap_label.setAttribute(QtCore.Qt.WidgetAttribute.WA_TransparentForMouseEvents) + self.lap_label.show() # Frame timer self.last_time = time.time() @@ -216,9 +228,14 @@ def update(self, obs: dict) -> None: # update time self.sim_time = obs[self.agent_ids[0]]["sim_time"] + self.obs = obs + def render(self): if self.draw_flag: + if self.obs is not None: + self.lap_label.setText(f"Lap Time {self.obs[self.agent_ids[0]]['lap_time']:.2f}, " + + f"Lap {int(self.obs[self.agent_ids[0]]['lap_count']):d}") start_time = time.time() # call callbacks From 40bff0c19a0bca4dddc940b8d19211a89d26e50b Mon Sep 17 00:00:00 2001 From: zzangupenn Date: Tue, 24 Jun 2025 01:31:04 -0400 Subject: [PATCH 25/54] allow pass in map path --- examples/waypoint_follow.py | 26 ++++++++++++-------------- f1tenth_gym/envs/f110_env.py | 19 ++++++++----------- f1tenth_gym/envs/track/track.py | 24 ++++++++++++++++-------- 3 files changed, 36 insertions(+), 33 deletions(-) diff --git a/examples/waypoint_follow.py b/examples/waypoint_follow.py index 78c0c7e8..709f6b0f 100644 --- a/examples/waypoint_follow.py +++ b/examples/waypoint_follow.py @@ -304,11 +304,11 @@ def main(): work = { "mass": 3.463388126201571, "lf": 0.15597534362552312, - "tlad": 0.82461887897713965, - "vgain": 0.5, + "tlad": 0.82461887897713965 * 2, + "vgain": 1., } - num_agents = 2 + num_agents = 1 env = gym.make( "f1tenth_gym:f1tenth-v0", config={ @@ -330,7 +330,7 @@ def main(): "compute_frenet": 0, "max_laps": 2, # 'inf' for infinite laps, or a positive integer }, - render_mode="unlimited", + render_mode="unlimited", # "human", "human_fast", "unlimited" ) track = env.unwrapped.track @@ -348,17 +348,16 @@ def main(): for r in planner.get_render_callbacks(): env.unwrapped.add_render_callback(r) - frenet_start = np.array(env.unwrapped.track.frenet_to_cartesian(0, 0, 0)) + frenet_start = np.array(env.unwrapped.track.frenet_to_cartesian(0.0, 0, 0)) frenet_start2 = np.array(env.unwrapped.track.frenet_to_cartesian(10, 0, 0)) init_poses = np.array([frenet_start, frenet_start2]) - obs, info = env.reset(options={'poses':init_poses}) + obs, info = env.reset(options={'poses':init_poses[:num_agents]}) done = False env.render() laptime = 0.0 start = time.time() times = [] - while not done: action = env.action_space.sample() for i, agent_id in enumerate(obs.keys()): @@ -374,7 +373,6 @@ def main(): obs, step_reward, done, truncated, info = env.step(action) times.append(1/(time.time() - t1)) - # print(info) if len(times) > 2000: print("FPS:", np.mean(times)) times = [] @@ -386,9 +384,9 @@ def main(): if __name__ == "__main__": main() # %% -work = { - "mass": 3.463388126201571, - "lf": 0.15597534362552312, - "tlad": 0.82461887897713965 * 10, - "vgain": 1, -} +# work = { +# "mass": 3.463388126201571, +# "lf": 0.15597534362552312, +# "tlad": 0.82461887897713965 * 10, +# "vgain": 1, +# } diff --git a/f1tenth_gym/envs/f110_env.py b/f1tenth_gym/envs/f110_env.py index c73bd5a3..27cf92ab 100644 --- a/f1tenth_gym/envs/f110_env.py +++ b/f1tenth_gym/envs/f110_env.py @@ -23,16 +23,10 @@ """ Author: Hongrui Zheng, Zirui Zang """ - -# gym imports import gymnasium as gym - -# others import numpy as np from .action import CarAction, from_single_to_multi_action_space - -# base classes from .base_classes import DynamicModel, Simulator from .integrator import IntegratorType from .observation import observation_factory @@ -122,8 +116,11 @@ def __init__(self, config: dict = None, render_mode=None, **kwargs): self.lap_counts = np.zeros((self.num_agents, )) self.sim_time = 0.0 - if isinstance(self.map, Track): - self.track = self.map + if '/' in self.map or '\\' in self.map: + self.track = Track.from_track_path( + self.map, + track_scale=self.config["map_scale"], + ) else: self.track = Track.from_track_name( self.map, @@ -202,14 +199,14 @@ def default_config(cls) -> dict: "map": "Spielberg", "map_scale": 1.0, "params": cls.f1tenth_vehicle_params(), - "num_agents": 2, + "num_agents": 1, "timestep": 0.01, "integrator_timestep": 0.01, "ego_idx": 0, "max_laps": 'inf', # 'inf' for infinite laps, or a positive integer "integrator": "rk4", "model": "st", # "ks", "st", "mb" - "control_input": ["speed", "steering_angle"], + "control_input": ["speed", "steering_angle"], # ["speed", "steering_angle"], ["accl", "steering_speed"] "observation_config": {"type": "direct"}, "reset_config": {"type": None}, "enable_rendering": True, @@ -220,7 +217,7 @@ def default_config(cls) -> dict: "lidar_noise_std": 0.01, "steer_delay_buffer_size": 1, "compute_frenet": True, - "collision_check_method": "bounding_box", # "lidar_scan", "bounding_box" + "collision_check_method": "lidar_scan", # "lidar_scan", "bounding_box" "loop_counting_method": "frenet_based", # "toggle", "frenet_based", "winding_angle" } diff --git a/f1tenth_gym/envs/track/track.py b/f1tenth_gym/envs/track/track.py index 699a9ffd..1cb1878e 100644 --- a/f1tenth_gym/envs/track/track.py +++ b/f1tenth_gym/envs/track/track.py @@ -133,7 +133,6 @@ def from_track_name(track: str, track_scale: float = 1.0) -> Track: image = Image.open(track_dir / str(map_filename)).transpose( Transpose.FLIP_TOP_BOTTOM ) - occupancy_map = np.array(image).astype(np.float32) occupancy_map[occupancy_map <= 128] = 0.0 occupancy_map[occupancy_map > 128] = 255.0 @@ -191,9 +190,9 @@ def from_track_path(path: pathlib.Path, track_scale: float = 1.0) -> Track: try: if type(path) is str: path = pathlib.Path(path) - + track_spec = Track.load_spec( - track=path.stem, filespec=path + track=path.stem, filespec=path.parent / f"{path.stem}_map.yaml" ) track_spec.resolution = track_spec.resolution * track_scale track_spec.origin = ( @@ -209,18 +208,27 @@ def from_track_path(path: pathlib.Path, track_scale: float = 1.0) -> Track: occupancy_map = np.array(image).astype(np.float32) occupancy_map[occupancy_map <= 128] = 0.0 occupancy_map[occupancy_map > 128] = 255.0 - + # if exists, load centerline - if (path / f"{path.stem}_centerline.csv").exists(): - centerline = Raceline.from_centerline_file(path / f"{path.stem}_centerline.csv") + if (path.parent / f"{path.stem}_centerline.csv").exists(): + centerline = Raceline.from_centerline_file(path.parent / f"{path.stem}_centerline.csv", + track_scale=track_scale,) else: centerline = None # if exists, load raceline - if (path / f"{path.stem}_raceline.csv").exists(): - raceline = Raceline.from_raceline_file(path / f"{path.stem}_raceline.csv") + if (path.parent / f"{path.stem}_raceline.csv").exists(): + raceline = Raceline.from_raceline_file(path.parent / f"{path.stem}_raceline.csv", + track_scale=track_scale,) else: raceline = centerline + + if centerline is None: + centerline = raceline + if raceline is None and centerline is None: + raise ValueError( + f"Please provide a centerline/raceline." + ) return Track( spec=track_spec, From f9b7a251708699991a0683552fc23b384585324d Mon Sep 17 00:00:00 2001 From: zzangupenn Date: Tue, 24 Jun 2025 05:20:18 -0400 Subject: [PATCH 26/54] track path change --- f1tenth_gym/envs/rendering/pyqtgl_objects.py | 6 +++--- f1tenth_gym/envs/rendering/rendering.yaml | 2 +- f1tenth_gym/envs/track/track.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/f1tenth_gym/envs/rendering/pyqtgl_objects.py b/f1tenth_gym/envs/rendering/pyqtgl_objects.py index 73c928dd..bbb379e9 100644 --- a/f1tenth_gym/envs/rendering/pyqtgl_objects.py +++ b/f1tenth_gym/envs/rendering/pyqtgl_objects.py @@ -71,7 +71,7 @@ def apply_pose(self, pose, scale=1.0): [s, c, 0], [0, 0, 1] ]) - return ((self.base_rect * scale) @ R.T) + np.array([x, y, 0.01]) + return ((self.base_rect * scale) @ R.T) + np.array([x, y, 0.02]) def update(self, obs: dict[str, np.ndarray], id: str): state = obs[id]["std_state"].astype(float) @@ -96,12 +96,12 @@ def render(self, scale=1.0): smooth=False, drawEdges=False,) self.mesh.rotate(self.pose[2] / np.pi * 180, 0, 0, 1) - self.mesh.translate(self.pose[0], self.pose[1], 0.01) + self.mesh.translate(self.pose[0], self.pose[1], 0.02) self.scale = scale else: self.mesh.resetTransform() self.mesh.rotate(self.pose[2] / np.pi * 180, 0, 0, 1) - self.mesh.translate(self.pose[0], self.pose[1], 0.01) + self.mesh.translate(self.pose[0], self.pose[1], 0.02) class LinesRenderer(ObjectRenderer): def __init__( diff --git a/f1tenth_gym/envs/rendering/rendering.yaml b/f1tenth_gym/envs/rendering/rendering.yaml index 3d26c984..007d9dbd 100644 --- a/f1tenth_gym/envs/rendering/rendering.yaml +++ b/f1tenth_gym/envs/rendering/rendering.yaml @@ -2,7 +2,7 @@ window_size: 800 # [px] width and height of the window focus_on: agent_0 # [str] agent id to focus on (e.g., agent_0) or null for map view zoom_in_factor: 0.5 # [float] zoom in factor. 1.0 is no zoom, >1.0 is zoom in, <1.0 is zoom out bigger_car_when_map_centered: True # [bool] it toggles the size of the car when centered in the map -render_map_img: True # [bool] it toggles the visualization of the map image +render_map_img: False # [bool] it toggles the visualization of the map image show_wheels: True # [bool] it toggles the visualization of the vehicle wheels car_tickness: 1 # [px] thickness of the car show_info: True # [bool] it toggles the visualization of the instruction text diff --git a/f1tenth_gym/envs/track/track.py b/f1tenth_gym/envs/track/track.py index 1cb1878e..3f73763e 100644 --- a/f1tenth_gym/envs/track/track.py +++ b/f1tenth_gym/envs/track/track.py @@ -157,7 +157,7 @@ def from_track_name(track: str, track_scale: float = 1.0) -> Track: return Track( spec=track_spec, - filepath=str((track_dir / map_filename.stem).absolute()), + filepath=str((track_dir / track).absolute()), ext=map_filename.suffix, occupancy_map=occupancy_map, centerline=centerline, From 4256025f7ba214657d6f453243eec5f67a4c65e1 Mon Sep 17 00:00:00 2001 From: zzangupenn Date: Thu, 26 Jun 2025 01:25:58 -0400 Subject: [PATCH 27/54] renderering enhancements and bug fixes --- examples/waypoint_follow.py | 4 ++-- f1tenth_gym/envs/f110_env.py | 8 +++++--- f1tenth_gym/envs/rendering/pyqtgl_objects.py | 5 ++++- f1tenth_gym/envs/rendering/rendering_pyqtgl.py | 6 +++++- f1tenth_gym/envs/track/cubic_spline.py | 13 ++++++------- f1tenth_gym/envs/track/raceline.py | 1 - 6 files changed, 22 insertions(+), 15 deletions(-) diff --git a/examples/waypoint_follow.py b/examples/waypoint_follow.py index 709f6b0f..0226dd61 100644 --- a/examples/waypoint_follow.py +++ b/examples/waypoint_follow.py @@ -328,9 +328,9 @@ def main(): "enable_scan": 0, "lidar_num_beams": 270, "compute_frenet": 0, - "max_laps": 2, # 'inf' for infinite laps, or a positive integer + "max_laps": 5, # 'inf' for infinite laps, or a positive integer }, - render_mode="unlimited", # "human", "human_fast", "unlimited" + render_mode="human_fast", # "human", "human_fast", "unlimited" ) track = env.unwrapped.track diff --git a/f1tenth_gym/envs/f110_env.py b/f1tenth_gym/envs/f110_env.py index 27cf92ab..10627ce6 100644 --- a/f1tenth_gym/envs/f110_env.py +++ b/f1tenth_gym/envs/f110_env.py @@ -23,6 +23,7 @@ """ Author: Hongrui Zheng, Zirui Zang """ +import copy import gymnasium as gym import numpy as np @@ -232,7 +233,8 @@ def fullscale_vehicle_params(cls) -> dict: "h": 0.557, "m": 1225.8878467253344, "I": 1538.8533713561394, - "width": 1.674, + # "width": 1.674, + "width": 0.1, "length": 4.298, # steering constraints "s_min": -0.91, @@ -481,10 +483,10 @@ def step(self, action): obs = self.observation_type.observe() if self.observation_config["type"] == "direct": # for direct observation, also update the render_obs - self.render_obs = obs + self.render_obs = copy.deepcopy(obs) else: # for other observation types, update the render_obs - self.render_obs = self.render_obs_type.observe() + self.render_obs = copy.deepcopy(self.render_obs_type.observe()) # times reward = self.timestep diff --git a/f1tenth_gym/envs/rendering/pyqtgl_objects.py b/f1tenth_gym/envs/rendering/pyqtgl_objects.py index bbb379e9..75245c53 100644 --- a/f1tenth_gym/envs/rendering/pyqtgl_objects.py +++ b/f1tenth_gym/envs/rendering/pyqtgl_objects.py @@ -102,7 +102,8 @@ def render(self, scale=1.0): self.mesh.resetTransform() self.mesh.rotate(self.pose[2] / np.pi * 180, 0, 0, 1) self.mesh.translate(self.pose[0], self.pose[1], 0.02) - + + class LinesRenderer(ObjectRenderer): def __init__( self, @@ -190,5 +191,7 @@ def __init__( env_renderer.view.addItem(self.scatter) def update(self, points: np.ndarray): + if points.ndim == 1: + points = points.reshape(1, -1) self.points = np.hstack([points, np.ones((points.shape[0], 1)) * 0.01]) self.scatter.setData(pos=self.points) diff --git a/f1tenth_gym/envs/rendering/rendering_pyqtgl.py b/f1tenth_gym/envs/rendering/rendering_pyqtgl.py index 9e965ba4..a9d085f4 100644 --- a/f1tenth_gym/envs/rendering/rendering_pyqtgl.py +++ b/f1tenth_gym/envs/rendering/rendering_pyqtgl.py @@ -49,6 +49,7 @@ def __init__( if self.render_spec.car_model == "2d": self._enable_pan_only() + self.focused = True self._init_map(track) # FPS label @@ -159,6 +160,7 @@ def mousePressEvent(event): self.view.pan_active = True self.view.pan_start = event.pos() event.accept() + self.focused = False if event.button() == QtCore.Qt.MouseButton.RightButton: logging.debug("Pressed right button -> Follow Next agent") if self.agent_to_follow is None: @@ -166,6 +168,7 @@ def mousePressEvent(event): else: self.agent_to_follow = (self.agent_to_follow + 1) % len(self.agent_ids) self._center_camera_on_car(self.agent_to_follow, distance_reset=True) + self.focused = True elif event.button() == QtCore.Qt.MouseButton.MiddleButton: logging.debug("Pressed middle button -> Change to Map View") self._center_camera_on_map() @@ -242,7 +245,8 @@ def render(self): for callback_fn in self.callbacks: callback_fn(self) if self.agent_to_follow is not None and self.render_spec.car_model == "2d": - self._center_camera_on_car(self.agent_to_follow) + if self.focused: + self._center_camera_on_car(self.agent_to_follow, distance_reset=True) # draw cars for i in range(len(self.agent_ids)): self.cars[i].render(self.car_scale) diff --git a/f1tenth_gym/envs/track/cubic_spline.py b/f1tenth_gym/envs/track/cubic_spline.py index 59e94c74..a9917ba9 100644 --- a/f1tenth_gym/envs/track/cubic_spline.py +++ b/f1tenth_gym/envs/track/cubic_spline.py @@ -56,23 +56,22 @@ def __init__(self, x, y, self.spline = interpolate.CubicSpline(self.s, self.points, bc_type="periodic") self.spline_x = np.array(self.spline.x) self.spline_c = np.array(self.spline.c) - self.diffs = self.points[1:, :2] - self.points[:, :2][:-1, :2] - self.l2s = self.diffs[:, 0] ** 2 + self.diffs[:, 1] ** 2 + self.length = len(self.spline_x) def find_segment_for_s(self, x): # Find the segment of the spline that x is in # print(x, self.spline.x[-1], self.s_interval, len(self.spline_x)) - return (x / (self.spline.x[-1] + self.s_interval) * (len(self.spline_x) - 1)).astype(int) - # return (x / (self.spline.x[-1]) * (len(self.spline_x) - 2)).astype(int) + # return (x / (self.spline.x[-1] + self.s_interval) * (len(self.spline_x) - 1)).astype(int) + return (x / (self.spline.x[-1]) * (len(self.spline_x) - 2)).astype(int) def predict_with_spline(self, point, segment, state_index=0): # A (4, 100) array, where the rows contain (x-x[i])**3, (x-x[i])**2 etc. # exp_x = (point - self.spline.x[[segment]])[None, :] ** np.arange(4)[::-1, None] - exp_x = ((point - self.spline.x[segment % len(self.spline.x)]) ** np.arange(4)[::-1])[:, None] - vec = self.spline_c[:, segment % self.spline_c.shape[1], state_index] + exp_x = ((point - self.spline.x[segment % self.length]) ** np.arange(4)[::-1])[:, None] + vec = self.spline_c[:, segment % (self.length - 1), state_index] # Sum over the rows of exp_x weighted by coefficients in the ith column of s.c point = vec.dot(exp_x) - return np.asarray(point) + return point def __calc_s(self, x: np.ndarray, y: np.ndarray) -> np.ndarray: """ diff --git a/f1tenth_gym/envs/track/raceline.py b/f1tenth_gym/envs/track/raceline.py index fe05116a..6a367de9 100644 --- a/f1tenth_gym/envs/track/raceline.py +++ b/f1tenth_gym/envs/track/raceline.py @@ -65,7 +65,6 @@ def __init__( # compute spline through waypoints if not provided self.spline = spline or CubicSpline2D(x=xs, y=ys) self.s_frame_max = self.spline.s[-1] - self.s_guess = 0.0 self.waypoint_renderer = None From e724473717612793564324cbdbdaeaaa315d05ea Mon Sep 17 00:00:00 2001 From: zzangupenn Date: Thu, 26 Jun 2025 04:08:57 -0400 Subject: [PATCH 28/54] renderer add z_offset, bug fixes --- examples/waypoint_follow.py | 6 +- f1tenth_gym/envs/f110_env.py | 3 +- f1tenth_gym/envs/rendering/pyqtgl_objects.py | 59 +++++++++++++------ .../envs/rendering/rendering_pyqtgl.py | 11 ++-- 4 files changed, 52 insertions(+), 27 deletions(-) diff --git a/examples/waypoint_follow.py b/examples/waypoint_follow.py index 0226dd61..783e1172 100644 --- a/examples/waypoint_follow.py +++ b/examples/waypoint_follow.py @@ -4,6 +4,7 @@ import gymnasium as gym import numpy as np from numba import njit +import pathlib from f1tenth_gym.envs.f110_env import F110Env @@ -307,7 +308,6 @@ def main(): "tlad": 0.82461887897713965 * 2, "vgain": 1., } - num_agents = 1 env = gym.make( "f1tenth_gym:f1tenth-v0", @@ -330,7 +330,7 @@ def main(): "compute_frenet": 0, "max_laps": 5, # 'inf' for infinite laps, or a positive integer }, - render_mode="human_fast", # "human", "human_fast", "unlimited" + render_mode="unlimited", # "human", "human_fast", "unlimited" ) track = env.unwrapped.track @@ -344,7 +344,7 @@ def main(): ), ) - env.unwrapped.add_render_callback(track.raceline.render_waypoints) + track.raceline.render_waypoints(env.unwrapped.renderer) for r in planner.get_render_callbacks(): env.unwrapped.add_render_callback(r) diff --git a/f1tenth_gym/envs/f110_env.py b/f1tenth_gym/envs/f110_env.py index 10627ce6..0ef39b6b 100644 --- a/f1tenth_gym/envs/f110_env.py +++ b/f1tenth_gym/envs/f110_env.py @@ -233,8 +233,7 @@ def fullscale_vehicle_params(cls) -> dict: "h": 0.557, "m": 1225.8878467253344, "I": 1538.8533713561394, - # "width": 1.674, - "width": 0.1, + "width": 1.674, "length": 4.298, # steering constraints "s_min": -0.91, diff --git a/f1tenth_gym/envs/rendering/pyqtgl_objects.py b/f1tenth_gym/envs/rendering/pyqtgl_objects.py index 75245c53..cbb37d3c 100644 --- a/f1tenth_gym/envs/rendering/pyqtgl_objects.py +++ b/f1tenth_gym/envs/rendering/pyqtgl_objects.py @@ -27,9 +27,11 @@ def __init__( self.wheel_size = wheel_size self.car_thickness = render_spec.car_tickness self.show_wheels = render_spec.show_wheels - self.rgba = [c / 255 for c in color] + [1.0] + self.opacity = 1.0 + self.rgba = [c / 255 for c in color] + [self.opacity] self.rgba = np.array([self.rgba] * 2) self.scale = 1.0 + self.z_offset = 0.3 # Offset for rendering above the ground # Define centered rectangle in local coords hl = self.car_length / 2 # half-length @@ -71,7 +73,7 @@ def apply_pose(self, pose, scale=1.0): [s, c, 0], [0, 0, 1] ]) - return ((self.base_rect * scale) @ R.T) + np.array([x, y, 0.02]) + return ((self.base_rect * scale) @ R.T) + np.array([x, y, self.z_offset]) def update(self, obs: dict[str, np.ndarray], id: str): state = obs[id]["std_state"].astype(float) @@ -82,7 +84,7 @@ def update(self, obs: dict[str, np.ndarray], id: str): ) if obs[id]["collision"] > 0: color = (255, 0, 0) - self.rgba = [c / 255 for c in color] + [1.0] + self.rgba = [c / 255 for c in color] + [self.opacity] self.rgba = np.array([self.rgba] * 2) self.steering = state[2] @@ -96,12 +98,12 @@ def render(self, scale=1.0): smooth=False, drawEdges=False,) self.mesh.rotate(self.pose[2] / np.pi * 180, 0, 0, 1) - self.mesh.translate(self.pose[0], self.pose[1], 0.02) + self.mesh.translate(self.pose[0], self.pose[1], self.z_offset) self.scale = scale else: self.mesh.resetTransform() self.mesh.rotate(self.pose[2] / np.pi * 180, 0, 0, 1) - self.mesh.translate(self.pose[0], self.pose[1], 0.02) + self.mesh.translate(self.pose[0], self.pose[1], self.z_offset) class LinesRenderer(ObjectRenderer): @@ -110,10 +112,12 @@ def __init__( env_renderer: EnvRenderer, points: list | np.ndarray, color: Optional[tuple[int, int, int]] = (0, 0, 255), - size: Optional[int] = 1 + size: Optional[int] = 1, + z_offset: float = 0.01 ): # Convert to 3D (z=0) - self.points3d = np.hstack([points, np.zeros((points.shape[0], 1))]) + self.z_offset = z_offset + self.points3d = np.hstack([points, np.ones((points.shape[0], 1)) * z_offset]) # Normalize color rgba = tuple([c / 255 for c in color] + [1.0]) @@ -130,7 +134,7 @@ def __init__( env_renderer.view.addItem(self.line) def update(self, points: np.ndarray): - self.points3d = np.hstack([points, np.zeros((points.shape[0], 1))]) + self.points3d = np.hstack([points, np.ones((points.shape[0], 1)) * self.z_offset]) self.line.setData(pos=self.points3d) class ClosedLinesRenderer(ObjectRenderer): @@ -139,21 +143,23 @@ def __init__( env_renderer: EnvRenderer, points: np.ndarray, color: tuple[int, int, int] = (0, 0, 255), - size: float = 2.0 + size: float = 2.0, + z_offset: float = 0.01 ): + self.z_offset = z_offset # Ensure loop is closed if not np.array_equal(points[0], points[-1]): points = np.vstack([points, points[0]]) # Convert to 3D (z=0) - self.points3d = np.hstack([points, np.ones((points.shape[0], 1)) * 0.01]) + points3d = np.hstack([points, np.ones((points.shape[0], 1)) * z_offset]) # Normalize color rgba = tuple([c / 255 for c in color] + [1.0]) # Create the OpenGL line loop self.line = gl.GLLinePlotItem( - pos=self.points3d, + pos=points3d, color=rgba, width=size, mode='line_strip', @@ -165,8 +171,11 @@ def __init__( def update(self, points: np.ndarray): if not np.array_equal(points[0], points[-1]): points = np.vstack([points, points[0]]) - self.points3d = np.hstack([points, np.ones((points.shape[0], 1)) * 0.01]) - self.line.setData(pos=self.points3d) + if points.shape[1] == 2: + points = np.hstack([points, np.ones((points.shape[0], 1)) * self.z_offset]) + else: + points = points + self.line.setData(pos=points) class PointsRenderer(ObjectRenderer): def __init__( @@ -174,15 +183,21 @@ def __init__( env_renderer: EnvRenderer, points: np.ndarray, color: tuple[int, int, int] = (0, 0, 255), - size: int = 5 + size: int = 5, + z_offset: float = 0.01 ): + self.z_offset = z_offset # Normalize color to (0–1) color_rgba = tuple([c / 255 for c in color] + [1.0]) # Convert to 3D - self.points = np.hstack([points, np.ones((points.shape[0], 1)) * 0.01]) # z = 0 + if points.shape[1] == 2: + points = np.hstack([points, np.ones((points.shape[0], 1)) * self.z_offset]) + else: + points = points + self.points_shape = points.shape self.scatter = gl.GLScatterPlotItem( - pos=self.points, + pos=points, color=color_rgba, size=size, pxMode=True, # Use pixel-based sizing @@ -193,5 +208,13 @@ def __init__( def update(self, points: np.ndarray): if points.ndim == 1: points = points.reshape(1, -1) - self.points = np.hstack([points, np.ones((points.shape[0], 1)) * 0.01]) - self.scatter.setData(pos=self.points) + if points.shape[1] == 2: + points = np.hstack([points, np.ones((points.shape[0], 1)) * self.z_offset]) + else: + points = points + if points.shape != self.points_shape: + self.scatter.setData(pos=points) + self.points_shape = points.shape + else: + self.scatter.pos[:] = points + self.scatter.update() \ No newline at end of file diff --git a/f1tenth_gym/envs/rendering/rendering_pyqtgl.py b/f1tenth_gym/envs/rendering/rendering_pyqtgl.py index a9d085f4..cd22e195 100644 --- a/f1tenth_gym/envs/rendering/rendering_pyqtgl.py +++ b/f1tenth_gym/envs/rendering/rendering_pyqtgl.py @@ -288,24 +288,27 @@ def get_points_renderer( points: list | np.ndarray, color: Optional[tuple[int, int, int]] = (0, 0, 255), size: Optional[int] = 1, + **kwargs ) -> ObjectRenderer: - return PointsRenderer(self, points, color, size) + return PointsRenderer(self, points, color, size, **kwargs) def get_lines_renderer( self, points: list | np.ndarray, color: Optional[tuple[int, int, int]] = (0, 0, 255), - size: Optional[int] = 1, + size: Optional[int] = 1, + **kwargs ) -> ObjectRenderer: - return LinesRenderer(self, points, color, size) + return LinesRenderer(self, points, color, size, **kwargs) def get_closed_lines_renderer( self, points: list | np.ndarray, color: Optional[tuple[int, int, int]] = (0, 0, 255), size: Optional[int] = 1, + **kwargs ) -> ObjectRenderer: - return ClosedLinesRenderer(self, points, color, size) + return ClosedLinesRenderer(self, points, color, size, **kwargs) def close(self): self.window.close() From e60acba27acdda42e160a0c9cb95801895d311bf Mon Sep 17 00:00:00 2001 From: zzangupenn Date: Fri, 27 Jun 2025 01:35:40 -0400 Subject: [PATCH 29/54] renderer add zooming --- f1tenth_gym/envs/f110_env.py | 13 ++++++------ .../envs/rendering/rendering_pyqtgl.py | 20 ++++++++++++++----- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/f1tenth_gym/envs/f110_env.py b/f1tenth_gym/envs/f110_env.py index 0ef39b6b..d8ada4d2 100644 --- a/f1tenth_gym/envs/f110_env.py +++ b/f1tenth_gym/envs/f110_env.py @@ -480,12 +480,13 @@ def step(self, action): # observation obs = self.observation_type.observe() - if self.observation_config["type"] == "direct": - # for direct observation, also update the render_obs - self.render_obs = copy.deepcopy(obs) - else: - # for other observation types, update the render_obs - self.render_obs = copy.deepcopy(self.render_obs_type.observe()) + if self.config["enable_rendering"]: + if self.observation_config["type"] == "direct": + # for direct observation, also update the render_obs + self.render_obs = copy.deepcopy(obs) + else: + # for other observation types, update the render_obs + self.render_obs = copy.deepcopy(self.render_obs_type.observe()) # times reward = self.timestep diff --git a/f1tenth_gym/envs/rendering/rendering_pyqtgl.py b/f1tenth_gym/envs/rendering/rendering_pyqtgl.py index cd22e195..5d18ea4c 100644 --- a/f1tenth_gym/envs/rendering/rendering_pyqtgl.py +++ b/f1tenth_gym/envs/rendering/rendering_pyqtgl.py @@ -21,6 +21,7 @@ def __init__( render_fps: int, ): super().__init__() + self.camera_free_rotation = 0 self.params = params self.agent_ids = agent_ids self.render_spec = render_spec @@ -34,6 +35,7 @@ def __init__( self.car_scale = 1.0 self.default_camera_dist = self.params['width'] * 70 self.obs = None + self.zoom_level = 1.0 fmt = QtGui.QSurfaceFormat() fmt.setSwapInterval(0) # 0 = no vsync, 1 = vsync @@ -48,7 +50,7 @@ def __init__( self.window.setGeometry(0, 0, self.render_spec.window_size, self.render_spec.window_size) if self.render_spec.car_model == "2d": - self._enable_pan_only() + if not self.camera_free_rotation: self._enable_pan_only() self.focused = True self._init_map(track) @@ -142,7 +144,7 @@ def _center_camera_on_car(self, car_idx=0, distance_reset=False): self.car_scale = 1.0 if distance_reset: self.view.setCameraPosition( - distance=self.default_camera_dist, # zoom level + distance=self.default_camera_dist * self.zoom_level, # zoom level ) self.view.setCameraPosition( pos=QtGui.QVector3D(x, y, 1), # camera position @@ -184,6 +186,12 @@ def mouseMoveEvent(event): event.accept() else: event.ignore() + + def wheelEvent(event): + delta = event.angleDelta().y() + factor = 0.85 if delta > 0 else 1.15 + self.zoom_level *= factor + event.accept() def mouseReleaseEvent(event): self.view.pan_active = False @@ -192,6 +200,7 @@ def mouseReleaseEvent(event): self.view.mousePressEvent = mousePressEvent self.view.mouseMoveEvent = mouseMoveEvent self.view.mouseReleaseEvent = mouseReleaseEvent + self.view.wheelEvent = wheelEvent def update(self, obs: dict) -> None: """ @@ -244,13 +253,14 @@ def render(self): # call callbacks for callback_fn in self.callbacks: callback_fn(self) - if self.agent_to_follow is not None and self.render_spec.car_model == "2d": - if self.focused: + if self.agent_to_follow is not None and \ + self.render_spec.car_model == "2d" and \ + not self.camera_free_rotation and \ + self.focused: self._center_camera_on_car(self.agent_to_follow, distance_reset=True) # draw cars for i in range(len(self.agent_ids)): self.cars[i].render(self.car_scale) - self.app.processEvents() if self.render_mode in ["human", "human_fast", 'unlimited']: From 502ffa61f4f4468112c92f189173be597496adcc Mon Sep 17 00:00:00 2001 From: zzangupenn Date: Fri, 27 Jun 2025 14:41:04 -0400 Subject: [PATCH 30/54] bound yaw between -pi to pi --- f1tenth_gym/envs/base_classes.py | 2 +- f1tenth_gym/envs/track/cubic_spline.py | 4 ++-- f1tenth_gym/envs/track/track.py | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/f1tenth_gym/envs/base_classes.py b/f1tenth_gym/envs/base_classes.py index b9fb7262..53caa555 100644 --- a/f1tenth_gym/envs/base_classes.py +++ b/f1tenth_gym/envs/base_classes.py @@ -351,7 +351,7 @@ def update_dynamic(self, raw_steer, vel): ) # bound yaw angle - self.state[4] = (self.state[4] + 2 * np.pi) % (2 * np.pi) # TODO: This is a problem waiting to happen + self.state[4] = np.arctan2(np.sin(self.state[4]), np.cos(self.state[4])) if self.config['enable_scan']: # update scan diff --git a/f1tenth_gym/envs/track/cubic_spline.py b/f1tenth_gym/envs/track/cubic_spline.py index a9917ba9..554e327f 100644 --- a/f1tenth_gym/envs/track/cubic_spline.py +++ b/f1tenth_gym/envs/track/cubic_spline.py @@ -97,7 +97,7 @@ def __calc_s(self, x: np.ndarray, y: np.ndarray) -> np.ndarray: def _calc_yaw_from_xy(self, x, y): dx_dt = np.gradient(x, edge_order=2) dy_dt = np.gradient(y, edge_order=2) - heading = (np.arctan2(dy_dt, dx_dt) + 2 * math.pi) % (2 * math.pi) + heading = np.arctan2(dy_dt, dx_dt) return heading def _calc_kappa_from_xy(self, x, y): @@ -189,7 +189,7 @@ def calc_yaw(self, s: float, segment=None) -> Optional[float]: segment = segment or self.find_segment_for_s(s) cos = self.predict_with_spline(s, segment, 2)[0] sin = self.predict_with_spline(s, segment, 3)[0] - yaw = (math.atan2(sin, cos) + 2 * math.pi) % (2 * math.pi) + yaw = np.arctan2(sin, cos) return yaw # def calc_arclength( diff --git a/f1tenth_gym/envs/track/track.py b/f1tenth_gym/envs/track/track.py index 3f73763e..1fb89a50 100644 --- a/f1tenth_gym/envs/track/track.py +++ b/f1tenth_gym/envs/track/track.py @@ -436,7 +436,7 @@ def frenet_to_cartesian(self, s, ey, ephi, use_raceline=False): # Adjust psi by adding the heading deviation psi += ephi - return x, y, (psi + (2 * np.pi)) % (2 * np.pi) + return x, y, np.arctan2(np.sin(psi), np.cos(psi)) def cartesian_to_frenet(self, x, y, psi, use_raceline=False, s_guess=None, use_s_guess=True): """ @@ -479,4 +479,4 @@ def cartesian_to_frenet(self, x, y, psi, use_raceline=False, s_guess=None, use_s ey = ey * distance_sign psi = psi - yaw - return s, ey, (psi + (2 * np.pi)) % (2 * np.pi) + return s, ey, np.arctan2(np.sin(psi), np.cos(psi)) From e7b12ea548cb96355df3de893d5123e6aca21dd7 Mon Sep 17 00:00:00 2001 From: zzangupenn Date: Tue, 1 Jul 2025 01:01:00 -0400 Subject: [PATCH 31/54] use deque for steering buffer, rendering window open after render() --- examples/waypoint_follow.py | 1 + f1tenth_gym/envs/base_classes.py | 31 ++++++++++--------- f1tenth_gym/envs/f110_env.py | 28 ++++++++++++++++- f1tenth_gym/envs/observation.py | 6 ++-- .../envs/rendering/rendering_pyqtgl.py | 7 ++++- f1tenth_gym/envs/track/cubic_spline.py | 4 +-- f1tenth_gym/envs/track/track.py | 7 +++-- 7 files changed, 60 insertions(+), 24 deletions(-) diff --git a/examples/waypoint_follow.py b/examples/waypoint_follow.py index 783e1172..a431d193 100644 --- a/examples/waypoint_follow.py +++ b/examples/waypoint_follow.py @@ -329,6 +329,7 @@ def main(): "lidar_num_beams": 270, "compute_frenet": 0, "max_laps": 5, # 'inf' for infinite laps, or a positive integer + "steer_delay_buffer_size": 1, # 0 for no delay, >0 for delay }, render_mode="unlimited", # "human", "human_fast", "unlimited" ) diff --git a/f1tenth_gym/envs/base_classes.py b/f1tenth_gym/envs/base_classes.py index 53caa555..8941ba80 100644 --- a/f1tenth_gym/envs/base_classes.py +++ b/f1tenth_gym/envs/base_classes.py @@ -29,6 +29,7 @@ from __future__ import annotations import numpy as np +from collections import deque from .dynamic_models import DynamicModel from .action import CarAction from .collision_models import collision_multiple, get_vertices @@ -126,8 +127,7 @@ def __init__( self.steer_angle_vel = 0.0 # steering delay buffer - self.steer_buffer = np.empty((0,)) - self.steer_buffer_size = self.config['steer_delay_buffer_size'] + self.steer_buffer = deque(maxlen=self.config['steer_delay_buffer_size']) # collision identifier self.in_collision = False @@ -224,7 +224,7 @@ def reset(self, pose, option='pose'): if self.config['compute_frenet'] and self.track is not None: self.frenet_pose = self.track.cartesian_to_frenet(self.state[0], self.state[1], self.state[4], use_s_guess=False) - self.steer_buffer = np.empty((0,)) + self.steer_buffer = deque(maxlen=self.config['steer_delay_buffer_size']) # reset scan random generator self.scan_rng = np.random.default_rng(seed=self.seed) @@ -305,14 +305,14 @@ def update_dynamic(self, raw_steer, vel): """ # steering delay - steer = 0.0 - if self.steer_buffer.shape[0] < self.steer_buffer_size: - steer = 0.0 - self.steer_buffer = np.append(raw_steer, self.steer_buffer) - else: - steer = self.steer_buffer[-1] - self.steer_buffer = self.steer_buffer[:-1] - self.steer_buffer = np.append(raw_steer, self.steer_buffer) + steer = raw_steer + if self.steer_buffer.maxlen > 0: + if len(self.steer_buffer) < self.steer_buffer.maxlen: + steer = 0.0 + self.steer_buffer.append(raw_steer) + else: + steer = self.steer_buffer.popleft() + self.steer_buffer.append(raw_steer) if self.action_type.type is None: raise ValueError("No Control Action Type Specified.") @@ -351,7 +351,8 @@ def update_dynamic(self, raw_steer, vel): ) # bound yaw angle - self.state[4] = np.arctan2(np.sin(self.state[4]), np.cos(self.state[4])) + # self.state[4] = (self.state[4] + 2 * np.pi) % (2 * np.pi) + self.state[4] = (self.state[4] + np.pi) % (2 * np.pi) - np.pi if self.config['enable_scan']: # update scan @@ -544,7 +545,7 @@ def check_collision(self): all_vertices = np.empty((self.num_agents, 4, 2)) for i in range(self.num_agents): all_vertices[i, :, :] = get_vertices( - np.append(self.agents[i].state[0:2], self.agents[i].state[4]), + np.append(self.agents[i].state[0:2].copy(), self.agents[i].state[4]).copy(), self.params["length"], self.params["width"], ) @@ -568,8 +569,8 @@ def step(self, control_inputs): self.agent_scans[i, :] = current_scan # update sim's information of agent poses - self.agent_poses[i, :] = np.append(agent.state[0:2], agent.state[4]) - self.agent_steerings[i] = agent.state[2] + self.agent_poses[i, :] = np.append(agent.state[0:2], agent.state[4]).copy() + self.agent_steerings[i] = agent.state[2].copy() # check collisions between all agents diff --git a/f1tenth_gym/envs/f110_env.py b/f1tenth_gym/envs/f110_env.py index d8ada4d2..6ecf5783 100644 --- a/f1tenth_gym/envs/f110_env.py +++ b/f1tenth_gym/envs/f110_env.py @@ -216,12 +216,38 @@ def default_config(cls) -> dict: "lidar_num_beams": 1080, "lidar_range": 30.0, "lidar_noise_std": 0.01, - "steer_delay_buffer_size": 1, + "steer_delay_buffer_size": 0, "compute_frenet": True, "collision_check_method": "lidar_scan", # "lidar_scan", "bounding_box" "loop_counting_method": "frenet_based", # "toggle", "frenet_based", "winding_angle" } + @classmethod + def fullscale_vehicle_params_st(cls) -> dict: + params = { + "mu": 1.0489, + "C_Sf": 20.89, + "C_Sr": 20.89, + "lf": 0.88392, + "lr": 1.50876, + "h": 0.557, + "m": 1225.8878467253344, + "I": 1538.8533713561394, + "width": 1.674, + "length": 4.298, + # steering constraints + "s_min": -0.91, + "s_max": 0.91, + "sv_min": -0.4, + "sv_max": 0.4, + # Longitudinal constraints + "v_switch": 4.755, + "a_max": 11.5, + "v_min": -13.9, + "v_max": 45.8, + } + return params + @classmethod def fullscale_vehicle_params(cls) -> dict: params = { diff --git a/f1tenth_gym/envs/observation.py b/f1tenth_gym/envs/observation.py index 837c7491..643441ff 100644 --- a/f1tenth_gym/envs/observation.py +++ b/f1tenth_gym/envs/observation.py @@ -81,9 +81,9 @@ def observe(self): # create agent's observation dict agent_obs = { - "scan": scan, - "std_state": agent.standard_state, - "state": agent.state, + "scan": scan.copy(), + "std_state": agent.standard_state.copy(), + "state": agent.state.copy(), "collision": agent.in_collision, "lap_time": self.env.unwrapped.lap_times[i], "lap_count": self.env.unwrapped.lap_counts[i], diff --git a/f1tenth_gym/envs/rendering/rendering_pyqtgl.py b/f1tenth_gym/envs/rendering/rendering_pyqtgl.py index 5d18ea4c..ee945f82 100644 --- a/f1tenth_gym/envs/rendering/rendering_pyqtgl.py +++ b/f1tenth_gym/envs/rendering/rendering_pyqtgl.py @@ -36,6 +36,7 @@ def __init__( self.default_camera_dist = self.params['width'] * 70 self.obs = None self.zoom_level = 1.0 + self.init = True fmt = QtGui.QSurfaceFormat() fmt.setSwapInterval(0) # 0 = no vsync, 1 = vsync @@ -87,7 +88,7 @@ def __init__( self.sim_time = None self.callbacks = [] self.draw_flag = True - self.window.show() + # self.window.show() # Colors self.car_colors = [ @@ -245,6 +246,10 @@ def update(self, obs: dict) -> None: def render(self): if self.draw_flag: + if self.init: + self.window.show() + self.init = False + if self.obs is not None: self.lap_label.setText(f"Lap Time {self.obs[self.agent_ids[0]]['lap_time']:.2f}, " + f"Lap {int(self.obs[self.agent_ids[0]]['lap_count']):d}") diff --git a/f1tenth_gym/envs/track/cubic_spline.py b/f1tenth_gym/envs/track/cubic_spline.py index 554e327f..de857949 100644 --- a/f1tenth_gym/envs/track/cubic_spline.py +++ b/f1tenth_gym/envs/track/cubic_spline.py @@ -61,8 +61,8 @@ def __init__(self, x, y, def find_segment_for_s(self, x): # Find the segment of the spline that x is in # print(x, self.spline.x[-1], self.s_interval, len(self.spline_x)) - # return (x / (self.spline.x[-1] + self.s_interval) * (len(self.spline_x) - 1)).astype(int) - return (x / (self.spline.x[-1]) * (len(self.spline_x) - 2)).astype(int) + return (x / (self.spline.x[-1] + self.s_interval) * (len(self.spline_x) - 1)).astype(int) + # return (x / (self.spline.x[-1]) * (len(self.spline_x) - 2)).astype(int) def predict_with_spline(self, point, segment, state_index=0): # A (4, 100) array, where the rows contain (x-x[i])**3, (x-x[i])**2 etc. diff --git a/f1tenth_gym/envs/track/track.py b/f1tenth_gym/envs/track/track.py index 1fb89a50..dc6232c4 100644 --- a/f1tenth_gym/envs/track/track.py +++ b/f1tenth_gym/envs/track/track.py @@ -436,7 +436,8 @@ def frenet_to_cartesian(self, s, ey, ephi, use_raceline=False): # Adjust psi by adding the heading deviation psi += ephi - return x, y, np.arctan2(np.sin(psi), np.cos(psi)) + # return x, y, np.arctan2(np.sin(psi), np.cos(psi)) + return x, y, (psi + np.pi) % (2 * np.pi) - np.pi # wrap to [-pi, pi] def cartesian_to_frenet(self, x, y, psi, use_raceline=False, s_guess=None, use_s_guess=True): """ @@ -454,6 +455,7 @@ def cartesian_to_frenet(self, x, y, psi, use_raceline=False, s_guess=None, use_s line = self.raceline if use_raceline else self.centerline if s_guess is None: s_guess = self.s_guess + # use_s_guess = False if use_s_guess and s_guess is not None: s_inds = line.spline.find_segment_for_s(s_guess) @@ -479,4 +481,5 @@ def cartesian_to_frenet(self, x, y, psi, use_raceline=False, s_guess=None, use_s ey = ey * distance_sign psi = psi - yaw - return s, ey, np.arctan2(np.sin(psi), np.cos(psi)) + # return s, ey, np.arctan2(np.sin(psi), np.cos(psi)) + return s, ey, (psi + np.pi) % (2 * np.pi) - np.pi From 2835b52dea19c5bc607b0feb628e57158a969668 Mon Sep 17 00:00:00 2001 From: zzangupenn Date: Tue, 1 Jul 2025 01:36:43 -0400 Subject: [PATCH 32/54] remove fullscale_params_st --- f1tenth_gym/envs/f110_env.py | 26 -------------------------- 1 file changed, 26 deletions(-) diff --git a/f1tenth_gym/envs/f110_env.py b/f1tenth_gym/envs/f110_env.py index 6ecf5783..0d078c91 100644 --- a/f1tenth_gym/envs/f110_env.py +++ b/f1tenth_gym/envs/f110_env.py @@ -221,32 +221,6 @@ def default_config(cls) -> dict: "collision_check_method": "lidar_scan", # "lidar_scan", "bounding_box" "loop_counting_method": "frenet_based", # "toggle", "frenet_based", "winding_angle" } - - @classmethod - def fullscale_vehicle_params_st(cls) -> dict: - params = { - "mu": 1.0489, - "C_Sf": 20.89, - "C_Sr": 20.89, - "lf": 0.88392, - "lr": 1.50876, - "h": 0.557, - "m": 1225.8878467253344, - "I": 1538.8533713561394, - "width": 1.674, - "length": 4.298, - # steering constraints - "s_min": -0.91, - "s_max": 0.91, - "sv_min": -0.4, - "sv_max": 0.4, - # Longitudinal constraints - "v_switch": 4.755, - "a_max": 11.5, - "v_min": -13.9, - "v_max": 45.8, - } - return params @classmethod def fullscale_vehicle_params(cls) -> dict: From 0e494f675240946bbb6680b5af9aaac88c57fafb Mon Sep 17 00:00:00 2001 From: zirui zang Date: Tue, 1 Jul 2025 21:33:58 -0400 Subject: [PATCH 33/54] fix ordering of the params --- f1tenth_gym/envs/f110_env.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/f1tenth_gym/envs/f110_env.py b/f1tenth_gym/envs/f110_env.py index 6ecf5783..8a436e70 100644 --- a/f1tenth_gym/envs/f110_env.py +++ b/f1tenth_gym/envs/f110_env.py @@ -266,15 +266,15 @@ def fullscale_vehicle_params(cls) -> dict: "s_max": 0.91, "sv_min": -0.4, "sv_max": 0.4, - # maximum curvature change - "kappa_dot_max": 0.4, - # maximum curvature rate rate - "kappa_dot_dot_max": 20.0, # Longitudinal constraints "v_switch": 4.755, "a_max": 11.5, "v_min": -13.9, "v_max": 45.8, + # maximum curvature change + "kappa_dot_max": 0.4, + # maximum curvature rate rate + "kappa_dot_dot_max": 20.0, # maximum longitudinal jerk [m/s^3] "j_max": 10.0e3, # maximum longitudinal jerk change [m/s^4] From c37d31ca197214b5387aeb9d83942e6bca625242 Mon Sep 17 00:00:00 2001 From: zzangupenn Date: Tue, 1 Jul 2025 21:43:14 -0400 Subject: [PATCH 34/54] fixing ordering of params --- f1tenth_gym/envs/f110_env.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/f1tenth_gym/envs/f110_env.py b/f1tenth_gym/envs/f110_env.py index 3a51f02a..64c5c369 100644 --- a/f1tenth_gym/envs/f110_env.py +++ b/f1tenth_gym/envs/f110_env.py @@ -233,8 +233,6 @@ def fullscale_vehicle_params(cls) -> dict: "h": 0.557, "m": 1225.8878467253344, "I": 1538.8533713561394, - "width": 1.674, - "length": 4.298, # steering constraints "s_min": -0.91, "s_max": 0.91, @@ -245,6 +243,8 @@ def fullscale_vehicle_params(cls) -> dict: "a_max": 11.5, "v_min": -13.9, "v_max": 45.8, + "width": 1.674, + "length": 4.298, # maximum curvature change "kappa_dot_max": 0.4, # maximum curvature rate rate From f430954580b8318437a8fb53dc1391a3ae902edf Mon Sep 17 00:00:00 2001 From: zzangupenn Date: Tue, 1 Jul 2025 22:51:21 -0400 Subject: [PATCH 35/54] converting dynamic models to using param_arr --- examples/waypoint_follow.py | 16 +- f1tenth_gym/envs/base_classes.py | 71 +- f1tenth_gym/envs/dynamic_models/__init__.py | 2 +- f1tenth_gym/envs/dynamic_models/kinematic.py | 414 ++-- .../dynamic_models/multi_body/__init__.py | 24 +- .../dynamic_models/multi_body/multi_body.py | 1993 ++++++++--------- .../dynamic_models/multi_body/tire_model.py | 190 +- .../multi_body/tire_model_new.py | 184 -- .../multi_body/tire_model_old.py | 160 ++ .../envs/dynamic_models/single_track.py | 343 ++- f1tenth_gym/envs/f110_env.py | 2 +- f1tenth_gym/envs/observation.py | 1 - 12 files changed, 1639 insertions(+), 1761 deletions(-) delete mode 100644 f1tenth_gym/envs/dynamic_models/multi_body/tire_model_new.py create mode 100644 f1tenth_gym/envs/dynamic_models/multi_body/tire_model_old.py diff --git a/examples/waypoint_follow.py b/examples/waypoint_follow.py index a431d193..a4a67326 100644 --- a/examples/waypoint_follow.py +++ b/examples/waypoint_follow.py @@ -305,7 +305,7 @@ def main(): work = { "mass": 3.463388126201571, "lf": 0.15597534362552312, - "tlad": 0.82461887897713965 * 2, + "tlad": 0.82461887897713965 * 8, "vgain": 1., } num_agents = 1 @@ -318,10 +318,10 @@ def main(): "integrator_timestep": 0.01, "integrator": "rk4", "control_input": ["speed", "steering_angle"], - "model": "st", # "ks", "st", "mb" + "model": 'mb', # "ks", "st", "mb" "observation_config": {"type": "direct"}, - "params": F110Env.f1tenth_vehicle_params(), - # "params": F110Env.fullscale_vehicle_params(), + # "params": F110Env.f1tenth_vehicle_params(), + "params": F110Env.fullscale_vehicle_params(), "reset_config": {"type": "rl_random_static"}, "map_scale": 1.0, "enable_rendering": 1, @@ -338,10 +338,10 @@ def main(): planner = PurePursuitPlanner( track=track, wb=( - F110Env.f1tenth_vehicle_params()["lf"] - + F110Env.f1tenth_vehicle_params()["lr"] - # F110Env.fullscale_vehicle_params()["lf"] - # + F110Env.fullscale_vehicle_params()["lr"] + # F110Env.f1tenth_vehicle_params()["lf"] + # + F110Env.f1tenth_vehicle_params()["lr"] + F110Env.fullscale_vehicle_params()["lf"] + + F110Env.fullscale_vehicle_params()["lr"] ), ) diff --git a/f1tenth_gym/envs/base_classes.py b/f1tenth_gym/envs/base_classes.py index 8941ba80..4e9af1ac 100644 --- a/f1tenth_gym/envs/base_classes.py +++ b/f1tenth_gym/envs/base_classes.py @@ -107,18 +107,8 @@ def __init__( self.action_type = action_type self.model = model self.track = track - if self.model == DynamicModel.MB: - from .dynamic_models.multi_body.multi_body import sequential_param_keys - self.sequential_param_keys = sequential_param_keys - else: - self.sequential_param_keys = None self.standard_state_fn = self.model.get_standardized_state_fn() - # state of the vehicle - self.state = self.model.get_initial_state(params=self.params) - if self.config['compute_frenet'] and self.track is not None: - self.frenet_pose = self.track.cartesian_to_frenet(self.state[0], self.state[1], self.state[4], use_s_guess=False) - # pose of opponents in the world self.opp_poses = None @@ -134,6 +124,36 @@ def __init__( # collision threshold for iTTC to environment self.ttc_thresh = 0.005 + + if self.config["model"] in ['st', 'ks']: + self.sequential_params = ['mu', 'C_Sf', 'C_Sr', 'lf', 'lr', 'h', 'm', 'I', + 's_min', 's_max', 'sv_min', 'sv_max', 'v_switch', + 'a_max', 'v_min', 'v_max', 'width', 'length'] + elif self.config["model"] == 'mb': + self.sequential_params = ['mu', 'C_Sf', 'C_Sr', 'lf', 'lr', 'h', 'm', 'I', + 's_min', 's_max', 'sv_min', 'sv_max', 'v_switch', 'a_max', + 'v_min', 'v_max', 'width', 'length', 'kappa_dot_max', + 'kappa_dot_dot_max', 'j_max', 'j_dot_max', 'm_s', 'm_uf', + 'm_ur', 'I_Phi_s', 'I_y_s', 'I_z', 'I_xz_s', 'K_sf', + 'K_sdf', 'K_sr', 'K_sdr', 'T_f', 'T_r', 'K_ras', 'K_tsf', + 'K_tsr', 'K_rad', 'K_zt', 'h_cg', 'h_raf', 'h_rar', 'h_s', + 'I_uf', 'I_ur', 'I_y_w', 'K_lt', 'R_w', 'T_sb', 'T_se', + 'D_f', 'D_r', 'E_f', 'E_r', 'tire_p_cx1', 'tire_p_dx1', + 'tire_p_dx3', 'tire_p_ex1', 'tire_p_kx1', 'tire_p_hx1', + 'tire_p_vx1', 'tire_r_bx1', 'tire_r_bx2', 'tire_r_cx1', + 'tire_r_ex1', 'tire_r_hx1', 'tire_p_cy1', 'tire_p_dy1', + 'tire_p_dy3', 'tire_p_ey1', 'tire_p_ky1', 'tire_p_hy1', + 'tire_p_hy3', 'tire_p_vy1', 'tire_p_vy3', 'tire_r_by1', + 'tire_r_by2', 'tire_r_by3', 'tire_r_cy1', 'tire_r_ey1', + 'tire_r_hy1', 'tire_r_vy1', 'tire_r_vy3', 'tire_r_vy4', + 'tire_r_vy5', 'tire_r_vy6'] + self.update_params(params) + + # state of the vehicle + self.state = self.model.get_initial_state(params=self.params_arr) + if self.config['compute_frenet'] and self.track is not None: + self.frenet_pose = self.track.cartesian_to_frenet(self.state[0], self.state[1], self.state[4], use_s_guess=False) + # initialize scan sim if RaceCar.scan_simulator is None: @@ -190,6 +210,7 @@ def update_params(self, params): None """ self.params = params + self.params_arr = np.array([self.params[p] for p in self.sequential_params]) def set_map(self, map: str | Track, map_scale: float = 1.0): """ @@ -218,7 +239,7 @@ def reset(self, pose, option='pose'): self.in_collision = False if option == 'pose': # init state from pose - self.state = self.model.get_initial_state(pose=pose, params=self.params) + self.state = self.model.get_initial_state(pose=pose, params=self.params_arr) elif option == 'state': self.state = pose if self.config['compute_frenet'] and self.track is not None: @@ -324,31 +345,9 @@ def update_dynamic(self, raw_steer, vel): u_np = np.array([sv, accl]) f_dynamics = self.model.f_dynamics - if self.model == DynamicModel.MB: - self.state = self.integrator.integrate( - f_dynamics, self.state, u_np, [self.params[key] for key in self.sequential_param_keys] - ) - else: - self.state = self.integrator.integrate( - f_dynamics, self.state, u_np, self.params['mu'], - self.params['C_Sf'], - self.params['C_Sr'], - self.params['lf'], - self.params['lr'], - self.params['h'], - self.params['m'], - self.params['I'], - self.params['s_min'], - self.params['s_max'], - self.params['sv_min'], - self.params['sv_max'], - self.params['v_switch'], - self.params['a_max'], - self.params['v_min'], - self.params['v_max'], - self.params['width'], - self.params['length'] - ) + self.state = self.integrator.integrate( + f_dynamics, self.state, u_np, self.params_arr + ) # bound yaw angle # self.state[4] = (self.state[4] + 2 * np.pi) % (2 * np.pi) diff --git a/f1tenth_gym/envs/dynamic_models/__init__.py b/f1tenth_gym/envs/dynamic_models/__init__.py index 1d7f262e..2d66f95b 100644 --- a/f1tenth_gym/envs/dynamic_models/__init__.py +++ b/f1tenth_gym/envs/dynamic_models/__init__.py @@ -32,7 +32,7 @@ def from_string(model: str): else: raise ValueError(f"Unknown model type {model}") - def get_initial_state(self, pose=None, params: Optional[dict] = None): + def get_initial_state(self, pose=None, params=None): # Assert that if self is MB, params is not None if self == DynamicModel.MB and params is None: raise ValueError("MultiBody model requires parameters to be provided.") diff --git a/f1tenth_gym/envs/dynamic_models/kinematic.py b/f1tenth_gym/envs/dynamic_models/kinematic.py index 85d45789..e0365900 100644 --- a/f1tenth_gym/envs/dynamic_models/kinematic.py +++ b/f1tenth_gym/envs/dynamic_models/kinematic.py @@ -3,282 +3,210 @@ from .utils import steering_constraint, accl_constraints - -# def vehicle_dynamics_ks(x: np.ndarray, u_init: np.ndarray, params: dict): -# """ -# Single Track Kinematic Vehicle Dynamics. -# Follows https://gitlab.lrz.de/tum-cps/commonroad-vehicle-models/-/blob/master/vehicleModels_commonRoad.pdf, section 5 - -# Args: -# x (numpy.ndarray (5, )): vehicle state vector (x0, x1, x2, x3, x4) -# x0: x position in global coordinates -# x1: y position in global coordinates -# x2: steering angle of front wheels -# x3: velocity in x direction -# x4: yaw angle -# u (numpy.ndarray (2, )): control input vector (u1, u2) -# u1: steering angle velocity of front wheels -# u2: longitudinal acceleration -# params (dict): dictionary containing the following parameters: -# mu (float): friction coefficient -# C_Sf (float): cornering stiffness of front wheels -# C_Sr (float): cornering stiffness of rear wheels -# lf (float): distance from center of gravity to front axle -# lr (float): distance from center of gravity to rear axle -# h (float): height of center of gravity -# m (float): mass of vehicle -# I (float): moment of inertia of vehicle, about Z axis -# s_min (float): minimum steering angle -# s_max (float): maximum steering angle -# sv_min (float): minimum steering velocity -# sv_max (float): maximum steering velocity -# v_switch (float): velocity above which the acceleration is no longer able to create wheel slip -# a_max (float): maximum allowed acceleration -# v_min (float): minimum allowed velocity -# v_max (float): maximum allowed velocity - -# Returns: -# f (numpy.ndarray): right hand side of differential equations -# """ -# # Controls -# X = x[0] -# Y = x[1] -# DELTA = x[2] -# V = x[3] -# PSI = x[4] -# # Raw Actions -# RAW_STEER_VEL = u_init[0] -# RAW_ACCL = u_init[1] -# # wheelbase -# lwb = params["lf"] + params["lr"] - -# # constraints -# u = np.array( -# [ -# steering_constraint( -# DELTA, -# RAW_STEER_VEL, -# params["s_min"], -# params["s_max"], -# params["sv_min"], -# params["sv_max"], -# ), -# accl_constraints( -# V, -# RAW_ACCL, -# params["v_switch"], -# params["a_max"], -# params["v_min"], -# params["v_max"], -# ), -# ] -# ) -# # Corrected Actions -# STEER_VEL = u[0] -# ACCL = u[1] - -# # system dynamics -# f = np.array( -# [ -# V * np.cos(PSI), # X_DOT -# V * np.sin(PSI), # Y_DOT -# STEER_VEL, # DELTA_DOT -# ACCL, # V_DOT -# (V / lwb) * np.tan(DELTA), # PSI_DOT -# ] -# ) -# return f - - -# def vehicle_dynamics_ks_cog(x: np.ndarray, u_init: np.ndarray, params: dict): -# """ -# Single Track Kinematic Vehicle Dynamics. -# Follows https://gitlab.lrz.de/tum-cps/commonroad-vehicle-models/-/blob/master/vehicleModels_commonRoad.pdf, section 5 - -# Args: -# x (numpy.ndarray (5, )): vehicle state vector (x0, x1, x2, x3, x4) -# x0: x position in global coordinates -# x1: y position in global coordinates -# x2: steering angle of front wheels -# x3: velocity in x direction -# x4: yaw angle -# u (numpy.ndarray (2, )): control input vector (u1, u2) -# u1: steering angle velocity of front wheels -# u2: longitudinal acceleration -# params (dict): dictionary containing the following parameters: -# mu (float): friction coefficient -# C_Sf (float): cornering stiffness of front wheels -# C_Sr (float): cornering stiffness of rear wheels -# lf (float): distance from center of gravity to front axle -# lr (float): distance from center of gravity to rear axle -# h (float): height of center of gravity -# m (float): mass of vehicle -# I (float): moment of inertia of vehicle, about Z axis -# s_min (float): minimum steering angle -# s_max (float): maximum steering angle -# sv_min (float): minimum steering velocity -# sv_max (float): maximum steering velocity -# v_switch (float): velocity above which the acceleration is no longer able to create wheel slip -# a_max (float): maximum allowed acceleration -# v_min (float): minimum allowed velocity -# v_max (float): maximum allowed velocity - -# Returns: -# f (numpy.ndarray): right hand side of differential equations -# """ -# # Controls -# X = x[0] -# Y = x[1] -# DELTA = x[2] -# V = x[3] -# PSI = x[4] -# # Raw Actions -# RAW_STEER_VEL = u_init[0] -# RAW_ACCL = u_init[1] -# # wheelbase -# lwb = params["lf"] + params["lr"] -# # constraints -# u = np.array( -# [ -# steering_constraint( -# DELTA, -# RAW_STEER_VEL, -# params["s_min"], -# params["s_max"], -# params["sv_min"], -# params["sv_max"], -# ), -# accl_constraints( -# V, -# RAW_ACCL, -# params["v_switch"], -# params["a_max"], -# params["v_min"], -# params["v_max"], -# ), -# ] -# ) -# # slip angle (beta) from vehicle kinematics -# beta = np.arctan(np.tan(x[2]) * params["lr"] / lwb) - -# # system dynamics -# f = [ -# V * np.cos(beta + PSI), -# V * np.sin(beta + PSI), -# u[0], -# u[1], -# V * np.cos(beta) * np.tan(DELTA) / lwb, -# ] - -# return f - @njit(cache=True) -def vehicle_dynamics_ks( - x: np.ndarray, - u_init: np.ndarray, - mu: float, - C_Sf: float, - C_Sr: float, - lf: float, - lr: float, - h: float, - m: float, - I: float, - s_min: float, - s_max: float, - sv_min: float, - sv_max: float, - v_switch: float, - a_max: float, - v_min: float, - v_max: float, - width: float, - length: float -) -> np.ndarray: +def vehicle_dynamics_ks(x: np.ndarray, u_init: np.ndarray, params: np.ndarray) -> np.ndarray: + """ + Single Track Kinematic Vehicle Dynamics. + Follows https://gitlab.lrz.de/tum-cps/commonroad-vehicle-models/-/blob/master/vehicleModels_commonRoad.pdf, section 5 + + Args: + x (numpy.ndarray (5, )): vehicle state vector (x0, x1, x2, x3, x4) + x0: x position in global coordinates + x1: y position in global coordinates + x2: steering angle of front wheels + x3: velocity in x direction + x4: yaw angle + u (numpy.ndarray (2, )): control input vector (u1, u2) + u1: steering angle velocity of front wheels + u2: longitudinal acceleration + params (dict): dictionary containing the following parameters: + mu (float): friction coefficient + C_Sf (float): cornering stiffness of front wheels + C_Sr (float): cornering stiffness of rear wheels + lf (float): distance from center of gravity to front axle + lr (float): distance from center of gravity to rear axle + h (float): height of center of gravity + m (float): mass of vehicle + I (float): moment of inertia of vehicle, about Z axis + s_min (float): minimum steering angle + s_max (float): maximum steering angle + sv_min (float): minimum steering velocity + sv_max (float): maximum steering velocity + v_switch (float): velocity above which the acceleration is no longer able to create wheel slip + a_max (float): maximum allowed acceleration + v_min (float): minimum allowed velocity + v_max (float): maximum allowed velocity + + Returns: + f (numpy.ndarray): right hand side of differential equations + """ # Controls X = x[0] Y = x[1] DELTA = x[2] V = x[3] PSI = x[4] - + # Raw Actions RAW_STEER_VEL = u_init[0] RAW_ACCL = u_init[1] - + + # mu = params[0] + # C_Sf = params[1] # front tire cornering stiffness [N/rad] CF + # C_Sr = params[2] # rear tire cornering stiffness [N/rad] CR + lf = params[3] # distance from spring mass center of gravity to front axle [m] LENA + lr = params[4] # distance from spring mass center of gravity to rear axle [m] LENB + # h = params[5] # M_s center of gravity above ground [m] HS + # m = params[6] # vehicle mass [kg] MASS + # I = params[7] # moment of inertia for sprung mass in yaw [kg m^2] IZZ + s_min = params[8] # minimum steering angle [rad] + s_max = params[9] # maximum steering angle [rad] + sv_min = params[10] # minimum steering velocity [rad/s] + sv_max = params[11] # maximum steering velocity [rad/s] + v_switch = params[12] # switching velocity [m/s] + a_max = params[13] # maximum absolute acceleration [m/s^2] + v_min = params[14] # minimum velocity [m/s] + v_max = params[15] # maximum velocity [m/s] + # wheelbase lwb = lf + lr - u = [ - steering_constraint(DELTA, RAW_STEER_VEL, s_min, s_max, sv_min, sv_max), - accl_constraints(V, RAW_ACCL, v_switch, a_max, v_min, v_max) - ] - + # constraints + u = np.array( + [ + steering_constraint( + DELTA, + RAW_STEER_VEL, + s_min, + s_max, + sv_min, + sv_max, + ), + accl_constraints( + V, + RAW_ACCL, + v_switch, + a_max, + v_min, + v_max, + ), + ] + ) + # Corrected Actions STEER_VEL = u[0] ACCL = u[1] - f = np.asarray([ - V * np.cos(PSI), - V * np.sin(PSI), - STEER_VEL, - ACCL, - (V / lwb) * np.tan(DELTA), - ]) - + # system dynamics + f = np.array( + [ + V * np.cos(PSI), # X_DOT + V * np.sin(PSI), # Y_DOT + STEER_VEL, # DELTA_DOT + ACCL, # V_DOT + (V / lwb) * np.tan(DELTA), # PSI_DOT + ] + ) return f @njit(cache=True) -def vehicle_dynamics_ks_cog( - x: np.ndarray, - u_init: np.ndarray, - mu: float, - C_Sf: float, - C_Sr: float, - lf: float, - lr: float, - h: float, - m: float, - I: float, - s_min: float, - s_max: float, - sv_min: float, - sv_max: float, - v_switch: float, - a_max: float, - v_min: float, - v_max: float, - width: float, - length: float -) -> np.ndarray: +def vehicle_dynamics_ks_cog(x: np.ndarray, u_init: np.ndarray, params: np.ndarray) -> np.ndarray: + """ + Single Track Kinematic Vehicle Dynamics. + Follows https://gitlab.lrz.de/tum-cps/commonroad-vehicle-models/-/blob/master/vehicleModels_commonRoad.pdf, section 5 + + Args: + x (numpy.ndarray (5, )): vehicle state vector (x0, x1, x2, x3, x4) + x0: x position in global coordinates + x1: y position in global coordinates + x2: steering angle of front wheels + x3: velocity in x direction + x4: yaw angle + u (numpy.ndarray (2, )): control input vector (u1, u2) + u1: steering angle velocity of front wheels + u2: longitudinal acceleration + params (dict): dictionary containing the following parameters: + mu (float): friction coefficient + C_Sf (float): cornering stiffness of front wheels + C_Sr (float): cornering stiffness of rear wheels + lf (float): distance from center of gravity to front axle + lr (float): distance from center of gravity to rear axle + h (float): height of center of gravity + m (float): mass of vehicle + I (float): moment of inertia of vehicle, about Z axis + s_min (float): minimum steering angle + s_max (float): maximum steering angle + sv_min (float): minimum steering velocity + sv_max (float): maximum steering velocity + v_switch (float): velocity above which the acceleration is no longer able to create wheel slip + a_max (float): maximum allowed acceleration + v_min (float): minimum allowed velocity + v_max (float): maximum allowed velocity + + Returns: + f (numpy.ndarray): right hand side of differential equations + """ # Controls X = x[0] Y = x[1] DELTA = x[2] V = x[3] PSI = x[4] - + # Raw Actions RAW_STEER_VEL = u_init[0] RAW_ACCL = u_init[1] - + + # mu = params[0] + # C_Sf = params[1] # front tire cornering stiffness [N/rad] CF + # C_Sr = params[2] # rear tire cornering stiffness [N/rad] CR + lf = params[3] # distance from spring mass center of gravity to front axle [m] LENA + lr = params[4] # distance from spring mass center of gravity to rear axle [m] LENB + # h = params[5] # M_s center of gravity above ground [m] HS + # m = params[6] # vehicle mass [kg] MASS + # I = params[7] # moment of inertia for sprung mass in yaw [kg m^2] IZZ + s_min = params[8] # minimum steering angle [rad] + s_max = params[9] # maximum steering angle [rad] + sv_min = params[10] # minimum steering velocity [rad/s] + sv_max = params[11] # maximum steering velocity [rad/s] + v_switch = params[12] # switching velocity [m/s] + a_max = params[13] # maximum absolute acceleration [m/s^2] + v_min = params[14] # minimum velocity [m/s] + v_max = params[15] # maximum velocity [m/s] + # wheelbase lwb = lf + lr - - u = [ - steering_constraint(DELTA, RAW_STEER_VEL, s_min, s_max, sv_min, sv_max), - accl_constraints(V, RAW_ACCL, v_switch, a_max, v_min, v_max) - ] - - beta = np.arctan(np.tan(DELTA) * lr / lwb) - - f = np.asarray([ + # constraints + u = np.array( + [ + steering_constraint( + DELTA, + RAW_STEER_VEL, + s_min, + s_max, + sv_min, + sv_max, + ), + accl_constraints( + V, + RAW_ACCL, + v_switch, + a_max, + v_min, + v_max, + ), + ] + ) + # slip angle (beta) from vehicle kinematics + beta = np.arctan(np.tan(x[2]) * lr / lwb) + + # system dynamics + f = [ V * np.cos(beta + PSI), V * np.sin(beta + PSI), u[0], u[1], V * np.cos(beta) * np.tan(DELTA) / lwb, - ]) + ] return f - @njit(cache=True) def get_standardized_state_ks(x: np.ndarray) -> np.ndarray: - """[X,Y,Steering_Angle,Speed,YAW,YAW_RATE,V_Y]""" - return np.asarray([x[0], x[1], x[2], x[3], x[4], 0.0, 0.0, 0.0]) + """[X,Y,Steering_Angle,Speed,YAW,YAW_RATE,SPLIP_ANGLE]""" + return np.asarray([x[0], x[1], x[2], x[3], x[4], 0.0, 0.0]) diff --git a/f1tenth_gym/envs/dynamic_models/multi_body/__init__.py b/f1tenth_gym/envs/dynamic_models/multi_body/__init__.py index 40d6db10..6d07b0e9 100644 --- a/f1tenth_gym/envs/dynamic_models/multi_body/__init__.py +++ b/f1tenth_gym/envs/dynamic_models/multi_body/__init__.py @@ -8,7 +8,7 @@ from .multi_body import vehicle_dynamics_mb, get_standardized_state_mb -def init_mb(init_state, params: dict) -> np.ndarray: +def init_mb(init_state, params) -> np.ndarray: # init_MB - generates the initial state vector for the multi-body model # # Syntax: @@ -32,24 +32,24 @@ def init_mb(init_state, params: dict) -> np.ndarray: ### Parameters ## steering constraints - s_min = params["s_min"] # minimum steering angle [rad] - s_max = params["s_max"] # maximum steering angle [rad] + s_min = params[8] # minimum steering angle [rad] + s_max = params[9] # maximum steering angle [rad] ## longitudinal constraints - v_min = params["v_min"] # minimum velocity [m/s] - v_max = params["v_max"] # minimum velocity [m/s] + v_min = params[14] # minimum velocity [m/s] + v_max = params[15] # maximum velocity [m/s] ## masses - m_s = params["m_s"] # sprung mass [kg] SMASS - m_uf = params["m_uf"] # unsprung mass front [kg] UMASSF - m_ur = params["m_ur"] # unsprung mass rear [kg] UMASSR + m_s = params[22] # sprung mass [kg] + m_uf = params[23] # front unsprung mass [kg] + m_ur = params[24] # rear unsprung mass [kg] ## axes distances - lf = params["lf"] + lf = params[3] # distance from spring mass center of gravity to front axle [m] LENA - lr = params["lr"] + lr = params[4] # distance from spring mass center of gravity to rear axle [m] LENB ## geometric parameters - K_zt = params["K_zt"] # vertical spring rate of tire [N/m] TSPRINGR - R_w = params["R_w"] + K_zt = params[39] # vertical spring rate of tire [N/m] TSPRINGR + R_w = params[48] # effective wheel/tire radius chosen as tire rolling radius RR taken from ADAMS documentation [m] # create equivalent bicycle parameters g = 9.81 # [m/s^2] diff --git a/f1tenth_gym/envs/dynamic_models/multi_body/multi_body.py b/f1tenth_gym/envs/dynamic_models/multi_body/multi_body.py index a4ef6c8f..f6934c50 100644 --- a/f1tenth_gym/envs/dynamic_models/multi_body/multi_body.py +++ b/f1tenth_gym/envs/dynamic_models/multi_body/multi_body.py @@ -13,708 +13,9 @@ from ..kinematic import vehicle_dynamics_ks_cog -# def vehicle_dynamics_mb_new(x: np.ndarray, u_init: np.ndarray, params: dict): -# """ -# vehicleDynamics_mb - multi-body vehicle dynamics based on the DoT (department of transportation) vehicle dynamics -# reference point: center of mass - -# Syntax: -# f = vehicleDynamics_mb(x,u,p) - -# Inputs: -# :param x: vehicle state vector -# :param uInit: vehicle input vector -# :param params: vehicle parameter vector - -# Outputs: -# :return f: right-hand side of differential equations -# """ - -# # ------------- BEGIN CODE -------------- - -# # set gravity constant -# g = 9.81 # [m/s^2] - -# # states -# # x0 = x-position in a global coordinate system -# # x1 = y-position in a global coordinate system -# # x2 = steering angle of front wheels -# # x3 = velocity in x-direction -# # x4 = yaw angle -# # x5 = yaw rate - -# # x6 = roll angle -# # x7 = roll rate -# # x8 = pitch angle -# # x9 = pitch rate -# # x10 = velocity in y-direction -# # x11 = z-position -# # x12 = velocity in z-direction - -# # x13 = roll angle front -# # x14 = roll rate front -# # x15 = velocity in y-direction front -# # x16 = z-position front -# # x17 = velocity in z-direction front - -# # x18 = roll angle rear -# # x19 = roll rate rear -# # x20 = velocity in y-direction rear -# # x21 = z-position rear -# # x22 = velocity in z-direction rear - -# # x23 = left front wheel angular speed -# # x24 = right front wheel angular speed -# # x25 = left rear wheel angular speed -# # x26 = right rear wheel angular speed - -# # x27 = delta_y_f -# # x28 = delta_y_r - -# # u0 = steering angle velocity of front wheels -# # u1 = acceleration - -# u = np.zeros_like(u_init) - -# # vehicle body dimensions -# length = params["length"] # vehicle length [m] -# width = params["width"] # vehicle width [m] - -# # steering constraints -# # s_min = params["s_min"] # minimum steering angle [rad] -# # s_max = params["s_max"] # maximum steering angle [rad] -# # sv_min = params["sv_min"] # minimum steering velocity [rad/s] -# # sv_max = params["sv_max"] # maximum steering velocity [rad/s] - -# # longitudinal constraints -# # v_min = params["v_min"] # minimum velocity [m/s] -# # v_max = params["v_max"] # minimum velocity [m/s] -# # v_switch = params["v_switch"] # switching velocity [m/s] -# # a_max = params["a_max"] # maximum absolute acceleration [m/s^2] - -# # # masses -# # m = params["m"] # vehicle mass [kg] MASS -# # m_s = params["m_s"] # sprung mass [kg] SMASS -# # m_uf = params["m_uf"] # unsprung mass front [kg] UMASSF -# # m_ur = params["m_ur"] # unsprung mass rear [kg] UMASSR - -# # # axes distances -# # lf = params["lf"] -# # # distance from spring mass center of gravity to front axle [m] LENA -# # lr = params["lf"] -# # # distance from spring mass center of gravity to rear axle [m] LENB - -# # # moments of inertia of sprung mass -# # I_Phi_s = params["I_Phi_s"] -# # # moment of inertia for sprung mass in roll [kg m^2] IXS -# # I_y_s = params["I_y_s"] # moment of inertia for sprung mass in pitch [kg m^2] IYS -# # I_z = params["I_z"] # moment of inertia for sprung mass in yaw [kg m^2] IZZ -# # I_xz_s = params["I_xz_s"] # moment of inertia cross product [kg m^2] IXZ - -# # # suspension parameters -# # K_sf = params["K_sf"] # suspension spring rate (front) [N/m] KSF -# # K_sdf = params["K_sdf"] # suspension damping rate (front) [N s/m] KSDF -# # K_sr = params["K_sr"] # suspension spring rate (rear) [N/m] KSR -# # K_sdr = params["K_sdr"] # suspension damping rate (rear) [N s/m] KSDR - -# # # geometric parameters -# # T_f = params["T_f"] # track width front [m] TRWF -# # T_r = params["T_r"] # track width rear [m] TRWB -# # K_ras = params["K_ras"] -# # # lateral spring rate at compliant compliant pin joint between M_s and M_u [N/m] KRAS - -# # K_tsf = params["K_tsf"] -# # # auxiliary torsion roll stiffness per axle (normally negative) (front) [N m/rad] KTSF -# # K_tsr = params["K_tsr"] -# # # auxiliary torsion roll stiffness per axle (normally negative) (rear) [N m/rad] KTSR -# # K_rad = params["K_rad"] -# # # damping rate at compliant compliant pin joint between M_s and M_u [N s/m] KRADP -# # K_zt = params["K_zt"] # vertical spring rate of tire [N/m] TSPRINGR - -# # h_cg = params["h_cg"] -# # # center of gravity height of total mass [m] HCG (mainly required for conversion to other vehicle models) -# # h_raf = params["h_raf"] # height of roll axis above ground (front) [m] HRAF -# # h_rar = params["h_rar"] # height of roll axis above ground (rear) [m] HRAR - -# # h_s = params["h_s"] # M_s center of gravity above ground [m] HS - -# # I_uf = params["I_uf"] -# # # moment of inertia for unsprung mass about x-axis (front) [kg m^2] IXUF -# # I_ur = params["I_ur"] -# # # moment of inertia for unsprung mass about x-axis (rear) [kg m^2] IXUR -# # I_y_w = params["I_y_w"] -# # # wheel inertia, from internet forum for 235/65 R 17 [kg m^2] - -# # K_lt = params["K_lt"] -# # # lateral compliance rate of tire, wheel, and suspension, per tire [m/N] KLT -# # R_w = params["R_w"] -# # # effective wheel/tire radius chosen as tire rolling radius RR taken from ADAMS documentation [m] - -# # # split of brake and engine torque -# # T_sb = params["T_sb"] -# # T_se = params["T_se"] - -# # # suspension parameters -# # D_f = params["D_f"] # [rad/m] DF -# # D_r = params["D_r"] # [rad/m] DR -# # E_f = params["E_f"] # [needs conversion if nonzero] EF -# # E_r = params["E_r"] # [needs conversion if nonzero] ER - -# KIN_THRESH = 0.5 - -# # consider steering and acceleration constraints - outside of the integration -# u[0] = steering_constraint( -# x[2], -# u_init[0], -# params["s_min"], -# params["s_max"], -# params["sv_min"], -# params["sv_max"], -# ) -# u[1] = accl_constraints( -# x[3], -# u_init[1], -# params["v_switch"], -# params["a_max"], -# params["v_min"], -# params["v_max"], -# ) - -# if abs(x[3]) < KIN_THRESH: -# beta = 0.0 -# else: -# beta = np.arctan(x[10] / x[3]) -# vel = np.sqrt(x[3] ** 2 + x[10] ** 2) - -# # vertical tire forces -# F_z_LF = ( -# x[16] -# + params["R_w"] * (np.cos(x[13]) - 1) -# - 0.5 * params["T_f"] * np.sin(x[13]) -# ) * params["K_zt"] -# F_z_RF = ( -# x[16] -# + params["R_w"] * (np.cos(x[13]) - 1) -# + 0.5 * params["T_f"] * np.sin(x[13]) -# ) * params["K_zt"] -# F_z_LR = ( -# x[21] -# + params["R_w"] * (np.cos(x[18]) - 1) -# - 0.5 * params["T_r"] * np.sin(x[18]) -# ) * params["K_zt"] -# F_z_RR = ( -# x[21] -# + params["R_w"] * (np.cos(x[18]) - 1) -# + 0.5 * params["T_r"] * np.sin(x[18]) -# ) * params["K_zt"] - -# # obtain individual tire speeds -# u_w_lf = (x[3] + 0.5 * params["T_f"] * x[5]) * np.cos(x[2]) + ( -# x[10] + params["lf"] * x[5] -# ) * np.sin(x[2]) -# u_w_rf = (x[3] - 0.5 * params["T_f"] * x[5]) * np.cos(x[2]) + ( -# x[10] + params["lf"] * x[5] -# ) * np.sin(x[2]) -# u_w_lr = x[3] + 0.5 * params["T_r"] * x[5] -# u_w_rr = x[3] - 0.5 * params["T_r"] * x[5] - -# # negative wheel spin forbidden -# if u_w_lf < 0.0: -# u_w_lf *= 0 - -# if u_w_rf < 0.0: -# u_w_rf *= 0 - -# if u_w_lr < 0.0: -# u_w_lr *= 0 - -# if u_w_rr < 0.0: -# u_w_rr *= 0 -# # compute longitudinal slip -# # switch to kinematic model for small velocities -# if abs(x[3]) < KIN_THRESH: -# s_lf = 0.0 -# s_rf = 0.0 -# s_lr = 0.0 -# s_rr = 0.0 -# else: -# s_lf = 1 - params["R_w"] * x[23] / u_w_lf -# s_rf = 1 - params["R_w"] * x[24] / u_w_rf -# s_lr = 1 - params["R_w"] * x[25] / u_w_lr -# s_rr = 1 - params["R_w"] * x[26] / u_w_rr - -# # lateral slip angles -# # switch to kinematic model for small velocities -# if abs(x[3]) < KIN_THRESH: -# alpha_LF = 0.0 -# alpha_RF = 0.0 -# alpha_LR = 0.0 -# alpha_RR = 0.0 -# else: -# alpha_LF = ( -# np.arctan( -# (x[10] + params["lf"] * x[5] - x[14] * (params["R_w"] - x[16])) -# / (x[3] + 0.5 * params["T_f"] * x[5]) -# ) -# - x[2] -# ) -# alpha_RF = ( -# np.arctan( -# (x[10] + params["lf"] * x[5] - x[14] * (params["R_w"] - x[16])) -# / (x[3] - 0.5 * params["T_f"] * x[5]) -# ) -# - x[2] -# ) -# alpha_LR = np.arctan( -# (x[10] - params["lr"] * x[5] - x[19] * (params["R_w"] - x[21])) -# / (x[3] + 0.5 * params["T_r"] * x[5]) -# ) -# alpha_RR = np.arctan( -# (x[10] - params["lr"] * x[5] - x[19] * (params["R_w"] - x[21])) -# / (x[3] - 0.5 * params["T_r"] * x[5]) -# ) - -# # auxiliary suspension movement -# z_SLF = ( -# (params["h_s"] - params["R_w"] + x[16] - x[11]) / np.cos(x[6]) -# - params["h_s"] -# + params["R_w"] -# + params["lf"] * x[8] -# + 0.5 * (x[6] - x[13]) * params["T_f"] -# ) -# z_SRF = ( -# (params["h_s"] - params["R_w"] + x[16] - x[11]) / np.cos(x[6]) -# - params["h_s"] -# + params["R_w"] -# + params["lf"] * x[8] -# - 0.5 * (x[6] - x[13]) * params["T_f"] -# ) -# z_SLR = ( -# (params["h_s"] - params["R_w"] + x[21] - x[11]) / np.cos(x[6]) -# - params["h_s"] -# + params["R_w"] -# - params["lr"] * x[8] -# + 0.5 * (x[6] - x[18]) * params["T_r"] -# ) -# z_SRR = ( -# (params["h_s"] - params["R_w"] + x[21] - x[11]) / np.cos(x[6]) -# - params["h_s"] -# + params["R_w"] -# - params["lr"] * x[8] -# - 0.5 * (x[6] - x[18]) * params["T_r"] -# ) - -# dz_SLF = x[17] - x[12] + params["lf"] * x[9] + 0.5 * (x[7] - x[14]) * params["T_f"] -# dz_SRF = x[17] - x[12] + params["lf"] * x[9] - 0.5 * (x[7] - x[14]) * params["T_f"] -# dz_SLR = x[22] - x[12] - params["lr"] * x[9] + 0.5 * (x[7] - x[19]) * params["T_r"] -# dz_SRR = x[22] - x[12] - params["lr"] * x[9] - 0.5 * (x[7] - x[19]) * params["T_r"] - -# # camber angles -# gamma_LF = x[6] + params["D_f"] * z_SLF + params["E_f"] * (z_SLF) ** 2 -# gamma_RF = x[6] - params["D_f"] * z_SRF - params["E_f"] * (z_SRF) ** 2 -# gamma_LR = x[6] + params["D_r"] * z_SLR + params["E_r"] * (z_SLR) ** 2 -# gamma_RR = x[6] - params["D_r"] * z_SRR - params["E_r"] * (z_SRR) ** 2 - -# # compute longitudinal tire forces using the magic formula for pure slip -# F0_x_LF = formula_longitudinal(s_lf, gamma_LF, F_z_LF, params) -# F0_x_RF = formula_longitudinal(s_rf, gamma_RF, F_z_RF, params) -# F0_x_LR = formula_longitudinal(s_lr, gamma_LR, F_z_LR, params) -# F0_x_RR = formula_longitudinal(s_rr, gamma_RR, F_z_RR, params) - -# # compute lateral tire forces using the magic formula for pure slip -# res = formula_lateral(alpha_LF, gamma_LF, F_z_LF, params) -# F0_y_LF = res[0] -# mu_y_LF = res[1] -# res = formula_lateral(alpha_RF, gamma_RF, F_z_RF, params) -# F0_y_RF = res[0] -# mu_y_RF = res[1] -# res = formula_lateral(alpha_LR, gamma_LR, F_z_LR, params) -# F0_y_LR = res[0] -# mu_y_LR = res[1] -# res = formula_lateral(alpha_RR, gamma_RR, F_z_RR, params) -# F0_y_RR = res[0] -# mu_y_RR = res[1] - -# # compute longitudinal tire forces using the magic formula for combined slip -# F_x_LF = formula_longitudinal_comb(s_lf, alpha_LF, F0_x_LF, params) -# F_x_RF = formula_longitudinal_comb(s_rf, alpha_RF, F0_x_RF, params) -# F_x_LR = formula_longitudinal_comb(s_lr, alpha_LR, F0_x_LR, params) -# F_x_RR = formula_longitudinal_comb(s_rr, alpha_RR, F0_x_RR, params) - -# # compute lateral tire forces using the magic formula for combined slip -# F_y_LF = formula_lateral_comb( -# s_lf, alpha_LF, gamma_LF, mu_y_LF, F_z_LF, F0_y_LF, params -# ) -# F_y_RF = formula_lateral_comb( -# s_rf, alpha_RF, gamma_RF, mu_y_RF, F_z_RF, F0_y_RF, params -# ) -# F_y_LR = formula_lateral_comb( -# s_lr, alpha_LR, gamma_LR, mu_y_LR, F_z_LR, F0_y_LR, params -# ) -# F_y_RR = formula_lateral_comb( -# s_rr, alpha_RR, gamma_RR, mu_y_RR, F_z_RR, F0_y_RR, params -# ) - -# # auxiliary movements for compliant joint equations -# delta_z_f = params["h_s"] - params["R_w"] + x[16] - x[11] -# delta_z_r = params["h_s"] - params["R_w"] + x[21] - x[11] - -# delta_phi_f = x[6] - x[13] -# delta_phi_r = x[6] - x[18] - -# dot_delta_phi_f = x[7] - x[14] -# dot_delta_phi_r = x[7] - x[19] - -# dot_delta_z_f = x[17] - x[12] -# dot_delta_z_r = x[22] - x[12] - -# dot_delta_y_f = x[10] + params["lf"] * x[5] - x[15] -# dot_delta_y_r = x[10] - params["lr"] * x[5] - x[20] - -# delta_f = ( -# delta_z_f * np.sin(x[6]) -# - x[27] * np.cos(x[6]) -# - (params["h_raf"] - params["R_w"]) * np.sin(delta_phi_f) -# ) -# delta_r = ( -# delta_z_r * np.sin(x[6]) -# - x[28] * np.cos(x[6]) -# - (params["h_rar"] - params["R_w"]) * np.sin(delta_phi_r) -# ) - -# dot_delta_f = ( -# (delta_z_f * np.cos(x[6]) + x[27] * np.sin(x[6])) * x[7] -# + dot_delta_z_f * np.sin(x[6]) -# - dot_delta_y_f * np.cos(x[6]) -# - (params["h_raf"] - params["R_w"]) * np.cos(delta_phi_f) * dot_delta_phi_f -# ) -# dot_delta_r = ( -# (delta_z_r * np.cos(x[6]) + x[28] * np.sin(x[6])) * x[7] -# + dot_delta_z_r * np.sin(x[6]) -# - dot_delta_y_r * np.cos(x[6]) -# - (params["h_rar"] - params["R_w"]) * np.cos(delta_phi_r) * dot_delta_phi_r -# ) - -# # compliant joint forces -# F_RAF = delta_f * params["K_ras"] + dot_delta_f * params["K_rad"] -# F_RAR = delta_r * params["K_ras"] + dot_delta_r * params["K_rad"] - -# # auxiliary suspension forces (bump stop neglected squat/lift forces neglected) -# F_SLF = ( -# params["m_s"] * g * params["lr"] / (2 * (params["lf"] + params["lr"])) -# - z_SLF * params["K_sf"] -# - dz_SLF * params["K_sdf"] -# + (x[6] - x[13]) * params["K_tsf"] / params["T_f"] -# ) - -# F_SRF = ( -# params["m_s"] * g * params["lr"] / (2 * (params["lf"] + params["lr"])) -# - z_SRF * params["K_sf"] -# - dz_SRF * params["K_sdf"] -# - (x[6] - x[13]) * params["K_tsf"] / params["T_f"] -# ) - -# F_SLR = ( -# params["m_s"] * g * params["lf"] / (2 * (params["lf"] + params["lr"])) -# - z_SLR * params["K_sr"] -# - dz_SLR * params["K_sdr"] -# + (x[6] - x[18]) * params["K_tsr"] / params["T_r"] -# ) - -# F_SRR = ( -# params["m_s"] * g * params["lf"] / (2 * (params["lf"] + params["lr"])) -# - z_SRR * params["K_sr"] -# - dz_SRR * params["K_sdr"] -# - (x[6] - x[18]) * params["K_tsr"] / params["T_r"] -# ) - -# # auxiliary variables sprung mass -# sumX = ( -# F_x_LR -# + F_x_RR -# + (F_x_LF + F_x_RF) * np.cos(x[2]) -# - (F_y_LF + F_y_RF) * np.sin(x[2]) -# ) - -# sumN = ( -# (F_y_LF + F_y_RF) * params["lf"] * np.cos(x[2]) -# + (F_x_LF + F_x_RF) * params["lf"] * np.sin(x[2]) -# + (F_y_RF - F_y_LF) * 0.5 * params["T_f"] * np.sin(x[2]) -# + (F_x_LF - F_x_RF) * 0.5 * params["T_f"] * np.cos(x[2]) -# + (F_x_LR - F_x_RR) * 0.5 * params["T_r"] -# - (F_y_LR + F_y_RR) * params["lr"] -# ) - -# sumY_s = (F_RAF + F_RAR) * np.cos(x[6]) + (F_SLF + F_SLR + F_SRF + F_SRR) * np.sin( -# x[6] -# ) - -# sumL = ( -# 0.5 * F_SLF * params["T_f"] -# + 0.5 * F_SLR * params["T_r"] -# - 0.5 * F_SRF * params["T_f"] -# - 0.5 * F_SRR * params["T_r"] -# - F_RAF -# / np.cos(x[6]) -# * ( -# params["h_s"] -# - x[11] -# - params["R_w"] -# + x[16] -# - (params["h_raf"] - params["R_w"]) * np.cos(x[13]) -# ) -# - F_RAR -# / np.cos(x[6]) -# * ( -# params["h_s"] -# - x[11] -# - params["R_w"] -# + x[21] -# - (params["h_rar"] - params["R_w"]) * np.cos(x[18]) -# ) -# ) - -# sumZ_s = (F_SLF + F_SLR + F_SRF + F_SRR) * np.cos(x[6]) - (F_RAF + F_RAR) * np.sin( -# x[6] -# ) - -# sumM_s = ( -# params["lf"] * (F_SLF + F_SRF) -# - params["lr"] * (F_SLR + F_SRR) -# + ( -# (F_x_LF + F_x_RF) * np.cos(x[2]) -# - (F_y_LF + F_y_RF) * np.sin(x[2]) -# + F_x_LR -# + F_x_RR -# ) -# * (params["h_s"] - x[11]) -# ) - -# # auxiliary variables unsprung mass -# sumL_uf = ( -# 0.5 * F_SRF * params["T_f"] -# - 0.5 * F_SLF * params["T_f"] -# - F_RAF * (params["h_raf"] - params["R_w"]) -# + F_z_LF -# * ( -# params["R_w"] * np.sin(x[13]) -# + 0.5 * params["T_f"] * np.cos(x[13]) -# - params["K_lt"] * F_y_LF -# ) -# - F_z_RF -# * ( -# -params["R_w"] * np.sin(x[13]) -# + 0.5 * params["T_f"] * np.cos(x[13]) -# + params["K_lt"] * F_y_RF -# ) -# - ((F_y_LF + F_y_RF) * np.cos(x[2]) + (F_x_LF + F_x_RF) * np.sin(x[2])) -# * (params["R_w"] - x[16]) -# ) - -# sumL_ur = ( -# 0.5 * F_SRR * params["T_r"] -# - 0.5 * F_SLR * params["T_r"] -# - F_RAR * (params["h_rar"] - params["R_w"]) -# + F_z_LR -# * ( -# params["R_w"] * np.sin(x[18]) -# + 0.5 * params["T_r"] * np.cos(x[18]) -# - params["K_lt"] * F_y_LR -# ) -# - F_z_RR -# * ( -# -params["R_w"] * np.sin(x[18]) -# + 0.5 * params["T_r"] * np.cos(x[18]) -# + params["K_lt"] * F_y_RR -# ) -# - (F_y_LR + F_y_RR) * (params["R_w"] - x[21]) -# ) - -# sumZ_uf = F_z_LF + F_z_RF + F_RAF * np.sin(x[6]) - (F_SLF + F_SRF) * np.cos(x[6]) - -# sumZ_ur = F_z_LR + F_z_RR + F_RAR * np.sin(x[6]) - (F_SLR + F_SRR) * np.cos(x[6]) - -# sumY_uf = ( -# (F_y_LF + F_y_RF) * np.cos(x[2]) -# + (F_x_LF + F_x_RF) * np.sin(x[2]) -# - F_RAF * np.cos(x[6]) -# - (F_SLF + F_SRF) * np.sin(x[6]) -# ) - -# sumY_ur = (F_y_LR + F_y_RR) - F_RAR * np.cos(x[6]) - (F_SLR + F_SRR) * np.sin(x[6]) - -# # dynamics common with single-track model -# f = np.zeros(29) # init 'right hand side' -# # switch to kinematic model for small velocities -# if abs(x[3]) < KIN_THRESH: -# # wheelbase -# # lwb = lf + lr - -# # system dynamics -# # x_ks = [x[0], x[1], x[2], x[3], x[4]] -# # f_ks = vehicle_dynamics_ks(x_ks, u, p) -# # f.extend(f_ks) -# # f.append(u[1]*lwb*np.tan(x[2]) + x[3]/(lwb*np.cos(x[2])**2)*u[0]) - -# # Use kinematic model with reference point at center of mass -# # wheelbase -# lwb = params["lf"] + params["lr"] -# # system dynamics -# x_ks = [x[0], x[1], x[2], x[3], x[4]] -# # kinematic model -# f_ks = vehicle_dynamics_ks_cog(np.array(x_ks), u, params['mu'], -# params['C_Sf'], -# params['C_Sr'], -# params['lf'], -# params['lr'], -# params['h'], -# params['m'], -# params['I'], -# params['s_min'], -# params['s_max'], -# params['sv_min'], -# params['sv_max'], -# params['v_switch'], -# params['a_max'], -# params['v_min'], -# params['v_max'], -# params['width'], -# params['length']) -# f[0:5] = np.array([f_ks[0], f_ks[1], f_ks[2], f_ks[3], f_ks[4]]) -# # derivative of slip angle and yaw rate -# d_beta = (params["lr"] * u[0]) / ( -# lwb -# * np.cos(x[2]) ** 2 -# * (1 + (np.tan(x[2]) ** 2 * params["lr"] / lwb) ** 2) -# ) -# dd_psi = ( -# 1 -# / lwb -# * ( -# u[1] * np.cos(x[6]) * np.tan(x[2]) -# - x[3] * np.sin(x[6]) * d_beta * np.tan(x[2]) -# + x[3] * np.cos(x[6]) * u[0] / np.cos(x[2]) ** 2 -# ) -# ) -# f[5] = dd_psi - -# else: -# f[0] = np.cos(beta + x[4]) * vel -# f[1] = np.sin(beta + x[4]) * vel -# f[2] = u[0] -# f[3] = 1 / params["m"] * sumX + x[5] * x[10] -# f[4] = x[5] -# f[5] = ( -# 1 -# / (params["I_z"] - (params["I_xz_s"]) ** 2 / params["I_Phi_s"]) -# * (sumN + params["I_xz_s"] / params["I_Phi_s"] * sumL) -# ) - -# # remaining sprung mass dynamics -# f[6] = x[7] -# f[7] = ( -# 1 -# / (params["I_Phi_s"] - (params["I_xz_s"]) ** 2 / params["I_z"]) -# * (params["I_xz_s"] / params["I_z"] * sumN + sumL) -# ) -# f[8] = x[9] -# f[9] = 1 / params["I_y_s"] * sumM_s -# f[10] = 1 / params["m_s"] * sumY_s - x[5] * x[3] -# f[11] = x[12] -# f[12] = g - 1 / params["m_s"] * sumZ_s - -# # unsprung mass dynamics (front) -# f[13] = x[14] -# f[14] = 1 / params["I_uf"] * sumL_uf -# f[15] = 1 / params["m_uf"] * sumY_uf - x[5] * x[3] -# f[16] = x[17] -# f[17] = g - 1 / params["m_uf"] * sumZ_uf - -# # unsprung mass dynamics (rear) -# f[18] = x[19] -# f[19] = 1 / params["I_ur"] * sumL_ur -# f[20] = 1 / params["m_ur"] * sumY_ur - x[5] * x[3] -# f[21] = x[22] -# f[22] = g - 1 / params["m_ur"] * sumZ_ur - -# # convert acceleration input to brake and engine torque -# if u[1] > 0: -# T_B = 0.0 -# T_E = params["m"] * params["R_w"] * u[1] -# else: -# T_B = params["m"] * params["R_w"] * u[1] -# T_E = 0.0 - -# # wheel dynamics (T new parameter for torque splitting) -# f[23] = ( -# 1 -# / params["I_y_w"] -# * ( -# -params["R_w"] * F_x_LF -# + 0.5 * params["T_sb"] * T_B -# + 0.5 * params["T_se"] * T_E -# ) -# ) -# f[24] = ( -# 1 -# / params["I_y_w"] -# * ( -# -params["R_w"] * F_x_RF -# + 0.5 * params["T_sb"] * T_B -# + 0.5 * params["T_se"] * T_E -# ) -# ) -# f[25] = ( -# 1 -# / params["I_y_w"] -# * ( -# -params["R_w"] * F_x_LR -# + 0.5 * (1 - params["T_sb"]) * T_B -# + 0.5 * (1 - params["T_se"]) * T_E -# ) -# ) -# f[26] = ( -# 1 -# / params["I_y_w"] -# * ( -# -params["R_w"] * F_x_RR -# + 0.5 * (1 - params["T_sb"]) * T_B -# + 0.5 * (1 - params["T_se"]) * T_E -# ) -# ) - -# # negative wheel spin forbidden -# for iState in range(23, 27): -# if x[iState] < 0.0: -# x[iState] = 0.0 -# f[iState] = 0.0 - -# # compliant joint equations -# f[27] = dot_delta_y_f -# f[28] = dot_delta_y_r - -# return f -sequential_param_keys = ['length', 'width', 's_min', 's_max', 'sv_min', - 'sv_max', 'v_min', 'v_max', 'v_switch', 'a_max', - 'm', 'm_s', 'm_uf', 'm_ur', 'lf', 'lr', 'I_Phi_s', - 'I_y_s', 'I_z', 'I_xz_s', 'K_sf', 'K_sdf', 'K_sr', - 'K_sdr', 'T_f', 'T_r', 'K_ras', 'K_tsf', 'K_tsr', - 'K_rad', 'K_zt', 'h_cg', 'h_raf', 'h_rar', 'h_s', - 'I_uf', 'I_ur', 'I_y_w', 'K_lt', 'R_w', 'T_sb', - 'T_se', 'D_f', 'D_r', 'E_f', 'E_r', 'tire_p_cx1', - 'tire_p_dx1', 'tire_p_dx3', 'tire_p_ex1', 'tire_p_kx1', - 'tire_p_hx1', 'tire_p_vx1', 'tire_r_bx1', 'tire_r_bx2', - 'tire_r_cx1', 'tire_r_ex1', 'tire_r_hx1', 'tire_p_cy1', - 'tire_p_dy1', 'tire_p_dy3', 'tire_p_ey1', 'tire_p_ky1', - 'tire_p_hy1', 'tire_p_hy3', 'tire_p_vy1', 'tire_p_vy3', - 'tire_r_by1', 'tire_r_by2', 'tire_r_by3', 'tire_r_cy1', - 'tire_r_ey1', 'tire_r_hy1', 'tire_r_vy1', 'tire_r_vy3', - 'tire_r_vy4', 'tire_r_vy5', 'tire_r_vy6'] - -@njit(cache=True) -def vehicle_dynamics_mb(x, u_init, params): +def vehicle_dynamics_mb(x: np.ndarray, u_init: np.ndarray, params: np.ndarray) -> np.ndarray: """ - vehicleDynamics_mb - multi-body vehicle dynamics based on the DOT (department of transportation) vehicle dynamics + vehicleDynamics_mb - multi-body vehicle dynamics based on the DoT (department of transportation) vehicle dynamics reference point: center of mass Syntax: @@ -727,214 +28,298 @@ def vehicle_dynamics_mb(x, u_init, params): Outputs: :return f: right-hand side of differential equations - - Author: Matthias Althoff - Written: 05-January-2017 - Last update: 17-December-2017 - Last revision: --- """ - KIN_THRESH = 0.5 - use_kinematic = abs(x[3]) < KIN_THRESH - #------------- BEGIN CODE -------------- + + # ------------- BEGIN CODE -------------- # set gravity constant - g = 9.81 #[m/s^2] - - #states - #x1 = x-position in a global coordinate system - #x2 = y-position in a global coordinate system - #x3 = steering angle of front wheels - #x4 = velocity in x-direction - #x5 = yaw angle - #x6 = yaw rate - - #x7 = roll angle - #x8 = roll rate - #x9 = pitch angle - #x10 = pitch rate - #x11 = velocity in y-direction - #x12 = z-position - #x13 = velocity in z-direction - - #x14 = roll angle front - #x15 = roll rate front - #x16 = velocity in y-direction front - #x17 = z-position front - #x18 = velocity in z-direction front - - #x19 = roll angle rear - #x20 = roll rate rear - #x21 = velocity in y-direction rear - #x22 = z-position rear - #x23 = velocity in z-direction rear - - #x24 = left front wheel angular speed - #x25 = right front wheel angular speed - #x26 = left rear wheel angular speed - #x27 = right rear wheel angular speed - - #x28 = delta_y_f - #x29 = delta_y_r - - #u1 = steering angle velocity of front wheels - #u2 = acceleration - - # vehicle body dimensions - length = params[0] # vehicle length [m] - width = params[1] # vehicle width [m] - - # steering constraints - s_min = params[2] # minimum steering angle [rad] - s_max = params[3] # maximum steering angle [rad] - sv_min = params[4] # minimum steering velocity [rad/s] - sv_max = params[5] # maximum steering velocity [rad/s] - - # longitudinal constraints - v_min = params[6] # minimum velocity [m/s] - v_max = params[7] # minimum velocity [m/s] - v_switch = params[8] # switching velocity [m/s] - a_max = params[9] # maximum absolute acceleration [m/s^2] - - # masses - m = params[10] # vehicle mass [kg] MASS - m_s = params[11] # sprung mass [kg] SMASS - m_uf = params[12] # unsprung mass front [kg] UMASSF - m_ur = params[13] # unsprung mass rear [kg] UMASSR - - # axes distances - lf = params[14] # distance from spring mass center of gravity to front axle [m] LENA - lr = params[15] # distance from spring mass center of gravity to rear axle [m] LENB - - # moments of inertia of sprung mass - I_Phi_s = params[16] # moment of inertia for sprung mass in roll [kg m^2] IXS - I_y_s = params[17] # moment of inertia for sprung mass in pitch [kg m^2] IYS - I_z = params[18] # moment of inertia for sprung mass in yaw [kg m^2] IZZ - I_xz_s = params[19] # moment of inertia cross product [kg m^2] IXZ - - # suspension parameters - K_sf = params[20] # suspension spring rate (front) [N/m] KSF - K_sdf = params[21] # suspension damping rate (front) [N s/m] KSDF - K_sr = params[22] # suspension spring rate (rear) [N/m] KSR - K_sdr = params[23] # suspension damping rate (rear) [N s/m] KSDR - - # geometric parameters - T_f = params[24] # track width front [m] TRWF - T_r = params[25] # track width rear [m] TRWB - K_ras = params[26] # lateral spring rate at compliant compliant pin joint between M_s and M_u [N/m] KRAS - - K_tsf = params[27] # auxiliary torsion roll stiffness per axle (normally negative) (front) [N m/rad] KTSF - K_tsr = params[28] # auxiliary torsion roll stiffness per axle (normally negative) (rear) [N m/rad] KTSR - K_rad = params[29] # damping rate at compliant compliant pin joint between M_s and M_u [N s/m] KRADP - K_zt = params[30] # vertical spring rate of tire [N/m] TSPRINGR - - h_cg = params[31] # center of gravity height of total mass [m] HCG (mainly required for conversion to other vehicle models) - h_raf = params[32] # height of roll axis above ground (front) [m] HRAF - h_rar = params[33] # height of roll axis above ground (rear) [m] HRAR - - h_s = params[34] # M_s center of gravity above ground [m] HS - - I_uf = params[35] # moment of inertia for unsprung mass about x-axis (front) [kg m^2] IXUF - I_ur = params[36] # moment of inertia for unsprung mass about x-axis (rear) [kg m^2] IXUR - I_y_w = params[37] # wheel inertia, from internet forum for 235/65 R 17 [kg m^2] - - K_lt = params[38] # lateral compliance rate of tire, wheel, and suspension, per tire [m/N] KLT - R_w = params[39] # effective wheel/tire radius chosen as tire rolling radius RR taken from ADAMS documentation [m] - - # split of brake and engine torque - T_sb = params[40] - T_se = params[41] - - # suspension parameters - D_f = params[42] # [rad/m] DF - D_r = params[43] # [rad/m] DR - E_f = params[44] # [needs conversion if nonzero] EF - E_r = params[45] # [needs conversion if nonzero] ER + g = 9.81 # [m/s^2] + + # states + # x0 = x-position in a global coordinate system + # x1 = y-position in a global coordinate system + # x2 = steering angle of front wheels + # x3 = velocity in x-direction + # x4 = yaw angle + # x5 = yaw rate + + # x6 = roll angle + # x7 = roll rate + # x8 = pitch angle + # x9 = pitch rate + # x10 = velocity in y-direction + # x11 = z-position + # x12 = velocity in z-direction + + # x13 = roll angle front + # x14 = roll rate front + # x15 = velocity in y-direction front + # x16 = z-position front + # x17 = velocity in z-direction front + + # x18 = roll angle rear + # x19 = roll rate rear + # x20 = velocity in y-direction rear + # x21 = z-position rear + # x22 = velocity in z-direction rear + + # x23 = left front wheel angular speed + # x24 = right front wheel angular speed + # x25 = left rear wheel angular speed + # x26 = right rear wheel angular speed + + # x27 = delta_y_f + # x28 = delta_y_r + + # u0 = steering angle velocity of front wheels + # u1 = acceleration + + u = np.zeros_like(u_init) + + mu = params[0] # lateral friction coefficient + C_Sf = params[1] # front tire cornering stiffness [N/rad] + C_Sr = params[2] # rear tire cornering stiffness [N/rad] + lf = params[3] # distance from CoG to front axle [m] + lr = params[4] # distance from CoG to rear axle [m] + h = params[5] # CoG height of total mass above ground [m] + m = params[6] # total vehicle mass [kg] + I = params[7] # moment of inertia in yaw [kg m^2] + + # Steering constraints + s_min = params[8] # minimum steering angle [rad] + s_max = params[9] # maximum steering angle [rad] + sv_min = params[10] # minimum steering velocity [rad/s] + sv_max = params[11] # maximum steering velocity [rad/s] + + # Longitudinal constraints + v_switch = params[12] # switching velocity [m/s] + a_max = params[13] # maximum absolute acceleration [m/s^2] + v_min = params[14] # minimum velocity [m/s] + v_max = params[15] # maximum velocity [m/s] + + # Vehicle geometry + width = params[16] # vehicle width [m] + length = params[17] # vehicle length [m] + + # Curvature and jerk constraints + kappa_dot_max = params[18] # max curvature rate [1/s] + kappa_dot_dot_max = params[19] # max curvature acceleration [1/s^2] + j_max = params[20] # max longitudinal jerk [m/s^3] + j_dot_max = params[21] # max change in jerk [m/s^4] + + # Mass breakdown + m_s = params[22] # sprung mass [kg] + m_uf = params[23] # front unsprung mass [kg] + m_ur = params[24] # rear unsprung mass [kg] + + # Sprung mass inertia + I_Phi_s = params[25] # roll inertia of sprung mass [kg m^2] + I_y_s = params[26] # pitch inertia of sprung mass [kg m^2] + I_z = params[27] # yaw inertia of sprung mass [kg m^2] + I_xz_s = params[28] # cross-product inertia [kg m^2] + + # Suspension spring/damping + K_sf = params[29] # front suspension spring rate [N/m] + K_sdf = params[30] # front suspension damping [N·s/m] + K_sr = params[31] # rear suspension spring rate [N/m] + K_sdr = params[32] # rear suspension damping [N·s/m] + + # Track widths and compliant joints + T_f = params[33] # front track width [m] + T_r = params[34] # rear track width [m] + K_ras = params[35] # lateral spring rate at pin joint [N/m] + K_tsf = params[36] # front torsion roll stiffness [N·m/rad] + K_tsr = params[37] # rear torsion roll stiffness [N·m/rad] + K_rad = params[38] # damping rate at pin joint [N·s/m] + K_zt = params[39] # vertical tire spring rate [N/m] + + # CoG and roll axis heights + h_cg = params[40] # center of gravity height of total mass [m] + h_raf = params[41] # roll axis front height [m] + h_rar = params[42] # roll axis rear height [m] + h_s = params[43] # sprung mass CoG height [m] + + # Unsprung mass inertias + I_uf = params[44] # front unsprung inertia [kg m^2] + I_ur = params[45] # rear unsprung inertia [kg m^2] + + # Wheel and compliance + I_y_w = params[46] # wheel rotational inertia [kg m^2] + K_lt = params[47] # lateral compliance rate [m/N] + R_w = params[48] # wheel/tire effective radius [m] + + # Torque splits + T_sb = params[49] # brake torque split + T_se = params[50] # engine torque split + + # Suspension toe parameters + D_f = params[51] # front toe compliance [rad/m] + D_r = params[52] # rear toe compliance [rad/m] + E_f = params[53] # front compliance nonlinearity + E_r = params[54] # rear compliance nonlinearity + KIN_THRESH = 0.5 # consider steering and acceleration constraints - outside of the integration - # u = np.array([steering_constraint(x[2], u_init[0], s_min, s_max, sv_min, sv_max), accl_constraints(x[3], u_init[1], v_switch, a_max, v_min, v_max)]) + u[0] = steering_constraint( + x[2], + u_init[0], + s_min, + s_max, + sv_min, + sv_max, + ) + u[1] = accl_constraints( + x[3], + u_init[1], + v_switch, + a_max, + v_min, + v_max, + ) - #compute slip angle at cg - outside of the integration - # switch to kinematic model for small velocities handeled outside - u = np.array([steering_constraint(x[2], u_init[0], s_min, s_max, sv_min, sv_max), - accl_constraints(x[3], u_init[1], v_switch, a_max, v_min, v_max)]) - - - if use_kinematic: - beta = 0. + if abs(x[3]) < KIN_THRESH: + beta = 0.0 else: - beta = np.arctan(x[10]/x[3]) - vel = np.sqrt(x[3]**2 + x[10]**2) - - #vertical tire forces - F_z_LF = (x[16] + R_w*(np.cos(x[13]) - 1) - 0.5*T_f*np.sin(x[13]))*K_zt - F_z_RF = (x[16] + R_w*(np.cos(x[13]) - 1) + 0.5*T_f*np.sin(x[13]))*K_zt - F_z_LR = (x[21] + R_w*(np.cos(x[18]) - 1) - 0.5*T_r*np.sin(x[18]))*K_zt - F_z_RR = (x[21] + R_w*(np.cos(x[18]) - 1) + 0.5*T_r*np.sin(x[18]))*K_zt - - #obtain individual tire speeds - u_w_lf = (x[3] + 0.5*T_f*x[5])*np.cos(x[2]) + (x[10] + lf*x[5])*np.sin(x[2]) - u_w_rf = (x[3] - 0.5*T_f*x[5])*np.cos(x[2]) + (x[10] + lf*x[5])*np.sin(x[2]) - u_w_lr = x[3] + 0.5*T_r*x[5] - u_w_rr = x[3] - 0.5*T_r*x[5] - - #negative wheel spin forbidden - u_w_lf = np.maximum(u_w_lf, 0.0) - u_w_rf = np.maximum(u_w_rf, 0.0) - u_w_lr = np.maximum(u_w_lr, 0.0) - u_w_rr = np.maximum(u_w_rr, 0.0) - - #compute longitudinal slip - #switch to kinematic model for small velocities - if use_kinematic: - s_lf = 0. - s_rf = 0. - s_lr = 0. - s_rr = 0. + beta = np.arctan(x[10] / x[3]) + vel = np.sqrt(x[3] ** 2 + x[10] ** 2) + + # vertical tire forces + F_z_LF = ( + x[16] + + R_w * (np.cos(x[13]) - 1) + - 0.5 * T_f * np.sin(x[13]) + ) * K_zt + F_z_RF = ( + x[16] + + R_w * (np.cos(x[13]) - 1) + + 0.5 * T_f * np.sin(x[13]) + ) * K_zt + F_z_LR = ( + x[21] + + R_w * (np.cos(x[18]) - 1) + - 0.5 * T_r * np.sin(x[18]) + ) * K_zt + F_z_RR = ( + x[21] + + R_w * (np.cos(x[18]) - 1) + + 0.5 * T_r * np.sin(x[18]) + ) * K_zt + + # obtain individual tire speeds + u_w_lf = (x[3] + 0.5 * T_f * x[5]) * np.cos(x[2]) + ( + x[10] + lf * x[5] + ) * np.sin(x[2]) + u_w_rf = (x[3] - 0.5 * T_f * x[5]) * np.cos(x[2]) + ( + x[10] + lf * x[5] + ) * np.sin(x[2]) + u_w_lr = x[3] + 0.5 * T_r * x[5] + u_w_rr = x[3] - 0.5 * T_r * x[5] + + # negative wheel spin forbidden + if u_w_lf < 0.0: + u_w_lf *= 0 + + if u_w_rf < 0.0: + u_w_rf *= 0 + + if u_w_lr < 0.0: + u_w_lr *= 0 + + if u_w_rr < 0.0: + u_w_rr *= 0 + # compute longitudinal slip + # switch to kinematic model for small velocities + if abs(x[3]) < KIN_THRESH: + s_lf = 0.0 + s_rf = 0.0 + s_lr = 0.0 + s_rr = 0.0 else: - s_lf = 1 - R_w*x[23]/u_w_lf - s_rf = 1 - R_w*x[24]/u_w_rf - s_lr = 1 - R_w*x[25]/u_w_lr - s_rr = 1 - R_w*x[26]/u_w_rr - + s_lf = 1 - R_w * x[23] / u_w_lf + s_rf = 1 - R_w * x[24] / u_w_rf + s_lr = 1 - R_w * x[25] / u_w_lr + s_rr = 1 - R_w * x[26] / u_w_rr - #lateral slip angles - #switch to kinematic model for small velocities - if use_kinematic: - alpha_LF = 0. - alpha_RF = 0. - alpha_LR = 0. - alpha_RR = 0. + # lateral slip angles + # switch to kinematic model for small velocities + if abs(x[3]) < KIN_THRESH: + alpha_LF = 0.0 + alpha_RF = 0.0 + alpha_LR = 0.0 + alpha_RR = 0.0 else: - alpha_LF = np.arctan((x[10] + lf*x[5] - x[14]*(R_w - x[16]))/(x[3] + 0.5*T_f*x[5])) - x[2] - alpha_RF = np.arctan((x[10] + lf*x[5] - x[14]*(R_w - x[16]))/(x[3] - 0.5*T_f*x[5])) - x[2] - alpha_LR = np.arctan((x[10] - lr*x[5] - x[19]*(R_w - x[21]))/(x[3] + 0.5*T_r*x[5])) - alpha_RR = np.arctan((x[10] - lr*x[5] - x[19]*(R_w - x[21]))/(x[3] - 0.5*T_r*x[5])) - - #auxiliary suspension movement - z_SLF = (h_s - R_w + x[16] - x[11])/np.cos(x[6]) - h_s + R_w + lf*x[8] + 0.5*(x[6] - x[13])*T_f - z_SRF = (h_s - R_w + x[16] - x[11])/np.cos(x[6]) - h_s + R_w + lf*x[8] - 0.5*(x[6] - x[13])*T_f - z_SLR = (h_s - R_w + x[21] - x[11])/np.cos(x[6]) - h_s + R_w - lr*x[8] + 0.5*(x[6] - x[18])*T_r - z_SRR = (h_s - R_w + x[21] - x[11])/np.cos(x[6]) - h_s + R_w - lr*x[8] - 0.5*(x[6] - x[18])*T_r - - dz_SLF = x[17] - x[12] + lf*x[9] + 0.5*(x[7] - x[14])*T_f - dz_SRF = x[17] - x[12] + lf*x[9] - 0.5*(x[7] - x[14])*T_f - dz_SLR = x[22] - x[12] - lr*x[9] + 0.5*(x[7] - x[19])*T_r - dz_SRR = x[22] - x[12] - lr*x[9] - 0.5*(x[7] - x[19])*T_r - - #camber angles - gamma_LF = x[6] + D_f*z_SLF + E_f*(z_SLF)**2 - gamma_RF = x[6] - D_f*z_SRF - E_f*(z_SRF)**2 - gamma_LR = x[6] + D_r*z_SLR + E_r*(z_SLR)**2 - gamma_RR = x[6] - D_r*z_SRR - E_r*(z_SRR)**2 + alpha_LF = ( + np.arctan( + (x[10] + lf * x[5] - x[14] * (R_w - x[16])) + / (x[3] + 0.5 * T_f * x[5]) + ) + - x[2] + ) + alpha_RF = ( + np.arctan( + (x[10] + lf * x[5] - x[14] * (R_w - x[16])) + / (x[3] - 0.5 * T_f * x[5]) + ) + - x[2] + ) + alpha_LR = np.arctan( + (x[10] - lr * x[5] - x[19] * (R_w - x[21])) + / (x[3] + 0.5 * T_r * x[5]) + ) + alpha_RR = np.arctan( + (x[10] - lr * x[5] - x[19] * (R_w - x[21])) + / (x[3] - 0.5 * T_r * x[5]) + ) + + # auxiliary suspension movement + z_SLF = ( + (h_s - R_w + x[16] - x[11]) / np.cos(x[6]) + - h_s + + R_w + + lf * x[8] + + 0.5 * (x[6] - x[13]) * T_f + ) + z_SRF = ( + (h_s - R_w + x[16] - x[11]) / np.cos(x[6]) + - h_s + + R_w + + lf * x[8] + - 0.5 * (x[6] - x[13]) * T_f + ) + z_SLR = ( + (h_s - R_w + x[21] - x[11]) / np.cos(x[6]) + - h_s + + R_w + - lr * x[8] + + 0.5 * (x[6] - x[18]) * T_r + ) + z_SRR = ( + (h_s - R_w + x[21] - x[11]) / np.cos(x[6]) + - h_s + + R_w + - lr * x[8] + - 0.5 * (x[6] - x[18]) * T_r + ) + + dz_SLF = x[17] - x[12] + lf * x[9] + 0.5 * (x[7] - x[14]) * T_f + dz_SRF = x[17] - x[12] + lf * x[9] - 0.5 * (x[7] - x[14]) * T_f + dz_SLR = x[22] - x[12] - lr * x[9] + 0.5 * (x[7] - x[19]) * T_r + dz_SRR = x[22] - x[12] - lr * x[9] - 0.5 * (x[7] - x[19]) * T_r - #compute longitudinal tire forces using the magic formula for pure slip + # camber angles + gamma_LF = x[6] + D_f * z_SLF + E_f * (z_SLF) ** 2 + gamma_RF = x[6] - D_f * z_SRF - E_f * (z_SRF) ** 2 + gamma_LR = x[6] + D_r * z_SLR + E_r * (z_SLR) ** 2 + gamma_RR = x[6] - D_r * z_SRR - E_r * (z_SRR) ** 2 + + # compute longitudinal tire forces using the magic formula for pure slip F0_x_LF = formula_longitudinal(s_lf, gamma_LF, F_z_LF, params) F0_x_RF = formula_longitudinal(s_rf, gamma_RF, F_z_RF, params) F0_x_LR = formula_longitudinal(s_lr, gamma_LR, F_z_LR, params) F0_x_RR = formula_longitudinal(s_rr, gamma_RR, F_z_RR, params) - - #compute lateral tire forces using the magic formula for pure slip + + # compute lateral tire forces using the magic formula for pure slip res = formula_lateral(alpha_LF, gamma_LF, F_z_LF, params) F0_y_LF = res[0] mu_y_LF = res[1] @@ -948,19 +333,27 @@ def vehicle_dynamics_mb(x, u_init, params): F0_y_RR = res[0] mu_y_RR = res[1] - #compute longitudinal tire forces using the magic formula for combined slip + # compute longitudinal tire forces using the magic formula for combined slip F_x_LF = formula_longitudinal_comb(s_lf, alpha_LF, F0_x_LF, params) F_x_RF = formula_longitudinal_comb(s_rf, alpha_RF, F0_x_RF, params) F_x_LR = formula_longitudinal_comb(s_lr, alpha_LR, F0_x_LR, params) F_x_RR = formula_longitudinal_comb(s_rr, alpha_RR, F0_x_RR, params) - #compute lateral tire forces using the magic formula for combined slip - F_y_LF = formula_lateral_comb(s_lf, alpha_LF, gamma_LF, mu_y_LF, F_z_LF, F0_y_LF, params) - F_y_RF = formula_lateral_comb(s_rf, alpha_RF, gamma_RF, mu_y_RF, F_z_RF, F0_y_RF, params) - F_y_LR = formula_lateral_comb(s_lr, alpha_LR, gamma_LR, mu_y_LR, F_z_LR, F0_y_LR, params) - F_y_RR = formula_lateral_comb(s_rr, alpha_RR, gamma_RR, mu_y_RR, F_z_RR, F0_y_RR, params) - - #auxiliary movements for compliant joint equations + # compute lateral tire forces using the magic formula for combined slip + F_y_LF = formula_lateral_comb( + s_lf, alpha_LF, gamma_LF, mu_y_LF, F_z_LF, F0_y_LF, params + ) + F_y_RF = formula_lateral_comb( + s_rf, alpha_RF, gamma_RF, mu_y_RF, F_z_RF, F0_y_RF, params + ) + F_y_LR = formula_lateral_comb( + s_lr, alpha_LR, gamma_LR, mu_y_LR, F_z_LR, F0_y_LR, params + ) + F_y_RR = formula_lateral_comb( + s_rr, alpha_RR, gamma_RR, mu_y_RR, F_z_RR, F0_y_RR, params + ) + + # auxiliary movements for compliant joint equations delta_z_f = h_s - R_w + x[16] - x[11] delta_z_r = h_s - R_w + x[21] - x[11] @@ -973,72 +366,185 @@ def vehicle_dynamics_mb(x, u_init, params): dot_delta_z_f = x[17] - x[12] dot_delta_z_r = x[22] - x[12] - dot_delta_y_f = x[10] + lf*x[5] - x[15] - dot_delta_y_r = x[10] - lr*x[5] - x[20] + dot_delta_y_f = x[10] + lf * x[5] - x[15] + dot_delta_y_r = x[10] - lr * x[5] - x[20] - delta_f = delta_z_f*np.sin(x[6]) - x[27]*np.cos(x[6]) - (h_raf - R_w)*np.sin(delta_phi_f) - delta_r = delta_z_r*np.sin(x[6]) - x[28]*np.cos(x[6]) - (h_rar - R_w)*np.sin(delta_phi_r) + delta_f = ( + delta_z_f * np.sin(x[6]) + - x[27] * np.cos(x[6]) + - (h_raf - R_w) * np.sin(delta_phi_f) + ) + delta_r = ( + delta_z_r * np.sin(x[6]) + - x[28] * np.cos(x[6]) + - (h_rar - R_w) * np.sin(delta_phi_r) + ) - dot_delta_f = (delta_z_f*np.cos(x[6]) + x[27]*np.sin(x[6]))*x[7] + dot_delta_z_f*np.sin(x[6]) - dot_delta_y_f*np.cos(x[6]) - (h_raf - R_w)*np.cos(delta_phi_f)*dot_delta_phi_f - dot_delta_r = (delta_z_r*np.cos(x[6]) + x[28]*np.sin(x[6]))*x[7] + dot_delta_z_r*np.sin(x[6]) - dot_delta_y_r*np.cos(x[6]) - (h_rar - R_w)*np.cos(delta_phi_r)*dot_delta_phi_r + dot_delta_f = ( + (delta_z_f * np.cos(x[6]) + x[27] * np.sin(x[6])) * x[7] + + dot_delta_z_f * np.sin(x[6]) + - dot_delta_y_f * np.cos(x[6]) + - (h_raf - R_w) * np.cos(delta_phi_f) * dot_delta_phi_f + ) + dot_delta_r = ( + (delta_z_r * np.cos(x[6]) + x[28] * np.sin(x[6])) * x[7] + + dot_delta_z_r * np.sin(x[6]) + - dot_delta_y_r * np.cos(x[6]) + - (h_rar - R_w) * np.cos(delta_phi_r) * dot_delta_phi_r + ) - #compliant joint forces - F_RAF = delta_f*K_ras + dot_delta_f*K_rad - F_RAR = delta_r*K_ras + dot_delta_r*K_rad - - #auxiliary suspension forces (bump stop neglected squat/lift forces neglected) - F_SLF = m_s*g*lr/(2*(lf+lr)) - z_SLF*K_sf - dz_SLF*K_sdf + (x[6] - x[13])*K_tsf/T_f + # compliant joint forces + F_RAF = delta_f * K_ras + dot_delta_f * K_rad + F_RAR = delta_r * K_ras + dot_delta_r * K_rad - F_SRF = m_s*g*lr/(2*(lf+lr)) - z_SRF*K_sf - dz_SRF*K_sdf - (x[6] - x[13])*K_tsf/T_f + # auxiliary suspension forces (bump stop neglected squat/lift forces neglected) + F_SLF = ( + m_s * g * lr / (2 * (lf + lr)) + - z_SLF * K_sf + - dz_SLF * K_sdf + + (x[6] - x[13]) * K_tsf / T_f + ) - F_SLR = m_s*g*lf/(2*(lf+lr)) - z_SLR*K_sr - dz_SLR*K_sdr + (x[6] - x[18])*K_tsr/T_r + F_SRF = ( + m_s * g * lr / (2 * (lf + lr)) + - z_SRF * K_sf + - dz_SRF * K_sdf + - (x[6] - x[13]) * K_tsf / T_f + ) - F_SRR = m_s*g*lf/(2*(lf+lr)) - z_SRR*K_sr - dz_SRR*K_sdr - (x[6] - x[18])*K_tsr/T_r + F_SLR = ( + m_s * g * lf / (2 * (lf + lr)) + - z_SLR * K_sr + - dz_SLR * K_sdr + + (x[6] - x[18]) * K_tsr / T_r + ) - #auxiliary variables sprung mass - sumX = F_x_LR + F_x_RR + (F_x_LF + F_x_RF)*np.cos(x[2]) - (F_y_LF + F_y_RF)*np.sin(x[2]) + F_SRR = ( + m_s * g * lf / (2 * (lf + lr)) + - z_SRR * K_sr + - dz_SRR * K_sdr + - (x[6] - x[18]) * K_tsr / T_r + ) - sumN = (F_y_LF + F_y_RF)*lf*np.cos(x[2]) + (F_x_LF + F_x_RF)*lf*np.sin(x[2]) \ - + (F_y_RF - F_y_LF)*0.5*T_f*np.sin(x[2]) + (F_x_LF - F_x_RF)*0.5*T_f*np.cos(x[2]) \ - + (F_x_LR - F_x_RR)*0.5*T_r - (F_y_LR + F_y_RR)*lr + # auxiliary variables sprung mass + sumX = ( + F_x_LR + + F_x_RR + + (F_x_LF + F_x_RF) * np.cos(x[2]) + - (F_y_LF + F_y_RF) * np.sin(x[2]) + ) - sumY_s = (F_RAF + F_RAR)*np.cos(x[6]) + (F_SLF + F_SLR + F_SRF + F_SRR)*np.sin(x[6]) + sumN = ( + (F_y_LF + F_y_RF) * lf * np.cos(x[2]) + + (F_x_LF + F_x_RF) * lf * np.sin(x[2]) + + (F_y_RF - F_y_LF) * 0.5 * T_f * np.sin(x[2]) + + (F_x_LF - F_x_RF) * 0.5 * T_f * np.cos(x[2]) + + (F_x_LR - F_x_RR) * 0.5 * T_r + - (F_y_LR + F_y_RR) * lr + ) - sumL = 0.5*F_SLF*T_f + 0.5*F_SLR*T_r - 0.5*F_SRF*T_f - 0.5*F_SRR*T_r \ - - F_RAF/np.cos(x[6])*(h_s - x[11] - R_w + x[16] - (h_raf - R_w)*np.cos(x[13])) \ - - F_RAR/np.cos(x[6])*(h_s - x[11] - R_w + x[21] - (h_rar - R_w)*np.cos(x[18])) + sumY_s = (F_RAF + F_RAR) * np.cos(x[6]) + (F_SLF + F_SLR + F_SRF + F_SRR) * np.sin( + x[6] + ) - sumZ_s = (F_SLF + F_SLR + F_SRF + F_SRR)*np.cos(x[6]) - (F_RAF + F_RAR)*np.sin(x[6]) + sumL = ( + 0.5 * F_SLF * T_f + + 0.5 * F_SLR * T_r + - 0.5 * F_SRF * T_f + - 0.5 * F_SRR * T_r + - F_RAF + / np.cos(x[6]) + * ( + h_s + - x[11] + - R_w + + x[16] + - (h_raf - R_w) * np.cos(x[13]) + ) + - F_RAR + / np.cos(x[6]) + * ( + h_s + - x[11] + - R_w + + x[21] + - (h_rar - R_w) * np.cos(x[18]) + ) + ) - sumM_s = lf*(F_SLF + F_SRF) - lr*(F_SLR + F_SRR) + ((F_x_LF + F_x_RF)*np.cos(x[2]) \ - - (F_y_LF + F_y_RF)*np.sin(x[2]) + F_x_LR + F_x_RR)*(h_s - x[11]) + sumZ_s = (F_SLF + F_SLR + F_SRF + F_SRR) * np.cos(x[6]) - (F_RAF + F_RAR) * np.sin( + x[6] + ) - #auxiliary variables unsprung mass - sumL_uf = 0.5*F_SRF*T_f - 0.5*F_SLF*T_f - F_RAF*(h_raf - R_w) \ - + F_z_LF*(R_w*np.sin(x[13]) + 0.5*T_f*np.cos(x[13]) - K_lt*F_y_LF) \ - - F_z_RF*(-R_w*np.sin(x[13]) + 0.5*T_f*np.cos(x[13]) + K_lt*F_y_RF) \ - - ((F_y_LF + F_y_RF)*np.cos(x[2]) + (F_x_LF + F_x_RF)*np.sin(x[2]))*(R_w - x[16]) + sumM_s = ( + lf * (F_SLF + F_SRF) + - lr * (F_SLR + F_SRR) + + ( + (F_x_LF + F_x_RF) * np.cos(x[2]) + - (F_y_LF + F_y_RF) * np.sin(x[2]) + + F_x_LR + + F_x_RR + ) + * (h_s - x[11]) + ) - sumL_ur = 0.5*F_SRR*T_r - 0.5*F_SLR*T_r - F_RAR*(h_rar - R_w) \ - + F_z_LR*(R_w*np.sin(x[18]) + 0.5*T_r*np.cos(x[18]) - K_lt*F_y_LR) \ - - F_z_RR*(-R_w*np.sin(x[18]) + 0.5*T_r*np.cos(x[18]) + K_lt*F_y_RR) \ - - (F_y_LR + F_y_RR)*(R_w - x[21]) + # auxiliary variables unsprung mass + sumL_uf = ( + 0.5 * F_SRF * T_f + - 0.5 * F_SLF * T_f + - F_RAF * (h_raf - R_w) + + F_z_LF + * ( + R_w * np.sin(x[13]) + + 0.5 * T_f * np.cos(x[13]) + - K_lt * F_y_LF + ) + - F_z_RF + * ( + -R_w * np.sin(x[13]) + + 0.5 * T_f * np.cos(x[13]) + + K_lt * F_y_RF + ) + - ((F_y_LF + F_y_RF) * np.cos(x[2]) + (F_x_LF + F_x_RF) * np.sin(x[2])) + * (R_w - x[16]) + ) - sumZ_uf = F_z_LF + F_z_RF + F_RAF*np.sin(x[6]) - (F_SLF + F_SRF)*np.cos(x[6]) + sumL_ur = ( + 0.5 * F_SRR * T_r + - 0.5 * F_SLR * T_r + - F_RAR * (h_rar - R_w) + + F_z_LR + * ( + R_w * np.sin(x[18]) + + 0.5 * T_r * np.cos(x[18]) + - K_lt * F_y_LR + ) + - F_z_RR + * ( + -R_w * np.sin(x[18]) + + 0.5 * T_r * np.cos(x[18]) + + K_lt * F_y_RR + ) + - (F_y_LR + F_y_RR) * (R_w - x[21]) + ) - sumZ_ur = F_z_LR + F_z_RR + F_RAR*np.sin(x[6]) - (F_SLR + F_SRR)*np.cos(x[6]) + sumZ_uf = F_z_LF + F_z_RF + F_RAF * np.sin(x[6]) - (F_SLF + F_SRF) * np.cos(x[6]) - sumY_uf = (F_y_LF + F_y_RF)*np.cos(x[2]) + (F_x_LF + F_x_RF)*np.sin(x[2]) \ - - F_RAF*np.cos(x[6]) - (F_SLF + F_SRF)*np.sin(x[6]) + sumZ_ur = F_z_LR + F_z_RR + F_RAR * np.sin(x[6]) - (F_SLR + F_SRR) * np.cos(x[6]) - sumY_ur = (F_y_LR + F_y_RR) \ - - F_RAR*np.cos(x[6]) - (F_SLR + F_SRR)*np.sin(x[6]) + sumY_uf = ( + (F_y_LF + F_y_RF) * np.cos(x[2]) + + (F_x_LF + F_x_RF) * np.sin(x[2]) + - F_RAF * np.cos(x[6]) + - (F_SLF + F_SRF) * np.sin(x[6]) + ) + sumY_ur = (F_y_LR + F_y_RR) - F_RAR * np.cos(x[6]) - (F_SLR + F_SRR) * np.sin(x[6]) # dynamics common with single-track model - f = np.zeros((29,))# init 'right hand side' + f = np.zeros(29) # init 'right hand side' # switch to kinematic model for small velocities - if use_kinematic: + if abs(x[3]) < KIN_THRESH: # wheelbase # lwb = lf + lr @@ -1051,53 +557,66 @@ def vehicle_dynamics_mb(x, u_init, params): # Use kinematic model with reference point at center of mass # wheelbase lwb = lf + lr - # system dynamics - x_ks = x[0:5] + x_ks = [x[0], x[1], x[2], x[3], x[4]] # kinematic model - # f_ks = vehicle_dynamics_ks_cog(x_ks, u, p) - # f = [f_ks[0], f_ks[1], f_ks[2], f_ks[3], f_ks[4]] # 1 2 3 4 5 - f_ks = vehicle_dynamics_ks_cog(x_ks, u, 0., 0., 0., lf, lr, 0., 0., 0., s_min, s_max, sv_min, sv_max, v_switch, a_max, v_min, v_max, 0., 0.) - f[0:5] = f_ks + f_ks = vehicle_dynamics_ks_cog(np.array(x_ks), u, params) + f[0:5] = np.array([f_ks[0], f_ks[1], f_ks[2], f_ks[3], f_ks[4]]) # derivative of slip angle and yaw rate - d_beta = (lr * u[0]) / (lwb * np.cos(x[2]) ** 2 * (1 + (np.tan(x[2]) ** 2 * lr / lwb) ** 2)) - dd_psi = 1 / lwb * (u[1] * np.cos(x[6]) * np.tan(x[2]) - - x[3] * np.sin(x[6]) * d_beta * np.tan(x[2]) + - x[3] * np.cos(x[6]) * u[0] / np.cos(x[2]) ** 2) - # f.append(dd_psi) # 6 + d_beta = (lr * u[0]) / ( + lwb + * np.cos(x[2]) ** 2 + * (1 + (np.tan(x[2]) ** 2 * lr / lwb) ** 2) + ) + dd_psi = ( + 1 + / lwb + * ( + u[1] * np.cos(x[6]) * np.tan(x[2]) + - x[3] * np.sin(x[6]) * d_beta * np.tan(x[2]) + + x[3] * np.cos(x[6]) * u[0] / np.cos(x[2]) ** 2 + ) + ) f[5] = dd_psi else: - f[0] = np.cos(beta + x[4])*vel # 1 - f[1] = np.sin(beta + x[4])*vel # 2 - f[2] = u[0] # 3 - f[3] = 1/m*sumX + x[5]*x[10] # 4 - f[4] = x[5] # 5 - f[5] = 1/(I_z - (I_xz_s)**2/I_Phi_s)*(sumN + I_xz_s/I_Phi_s*sumL) # 6 - + f[0] = np.cos(beta + x[4]) * vel + f[1] = np.sin(beta + x[4]) * vel + f[2] = u[0] + f[3] = 1 / m * sumX + x[5] * x[10] + f[4] = x[5] + f[5] = ( + 1 + / (I_z - (I_xz_s) ** 2 / I_Phi_s) + * (sumN + I_xz_s / I_Phi_s * sumL) + ) # remaining sprung mass dynamics - f[6] = x[7] # 7 - f[7] = 1/(I_Phi_s - (I_xz_s)**2/I_z)*(I_xz_s/I_z*sumN + sumL) # 8 - f[8] = x[9] # 9 - f[9] = 1/I_y_s*sumM_s # 10 - f[10] = 1/m_s*sumY_s - x[5]*x[3] # 11 - f[11] = x[12] # 12 - f[12] = g - 1/m_s*sumZ_s # 13 - - #unsprung mass dynamics (front) - f[13] = x[14] # 14 - f[14] = 1/I_uf*sumL_uf # 15 - f[15] = 1/m_uf*sumY_uf - x[5]*x[3] # 16 - f[16] = x[17] # 17 - f[17] = g - 1/m_uf*sumZ_uf # 18 - - #unsprung mass dynamics (rear) - f[18] = x[19] # 19 - f[19] = 1/I_ur*sumL_ur # 20 - f[20] = 1/m_ur*sumY_ur - x[5]*x[3] # 21 - f[21] = x[22] # 22 - f[22] = g - 1/m_ur*sumZ_ur # 23 + f[6] = x[7] + f[7] = ( + 1 + / (I_Phi_s - (I_xz_s) ** 2 / I_z) + * (I_xz_s / I_z * sumN + sumL) + ) + f[8] = x[9] + f[9] = 1 / I_y_s * sumM_s + f[10] = 1 / m_s * sumY_s - x[5] * x[3] + f[11] = x[12] + f[12] = g - 1 / m_s * sumZ_s + + # unsprung mass dynamics (front) + f[13] = x[14] + f[14] = 1 / I_uf * sumL_uf + f[15] = 1 / m_uf * sumY_uf - x[5] * x[3] + f[16] = x[17] + f[17] = g - 1 / m_uf * sumZ_uf + + # unsprung mass dynamics (rear) + f[18] = x[19] + f[19] = 1 / I_ur * sumL_ur + f[20] = 1 / m_ur * sumY_ur - x[5] * x[3] + f[21] = x[22] + f[22] = g - 1 / m_ur * sumZ_ur # convert acceleration input to brake and engine torque if u[1] > 0: @@ -1107,7 +626,7 @@ def vehicle_dynamics_mb(x, u_init, params): T_B = m * R_w * u[1] T_E = 0.0 - #wheel dynamics (p.T new parameter for torque splitting) - splitting for brake/drive torque is outside of the integration + # wheel dynamics (T new parameter for torque splitting) f[23] = ( 1 / I_y_w @@ -1145,33 +664,497 @@ def vehicle_dynamics_mb(x, u_init, params): ) ) - #negative wheel spin forbidden handeled outside of this function + # negative wheel spin forbidden for iState in range(23, 27): if x[iState] < 0.0: x[iState] = 0.0 f[iState] = 0.0 - #compliant joint equations - f[27] = dot_delta_y_f # 28 - f[28] = dot_delta_y_r # 29 - - # longitudinal slip - # s_lf - # s_rf - # s_lr - # s_rr - - # lateral slip - # alpha_LF - # alpha_RF - # alpha_LR - # alpha_RR - - # return f, F_x_LF, F_x_RF, F_x_LR, F_x_RR, F_y_LF, F_y_RF, F_y_LR, F_y_RR, \ - # s_lf, s_rf, s_lr, s_rr, alpha_LF, alpha_RF, alpha_LR, alpha_RR, \ - # F_z_LF, F_z_RF, F_z_LR, F_z_RR + # compliant joint equations + f[27] = dot_delta_y_f + f[28] = dot_delta_y_r + return f +## Old stuff, not used anymore +# sequential_param_keys = ['length', 'width', 's_min', 's_max', 'sv_min', +# 'sv_max', 'v_min', 'v_max', 'v_switch', 'a_max', +# 'm', 'm_s', 'm_uf', 'm_ur', 'lf', 'lr', 'I_Phi_s', +# 'I_y_s', 'I_z', 'I_xz_s', 'K_sf', 'K_sdf', 'K_sr', +# 'K_sdr', 'T_f', 'T_r', 'K_ras', 'K_tsf', 'K_tsr', +# 'K_rad', 'K_zt', 'h_cg', 'h_raf', 'h_rar', 'h_s', +# 'I_uf', 'I_ur', 'I_y_w', 'K_lt', 'R_w', 'T_sb', +# 'T_se', 'D_f', 'D_r', 'E_f', 'E_r', 'tire_p_cx1', +# 'tire_p_dx1', 'tire_p_dx3', 'tire_p_ex1', 'tire_p_kx1', +# 'tire_p_hx1', 'tire_p_vx1', 'tire_r_bx1', 'tire_r_bx2', +# 'tire_r_cx1', 'tire_r_ex1', 'tire_r_hx1', 'tire_p_cy1', +# 'tire_p_dy1', 'tire_p_dy3', 'tire_p_ey1', 'tire_p_ky1', +# 'tire_p_hy1', 'tire_p_hy3', 'tire_p_vy1', 'tire_p_vy3', +# 'tire_r_by1', 'tire_r_by2', 'tire_r_by3', 'tire_r_cy1', +# 'tire_r_ey1', 'tire_r_hy1', 'tire_r_vy1', 'tire_r_vy3', +# 'tire_r_vy4', 'tire_r_vy5', 'tire_r_vy6'] + +# @njit(cache=True) +# def vehicle_dynamics_mb(x, u_init, params): +# """ +# vehicleDynamics_mb - multi-body vehicle dynamics based on the DOT (department of transportation) vehicle dynamics +# reference point: center of mass + +# Syntax: +# f = vehicleDynamics_mb(x,u,p) + +# Inputs: +# :param x: vehicle state vector +# :param uInit: vehicle input vector +# :param params: vehicle parameter vector + +# Outputs: +# :return f: right-hand side of differential equations + +# Author: Matthias Althoff +# Written: 05-January-2017 +# Last update: 17-December-2017 +# Last revision: --- +# """ +# KIN_THRESH = 0.5 +# use_kinematic = abs(x[3]) < KIN_THRESH +# #------------- BEGIN CODE -------------- + +# # set gravity constant +# g = 9.81 #[m/s^2] + +# #states +# #x1 = x-position in a global coordinate system +# #x2 = y-position in a global coordinate system +# #x3 = steering angle of front wheels +# #x4 = velocity in x-direction +# #x5 = yaw angle +# #x6 = yaw rate + +# #x7 = roll angle +# #x8 = roll rate +# #x9 = pitch angle +# #x10 = pitch rate +# #x11 = velocity in y-direction +# #x12 = z-position +# #x13 = velocity in z-direction + +# #x14 = roll angle front +# #x15 = roll rate front +# #x16 = velocity in y-direction front +# #x17 = z-position front +# #x18 = velocity in z-direction front + +# #x19 = roll angle rear +# #x20 = roll rate rear +# #x21 = velocity in y-direction rear +# #x22 = z-position rear +# #x23 = velocity in z-direction rear + +# #x24 = left front wheel angular speed +# #x25 = right front wheel angular speed +# #x26 = left rear wheel angular speed +# #x27 = right rear wheel angular speed + +# #x28 = delta_y_f +# #x29 = delta_y_r + +# #u1 = steering angle velocity of front wheels +# #u2 = acceleration + +# # vehicle body dimensions +# length = params[0] # vehicle length [m] +# width = params[1] # vehicle width [m] + +# # steering constraints +# s_min = params[2] # minimum steering angle [rad] +# s_max = params[3] # maximum steering angle [rad] +# sv_min = params[4] # minimum steering velocity [rad/s] +# sv_max = params[5] # maximum steering velocity [rad/s] + +# # longitudinal constraints +# v_min = params[6] # minimum velocity [m/s] +# v_max = params[7] # minimum velocity [m/s] +# v_switch = params[8] # switching velocity [m/s] +# a_max = params[9] # maximum absolute acceleration [m/s^2] + +# # masses +# m = params[10] # vehicle mass [kg] MASS +# m_s = params[11] # sprung mass [kg] SMASS +# m_uf = params[12] # unsprung mass front [kg] UMASSF +# m_ur = params[13] # unsprung mass rear [kg] UMASSR + +# # axes distances +# lf = params[14] # distance from spring mass center of gravity to front axle [m] LENA +# lr = params[15] # distance from spring mass center of gravity to rear axle [m] LENB + +# # moments of inertia of sprung mass +# I_Phi_s = params[16] # moment of inertia for sprung mass in roll [kg m^2] IXS +# I_y_s = params[17] # moment of inertia for sprung mass in pitch [kg m^2] IYS +# I_z = params[18] # moment of inertia for sprung mass in yaw [kg m^2] IZZ +# I_xz_s = params[19] # moment of inertia cross product [kg m^2] IXZ + +# # suspension parameters +# K_sf = params[20] # suspension spring rate (front) [N/m] KSF +# K_sdf = params[21] # suspension damping rate (front) [N s/m] KSDF +# K_sr = params[22] # suspension spring rate (rear) [N/m] KSR +# K_sdr = params[23] # suspension damping rate (rear) [N s/m] KSDR + +# # geometric parameters +# T_f = params[24] # track width front [m] TRWF +# T_r = params[25] # track width rear [m] TRWB +# K_ras = params[26] # lateral spring rate at compliant compliant pin joint between M_s and M_u [N/m] KRAS + +# K_tsf = params[27] # auxiliary torsion roll stiffness per axle (normally negative) (front) [N m/rad] KTSF +# K_tsr = params[28] # auxiliary torsion roll stiffness per axle (normally negative) (rear) [N m/rad] KTSR +# K_rad = params[29] # damping rate at compliant compliant pin joint between M_s and M_u [N s/m] KRADP +# K_zt = params[30] # vertical spring rate of tire [N/m] TSPRINGR + +# h_cg = params[31] # center of gravity height of total mass [m] HCG (mainly required for conversion to other vehicle models) +# h_raf = params[32] # height of roll axis above ground (front) [m] HRAF +# h_rar = params[33] # height of roll axis above ground (rear) [m] HRAR + +# h_s = params[34] # M_s center of gravity above ground [m] HS + +# I_uf = params[35] # moment of inertia for unsprung mass about x-axis (front) [kg m^2] IXUF +# I_ur = params[36] # moment of inertia for unsprung mass about x-axis (rear) [kg m^2] IXUR +# I_y_w = params[37] # wheel inertia, from internet forum for 235/65 R 17 [kg m^2] + +# K_lt = params[38] # lateral compliance rate of tire, wheel, and suspension, per tire [m/N] KLT +# R_w = params[39] # effective wheel/tire radius chosen as tire rolling radius RR taken from ADAMS documentation [m] + +# # split of brake and engine torque +# T_sb = params[40] +# T_se = params[41] + +# # suspension parameters +# D_f = params[42] # [rad/m] DF +# D_r = params[43] # [rad/m] DR +# E_f = params[44] # [needs conversion if nonzero] EF +# E_r = params[45] # [needs conversion if nonzero] ER + + +# # consider steering and acceleration constraints - outside of the integration +# # u = np.array([steering_constraint(x[2], u_init[0], s_min, s_max, sv_min, sv_max), accl_constraints(x[3], u_init[1], v_switch, a_max, v_min, v_max)]) + +# #compute slip angle at cg - outside of the integration +# # switch to kinematic model for small velocities handeled outside +# u = np.array([steering_constraint(x[2], u_init[0], s_min, s_max, sv_min, sv_max), +# accl_constraints(x[3], u_init[1], v_switch, a_max, v_min, v_max)]) + + +# if use_kinematic: +# beta = 0. +# else: +# beta = np.arctan(x[10]/x[3]) +# vel = np.sqrt(x[3]**2 + x[10]**2) + +# #vertical tire forces +# F_z_LF = (x[16] + R_w*(np.cos(x[13]) - 1) - 0.5*T_f*np.sin(x[13]))*K_zt +# F_z_RF = (x[16] + R_w*(np.cos(x[13]) - 1) + 0.5*T_f*np.sin(x[13]))*K_zt +# F_z_LR = (x[21] + R_w*(np.cos(x[18]) - 1) - 0.5*T_r*np.sin(x[18]))*K_zt +# F_z_RR = (x[21] + R_w*(np.cos(x[18]) - 1) + 0.5*T_r*np.sin(x[18]))*K_zt + +# #obtain individual tire speeds +# u_w_lf = (x[3] + 0.5*T_f*x[5])*np.cos(x[2]) + (x[10] + lf*x[5])*np.sin(x[2]) +# u_w_rf = (x[3] - 0.5*T_f*x[5])*np.cos(x[2]) + (x[10] + lf*x[5])*np.sin(x[2]) +# u_w_lr = x[3] + 0.5*T_r*x[5] +# u_w_rr = x[3] - 0.5*T_r*x[5] + +# #negative wheel spin forbidden +# u_w_lf = np.maximum(u_w_lf, 0.0) +# u_w_rf = np.maximum(u_w_rf, 0.0) +# u_w_lr = np.maximum(u_w_lr, 0.0) +# u_w_rr = np.maximum(u_w_rr, 0.0) + +# #compute longitudinal slip +# #switch to kinematic model for small velocities +# if use_kinematic: +# s_lf = 0. +# s_rf = 0. +# s_lr = 0. +# s_rr = 0. +# else: +# s_lf = 1 - R_w*x[23]/u_w_lf +# s_rf = 1 - R_w*x[24]/u_w_rf +# s_lr = 1 - R_w*x[25]/u_w_lr +# s_rr = 1 - R_w*x[26]/u_w_rr + + +# #lateral slip angles +# #switch to kinematic model for small velocities +# if use_kinematic: +# alpha_LF = 0. +# alpha_RF = 0. +# alpha_LR = 0. +# alpha_RR = 0. +# else: +# alpha_LF = np.arctan((x[10] + lf*x[5] - x[14]*(R_w - x[16]))/(x[3] + 0.5*T_f*x[5])) - x[2] +# alpha_RF = np.arctan((x[10] + lf*x[5] - x[14]*(R_w - x[16]))/(x[3] - 0.5*T_f*x[5])) - x[2] +# alpha_LR = np.arctan((x[10] - lr*x[5] - x[19]*(R_w - x[21]))/(x[3] + 0.5*T_r*x[5])) +# alpha_RR = np.arctan((x[10] - lr*x[5] - x[19]*(R_w - x[21]))/(x[3] - 0.5*T_r*x[5])) + +# #auxiliary suspension movement +# z_SLF = (h_s - R_w + x[16] - x[11])/np.cos(x[6]) - h_s + R_w + lf*x[8] + 0.5*(x[6] - x[13])*T_f +# z_SRF = (h_s - R_w + x[16] - x[11])/np.cos(x[6]) - h_s + R_w + lf*x[8] - 0.5*(x[6] - x[13])*T_f +# z_SLR = (h_s - R_w + x[21] - x[11])/np.cos(x[6]) - h_s + R_w - lr*x[8] + 0.5*(x[6] - x[18])*T_r +# z_SRR = (h_s - R_w + x[21] - x[11])/np.cos(x[6]) - h_s + R_w - lr*x[8] - 0.5*(x[6] - x[18])*T_r + +# dz_SLF = x[17] - x[12] + lf*x[9] + 0.5*(x[7] - x[14])*T_f +# dz_SRF = x[17] - x[12] + lf*x[9] - 0.5*(x[7] - x[14])*T_f +# dz_SLR = x[22] - x[12] - lr*x[9] + 0.5*(x[7] - x[19])*T_r +# dz_SRR = x[22] - x[12] - lr*x[9] - 0.5*(x[7] - x[19])*T_r + +# #camber angles +# gamma_LF = x[6] + D_f*z_SLF + E_f*(z_SLF)**2 +# gamma_RF = x[6] - D_f*z_SRF - E_f*(z_SRF)**2 +# gamma_LR = x[6] + D_r*z_SLR + E_r*(z_SLR)**2 +# gamma_RR = x[6] - D_r*z_SRR - E_r*(z_SRR)**2 + +# #compute longitudinal tire forces using the magic formula for pure slip +# F0_x_LF = formula_longitudinal(s_lf, gamma_LF, F_z_LF, params) +# F0_x_RF = formula_longitudinal(s_rf, gamma_RF, F_z_RF, params) +# F0_x_LR = formula_longitudinal(s_lr, gamma_LR, F_z_LR, params) +# F0_x_RR = formula_longitudinal(s_rr, gamma_RR, F_z_RR, params) + +# #compute lateral tire forces using the magic formula for pure slip +# res = formula_lateral(alpha_LF, gamma_LF, F_z_LF, params) +# F0_y_LF = res[0] +# mu_y_LF = res[1] +# res = formula_lateral(alpha_RF, gamma_RF, F_z_RF, params) +# F0_y_RF = res[0] +# mu_y_RF = res[1] +# res = formula_lateral(alpha_LR, gamma_LR, F_z_LR, params) +# F0_y_LR = res[0] +# mu_y_LR = res[1] +# res = formula_lateral(alpha_RR, gamma_RR, F_z_RR, params) +# F0_y_RR = res[0] +# mu_y_RR = res[1] + +# #compute longitudinal tire forces using the magic formula for combined slip +# F_x_LF = formula_longitudinal_comb(s_lf, alpha_LF, F0_x_LF, params) +# F_x_RF = formula_longitudinal_comb(s_rf, alpha_RF, F0_x_RF, params) +# F_x_LR = formula_longitudinal_comb(s_lr, alpha_LR, F0_x_LR, params) +# F_x_RR = formula_longitudinal_comb(s_rr, alpha_RR, F0_x_RR, params) + +# #compute lateral tire forces using the magic formula for combined slip +# F_y_LF = formula_lateral_comb(s_lf, alpha_LF, gamma_LF, mu_y_LF, F_z_LF, F0_y_LF, params) +# F_y_RF = formula_lateral_comb(s_rf, alpha_RF, gamma_RF, mu_y_RF, F_z_RF, F0_y_RF, params) +# F_y_LR = formula_lateral_comb(s_lr, alpha_LR, gamma_LR, mu_y_LR, F_z_LR, F0_y_LR, params) +# F_y_RR = formula_lateral_comb(s_rr, alpha_RR, gamma_RR, mu_y_RR, F_z_RR, F0_y_RR, params) + +# #auxiliary movements for compliant joint equations +# delta_z_f = h_s - R_w + x[16] - x[11] +# delta_z_r = h_s - R_w + x[21] - x[11] + +# delta_phi_f = x[6] - x[13] +# delta_phi_r = x[6] - x[18] + +# dot_delta_phi_f = x[7] - x[14] +# dot_delta_phi_r = x[7] - x[19] + +# dot_delta_z_f = x[17] - x[12] +# dot_delta_z_r = x[22] - x[12] + +# dot_delta_y_f = x[10] + lf*x[5] - x[15] +# dot_delta_y_r = x[10] - lr*x[5] - x[20] + +# delta_f = delta_z_f*np.sin(x[6]) - x[27]*np.cos(x[6]) - (h_raf - R_w)*np.sin(delta_phi_f) +# delta_r = delta_z_r*np.sin(x[6]) - x[28]*np.cos(x[6]) - (h_rar - R_w)*np.sin(delta_phi_r) + +# dot_delta_f = (delta_z_f*np.cos(x[6]) + x[27]*np.sin(x[6]))*x[7] + dot_delta_z_f*np.sin(x[6]) - dot_delta_y_f*np.cos(x[6]) - (h_raf - R_w)*np.cos(delta_phi_f)*dot_delta_phi_f +# dot_delta_r = (delta_z_r*np.cos(x[6]) + x[28]*np.sin(x[6]))*x[7] + dot_delta_z_r*np.sin(x[6]) - dot_delta_y_r*np.cos(x[6]) - (h_rar - R_w)*np.cos(delta_phi_r)*dot_delta_phi_r + +# #compliant joint forces +# F_RAF = delta_f*K_ras + dot_delta_f*K_rad +# F_RAR = delta_r*K_ras + dot_delta_r*K_rad + +# #auxiliary suspension forces (bump stop neglected squat/lift forces neglected) +# F_SLF = m_s*g*lr/(2*(lf+lr)) - z_SLF*K_sf - dz_SLF*K_sdf + (x[6] - x[13])*K_tsf/T_f + +# F_SRF = m_s*g*lr/(2*(lf+lr)) - z_SRF*K_sf - dz_SRF*K_sdf - (x[6] - x[13])*K_tsf/T_f + +# F_SLR = m_s*g*lf/(2*(lf+lr)) - z_SLR*K_sr - dz_SLR*K_sdr + (x[6] - x[18])*K_tsr/T_r + +# F_SRR = m_s*g*lf/(2*(lf+lr)) - z_SRR*K_sr - dz_SRR*K_sdr - (x[6] - x[18])*K_tsr/T_r + +# #auxiliary variables sprung mass +# sumX = F_x_LR + F_x_RR + (F_x_LF + F_x_RF)*np.cos(x[2]) - (F_y_LF + F_y_RF)*np.sin(x[2]) + +# sumN = (F_y_LF + F_y_RF)*lf*np.cos(x[2]) + (F_x_LF + F_x_RF)*lf*np.sin(x[2]) \ +# + (F_y_RF - F_y_LF)*0.5*T_f*np.sin(x[2]) + (F_x_LF - F_x_RF)*0.5*T_f*np.cos(x[2]) \ +# + (F_x_LR - F_x_RR)*0.5*T_r - (F_y_LR + F_y_RR)*lr + +# sumY_s = (F_RAF + F_RAR)*np.cos(x[6]) + (F_SLF + F_SLR + F_SRF + F_SRR)*np.sin(x[6]) + +# sumL = 0.5*F_SLF*T_f + 0.5*F_SLR*T_r - 0.5*F_SRF*T_f - 0.5*F_SRR*T_r \ +# - F_RAF/np.cos(x[6])*(h_s - x[11] - R_w + x[16] - (h_raf - R_w)*np.cos(x[13])) \ +# - F_RAR/np.cos(x[6])*(h_s - x[11] - R_w + x[21] - (h_rar - R_w)*np.cos(x[18])) + +# sumZ_s = (F_SLF + F_SLR + F_SRF + F_SRR)*np.cos(x[6]) - (F_RAF + F_RAR)*np.sin(x[6]) + +# sumM_s = lf*(F_SLF + F_SRF) - lr*(F_SLR + F_SRR) + ((F_x_LF + F_x_RF)*np.cos(x[2]) \ +# - (F_y_LF + F_y_RF)*np.sin(x[2]) + F_x_LR + F_x_RR)*(h_s - x[11]) + +# #auxiliary variables unsprung mass +# sumL_uf = 0.5*F_SRF*T_f - 0.5*F_SLF*T_f - F_RAF*(h_raf - R_w) \ +# + F_z_LF*(R_w*np.sin(x[13]) + 0.5*T_f*np.cos(x[13]) - K_lt*F_y_LF) \ +# - F_z_RF*(-R_w*np.sin(x[13]) + 0.5*T_f*np.cos(x[13]) + K_lt*F_y_RF) \ +# - ((F_y_LF + F_y_RF)*np.cos(x[2]) + (F_x_LF + F_x_RF)*np.sin(x[2]))*(R_w - x[16]) + +# sumL_ur = 0.5*F_SRR*T_r - 0.5*F_SLR*T_r - F_RAR*(h_rar - R_w) \ +# + F_z_LR*(R_w*np.sin(x[18]) + 0.5*T_r*np.cos(x[18]) - K_lt*F_y_LR) \ +# - F_z_RR*(-R_w*np.sin(x[18]) + 0.5*T_r*np.cos(x[18]) + K_lt*F_y_RR) \ +# - (F_y_LR + F_y_RR)*(R_w - x[21]) + +# sumZ_uf = F_z_LF + F_z_RF + F_RAF*np.sin(x[6]) - (F_SLF + F_SRF)*np.cos(x[6]) + +# sumZ_ur = F_z_LR + F_z_RR + F_RAR*np.sin(x[6]) - (F_SLR + F_SRR)*np.cos(x[6]) + +# sumY_uf = (F_y_LF + F_y_RF)*np.cos(x[2]) + (F_x_LF + F_x_RF)*np.sin(x[2]) \ +# - F_RAF*np.cos(x[6]) - (F_SLF + F_SRF)*np.sin(x[6]) + +# sumY_ur = (F_y_LR + F_y_RR) \ +# - F_RAR*np.cos(x[6]) - (F_SLR + F_SRR)*np.sin(x[6]) + + +# # dynamics common with single-track model +# f = np.zeros((29,))# init 'right hand side' +# # switch to kinematic model for small velocities +# if use_kinematic: +# # wheelbase +# # lwb = lf + lr + +# # system dynamics +# # x_ks = [x[0], x[1], x[2], x[3], x[4]] +# # f_ks = vehicle_dynamics_ks(x_ks, u, p) +# # f.extend(f_ks) +# # f.append(u[1]*lwb*np.tan(x[2]) + x[3]/(lwb*np.cos(x[2])**2)*u[0]) + +# # Use kinematic model with reference point at center of mass +# # wheelbase +# lwb = lf + lr + +# # system dynamics +# x_ks = x[0:5] +# # kinematic model +# # f_ks = vehicle_dynamics_ks_cog(x_ks, u, p) +# # f = [f_ks[0], f_ks[1], f_ks[2], f_ks[3], f_ks[4]] # 1 2 3 4 5 +# f_ks = vehicle_dynamics_ks_cog(x_ks, u, 0., 0., 0., lf, lr, 0., 0., 0., s_min, s_max, sv_min, sv_max, v_switch, a_max, v_min, v_max, 0., 0.) +# f[0:5] = f_ks +# # derivative of slip angle and yaw rate +# d_beta = (lr * u[0]) / (lwb * np.cos(x[2]) ** 2 * (1 + (np.tan(x[2]) ** 2 * lr / lwb) ** 2)) +# dd_psi = 1 / lwb * (u[1] * np.cos(x[6]) * np.tan(x[2]) - +# x[3] * np.sin(x[6]) * d_beta * np.tan(x[2]) + +# x[3] * np.cos(x[6]) * u[0] / np.cos(x[2]) ** 2) +# # f.append(dd_psi) # 6 +# f[5] = dd_psi + +# else: +# f[0] = np.cos(beta + x[4])*vel # 1 +# f[1] = np.sin(beta + x[4])*vel # 2 +# f[2] = u[0] # 3 +# f[3] = 1/m*sumX + x[5]*x[10] # 4 +# f[4] = x[5] # 5 +# f[5] = 1/(I_z - (I_xz_s)**2/I_Phi_s)*(sumN + I_xz_s/I_Phi_s*sumL) # 6 + + +# # remaining sprung mass dynamics +# f[6] = x[7] # 7 +# f[7] = 1/(I_Phi_s - (I_xz_s)**2/I_z)*(I_xz_s/I_z*sumN + sumL) # 8 +# f[8] = x[9] # 9 +# f[9] = 1/I_y_s*sumM_s # 10 +# f[10] = 1/m_s*sumY_s - x[5]*x[3] # 11 +# f[11] = x[12] # 12 +# f[12] = g - 1/m_s*sumZ_s # 13 + +# #unsprung mass dynamics (front) +# f[13] = x[14] # 14 +# f[14] = 1/I_uf*sumL_uf # 15 +# f[15] = 1/m_uf*sumY_uf - x[5]*x[3] # 16 +# f[16] = x[17] # 17 +# f[17] = g - 1/m_uf*sumZ_uf # 18 + +# #unsprung mass dynamics (rear) +# f[18] = x[19] # 19 +# f[19] = 1/I_ur*sumL_ur # 20 +# f[20] = 1/m_ur*sumY_ur - x[5]*x[3] # 21 +# f[21] = x[22] # 22 +# f[22] = g - 1/m_ur*sumZ_ur # 23 + +# # convert acceleration input to brake and engine torque +# if u[1] > 0: +# T_B = 0.0 +# T_E = m * R_w * u[1] +# else: +# T_B = m * R_w * u[1] +# T_E = 0.0 + +# #wheel dynamics (p.T new parameter for torque splitting) - splitting for brake/drive torque is outside of the integration +# f[23] = ( +# 1 +# / I_y_w +# * ( +# -R_w * F_x_LF +# + 0.5 * T_sb * T_B +# + 0.5 * T_se * T_E +# ) +# ) +# f[24] = ( +# 1 +# / I_y_w +# * ( +# -R_w * F_x_RF +# + 0.5 * T_sb * T_B +# + 0.5 * T_se * T_E +# ) +# ) +# f[25] = ( +# 1 +# / I_y_w +# * ( +# -R_w * F_x_LR +# + 0.5 * (1 - T_sb) * T_B +# + 0.5 * (1 - T_se) * T_E +# ) +# ) +# f[26] = ( +# 1 +# / I_y_w +# * ( +# -R_w * F_x_RR +# + 0.5 * (1 - T_sb) * T_B +# + 0.5 * (1 - T_se) * T_E +# ) +# ) + +# #negative wheel spin forbidden handeled outside of this function +# for iState in range(23, 27): +# if x[iState] < 0.0: +# x[iState] = 0.0 +# f[iState] = 0.0 + +# #compliant joint equations +# f[27] = dot_delta_y_f # 28 +# f[28] = dot_delta_y_r # 29 + +# # longitudinal slip +# # s_lf +# # s_rf +# # s_lr +# # s_rr + +# # lateral slip +# # alpha_LF +# # alpha_RF +# # alpha_LR +# # alpha_RR + +# # return f, F_x_LF, F_x_RF, F_x_LR, F_x_RR, F_y_LF, F_y_RF, F_y_LR, F_y_RR, \ +# # s_lf, s_rf, s_lr, s_rr, alpha_LF, alpha_RF, alpha_LR, alpha_RR, \ +# # F_z_LF, F_z_RF, F_z_LR, F_z_RR +# return f + @njit(cache=True) def get_standardized_state_mb(x: np.ndarray) -> np.ndarray: """[X,Y,Steering_Angle,Speed,YAW,YAW_RATE,V_Y]""" diff --git a/f1tenth_gym/envs/dynamic_models/multi_body/tire_model.py b/f1tenth_gym/envs/dynamic_models/multi_body/tire_model.py index e18d38a1..a89513cb 100644 --- a/f1tenth_gym/envs/dynamic_models/multi_body/tire_model.py +++ b/f1tenth_gym/envs/dynamic_models/multi_body/tire_model.py @@ -1,17 +1,3 @@ -# Copyright 2020 Technical University of Munich, Professorship of Cyber-Physical Systems, Matthew O'Kelly, Aman Sinha, Hongrui Zheng - -# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - import numpy as np from numba import njit @@ -19,15 +5,21 @@ # longitudinal tire forces @njit(cache=True) def formula_longitudinal(kappa, gamma, F_z, params): - # longitudinal coefficients - tire_p_cx1 = params[46] # Shape factor Cfx for longitudinal force - tire_p_dx1 = params[47] # Longitudinal friction Mux at Fznom - tire_p_dx3 = params[48] # Variation of friction Mux with camber - tire_p_ex1 = params[49] # Longitudinal curvature Efx at Fznom - tire_p_kx1 = params[50] # Longitudinal slip stiffness Kfx/Fz at Fznom - tire_p_hx1 = params[51] # Horizontal shift Shx at Fznom - tire_p_vx1 = params[52] # Vertical shift Svx/Fz at Fznom + # tire_p_cx1 = params["tire_p_cx1"] # Shape factor Cfx for longitudinal force + # tire_p_dx1 = params["tire_p_dx1"] # Longitudinal friction Mux at Fznom + # tire_p_dx3 = params["tire_p_dx3"] # Variation of friction Mux with camber + # tire_p_ex1 = params["tire_p_ex1"] # Longitudinal curvature Efx at Fznom + # tire_p_kx1 = params["tire_p_kx1"] # Longitudinal slip stiffness Kfx/Fz at Fznom + # tire_p_hx1 = params["tire_p_hx1"] # Horizontal shift Shx at Fznom + # tire_p_vx1 = params["tire_p_vx1"] # Vertical shift Svx/Fz at Fznom + tire_p_cx1 = params[55] # shape factor Cfx + tire_p_dx1 = params[56] # peak longitudinal friction + tire_p_dx3 = params[57] # friction variation with camber + tire_p_ex1 = params[58] # curvature factor Efx + tire_p_kx1 = params[59] # slip stiffness Kfx/Fz + tire_p_hx1 = params[60] # horizontal shift Shx + tire_p_vx1 = params[61] # vertical shift Svx/Fz # turn slip is neglected, so xi_i=1 # all scaling factors lambda = 1 @@ -39,7 +31,7 @@ def formula_longitudinal(kappa, gamma, F_z, params): S_vx = F_z * tire_p_vx1 kappa_x = kappa + S_hx - mu_x = tire_p_dx1 * (1 - tire_p_dx3 * gamma ** 2) + mu_x = tire_p_dx1 * (1 - tire_p_dx3 * gamma**2) C_x = tire_p_cx1 D_x = mu_x * F_z @@ -48,23 +40,35 @@ def formula_longitudinal(kappa, gamma, F_z, params): B_x = K_x / (C_x * D_x) # magic tire formula - return D_x * np.sin(C_x * np.arctan(B_x * kappa_x - E_x * (B_x * kappa_x - np.arctan(B_x * kappa_x))) + S_vx) + return D_x * np.sin( + C_x + * np.arctan(B_x * kappa_x - E_x * (B_x * kappa_x - np.arctan(B_x * kappa_x))) + + S_vx + ) # lateral tire forces @njit(cache=True) def formula_lateral(alpha, gamma, F_z, params): - # lateral coefficients - tire_p_cy1 = params[58] # Shape factor Cfy for lateral forces - tire_p_dy1 = params[59] # Lateral friction Muy - tire_p_dy3 = params[60] # Variation of friction Muy with squared camber - tire_p_ey1 = params[61] # Lateral curvature Efy at Fznom - tire_p_ky1 = params[62] # Maximum value of stiffness Kfy/Fznom - tire_p_hy1 = params[63] # Horizontal shift Shy at Fznom - tire_p_hy3 = params[64] # Variation of shift Shy with camber - tire_p_vy1 = params[65] # Vertical shift in Svy/Fz at Fznom - tire_p_vy3 = params[66] # Variation of shift Svy/Fz with camber + # tire_p_cy1 = params["tire_p_cy1"] # Shape factor Cfy for lateral forces + # tire_p_dy1 = params["tire_p_dy1"] # Lateral friction Muy + # tire_p_dy3 = params["tire_p_dy3"] # Variation of friction Muy with squared camber + # tire_p_ey1 = params["tire_p_ey1"] # Lateral curvature Efy at Fznom + # tire_p_ky1 = params["tire_p_ky1"] # Maximum value of stiffness Kfy/Fznom + # tire_p_hy1 = params["tire_p_hy1"] # Horizontal shift Shy at Fznom + # tire_p_hy3 = params["tire_p_hy3"] # Variation of shift Shy with camber + # tire_p_vy1 = params["tire_p_vy1"] # Vertical shift in Svy/Fz at Fznom + # tire_p_vy3 = params["tire_p_vy3"] # Variation of shift Svy/Fz with camber + tire_p_cy1 = params[67] # shape factor Cfy + tire_p_dy1 = params[68] # lateral friction Muy + tire_p_dy3 = params[69] # friction variation with camber² + tire_p_ey1 = params[70] # curvature factor Efy + tire_p_ky1 = params[71] # stiffness Kfy/Fz + tire_p_hy1 = params[72] # horizontal shift Shy + tire_p_hy3 = params[73] # shift variation with camber + tire_p_vy1 = params[74] # vertical shift Svy/Fz + tire_p_vy3 = params[75] # Svy/Fz variation with camber # turn slip is neglected, so xi_i=1 # all scaling factors lambda = 1 @@ -76,7 +80,7 @@ def formula_lateral(alpha, gamma, F_z, params): S_vy = np.sign(gamma) * F_z * (tire_p_vy1 + tire_p_vy3 * np.fabs(gamma)) alpha_y = alpha + S_hy - mu_y = tire_p_dy1 * (1 - tire_p_dy3 * gamma ** 2) + mu_y = tire_p_dy1 * (1 - tire_p_dy3 * gamma**2) C_y = tire_p_cy1 D_y = mu_y * F_z @@ -85,7 +89,16 @@ def formula_lateral(alpha, gamma, F_z, params): B_y = K_y / (C_y * D_y) # magic tire formula - F_y = D_y * np.sin(C_y * np.arctan(B_y * alpha_y - E_y * (B_y * alpha_y - np.arctan(B_y * alpha_y)))) + S_vy + F_y = ( + D_y + * np.sin( + C_y + * np.arctan( + B_y * alpha_y - E_y * (B_y * alpha_y - np.arctan(B_y * alpha_y)) + ) + ) + + S_vy + ) res = [] res.append(F_y) @@ -96,15 +109,19 @@ def formula_lateral(alpha, gamma, F_z, params): # longitudinal tire forces for combined slip @njit(cache=True) def formula_longitudinal_comb(kappa, alpha, F0_x, params): - # longitudinal coefficients - tire_r_bx1 = params[53] # Slope factor for combined slip Fx reduction - tire_r_bx2 = params[54] # Variation of slope Fx reduction with kappa - tire_r_cx1 = params[55] # Shape factor for combined slip Fx reduction - tire_r_ex1 = params[56] # Curvature factor of combined Fx - tire_r_hx1 = params[57] # Shift factor for combined slip Fx reduction - - # turn slip is neglected, so xi_i=1 + # tire_r_bx1 = params["tire_r_bx1"] # Slope factor for combined slip Fx reduction + # tire_r_bx2 = params["tire_r_bx2"] # Variation of slope Fx reduction with kappa + # tire_r_cx1 = params["tire_r_cx1"] # Shape factor for combined slip Fx reduction + # tire_r_ex1 = params["tire_r_ex1"] # Curvature factor of combined Fx + # tire_r_hx1 = params["tire_r_hx1"] # Shift factor for combined slip Fx reduction + tire_r_bx1 = params[62] # slope for Fx reduction + tire_r_bx2 = params[63] # Fx slope variation w/ kappa + tire_r_cx1 = params[64] # shape factor for Fx reduction + tire_r_ex1 = params[65] # curvature for Fx reduction + tire_r_hx1 = params[66] # shift for Fx reduction + + # turn slip '' neglected, so xi_i=1 # all scaling factors lambda = 1 S_hxalpha = tire_r_hx1 @@ -114,30 +131,52 @@ def formula_longitudinal_comb(kappa, alpha, F0_x, params): B_xalpha = tire_r_bx1 * np.cos(np.arctan(tire_r_bx2 * kappa)) C_xalpha = tire_r_cx1 E_xalpha = tire_r_ex1 - D_xalpha = F0_x / (np.cos(C_xalpha * np.arctan( - B_xalpha * S_hxalpha - E_xalpha * (B_xalpha * S_hxalpha - np.arctan(B_xalpha * S_hxalpha))))) + D_xalpha = F0_x / ( + np.cos( + C_xalpha + * np.arctan( + B_xalpha * S_hxalpha + - E_xalpha * (B_xalpha * S_hxalpha - np.arctan(B_xalpha * S_hxalpha)) + ) + ) + ) # magic tire formula return D_xalpha * np.cos( - C_xalpha * np.arctan(B_xalpha * alpha_s - E_xalpha * (B_xalpha * alpha_s - np.arctan(B_xalpha * alpha_s)))) + C_xalpha + * np.arctan( + B_xalpha * alpha_s + - E_xalpha * (B_xalpha * alpha_s - np.arctan(B_xalpha * alpha_s)) + ) + ) # lateral tire forces for combined slip @njit(cache=True) def formula_lateral_comb(kappa, alpha, gamma, mu_y, F_z, F0_y, params): - # lateral coefficients - tire_r_by1 = params[67] # Slope factor for combined Fy reduction - tire_r_by2 = params[68] # Variation of slope Fy reduction with alpha - tire_r_by3 = params[69] # Shift term for alpha in slope Fy reduction - tire_r_cy1 = params[70] # Shape factor for combined Fy reduction - tire_r_ey1 = params[71] # Curvature factor of combined Fy - tire_r_hy1 = params[72] # Shift factor for combined Fy reduction - tire_r_vy1 = params[73] # Kappa induced side force Svyk/Muy*Fz at Fznom - tire_r_vy3 = params[74] # Variation of Svyk/Muy*Fz with camber - tire_r_vy4 = params[75] # Variation of Svyk/Muy*Fz with alpha - tire_r_vy5 = params[76] # Variation of Svyk/Muy*Fz with kappa - tire_r_vy6 = params[77] # Variation of Svyk/Muy*Fz with atan(kappa) + # tire_r_by1 = params["tire_r_by1"] # Slope factor for combined Fy reduction + # tire_r_by2 = params["tire_r_by2"] # Variation of slope Fy reduction with alpha + # tire_r_by3 = params["tire_r_by3"] # Shift term for alpha in slope Fy reduction + # tire_r_cy1 = params["tire_r_cy1"] # Shape factor for combined Fy reduction + # tire_r_ey1 = params["tire_r_ey1"] # Curvature factor of combined Fy + # tire_r_hy1 = params["tire_r_hy1"] # Shift factor for combined Fy reduction + # tire_r_vy1 = params["tire_r_vy1"] # Kappa induced side force Svyk/Muy*Fz at Fznom + # tire_r_vy3 = params["tire_r_vy3"] # Variation of Svyk/Muy*Fz with camber + # tire_r_vy4 = params["tire_r_vy4"] # Variation of Svyk/Muy*Fz with alpha + # tire_r_vy5 = params["tire_r_vy5"] # Variation of Svyk/Muy*Fz with kappa + # tire_r_vy6 = params["tire_r_vy6"] # Variation of Svyk/Muy*Fz with atan(kappa) + tire_r_by1 = params[76] # slope for Fy reduction + tire_r_by2 = params[77] # slope variation with alpha + tire_r_by3 = params[78] # alpha shift in Fy slope + tire_r_cy1 = params[79] # shape factor for Fy reduction + tire_r_ey1 = params[80] # curvature for Fy reduction + tire_r_hy1 = params[81] # shift for Fy reduction + tire_r_vy1 = params[82] # kappa-induced side force + tire_r_vy3 = params[83] # side force variation w/ camber + tire_r_vy4 = params[84] # variation w/ alpha + tire_r_vy5 = params[85] # variation w/ kappa + tire_r_vy6 = params[86] # variation w/ atan(kappa) # turn slip is neglected, so xi_i=1 # all scaling factors lambda = 1 @@ -149,12 +188,33 @@ def formula_lateral_comb(kappa, alpha, gamma, mu_y, F_z, F0_y, params): B_ykappa = tire_r_by1 * np.cos(np.arctan(tire_r_by2 * (alpha - tire_r_by3))) C_ykappa = tire_r_cy1 E_ykappa = tire_r_ey1 - D_ykappa = F0_y / (np.cos(C_ykappa * np.arctan( - B_ykappa * S_hykappa - E_ykappa * (B_ykappa * S_hykappa - np.arctan(B_ykappa * S_hykappa))))) - - D_vykappa = mu_y * F_z * (tire_r_vy1 + tire_r_vy3 * gamma) * np.cos(np.arctan(tire_r_vy4 * alpha)) + D_ykappa = F0_y / ( + np.cos( + C_ykappa + * np.arctan( + B_ykappa * S_hykappa + - E_ykappa * (B_ykappa * S_hykappa - np.arctan(B_ykappa * S_hykappa)) + ) + ) + ) + + D_vykappa = ( + mu_y + * F_z + * (tire_r_vy1 + tire_r_vy3 * gamma) + * np.cos(np.arctan(tire_r_vy4 * alpha)) + ) S_vykappa = D_vykappa * np.sin(tire_r_vy5 * np.arctan(tire_r_vy6 * kappa)) # magic tire formula - return D_ykappa * np.cos(C_ykappa * np.arctan( - B_ykappa * kappa_s - E_ykappa * (B_ykappa * kappa_s - np.arctan(B_ykappa * kappa_s)))) + S_vykappa + return ( + D_ykappa + * np.cos( + C_ykappa + * np.arctan( + B_ykappa * kappa_s + - E_ykappa * (B_ykappa * kappa_s - np.arctan(B_ykappa * kappa_s)) + ) + ) + + S_vykappa + ) diff --git a/f1tenth_gym/envs/dynamic_models/multi_body/tire_model_new.py b/f1tenth_gym/envs/dynamic_models/multi_body/tire_model_new.py deleted file mode 100644 index 6fc6f704..00000000 --- a/f1tenth_gym/envs/dynamic_models/multi_body/tire_model_new.py +++ /dev/null @@ -1,184 +0,0 @@ -import numpy as np -from numba import njit - - -# longitudinal tire forces -def formula_longitudinal(kappa, gamma, F_z, params: dict): - # longitudinal coefficients - tire_p_cx1 = params["tire_p_cx1"] # Shape factor Cfx for longitudinal force - tire_p_dx1 = params["tire_p_dx1"] # Longitudinal friction Mux at Fznom - tire_p_dx3 = params["tire_p_dx3"] # Variation of friction Mux with camber - tire_p_ex1 = params["tire_p_ex1"] # Longitudinal curvature Efx at Fznom - tire_p_kx1 = params["tire_p_kx1"] # Longitudinal slip stiffness Kfx/Fz at Fznom - tire_p_hx1 = params["tire_p_hx1"] # Horizontal shift Shx at Fznom - tire_p_vx1 = params["tire_p_vx1"] # Vertical shift Svx/Fz at Fznom - - # turn slip is neglected, so xi_i=1 - # all scaling factors lambda = 1 - - # coordinate system transformation - kappa = -kappa - - S_hx = tire_p_hx1 - S_vx = F_z * tire_p_vx1 - - kappa_x = kappa + S_hx - mu_x = tire_p_dx1 * (1 - tire_p_dx3 * gamma**2) - - C_x = tire_p_cx1 - D_x = mu_x * F_z - E_x = tire_p_ex1 - K_x = F_z * tire_p_kx1 - B_x = K_x / (C_x * D_x) - - # magic tire formula - return D_x * np.sin( - C_x - * np.arctan(B_x * kappa_x - E_x * (B_x * kappa_x - np.arctan(B_x * kappa_x))) - + S_vx - ) - - -# lateral tire forces -def formula_lateral(alpha, gamma, F_z, params: dict): - # lateral coefficients - tire_p_cy1 = params["tire_p_cy1"] # Shape factor Cfy for lateral forces - tire_p_dy1 = params["tire_p_dy1"] # Lateral friction Muy - tire_p_dy3 = params["tire_p_dy3"] # Variation of friction Muy with squared camber - tire_p_ey1 = params["tire_p_ey1"] # Lateral curvature Efy at Fznom - tire_p_ky1 = params["tire_p_ky1"] # Maximum value of stiffness Kfy/Fznom - tire_p_hy1 = params["tire_p_hy1"] # Horizontal shift Shy at Fznom - tire_p_hy3 = params["tire_p_hy3"] # Variation of shift Shy with camber - tire_p_vy1 = params["tire_p_vy1"] # Vertical shift in Svy/Fz at Fznom - tire_p_vy3 = params["tire_p_vy3"] # Variation of shift Svy/Fz with camber - - # turn slip is neglected, so xi_i=1 - # all scaling factors lambda = 1 - - # coordinate system transformation - # alpha = -alpha - - S_hy = np.sign(gamma) * (tire_p_hy1 + tire_p_hy3 * np.fabs(gamma)) - S_vy = np.sign(gamma) * F_z * (tire_p_vy1 + tire_p_vy3 * np.fabs(gamma)) - - alpha_y = alpha + S_hy - mu_y = tire_p_dy1 * (1 - tire_p_dy3 * gamma**2) - - C_y = tire_p_cy1 - D_y = mu_y * F_z - E_y = tire_p_ey1 - K_y = F_z * tire_p_ky1 # simplify K_y0 to tire_p_ky1*F_z - B_y = K_y / (C_y * D_y) - - # magic tire formula - F_y = ( - D_y - * np.sin( - C_y - * np.arctan( - B_y * alpha_y - E_y * (B_y * alpha_y - np.arctan(B_y * alpha_y)) - ) - ) - + S_vy - ) - - res = [] - res.append(F_y) - res.append(mu_y) - return res - - -# longitudinal tire forces for combined slip -def formula_longitudinal_comb(kappa, alpha, F0_x, params: dict): - # longitudinal coefficients - tire_r_bx1 = params["tire_r_bx1"] # Slope factor for combined slip Fx reduction - tire_r_bx2 = params["tire_r_bx2"] # Variation of slope Fx reduction with kappa - tire_r_cx1 = params["tire_r_cx1"] # Shape factor for combined slip Fx reduction - tire_r_ex1 = params["tire_r_ex1"] # Curvature factor of combined Fx - tire_r_hx1 = params["tire_r_hx1"] # Shift factor for combined slip Fx reduction - - # turn slip '' neglected, so xi_i=1 - # all scaling factors lambda = 1 - - S_hxalpha = tire_r_hx1 - - alpha_s = alpha + S_hxalpha - - B_xalpha = tire_r_bx1 * np.cos(np.arctan(tire_r_bx2 * kappa)) - C_xalpha = tire_r_cx1 - E_xalpha = tire_r_ex1 - D_xalpha = F0_x / ( - np.cos( - C_xalpha - * np.arctan( - B_xalpha * S_hxalpha - - E_xalpha * (B_xalpha * S_hxalpha - np.arctan(B_xalpha * S_hxalpha)) - ) - ) - ) - - # magic tire formula - return D_xalpha * np.cos( - C_xalpha - * np.arctan( - B_xalpha * alpha_s - - E_xalpha * (B_xalpha * alpha_s - np.arctan(B_xalpha * alpha_s)) - ) - ) - - -# lateral tire forces for combined slip -def formula_lateral_comb(kappa, alpha, gamma, mu_y, F_z, F0_y, params: dict): - # lateral coefficients - tire_r_by1 = params["tire_r_by1"] # Slope factor for combined Fy reduction - tire_r_by2 = params["tire_r_by2"] # Variation of slope Fy reduction with alpha - tire_r_by3 = params["tire_r_by3"] # Shift term for alpha in slope Fy reduction - tire_r_cy1 = params["tire_r_cy1"] # Shape factor for combined Fy reduction - tire_r_ey1 = params["tire_r_ey1"] # Curvature factor of combined Fy - tire_r_hy1 = params["tire_r_hy1"] # Shift factor for combined Fy reduction - tire_r_vy1 = params["tire_r_vy1"] # Kappa induced side force Svyk/Muy*Fz at Fznom - tire_r_vy3 = params["tire_r_vy3"] # Variation of Svyk/Muy*Fz with camber - tire_r_vy4 = params["tire_r_vy4"] # Variation of Svyk/Muy*Fz with alpha - tire_r_vy5 = params["tire_r_vy5"] # Variation of Svyk/Muy*Fz with kappa - tire_r_vy6 = params["tire_r_vy6"] # Variation of Svyk/Muy*Fz with atan(kappa) - - # turn slip is neglected, so xi_i=1 - # all scaling factors lambda = 1 - - S_hykappa = tire_r_hy1 - - kappa_s = kappa + S_hykappa - - B_ykappa = tire_r_by1 * np.cos(np.arctan(tire_r_by2 * (alpha - tire_r_by3))) - C_ykappa = tire_r_cy1 - E_ykappa = tire_r_ey1 - D_ykappa = F0_y / ( - np.cos( - C_ykappa - * np.arctan( - B_ykappa * S_hykappa - - E_ykappa * (B_ykappa * S_hykappa - np.arctan(B_ykappa * S_hykappa)) - ) - ) - ) - - D_vykappa = ( - mu_y - * F_z - * (tire_r_vy1 + tire_r_vy3 * gamma) - * np.cos(np.arctan(tire_r_vy4 * alpha)) - ) - S_vykappa = D_vykappa * np.sin(tire_r_vy5 * np.arctan(tire_r_vy6 * kappa)) - - # magic tire formula - return ( - D_ykappa - * np.cos( - C_ykappa - * np.arctan( - B_ykappa * kappa_s - - E_ykappa * (B_ykappa * kappa_s - np.arctan(B_ykappa * kappa_s)) - ) - ) - + S_vykappa - ) diff --git a/f1tenth_gym/envs/dynamic_models/multi_body/tire_model_old.py b/f1tenth_gym/envs/dynamic_models/multi_body/tire_model_old.py new file mode 100644 index 00000000..e18d38a1 --- /dev/null +++ b/f1tenth_gym/envs/dynamic_models/multi_body/tire_model_old.py @@ -0,0 +1,160 @@ +# Copyright 2020 Technical University of Munich, Professorship of Cyber-Physical Systems, Matthew O'Kelly, Aman Sinha, Hongrui Zheng + +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + +import numpy as np +from numba import njit + + +# longitudinal tire forces +@njit(cache=True) +def formula_longitudinal(kappa, gamma, F_z, params): + + # longitudinal coefficients + tire_p_cx1 = params[46] # Shape factor Cfx for longitudinal force + tire_p_dx1 = params[47] # Longitudinal friction Mux at Fznom + tire_p_dx3 = params[48] # Variation of friction Mux with camber + tire_p_ex1 = params[49] # Longitudinal curvature Efx at Fznom + tire_p_kx1 = params[50] # Longitudinal slip stiffness Kfx/Fz at Fznom + tire_p_hx1 = params[51] # Horizontal shift Shx at Fznom + tire_p_vx1 = params[52] # Vertical shift Svx/Fz at Fznom + + # turn slip is neglected, so xi_i=1 + # all scaling factors lambda = 1 + + # coordinate system transformation + kappa = -kappa + + S_hx = tire_p_hx1 + S_vx = F_z * tire_p_vx1 + + kappa_x = kappa + S_hx + mu_x = tire_p_dx1 * (1 - tire_p_dx3 * gamma ** 2) + + C_x = tire_p_cx1 + D_x = mu_x * F_z + E_x = tire_p_ex1 + K_x = F_z * tire_p_kx1 + B_x = K_x / (C_x * D_x) + + # magic tire formula + return D_x * np.sin(C_x * np.arctan(B_x * kappa_x - E_x * (B_x * kappa_x - np.arctan(B_x * kappa_x))) + S_vx) + + +# lateral tire forces +@njit(cache=True) +def formula_lateral(alpha, gamma, F_z, params): + + # lateral coefficients + tire_p_cy1 = params[58] # Shape factor Cfy for lateral forces + tire_p_dy1 = params[59] # Lateral friction Muy + tire_p_dy3 = params[60] # Variation of friction Muy with squared camber + tire_p_ey1 = params[61] # Lateral curvature Efy at Fznom + tire_p_ky1 = params[62] # Maximum value of stiffness Kfy/Fznom + tire_p_hy1 = params[63] # Horizontal shift Shy at Fznom + tire_p_hy3 = params[64] # Variation of shift Shy with camber + tire_p_vy1 = params[65] # Vertical shift in Svy/Fz at Fznom + tire_p_vy3 = params[66] # Variation of shift Svy/Fz with camber + + # turn slip is neglected, so xi_i=1 + # all scaling factors lambda = 1 + + # coordinate system transformation + # alpha = -alpha + + S_hy = np.sign(gamma) * (tire_p_hy1 + tire_p_hy3 * np.fabs(gamma)) + S_vy = np.sign(gamma) * F_z * (tire_p_vy1 + tire_p_vy3 * np.fabs(gamma)) + + alpha_y = alpha + S_hy + mu_y = tire_p_dy1 * (1 - tire_p_dy3 * gamma ** 2) + + C_y = tire_p_cy1 + D_y = mu_y * F_z + E_y = tire_p_ey1 + K_y = F_z * tire_p_ky1 # simplify K_y0 to tire_p_ky1*F_z + B_y = K_y / (C_y * D_y) + + # magic tire formula + F_y = D_y * np.sin(C_y * np.arctan(B_y * alpha_y - E_y * (B_y * alpha_y - np.arctan(B_y * alpha_y)))) + S_vy + + res = [] + res.append(F_y) + res.append(mu_y) + return res + + +# longitudinal tire forces for combined slip +@njit(cache=True) +def formula_longitudinal_comb(kappa, alpha, F0_x, params): + + # longitudinal coefficients + tire_r_bx1 = params[53] # Slope factor for combined slip Fx reduction + tire_r_bx2 = params[54] # Variation of slope Fx reduction with kappa + tire_r_cx1 = params[55] # Shape factor for combined slip Fx reduction + tire_r_ex1 = params[56] # Curvature factor of combined Fx + tire_r_hx1 = params[57] # Shift factor for combined slip Fx reduction + + # turn slip is neglected, so xi_i=1 + # all scaling factors lambda = 1 + + S_hxalpha = tire_r_hx1 + + alpha_s = alpha + S_hxalpha + + B_xalpha = tire_r_bx1 * np.cos(np.arctan(tire_r_bx2 * kappa)) + C_xalpha = tire_r_cx1 + E_xalpha = tire_r_ex1 + D_xalpha = F0_x / (np.cos(C_xalpha * np.arctan( + B_xalpha * S_hxalpha - E_xalpha * (B_xalpha * S_hxalpha - np.arctan(B_xalpha * S_hxalpha))))) + + # magic tire formula + return D_xalpha * np.cos( + C_xalpha * np.arctan(B_xalpha * alpha_s - E_xalpha * (B_xalpha * alpha_s - np.arctan(B_xalpha * alpha_s)))) + + +# lateral tire forces for combined slip +@njit(cache=True) +def formula_lateral_comb(kappa, alpha, gamma, mu_y, F_z, F0_y, params): + + # lateral coefficients + tire_r_by1 = params[67] # Slope factor for combined Fy reduction + tire_r_by2 = params[68] # Variation of slope Fy reduction with alpha + tire_r_by3 = params[69] # Shift term for alpha in slope Fy reduction + tire_r_cy1 = params[70] # Shape factor for combined Fy reduction + tire_r_ey1 = params[71] # Curvature factor of combined Fy + tire_r_hy1 = params[72] # Shift factor for combined Fy reduction + tire_r_vy1 = params[73] # Kappa induced side force Svyk/Muy*Fz at Fznom + tire_r_vy3 = params[74] # Variation of Svyk/Muy*Fz with camber + tire_r_vy4 = params[75] # Variation of Svyk/Muy*Fz with alpha + tire_r_vy5 = params[76] # Variation of Svyk/Muy*Fz with kappa + tire_r_vy6 = params[77] # Variation of Svyk/Muy*Fz with atan(kappa) + + # turn slip is neglected, so xi_i=1 + # all scaling factors lambda = 1 + + S_hykappa = tire_r_hy1 + + kappa_s = kappa + S_hykappa + + B_ykappa = tire_r_by1 * np.cos(np.arctan(tire_r_by2 * (alpha - tire_r_by3))) + C_ykappa = tire_r_cy1 + E_ykappa = tire_r_ey1 + D_ykappa = F0_y / (np.cos(C_ykappa * np.arctan( + B_ykappa * S_hykappa - E_ykappa * (B_ykappa * S_hykappa - np.arctan(B_ykappa * S_hykappa))))) + + D_vykappa = mu_y * F_z * (tire_r_vy1 + tire_r_vy3 * gamma) * np.cos(np.arctan(tire_r_vy4 * alpha)) + S_vykappa = D_vykappa * np.sin(tire_r_vy5 * np.arctan(tire_r_vy6 * kappa)) + + # magic tire formula + return D_ykappa * np.cos(C_ykappa * np.arctan( + B_ykappa * kappa_s - E_ykappa * (B_ykappa * kappa_s - np.arctan(B_ykappa * kappa_s)))) + S_vykappa diff --git a/f1tenth_gym/envs/dynamic_models/single_track.py b/f1tenth_gym/envs/dynamic_models/single_track.py index 6bbe2308..67e11b0d 100644 --- a/f1tenth_gym/envs/dynamic_models/single_track.py +++ b/f1tenth_gym/envs/dynamic_models/single_track.py @@ -3,177 +3,45 @@ from .utils import steering_constraint, accl_constraints -# @njit() -# def vehicle_dynamics_st(x: np.ndarray, u_init: np.ndarray, params: dict): -# """ -# Single Track Vehicle Dynamics. -# From https://gitlab.lrz.de/tum-cps/commonroad-vehicle-models/-/blob/master/vehicleModels_commonRoad.pdf, section 7 - -# Args: -# x (numpy.ndarray (7, )): vehicle state vector (x0, x1, x2, x3, x4, x5, x6) -# x0: x position in global coordinates -# x1: y position in global coordinates -# x2: steering angle of front wheels -# x3: velocity in x direction -# x4: yaw angle -# x5: yaw rate -# x6: slip angle at vehicle center -# u (numpy.ndarray (2, )): control input vector (u1, u2) -# u1: steering angle velocity of front wheels -# u2: longitudinal acceleration -# params (dict): dictionary containing the following parameters: -# mu (float): friction coefficient -# C_Sf (float): cornering stiffness of front wheels -# C_Sr (float): cornering stiffness of rear wheels -# lf (float): distance from center of gravity to front axle -# lr (float): distance from center of gravity to rear axle -# h (float): height of center of gravity -# m (float): mass of vehicle -# I (float): moment of inertia of vehicle, about Z axis -# s_min (float): minimum steering angle -# s_max (float): maximum steering angle -# sv_min (float): minimum steering velocity -# sv_max (float): maximum steering velocity -# v_switch (float): velocity above which the acceleration is no longer able to create wheel spin -# a_max (float): maximum allowed acceleration -# v_min (float): minimum allowed velocity -# v_max (float): maximum allowed velocity - -# Returns: -# f (numpy.ndarray): right hand side of differential equations -# """ -# # States -# X = x[0] -# Y = x[1] -# DELTA = x[2] -# V = x[3] -# PSI = x[4] -# PSI_DOT = x[5] -# BETA = x[6] -# # We have to wrap the slip angle to [-pi, pi] -# # BETA = np.arctan2(np.sin(BETA), np.cos(BETA)) - -# # gravity constant m/s^2 -# g = 9.81 - -# # constraints -# u = np.array( -# [ -# steering_constraint( -# DELTA, -# u_init[0], -# params["s_min"], -# params["s_max"], -# params["sv_min"], -# params["sv_max"], -# ), -# accl_constraints( -# V, -# u_init[1], -# params["v_switch"], -# params["a_max"], -# params["v_min"], -# params["v_max"], -# ), -# ] -# ) -# # Controls -# STEER_VEL = u[0] -# ACCL = u[1] - -# # switch to kinematic model for small velocities -# if V < 0.5: -# # wheelbase -# lwb = params["lf"] + params["lr"] -# BETA_HAT = np.arctan(np.tan(DELTA) * params["lr"] / lwb) -# BETA_DOT = ( -# (1 / (1 + (np.tan(DELTA) * (params["lr"] / lwb)) ** 2)) -# * (params["lr"] / (lwb * np.cos(DELTA) ** 2)) -# * STEER_VEL -# ) -# f = np.array( -# [ -# V * np.cos(PSI + BETA_HAT), # X_DOT -# V * np.sin(PSI + BETA_HAT), # Y_DOT -# STEER_VEL, # DELTA_DOT -# ACCL, # V_DOT -# V * np.cos(BETA_HAT) * np.tan(DELTA) / lwb, # PSI_DOT -# (1 / lwb) -# * ( -# ACCL * np.cos(BETA) * np.tan(DELTA) -# - V * np.sin(BETA) * np.tan(DELTA) * BETA_DOT -# + ((V * np.cos(BETA) * STEER_VEL) / (np.cos(DELTA) ** 2)) -# ), # PSI_DOT_DOT -# BETA_DOT, # BETA_DOT -# ] -# ) -# else: -# # system dynamics -# glr = g * params["lr"] - ACCL * params["h"] -# glf = g * params["lf"] + ACCL * params["h"] -# f = np.array( -# [ -# V * np.cos(PSI + BETA), # X_DOT -# V * np.sin(PSI + BETA), # Y_DOT -# STEER_VEL, # DELTA_DOT -# ACCL, # V_DOT -# PSI_DOT, # PSI_DOT -# ( -# (params["mu"] * params["m"]) -# / (params["I"] * (params["lf"] + params["lr"])) -# ) -# * ( -# params["lf"] * params["C_Sf"] * (glr) * DELTA -# + ( -# params["lr"] * params["C_Sr"] * (glf) -# - params["lf"] * params["C_Sf"] * (glr) -# ) -# * BETA -# - ( -# params["lf"] * params["lf"] * params["C_Sf"] * (glr) -# + params["lr"] * params["lr"] * params["C_Sr"] * (glf) -# ) -# * (PSI_DOT / V) -# ), # PSI_DOT_DOT -# (params["mu"] / (V * (params["lr"] + params["lf"]))) -# * ( -# params["C_Sf"] * (glr) * DELTA -# - (params["C_Sr"] * (glf) + params["C_Sf"] * (glr)) * BETA -# + ( -# params["C_Sr"] * (glf) * params["lr"] -# - params["C_Sf"] * (glr) * params["lf"] -# ) -# * (PSI_DOT / V) -# ) -# - PSI_DOT, # BETA_DOT -# ] -# ) +@njit(cache=True) +def vehicle_dynamics_st(x: np.ndarray, u_init: np.ndarray, params: np.ndarray) -> np.ndarray: + """ + Single Track Vehicle Dynamics. + From https://gitlab.lrz.de/tum-cps/commonroad-vehicle-models/-/blob/master/vehicleModels_commonRoad.pdf, section 7 -# return f + Args: + x (numpy.ndarray (7, )): vehicle state vector (x0, x1, x2, x3, x4, x5, x6) + x0: x position in global coordinates + x1: y position in global coordinates + x2: steering angle of front wheels + x3: velocity in x direction + x4: yaw angle + x5: yaw rate + x6: slip angle at vehicle center + u (numpy.ndarray (2, )): control input vector (u1, u2) + u1: steering angle velocity of front wheels + u2: longitudinal acceleration + params (dict): dictionary containing the following parameters: + mu (float): friction coefficient + C_Sf (float): cornering stiffness of front wheels + C_Sr (float): cornering stiffness of rear wheels + lf (float): distance from center of gravity to front axle + lr (float): distance from center of gravity to rear axle + h (float): height of center of gravity + m (float): mass of vehicle + I (float): moment of inertia of vehicle, about Z axis + s_min (float): minimum steering angle + s_max (float): maximum steering angle + sv_min (float): minimum steering velocity + sv_max (float): maximum steering velocity + v_switch (float): velocity above which the acceleration is no longer able to create wheel spin + a_max (float): maximum allowed acceleration + v_min (float): minimum allowed velocity + v_max (float): maximum allowed velocity -@njit(cache=True) -def vehicle_dynamics_st( - x: np.ndarray, - u_init: np.ndarray, - mu: float, - C_Sf: float, - C_Sr: float, - lf: float, - lr: float, - h: float, - m: float, - I: float, - s_min: float, - s_max: float, - sv_min: float, - sv_max: float, - v_switch: float, - a_max: float, - v_min: float, - v_max: float, - width: float, - length: float -) -> np.ndarray: + Returns: + f (numpy.ndarray): right hand side of differential equations + """ # States X = x[0] Y = x[1] @@ -182,17 +50,58 @@ def vehicle_dynamics_st( PSI = x[4] PSI_DOT = x[5] BETA = x[6] + # We have to wrap the slip angle to [-pi, pi] + # BETA = np.arctan2(np.sin(BETA), np.cos(BETA)) - g = 9.81 # gravity constant + # gravity constant m/s^2 + g = 9.81 + mu = params[0] + C_Sf = params[1] # front tire cornering stiffness [N/rad] CF + C_Sr = params[2] # rear tire cornering stiffness [N/rad] CR + lf = params[3] # distance from spring mass center of gravity to front axle [m] LENA + lr = params[4] # distance from spring mass center of gravity to rear axle [m] LENB + h = params[5] # M_s center of gravity above ground [m] HS + m = params[6] # vehicle mass [kg] MASS + I = params[7] # moment of inertia for sprung mass in yaw [kg m^2] IZZ + s_min = params[8] # minimum steering angle [rad] + s_max = params[9] # maximum steering angle [rad] + sv_min = params[10] # minimum steering velocity [rad/s] + sv_max = params[11] # maximum steering velocity [rad/s] + v_switch = params[12] # switching velocity [m/s] + a_max = params[13] # maximum absolute acceleration [m/s^2] + v_min = params[14] # minimum velocity [m/s] + v_max = params[15] # maximum velocity [m/s] + # width = params[16] # vehicle width [m] + # length = params[17] # vehicle length [m] - u = [ - steering_constraint(DELTA, u_init[0], s_min, s_max, sv_min, sv_max), - accl_constraints(V, u_init[1], v_switch, a_max, v_min, v_max) - ] + # constraints + u = np.array( + [ + steering_constraint( + DELTA, + u_init[0], + s_min, + s_max, + sv_min, + sv_max, + ), + accl_constraints( + V, + u_init[1], + v_switch, + a_max, + v_min, + v_max, + ), + ] + ) + # Controls STEER_VEL = u[0] ACCL = u[1] + # switch to kinematic model for small velocities if V < 0.5: + # wheelbase lwb = lf + lr BETA_HAT = np.arctan(np.tan(DELTA) * lr / lwb) BETA_DOT = ( @@ -200,41 +109,65 @@ def vehicle_dynamics_st( * (lr / (lwb * np.cos(DELTA) ** 2)) * STEER_VEL ) - f = np.asarray([ - V * np.cos(PSI + BETA_HAT), - V * np.sin(PSI + BETA_HAT), - STEER_VEL, - ACCL, - V * np.cos(BETA_HAT) * np.tan(DELTA) / lwb, - (1 / lwb) * ( - ACCL * np.cos(BETA) * np.tan(DELTA) - - V * np.sin(BETA) * np.tan(DELTA) * BETA_DOT - + (V * np.cos(BETA) * STEER_VEL) / (np.cos(DELTA) ** 2) - ), - BETA_DOT - ]) + f = np.array( + [ + V * np.cos(PSI + BETA_HAT), # X_DOT + V * np.sin(PSI + BETA_HAT), # Y_DOT + STEER_VEL, # DELTA_DOT + ACCL, # V_DOT + V * np.cos(BETA_HAT) * np.tan(DELTA) / lwb, # PSI_DOT + (1 / lwb) + * ( + ACCL * np.cos(BETA) * np.tan(DELTA) + - V * np.sin(BETA) * np.tan(DELTA) * BETA_DOT + + ((V * np.cos(BETA) * STEER_VEL) / (np.cos(DELTA) ** 2)) + ), # PSI_DOT_DOT + BETA_DOT, # BETA_DOT + ] + ) else: + # system dynamics glr = g * lr - ACCL * h glf = g * lf + ACCL * h - f = np.asarray([ - V * np.cos(PSI + BETA), - V * np.sin(PSI + BETA), - STEER_VEL, - ACCL, - PSI_DOT, - (mu * m / (I * (lf + lr))) * ( - lf * C_Sf * glr * DELTA - + (lr * C_Sr * glf - lf * C_Sf * glr) * BETA - - (lf**2 * C_Sf * glr + lr**2 * C_Sr * glf) * (PSI_DOT / V) - ), - (mu / (V * (lr + lf))) * ( - C_Sf * glr * DELTA - - (C_Sr * glf + C_Sf * glr) * BETA - + (C_Sr * glf * lr - C_Sf * glr * lf) * (PSI_DOT / V) - ) - PSI_DOT - ]) - return f + f = np.array( + [ + V * np.cos(PSI + BETA), # X_DOT + V * np.sin(PSI + BETA), # Y_DOT + STEER_VEL, # DELTA_DOT + ACCL, # V_DOT + PSI_DOT, # PSI_DOT + ( + (mu * m) + / (I * (lf + lr)) + ) + * ( + lf * C_Sf * (glr) * DELTA + + ( + lr * C_Sr * (glf) + - lf * C_Sf * (glr) + ) + * BETA + - ( + lf * lf * C_Sf * (glr) + + lr * lr * C_Sr * (glf) + ) + * (PSI_DOT / V) + ), # PSI_DOT_DOT + (mu / (V * (lr + lf))) + * ( + C_Sf * (glr) * DELTA + - (C_Sr * (glf) + C_Sf * (glr)) * BETA + + ( + C_Sr * (glf) * lr + - C_Sf * (glr) * lf + ) + * (PSI_DOT / V) + ) + - PSI_DOT, # BETA_DOT + ] + ) + return f @njit(cache=True) def get_standardized_state_st(x: np.ndarray) -> np.ndarray: diff --git a/f1tenth_gym/envs/f110_env.py b/f1tenth_gym/envs/f110_env.py index 64c5c369..245ea206 100644 --- a/f1tenth_gym/envs/f110_env.py +++ b/f1tenth_gym/envs/f110_env.py @@ -98,7 +98,7 @@ def __init__(self, config: dict = None, render_mode=None, **kwargs): self.model = DynamicModel.from_string(self.config["model"]) self.observation_config = self.config["observation_config"] self.action_type = CarAction(self.config["control_input"], params=self.params) - + # env states self.poses_x = [] self.poses_y = [] diff --git a/f1tenth_gym/envs/observation.py b/f1tenth_gym/envs/observation.py index 643441ff..ee005025 100644 --- a/f1tenth_gym/envs/observation.py +++ b/f1tenth_gym/envs/observation.py @@ -78,7 +78,6 @@ def observe(self): for i, agent_id in enumerate(self.env.unwrapped.agent_ids): scan = self.env.unwrapped.sim.agent_scans[i] agent = self.env.unwrapped.sim.agents[i] - # create agent's observation dict agent_obs = { "scan": scan.copy(), From d3b43126d8c46d6665ec613cfda8d383ff22942d Mon Sep 17 00:00:00 2001 From: zzangupenn Date: Tue, 1 Jul 2025 23:10:19 -0400 Subject: [PATCH 36/54] run_in_empty_track working --- examples/run_in_empty_track.py | 5 +++-- f1tenth_gym/envs/f110_env.py | 23 +++++++++++++---------- f1tenth_gym/envs/observation.py | 12 ++++++------ f1tenth_gym/envs/track/cubic_spline.py | 3 ++- f1tenth_gym/envs/track/track.py | 4 ++-- 5 files changed, 26 insertions(+), 21 deletions(-) diff --git a/examples/run_in_empty_track.py b/examples/run_in_empty_track.py index f89e786c..cb308868 100644 --- a/examples/run_in_empty_track.py +++ b/examples/run_in_empty_track.py @@ -25,6 +25,7 @@ def main(): "map": track, "num_agents": 1, "observation_config": {"type": "kinematic_state"}, + "reset_config": {"type": "rl_random_static"}, }, render_mode="human", ) @@ -44,8 +45,8 @@ def main(): obs["agent_0"]["pose_x"], obs["agent_0"]["pose_y"], obs["agent_0"]["pose_theta"], - lookahead_distance=0.8, - vgain=1.0, + lookahead_distance=1.0, + vgain=0.8, ) action = np.array([[steer, speed]]) obs, timestep, terminated, truncated, infos = env.step(action) diff --git a/f1tenth_gym/envs/f110_env.py b/f1tenth_gym/envs/f110_env.py index 245ea206..4d756ebc 100644 --- a/f1tenth_gym/envs/f110_env.py +++ b/f1tenth_gym/envs/f110_env.py @@ -116,17 +116,20 @@ def __init__(self, config: dict = None, render_mode=None, **kwargs): self.lap_times_finish = np.zeros((self.num_agents, )) self.lap_counts = np.zeros((self.num_agents, )) self.sim_time = 0.0 - - if '/' in self.map or '\\' in self.map: - self.track = Track.from_track_path( - self.map, - track_scale=self.config["map_scale"], - ) + + if type(self.map) is not Track: + if '/' in self.map or '\\' in self.map: + self.track = Track.from_track_path( + self.map, + track_scale=self.config["map_scale"], + ) + else: + self.track = Track.from_track_name( + self.map, + track_scale=self.config["map_scale"], + ) # load track in gym env for convenience else: - self.track = Track.from_track_name( - self.map, - track_scale=self.config["map_scale"], - ) # load track in gym env for convenience + self.track = self.map # use the track directly # initiate stuff self.sim = Simulator( diff --git a/f1tenth_gym/envs/observation.py b/f1tenth_gym/envs/observation.py index ee005025..4b457d19 100644 --- a/f1tenth_gym/envs/observation.py +++ b/f1tenth_gym/envs/observation.py @@ -294,12 +294,12 @@ def observe(self): std_state = agent.standard_state - x, y, theta = std_state["x"], std_state["y"], std_state["yaw"] - delta = std_state["delta"] - beta = std_state["slip"] - vx = std_state["v_x"] - vy = std_state["v_y"] - angvel = std_state["yaw_rate"] + x, y, theta = std_state[0], std_state[1], std_state[4] + delta = std_state[2] + beta = std_state[6] + vx = std_state[4] * np.cos(std_state[6]) + vy = std_state[4] * np.sin(std_state[6]) + angvel = std_state[5] # create agent's observation dict agent_obs = { diff --git a/f1tenth_gym/envs/track/cubic_spline.py b/f1tenth_gym/envs/track/cubic_spline.py index de857949..e8b73dac 100644 --- a/f1tenth_gym/envs/track/cubic_spline.py +++ b/f1tenth_gym/envs/track/cubic_spline.py @@ -47,7 +47,8 @@ def __init__(self, x, y, else: self.points[-1] = self.points[0] self.s = ss if ss is not None else self.__calc_s(self.points[:, 0], self.points[:, 1]) - self.ss, self.psis, self.ks = self.s, psis, ks + self.xs, self.ys, self.ss, self.psis, self.ks, self.vxs = \ + self.points[:, 0], self.points[:, 1], self.s, np.arctan2(self.points[:, 3], self.points[:, 2]), self.points[:, 4], self.points[:, 5] self.s_interval = (self.s[-1] - self.s[0]) / len(self.s) self.s_frame_max = self.s[-1] diff --git a/f1tenth_gym/envs/track/track.py b/f1tenth_gym/envs/track/track.py index dc6232c4..6a85019e 100644 --- a/f1tenth_gym/envs/track/track.py +++ b/f1tenth_gym/envs/track/track.py @@ -265,8 +265,8 @@ def from_refline(x: np.ndarray, y: np.ndarray, velx: np.ndarray): resolution = 0.05 margin_perc = 0.1 - spline = CubicSpline2D(x=x, y=y) - ss, xs, ys, yaws, ks, vxs = spline.ss, spline.xs, spline.ys, spline.psis, spline.ks, velx + spline = CubicSpline2D(x=x, y=y, vxs=velx) + ss, xs, ys, yaws, ks, vxs = spline.ss, spline.xs, spline.ys, spline.psis, spline.ks, spline.vxs refline = Raceline( ss=np.array(ss).astype(np.float32), From 4be683ce7072b81f8f206bc64036de5504ecd320 Mon Sep 17 00:00:00 2001 From: zzangupenn Date: Wed, 2 Jul 2025 03:09:46 -0400 Subject: [PATCH 37/54] add pyqtgl frame output --- examples/video_recording.py | 12 +- examples/waypoint_follow.py | 20 +- f1tenth_gym/envs/rendering/pyqtgl_objects.py | 4 +- f1tenth_gym/envs/rendering/rendering.yaml | 4 + .../envs/rendering/rendering_pyqtgl.py | 179 +++++++++++++++--- 5 files changed, 182 insertions(+), 37 deletions(-) diff --git a/examples/video_recording.py b/examples/video_recording.py index 8fbd67e8..d7adce47 100644 --- a/examples/video_recording.py +++ b/examples/video_recording.py @@ -3,6 +3,7 @@ import gymnasium.wrappers import numpy as np +from f1tenth_gym.envs.f110_env import F110Env from waypoint_follow import PurePursuitPlanner @@ -10,7 +11,7 @@ def main(): work = { "mass": 3.463388126201571, "lf": 0.15597534362552312, - "tlad": 0.82461887897713965, + "tlad": 0.82461887897713965 * 2, "vgain": 1, } @@ -23,15 +24,21 @@ def main(): "integrator": "rk4", "control_input": ["speed", "steering_angle"], "model": "st", + "params": F110Env.f1tenth_vehicle_params(), "observation_config": {"type": "kinematic_state"}, "params": {"mu": 1.0}, + "reset_config": {"type": "rl_random_static"}, }, render_mode="rgb_array", + # render_mode="unlimited", ) env = gymnasium.wrappers.RecordVideo(env, f"video_{time.time()}") track = env.unwrapped.track planner = PurePursuitPlanner(track=track, wb=0.17145 + 0.15875) + track.raceline.render_waypoints(env.unwrapped.renderer) + for r in planner.get_render_callbacks(): + env.unwrapped.add_render_callback(r) poses = np.array( [ @@ -50,7 +57,7 @@ def main(): start = time.time() frames = [env.render()] - while not done and laptime < 15.0: + while not done and laptime < 5.0: action = env.action_space.sample() for i, agent_id in enumerate(obs.keys()): speed, steer = planner.plan( @@ -70,7 +77,6 @@ def main(): print("Sim elapsed time:", laptime, "Real elapsed time:", time.time() - start) - # close env to trigger video saving env.close() diff --git a/examples/waypoint_follow.py b/examples/waypoint_follow.py index a4a67326..3ec00825 100644 --- a/examples/waypoint_follow.py +++ b/examples/waypoint_follow.py @@ -209,7 +209,7 @@ def render_lookahead_point(self, e): points = self.lookahead_point[:2][None] # shape (1, 2)~ if self.lookahead_point_render is None: self.lookahead_point_render = e.get_points_renderer( - points, color=(200, 0, 0), size=10 + points, color=(228, 26, 28), size=10 ) else: self.lookahead_point_render.update(points) @@ -222,7 +222,7 @@ def render_local_plan(self, e): points = self.waypoints[self.current_index : self.current_index + 10, :2] if self.local_plan_render is None: self.local_plan_render = e.get_lines_renderer( - points, color=(0, 128, 0), size=5 + points, color=(255, 255, 51), size=5 ) else: self.local_plan_render.update(points) @@ -305,7 +305,7 @@ def main(): work = { "mass": 3.463388126201571, "lf": 0.15597534362552312, - "tlad": 0.82461887897713965 * 8, + "tlad": 0.82461887897713965 * 2, "vgain": 1., } num_agents = 1 @@ -318,10 +318,10 @@ def main(): "integrator_timestep": 0.01, "integrator": "rk4", "control_input": ["speed", "steering_angle"], - "model": 'mb', # "ks", "st", "mb" + "model": 'ks', # "ks", "st", "mb" "observation_config": {"type": "direct"}, - # "params": F110Env.f1tenth_vehicle_params(), - "params": F110Env.fullscale_vehicle_params(), + "params": F110Env.f1tenth_vehicle_params(), + # "params": F110Env.fullscale_vehicle_params(), "reset_config": {"type": "rl_random_static"}, "map_scale": 1.0, "enable_rendering": 1, @@ -338,10 +338,10 @@ def main(): planner = PurePursuitPlanner( track=track, wb=( - # F110Env.f1tenth_vehicle_params()["lf"] - # + F110Env.f1tenth_vehicle_params()["lr"] - F110Env.fullscale_vehicle_params()["lf"] - + F110Env.fullscale_vehicle_params()["lr"] + F110Env.f1tenth_vehicle_params()["lf"] + + F110Env.f1tenth_vehicle_params()["lr"] + # F110Env.fullscale_vehicle_params()["lf"] + # + F110Env.fullscale_vehicle_params()["lr"] ), ) diff --git a/f1tenth_gym/envs/rendering/pyqtgl_objects.py b/f1tenth_gym/envs/rendering/pyqtgl_objects.py index cbb37d3c..a5f96784 100644 --- a/f1tenth_gym/envs/rendering/pyqtgl_objects.py +++ b/f1tenth_gym/envs/rendering/pyqtgl_objects.py @@ -113,7 +113,7 @@ def __init__( points: list | np.ndarray, color: Optional[tuple[int, int, int]] = (0, 0, 255), size: Optional[int] = 1, - z_offset: float = 0.01 + z_offset: float = 0.02 ): # Convert to 3D (z=0) self.z_offset = z_offset @@ -184,7 +184,7 @@ def __init__( points: np.ndarray, color: tuple[int, int, int] = (0, 0, 255), size: int = 5, - z_offset: float = 0.01 + z_offset: float = 0.03 ): self.z_offset = z_offset # Normalize color to (0–1) diff --git a/f1tenth_gym/envs/rendering/rendering.yaml b/f1tenth_gym/envs/rendering/rendering.yaml index 007d9dbd..3ccc956c 100644 --- a/f1tenth_gym/envs/rendering/rendering.yaml +++ b/f1tenth_gym/envs/rendering/rendering.yaml @@ -19,3 +19,7 @@ vehicle_palette: # [list] cyclic list of colors for the vehicles - "#888888" - "#a6cee3" - "#b2df8a" +frame_output_method: "offscreen" # [str] method to output frames. Options: "xcb", "offscreen" +# NOTE: "xcb" is slower, requires a display server, but with higher quality, +# "offscreen" is faster, works without a display server, but with lower quality +frame_output_info_label: True # [bool] it toggles the visualization of the frame output label diff --git a/f1tenth_gym/envs/rendering/rendering_pyqtgl.py b/f1tenth_gym/envs/rendering/rendering_pyqtgl.py index ee945f82..fd34628b 100644 --- a/f1tenth_gym/envs/rendering/rendering_pyqtgl.py +++ b/f1tenth_gym/envs/rendering/rendering_pyqtgl.py @@ -1,14 +1,19 @@ import time, logging +import os import numpy as np import pyqtgraph.opengl as gl from PyQt6 import QtWidgets, QtCore, QtGui from typing import Any, Optional from PIL import ImageColor +from PyQt6.QtGui import QImage +import OpenGL.GL as gl_module from ..track import Track from .renderer import EnvRenderer, RenderSpec, ObjectRenderer from .pyqtgl_objects import PointsRenderer, LinesRenderer, ClosedLinesRenderer, CarRenderer from .mesh_renderer import MeshRenderer +# import utilsuite +from PIL import Image, ImageDraw, ImageFont class PyQtEnvRendererGL(EnvRenderer): def __init__( @@ -21,6 +26,8 @@ def __init__( render_fps: int, ): super().__init__() + if render_mode == "rgb_array": + os.environ["QT_QPA_PLATFORM"] = render_spec.frame_output_method self.camera_free_rotation = 0 self.params = params self.agent_ids = agent_ids @@ -37,18 +44,24 @@ def __init__( self.obs = None self.zoom_level = 1.0 self.init = True + # self.timer = utilsuite.Timer() fmt = QtGui.QSurfaceFormat() fmt.setSwapInterval(0) # 0 = no vsync, 1 = vsync QtGui.QSurfaceFormat.setDefaultFormat(fmt) + self.app = QtWidgets.QApplication.instance() or QtWidgets.QApplication([]) self.view = gl.GLViewWidget() + # self._apply_view_flip() self.view.setCameraPosition(pos=QtGui.QVector3D(0, 0, 0), distance=self.default_camera_dist, elevation=90, azimuth=0) self.view.setBackgroundColor((25, 25, 25)) - self.window = QtWidgets.QMainWindow() - self.window.setCentralWidget(self.view) - self.window.setWindowTitle("F1Tenth Gym - OpenGL") - self.window.setGeometry(0, 0, self.render_spec.window_size, self.render_spec.window_size) + self.view.resize(self.render_spec.window_size, self.render_spec.window_size) + + if self.render_mode != "rgb_array": + self.window = QtWidgets.QMainWindow() + self.window.setCentralWidget(self.view) + self.window.setWindowTitle("F1Tenth Gym - OpenGL") + self.window.setGeometry(0, 0, self.render_spec.window_size, self.render_spec.window_size) if self.render_spec.car_model == "2d": if not self.camera_free_rotation: self._enable_pan_only() @@ -56,20 +69,9 @@ def __init__( self._init_map(track) # FPS label - if self.render_mode in ["human", "human_fast", 'unlimited']: - text_rgb = (140, 140, 140) - self.fps_label = QtWidgets.QLabel(self.window) - font = QtGui.QFont("Arial", 14) - self.fps_label.setFont(font) - self.fps_label.setStyleSheet( - f"color: rgb({text_rgb[0]}, {text_rgb[1]}, {text_rgb[2]}); background-color: transparent; padding: 2px;" - ) - self.fps_label.move(10, 10) - self.fps_label.resize(100, 20) - self.fps_label.setAttribute(QtCore.Qt.WidgetAttribute.WA_TransparentForMouseEvents) - self.fps_label.show() - - self.lap_label = QtWidgets.QLabel(self.window) + text_rgb = (140, 140, 140) + if self.render_spec.frame_output_info_label or self.render_mode != "rgb_array": + self.lap_label = QtWidgets.QLabel(self.view) font = QtGui.QFont("Arial", 14) self.lap_label.setFont(font) self.lap_label.setStyleSheet( @@ -79,6 +81,17 @@ def __init__( self.lap_label.resize(220, 30) self.lap_label.setAttribute(QtCore.Qt.WidgetAttribute.WA_TransparentForMouseEvents) self.lap_label.show() + if self.render_mode != "rgb_array": + self.fps_label = QtWidgets.QLabel(self.view) + font = QtGui.QFont("Arial", 14) + self.fps_label.setFont(font) + self.fps_label.setStyleSheet( + f"color: rgb({text_rgb[0]}, {text_rgb[1]}, {text_rgb[2]}); background-color: transparent; padding: 2px;" + ) + self.fps_label.move(10, 10) + self.fps_label.resize(100, 20) + self.fps_label.setAttribute(QtCore.Qt.WidgetAttribute.WA_TransparentForMouseEvents) + self.fps_label.show() # Frame timer self.last_time = time.time() @@ -88,13 +101,26 @@ def __init__( self.sim_time = None self.callbacks = [] self.draw_flag = True - # self.window.show() # Colors self.car_colors = [ tuple(ImageColor.getcolor(c, "RGB")) for c in render_spec.vehicle_palette ] + def _apply_view_flip(self): + """Apply a vertical flip transformation to the OpenGL view.""" + # Override the paintGL method to apply a Y-axis flip transformation + # This will flip the view vertically so it matches the output frame orientation + original_paintGL = self.view.paintGL + def flipped_paintGL(): + gl_module.glPushMatrix() + # Apply the flip transformation (flip Y-axis) + gl_module.glScalef(-1.0, 1.0, 1.0) + # Call the original paintGL + original_paintGL() + gl_module.glPopMatrix() + self.view.paintGL = flipped_paintGL + def _init_map(self, track): map_image = track.occupancy_map map_image = np.rot90(map_image, k=1) @@ -247,10 +273,15 @@ def update(self, obs: dict) -> None: def render(self): if self.draw_flag: if self.init: - self.window.show() + if self.render_mode != "rgb_array": + self.window.show() + else: + self.font = ImageFont.truetype("arial.ttf", 20) self.init = False - if self.obs is not None: + if self.obs is not None and \ + (self.render_mode != "rgb_array" or \ + self.render_spec.frame_output_info_label): self.lap_label.setText(f"Lap Time {self.obs[self.agent_ids[0]]['lap_time']:.2f}, " + f"Lap {int(self.obs[self.agent_ids[0]]['lap_count']):d}") start_time = time.time() @@ -274,6 +305,109 @@ def render(self): elapsed = time.time() - start_time sleep_time = max(0.0, 1/self.render_fps - elapsed) time.sleep(sleep_time) + elif self.render_mode == "rgb_array": + # Option 1: Use ImageExporter (captures Qt widgets if any are in the scene) + # self.timer.tic("render", num=50) + if self.render_spec.frame_output_method == "xcb": + frame = self.grab_frame_with_exporter() + + # Option 2: Use direct OpenGL framebuffer grab (current method) + if self.render_spec.frame_output_method == "offscreen": + frame = self.grab_frame_as_rgb() + # self.timer.toc("render", Hz=1) + return frame + + def grab_frame_as_rgb(self) -> np.ndarray: + """ + Grab the current OpenGL frame buffer and overlay text labels as RGB numpy array. + """ + # Make sure OpenGL context is active + self.view.makeCurrent() + qimg = self.view.grabFramebuffer() + + # Convert to RGB format for consistent pixel layout + qimg = qimg.convertToFormat(QImage.Format.Format_RGB888) + + # Extract raw bytes + width, height = qimg.width(), qimg.height() + ptr = qimg.bits() + # Tell Python how many bytes to read (width*height*3 for RGB888) + ptr.setsize(height * width * 3) # 3 bytes per pixel for RGB888 + img_array = np.frombuffer(ptr, dtype=np.uint8).reshape((height, width, 3)) + + img_array = img_array.copy() # Ensure we have a contiguous copy + # img_array = np.flip(img_array, axis=0) + + # Overlay text information using OpenCV + if self.render_spec.frame_output_info_label: + self._overlay_text_on_frame(img_array) + + return img_array + + def grab_frame_with_exporter(self) -> np.ndarray: + """ + Grab the current frame by capturing the entire widget including Qt labels. + Since ImageExporter doesn't work with GLViewWidget, we'll capture the widget directly. + """ + # Make sure the widget is updated and everything is rendered + + self.app.processEvents() + + # Capture the entire view widget (this should include Qt labels if they're children) + pixmap = self.view.grab() + qimg = pixmap.toImage() + + # Convert to RGB format + if qimg.format() != QImage.Format.Format_RGB888: + qimg = qimg.convertToFormat(QImage.Format.Format_RGB888) + + width = qimg.width() + height = qimg.height() + + ptr = qimg.bits() + ptr.setsize(height * width * 3) # 3 bytes per pixel for RGB + img_array = np.array(ptr).reshape(height, width, 3) + + # No need to flip since this captures the widget as displayed + # (not the OpenGL framebuffer directly) + + # Ensure the array is contiguous in memory for video encoding + # img_array = np.ascontiguousarray(img_array) + + + return img_array + + def _overlay_text_on_frame(self, img_array: np.ndarray) -> None: + """ + Overlay text information (FPS and lap data) onto the frame using TrueType fonts. + """ + + height, width = img_array.shape[:2] + + # Convert numpy array to PIL Image + pil_img = Image.fromarray(img_array) + draw = ImageDraw.Draw(pil_img) + + # Text color (RGB format for PIL) + color = (140, 140, 140) + + # Lap information text (top-right) + if self.obs is not None: + lap_time = self.obs[self.agent_ids[0]]['lap_time'] + lap_count = int(self.obs[self.agent_ids[0]]['lap_count']) + lap_text = f"Lap Time: {lap_time:.2f}, Lap: {lap_count}" + + # Get text size for positioning + bbox = draw.textbbox((0, 0), lap_text, font=self.font) + text_width = bbox[2] - bbox[0] + x_pos = width - text_width - 10 + + # Draw text + draw.text((x_pos, 10), lap_text, font=self.font, fill=color) + + # Convert back to numpy array + img_array[:] = np.array(pil_img) + def add_renderer_callback(self, callback_fn): """ @@ -326,4 +460,5 @@ def get_closed_lines_renderer( return ClosedLinesRenderer(self, points, color, size, **kwargs) def close(self): - self.window.close() + if self.render_mode != "rgb_array": + self.window.close() From c7af1d7371296e9f99686ad0f364de403d751f21 Mon Sep 17 00:00:00 2001 From: Ahmad Amine Date: Thu, 3 Jul 2025 03:20:44 -0400 Subject: [PATCH 38/54] Fix cubic spline init --- examples/waypoint_follow.py | 6 ------ f1tenth_gym/envs/track/cubic_spline.py | 4 ++-- f1tenth_gym/envs/track/track.py | 2 +- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/examples/waypoint_follow.py b/examples/waypoint_follow.py index 3ec00825..1793599c 100644 --- a/examples/waypoint_follow.py +++ b/examples/waypoint_follow.py @@ -370,13 +370,7 @@ def main(): work["vgain"], ) action[i] = np.array([steer, speed]) - t1 = time.time() obs, step_reward, done, truncated, info = env.step(action) - - times.append(1/(time.time() - t1)) - if len(times) > 2000: - print("FPS:", np.mean(times)) - times = [] laptime += step_reward frame = env.render() diff --git a/f1tenth_gym/envs/track/cubic_spline.py b/f1tenth_gym/envs/track/cubic_spline.py index 452d3094..78f78bed 100644 --- a/f1tenth_gym/envs/track/cubic_spline.py +++ b/f1tenth_gym/envs/track/cubic_spline.py @@ -47,8 +47,8 @@ def __init__(self, x, y, else: self.points[-1] = self.points[0] self.s = ss if ss is not None else self.__calc_s(self.points[:, 0], self.points[:, 1]) - self.xs, self.ys, self.ss, self.psis, self.ks, self.vxs = \ - self.points[:, 0], self.points[:, 1], self.s, np.arctan2(self.points[:, 3], self.points[:, 2]), self.points[:, 4], self.points[:, 5] + self.xs, self.ys, self.ss, self.psis, self.ks, self.vxs , self.axs = \ + self.points[:, 0], self.points[:, 1], self.s, np.arctan2(self.points[:, 3], self.points[:, 2]), self.points[:, 4], self.points[:, 5], self.points[:, 6] self.s_interval = (self.s[-1] - self.s[0]) / len(self.s) self.s_frame_max = self.s[-1] diff --git a/f1tenth_gym/envs/track/track.py b/f1tenth_gym/envs/track/track.py index 78bab34b..616a7851 100644 --- a/f1tenth_gym/envs/track/track.py +++ b/f1tenth_gym/envs/track/track.py @@ -265,7 +265,7 @@ def from_refline(x: np.ndarray, y: np.ndarray, velx: np.ndarray): resolution = 0.05 margin_perc = 0.1 - spline = CubicSpline2D(x=x, y=y, vxs=velx) + spline = CubicSplineND(x=x, y=y, vxs=velx) ss, xs, ys, yaws, ks, vxs = spline.ss, spline.xs, spline.ys, spline.psis, spline.ks, spline.vxs refline = Raceline( From 80c35d0fa78aee775757d92c0dec4f8ac08e124e Mon Sep 17 00:00:00 2001 From: Ahmad Amine Date: Fri, 4 Jul 2025 15:26:28 -0400 Subject: [PATCH 39/54] Restore Readme --- README.md | 65 ++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 47 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index ac9f7396..deafba72 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,14 @@ +![Python 3.8 3.9](https://github.com/f1tenth/f1tenth_gym/actions/workflows/ci.yml/badge.svg) +![Docker](https://github.com/f1tenth/f1tenth_gym/actions/workflows/docker.yml/badge.svg) +![Code Style](https://github.com/f1tenth/f1tenth_gym/actions/workflows/lint.yml/badge.svg) + # The F1TENTH Gym environment -Zirui branch TODO list: -- [x] clip lidar after adding noise, put lidar noise in config -- [x] remove unnecessary use of dictionary. model st is 50% faster, mb is 150% faster. -- [x] toggle renderer -- [ ] verify collision -- [x] scan toggle -- [x] separate time step and integrater time step -- [x] add frenet -- [x] use correct loop count frenet_based, added max loop num -- [ ] also add winding_angle -- [x] simplify std_state and observation -- [x] add option "state" in reset -- [x] control_buffer_size, lidar fov, lidar nums in config -- [ ] double check dynamics result -- [x] implemented new rendering with pyqtgraph.opengl -- [x] added 3d mesh renderering for proof of concept -- [ ] merge lidar scan fix +This is the repository of the F1TENTH Gym environment. + +This project is still under heavy developement. + +You can find the [documentation](https://f1tenth-gym.readthedocs.io/en/latest/) of the environment here. ## Quickstart We recommend installing the simulation inside a virtualenv. You can install the environment by running: @@ -33,4 +25,41 @@ Then you can run a quick waypoint follow example by: ```bash cd examples python3 waypoint_follow.py -``` \ No newline at end of file +``` + +A Dockerfile is also provided with support for the GUI with nvidia-docker (nvidia GPU required): +```bash +docker build -t f1tenth_gym_container -f Dockerfile . +docker run --gpus all -it -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix f1tenth_gym_container +```` +Then the same example can be ran. + +## Known issues +- Library support issues on Windows. You must use Python 3.8 as of 10-2021 +- On MacOS Big Sur and above, when rendering is turned on, you might encounter the error: +``` +ImportError: Can't find framework /System/Library/Frameworks/OpenGL.framework. +``` +You can fix the error by installing a newer version of pyglet: +```bash +$ pip3 install pyglet==1.5.11 +``` +And you might see an error similar to +``` +gym 0.17.3 requires pyglet<=1.5.0,>=1.4.0, but you'll have pyglet 1.5.11 which is incompatible. +``` +which could be ignored. The environment should still work without error. + +## Citing +If you find this Gym environment useful, please consider citing: + +``` +@inproceedings{okelly2020f1tenth, + title={F1TENTH: An Open-source Evaluation Environment for Continuous Control and Reinforcement Learning}, + author={O’Kelly, Matthew and Zheng, Hongrui and Karthik, Dhruv and Mangharam, Rahul}, + booktitle={NeurIPS 2019 Competition and Demonstration Track}, + pages={77--89}, + year={2020}, + organization={PMLR} +} +``` From a512d43e07e31f16c965bb3f4c6f21eb46910cef Mon Sep 17 00:00:00 2001 From: Ahmad Amine Date: Thu, 10 Jul 2025 04:11:18 -0400 Subject: [PATCH 40/54] Fix rgb_array recording to work for windows, simpler, faster --- examples/run_in_empty_track.py | 2 +- examples/video_recording.py | 5 +- f1tenth_gym/envs/rendering/__init__.py | 2 - .../envs/rendering/rendering_pyqtgl.py | 98 +++++++++---------- 4 files changed, 48 insertions(+), 59 deletions(-) diff --git a/examples/run_in_empty_track.py b/examples/run_in_empty_track.py index cb308868..de0c0265 100644 --- a/examples/run_in_empty_track.py +++ b/examples/run_in_empty_track.py @@ -27,7 +27,7 @@ def main(): "observation_config": {"type": "kinematic_state"}, "reset_config": {"type": "rl_random_static"}, }, - render_mode="human", + render_mode="unlimited", ) planner = PurePursuitPlanner(track=track, wb=0.17145 + 0.15875) diff --git a/examples/video_recording.py b/examples/video_recording.py index d7adce47..e640a854 100644 --- a/examples/video_recording.py +++ b/examples/video_recording.py @@ -11,7 +11,7 @@ def main(): work = { "mass": 3.463388126201571, "lf": 0.15597534362552312, - "tlad": 0.82461887897713965 * 2, + "tlad": 0.82461887897713965, "vgain": 1, } @@ -26,11 +26,9 @@ def main(): "model": "st", "params": F110Env.f1tenth_vehicle_params(), "observation_config": {"type": "kinematic_state"}, - "params": {"mu": 1.0}, "reset_config": {"type": "rl_random_static"}, }, render_mode="rgb_array", - # render_mode="unlimited", ) env = gymnasium.wrappers.RecordVideo(env, f"video_{time.time()}") track = env.unwrapped.track @@ -77,6 +75,7 @@ def main(): print("Sim elapsed time:", laptime, "Real elapsed time:", time.time() - start) + # close env to trigger video saving env.close() diff --git a/f1tenth_gym/envs/rendering/__init__.py b/f1tenth_gym/envs/rendering/__init__.py index c1b95d63..4c25a2f8 100644 --- a/f1tenth_gym/envs/rendering/__init__.py +++ b/f1tenth_gym/envs/rendering/__init__.py @@ -41,8 +41,6 @@ def make_renderer( os.environ["QT_QPA_PLATFORM"] = "offscreen" from .rendering_pyqt import PyQtEnvRenderer as EnvRenderer elif render_spec.render_type == "pyqt6gl": - if render_mode in ["rgb_array", "rgb_array_list"]: - os.environ["QT_QPA_PLATFORM"] = "offscreen" from .rendering_pyqtgl import PyQtEnvRendererGL as EnvRenderer else: raise ValueError(f"Unknown render type: {render_spec.render_type}") diff --git a/f1tenth_gym/envs/rendering/rendering_pyqtgl.py b/f1tenth_gym/envs/rendering/rendering_pyqtgl.py index fd34628b..7848c656 100644 --- a/f1tenth_gym/envs/rendering/rendering_pyqtgl.py +++ b/f1tenth_gym/envs/rendering/rendering_pyqtgl.py @@ -1,3 +1,4 @@ +import signal import time, logging import os import numpy as np @@ -12,8 +13,8 @@ from .renderer import EnvRenderer, RenderSpec, ObjectRenderer from .pyqtgl_objects import PointsRenderer, LinesRenderer, ClosedLinesRenderer, CarRenderer from .mesh_renderer import MeshRenderer -# import utilsuite from PIL import Image, ImageDraw, ImageFont +import cv2 class PyQtEnvRendererGL(EnvRenderer): def __init__( @@ -26,8 +27,6 @@ def __init__( render_fps: int, ): super().__init__() - if render_mode == "rgb_array": - os.environ["QT_QPA_PLATFORM"] = render_spec.frame_output_method self.camera_free_rotation = 0 self.params = params self.agent_ids = agent_ids @@ -44,24 +43,24 @@ def __init__( self.obs = None self.zoom_level = 1.0 self.init = True - # self.timer = utilsuite.Timer() fmt = QtGui.QSurfaceFormat() fmt.setSwapInterval(0) # 0 = no vsync, 1 = vsync QtGui.QSurfaceFormat.setDefaultFormat(fmt) self.app = QtWidgets.QApplication.instance() or QtWidgets.QApplication([]) - self.view = gl.GLViewWidget() - # self._apply_view_flip() + self.view = gl.GLViewWidget() + self.view.setCameraPosition(pos=QtGui.QVector3D(0, 0, 0), distance=self.default_camera_dist, elevation=90, azimuth=0) - self.view.setBackgroundColor((25, 25, 25)) - self.view.resize(self.render_spec.window_size, self.render_spec.window_size) + self.view.setBackgroundColor("w") + self.view.resize(self.render_spec.window_size, self.render_spec.window_size) + self.prealloc_frame = np.zeros( + (self.render_spec.window_size, self.render_spec.window_size, 3), dtype=np.uint8 + ) - if self.render_mode != "rgb_array": - self.window = QtWidgets.QMainWindow() - self.window.setCentralWidget(self.view) - self.window.setWindowTitle("F1Tenth Gym - OpenGL") - self.window.setGeometry(0, 0, self.render_spec.window_size, self.render_spec.window_size) + self.window = QtWidgets.QMainWindow() + self.window.setWindowTitle("F1Tenth Gym - OpenGL") + self.window.setGeometry(0, 0, self.render_spec.window_size, self.render_spec.window_size) if self.render_spec.car_model == "2d": if not self.camera_free_rotation: self._enable_pan_only() @@ -69,8 +68,9 @@ def __init__( self._init_map(track) # FPS label - text_rgb = (140, 140, 140) - if self.render_spec.frame_output_info_label or self.render_mode != "rgb_array": + text_rgb = (125, 125, 125) + + if self.render_spec.frame_output_info_label: self.lap_label = QtWidgets.QLabel(self.view) font = QtGui.QFont("Arial", 14) self.lap_label.setFont(font) @@ -81,7 +81,7 @@ def __init__( self.lap_label.resize(220, 30) self.lap_label.setAttribute(QtCore.Qt.WidgetAttribute.WA_TransparentForMouseEvents) self.lap_label.show() - if self.render_mode != "rgb_array": + self.fps_label = QtWidgets.QLabel(self.view) font = QtGui.QFont("Arial", 14) self.fps_label.setFont(font) @@ -106,7 +106,14 @@ def __init__( self.car_colors = [ tuple(ImageColor.getcolor(c, "RGB")) for c in render_spec.vehicle_palette ] - + + if self.render_mode in ["human", "human_fast", 'unlimited']: + signal.signal(signal.SIGINT, signal.SIG_DFL) + self.window.setCentralWidget(self.view) + self.window.show() + elif self.render_mode == "rgb_array": + self.window.hide() + def _apply_view_flip(self): """Apply a vertical flip transformation to the OpenGL view.""" # Override the paintGL method to apply a Y-axis flip transformation @@ -278,10 +285,8 @@ def render(self): else: self.font = ImageFont.truetype("arial.ttf", 20) self.init = False - - if self.obs is not None and \ - (self.render_mode != "rgb_array" or \ - self.render_spec.frame_output_info_label): + self.window.update() + if self.obs is not None and self.render_spec.frame_output_info_label: self.lap_label.setText(f"Lap Time {self.obs[self.agent_ids[0]]['lap_time']:.2f}, " + f"Lap {int(self.obs[self.agent_ids[0]]['lap_count']):d}") start_time = time.time() @@ -299,22 +304,15 @@ def render(self): self.cars[i].render(self.car_scale) self.app.processEvents() - if self.render_mode in ["human", "human_fast", 'unlimited']: - self._update_fps() - if self.render_fps < float('inf'): - elapsed = time.time() - start_time - sleep_time = max(0.0, 1/self.render_fps - elapsed) - time.sleep(sleep_time) - elif self.render_mode == "rgb_array": - # Option 1: Use ImageExporter (captures Qt widgets if any are in the scene) - # self.timer.tic("render", num=50) - if self.render_spec.frame_output_method == "xcb": - frame = self.grab_frame_with_exporter() + self._update_fps() + if self.render_fps < float('inf'): + elapsed = time.time() - start_time + sleep_time = max(0.0, 1/self.render_fps - elapsed) + time.sleep(sleep_time) - # Option 2: Use direct OpenGL framebuffer grab (current method) - if self.render_spec.frame_output_method == "offscreen": - frame = self.grab_frame_as_rgb() - # self.timer.toc("render", Hz=1) + if self.render_mode == "rgb_array": + # Use direct OpenGL framebuffer grab (current method) + frame = self.grab_frame_as_rgb() return frame def grab_frame_as_rgb(self) -> np.ndarray: @@ -383,30 +381,24 @@ def _overlay_text_on_frame(self, img_array: np.ndarray) -> None: """ height, width = img_array.shape[:2] - - # Convert numpy array to PIL Image - pil_img = Image.fromarray(img_array) - draw = ImageDraw.Draw(pil_img) - - # Text color (RGB format for PIL) color = (140, 140, 140) - - # Lap information text (top-right) if self.obs is not None: lap_time = self.obs[self.agent_ids[0]]['lap_time'] lap_count = int(self.obs[self.agent_ids[0]]['lap_count']) lap_text = f"Lap Time: {lap_time:.2f}, Lap: {lap_count}" - + + # Choose font and scale + font = cv2.FONT_HERSHEY_SIMPLEX + font_scale = 0.7 + thickness = 2 + # Get text size for positioning - bbox = draw.textbbox((0, 0), lap_text, font=self.font) - text_width = bbox[2] - bbox[0] + (text_width, text_height), baseline = cv2.getTextSize(lap_text, font, font_scale, thickness) x_pos = width - text_width - 10 - - # Draw text - draw.text((x_pos, 10), lap_text, font=self.font, fill=color) - - # Convert back to numpy array - img_array[:] = np.array(pil_img) + y_pos = 10 + text_height + + # Draw text directly on the numpy array (OpenCV uses BGR, so reverse color) + cv2.putText(img_array, lap_text, (x_pos, y_pos), font, font_scale, color[::-1], thickness, cv2.LINE_AA) def add_renderer_callback(self, callback_fn): From b57924b2ac91ff3dc5da42ae4bd89c2648625c1c Mon Sep 17 00:00:00 2001 From: Ahmad Amine Date: Thu, 10 Jul 2025 22:57:43 -0400 Subject: [PATCH 41/54] Remove slow redundant window update --- f1tenth_gym/envs/rendering/rendering_pyqtgl.py | 1 - 1 file changed, 1 deletion(-) diff --git a/f1tenth_gym/envs/rendering/rendering_pyqtgl.py b/f1tenth_gym/envs/rendering/rendering_pyqtgl.py index 7848c656..18b620ab 100644 --- a/f1tenth_gym/envs/rendering/rendering_pyqtgl.py +++ b/f1tenth_gym/envs/rendering/rendering_pyqtgl.py @@ -285,7 +285,6 @@ def render(self): else: self.font = ImageFont.truetype("arial.ttf", 20) self.init = False - self.window.update() if self.obs is not None and self.render_spec.frame_output_info_label: self.lap_label.setText(f"Lap Time {self.obs[self.agent_ids[0]]['lap_time']:.2f}, " + f"Lap {int(self.obs[self.agent_ids[0]]['lap_count']):d}") From e945a6e8ff2abc4558b4ab6168e652e3986ead61 Mon Sep 17 00:00:00 2001 From: Ahmad Amine Date: Fri, 11 Jul 2025 04:13:31 -0400 Subject: [PATCH 42/54] Fix non-direct observations' velocities --- f1tenth_gym/envs/observation.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/f1tenth_gym/envs/observation.py b/f1tenth_gym/envs/observation.py index 4b457d19..c04c0abc 100644 --- a/f1tenth_gym/envs/observation.py +++ b/f1tenth_gym/envs/observation.py @@ -297,8 +297,8 @@ def observe(self): x, y, theta = std_state[0], std_state[1], std_state[4] delta = std_state[2] beta = std_state[6] - vx = std_state[4] * np.cos(std_state[6]) - vy = std_state[4] * np.sin(std_state[6]) + vx = std_state[3] * np.cos(std_state[6]) + vy = std_state[3] * np.sin(std_state[6]) angvel = std_state[5] # create agent's observation dict From db758f899684986b9bcf8e5a2ea93cc2d7227734 Mon Sep 17 00:00:00 2001 From: Ahmad Amine Date: Tue, 15 Jul 2025 02:30:42 -0400 Subject: [PATCH 43/54] Default to 1 lap in config --- f1tenth_gym/envs/f110_env.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/f1tenth_gym/envs/f110_env.py b/f1tenth_gym/envs/f110_env.py index 4d756ebc..6ba6b6f6 100644 --- a/f1tenth_gym/envs/f110_env.py +++ b/f1tenth_gym/envs/f110_env.py @@ -207,7 +207,7 @@ def default_config(cls) -> dict: "timestep": 0.01, "integrator_timestep": 0.01, "ego_idx": 0, - "max_laps": 'inf', # 'inf' for infinite laps, or a positive integer + "max_laps": 1, # 'inf' for infinite laps, or a positive integer "integrator": "rk4", "model": "st", # "ks", "st", "mb" "control_input": ["speed", "steering_angle"], # ["speed", "steering_angle"], ["accl", "steering_speed"] From 63a35d147341a339df46ef7c2f60d75a12c58f50 Mon Sep 17 00:00:00 2001 From: Ahmad Amine Date: Tue, 15 Jul 2025 04:36:37 -0400 Subject: [PATCH 44/54] Default to rendering map image --- f1tenth_gym/envs/rendering/rendering.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/f1tenth_gym/envs/rendering/rendering.yaml b/f1tenth_gym/envs/rendering/rendering.yaml index 3ccc956c..d35d7f2e 100644 --- a/f1tenth_gym/envs/rendering/rendering.yaml +++ b/f1tenth_gym/envs/rendering/rendering.yaml @@ -2,7 +2,7 @@ window_size: 800 # [px] width and height of the window focus_on: agent_0 # [str] agent id to focus on (e.g., agent_0) or null for map view zoom_in_factor: 0.5 # [float] zoom in factor. 1.0 is no zoom, >1.0 is zoom in, <1.0 is zoom out bigger_car_when_map_centered: True # [bool] it toggles the size of the car when centered in the map -render_map_img: False # [bool] it toggles the visualization of the map image +render_map_img: True # [bool] it toggles the visualization of the map image show_wheels: True # [bool] it toggles the visualization of the vehicle wheels car_tickness: 1 # [px] thickness of the car show_info: True # [bool] it toggles the visualization of the instruction text From fac1dfe3c5825de95f3ed552977e25272acef1c7 Mon Sep 17 00:00:00 2001 From: Ahmad Amine Date: Tue, 15 Jul 2025 19:17:59 -0400 Subject: [PATCH 45/54] Add slow calc arclength. Update tests to -pi to pi yaws --- f1tenth_gym/envs/track/cubic_spline.py | 64 +++++++++++++------------- f1tenth_gym/envs/track/track.py | 2 +- tests/test_cubic_spline.py | 24 +++++----- 3 files changed, 46 insertions(+), 44 deletions(-) diff --git a/f1tenth_gym/envs/track/cubic_spline.py b/f1tenth_gym/envs/track/cubic_spline.py index 78f78bed..274c6ba7 100644 --- a/f1tenth_gym/envs/track/cubic_spline.py +++ b/f1tenth_gym/envs/track/cubic_spline.py @@ -8,7 +8,7 @@ import numpy as np from scipy import interpolate from typing import Union, Optional -# import scipy.optimize as so +import scipy.optimize as so from f1tenth_gym.envs.track.utils import nearest_point_on_trajectory from numba import njit @@ -199,36 +199,36 @@ def calc_yaw(self, s: float, segment=None) -> Optional[float]: yaw = np.arctan2(sin, cos) return yaw - # def calc_arclength( - # self, x: float, y: float, s_guess: float = 0.0 - # ) -> tuple[float, float]: - # """ - # Calculate arclength for a given point (x, y) on the trajectory. - - # Parameters - # ---------- - # x : float - # x position. - # y : float - # y position. - # s_guess : float - # initial guess for s. - # Returns - # ------- - # s : float - # distance from the start point for given x, y. - # ey : float - # lateral deviation for given x, y. - # """ - # def distance_to_spline(s): - # x_eval, y_eval = self.spline(s)[0, :2] - # return np.sqrt((x - x_eval) ** 2 + (y - y_eval) ** 2) - # output = so.fmin(distance_to_spline, s_guess, full_output=True, disp=False) - # closest_s = float(output[0][0]) - # absolute_distance = output[1] - # return closest_s, absolute_distance - - def calc_arclength_inaccurate(self, x: float, y: float, s_inds=None) -> tuple[float, float]: + def calc_arclength_slow( + self, x: float, y: float, s_guess: float = 0.0 + ) -> tuple[float, float]: + """ + Calculate arclength for a given point (x, y) on the trajectory. + + Parameters + ---------- + x : float + x position. + y : float + y position. + s_guess : float + initial guess for s. + Returns + ------- + s : float + distance from the start point for given x, y. + ey : float + lateral deviation for given x, y. + """ + def distance_to_spline(s): + x_eval, y_eval = self.spline(s)[0, :2] + return np.sqrt((x - x_eval) ** 2 + (y - y_eval) ** 2) + output = so.fmin(distance_to_spline, s_guess, full_output=True, disp=False) + closest_s = float(output[0][0]) + absolute_distance = output[1] + return closest_s, absolute_distance + + def calc_arclength(self, x: float, y: float, s_inds: np.ndarray = None) -> tuple[float, float]: """ Fast calculation of arclength for a given point (x, y) on the trajectory. Less accuarate and less smooth than calc_arclength but much faster. @@ -240,6 +240,8 @@ def calc_arclength_inaccurate(self, x: float, y: float, s_inds=None) -> tuple[fl x position. y : float y position. + s_inds : np.ndarray, optional + Indices of the points to consider for the calculation. Returns ------- diff --git a/f1tenth_gym/envs/track/track.py b/f1tenth_gym/envs/track/track.py index 616a7851..a451cc75 100644 --- a/f1tenth_gym/envs/track/track.py +++ b/f1tenth_gym/envs/track/track.py @@ -464,7 +464,7 @@ def cartesian_to_frenet(self, x, y, psi, use_raceline=False, s_guess=None, use_s else: s_inds = None # print(max(line.spline.s[s_inds]), min(line.spline.s[s_inds])) - s, ey = line.spline.calc_arclength_inaccurate(x, y, s_inds) # inaccurate, but much faster + s, ey = line.spline.calc_arclength(x, y, s_inds) # inaccurate, but much faster # s, ey = line.spline.calc_arclength(x, y, s_guess) # Wrap around s = s % line.spline.s[-1] diff --git a/tests/test_cubic_spline.py b/tests/test_cubic_spline.py index 6612e157..4429165f 100644 --- a/tests/test_cubic_spline.py +++ b/tests/test_cubic_spline.py @@ -23,8 +23,8 @@ def test_calc_yaw(self): # Test the yaw at the four corners of the circle # The yaw of a circle is s + pi/2 self.assertAlmostEqual(track.calc_yaw(0), np.pi / 2, places=2) - self.assertAlmostEqual(track.calc_yaw(np.pi / 2), np.pi, places=2) - self.assertAlmostEqual(track.calc_yaw(np.pi), 3 * np.pi / 2, places=2) + self.assertAlmostEqual(track.calc_yaw(np.pi / 2), -np.pi, places=2) + self.assertAlmostEqual(track.calc_yaw(np.pi), -np.pi / 2, places=2) self.assertAlmostEqual(track.calc_yaw(3 * np.pi / 2), 0, places=2) def test_calc_position(self): @@ -48,32 +48,32 @@ def test_calc_position(self): ) ) - def test_calc_arclength(self): + def test_calc_arclength_slow(self): circle_x = np.cos(np.linspace(0, 2 * np.pi, 100))[:-1] circle_y = np.sin(np.linspace(0, 2 * np.pi, 100))[:-1] track = cubic_spline.CubicSplineND(circle_x, circle_y) # Test the arclength at the four corners of the circle - self.assertAlmostEqual(track.calc_arclength(1, 0, 0)[0], 0, places=2) - self.assertAlmostEqual(track.calc_arclength(0, 1, 0)[0], np.pi / 2, places=2) + self.assertAlmostEqual(track.calc_arclength_slow(1, 0, 0)[0], 0, places=2) + self.assertAlmostEqual(track.calc_arclength_slow(0, 1, 0)[0], np.pi / 2, places=2) self.assertAlmostEqual( - track.calc_arclength(-1, 0, np.pi / 2)[0], np.pi, places=2 + track.calc_arclength_slow(-1, 0, np.pi / 2)[0], np.pi, places=2 ) self.assertAlmostEqual( - track.calc_arclength(0, -1, np.pi)[0], 3 * np.pi / 2, places=2 + track.calc_arclength_slow(0, -1, np.pi)[0], 3 * np.pi / 2, places=2 ) - def test_calc_arclength_inaccurate(self): + def test_calc_arclength(self): circle_x = np.cos(np.linspace(0, 2 * np.pi, 100))[:-1] circle_y = np.sin(np.linspace(0, 2 * np.pi, 100))[:-1] track = cubic_spline.CubicSplineND(circle_x, circle_y) # Test the arclength at the four corners of the circle - self.assertAlmostEqual(track.calc_arclength_inaccurate(1, 0)[0], 0, places=2) + self.assertAlmostEqual(track.calc_arclength(1, 0)[0], 0, places=2) self.assertAlmostEqual( - track.calc_arclength_inaccurate(0, 1)[0], np.pi / 2, places=2 + track.calc_arclength(-1, 0)[0], np.pi, places=2 ) self.assertAlmostEqual( - track.calc_arclength_inaccurate(-1, 0)[0], np.pi, places=2 + track.calc_arclength(-1, 0)[0], np.pi, places=2 ) self.assertAlmostEqual( - track.calc_arclength_inaccurate(0, -1)[0], 3 * np.pi / 2, places=2 + track.calc_arclength(0, -1)[0], 3 * np.pi / 2, places=2 ) From a94eeec487151171465097a6768390eafe96e64e Mon Sep 17 00:00:00 2001 From: Ahmad Amine Date: Tue, 15 Jul 2025 19:22:49 -0400 Subject: [PATCH 46/54] Fix dynamics test to new dynamics call --- tests/test_dynamics.py | 78 ++++++++++++++++++++---------------------- 1 file changed, 38 insertions(+), 40 deletions(-) diff --git a/tests/test_dynamics.py b/tests/test_dynamics.py index 9c30707c..a4ed9d10 100644 --- a/tests/test_dynamics.py +++ b/tests/test_dynamics.py @@ -50,27 +50,28 @@ def func_KS( v_min, v_max, ): + params = np.array([ + mu, + C_Sf, + C_Sr, + lf, + lr, + h, + m, + I, + s_min, + s_max, + sv_min, + sv_max, + v_switch, + a_max, + v_min, + v_max, + ]) f = vehicle_dynamics_ks( x, u, - params={ - "mu": mu, - "C_Sf": C_Sf, - "C_Sr": C_Sr, - "lf": lf, - "lr": lr, - "h": h, - "m": m, - "I": I, - "s_min": s_min, - "s_max": s_max, - "sv_min": sv_min, - "sv_max": sv_max, - "v_switch": v_switch, - "a_max": a_max, - "v_min": v_min, - "v_max": v_max, - }, + params=params, ) return f @@ -96,27 +97,28 @@ def func_ST( v_min, v_max, ): + params = np.array([ + mu, + C_Sf, + C_Sr, + lf, + lr, + h, + m, + I, + s_min, + s_max, + sv_min, + sv_max, + v_switch, + a_max, + v_min, + v_max, + ]) f = vehicle_dynamics_st( x, u, - params={ - "mu": mu, - "C_Sf": C_Sf, - "C_Sr": C_Sr, - "lf": lf, - "lr": lr, - "h": h, - "m": m, - "I": I, - "s_min": s_min, - "s_max": s_max, - "sv_min": sv_min, - "sv_max": sv_max, - "v_switch": v_switch, - "a_max": a_max, - "v_min": v_min, - "v_max": v_max, - }, + params=params, ) return f @@ -655,7 +657,3 @@ def test_zeroinit_rollleft_singletrack(self): ] np.testing.assert_array_almost_equal(x_left_st[-1], x_left_st_gt, decimal=2) - - -if __name__ == "__main__": - unittest.main() From 4cef577154dc2a805a69096ac2019af71fabb867 Mon Sep 17 00:00:00 2001 From: Ahmad Amine Date: Wed, 16 Jul 2025 02:59:49 -0400 Subject: [PATCH 47/54] Fix sim time observation, add unwrapepd to state obs shape --- f1tenth_gym/envs/observation.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/f1tenth_gym/envs/observation.py b/f1tenth_gym/envs/observation.py index c04c0abc..4a8cac21 100644 --- a/f1tenth_gym/envs/observation.py +++ b/f1tenth_gym/envs/observation.py @@ -46,7 +46,7 @@ def space(self): low=-large_num, high=large_num, shape=(7,), dtype=np.float32 ), "state": gym.spaces.Box( - low=-large_num, high=large_num, shape=(int(self.env.model.state_dim),), dtype=np.float32 + low=-large_num, high=large_num, shape=(int(self.env.unwrapped.model.state_dim),), dtype=np.float32 ), "collision": gym.spaces.Box( low=0.0, high=1.0, shape=(), dtype=np.float32 @@ -190,7 +190,7 @@ def observe(self): "collisions": [], "lap_times": [], "lap_counts": [], - "sim_time": [], + "sim_time": self.env.unwrapped.sim_time, } for i, agent in enumerate(self.env.unwrapped.sim.agents): @@ -215,7 +215,6 @@ def observe(self): observations["collisions"].append(collision) observations["lap_times"].append(lap_time) observations["lap_counts"].append(lap_count) - observations["sim_time"].append(self.env.unwrapped.sim_time) # cast to match observation space for key in observations.keys(): From b5436c95bae11f3ffd8551ac9fd0b3ce6df4ce68 Mon Sep 17 00:00:00 2001 From: Ahmad Amine Date: Wed, 16 Jul 2025 03:30:35 -0400 Subject: [PATCH 48/54] Cast sim time to array to suppress warning --- f1tenth_gym/envs/observation.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/f1tenth_gym/envs/observation.py b/f1tenth_gym/envs/observation.py index 4a8cac21..18a150ce 100644 --- a/f1tenth_gym/envs/observation.py +++ b/f1tenth_gym/envs/observation.py @@ -86,7 +86,7 @@ def observe(self): "collision": agent.in_collision, "lap_time": self.env.unwrapped.lap_times[i], "lap_count": self.env.unwrapped.lap_counts[i], - "sim_time": self.env.unwrapped.sim_time, + "sim_time": np.array(self.env.unwrapped.sim_time, dtype=np.float32), } if self.env.unwrapped.config["compute_frenet"]: agent_obs["frenet_pose"] = agent.frenet_pose if hasattr(agent, 'frenet_pose') else np.zeros(3) @@ -190,7 +190,7 @@ def observe(self): "collisions": [], "lap_times": [], "lap_counts": [], - "sim_time": self.env.unwrapped.sim_time, + "sim_time": np.array(self.env.unwrapped.sim_time, dtype=np.float32), } for i, agent in enumerate(self.env.unwrapped.sim.agents): @@ -256,6 +256,9 @@ def space(self): "linear_vel_y": gym.spaces.Box( low=-large_num, high=large_num, shape=(), dtype=np.float32 ), + "linear_vel_magnitude": gym.spaces.Box( # [AA] combined linear velocity, for ST observation + low=-large_num, high=large_num, shape=(), dtype=np.float32 + ), "ang_vel_z": gym.spaces.Box( low=-large_num, high=large_num, shape=(), dtype=np.float32 ), @@ -306,6 +309,7 @@ def observe(self): "pose_x": x, "pose_y": y, "pose_theta": theta, + "linear_vel_magnitude": std_state[3], "linear_vel_x": vx, "linear_vel_y": vy, "ang_vel_z": angvel, @@ -347,7 +351,7 @@ def observation_factory(env, type: str | None, **kwargs) -> Observation: "pose_x", "pose_y", "delta", - "linear_vel_x", + "linear_vel_magnitude", "pose_theta", "ang_vel_z", "beta", From 41de22fa7c11cf7d7e4fbc1a1d5e43fcff853cf2 Mon Sep 17 00:00:00 2001 From: Ahmad Amine Date: Wed, 16 Jul 2025 03:30:59 -0400 Subject: [PATCH 49/54] Update observation test to be consistent with new convention --- tests/test_observation.py | 54 +++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 30 deletions(-) diff --git a/tests/test_observation.py b/tests/test_observation.py index 1872786f..cf7a98c6 100644 --- a/tests/test_observation.py +++ b/tests/test_observation.py @@ -44,6 +44,7 @@ def test_original_obs_space(self): "collisions", "lap_times", "lap_counts", + "sim_time", ] # check that the observation space has the correct types @@ -116,13 +117,13 @@ def test_features_observation(self): ): self.assertTrue(np.allclose(ground_truth, observation)) - def test_unexisting_obs_space(self): + def test_nonexistent_obs_space(self): """ - Check that an error is raised when an unexisting observation type is requested. + Check that an error is raised when a nonexistent observation type is requested. """ env = self._make_env() with self.assertRaises(ValueError): - observation_factory(env, vehicle_id=0, type="unexisting_obs_type") + observation_factory(env, vehicle_id=0, type="nonexistent_obs_type") def test_kinematic_obs_space(self): """ @@ -143,7 +144,7 @@ def test_kinematic_obs_space(self): obs, _, _, _, _ = env.step(env.action_space.sample()) for i, agent_id in enumerate(env.unwrapped.agent_ids): - pose_x, pose_y, _, velx, pose_theta, _, _ = env.unwrapped.sim.agents[i].state + pose_x, pose_y, _, vel, pose_theta, _, beta = env.unwrapped.sim.agents[i].state obs_x, obs_y, obs_theta = ( obs[agent_id]["pose_x"], obs[agent_id]["pose_y"], @@ -151,60 +152,53 @@ def test_kinematic_obs_space(self): ) obs_velx = obs[agent_id]["linear_vel_x"] - for ground_truth, observed in zip( - [pose_x, pose_y, pose_theta, velx], [obs_x, obs_y, obs_theta, obs_velx] - ): - self.assertTrue(np.allclose(ground_truth, observed)) + ground_truth = np.asarray([pose_x, pose_y, pose_theta, vel * np.cos(beta)], dtype=np.float32) + observed = np.asarray([obs_x, obs_y, obs_theta, obs_velx], dtype=np.float32) + self.assertTrue(np.allclose(ground_truth, observed)) def test_dynamic_obs_space(self): """ Check the dynamic state observation space contains the correct features. """ - env = self._make_env(config={"observation_config": {"type": "original"}}) + env = self._make_env(config={"observation_config": {"type": "dynamic_state"}}) - kinematic_features = [ + dynamic_features = [ "pose_x", "pose_y", "pose_theta", - "linear_vel_x", + "linear_vel_magnitude", "ang_vel_z", "delta", "beta", ] - # check kinematic features are in the observation space + # check dynamic features are in the observation space for agent_id in env.unwrapped.agent_ids: space = env.observation_space.spaces[agent_id].spaces - self.assertTrue(all([k in space for k in kinematic_features])) - self.assertTrue(all([k in kinematic_features for k in space])) + self.assertTrue(all([k in space for k in dynamic_features])) + self.assertTrue(all([k in dynamic_features for k in space])) # check the actual observation obs, _ = env.reset() obs, _, _, _, _ = env.step(env.action_space.sample()) for i, agent_id in enumerate(env.unwrapped.agent_ids): - pose_x, pose_y, delta, velx, pose_theta, _, beta = env.unwrapped.sim.agents[i].state - agent_obs = obs[agent_id] - obs_x, obs_y, obs_theta = ( + observed = np.array([ agent_obs["pose_x"], agent_obs["pose_y"], - agent_obs["pose_theta"], - ) - obs_velx, obs_delta, obs_beta = ( - agent_obs["linear_vel_x"], agent_obs["delta"], + agent_obs["linear_vel_magnitude"], + agent_obs["pose_theta"], + agent_obs["ang_vel_z"], agent_obs["beta"], - ) - - for ground_truth, observed in zip( - [pose_x, pose_y, pose_theta, velx, delta, beta], - [obs_x, obs_y, obs_theta, obs_velx, obs_delta, obs_beta], - ): - self.assertTrue(np.allclose(ground_truth, observed)) + ]) + ground_truth = env.unwrapped.sim.agents[i].state.astype(np.float32) + + self.assertTrue(np.allclose(ground_truth, observed)) def test_consistency_observe_space(self): - obs_type_ids = ["direct", "original"] + obs_type_ids = ["kinematic_state", "dynamic_state", "direct", "original"] env = self._make_env() env.reset() @@ -222,7 +216,7 @@ def test_consistency_observe_space(self): def test_gymnasium_api(self): from gymnasium.utils.env_checker import check_env - obs_type_ids = ["direct", "original"] + obs_type_ids = ["direct", "original", "kinematic_state", "dynamic_state"] for obs_type_id in obs_type_ids: env = self._make_env(config={"observation_config": {"type": obs_type_id}}) From 3ef4153936b00a74bd25efcbb29336e295612a0a Mon Sep 17 00:00:00 2001 From: Ahmad Amine Date: Wed, 16 Jul 2025 05:06:16 -0400 Subject: [PATCH 50/54] Close envs in test f110, fix configure test --- tests/test_f110_env.py | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/tests/test_f110_env.py b/tests/test_f110_env.py index b7d00f98..676a0e11 100644 --- a/tests/test_f110_env.py +++ b/tests/test_f110_env.py @@ -28,6 +28,7 @@ def test_gymnasium_api(self): env = self._make_env() check_env(env.unwrapped, skip_render_check=True) + env.close() def test_configure_method(self): """ @@ -74,16 +75,23 @@ def test_configure_method(self): t = 0 while not done0 and not done1: + for agent in obs0: + for observation in obs0[agent]: + if not np.allclose(obs0[agent][observation], obs1[agent][observation]): + print( + f"Observation {observation} should be the same for agent {agent}, " + f"got {obs0[agent][observation]} != {obs1[agent][observation]}" + ) + self.assertTrue( + np.allclose(obs0[agent][observation], obs1[agent][observation]), + f"Observation {observation} should be the same for agent {agent}", + ) + self.assertTrue(done0 == done1, "Done should be the same") action = base_env.action_space.sample() obs0, _, done0, _, _ = base_env.step(action) obs1, _, done1, _, _ = extended_env.step(action) base_env.render() - for k in obs0: - self.assertTrue( - np.allclose(obs0[k], obs1[k]), - f"Observations {k} should be the same", - ) - self.assertTrue(done0 == done1, "Done should be the same") + extended_env.render() t += 1 print(f"Done after {t} steps") @@ -120,6 +128,7 @@ def test_configure_action_space(self): new_action_space_high[0][1] == new_v_max, f"Speed action high should be {new_v_max}", ) + base_env.close() def test_acceleration_action_space(self): """ @@ -146,6 +155,7 @@ def test_acceleration_action_space(self): (action_space_high[0][1] - params["a_max"]) < 1e-6, "upper acceleration bound does not match a_max", ) + base_env.close() def test_manual_reset_options_in_synch_vec_env(self): """ @@ -177,6 +187,7 @@ def test_manual_reset_options_in_synch_vec_env(self): np.allclose(agent_pose, rnd_poses[i]), f"pose of agent {agent_id} in env {ie} should be {rnd_poses[i]}, got {agent_pose}", ) + vec_env.close() def test_manual_reset_options_in_asynch_vec_env(self): """ @@ -208,6 +219,7 @@ def test_manual_reset_options_in_asynch_vec_env(self): np.allclose(agent_pose, rnd_poses[i]), f"pose of agent {agent_id} in env {ie} should be {rnd_poses[i]}, got {agent_pose}", ) + vec_env.close() def test_auto_reset_options_in_synch_vec_env(self): """ From c5facc5daf5e03d7e735081c54936b9ad5e4a71e Mon Sep 17 00:00:00 2001 From: Ahmad Amine Date: Wed, 16 Jul 2025 05:08:59 -0400 Subject: [PATCH 51/54] Implement update params for scan simulator, and env renderer --- f1tenth_gym/envs/base_classes.py | 67 ++++++++++++++++++- f1tenth_gym/envs/f110_env.py | 5 ++ f1tenth_gym/envs/rendering/pyqtgl_objects.py | 36 +++++++++- .../envs/rendering/rendering_pyqtgl.py | 6 ++ 4 files changed, 111 insertions(+), 3 deletions(-) diff --git a/f1tenth_gym/envs/base_classes.py b/f1tenth_gym/envs/base_classes.py index c9342e1c..00be1a03 100644 --- a/f1tenth_gym/envs/base_classes.py +++ b/f1tenth_gym/envs/base_classes.py @@ -195,7 +195,7 @@ def __init__( to_fr = dist_fr / np.sin(-angle - np.pi / 2) self.side_distances[i] = min(to_side, to_fr) - def update_params(self, params): + def update_params(self, params: dict[str, float]) -> None: """ Updates the physical parameters of the vehicle Note that does not need to be called at initialization of class anymore @@ -209,6 +209,71 @@ def update_params(self, params): self.params = params self.params_arr = np.array([self.params[p] for p in self.sequential_params]) + # Check if any of 'lidar_num_beams', 'lidar_fov', or 'lidar_noise_std' has changed, if so, update the scan simulator + if ( + "lidar_num_beams" in params + or "lidar_fov" in params + or "lidar_noise_std" in params + or "lidar_range" in params + ): + self.fov = params.get("lidar_fov", self.fov) + self.num_beams = params.get("lidar_num_beams", self.num_beams) + self.lidar_noise = params.get("lidar_noise_std", self.lidar_noise) + self.lidar_max_range = params.get("lidar_range", self.lidar_max_range) + self.scan_simulator = ScanSimulator2D( + self.num_beams, + self.fov, + std_dev=self.lidar_noise, + max_range=self.lidar_max_range, + ) + + # Check if any of "width", "lf", or "lr" has changed, if so, update the distances + if ( + ("width" in params or "lf" in params or "lr" in params) + and self.scan_simulator is not None + ): + scan_ang_incr = self.scan_simulator.get_increment() + self.params["width"] = params.get("width", self.params["width"]) + self.params["lf"] = params.get("lf", self.params["lf"]) + self.params["lr"] = params.get("lr", self.params["lr"]) + + # angles of each scan beam, distance from lidar to edge of car at each beam, and precomputed cosines of each angle + self.cosines = np.zeros((self.num_beams,)) + self.scan_angles = np.zeros((self.num_beams,)) + self.side_distances = np.zeros((self.num_beams,)) + + dist_sides = params["width"] / 2.0 + dist_fr = (params["lf"] + params["lr"]) / 2.0 + + scan_ang_incr = self.scan_simulator.get_increment() + for i in range(self.num_beams): + angle = -self.fov / 2.0 + i * scan_ang_incr + self.scan_angles[i] = angle + self.cosines[i] = np.cos(angle) + + if angle > 0: + if angle < np.pi / 2: + # between 0 and pi/2 + to_side = dist_sides / np.sin(angle) + to_fr = dist_fr / np.cos(angle) + self.side_distances[i] = min(to_side, to_fr) + else: + # between pi/2 and pi + to_side = dist_sides / np.cos(angle - np.pi / 2.0) + to_fr = dist_fr / np.sin(angle - np.pi / 2.0) + self.side_distances[i] = min(to_side, to_fr) + else: + if angle > -np.pi / 2: + # between 0 and -pi/2 + to_side = dist_sides / np.sin(-angle) + to_fr = dist_fr / np.cos(-angle) + self.side_distances[i] = min(to_side, to_fr) + else: + # between -pi/2 and -pi + to_side = dist_sides / np.cos(-angle - np.pi / 2) + to_fr = dist_fr / np.sin(-angle - np.pi / 2) + self.side_distances[i] = min(to_side, to_fr) + def set_map(self, map: str | Track, map_scale: float = 1.0): """ Sets the map for scan simulator diff --git a/f1tenth_gym/envs/f110_env.py b/f1tenth_gym/envs/f110_env.py index 6ba6b6f6..b2d43b36 100644 --- a/f1tenth_gym/envs/f110_env.py +++ b/f1tenth_gym/envs/f110_env.py @@ -420,6 +420,11 @@ def configure(self, config: dict) -> None: if hasattr(self, "sim"): self.sim.update_params(self.config["params"]) + if hasattr(self, "renderer"): + if self.renderer is not None: + # if renderer exists, update the params + self.renderer.update_params(self.params) + if hasattr(self, "action_space"): # if some parameters changed, recompute action space self.action_type = CarAction( diff --git a/f1tenth_gym/envs/rendering/pyqtgl_objects.py b/f1tenth_gym/envs/rendering/pyqtgl_objects.py index a5f96784..43dec0fb 100644 --- a/f1tenth_gym/envs/rendering/pyqtgl_objects.py +++ b/f1tenth_gym/envs/rendering/pyqtgl_objects.py @@ -51,7 +51,8 @@ def __init__( drawEdges=False, edgeColor=(0, 0, 0, 1) ) - env_renderer.view.addItem(self.mesh) + self.env_renderer = env_renderer + self.env_renderer.view.addItem(self.mesh) self.origin = map_origin self.resolution = resolution @@ -64,7 +65,38 @@ def __init__( self.tire_width = 0.1 self.tire_length = self.wheel_size - + def update_params(self, params: dict[str, Any]) -> None: + """ + Update the parameters of the car renderer. + """ + if "car_length" in params: + self.car_length = params["car_length"] + if "car_width" in params: + self.car_width = params["car_width"] + if "wheel_size" in params: + self.wheel_size = params["wheel_size"] + + # Recalculate base rectangle + hl = self.car_length / 2 + hw = self.car_width / 2 + self.base_rect = np.array([ + [-hl, -hw, 0], + [ hl, -hw, 0], + [ hl, hw, 0], + [-hl, hw, 0], + ], dtype=np.float32) + + self.env_renderer.view.removeItem(self.mesh) + self.mesh = gl.GLMeshItem( + vertexes=self.base_rect, + faces=self.faces, + faceColors=self.rgba, + smooth=False, + drawEdges=False, + edgeColor=(0, 0, 0, 1) + ) + self.env_renderer.view.addItem(self.mesh) + def apply_pose(self, pose, scale=1.0): x, y, yaw = pose c, s = np.cos(yaw), np.sin(yaw) diff --git a/f1tenth_gym/envs/rendering/rendering_pyqtgl.py b/f1tenth_gym/envs/rendering/rendering_pyqtgl.py index 18b620ab..4aaaae1f 100644 --- a/f1tenth_gym/envs/rendering/rendering_pyqtgl.py +++ b/f1tenth_gym/envs/rendering/rendering_pyqtgl.py @@ -114,6 +114,12 @@ def __init__( elif self.render_mode == "rgb_array": self.window.hide() + def update_params(self, params: dict[str, Any]) -> None: + self.params.update(params) + if self.cars is not None: + for car in self.cars: + car.update_params(params) + def _apply_view_flip(self): """Apply a vertical flip transformation to the OpenGL view.""" # Override the paintGL method to apply a Y-axis flip transformation From b386f30ffe568349c538b957e825253b4153e6d9 Mon Sep 17 00:00:00 2001 From: Ahmad Amine Date: Tue, 22 Jul 2025 02:46:57 -0400 Subject: [PATCH 52/54] 3.9 compatible typing --- f1tenth_gym/envs/observation.py | 4 ++-- f1tenth_gym/envs/rendering/mesh_renderer.py | 3 ++- f1tenth_gym/envs/rendering/pyqt_objects.py | 16 ++++++++-------- f1tenth_gym/envs/rendering/pyqtgl_objects.py | 6 +++--- f1tenth_gym/envs/rendering/rendering_pyqt.py | 8 ++++---- f1tenth_gym/envs/rendering/rendering_pyqtgl.py | 8 ++++---- f1tenth_gym/envs/reset/__init__.py | 3 ++- 7 files changed, 25 insertions(+), 23 deletions(-) diff --git a/f1tenth_gym/envs/observation.py b/f1tenth_gym/envs/observation.py index 18a150ce..16ff4a9e 100644 --- a/f1tenth_gym/envs/observation.py +++ b/f1tenth_gym/envs/observation.py @@ -1,6 +1,6 @@ from __future__ import annotations from abc import abstractmethod -from typing import List +from typing import List, Optional import gymnasium as gym import numpy as np @@ -334,7 +334,7 @@ def observe(self): return obs -def observation_factory(env, type: str | None, **kwargs) -> Observation: +def observation_factory(env, type: Optional[str], **kwargs) -> Observation: type = type or "original" if type == "original": diff --git a/f1tenth_gym/envs/rendering/mesh_renderer.py b/f1tenth_gym/envs/rendering/mesh_renderer.py index 7c93d1ad..b1d22191 100644 --- a/f1tenth_gym/envs/rendering/mesh_renderer.py +++ b/f1tenth_gym/envs/rendering/mesh_renderer.py @@ -1,6 +1,7 @@ import sys import numpy as np from pathlib import Path +from typing import Optional from pyqtgraph.opengl import MeshData, GLMeshItem from .renderer import RenderSpec, EnvRenderer, ObjectRenderer @@ -13,7 +14,7 @@ def __init__(self, resolution: float, car_length: float, car_width: float, - color: list[int] | None = None, + color: Optional[list[int]] = None, wheel_size: float = 0.2 ): super().__init__() diff --git a/f1tenth_gym/envs/rendering/pyqt_objects.py b/f1tenth_gym/envs/rendering/pyqt_objects.py index fe0d2e06..3d2bb129 100644 --- a/f1tenth_gym/envs/rendering/pyqt_objects.py +++ b/f1tenth_gym/envs/rendering/pyqt_objects.py @@ -7,7 +7,7 @@ from .renderer import RenderSpec, EnvRenderer, ObjectRenderer from ..collision_models import get_vertices, get_trmtx -from typing import Optional, Any +from typing import Optional, Any, Union from numba import njit @@ -16,7 +16,7 @@ class LinesRenderer(ObjectRenderer): def __init__( self, env_renderer: EnvRenderer, - points: list | np.ndarray, + points: Union[list, np.ndarray], color: Optional[tuple[int, int, int]] = (0, 0, 255), size: Optional[int] = 1 ): @@ -25,14 +25,14 @@ def __init__( points[:, 0], points[:, 1], pen=pen, fillLevel=None, antialias=True ) - def update(self, points: list | np.ndarray) -> None: + def update(self, points: Union[list, np.ndarray]) -> None: self.renderer.updateItems(points) class ClosedLinesRenderer(ObjectRenderer): def __init__( self, env_renderer: EnvRenderer, - points: list | np.ndarray, + points: Union[list, np.ndarray], color: Optional[tuple[int, int, int]] = (0, 0, 255), size: Optional[int] = 1 ): @@ -45,14 +45,14 @@ def __init__( points[:, 0], points[:, 1], pen=pen, cosmetic=True, antialias=True ) ## setting pen=None disables line drawing - def update(self, points: list | np.ndarray) -> None: + def update(self, points: Union[list, np.ndarray]) -> None: self.renderer.updateItems(points) class PointsRenderer(ObjectRenderer): def __init__( self, env_renderer: EnvRenderer, - points: list | np.ndarray, + points: Union[list, np.ndarray], color: Optional[tuple[int, int, int]] = (0, 0, 255), size: Optional[int] = 1 ): @@ -66,7 +66,7 @@ def __init__( symbolSize=size, ) - def update(self, points: list | np.ndarray) -> None: + def update(self, points: Union[list, np.ndarray]) -> None: self.renderer.setData(points) @@ -284,7 +284,7 @@ def __init__( resolution: float, car_length: float, car_width: float, - color: list[int] | None = None, + color: Optional[list[int]] = None, wheel_size: float = 0.2, parent: pg.PlotWidget = None, ): diff --git a/f1tenth_gym/envs/rendering/pyqtgl_objects.py b/f1tenth_gym/envs/rendering/pyqtgl_objects.py index 43dec0fb..55bf295d 100644 --- a/f1tenth_gym/envs/rendering/pyqtgl_objects.py +++ b/f1tenth_gym/envs/rendering/pyqtgl_objects.py @@ -4,7 +4,7 @@ import pyqtgraph.opengl as gl from .renderer import RenderSpec, EnvRenderer, ObjectRenderer -from typing import Optional, Any +from typing import Optional, Any, Union class CarRenderer(ObjectRenderer): @@ -19,7 +19,7 @@ def __init__( resolution: float, car_length: float, car_width: float, - color: list[int] | None = None, + color: Optional[list[int]] = None, wheel_size: float = 0.2 ): self.car_length = car_length @@ -142,7 +142,7 @@ class LinesRenderer(ObjectRenderer): def __init__( self, env_renderer: EnvRenderer, - points: list | np.ndarray, + points: Union[list, np.ndarray], color: Optional[tuple[int, int, int]] = (0, 0, 255), size: Optional[int] = 1, z_offset: float = 0.02 diff --git a/f1tenth_gym/envs/rendering/rendering_pyqt.py b/f1tenth_gym/envs/rendering/rendering_pyqt.py index 27bd5535..6122b7d1 100644 --- a/f1tenth_gym/envs/rendering/rendering_pyqt.py +++ b/f1tenth_gym/envs/rendering/rendering_pyqt.py @@ -1,7 +1,7 @@ from __future__ import annotations import logging import math -from typing import Any, Callable, Optional +from typing import Any, Callable, Optional, Union import signal import cv2 @@ -354,7 +354,7 @@ def render(self) -> Optional[np.ndarray]: def get_points_renderer( self, - points: list | np.ndarray, + points: Union[list, np.ndarray], color: Optional[tuple[int, int, int]] = (0, 0, 255), size: Optional[int] = 1, ) -> ObjectRenderer: @@ -362,7 +362,7 @@ def get_points_renderer( def get_lines_renderer( self, - points: list | np.ndarray, + points: Union[list, np.ndarray], color: Optional[tuple[int, int, int]] = (0, 0, 255), size: Optional[int] = 1, ) -> ObjectRenderer: @@ -370,7 +370,7 @@ def get_lines_renderer( def get_closed_lines_renderer( self, - points: list | np.ndarray, + points: Union[list, np.ndarray], color: Optional[tuple[int, int, int]] = (0, 0, 255), size: Optional[int] = 1, ) -> ObjectRenderer: diff --git a/f1tenth_gym/envs/rendering/rendering_pyqtgl.py b/f1tenth_gym/envs/rendering/rendering_pyqtgl.py index 4aaaae1f..2415b546 100644 --- a/f1tenth_gym/envs/rendering/rendering_pyqtgl.py +++ b/f1tenth_gym/envs/rendering/rendering_pyqtgl.py @@ -4,7 +4,7 @@ import numpy as np import pyqtgraph.opengl as gl from PyQt6 import QtWidgets, QtCore, QtGui -from typing import Any, Optional +from typing import Any, Optional, Union from PIL import ImageColor from PyQt6.QtGui import QImage import OpenGL.GL as gl_module @@ -431,7 +431,7 @@ def _update_fps(self): def get_points_renderer( self, - points: list | np.ndarray, + points: Union[list, np.ndarray], color: Optional[tuple[int, int, int]] = (0, 0, 255), size: Optional[int] = 1, **kwargs @@ -440,7 +440,7 @@ def get_points_renderer( def get_lines_renderer( self, - points: list | np.ndarray, + points: Union[list, np.ndarray], color: Optional[tuple[int, int, int]] = (0, 0, 255), size: Optional[int] = 1, **kwargs @@ -449,7 +449,7 @@ def get_lines_renderer( def get_closed_lines_renderer( self, - points: list | np.ndarray, + points: Union[list, np.ndarray], color: Optional[tuple[int, int, int]] = (0, 0, 255), size: Optional[int] = 1, **kwargs diff --git a/f1tenth_gym/envs/reset/__init__.py b/f1tenth_gym/envs/reset/__init__.py index c1a80191..90328b24 100644 --- a/f1tenth_gym/envs/reset/__init__.py +++ b/f1tenth_gym/envs/reset/__init__.py @@ -3,9 +3,10 @@ from .map_reset import AllMapResetFn from .reset_fn import ResetFn from ..track import Track +from typing import Optional -def make_reset_fn(type: str | None, track: Track, num_agents: int, **kwargs) -> ResetFn: +def make_reset_fn(track: Track, num_agents: int, type: Optional[str] = None, **kwargs) -> ResetFn: type = type or "rl_grid_static" try: From 8301fbe34c4bd19d2ecc3c2cfa2fc971ee58c7de Mon Sep 17 00:00:00 2001 From: Ahmad Amine Date: Tue, 22 Jul 2025 05:31:29 -0400 Subject: [PATCH 53/54] Update qt rendering with pan and zoom callbacks --- f1tenth_gym/envs/rendering/rendering_pyqt.py | 138 +++++++++++++------ 1 file changed, 96 insertions(+), 42 deletions(-) diff --git a/f1tenth_gym/envs/rendering/rendering_pyqt.py b/f1tenth_gym/envs/rendering/rendering_pyqt.py index 6122b7d1..24bff368 100644 --- a/f1tenth_gym/envs/rendering/rendering_pyqt.py +++ b/f1tenth_gym/envs/rendering/rendering_pyqt.py @@ -3,8 +3,8 @@ import math from typing import Any, Callable, Optional, Union import signal +from time import perf_counter -import cv2 import numpy as np from PyQt6 import QtWidgets, QtCore from PyQt6 import QtGui @@ -16,11 +16,24 @@ from ..track import Track from .renderer import EnvRenderer, ObjectRenderer, RenderSpec +# Enable OpenGL backend for better performance +pg.setConfigOptions(useOpenGL=True, antialias=False) + +try: + from pyqtgraph.widgets.RawImageWidget import RawImageGLWidget +except ImportError: + RawImageGLWidget = None + +if RawImageGLWidget is not None: + # don't limit frame rate to vsync + sfmt = QtGui.QSurfaceFormat() + sfmt.setSwapInterval(0) + QtGui.QSurfaceFormat.setDefaultFormat(sfmt) + # one-line instructions visualized at the top of the screen (if show_info=True) INSTRUCTION_TEXT = "Mouse click (L/M/R): Change POV - 'S' key: On/Off" # Replicated from pyqtgraphs' example utils for ci pipelines to pass -from time import perf_counter class FrameCounter(QtCore.QObject): sigFpsUpdate = QtCore.pyqtSignal(object) @@ -100,17 +113,16 @@ def __init__( self.canvas: pg.PlotItem = self.window.addPlot() # Disable interactivity - self.canvas.setMouseEnabled(x=True, y=True) # Disable mouse panning & zooming + self.canvas.setMouseEnabled(x=False, y=False) # Disable mouse panning & zooming self.canvas.hideButtons() # Disable corner auto-scale button self.canvas.setMenuEnabled(False) # Disable right-click context menu - legend = self.canvas.addLegend() # This doesn't disable legend interaction - # Override both methods responsible for mouse events - legend.mouseDragEvent = lambda *args, **kwargs: None - legend.hoverEvent = lambda *args, **kwargs: None - # self.scene() is a pyqtgraph.GraphicsScene.GraphicsScene.GraphicsScene - self.window.scene().sigMouseClicked.connect(self.mouse_clicked) + self.window.scene().mousePressEvent = self.mouse_clicked + self.window.scene().mouseReleaseEvent = self.mouse_released self.window.keyPressEvent = self.key_pressed + self.window.scene().wheelEvent = self.mouse_wheel + self.left_clicked = False + self.window.scene().mouseMoveEvent = self.mouse_move # Remove axes self.canvas.hideAxis("bottom") @@ -132,6 +144,10 @@ def __init__( self.clock.sigFpsUpdate.connect( lambda fps: self.fps_renderer.render(f"FPS: {fps:.1f}") ) + + # Cache for reducing string updates + self._last_fps_text = "" + self._last_time_text = "" colors_rgb = [ [rgb for rgb in ImageColor.getcolor(c, "RGB")] @@ -141,8 +157,6 @@ def __init__( colors_rgb[i % len(colors_rgb)] for i in range(len(self.agent_ids)) ] - width, height = render_spec.window_size, render_spec.window_size - # map metadata self.map_origin = track.spec.origin self.map_resolution = track.spec.resolution @@ -158,6 +172,8 @@ def __init__( track_map = np.flip(track_map, axis=0) # flip vertically self.image_item = pg.ImageItem(track_map) + # Performance optimization: set levels for faster rendering + self.image_item.setLevels([0, 255]) # Example: Transformed display of ImageItem tr = QtGui.QTransform() # prepare ImageItem transformation: # Translate image by the origin of the map @@ -174,11 +190,9 @@ def __init__( self.draw_flag: bool = True if render_spec.focus_on: self.active_map_renderer = "car" - self.follow_agent_flag: bool = True self.agent_to_follow: int = self.agent_ids.index(render_spec.focus_on) else: self.active_map_renderer = "map" - self.follow_agent_flag: bool = False self.agent_to_follow: int = None if self.render_mode in ["human", "human_fast", 'unlimited']: @@ -186,6 +200,9 @@ def __init__( self.window.show() elif self.render_mode == "rgb_array": self.exporter = ImageExporter(self.canvas) + # Performance optimization: set export parameters + self.exporter.parameters()['width'] = self.render_spec.window_size + self.exporter.parameters()['height'] = self.render_spec.window_size def update(self, obs: dict) -> None: """ @@ -242,42 +259,72 @@ def key_pressed(self, event: QtGui.QKeyEvent) -> None: self.draw_flag = not self.draw_flag # self.draw_flag_changed = True - def mouse_clicked(self, event: QtGui.QMouseEvent) -> None: + def mouse_wheel(self, event: QtWidgets.QGraphicsSceneWheelEvent) -> None: """ - Handle mouse click events. + Handle mouse wheel events for zooming in and out. Parameters ---------- - event : QtGui.QMouseEvent - mouse event + event : QtWidgets.QGraphicsSceneWheelEvent + wheel event """ - if event.button() == QtCore.Qt.MouseButton.LeftButton: - logging.debug("Pressed left button -> Follow Next agent") - - self.follow_agent_flag = True - if self.agent_to_follow is None: - self.agent_to_follow = 0 - else: - self.agent_to_follow = (self.agent_to_follow + 1) % len(self.agent_ids) + self.render_spec.zoom_in_factor *= 1.1 if event.delta() > 0 else 0.9 + self.render_spec.zoom_in_factor = max(0.1, self.render_spec.zoom_in_factor) + + def mouse_released(self, event: QtWidgets.QGraphicsSceneMouseEvent) -> None: + """ + Handle mouse release events to stop panning. + Parameters + ---------- + event : QtWidgets.QGraphicsSceneMouseEvent + mouse event + """ + if self.left_clicked: + logging.debug("Left mouse button released -> Stopping panning") + self.left_clicked = False + + def mouse_clicked(self, event: QtWidgets.QGraphicsSceneMouseEvent) -> None: + """Handle mouse clicks for agent switching and map view""" + # Right click: cycle to next agent + if event.button() == QtCore.Qt.MouseButton.RightButton: self.active_map_renderer = "car" - elif event.button() == QtCore.Qt.MouseButton.RightButton: - logging.debug("Pressed right button -> Follow Previous agent") - - self.follow_agent_flag = True if self.agent_to_follow is None: self.agent_to_follow = 0 else: - self.agent_to_follow = (self.agent_to_follow - 1) % len(self.agent_ids) - - self.active_map_renderer = "car" + self.agent_to_follow = (self.agent_to_follow + 1) % len(self.agent_ids) + + # Middle click: switch to map view elif event.button() == QtCore.Qt.MouseButton.MiddleButton: - logging.debug("Pressed middle button -> Change to Map View") - - self.follow_agent_flag = False - self.agent_to_follow = None + logging.debug("Pressed middle button -> Toggling Map View") + if self.active_map_renderer == "map": + self.active_map_renderer = "car" + if self.agent_to_follow is None: + self.agent_to_follow = 0 + else: + self.agent_to_follow = None + self.active_map_renderer = "map" + + elif event.button() == QtCore.Qt.MouseButton.LeftButton: + logging.debug("Pressed left button -> Panning") + self.left_clicked = True + + def mouse_move(self, event: QtWidgets.QGraphicsSceneMouseEvent) -> None: + """ + Handle mouse move events for panning. - self.active_map_renderer = "map" + Parameters + ---------- + event : QtWidgets.QGraphicsSceneMouseEvent + mouse event + """ + if self.left_clicked: + logging.debug("Left mouse button dragged -> Panning") + # Flip up-down movement + delta_pos = event.lastScenePos() - event.scenePos() + delta_pos = QtCore.QPointF(delta_pos.x(), -delta_pos.y()) + self.camera_pos += (delta_pos / (4 * self.render_spec.zoom_in_factor)) + self.active_map_renderer = "pan" def render(self) -> Optional[np.ndarray]: """ @@ -298,12 +345,19 @@ def render(self) -> Optional[np.ndarray]: for i in range(len(self.agent_ids)): self.cars[i].render() - if self.follow_agent_flag: - ego_x, ego_y = self.cars[self.agent_to_follow].pose[:2] - self.canvas.setXRange(ego_x - 10 / self.render_spec.zoom_in_factor, ego_x + 10 / self.render_spec.zoom_in_factor) - self.canvas.setYRange(ego_y - 10 / self.render_spec.zoom_in_factor, ego_y + 10 / self.render_spec.zoom_in_factor) - else: + if self.active_map_renderer == "car": + pos = self.cars[self.agent_to_follow].pose[:2] + self.camera_pos = QtCore.QPointF(float(pos[0]), float(pos[1])) + self.canvas.setXRange(self.camera_pos.x() - 10 / self.render_spec.zoom_in_factor, self.camera_pos.x() + 10 / self.render_spec.zoom_in_factor) + self.canvas.setYRange(self.camera_pos.y() - 10 / self.render_spec.zoom_in_factor, self.camera_pos.y() + 10 / self.render_spec.zoom_in_factor) + elif self.active_map_renderer == "pan": + self.canvas.setXRange(self.camera_pos.x() - 10 / self.render_spec.zoom_in_factor, self.camera_pos.x() + 10 / self.render_spec.zoom_in_factor) + self.canvas.setYRange(self.camera_pos.y() - 10 / self.render_spec.zoom_in_factor, self.camera_pos.y() + 10 / self.render_spec.zoom_in_factor) + elif self.active_map_renderer == "map": self.canvas.autoRange() + self.camera_pos = self.canvas.viewRect().center() + else: + raise ValueError(f"Unknown active_map_renderer: {self.active_map_renderer}") agent_to_follow_id = ( self.agent_ids[self.agent_to_follow] From 9991be49aef16586e9f78eb6e7924184d118e66c Mon Sep 17 00:00:00 2001 From: Ahmad Amine Date: Tue, 22 Jul 2025 05:34:56 -0400 Subject: [PATCH 54/54] Default to pyqt for fast video recording --- f1tenth_gym/envs/rendering/__init__.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/f1tenth_gym/envs/rendering/__init__.py b/f1tenth_gym/envs/rendering/__init__.py index 4c25a2f8..6b7249e1 100644 --- a/f1tenth_gym/envs/rendering/__init__.py +++ b/f1tenth_gym/envs/rendering/__init__.py @@ -41,7 +41,11 @@ def make_renderer( os.environ["QT_QPA_PLATFORM"] = "offscreen" from .rendering_pyqt import PyQtEnvRenderer as EnvRenderer elif render_spec.render_type == "pyqt6gl": - from .rendering_pyqtgl import PyQtEnvRendererGL as EnvRenderer + if render_mode in ["rgb_array", "rgb_array_list"]: + os.environ["QT_QPA_PLATFORM"] = "offscreen" + from .rendering_pyqt import PyQtEnvRenderer as EnvRenderer + else: + from .rendering_pyqtgl import PyQtEnvRendererGL as EnvRenderer else: raise ValueError(f"Unknown render type: {render_spec.render_type}")

def f110_gym.envs.base_classes.RaceCar.update_pose def f110_gym.envs.base_classes.RaceCar.update_dynamic (   self,