diff --git a/Analysis/0508_green_right-turn_arrow/0508_green_right-turn_arrow.ipynb b/Analysis/0508_green_right-turn_arrow/0508_green_right-turn_arrow.ipynb
new file mode 100644
index 000000000..99a0cdf4e
--- /dev/null
+++ b/Analysis/0508_green_right-turn_arrow/0508_green_right-turn_arrow.ipynb
@@ -0,0 +1,2324 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import os\n",
+ "import pandas as pd\n",
+ "import numpy as np\n",
+ "import sys\n",
+ "sys.path.append('../../Scripts')\n",
+ "from preprocess_daily import DailyPreprocessor\n",
+ "from generate_signals import SignalGenerator"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "1. 데이터를 로드합니다.\n",
+ "1-1. 네트워크가 로드되었습니다.\n",
+ "1-2. 테이블들이 로드되었습니다.\n",
+ "1-3. 네트워크의 모든 clean state requirement들을 체크했습니다.\n",
+ "1-4. 테이블들의 무결성 검사를 완료했습니다.\n",
+ "1-5. 주요 객체 (리스트, 딕셔너리)들을 저장했습니다.\n"
+ ]
+ }
+ ],
+ "source": [
+ "self = DailyPreprocessor()\n",
+ "self.load_data()\n",
+ "\n",
+ "self.make_match1()\n",
+ "self.make_match2()\n",
+ "self.make_match3()\n",
+ "self.make_match4()\n",
+ "self.make_match5()\n",
+ "self.make_match6()\n",
+ "self.make_matching()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " inter_no | \n",
+ " phase_no | \n",
+ " ring_type | \n",
+ " move_no | \n",
+ " inc_dire | \n",
+ " out_dire | \n",
+ " inc_angle | \n",
+ " out_angle | \n",
+ " inc_edge_id | \n",
+ " out_edge_id | \n",
+ " node_id | \n",
+ " node_type | \n",
+ " turn_type | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 175 | \n",
+ " 1 | \n",
+ " A | \n",
+ " 8 | \n",
+ " 남 | \n",
+ " 북 | \n",
+ " 179 | \n",
+ " 000 | \n",
+ " -571542797_02 | \n",
+ " 571500487_01 | \n",
+ " i0 | \n",
+ " normal | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 175 | \n",
+ " 1 | \n",
+ " B | \n",
+ " 4 | \n",
+ " 북 | \n",
+ " 남 | \n",
+ " 001 | \n",
+ " 180 | \n",
+ " -571500487_01 | \n",
+ " 571542797_02 | \n",
+ " i0 | \n",
+ " normal | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 175 | \n",
+ " 2 | \n",
+ " A | \n",
+ " 7 | \n",
+ " 북 | \n",
+ " 동 | \n",
+ " 001 | \n",
+ " 090 | \n",
+ " -571500487_01 | \n",
+ " 571545870_01 | \n",
+ " i0 | \n",
+ " normal | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " 175 | \n",
+ " 2 | \n",
+ " B | \n",
+ " 3 | \n",
+ " 남 | \n",
+ " 서 | \n",
+ " 179 | \n",
+ " 270 | \n",
+ " -571542797_02 | \n",
+ " 571510153_01 | \n",
+ " i0 | \n",
+ " normal | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " 175 | \n",
+ " 3 | \n",
+ " A | \n",
+ " 6 | \n",
+ " 동 | \n",
+ " 서 | \n",
+ " 090 | \n",
+ " 270 | \n",
+ " 571545870_02 | \n",
+ " 571510153_01 | \n",
+ " i0 | \n",
+ " normal | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 5 | \n",
+ " 175 | \n",
+ " 3 | \n",
+ " B | \n",
+ " 1 | \n",
+ " 동 | \n",
+ " 남 | \n",
+ " 090 | \n",
+ " 180 | \n",
+ " 571545870_02 | \n",
+ " 571542797_02 | \n",
+ " i0 | \n",
+ " normal | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 6 | \n",
+ " 175 | \n",
+ " 4 | \n",
+ " A | \n",
+ " 5 | \n",
+ " 서 | \n",
+ " 북 | \n",
+ " 270 | \n",
+ " 000 | \n",
+ " 571510153_02 | \n",
+ " 571500487_01 | \n",
+ " i0 | \n",
+ " normal | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 7 | \n",
+ " 175 | \n",
+ " 4 | \n",
+ " B | \n",
+ " 2 | \n",
+ " 서 | \n",
+ " 동 | \n",
+ " 270 | \n",
+ " 090 | \n",
+ " 571510153_02 | \n",
+ " 571545870_01 | \n",
+ " i0 | \n",
+ " normal | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 8 | \n",
+ " 175 | \n",
+ " 1 | \n",
+ " A | \n",
+ " 8 | \n",
+ " 남 | \n",
+ " 북 | \n",
+ " 179 | \n",
+ " 000 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u00 | \n",
+ " u_turn | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 9 | \n",
+ " 175 | \n",
+ " 1 | \n",
+ " B | \n",
+ " 4 | \n",
+ " 북 | \n",
+ " 남 | \n",
+ " 001 | \n",
+ " 180 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u00 | \n",
+ " u_turn | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 10 | \n",
+ " 175 | \n",
+ " 2 | \n",
+ " A | \n",
+ " 7 | \n",
+ " 북 | \n",
+ " 동 | \n",
+ " 001 | \n",
+ " 090 | \n",
+ " 571500487_02 | \n",
+ " 571500487_01.32 | \n",
+ " u00 | \n",
+ " u_turn | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 11 | \n",
+ " 175 | \n",
+ " 2 | \n",
+ " B | \n",
+ " 3 | \n",
+ " 남 | \n",
+ " 서 | \n",
+ " 179 | \n",
+ " 270 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u00 | \n",
+ " u_turn | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 12 | \n",
+ " 175 | \n",
+ " 3 | \n",
+ " A | \n",
+ " 6 | \n",
+ " 동 | \n",
+ " 서 | \n",
+ " 090 | \n",
+ " 270 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u00 | \n",
+ " u_turn | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 13 | \n",
+ " 175 | \n",
+ " 3 | \n",
+ " B | \n",
+ " 1 | \n",
+ " 동 | \n",
+ " 남 | \n",
+ " 090 | \n",
+ " 180 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u00 | \n",
+ " u_turn | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 14 | \n",
+ " 175 | \n",
+ " 4 | \n",
+ " A | \n",
+ " 5 | \n",
+ " 서 | \n",
+ " 북 | \n",
+ " 270 | \n",
+ " 000 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u00 | \n",
+ " u_turn | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 15 | \n",
+ " 175 | \n",
+ " 4 | \n",
+ " B | \n",
+ " 2 | \n",
+ " 서 | \n",
+ " 동 | \n",
+ " 270 | \n",
+ " 090 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u00 | \n",
+ " u_turn | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 16 | \n",
+ " 176 | \n",
+ " 1 | \n",
+ " A | \n",
+ " 8 | \n",
+ " 남 | \n",
+ " 북 | \n",
+ " 180 | \n",
+ " 356 | \n",
+ " -571542810_01 | \n",
+ " -571542797_02.99 | \n",
+ " i1 | \n",
+ " normal | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 17 | \n",
+ " 176 | \n",
+ " 1 | \n",
+ " B | \n",
+ " 4 | \n",
+ " 북 | \n",
+ " 남 | \n",
+ " 359 | \n",
+ " 180 | \n",
+ " 571542797_02.99 | \n",
+ " 571542810_01 | \n",
+ " i1 | \n",
+ " normal | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 18 | \n",
+ " 176 | \n",
+ " 2 | \n",
+ " A | \n",
+ " 8 | \n",
+ " 남 | \n",
+ " 북 | \n",
+ " 180 | \n",
+ " 356 | \n",
+ " -571542810_01 | \n",
+ " -571542797_02.99 | \n",
+ " i1 | \n",
+ " normal | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 19 | \n",
+ " 176 | \n",
+ " 2 | \n",
+ " B | \n",
+ " 3 | \n",
+ " 남 | \n",
+ " 서 | \n",
+ " 180 | \n",
+ " 270 | \n",
+ " -571542810_01 | \n",
+ " 571543469_01 | \n",
+ " i1 | \n",
+ " normal | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 20 | \n",
+ " 176 | \n",
+ " 3 | \n",
+ " A | \n",
+ " 5 | \n",
+ " 서 | \n",
+ " 북 | \n",
+ " 270 | \n",
+ " 356 | \n",
+ " 571543469_02 | \n",
+ " -571542797_02.99 | \n",
+ " i1 | \n",
+ " normal | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 21 | \n",
+ " 176 | \n",
+ " 3 | \n",
+ " B | \n",
+ " 18 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " i1 | \n",
+ " normal | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " 22 | \n",
+ " 177 | \n",
+ " 1 | \n",
+ " A | \n",
+ " 8 | \n",
+ " 남 | \n",
+ " 북 | \n",
+ " 179 | \n",
+ " 000 | \n",
+ " -571542809_01 | \n",
+ " 571542811_01 | \n",
+ " i2 | \n",
+ " normal | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 23 | \n",
+ " 177 | \n",
+ " 1 | \n",
+ " B | \n",
+ " 4 | \n",
+ " 북 | \n",
+ " 남 | \n",
+ " 000 | \n",
+ " 180 | \n",
+ " 571542811_02 | \n",
+ " 571542809_01 | \n",
+ " i2 | \n",
+ " normal | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 24 | \n",
+ " 177 | \n",
+ " 2 | \n",
+ " A | \n",
+ " 17 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " i2 | \n",
+ " normal | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " 25 | \n",
+ " 177 | \n",
+ " 2 | \n",
+ " B | \n",
+ " 18 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " i2 | \n",
+ " normal | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " 26 | \n",
+ " 177 | \n",
+ " 1 | \n",
+ " A | \n",
+ " 8 | \n",
+ " 남 | \n",
+ " 북 | \n",
+ " 179 | \n",
+ " 000 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u20 | \n",
+ " u_turn | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 27 | \n",
+ " 177 | \n",
+ " 1 | \n",
+ " B | \n",
+ " 4 | \n",
+ " 북 | \n",
+ " 남 | \n",
+ " 000 | \n",
+ " 180 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u20 | \n",
+ " u_turn | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 28 | \n",
+ " 177 | \n",
+ " 2 | \n",
+ " A | \n",
+ " 17 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 571542810_01.51 | \n",
+ " 571542810_02 | \n",
+ " u20 | \n",
+ " u_turn | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " 29 | \n",
+ " 177 | \n",
+ " 2 | \n",
+ " B | \n",
+ " 18 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u20 | \n",
+ " u_turn | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " 30 | \n",
+ " 178 | \n",
+ " 1 | \n",
+ " A | \n",
+ " 20 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " c30 | \n",
+ " coord | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " 31 | \n",
+ " 178 | \n",
+ " 1 | \n",
+ " B | \n",
+ " 20 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " c30 | \n",
+ " coord | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " 32 | \n",
+ " 178 | \n",
+ " 2 | \n",
+ " A | \n",
+ " 20 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 571542116_01 | \n",
+ " -571542116_02.96 | \n",
+ " c30 | \n",
+ " coord | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " 33 | \n",
+ " 178 | \n",
+ " 2 | \n",
+ " B | \n",
+ " 20 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 571542116_02.96 | \n",
+ " 571542116_02.164 | \n",
+ " c30 | \n",
+ " coord | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " 34 | \n",
+ " 178 | \n",
+ " 3 | \n",
+ " A | \n",
+ " 20 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 571542116_01 | \n",
+ " -571542116_02.96 | \n",
+ " c30 | \n",
+ " coord | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " 35 | \n",
+ " 178 | \n",
+ " 3 | \n",
+ " B | \n",
+ " 20 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 571542116_02.96 | \n",
+ " 571542116_02.164 | \n",
+ " c30 | \n",
+ " coord | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " 36 | \n",
+ " 178 | \n",
+ " 4 | \n",
+ " A | \n",
+ " 20 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 571542116_01 | \n",
+ " -571542116_02.96 | \n",
+ " c30 | \n",
+ " coord | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " 37 | \n",
+ " 178 | \n",
+ " 4 | \n",
+ " B | \n",
+ " 20 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 571542116_02.96 | \n",
+ " 571542116_02.164 | \n",
+ " c30 | \n",
+ " coord | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " 38 | \n",
+ " 178 | \n",
+ " 1 | \n",
+ " A | \n",
+ " 8 | \n",
+ " 남 | \n",
+ " 북 | \n",
+ " 180 | \n",
+ " 000 | \n",
+ " 571540304_02 | \n",
+ " 571556450_01 | \n",
+ " i3 | \n",
+ " normal | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 39 | \n",
+ " 178 | \n",
+ " 1 | \n",
+ " B | \n",
+ " 4 | \n",
+ " 북 | \n",
+ " 남 | \n",
+ " 000 | \n",
+ " 180 | \n",
+ " 571556450_02 | \n",
+ " 571540304_01 | \n",
+ " i3 | \n",
+ " normal | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 40 | \n",
+ " 178 | \n",
+ " 2 | \n",
+ " A | \n",
+ " 7 | \n",
+ " 북 | \n",
+ " 동 | \n",
+ " 000 | \n",
+ " 090 | \n",
+ " 571556450_02 | \n",
+ " 571500475_01 | \n",
+ " i3 | \n",
+ " normal | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 41 | \n",
+ " 178 | \n",
+ " 2 | \n",
+ " B | \n",
+ " 3 | \n",
+ " 남 | \n",
+ " 서 | \n",
+ " 180 | \n",
+ " 270 | \n",
+ " 571540304_02 | \n",
+ " 571540303_01 | \n",
+ " i3 | \n",
+ " normal | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 42 | \n",
+ " 178 | \n",
+ " 3 | \n",
+ " A | \n",
+ " 5 | \n",
+ " 서 | \n",
+ " 북 | \n",
+ " 270 | \n",
+ " 000 | \n",
+ " 571540303_02.21 | \n",
+ " 571556450_01 | \n",
+ " i3 | \n",
+ " normal | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 43 | \n",
+ " 178 | \n",
+ " 3 | \n",
+ " B | \n",
+ " 2 | \n",
+ " 서 | \n",
+ " 동 | \n",
+ " 270 | \n",
+ " 090 | \n",
+ " 571540303_02.21 | \n",
+ " 571500475_01 | \n",
+ " i3 | \n",
+ " normal | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 44 | \n",
+ " 178 | \n",
+ " 4 | \n",
+ " A | \n",
+ " 6 | \n",
+ " 동 | \n",
+ " 서 | \n",
+ " 090 | \n",
+ " 270 | \n",
+ " -571500475_01 | \n",
+ " 571540303_01 | \n",
+ " i3 | \n",
+ " normal | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 45 | \n",
+ " 178 | \n",
+ " 4 | \n",
+ " B | \n",
+ " 1 | \n",
+ " 동 | \n",
+ " 남 | \n",
+ " 090 | \n",
+ " 180 | \n",
+ " -571500475_01 | \n",
+ " 571540304_01 | \n",
+ " i3 | \n",
+ " normal | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 46 | \n",
+ " 178 | \n",
+ " 1 | \n",
+ " A | \n",
+ " 8 | \n",
+ " 남 | \n",
+ " 북 | \n",
+ " 180 | \n",
+ " 000 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u30 | \n",
+ " u_turn | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 47 | \n",
+ " 178 | \n",
+ " 1 | \n",
+ " B | \n",
+ " 4 | \n",
+ " 북 | \n",
+ " 남 | \n",
+ " 000 | \n",
+ " 180 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u30 | \n",
+ " u_turn | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 48 | \n",
+ " 178 | \n",
+ " 2 | \n",
+ " A | \n",
+ " 7 | \n",
+ " 북 | \n",
+ " 동 | \n",
+ " 000 | \n",
+ " 090 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u30 | \n",
+ " u_turn | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 49 | \n",
+ " 178 | \n",
+ " 2 | \n",
+ " B | \n",
+ " 3 | \n",
+ " 남 | \n",
+ " 서 | \n",
+ " 180 | \n",
+ " 270 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u30 | \n",
+ " u_turn | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 50 | \n",
+ " 178 | \n",
+ " 3 | \n",
+ " A | \n",
+ " 5 | \n",
+ " 서 | \n",
+ " 북 | \n",
+ " 270 | \n",
+ " 000 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u30 | \n",
+ " u_turn | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 51 | \n",
+ " 178 | \n",
+ " 3 | \n",
+ " B | \n",
+ " 2 | \n",
+ " 서 | \n",
+ " 동 | \n",
+ " 270 | \n",
+ " 090 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u30 | \n",
+ " u_turn | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 52 | \n",
+ " 178 | \n",
+ " 4 | \n",
+ " A | \n",
+ " 6 | \n",
+ " 동 | \n",
+ " 서 | \n",
+ " 090 | \n",
+ " 270 | \n",
+ " 571556452_01 | \n",
+ " 571556452_02 | \n",
+ " u30 | \n",
+ " u_turn | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 53 | \n",
+ " 178 | \n",
+ " 4 | \n",
+ " B | \n",
+ " 1 | \n",
+ " 동 | \n",
+ " 남 | \n",
+ " 090 | \n",
+ " 180 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u30 | \n",
+ " u_turn | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 54 | \n",
+ " 178 | \n",
+ " 1 | \n",
+ " A | \n",
+ " 8 | \n",
+ " 남 | \n",
+ " 북 | \n",
+ " 180 | \n",
+ " 000 | \n",
+ " 571500475_02 | \n",
+ " 571500475_01.26 | \n",
+ " u31 | \n",
+ " u_turn | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 55 | \n",
+ " 178 | \n",
+ " 1 | \n",
+ " B | \n",
+ " 4 | \n",
+ " 북 | \n",
+ " 남 | \n",
+ " 000 | \n",
+ " 180 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u31 | \n",
+ " u_turn | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 56 | \n",
+ " 178 | \n",
+ " 2 | \n",
+ " A | \n",
+ " 7 | \n",
+ " 북 | \n",
+ " 동 | \n",
+ " 000 | \n",
+ " 090 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u31 | \n",
+ " u_turn | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 57 | \n",
+ " 178 | \n",
+ " 2 | \n",
+ " B | \n",
+ " 3 | \n",
+ " 남 | \n",
+ " 서 | \n",
+ " 180 | \n",
+ " 270 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u31 | \n",
+ " u_turn | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 58 | \n",
+ " 178 | \n",
+ " 3 | \n",
+ " A | \n",
+ " 5 | \n",
+ " 서 | \n",
+ " 북 | \n",
+ " 270 | \n",
+ " 000 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u31 | \n",
+ " u_turn | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 59 | \n",
+ " 178 | \n",
+ " 3 | \n",
+ " B | \n",
+ " 2 | \n",
+ " 서 | \n",
+ " 동 | \n",
+ " 270 | \n",
+ " 090 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " u31 | \n",
+ " u_turn | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " inter_no phase_no ring_type move_no inc_dire out_dire inc_angle \\\n",
+ "0 175 1 A 8 남 북 179 \n",
+ "1 175 1 B 4 북 남 001 \n",
+ "2 175 2 A 7 북 동 001 \n",
+ "3 175 2 B 3 남 서 179 \n",
+ "4 175 3 A 6 동 서 090 \n",
+ "5 175 3 B 1 동 남 090 \n",
+ "6 175 4 A 5 서 북 270 \n",
+ "7 175 4 B 2 서 동 270 \n",
+ "8 175 1 A 8 남 북 179 \n",
+ "9 175 1 B 4 북 남 001 \n",
+ "10 175 2 A 7 북 동 001 \n",
+ "11 175 2 B 3 남 서 179 \n",
+ "12 175 3 A 6 동 서 090 \n",
+ "13 175 3 B 1 동 남 090 \n",
+ "14 175 4 A 5 서 북 270 \n",
+ "15 175 4 B 2 서 동 270 \n",
+ "16 176 1 A 8 남 북 180 \n",
+ "17 176 1 B 4 북 남 359 \n",
+ "18 176 2 A 8 남 북 180 \n",
+ "19 176 2 B 3 남 서 180 \n",
+ "20 176 3 A 5 서 북 270 \n",
+ "21 176 3 B 18 NaN NaN NaN \n",
+ "22 177 1 A 8 남 북 179 \n",
+ "23 177 1 B 4 북 남 000 \n",
+ "24 177 2 A 17 NaN NaN NaN \n",
+ "25 177 2 B 18 NaN NaN NaN \n",
+ "26 177 1 A 8 남 북 179 \n",
+ "27 177 1 B 4 북 남 000 \n",
+ "28 177 2 A 17 NaN NaN NaN \n",
+ "29 177 2 B 18 NaN NaN NaN \n",
+ "30 178 1 A 20 NaN NaN NaN \n",
+ "31 178 1 B 20 NaN NaN NaN \n",
+ "32 178 2 A 20 NaN NaN NaN \n",
+ "33 178 2 B 20 NaN NaN NaN \n",
+ "34 178 3 A 20 NaN NaN NaN \n",
+ "35 178 3 B 20 NaN NaN NaN \n",
+ "36 178 4 A 20 NaN NaN NaN \n",
+ "37 178 4 B 20 NaN NaN NaN \n",
+ "38 178 1 A 8 남 북 180 \n",
+ "39 178 1 B 4 북 남 000 \n",
+ "40 178 2 A 7 북 동 000 \n",
+ "41 178 2 B 3 남 서 180 \n",
+ "42 178 3 A 5 서 북 270 \n",
+ "43 178 3 B 2 서 동 270 \n",
+ "44 178 4 A 6 동 서 090 \n",
+ "45 178 4 B 1 동 남 090 \n",
+ "46 178 1 A 8 남 북 180 \n",
+ "47 178 1 B 4 북 남 000 \n",
+ "48 178 2 A 7 북 동 000 \n",
+ "49 178 2 B 3 남 서 180 \n",
+ "50 178 3 A 5 서 북 270 \n",
+ "51 178 3 B 2 서 동 270 \n",
+ "52 178 4 A 6 동 서 090 \n",
+ "53 178 4 B 1 동 남 090 \n",
+ "54 178 1 A 8 남 북 180 \n",
+ "55 178 1 B 4 북 남 000 \n",
+ "56 178 2 A 7 북 동 000 \n",
+ "57 178 2 B 3 남 서 180 \n",
+ "58 178 3 A 5 서 북 270 \n",
+ "59 178 3 B 2 서 동 270 \n",
+ "\n",
+ " out_angle inc_edge_id out_edge_id node_id node_type turn_type \n",
+ "0 000 -571542797_02 571500487_01 i0 normal straight \n",
+ "1 180 -571500487_01 571542797_02 i0 normal straight \n",
+ "2 090 -571500487_01 571545870_01 i0 normal left \n",
+ "3 270 -571542797_02 571510153_01 i0 normal left \n",
+ "4 270 571545870_02 571510153_01 i0 normal straight \n",
+ "5 180 571545870_02 571542797_02 i0 normal left \n",
+ "6 000 571510153_02 571500487_01 i0 normal left \n",
+ "7 090 571510153_02 571545870_01 i0 normal straight \n",
+ "8 000 NaN NaN u00 u_turn straight \n",
+ "9 180 NaN NaN u00 u_turn straight \n",
+ "10 090 571500487_02 571500487_01.32 u00 u_turn left \n",
+ "11 270 NaN NaN u00 u_turn left \n",
+ "12 270 NaN NaN u00 u_turn straight \n",
+ "13 180 NaN NaN u00 u_turn left \n",
+ "14 000 NaN NaN u00 u_turn left \n",
+ "15 090 NaN NaN u00 u_turn straight \n",
+ "16 356 -571542810_01 -571542797_02.99 i1 normal straight \n",
+ "17 180 571542797_02.99 571542810_01 i1 normal straight \n",
+ "18 356 -571542810_01 -571542797_02.99 i1 normal straight \n",
+ "19 270 -571542810_01 571543469_01 i1 normal left \n",
+ "20 356 571543469_02 -571542797_02.99 i1 normal left \n",
+ "21 NaN NaN NaN i1 normal NaN \n",
+ "22 000 -571542809_01 571542811_01 i2 normal straight \n",
+ "23 180 571542811_02 571542809_01 i2 normal straight \n",
+ "24 NaN NaN NaN i2 normal NaN \n",
+ "25 NaN NaN NaN i2 normal NaN \n",
+ "26 000 NaN NaN u20 u_turn straight \n",
+ "27 180 NaN NaN u20 u_turn straight \n",
+ "28 NaN 571542810_01.51 571542810_02 u20 u_turn NaN \n",
+ "29 NaN NaN NaN u20 u_turn NaN \n",
+ "30 NaN NaN NaN c30 coord NaN \n",
+ "31 NaN NaN NaN c30 coord NaN \n",
+ "32 NaN 571542116_01 -571542116_02.96 c30 coord NaN \n",
+ "33 NaN 571542116_02.96 571542116_02.164 c30 coord NaN \n",
+ "34 NaN 571542116_01 -571542116_02.96 c30 coord NaN \n",
+ "35 NaN 571542116_02.96 571542116_02.164 c30 coord NaN \n",
+ "36 NaN 571542116_01 -571542116_02.96 c30 coord NaN \n",
+ "37 NaN 571542116_02.96 571542116_02.164 c30 coord NaN \n",
+ "38 000 571540304_02 571556450_01 i3 normal straight \n",
+ "39 180 571556450_02 571540304_01 i3 normal straight \n",
+ "40 090 571556450_02 571500475_01 i3 normal left \n",
+ "41 270 571540304_02 571540303_01 i3 normal left \n",
+ "42 000 571540303_02.21 571556450_01 i3 normal left \n",
+ "43 090 571540303_02.21 571500475_01 i3 normal straight \n",
+ "44 270 -571500475_01 571540303_01 i3 normal straight \n",
+ "45 180 -571500475_01 571540304_01 i3 normal left \n",
+ "46 000 NaN NaN u30 u_turn straight \n",
+ "47 180 NaN NaN u30 u_turn straight \n",
+ "48 090 NaN NaN u30 u_turn left \n",
+ "49 270 NaN NaN u30 u_turn left \n",
+ "50 000 NaN NaN u30 u_turn left \n",
+ "51 090 NaN NaN u30 u_turn straight \n",
+ "52 270 571556452_01 571556452_02 u30 u_turn straight \n",
+ "53 180 NaN NaN u30 u_turn left \n",
+ "54 000 571500475_02 571500475_01.26 u31 u_turn straight \n",
+ "55 180 NaN NaN u31 u_turn straight \n",
+ "56 090 NaN NaN u31 u_turn left \n",
+ "57 270 NaN NaN u31 u_turn left \n",
+ "58 000 NaN NaN u31 u_turn left \n",
+ "59 090 NaN NaN u31 u_turn straight "
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "self.match6[:60]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " inter_no | \n",
+ " node_id | \n",
+ " move_no | \n",
+ " inc_dire | \n",
+ " out_dire | \n",
+ " inc_edge_id | \n",
+ " out_edge_id | \n",
+ " turn_type | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 175 | \n",
+ " i0 | \n",
+ " 1 | \n",
+ " 동 | \n",
+ " 남 | \n",
+ " 571545870_02 | \n",
+ " 571542797_02 | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 175 | \n",
+ " i0 | \n",
+ " 2 | \n",
+ " 서 | \n",
+ " 동 | \n",
+ " 571510153_02 | \n",
+ " 571545870_01 | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 175 | \n",
+ " i0 | \n",
+ " 3 | \n",
+ " 남 | \n",
+ " 서 | \n",
+ " -571542797_02 | \n",
+ " 571510153_01 | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " 175 | \n",
+ " i0 | \n",
+ " 4 | \n",
+ " 북 | \n",
+ " 남 | \n",
+ " -571500487_01 | \n",
+ " 571542797_02 | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " 175 | \n",
+ " i0 | \n",
+ " 5 | \n",
+ " 서 | \n",
+ " 북 | \n",
+ " 571510153_02 | \n",
+ " 571500487_01 | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " 123 | \n",
+ " 210 | \n",
+ " i6 | \n",
+ " 12 | \n",
+ " 북서 | \n",
+ " 남동 | \n",
+ " 571500535_02.18 | \n",
+ " 571542115_01 | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 124 | \n",
+ " 210 | \n",
+ " i6 | \n",
+ " 13 | \n",
+ " 남서 | \n",
+ " 북서 | \n",
+ " 571500585_02 | \n",
+ " 571500535_01 | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 125 | \n",
+ " 210 | \n",
+ " i6 | \n",
+ " 14 | \n",
+ " 북동 | \n",
+ " 남서 | \n",
+ " 571511538_02.121 | \n",
+ " 571500585_01 | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 126 | \n",
+ " 210 | \n",
+ " i6 | \n",
+ " 15 | \n",
+ " 북서 | \n",
+ " 북동 | \n",
+ " 571500535_02.18 | \n",
+ " 571511538_01 | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 127 | \n",
+ " 210 | \n",
+ " i6 | \n",
+ " 16 | \n",
+ " 남동 | \n",
+ " 북서 | \n",
+ " -571542115_01 | \n",
+ " 571500535_01 | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
128 rows × 8 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " inter_no node_id move_no inc_dire out_dire inc_edge_id \\\n",
+ "0 175 i0 1 동 남 571545870_02 \n",
+ "1 175 i0 2 서 동 571510153_02 \n",
+ "2 175 i0 3 남 서 -571542797_02 \n",
+ "3 175 i0 4 북 남 -571500487_01 \n",
+ "4 175 i0 5 서 북 571510153_02 \n",
+ ".. ... ... ... ... ... ... \n",
+ "123 210 i6 12 북서 남동 571500535_02.18 \n",
+ "124 210 i6 13 남서 북서 571500585_02 \n",
+ "125 210 i6 14 북동 남서 571511538_02.121 \n",
+ "126 210 i6 15 북서 북동 571500535_02.18 \n",
+ "127 210 i6 16 남동 북서 -571542115_01 \n",
+ "\n",
+ " out_edge_id turn_type \n",
+ "0 571542797_02 left \n",
+ "1 571545870_01 straight \n",
+ "2 571510153_01 left \n",
+ "3 571542797_02 straight \n",
+ "4 571500487_01 left \n",
+ ".. ... ... \n",
+ "123 571542115_01 straight \n",
+ "124 571500535_01 left \n",
+ "125 571500585_01 straight \n",
+ "126 571511538_01 left \n",
+ "127 571500535_01 straight \n",
+ "\n",
+ "[128 rows x 8 columns]"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "self.matching"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "2-2. 초기화 신호가 지정되었습니다. (우회전 : g)\n",
+ "2-3. 유턴 인덱스 / 비보호좌회전 인덱스를 지정했습니다.\n",
+ "2-4. 직진 및 좌회전(G)을 배정했습니다.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " inter_no | \n",
+ " node_id | \n",
+ " phase_no | \n",
+ " ring_type | \n",
+ " move_no | \n",
+ " inc_edge_id | \n",
+ " out_edge_id | \n",
+ " state | \n",
+ " turn_type | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 175 | \n",
+ " i0 | \n",
+ " 1 | \n",
+ " A | \n",
+ " 8 | \n",
+ " -571542797_02 | \n",
+ " 571500487_01 | \n",
+ " grrrgrrrgGGGGrgrr | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 175 | \n",
+ " i0 | \n",
+ " 1 | \n",
+ " B | \n",
+ " 4 | \n",
+ " -571500487_01 | \n",
+ " 571542797_02 | \n",
+ " gGGrgrrrgrrrrrgrr | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 175 | \n",
+ " i0 | \n",
+ " 2 | \n",
+ " A | \n",
+ " 7 | \n",
+ " -571500487_01 | \n",
+ " 571545870_01 | \n",
+ " grrGgrrrgrrrrrgrr | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " 175 | \n",
+ " i0 | \n",
+ " 2 | \n",
+ " B | \n",
+ " 3 | \n",
+ " -571542797_02 | \n",
+ " 571510153_01 | \n",
+ " grrrgrrrgrrrrGgrr | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " 175 | \n",
+ " i0 | \n",
+ " 3 | \n",
+ " A | \n",
+ " 6 | \n",
+ " 571545870_02 | \n",
+ " 571510153_01 | \n",
+ " grrrgGGrgrrrrrgrr | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 5 | \n",
+ " 175 | \n",
+ " i0 | \n",
+ " 3 | \n",
+ " B | \n",
+ " 1 | \n",
+ " 571545870_02 | \n",
+ " 571542797_02 | \n",
+ " grrrgrrGgrrrrrgrr | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 6 | \n",
+ " 175 | \n",
+ " i0 | \n",
+ " 4 | \n",
+ " A | \n",
+ " 5 | \n",
+ " 571510153_02 | \n",
+ " 571500487_01 | \n",
+ " grrrgrrrgrrrrrgrG | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 7 | \n",
+ " 175 | \n",
+ " i0 | \n",
+ " 4 | \n",
+ " B | \n",
+ " 2 | \n",
+ " 571510153_02 | \n",
+ " 571545870_01 | \n",
+ " grrrgrrrgrrrrrgGr | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 8 | \n",
+ " 175 | \n",
+ " u00 | \n",
+ " 1 | \n",
+ " A | \n",
+ " 8 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " GGGGrGGGG | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 9 | \n",
+ " 175 | \n",
+ " u00 | \n",
+ " 1 | \n",
+ " B | \n",
+ " 4 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " GGGGrGGGG | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 10 | \n",
+ " 175 | \n",
+ " u00 | \n",
+ " 2 | \n",
+ " A | \n",
+ " 7 | \n",
+ " 571500487_02 | \n",
+ " 571500487_01.32 | \n",
+ " GGGGGGGGG | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 11 | \n",
+ " 175 | \n",
+ " u00 | \n",
+ " 2 | \n",
+ " B | \n",
+ " 3 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " GGGGrGGGG | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 12 | \n",
+ " 175 | \n",
+ " u00 | \n",
+ " 3 | \n",
+ " A | \n",
+ " 6 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " GGGGrGGGG | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 13 | \n",
+ " 175 | \n",
+ " u00 | \n",
+ " 3 | \n",
+ " B | \n",
+ " 1 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " GGGGrGGGG | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 14 | \n",
+ " 175 | \n",
+ " u00 | \n",
+ " 4 | \n",
+ " A | \n",
+ " 5 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " GGGGrGGGG | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 15 | \n",
+ " 175 | \n",
+ " u00 | \n",
+ " 4 | \n",
+ " B | \n",
+ " 2 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " GGGGrGGGG | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 16 | \n",
+ " 176 | \n",
+ " i1 | \n",
+ " 1 | \n",
+ " A | \n",
+ " 8 | \n",
+ " -571542810_01 | \n",
+ " -571542797_02.99 | \n",
+ " grrGGGrgrr | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 17 | \n",
+ " 176 | \n",
+ " i1 | \n",
+ " 1 | \n",
+ " B | \n",
+ " 4 | \n",
+ " 571542797_02.99 | \n",
+ " 571542810_01 | \n",
+ " gGGrrrrgrr | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 18 | \n",
+ " 176 | \n",
+ " i1 | \n",
+ " 2 | \n",
+ " A | \n",
+ " 8 | \n",
+ " -571542810_01 | \n",
+ " -571542797_02.99 | \n",
+ " grrGGGrgrr | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 19 | \n",
+ " 176 | \n",
+ " i1 | \n",
+ " 2 | \n",
+ " B | \n",
+ " 3 | \n",
+ " -571542810_01 | \n",
+ " 571543469_01 | \n",
+ " grrrrrGgrr | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 20 | \n",
+ " 176 | \n",
+ " i1 | \n",
+ " 3 | \n",
+ " A | \n",
+ " 5 | \n",
+ " 571543469_02 | \n",
+ " -571542797_02.99 | \n",
+ " grrrrrrgGG | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 21 | \n",
+ " 176 | \n",
+ " i1 | \n",
+ " 3 | \n",
+ " B | \n",
+ " 18 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " grrrrrrgrr | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " 22 | \n",
+ " 177 | \n",
+ " i2 | \n",
+ " 1 | \n",
+ " A | \n",
+ " 8 | \n",
+ " -571542809_01 | \n",
+ " 571542811_01 | \n",
+ " rrggGGG | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 23 | \n",
+ " 177 | \n",
+ " i2 | \n",
+ " 1 | \n",
+ " B | \n",
+ " 4 | \n",
+ " 571542811_02 | \n",
+ " 571542809_01 | \n",
+ " GGggrrr | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 24 | \n",
+ " 177 | \n",
+ " i2 | \n",
+ " 2 | \n",
+ " A | \n",
+ " 17 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " rrggrrr | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " 25 | \n",
+ " 177 | \n",
+ " i2 | \n",
+ " 2 | \n",
+ " B | \n",
+ " 18 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " rrggrrr | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " 26 | \n",
+ " 177 | \n",
+ " u20 | \n",
+ " 1 | \n",
+ " A | \n",
+ " 8 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " GGrGGG | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 27 | \n",
+ " 177 | \n",
+ " u20 | \n",
+ " 1 | \n",
+ " B | \n",
+ " 4 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " GGrGGG | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 28 | \n",
+ " 177 | \n",
+ " u20 | \n",
+ " 2 | \n",
+ " A | \n",
+ " 17 | \n",
+ " 571542810_01.51 | \n",
+ " 571542810_02 | \n",
+ " GGGGGG | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " 29 | \n",
+ " 177 | \n",
+ " u20 | \n",
+ " 2 | \n",
+ " B | \n",
+ " 18 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " GGrGGG | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " 30 | \n",
+ " 178 | \n",
+ " c30 | \n",
+ " 1 | \n",
+ " A | \n",
+ " 20 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " rrrrrr | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " 31 | \n",
+ " 178 | \n",
+ " c30 | \n",
+ " 1 | \n",
+ " B | \n",
+ " 20 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " rrrrrr | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " 32 | \n",
+ " 178 | \n",
+ " c30 | \n",
+ " 2 | \n",
+ " A | \n",
+ " 20 | \n",
+ " 571542116_01 | \n",
+ " -571542116_02.96 | \n",
+ " GGGrrr | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " 33 | \n",
+ " 178 | \n",
+ " c30 | \n",
+ " 2 | \n",
+ " B | \n",
+ " 20 | \n",
+ " 571542116_02.96 | \n",
+ " 571542116_02.164 | \n",
+ " rrrGGG | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " 34 | \n",
+ " 178 | \n",
+ " c30 | \n",
+ " 3 | \n",
+ " A | \n",
+ " 20 | \n",
+ " 571542116_01 | \n",
+ " -571542116_02.96 | \n",
+ " GGGrrr | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " 35 | \n",
+ " 178 | \n",
+ " c30 | \n",
+ " 3 | \n",
+ " B | \n",
+ " 20 | \n",
+ " 571542116_02.96 | \n",
+ " 571542116_02.164 | \n",
+ " rrrGGG | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " 36 | \n",
+ " 178 | \n",
+ " c30 | \n",
+ " 4 | \n",
+ " A | \n",
+ " 20 | \n",
+ " 571542116_01 | \n",
+ " -571542116_02.96 | \n",
+ " GGGrrr | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " 37 | \n",
+ " 178 | \n",
+ " c30 | \n",
+ " 4 | \n",
+ " B | \n",
+ " 20 | \n",
+ " 571542116_02.96 | \n",
+ " 571542116_02.164 | \n",
+ " rrrGGG | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " 38 | \n",
+ " 178 | \n",
+ " i3 | \n",
+ " 1 | \n",
+ " A | \n",
+ " 8 | \n",
+ " 571540304_02 | \n",
+ " 571556450_01 | \n",
+ " grrrrgrrrrgGGGrgrrrr | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 39 | \n",
+ " 178 | \n",
+ " i3 | \n",
+ " 1 | \n",
+ " B | \n",
+ " 4 | \n",
+ " 571556450_02 | \n",
+ " 571540304_01 | \n",
+ " gGGGrgrrrrgrrrrgrrrr | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 40 | \n",
+ " 178 | \n",
+ " i3 | \n",
+ " 2 | \n",
+ " A | \n",
+ " 7 | \n",
+ " 571556450_02 | \n",
+ " 571500475_01 | \n",
+ " grrrGgrrrrgrrrrgrrrr | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 41 | \n",
+ " 178 | \n",
+ " i3 | \n",
+ " 2 | \n",
+ " B | \n",
+ " 3 | \n",
+ " 571540304_02 | \n",
+ " 571540303_01 | \n",
+ " grrrrgrrrrgrrrGgrrrr | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 42 | \n",
+ " 178 | \n",
+ " i3 | \n",
+ " 3 | \n",
+ " A | \n",
+ " 5 | \n",
+ " 571540303_02.21 | \n",
+ " 571556450_01 | \n",
+ " grrrrgrrrrgrrrrgrrrG | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 43 | \n",
+ " 178 | \n",
+ " i3 | \n",
+ " 3 | \n",
+ " B | \n",
+ " 2 | \n",
+ " 571540303_02.21 | \n",
+ " 571500475_01 | \n",
+ " grrrrgrrrrgrrrrgGGGr | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 44 | \n",
+ " 178 | \n",
+ " i3 | \n",
+ " 4 | \n",
+ " A | \n",
+ " 6 | \n",
+ " -571500475_01 | \n",
+ " 571540303_01 | \n",
+ " grrrrgGGGrgrrrrgrrrr | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 45 | \n",
+ " 178 | \n",
+ " i3 | \n",
+ " 4 | \n",
+ " B | \n",
+ " 1 | \n",
+ " -571500475_01 | \n",
+ " 571540304_01 | \n",
+ " grrrrgrrrGgrrrrgrrrr | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 46 | \n",
+ " 178 | \n",
+ " u30 | \n",
+ " 1 | \n",
+ " A | \n",
+ " 8 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " GGGGrGGG | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 47 | \n",
+ " 178 | \n",
+ " u30 | \n",
+ " 1 | \n",
+ " B | \n",
+ " 4 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " GGGGrGGG | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 48 | \n",
+ " 178 | \n",
+ " u30 | \n",
+ " 2 | \n",
+ " A | \n",
+ " 7 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " GGGGrGGG | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 49 | \n",
+ " 178 | \n",
+ " u30 | \n",
+ " 2 | \n",
+ " B | \n",
+ " 3 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " GGGGrGGG | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 50 | \n",
+ " 178 | \n",
+ " u30 | \n",
+ " 3 | \n",
+ " A | \n",
+ " 5 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " GGGGrGGG | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 51 | \n",
+ " 178 | \n",
+ " u30 | \n",
+ " 3 | \n",
+ " B | \n",
+ " 2 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " GGGGrGGG | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 52 | \n",
+ " 178 | \n",
+ " u30 | \n",
+ " 4 | \n",
+ " A | \n",
+ " 6 | \n",
+ " 571556452_01 | \n",
+ " 571556452_02 | \n",
+ " GGGGGGGG | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 53 | \n",
+ " 178 | \n",
+ " u30 | \n",
+ " 4 | \n",
+ " B | \n",
+ " 1 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " GGGGrGGG | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 54 | \n",
+ " 178 | \n",
+ " u31 | \n",
+ " 1 | \n",
+ " A | \n",
+ " 8 | \n",
+ " 571500475_02 | \n",
+ " 571500475_01.26 | \n",
+ " GGGGGGGG | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 55 | \n",
+ " 178 | \n",
+ " u31 | \n",
+ " 1 | \n",
+ " B | \n",
+ " 4 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " GGGGrGGG | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ " 56 | \n",
+ " 178 | \n",
+ " u31 | \n",
+ " 2 | \n",
+ " A | \n",
+ " 7 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " GGGGrGGG | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 57 | \n",
+ " 178 | \n",
+ " u31 | \n",
+ " 2 | \n",
+ " B | \n",
+ " 3 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " GGGGrGGG | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 58 | \n",
+ " 178 | \n",
+ " u31 | \n",
+ " 3 | \n",
+ " A | \n",
+ " 5 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " GGGGrGGG | \n",
+ " left | \n",
+ "
\n",
+ " \n",
+ " 59 | \n",
+ " 178 | \n",
+ " u31 | \n",
+ " 3 | \n",
+ " B | \n",
+ " 2 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " GGGGrGGG | \n",
+ " straight | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " inter_no node_id phase_no ring_type move_no inc_edge_id \\\n",
+ "0 175 i0 1 A 8 -571542797_02 \n",
+ "1 175 i0 1 B 4 -571500487_01 \n",
+ "2 175 i0 2 A 7 -571500487_01 \n",
+ "3 175 i0 2 B 3 -571542797_02 \n",
+ "4 175 i0 3 A 6 571545870_02 \n",
+ "5 175 i0 3 B 1 571545870_02 \n",
+ "6 175 i0 4 A 5 571510153_02 \n",
+ "7 175 i0 4 B 2 571510153_02 \n",
+ "8 175 u00 1 A 8 NaN \n",
+ "9 175 u00 1 B 4 NaN \n",
+ "10 175 u00 2 A 7 571500487_02 \n",
+ "11 175 u00 2 B 3 NaN \n",
+ "12 175 u00 3 A 6 NaN \n",
+ "13 175 u00 3 B 1 NaN \n",
+ "14 175 u00 4 A 5 NaN \n",
+ "15 175 u00 4 B 2 NaN \n",
+ "16 176 i1 1 A 8 -571542810_01 \n",
+ "17 176 i1 1 B 4 571542797_02.99 \n",
+ "18 176 i1 2 A 8 -571542810_01 \n",
+ "19 176 i1 2 B 3 -571542810_01 \n",
+ "20 176 i1 3 A 5 571543469_02 \n",
+ "21 176 i1 3 B 18 NaN \n",
+ "22 177 i2 1 A 8 -571542809_01 \n",
+ "23 177 i2 1 B 4 571542811_02 \n",
+ "24 177 i2 2 A 17 NaN \n",
+ "25 177 i2 2 B 18 NaN \n",
+ "26 177 u20 1 A 8 NaN \n",
+ "27 177 u20 1 B 4 NaN \n",
+ "28 177 u20 2 A 17 571542810_01.51 \n",
+ "29 177 u20 2 B 18 NaN \n",
+ "30 178 c30 1 A 20 NaN \n",
+ "31 178 c30 1 B 20 NaN \n",
+ "32 178 c30 2 A 20 571542116_01 \n",
+ "33 178 c30 2 B 20 571542116_02.96 \n",
+ "34 178 c30 3 A 20 571542116_01 \n",
+ "35 178 c30 3 B 20 571542116_02.96 \n",
+ "36 178 c30 4 A 20 571542116_01 \n",
+ "37 178 c30 4 B 20 571542116_02.96 \n",
+ "38 178 i3 1 A 8 571540304_02 \n",
+ "39 178 i3 1 B 4 571556450_02 \n",
+ "40 178 i3 2 A 7 571556450_02 \n",
+ "41 178 i3 2 B 3 571540304_02 \n",
+ "42 178 i3 3 A 5 571540303_02.21 \n",
+ "43 178 i3 3 B 2 571540303_02.21 \n",
+ "44 178 i3 4 A 6 -571500475_01 \n",
+ "45 178 i3 4 B 1 -571500475_01 \n",
+ "46 178 u30 1 A 8 NaN \n",
+ "47 178 u30 1 B 4 NaN \n",
+ "48 178 u30 2 A 7 NaN \n",
+ "49 178 u30 2 B 3 NaN \n",
+ "50 178 u30 3 A 5 NaN \n",
+ "51 178 u30 3 B 2 NaN \n",
+ "52 178 u30 4 A 6 571556452_01 \n",
+ "53 178 u30 4 B 1 NaN \n",
+ "54 178 u31 1 A 8 571500475_02 \n",
+ "55 178 u31 1 B 4 NaN \n",
+ "56 178 u31 2 A 7 NaN \n",
+ "57 178 u31 2 B 3 NaN \n",
+ "58 178 u31 3 A 5 NaN \n",
+ "59 178 u31 3 B 2 NaN \n",
+ "\n",
+ " out_edge_id state turn_type \n",
+ "0 571500487_01 grrrgrrrgGGGGrgrr straight \n",
+ "1 571542797_02 gGGrgrrrgrrrrrgrr straight \n",
+ "2 571545870_01 grrGgrrrgrrrrrgrr left \n",
+ "3 571510153_01 grrrgrrrgrrrrGgrr left \n",
+ "4 571510153_01 grrrgGGrgrrrrrgrr straight \n",
+ "5 571542797_02 grrrgrrGgrrrrrgrr left \n",
+ "6 571500487_01 grrrgrrrgrrrrrgrG left \n",
+ "7 571545870_01 grrrgrrrgrrrrrgGr straight \n",
+ "8 NaN GGGGrGGGG straight \n",
+ "9 NaN GGGGrGGGG straight \n",
+ "10 571500487_01.32 GGGGGGGGG left \n",
+ "11 NaN GGGGrGGGG left \n",
+ "12 NaN GGGGrGGGG straight \n",
+ "13 NaN GGGGrGGGG left \n",
+ "14 NaN GGGGrGGGG left \n",
+ "15 NaN GGGGrGGGG straight \n",
+ "16 -571542797_02.99 grrGGGrgrr straight \n",
+ "17 571542810_01 gGGrrrrgrr straight \n",
+ "18 -571542797_02.99 grrGGGrgrr straight \n",
+ "19 571543469_01 grrrrrGgrr left \n",
+ "20 -571542797_02.99 grrrrrrgGG left \n",
+ "21 NaN grrrrrrgrr NaN \n",
+ "22 571542811_01 rrggGGG straight \n",
+ "23 571542809_01 GGggrrr straight \n",
+ "24 NaN rrggrrr NaN \n",
+ "25 NaN rrggrrr NaN \n",
+ "26 NaN GGrGGG straight \n",
+ "27 NaN GGrGGG straight \n",
+ "28 571542810_02 GGGGGG NaN \n",
+ "29 NaN GGrGGG NaN \n",
+ "30 NaN rrrrrr NaN \n",
+ "31 NaN rrrrrr NaN \n",
+ "32 -571542116_02.96 GGGrrr NaN \n",
+ "33 571542116_02.164 rrrGGG NaN \n",
+ "34 -571542116_02.96 GGGrrr NaN \n",
+ "35 571542116_02.164 rrrGGG NaN \n",
+ "36 -571542116_02.96 GGGrrr NaN \n",
+ "37 571542116_02.164 rrrGGG NaN \n",
+ "38 571556450_01 grrrrgrrrrgGGGrgrrrr straight \n",
+ "39 571540304_01 gGGGrgrrrrgrrrrgrrrr straight \n",
+ "40 571500475_01 grrrGgrrrrgrrrrgrrrr left \n",
+ "41 571540303_01 grrrrgrrrrgrrrGgrrrr left \n",
+ "42 571556450_01 grrrrgrrrrgrrrrgrrrG left \n",
+ "43 571500475_01 grrrrgrrrrgrrrrgGGGr straight \n",
+ "44 571540303_01 grrrrgGGGrgrrrrgrrrr straight \n",
+ "45 571540304_01 grrrrgrrrGgrrrrgrrrr left \n",
+ "46 NaN GGGGrGGG straight \n",
+ "47 NaN GGGGrGGG straight \n",
+ "48 NaN GGGGrGGG left \n",
+ "49 NaN GGGGrGGG left \n",
+ "50 NaN GGGGrGGG left \n",
+ "51 NaN GGGGrGGG straight \n",
+ "52 571556452_02 GGGGGGGG straight \n",
+ "53 NaN GGGGrGGG left \n",
+ "54 571500475_01.26 GGGGGGGG straight \n",
+ "55 NaN GGGGrGGG straight \n",
+ "56 NaN GGGGrGGG left \n",
+ "57 NaN GGGGrGGG left \n",
+ "58 NaN GGGGrGGG left \n",
+ "59 NaN GGGGrGGG straight "
+ ]
+ },
+ "execution_count": 13,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "self.initialize_state()\n",
+ "self.assign_indices()\n",
+ "self.p2UPLindices2inc_edge_ids\n",
+ "self.assign_signals()\n",
+ "self.match6[:60]"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "siggen",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.8.10"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/Data/networks/make_routes.py b/Data/networks/make_routes.py
new file mode 100644
index 000000000..be336bb6f
--- /dev/null
+++ b/Data/networks/make_routes.py
@@ -0,0 +1,171 @@
+strings = ['\n']
+
+vtypes_str = '''
+
+
+
+
+
+
+'''
+strings.append(vtypes_str)
+
+
+routes_str = '''
+
+
+
+
+
+
+
+
+
+
+
+
+
+ '''
+
+strings.append(routes_str)
+
+departs = [f'{d:03}' for d in range(0, 600, 20)]
+routes = ["LR_below", "RL_below", "LR_upper", "LR_below", "LR_below", "LR_upper_lt"]
+vehicles_str = ''
+
+
+print(departs)
+
+vehicles_str = '''
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ '''
+
+strings.append(vehicles_str)
+strings.append('')
+strings = ''.join(strings)
+
+# route.rou.xml 파일 저장
+with open('sn_routes.rou.xml', 'w') as f:
+ f.write(strings)
diff --git a/Data/networks/sn_modified.rou.xml b/Data/networks/sn_modified.rou.xml
new file mode 100644
index 000000000..8bc1d6cc2
--- /dev/null
+++ b/Data/networks/sn_modified.rou.xml
@@ -0,0 +1,145 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Data/networks/sn_routes.rou.xml b/Data/networks/sn_routes.rou.xml
new file mode 100644
index 000000000..c6ca78b86
--- /dev/null
+++ b/Data/networks/sn_routes.rou.xml
@@ -0,0 +1,147 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Documents/1127_table_definition/table_definition_v0.8.6.xlsx b/Documents/1127_table_definition/table_definition_v0.8.6.xlsx
index ae5a89587..405c36a9d 100644
Binary files a/Documents/1127_table_definition/table_definition_v0.8.6.xlsx and b/Documents/1127_table_definition/table_definition_v0.8.6.xlsx differ
diff --git a/Documents/1127_table_definition/table_definition_v0.8.7.xlsx b/Documents/1127_table_definition/table_definition_v0.8.7.xlsx
new file mode 100644
index 000000000..d73d0ecd8
Binary files /dev/null and b/Documents/1127_table_definition/table_definition_v0.8.7.xlsx differ
diff --git a/Intermediates/match6.csv b/Intermediates/match6.csv
index ab652fda1..a2be0670d 100644
--- a/Intermediates/match6.csv
+++ b/Intermediates/match6.csv
@@ -1,109 +1,109 @@
-,inter_no,node_id,phase_no,ring_type,move_no,inc_edge_id,out_edge_id,state
-0,175,i0,1,A,8,-571542797_02,571500487_01,grrrgrrrgGGGGrgrr
-1,175,i0,1,B,4,-571500487_01,571542797_02,gGGrgrrrgrrrrrgrr
-2,175,i0,2,A,7,-571500487_01,571545870_01,grrGgrrrgrrrrrgrr
-3,175,i0,2,B,3,-571542797_02,571510153_01,grrrgrrrgrrrrGgrr
-4,175,i0,3,A,6,571545870_02,571510153_01,grrrgGGrgrrrrrgrr
-5,175,i0,3,B,1,571545870_02,571542797_02,grrrgrrGgrrrrrgrr
-6,175,i0,4,A,5,571510153_02,571500487_01,grrrgrrrgrrrrrgrG
-7,175,i0,4,B,2,571510153_02,571545870_01,grrrgrrrgrrrrrgGr
-8,175,u00,1,A,8,,,GGGGrGGGG
-9,175,u00,1,B,4,,,GGGGrGGGG
-10,175,u00,2,A,7,571500487_02,571500487_01.32,GGGGGGGGG
-11,175,u00,2,B,3,,,GGGGrGGGG
-12,175,u00,3,A,6,,,GGGGrGGGG
-13,175,u00,3,B,1,,,GGGGrGGGG
-14,175,u00,4,A,5,,,GGGGrGGGG
-15,175,u00,4,B,2,,,GGGGrGGGG
-16,176,i1,1,A,8,-571542810_01,-571542797_02.99,grrGGGrgrr
-17,176,i1,1,B,4,571542797_02.99,571542810_01,gGGrrrrgrr
-18,176,i1,2,A,8,-571542810_01,-571542797_02.99,grrGGGrgrr
-19,176,i1,2,B,3,-571542810_01,571543469_01,grrrrrGgrr
-20,176,i1,3,A,5,571543469_02,-571542797_02.99,grrrrrrgGG
-21,176,i1,3,B,18,,,grrrrrrgrr
-22,177,i2,1,A,8,-571542809_01,571542811_01,rrggGGG
-23,177,i2,1,B,4,571542811_02,571542809_01,GGggrrr
-24,177,i2,2,A,17,,,rrggrrr
-25,177,i2,2,B,18,,,rrggrrr
-26,177,u20,1,A,8,,,GGrGGG
-27,177,u20,1,B,4,,,GGrGGG
-28,177,u20,2,A,17,571542810_01.51,571542810_02,GGGGGG
-29,177,u20,2,B,18,,,GGrGGG
-30,178,c30,1,A,20,,,rrrrrr
-31,178,c30,1,B,20,,,rrrrrr
-32,178,c30,2,A,20,571542116_01,-571542116_02.96,GGGrrr
-33,178,c30,2,B,20,571542116_02.96,571542116_02.164,rrrGGG
-34,178,c30,3,A,20,571542116_01,-571542116_02.96,GGGrrr
-35,178,c30,3,B,20,571542116_02.96,571542116_02.164,rrrGGG
-36,178,c30,4,A,20,571542116_01,-571542116_02.96,GGGrrr
-37,178,c30,4,B,20,571542116_02.96,571542116_02.164,rrrGGG
-38,178,i3,1,A,8,571540304_02,571556450_01,grrrrgrrrrgGGGrgrrrr
-39,178,i3,1,B,4,571556450_02,571540304_01,gGGGrgrrrrgrrrrgrrrr
-40,178,i3,2,A,7,571556450_02,571500475_01,grrrGgrrrrgrrrrgrrrr
-41,178,i3,2,B,3,571540304_02,571540303_01,grrrrgrrrrgrrrGgrrrr
-42,178,i3,3,A,5,571540303_02.21,571556450_01,grrrrgrrrrgrrrrgrrrG
-43,178,i3,3,B,2,571540303_02.21,571500475_01,grrrrgrrrrgrrrrgGGGr
-44,178,i3,4,A,6,-571500475_01,571540303_01,grrrrgGGGrgrrrrgrrrr
-45,178,i3,4,B,1,-571500475_01,571540304_01,grrrrgrrrGgrrrrgrrrr
-46,178,u30,1,A,8,,,GGGGrGGG
-47,178,u30,1,B,4,,,GGGGrGGG
-48,178,u30,2,A,7,,,GGGGrGGG
-49,178,u30,2,B,3,,,GGGGrGGG
-50,178,u30,3,A,5,,,GGGGrGGG
-51,178,u30,3,B,2,,,GGGGrGGG
-52,178,u30,4,A,6,571556452_01,571556452_02,GGGGGGGG
-53,178,u30,4,B,1,,,GGGGrGGG
-54,178,u31,1,A,8,571500475_02,571500475_01.26,GGGGGGGG
-55,178,u31,1,B,4,,,GGGGrGGG
-56,178,u31,2,A,7,,,GGGGrGGG
-57,178,u31,2,B,3,,,GGGGrGGG
-58,178,u31,3,A,5,,,GGGGrGGG
-59,178,u31,3,B,2,,,GGGGrGGG
-60,178,u31,4,A,6,,,GGGGrGGG
-61,178,u31,4,B,1,,,GGGGrGGG
-62,178,u32,1,A,8,,,GGGGGGGr
-63,178,u32,1,B,4,571540303_02,-571540303_02,GGGGGGGG
-64,178,u32,2,A,7,,,GGGGGGGr
-65,178,u32,2,B,3,,,GGGGGGGr
-66,178,u32,3,A,5,,,GGGGGGGr
-67,178,u32,3,B,2,,,GGGGGGGr
-68,178,u32,4,A,6,,,GGGGGGGr
-69,178,u32,4,B,1,,,GGGGGGGr
-70,201,i8,1,A,8,-571500569_01,571500583_02,grrrrrrrgGGrgrrr
-71,201,i8,1,B,3,-571500569_01,571500618_01,grrrrrrrgrrGgrrr
-72,201,i8,2,A,5,571500618_02,571500583_02,grrrrrrrgrrrgrrG
-73,201,i8,2,B,2,571500618_02,571500617_01,grrrrrrrgrrrgGGr
-74,201,i8,3,A,6,571500617_02,571500618_01,grrrGGGrgrrrgrrr
-75,201,i8,3,B,2,571500618_02,571500617_01,grrrrrrrgrrrgGGr
-76,201,i8,4,A,6,571500617_02,571500618_01,grrrGGGrgrrrgrrr
-77,201,i8,4,B,1,571500617_02,571500569_01,grrrrrrGgrrrgrrr
-78,201,i8,5,A,7,571500583_01,571500617_01,grrGrrrrgrrrgrrr
-79,201,i8,5,B,4,571500583_01,571500569_01,gGGrrrrrgrrrgrrr
-80,202,i9,1,A,6,571510152_02,-571510152_01,GGrr
-81,202,i9,1,B,2,571510152_01,571510152_01.65,rrGG
-82,202,i9,2,A,17,,,rrrr
-83,202,i9,2,B,18,,,rrrr
-84,206,i7,1,A,8,-571511538_02,571542073_02,rrrggGG
-85,206,i7,1,B,4,571542073_01,571511538_02,GGrggrr
-86,206,i7,2,A,17,,,rrrggrr
-87,206,i7,2,B,18,,,rrrggrr
-88,206,i7,3,A,8,-571511538_02,571542073_02,rrrggGG
-89,206,i7,3,B,4,571542073_01,571511538_02,GGrggrr
-90,206,i7,4,A,17,,,rrrggrr
-91,206,i7,4,B,18,,,rrrggrr
-92,210,i6,1,A,6,-571542115_01,571500535_01,grrrgGGGrgrrgrrr
-93,210,i6,1,B,18,,,grrrgrrrrgrrgrrr
-94,210,i6,2,A,5,571500535_02.18,571511538_01,grrrgrrrrgrrgrrG
-95,210,i6,2,B,2,571500535_02.18,571542115_01,grrrgrrrrgrrgGGr
-96,210,i6,3,A,7,571511538_02.121,571542115_01,grrGgrrrrgrrgrrr
-97,210,i6,3,B,4,571511538_02.121,571500585_01,gGGrgrrrrgrrgrrr
-98,210,i6,4,A,8,571500585_02,571511538_01,grrrgrrrrgGGgrrr
-99,210,i6,4,B,3,571500585_02,571500535_01,grrrgrrrrgrrgrrr
-100,210,u60,1,A,6,,,GGGGGGGGr
-101,210,u60,1,B,18,,,GGGGGGGGr
-102,210,u60,2,A,5,571500535_02,-571500535_02,GGGGGGGGG
-103,210,u60,2,B,2,,,GGGGGGGGr
-104,210,u60,3,A,7,,,GGGGGGGGr
-105,210,u60,3,B,4,,,GGGGGGGGr
-106,210,u60,4,A,8,,,GGGGGGGGr
-107,210,u60,4,B,3,,,GGGGGGGGr
+,inter_no,node_id,phase_no,ring_type,move_no,inc_edge_id,out_edge_id,state,turn_type
+0,175,i0,1,A,8,-571542797_02,571500487_01,grrrgrrrgGGGGrgrr,straight
+1,175,i0,1,B,4,-571500487_01,571542797_02,gGGrgrrrgrrrrrgrr,straight
+2,175,i0,2,A,7,-571500487_01,571545870_01,grrGgrrrgrrrrrgrr,left
+3,175,i0,2,B,3,-571542797_02,571510153_01,grrrgrrrgrrrrGgrr,left
+4,175,i0,3,A,6,571545870_02,571510153_01,grrrgGGrgrrrrrgrr,straight
+5,175,i0,3,B,1,571545870_02,571542797_02,grrrgrrGgrrrrrgrr,left
+6,175,i0,4,A,5,571510153_02,571500487_01,grrrgrrrgrrrrrgrG,left
+7,175,i0,4,B,2,571510153_02,571545870_01,grrrgrrrgrrrrrgGr,straight
+8,175,u00,1,A,8,,,GGGGrGGGG,straight
+9,175,u00,1,B,4,,,GGGGrGGGG,straight
+10,175,u00,2,A,7,571500487_02,571500487_01.32,GGGGGGGGG,left
+11,175,u00,2,B,3,,,GGGGrGGGG,left
+12,175,u00,3,A,6,,,GGGGrGGGG,straight
+13,175,u00,3,B,1,,,GGGGrGGGG,left
+14,175,u00,4,A,5,,,GGGGrGGGG,left
+15,175,u00,4,B,2,,,GGGGrGGGG,straight
+16,176,i1,1,A,8,-571542810_01,-571542797_02.99,grrGGGrgrr,straight
+17,176,i1,1,B,4,571542797_02.99,571542810_01,gGGrrrrgrr,straight
+18,176,i1,2,A,8,-571542810_01,-571542797_02.99,grrGGGrgrr,straight
+19,176,i1,2,B,3,-571542810_01,571543469_01,grrrrrGgrr,left
+20,176,i1,3,A,5,571543469_02,-571542797_02.99,grrrrrrgGG,left
+21,176,i1,3,B,18,,,grrrrrrgrr,
+22,177,i2,1,A,8,-571542809_01,571542811_01,rrggGGG,straight
+23,177,i2,1,B,4,571542811_02,571542809_01,GGggrrr,straight
+24,177,i2,2,A,17,,,rrggrrr,
+25,177,i2,2,B,18,,,rrggrrr,
+26,177,u20,1,A,8,,,GGrGGG,straight
+27,177,u20,1,B,4,,,GGrGGG,straight
+28,177,u20,2,A,17,571542810_01.51,571542810_02,GGGGGG,
+29,177,u20,2,B,18,,,GGrGGG,
+30,178,c30,1,A,20,,,rrrrrr,
+31,178,c30,1,B,20,,,rrrrrr,
+32,178,c30,2,A,20,571542116_01,-571542116_02.96,GGGrrr,
+33,178,c30,2,B,20,571542116_02.96,571542116_02.164,rrrGGG,
+34,178,c30,3,A,20,571542116_01,-571542116_02.96,GGGrrr,
+35,178,c30,3,B,20,571542116_02.96,571542116_02.164,rrrGGG,
+36,178,c30,4,A,20,571542116_01,-571542116_02.96,GGGrrr,
+37,178,c30,4,B,20,571542116_02.96,571542116_02.164,rrrGGG,
+38,178,i3,1,A,8,571540304_02,571556450_01,grrrrgrrrrgGGGrgrrrr,straight
+39,178,i3,1,B,4,571556450_02,571540304_01,gGGGrgrrrrgrrrrgrrrr,straight
+40,178,i3,2,A,7,571556450_02,571500475_01,grrrGgrrrrgrrrrgrrrr,left
+41,178,i3,2,B,3,571540304_02,571540303_01,grrrrgrrrrgrrrGgrrrr,left
+42,178,i3,3,A,5,571540303_02.21,571556450_01,grrrrgrrrrgrrrrgrrrG,left
+43,178,i3,3,B,2,571540303_02.21,571500475_01,grrrrgrrrrgrrrrgGGGr,straight
+44,178,i3,4,A,6,-571500475_01,571540303_01,grrrrgGGGrgrrrrgrrrr,straight
+45,178,i3,4,B,1,-571500475_01,571540304_01,grrrrgrrrGgrrrrgrrrr,left
+46,178,u30,1,A,8,,,GGGGrGGG,straight
+47,178,u30,1,B,4,,,GGGGrGGG,straight
+48,178,u30,2,A,7,,,GGGGrGGG,left
+49,178,u30,2,B,3,,,GGGGrGGG,left
+50,178,u30,3,A,5,,,GGGGrGGG,left
+51,178,u30,3,B,2,,,GGGGrGGG,straight
+52,178,u30,4,A,6,571556452_01,571556452_02,GGGGGGGG,straight
+53,178,u30,4,B,1,,,GGGGrGGG,left
+54,178,u31,1,A,8,571500475_02,571500475_01.26,GGGGGGGG,straight
+55,178,u31,1,B,4,,,GGGGrGGG,straight
+56,178,u31,2,A,7,,,GGGGrGGG,left
+57,178,u31,2,B,3,,,GGGGrGGG,left
+58,178,u31,3,A,5,,,GGGGrGGG,left
+59,178,u31,3,B,2,,,GGGGrGGG,straight
+60,178,u31,4,A,6,,,GGGGrGGG,straight
+61,178,u31,4,B,1,,,GGGGrGGG,left
+62,178,u32,1,A,8,,,GGGGGGGr,straight
+63,178,u32,1,B,4,571540303_02,-571540303_02,GGGGGGGG,straight
+64,178,u32,2,A,7,,,GGGGGGGr,left
+65,178,u32,2,B,3,,,GGGGGGGr,left
+66,178,u32,3,A,5,,,GGGGGGGr,left
+67,178,u32,3,B,2,,,GGGGGGGr,straight
+68,178,u32,4,A,6,,,GGGGGGGr,straight
+69,178,u32,4,B,1,,,GGGGGGGr,left
+70,201,i8,1,A,8,-571500569_01,571500583_02,grrrrrrrgGGrgrrr,straight
+71,201,i8,1,B,3,-571500569_01,571500618_01,grrrrrrrgrrGgrrr,left
+72,201,i8,2,A,5,571500618_02,571500583_02,grrrrrrrgrrrgrrG,left
+73,201,i8,2,B,2,571500618_02,571500617_01,grrrrrrrgrrrgGGr,straight
+74,201,i8,3,A,6,571500617_02,571500618_01,grrrGGGrgrrrgrrr,straight
+75,201,i8,3,B,2,571500618_02,571500617_01,grrrrrrrgrrrgGGr,straight
+76,201,i8,4,A,6,571500617_02,571500618_01,grrrGGGrgrrrgrrr,straight
+77,201,i8,4,B,1,571500617_02,571500569_01,grrrrrrGgrrrgrrr,left
+78,201,i8,5,A,7,571500583_01,571500617_01,grrGrrrrgrrrgrrr,left
+79,201,i8,5,B,4,571500583_01,571500569_01,gGGrrrrrgrrrgrrr,straight
+80,202,i9,1,A,6,571510152_02,-571510152_01,GGrr,straight
+81,202,i9,1,B,2,571510152_01,571510152_01.65,rrGG,straight
+82,202,i9,2,A,17,,,rrrr,
+83,202,i9,2,B,18,,,rrrr,
+84,206,i7,1,A,8,-571511538_02,571542073_02,rrrggGG,straight
+85,206,i7,1,B,4,571542073_01,571511538_02,GGrggrr,straight
+86,206,i7,2,A,17,,,rrrggrr,
+87,206,i7,2,B,18,,,rrrggrr,
+88,206,i7,3,A,8,-571511538_02,571542073_02,rrrggGG,straight
+89,206,i7,3,B,4,571542073_01,571511538_02,GGrggrr,straight
+90,206,i7,4,A,17,,,rrrggrr,
+91,206,i7,4,B,18,,,rrrggrr,
+92,210,i6,1,A,6,-571542115_01,571500535_01,grrrgGGGrgrrgrrr,straight
+93,210,i6,1,B,18,,,grrrgrrrrgrrgrrr,
+94,210,i6,2,A,5,571500535_02.18,571511538_01,grrrgrrrrgrrgrrG,left
+95,210,i6,2,B,2,571500535_02.18,571542115_01,grrrgrrrrgrrgGGr,straight
+96,210,i6,3,A,7,571511538_02.121,571542115_01,grrGgrrrrgrrgrrr,left
+97,210,i6,3,B,4,571511538_02.121,571500585_01,gGGrgrrrrgrrgrrr,straight
+98,210,i6,4,A,8,571500585_02,571511538_01,grrrgrrrrgGGgrrr,straight
+99,210,i6,4,B,3,571500585_02,571500535_01,grrrgrrrrgrrgrrr,left
+100,210,u60,1,A,6,,,GGGGGGGGr,straight
+101,210,u60,1,B,18,,,GGGGGGGGr,
+102,210,u60,2,A,5,571500535_02,-571500535_02,GGGGGGGGG,left
+103,210,u60,2,B,2,,,GGGGGGGGr,straight
+104,210,u60,3,A,7,,,GGGGGGGGr,left
+105,210,u60,3,B,4,,,GGGGGGGGr,straight
+106,210,u60,4,A,8,,,GGGGGGGGr,straight
+107,210,u60,4,B,3,,,GGGGGGGGr,left
diff --git a/Intermediates/matching.csv b/Intermediates/matching.csv
index ca051a80f..298b177b5 100644
--- a/Intermediates/matching.csv
+++ b/Intermediates/matching.csv
@@ -1,129 +1,129 @@
-inter_no,node_id,move_no,inc_edge_id,out_edge_id,state
-175,i0,1,571545870_02,571542797_02,grrrgrrGgrrrrrgrr
-175,i0,2,571510153_02,571545870_01,grrrgrrrgrrrrrgGr
-175,i0,3,-571542797_02,571510153_01,grrrgrrrgrrrrGgrr
-175,i0,4,-571500487_01,571542797_02,gGGrgrrrgrrrrrgrr
-175,i0,5,571510153_02,571500487_01,grrrgrrrgrrrrrgrG
-175,i0,6,571545870_02,571510153_01,grrrgGGrgrrrrrgrr
-175,i0,7,-571500487_01,571545870_01,grrGgrrrgrrrrrgrr
-175,i0,8,-571542797_02,571500487_01,grrrgrrrgGGGGrgrr
-175,i0,9,-571500487_01,571545870_01,grrGgrrrgrrrrrgrr
-175,i0,10,571510153_02,571500487_01,grrrgrrrgrrrrrgrG
-175,i0,11,571545870_02,571510153_01,grrrgGGrgrrrrrgrr
-175,i0,12,-571500487_01,571545870_01,grrGgrrrgrrrrrgrr
-175,i0,13,571510153_02,571500487_01,grrrgrrrgrrrrrgrG
-175,i0,14,-571500487_01,571510153_01,Grrrgrrrgrrrrrgrr
-175,i0,15,-571500487_01,571500487_01,grrrgrrrgrrrrrgrr
-175,i0,16,571545870_02,571500487_01,grrrGrrrgrrrrrgrr
-176,i1,1,571542797_02.99,571542810_01,gGGrrrrgrr
-176,i1,2,571543469_02,-571542797_02.99,grrrrrrgGG
-176,i1,3,-571542810_01,571543469_01,grrrrrGgrr
-176,i1,4,571542797_02.99,571542810_01,gGGrrrrgrr
-176,i1,5,571543469_02,-571542797_02.99,grrrrrrgGG
-176,i1,6,571542797_02.99,571543469_01,Grrrrrrgrr
-176,i1,7,571542797_02.99,-571542797_02.99,grrrrrrgrr
-176,i1,8,-571542810_01,-571542797_02.99,grrGGGrgrr
-176,i1,9,571542797_02.99,571542810_01,gGGrrrrgrr
-176,i1,10,-571542810_01,-571542797_02.99,grrGGGrgrr
-176,i1,11,-571542810_01,571542810_01,grrrrrrgrr
-176,i1,12,571543469_02,571542810_01,grrrrrrGrr
-176,i1,13,-571542810_01,571543469_01,grrrrrGgrr
-176,i1,14,571542797_02.99,571542810_01,gGGrrrrgrr
-176,i1,15,571543469_02,-571542797_02.99,grrrrrrgGG
-176,i1,16,-571542810_01,571543469_01,grrrrrGgrr
-177,i2,1,571542107_02,571542809_01,rrggrrr
-177,i2,2,-571542809_01,571542107_01,rrgGrrr
-177,i2,3,-571542809_01,571542809_01,rrggrrr
-177,i2,4,571542811_02,571542809_01,GGggrrr
-177,i2,5,-571542809_01,571542811_01,rrggGGG
-177,i2,6,571542107_02,571542809_01,rrggrrr
-177,i2,7,571542811_02,571542107_01,rrggrrr
-177,i2,8,-571542809_01,571542811_01,rrggGGG
-177,i2,9,571542107_02,571542809_01,rrggrrr
-177,i2,10,-571542809_01,571542107_01,rrgGrrr
-177,i2,11,-571542809_01,571542809_01,rrggrrr
-177,i2,12,571542811_02,571542809_01,GGggrrr
-177,i2,13,-571542809_01,571542811_01,rrggGGG
-177,i2,14,571542107_02,571542809_01,rrggrrr
-177,i2,15,571542811_02,571542107_01,rrggrrr
-177,i2,16,-571542809_01,571542811_01,rrggGGG
-178,i3,1,-571500475_01,571540304_01,grrrrgrrrGgrrrrgrrrr
-178,i3,2,571540303_02.21,571500475_01,grrrrgrrrrgrrrrgGGGr
-178,i3,3,571540304_02,571540303_01,grrrrgrrrrgrrrGgrrrr
-178,i3,4,571556450_02,571540304_01,gGGGrgrrrrgrrrrgrrrr
-178,i3,5,571540303_02.21,571556450_01,grrrrgrrrrgrrrrgrrrG
-178,i3,6,-571500475_01,571540303_01,grrrrgGGGrgrrrrgrrrr
-178,i3,7,571556450_02,571500475_01,grrrGgrrrrgrrrrgrrrr
-178,i3,8,571540304_02,571556450_01,grrrrgrrrrgGGGrgrrrr
-178,i3,9,571556450_02,571500475_01,grrrGgrrrrgrrrrgrrrr
-178,i3,10,571540304_02,571556450_01,grrrrgrrrrgGGGrgrrrr
-178,i3,11,-571500475_01,571540304_01,grrrrgrrrGgrrrrgrrrr
-178,i3,12,571540303_02.21,571500475_01,grrrrgrrrrgrrrrgGGGr
-178,i3,13,571540304_02,571540303_01,grrrrgrrrrgrrrGgrrrr
-178,i3,14,571556450_02,571540304_01,gGGGrgrrrrgrrrrgrrrr
-178,i3,15,571540303_02.21,571556450_01,grrrrgrrrrgrrrrgrrrG
-178,i3,16,-571500475_01,571540303_01,grrrrgGGGrgrrrrgrrrr
-201,i8,1,571500617_02,571500569_01,grrrrrrGgrrrgrrr
-201,i8,2,571500618_02,571500617_01,grrrrrrrgrrrgGGr
-201,i8,3,-571500569_01,571500618_01,grrrrrrrgrrGgrrr
-201,i8,4,571500583_01,571500569_01,gGGrrrrrgrrrgrrr
-201,i8,5,571500618_02,571500583_02,grrrrrrrgrrrgrrG
-201,i8,6,571500617_02,571500618_01,grrrGGGrgrrrgrrr
-201,i8,7,571500583_01,571500617_01,grrGrrrrgrrrgrrr
-201,i8,8,-571500569_01,571500583_02,grrrrrrrgGGrgrrr
-201,i8,9,571500583_01,571500617_01,grrGrrrrgrrrgrrr
-201,i8,10,-571500569_01,571500583_02,grrrrrrrgGGrgrrr
-201,i8,11,571500617_02,571500569_01,grrrrrrGgrrrgrrr
-201,i8,12,571500618_02,571500617_01,grrrrrrrgrrrgGGr
-201,i8,13,-571500569_01,571500618_01,grrrrrrrgrrGgrrr
-201,i8,14,571500583_01,571500569_01,gGGrrrrrgrrrgrrr
-201,i8,15,571500618_02,571500583_02,grrrrrrrgrrrgrrG
-201,i8,16,571500617_02,571500618_01,grrrGGGrgrrrgrrr
-202,i9,1,571510152_02,571510152_01.65,rrrr
-202,i9,2,571510152_01,571510152_01.65,rrGG
-202,i9,3,571510152_02,-571510152_01,GGrr
-202,i9,4,571510152_01,571510152_01.65,rrGG
-202,i9,5,571510152_01,-571510152_01,rrrr
-202,i9,6,571510152_02,-571510152_01,GGrr
-202,i9,7,571510152_01,571510152_01.65,rrGG
-202,i9,8,571510152_02,-571510152_01,GGrr
-202,i9,9,571510152_02,571510152_01.65,rrrr
-202,i9,10,571510152_01,571510152_01.65,rrGG
-202,i9,11,571510152_02,-571510152_01,GGrr
-202,i9,12,571510152_01,571510152_01.65,rrGG
-202,i9,13,571510152_01,-571510152_01,rrrr
-202,i9,14,571510152_02,-571510152_01,GGrr
-202,i9,15,571510152_01,571510152_01.65,rrGG
-202,i9,16,571510152_02,-571510152_01,GGrr
-206,i7,1,571542071_02,571511538_02,rrrggrr
-206,i7,2,-571511538_02,571542071_01,rrrgGrr
-206,i7,3,-571511538_02,571511538_02,rrrggrr
-206,i7,4,571542073_01,571511538_02,GGrggrr
-206,i7,5,-571511538_02,571542073_02,rrrggGG
-206,i7,6,571542071_02,571511538_02,rrrggrr
-206,i7,7,571542073_01,571542071_01,rrGggrr
-206,i7,8,-571511538_02,571542073_02,rrrggGG
-206,i7,9,571542073_01,571542071_01,rrGggrr
-206,i7,10,-571511538_02,571542073_02,rrrggGG
-206,i7,11,571542071_02,571511538_02,rrrggrr
-206,i7,12,571542073_01,571542071_01,rrGggrr
-206,i7,13,-571511538_02,571542073_02,rrrggGG
-206,i7,14,571542073_01,571511538_02,GGrggrr
-206,i7,15,571542073_01,571542073_02,rrrggrr
-206,i7,16,571542071_02,571542073_02,rrrGgrr
-210,i6,1,-571542115_01,571500585_01,grrrgrrrGgrrgrrr
-210,i6,2,571500535_02.18,571542115_01,grrrgrrrrgrrgGGr
-210,i6,3,571500585_02,571500535_01,grrrgrrrrgrrgrrr
-210,i6,4,571511538_02.121,571500585_01,gGGrgrrrrgrrgrrr
-210,i6,5,571500535_02.18,571511538_01,grrrgrrrrgrrgrrG
-210,i6,6,-571542115_01,571500535_01,grrrgGGGrgrrgrrr
-210,i6,7,571511538_02.121,571542115_01,grrGgrrrrgrrgrrr
-210,i6,8,571500585_02,571511538_01,grrrgrrrrgGGgrrr
-210,i6,9,571511538_02.121,571542115_01,grrGgrrrrgrrgrrr
-210,i6,10,571500585_02,571511538_01,grrrgrrrrgGGgrrr
-210,i6,11,-571542115_01,571500585_01,grrrgrrrGgrrgrrr
-210,i6,12,571500535_02.18,571542115_01,grrrgrrrrgrrgGGr
-210,i6,13,571500585_02,571500535_01,grrrgrrrrgrrgrrr
-210,i6,14,571511538_02.121,571500585_01,gGGrgrrrrgrrgrrr
-210,i6,15,571500535_02.18,571511538_01,grrrgrrrrgrrgrrG
-210,i6,16,-571542115_01,571500535_01,grrrgGGGrgrrgrrr
+inter_no,node_id,move_no,inc_edge_id,out_edge_id,state,turn_type
+175,i0,1,571545870_02,571542797_02,grrrgrrGgrrrrrgrr,left
+175,i0,2,571510153_02,571545870_01,grrrgrrrgrrrrrgGr,straight
+175,i0,3,-571542797_02,571510153_01,grrrgrrrgrrrrGgrr,left
+175,i0,4,-571500487_01,571542797_02,gGGrgrrrgrrrrrgrr,straight
+175,i0,5,571510153_02,571500487_01,grrrgrrrgrrrrrgrG,left
+175,i0,6,571545870_02,571510153_01,grrrgGGrgrrrrrgrr,straight
+175,i0,7,-571500487_01,571545870_01,grrGgrrrgrrrrrgrr,left
+175,i0,8,-571542797_02,571500487_01,grrrgrrrgGGGGrgrr,straight
+175,i0,9,-571500487_01,571545870_01,grrGgrrrgrrrrrgrr,left
+175,i0,10,571510153_02,571500487_01,grrrgrrrgrrrrrgrG,left
+175,i0,11,571545870_02,571510153_01,grrrgGGrgrrrrrgrr,straight
+175,i0,12,-571500487_01,571545870_01,grrGgrrrgrrrrrgrr,left
+175,i0,13,571510153_02,571500487_01,grrrgrrrgrrrrrgrG,left
+175,i0,14,-571500487_01,571510153_01,Grrrgrrrgrrrrrgrr,straight
+175,i0,15,-571500487_01,571500487_01,grrrgrrrgrrrrrgrr,left
+175,i0,16,571545870_02,571500487_01,grrrGrrrgrrrrrgrr,straight
+176,i1,1,571542797_02.99,571542810_01,gGGrrrrgrr,straight
+176,i1,2,571543469_02,-571542797_02.99,grrrrrrgGG,left
+176,i1,3,-571542810_01,571543469_01,grrrrrGgrr,left
+176,i1,4,571542797_02.99,571542810_01,gGGrrrrgrr,straight
+176,i1,5,571543469_02,-571542797_02.99,grrrrrrgGG,left
+176,i1,6,571542797_02.99,571543469_01,Grrrrrrgrr,straight
+176,i1,7,571542797_02.99,-571542797_02.99,grrrrrrgrr,left
+176,i1,8,-571542810_01,-571542797_02.99,grrGGGrgrr,straight
+176,i1,9,571542797_02.99,571542810_01,gGGrrrrgrr,straight
+176,i1,10,-571542810_01,-571542797_02.99,grrGGGrgrr,straight
+176,i1,11,-571542810_01,571542810_01,grrrrrrgrr,left
+176,i1,12,571543469_02,571542810_01,grrrrrrGrr,straight
+176,i1,13,-571542810_01,571543469_01,grrrrrGgrr,left
+176,i1,14,571542797_02.99,571542810_01,gGGrrrrgrr,straight
+176,i1,15,571543469_02,-571542797_02.99,grrrrrrgGG,left
+176,i1,16,-571542810_01,571543469_01,grrrrrGgrr,left
+177,i2,1,571542107_02,571542809_01,rrggrrr,left
+177,i2,2,-571542809_01,571542107_01,rrgGrrr,straight
+177,i2,3,-571542809_01,571542809_01,rrggrrr,left
+177,i2,4,571542811_02,571542809_01,GGggrrr,straight
+177,i2,5,-571542809_01,571542811_01,rrggGGG,straight
+177,i2,6,571542107_02,571542809_01,rrggrrr,straight
+177,i2,7,571542811_02,571542107_01,rrggrrr,left
+177,i2,8,-571542809_01,571542811_01,rrggGGG,straight
+177,i2,9,571542107_02,571542809_01,rrggrrr,left
+177,i2,10,-571542809_01,571542107_01,rrgGrrr,straight
+177,i2,11,-571542809_01,571542809_01,rrggrrr,left
+177,i2,12,571542811_02,571542809_01,GGggrrr,straight
+177,i2,13,-571542809_01,571542811_01,rrggGGG,straight
+177,i2,14,571542107_02,571542809_01,rrggrrr,straight
+177,i2,15,571542811_02,571542107_01,rrggrrr,left
+177,i2,16,-571542809_01,571542811_01,rrggGGG,straight
+178,i3,1,-571500475_01,571540304_01,grrrrgrrrGgrrrrgrrrr,left
+178,i3,2,571540303_02.21,571500475_01,grrrrgrrrrgrrrrgGGGr,straight
+178,i3,3,571540304_02,571540303_01,grrrrgrrrrgrrrGgrrrr,left
+178,i3,4,571556450_02,571540304_01,gGGGrgrrrrgrrrrgrrrr,straight
+178,i3,5,571540303_02.21,571556450_01,grrrrgrrrrgrrrrgrrrG,left
+178,i3,6,-571500475_01,571540303_01,grrrrgGGGrgrrrrgrrrr,straight
+178,i3,7,571556450_02,571500475_01,grrrGgrrrrgrrrrgrrrr,left
+178,i3,8,571540304_02,571556450_01,grrrrgrrrrgGGGrgrrrr,straight
+178,i3,9,571556450_02,571500475_01,grrrGgrrrrgrrrrgrrrr,left
+178,i3,10,571540304_02,571556450_01,grrrrgrrrrgGGGrgrrrr,straight
+178,i3,11,-571500475_01,571540304_01,grrrrgrrrGgrrrrgrrrr,left
+178,i3,12,571540303_02.21,571500475_01,grrrrgrrrrgrrrrgGGGr,straight
+178,i3,13,571540304_02,571540303_01,grrrrgrrrrgrrrGgrrrr,left
+178,i3,14,571556450_02,571540304_01,gGGGrgrrrrgrrrrgrrrr,straight
+178,i3,15,571540303_02.21,571556450_01,grrrrgrrrrgrrrrgrrrG,left
+178,i3,16,-571500475_01,571540303_01,grrrrgGGGrgrrrrgrrrr,straight
+201,i8,1,571500617_02,571500569_01,grrrrrrGgrrrgrrr,left
+201,i8,2,571500618_02,571500617_01,grrrrrrrgrrrgGGr,straight
+201,i8,3,-571500569_01,571500618_01,grrrrrrrgrrGgrrr,left
+201,i8,4,571500583_01,571500569_01,gGGrrrrrgrrrgrrr,straight
+201,i8,5,571500618_02,571500583_02,grrrrrrrgrrrgrrG,left
+201,i8,6,571500617_02,571500618_01,grrrGGGrgrrrgrrr,straight
+201,i8,7,571500583_01,571500617_01,grrGrrrrgrrrgrrr,left
+201,i8,8,-571500569_01,571500583_02,grrrrrrrgGGrgrrr,straight
+201,i8,9,571500583_01,571500617_01,grrGrrrrgrrrgrrr,left
+201,i8,10,-571500569_01,571500583_02,grrrrrrrgGGrgrrr,straight
+201,i8,11,571500617_02,571500569_01,grrrrrrGgrrrgrrr,left
+201,i8,12,571500618_02,571500617_01,grrrrrrrgrrrgGGr,straight
+201,i8,13,-571500569_01,571500618_01,grrrrrrrgrrGgrrr,left
+201,i8,14,571500583_01,571500569_01,gGGrrrrrgrrrgrrr,straight
+201,i8,15,571500618_02,571500583_02,grrrrrrrgrrrgrrG,left
+201,i8,16,571500617_02,571500618_01,grrrGGGrgrrrgrrr,straight
+202,i9,1,571510152_02,571510152_01.65,rrrr,left
+202,i9,2,571510152_01,571510152_01.65,rrGG,straight
+202,i9,3,571510152_02,-571510152_01,GGrr,straight
+202,i9,4,571510152_01,571510152_01.65,rrGG,straight
+202,i9,5,571510152_01,-571510152_01,rrrr,left
+202,i9,6,571510152_02,-571510152_01,GGrr,straight
+202,i9,7,571510152_01,571510152_01.65,rrGG,straight
+202,i9,8,571510152_02,-571510152_01,GGrr,straight
+202,i9,9,571510152_02,571510152_01.65,rrrr,left
+202,i9,10,571510152_01,571510152_01.65,rrGG,straight
+202,i9,11,571510152_02,-571510152_01,GGrr,straight
+202,i9,12,571510152_01,571510152_01.65,rrGG,straight
+202,i9,13,571510152_01,-571510152_01,rrrr,left
+202,i9,14,571510152_02,-571510152_01,GGrr,straight
+202,i9,15,571510152_01,571510152_01.65,rrGG,straight
+202,i9,16,571510152_02,-571510152_01,GGrr,straight
+206,i7,1,571542071_02,571511538_02,rrrggrr,left
+206,i7,2,-571511538_02,571542071_01,rrrgGrr,straight
+206,i7,3,-571511538_02,571511538_02,rrrggrr,left
+206,i7,4,571542073_01,571511538_02,GGrggrr,straight
+206,i7,5,-571511538_02,571542073_02,rrrggGG,straight
+206,i7,6,571542071_02,571511538_02,rrrggrr,straight
+206,i7,7,571542073_01,571542071_01,rrGggrr,left
+206,i7,8,-571511538_02,571542073_02,rrrggGG,straight
+206,i7,9,571542073_01,571542071_01,rrGggrr,left
+206,i7,10,-571511538_02,571542073_02,rrrggGG,straight
+206,i7,11,571542071_02,571511538_02,rrrggrr,left
+206,i7,12,571542073_01,571542071_01,rrGggrr,left
+206,i7,13,-571511538_02,571542073_02,rrrggGG,straight
+206,i7,14,571542073_01,571511538_02,GGrggrr,straight
+206,i7,15,571542073_01,571542073_02,rrrggrr,left
+206,i7,16,571542071_02,571542073_02,rrrGgrr,straight
+210,i6,1,-571542115_01,571500585_01,grrrgrrrGgrrgrrr,left
+210,i6,2,571500535_02.18,571542115_01,grrrgrrrrgrrgGGr,straight
+210,i6,3,571500585_02,571500535_01,grrrgrrrrgrrgrrr,left
+210,i6,4,571511538_02.121,571500585_01,gGGrgrrrrgrrgrrr,straight
+210,i6,5,571500535_02.18,571511538_01,grrrgrrrrgrrgrrG,left
+210,i6,6,-571542115_01,571500535_01,grrrgGGGrgrrgrrr,straight
+210,i6,7,571511538_02.121,571542115_01,grrGgrrrrgrrgrrr,left
+210,i6,8,571500585_02,571511538_01,grrrgrrrrgGGgrrr,straight
+210,i6,9,571511538_02.121,571542115_01,grrGgrrrrgrrgrrr,left
+210,i6,10,571500585_02,571511538_01,grrrgrrrrgGGgrrr,straight
+210,i6,11,-571542115_01,571500585_01,grrrgrrrGgrrgrrr,left
+210,i6,12,571500535_02.18,571542115_01,grrrgrrrrgrrgGGr,straight
+210,i6,13,571500585_02,571500535_01,grrrgrrrrgrrgrrr,left
+210,i6,14,571511538_02.121,571500585_01,gGGrgrrrrgrrgrrr,straight
+210,i6,15,571500535_02.18,571511538_01,grrrgrrrrgrrgrrG,left
+210,i6,16,-571542115_01,571500535_01,grrrgGGGrgrrgrrr,straight
diff --git a/Results/sn_1704416400.add.xml b/Results/sn_1704416400.add.xml
new file mode 100644
index 000000000..c84d5b969
--- /dev/null
+++ b/Results/sn_1704416400.add.xml
@@ -0,0 +1,595 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Scripts/__pycache__/generate_signals.cpython-38.pyc b/Scripts/__pycache__/generate_signals.cpython-38.pyc
index 30fb8628f..1749a89b6 100644
Binary files a/Scripts/__pycache__/generate_signals.cpython-38.pyc and b/Scripts/__pycache__/generate_signals.cpython-38.pyc differ
diff --git a/Scripts/__pycache__/preprocess_daily.cpython-38.pyc b/Scripts/__pycache__/preprocess_daily.cpython-38.pyc
index 726b0d82f..7067e70e5 100644
Binary files a/Scripts/__pycache__/preprocess_daily.cpython-38.pyc and b/Scripts/__pycache__/preprocess_daily.cpython-38.pyc differ
diff --git a/Scripts/preprocess_daily.py b/Scripts/preprocess_daily.py
index acfd5d8d6..408b39946 100644
--- a/Scripts/preprocess_daily.py
+++ b/Scripts/preprocess_daily.py
@@ -383,6 +383,7 @@ class DailyPreprocessor():
self.match5.at[index, 'inc_edge_id'] = inc_edge_id
self.match5.at[index, 'out_edge_id'] = out_edge_id
self.match5['node_id'] = self.match5['inter_no'].map(self.inter2node)
+ self.match5['node_type'] = 'normal'
self.match5 = self.match5.sort_values(by=['inter_no','phase_no','ring_type']).reset_index(drop=True)
# n2io2turn : dictionary that maps node_id to io2turn
@@ -451,6 +452,7 @@ class DailyPreprocessor():
cmatch = self.match5.copy()[self.match5.node_id==parent_id] # match dataframe for a child node
cmatch = cmatch.sort_values(by=['phase_no', 'ring_type']).reset_index(drop=True)
cmatch['node_id'] = child_id
+ cmatch['node_type'] = 'u_turn'
# 진입엣지 각도
inc_angle = p2inc_edge2angle[parent_id][adj_inc_edge_id]
@@ -535,6 +537,7 @@ class DailyPreprocessor():
self.coord[['inc_dire', 'out_dire', 'inc_angle','out_angle']] = np.nan
self.coord['move_no'] = 20
self.coord = self.coord[['inter_no', 'phase_no', 'ring_type', 'move_no', 'inc_dire', 'out_dire', 'inc_angle','out_angle', 'inc_edge_id', 'out_edge_id', 'node_id']]
+ self.coord['node_type'] = 'coord'
cmatches = pd.concat(cmatches)
self.match6 = pd.concat([self.match5, cmatches, self.coord]).drop_duplicates().sort_values(by=['inter_no', 'node_id', 'phase_no', 'ring_type'])
@@ -550,7 +553,7 @@ class DailyPreprocessor():
'''
self.match7 = self.match6.copy()
- self.match7 = self.match7[['inter_no', 'node_id', 'move_no', 'inc_angle', 'out_angle', 'inc_dire', 'out_dire', 'inc_edge_id', 'out_edge_id']]
+ self.match7 = self.match7[['inter_no', 'node_id', 'move_no', 'inc_angle', 'out_angle', 'inc_dire', 'out_dire', 'inc_edge_id', 'out_edge_id', 'node_type', 'turn_type']]
# (1) 각 교차로별 방향 목록 : pdires (possible directions)
p2dires = {} # parent_id to directions
@@ -653,7 +656,7 @@ class DailyPreprocessor():
if (inc_edge_id, out_edge_id) in self.n2io2turn[parent_id]:
turn_type = self.n2io2turn[parent_id][inc_edge_id, out_edge_id]
else:
- turn_type = 'left' if move_no%2 else 'straight'
+ turn_type = 'left' if move_no % 2 else 'straight'
new_row = pd.DataFrame({'inter_no':[inter_no], 'node_id':[parent_id], 'move_no':[move_no],
'inc_dire':[inc_dire], 'out_dire':[out_dire],
'inc_edge_id':[inc_edge_id], 'out_edge_id':[out_edge_id],
@@ -748,7 +751,7 @@ class DailyPreprocessor():
uturn_conn = inc_edge.getConnections(out_edge)[0]
self.u2uindex[child_id] = uturn_conn.getTLLinkIndex()
- self.p2UPLindices2inc_edge_ids = dict() # parent id to unprotected left index
+ self.p2UPLindices2inc_edge_ids = dict() # parent id to unprotected left index to incoming_edge_ids
for parent_id in self.parent_ids:
init_state = self.node2init[parent_id]
# 우회전 이동류 인덱스
@@ -807,7 +810,7 @@ class DailyPreprocessor():
self.matching.at[i, 'state'] = ''.join(state_list)
self.matching = self.matching.dropna(subset='state')
self.matching = self.matching.reset_index(drop=True)
- self.matching = self.matching[['inter_no', 'node_id', 'move_no', 'inc_edge_id', 'out_edge_id', 'state']]
+ self.matching = self.matching[['inter_no', 'node_id', 'move_no', 'inc_edge_id', 'out_edge_id', 'state', 'turn_type']]
# match6 : 신호 배정
for i, row in self.match6.iterrows():
@@ -866,7 +869,7 @@ class DailyPreprocessor():
self.match6 = self.match6.dropna(subset='state')
self.match6 = self.match6.reset_index(drop=True)
- self.match6 = self.match6[['inter_no', 'node_id', 'phase_no', 'ring_type', 'move_no', 'inc_edge_id', 'out_edge_id', 'state']]
+ self.match6 = self.match6[['inter_no', 'node_id', 'phase_no', 'ring_type', 'move_no', 'inc_edge_id', 'out_edge_id', 'state', 'turn_type']]
self.match6.to_csv(os.path.join(self.path_intermediates, 'match6.csv'))
self.matching.to_csv(os.path.join(self.path_intermediates, 'matching.csv'), index=0)
print('2-4. 직진 및 좌회전(G)을 배정했습니다.')
diff --git a/routes.rou.xml b/routes.rou.xml
new file mode 100644
index 000000000..5cee76fed
--- /dev/null
+++ b/routes.rou.xml
@@ -0,0 +1,21608 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sn_routes.rou.xml b/sn_routes.rou.xml
new file mode 100644
index 000000000..fb1915d45
--- /dev/null
+++ b/sn_routes.rou.xml
@@ -0,0 +1,133 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/store.add.xml b/store.add.xml
new file mode 100644
index 000000000..8975c9ec8
--- /dev/null
+++ b/store.add.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file