this.map;

this.poezd;
this.poezd_status = 0; //Состояние поезда: 0-стоит, 1-едет
this.quantum = 200;

this.path_times;
this.total_time = 0;

this.current_vid = 0;
this.videos;
this.video_times;
this.video_lengths = [];

this.first_video = 'dgTFqyIDpQw';

this.is_loading = 1;
this.is_video_loaded = 0;
this.is_line_loaded = 0;
var polyline;

this.path_distances = [0];

this.current_time;
this.current_segment;

this.is_moov = 0;

/**
* body onLoad
**/
function startPage() {
	if (GBrowserIsCompatible()) {
		wait();
		initMap();
		initVideo();
	}
}

//==================================================================================

function getFirstVideo() {
	return this.first_video;
}

//==== VIDEO =======================================================================
function initVideo(/**yt_id, time**/) {
	var xmlhttp = getXmlHttp();
	rand = Math.random();
	/*
	if (rand < 0.3) {
		this.first_video = 'Dmc2STzMOT4';
	}
	else if (rand < 0.6) {
		this.first_video = 'v_f-JtAQuQE';
	}
	*/
	xmlhttp.open('GET', 'data/line_videos.txt', true);
	xmlhttp.onreadystatechange = function() {
	 	if (xmlhttp.readyState == 4) {
	 		if (xmlhttp.status == 200) {
				data = xmlhttp.responseText;
				setVideoTimes((data).split("\n"));

				swfobject.removeSWF("ytapiplayer");
				// <![CDATA[

				// allowScriptAccess must be set to allow the Javascript from one
				// domain to access the swf on the youtube domain
				var params = { allowScriptAccess: "always", bgcolor: "#cccccc" };
				// this sets the id of the object or embed tag to 'myytplayer'.
				// You then use this id to access the swf and make calls to the player's API
				var atts = { id: "myytplayer" };
				swfobject.embedSWF("http://www.youtube.com/v/" + getFirstVideo() + "&border=0&enablejsapi=1&playerapiid=ytplayer&autoplay=0&showsearch=0&rel=0",
				                 "ytapiplayer", "481", "289", "8", null, null, params, atts);
				//]]>
		 	}
			else {
				alert('Не найден список видеороликов.');
			}
	 	}
	};
	xmlhttp.send(null);
}

function onYouTubePlayerReady(playerId) {
	if (isLineLoaded()) {
		setHandlers();
	}
}

function setHandlers() {
	setClicks();

	startAudio();
	//goToVideo('dgTFqyIDpQw', 0, false);

	this.current_vid = 0;
	time = this.video_times[this.current_vid];
	this.current_segment = 0;
	from = getPathPoint(this.current_segment);
    poezd = createMarker(from);
    this.poezd = poezd;
	//setPoezd(poezd);
	this.map.addOverlay(this.poezd);

	ytplayer = document.getElementById("myytplayer");
	ytplayer.stopVideo();

	setInterval(updateytplayerInfo, this.quantum);
	updateytplayerInfo();

	setInterval(centerMap, this.quantum*17);

	setInterval(showDistances, this.quantum*51);

	setListener();
	unwait();
}

function setClicks() {
var hilits = [
		[1, 'dgTFqyIDpQw', 0, 12],		//Москва
		//[2, '1Xdrbvv-O1c', 900],	//Петушки
		//[3, 'yEPpiZFn1YU', 675],	//Храм Покрова на Нерли
		//[4, 'NjkOQBPkbtQ', 0],		//р.Клязьма
		[5, 'u71nSGXoGic', 0, 12],		//р.Волга
		//[6, 'Sk3xK4Xck0I', 0],		//р.Вятка
		[7, 'mwjK6ZzURVM', 0, 12],		//р.Кама
		[8, '1OPbAaexHq4', 0, 12],		//Пермь
		[9, 'JQFBU5vwGvo', 2162, 12],	//Нижний Урал,с. Усть-Кишерть
		[10, 'k7_2BLIeBUU', 0, 13],		//Екатеринбург
		[11, 'cWSKL6-wmUo', 0, 13],		//Тюмень
		//[12, 's19S34_o-uc', 369],	//р.Тобол
		[13, 'Q1tWxA-lmak', 0, 12],		//р.Иртыш
		//[14, 'gpWrvWKe7f4', 0],		//Омск
		[15, 'yEPHRfxwSrQ', 1240, 12],	//Облака над Барабинской степью
		[16, 'I0VF78_viKM', 0, 12],		//р.Обь
		[17, 'FHhXzZ9NBxs', 0, 12],		//Новосибирск
		[18, '053FplLWBvQ', 252, 12],	//р.Кия
		[19, '_cvlkbN3xwQ', 0, 13],		//Красноярск
		[20, '_cvlkbN3xwQ', 300, 12],	//р.Енисей
		[21, 'sXuyVzWoEd0', 500, 12],	//с.Зыково, водонапорная башня в стиле модерн
		[22, 'iqu7hfp37Xk', 0, 12],		//р.Кан
		[23, 'zHBIQZbcVxg', 1680, 12],	//Тайшет
		//[24, 'dkXRoVvepWc', 0],		//р.Ока
		//[25, 'CWYahMQBsuc', 0],		//р.Иркут
		[26, 'BGey2L6jj90', 0, 13],		//Иркутск
		[27, 'BGey2L6jj90', 190, 12],	//р.Ангара
		[28, 'ecxKrJMEbWk', 1580, 12],	//Гладь оз.Байкал
		[29, 'ecxKrJMEbWk', 255, 14],	//Слюдянка
		//[30, 'NxDe-rhwB_s', 1310],	//оз. Байкал, п.Танхой
		[31, '_D44SFyHRrk', 0, 13],		//Улан-Удэ
		[32, 'f5F7kCAlMfI', 460, 12],	//Баргузинские горы
		[33, '0htOmH36yws', 260, 12],	//Петровский завод, г.Петровск-Забайкальский
		[34, 'AN9coQgjK7k', 1466, 12],	//оз.Кенон г.Чита
		[35, 'VFlxti1sK80', 420, 12],	//Хребет Цаган-Хуртей, п.Хилок
		[36, 'tzqL8ZJbAYo', 1150, 12],	//п.Карымское "Утро туманное"
		[37, 'fxD-HHU-WUE', 0, 12],		//Ерофей Павлович
		[38, 'svUTKAwnYIM', 0, 12],		//Рассвет над р.Зея
		[39, '2TJtQsCvojg', 0, 12],		//р.Томь
		[40, 'g5-B0_GtXU8', 425, 12],	//Бескрайняя Зейско-Буреинская равнина
		[41, '47lt9ULeKi4', 480, 12],	//Хинганский заповедник
		[42, '1Rkg3t6hmFI', 0, 14],		//Биробиджан
		[43, '8rUdbsffelE', 0, 12],		//р.Амур
		[44, 'Ij_ohbbePrE', 0, 14],		//Хабаровск
		[45, '23OUTclMsyY', 10, 12],	//Хехцирский хребет
		[46, 'Bd7dD8hzG1c', 0, 12],		//р.Бикин, пасмурный пейзаж
		[47, '9VaoM1mfg1A', 600, 14]	//Владивосток
	];
	hilits[0][1] = getFirstVideo();

	for (i=0; i<hilits.length; i++) {
		hlite = hilits[i];
		div_id = ['_goto_', hlite[0]];
		startBtn = document.getElementById(div_id.join(''));
		startBtn.onclick = function(yt_id, seek, zoom) {
			return function() {
				if (isLoading()) {
					return false;
				}
				goToVideo(yt_id, seek, true, zoom);
			}
		}(hlite[1], hlite[2], hlite[3]);
	}
}

function setListener() {
	ytplayer = document.getElementById("myytplayer");
	ytplayer.addEventListener("onStateChange", "onytplayerStateChange");
	ytplayer.addEventListener("onError", "onPlayerError");
}

function updateytplayerInfo() {
	if (!this.video_times) {
		return;
	}
	if (isLoading()) {
		return;
	}
	if (this.is_moov) {
		return;
	}
	ytplayer = document.getElementById("myytplayer");
	duration = ytplayer.getDuration();
	position = ytplayer.getCurrentTime();

	this.current_time = parseFloat(this.video_times[this.current_vid]) + parseFloat(position);

	state = ytplayer.getPlayerState();
	if (state >= 0 && state < 3 && position > 0) {
		setMarkerPos(this.current_time);
	}

	//lbl = document.getElementById("time_label");
	//lbl_arr = [this.current_vid, this.videos[this.current_vid], this.current_segment];
	//lbl.innerHTML = lbl_arr.join(' : ');

	if (parseFloat(position) + 1 >= parseFloat(this.video_lengths[this.current_vid])) {
		playNextVideo();
	}
}

function centerMap() {
	if (isLoading()) {
		return;
	}
	if (this.is_moov) {
		return;
	}
	ytplayer = document.getElementById("myytplayer");
	ytplayer.mute();
	position = ytplayer.getCurrentTime();
	state = ytplayer.getPlayerState();
	if (this.poezd_status != 0 && state > 0 && state < 3 &&  position > 0) {
		to = this.poezd.getLatLng();
		bounds = this.map.getBounds();
		if (!bounds.contains(to)) {
			this.map.setCenter(to);
		}
	}
	this.current_segment = getCurrentLineSegment(this.current_time);
}

function showDistances() {
	total_dist = path_distances[path_distances.length - 1];
	from = path_distances[Math.round(this.current_segment/10)];
	lbl = document.getElementById("_ot_do_from");
	lbl.innerHTML = Math.round(from/1000);
	lbl = document.getElementById("_ot_do_to");
	lbl.innerHTML = Math.round((total_dist - from)/1000);
}

function onPlayerError(errorCode) {
	//stopMarker();
}

function onytplayerStateChange(newState) {
	var state = newState;
	if (newState == 5) {
		startMarker();
	}
	else if (newState == 1) {
		moveMarker();
	}
	else {
		stopMarker();
	}
}

function playNextVideo() {
	ytplayer = document.getElementById("myytplayer");
	this.current_vid++;
	video_id = this.videos[this.current_vid];
	ytplayer.cueVideoById(video_id, 0);
	ytplayer.playVideo();
}
//=======================================================
//==== AJAX =============================================
function getXmlHttp(){
	var xmlhttp;
	try {
		xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
	} catch (e) {
		try {
			xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
		} catch (E) {
			xmlhttp = false;
		}
	}
	if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
		xmlhttp = new XMLHttpRequest();
	}
	return xmlhttp;
}

//==== GOOGLE MAP =======================================
function getMap() {
	return this.map;
}

function initMap() {
	this.map = new GMap2(document.getElementById('map'), {
		draggableCursor:'crosshair',
		mapTypes: (G_PHYSICAL_MAP, G_SATELLITE_MAP)
	});
	customUI = this.map.getDefaultUI();
	customUI.maptypes.hybrid = false;
	customUI.maptypes.normal = false;
	this.map.setUI(customUI);

	this.map.disableDoubleClickZoom();

	map_center = new GLatLng(55.75838, 37.66163);
	this.map.setMapType(G_PHYSICAL_MAP);
	zoom = 12;
	this.map.setCenter(map_center, zoom);

	var xmlhttp = getXmlHttp()
	xmlhttp.open('GET', 'data/line_data.txt', true);

	xmlhttp.onreadystatechange = function() {
	 	if (xmlhttp.readyState == 4) {
	 		if (xmlhttp.status == 200) {
				data = xmlhttp.responseText;
				file_lines = (data).split("\n");
				pts = [];
				times = [];
				dists = [0];
				dist_from = 0;

				j = 0;
				for (i = 0; i < file_lines.length; i++) {
					// read each point on that line
					coords = (file_lines[i]).split("|");
					pts[i] = new GLatLng(parseFloat(coords[0]), parseFloat(coords[1]));
					times[i] = coords[2];
					if (i > 0) {
						dist_from = dist_from + pts[i].distanceFrom(pts[i-1]);
						if (i%10 == 1) {
							j++;
							dists[j] = Math.round(dist_from);
						}
					}
				}

				setPathPoints(pts);
				setDistances(dists);
				setPathTimes(times);

				map = getMap();

				GEvent.addListener(map, "dragstart", function() {
					setMooving(1);
				});

				GEvent.addListener(map, "dragend", function() {
					setMooving(0);
				});

				loadOverlays(12);

				if (isVideoLoaded()) {
					setHandlers();
				}
			}
			else {
				alert('Не найдены данные для построения маршрута движения поезда.');
			}
	 	}
	};
	xmlhttp.send(null);
	initMapplet();
}

function setMooving(is_mooving) {
	this.is_moov = is_mooving;
}

function getZoomIdx(zoom) {
	if (zoom >= 12) {
		return 12;
	}
	return zoom;
}


function setMarkerPos(time) {
	segment = this.current_segment;

	if (segment < 0) {
		return;
	}
	from_vertex = getPathPoint(segment);
	to_vertex = getPathPoint(segment+1);
	part_time = time - getPathTime(segment);
	segment_time = getPathTime(segment + 1) - getPathTime(segment);

	steplat = (to_vertex.lat() - from_vertex.lat())*part_time/segment_time;
	steplng = (to_vertex.lng() - from_vertex.lng())*part_time/segment_time;

	lat = from_vertex.lat() + steplat;
	lng = from_vertex.lng() + steplng;
	to = new GLatLng(lat, lng);
	this.poezd.setLatLng(to);
}

function getCurrentLineSegment(time) {
	from = Math.round(time/63);
	if (this.path_times[from] <= time) {
		for (i=from; i<this.path_times.length; i++) {
			if (time < this.path_times[i]) {
				return i-1;
			}
		}
	}
	else {
		for (i=from; i>0; i--) {
			if (time > this.path_times[i]) {
				return i;
			}
		}
	}
	return -1;
}

function startMarker() {
	this.poezd_status = 0;
}

function stopMarker() {
	this.poezd_status = 0;
	pauseVideoAudio();
}

function moveMarker() {
	this.poezd_status = 1;
	playVideoAudio();
}

//==================================================================================
function loadOverlays() {
	var xmlhttp = getXmlHttp()
	xmlhttp.open('GET', 'data/line_enc_data.txt', false);
	xmlhttp.send(null);
	if (xmlhttp.status == 200) {
		var polyline = GPolyline.fromEncoded({
			color: '#0000FF',
			weight: 4,
			opacity: 0.8,
			points: xmlhttp.responseText,
			levels: 'PCEBGBDBEBGEAEBHBCFBBBBJBCFCCAB@ECJCCHBC@@CICEAECICBAAC@@@BC?BCAJBADFDCECDBBCABCBAACC@EAFAABAECKCECAGBBFABHBBAEMBDICBACAAHCDBABCBBBBCBGDBCDCCDBCCCCFBBCAKBAEBC@DCHCAEABGAB?BIAC@?DCICBFCCFD@@CGAABBLDFC@CFADBIB@CAF@CIDECID@DCJCECCBEACBAGBEBBDHDCFCDAHC@DCHCDFCDCFCBHABECFDJBGDDIDCHCFDBADFCHCE@IDA@@?EBDMECHB????DBIBDACG@@FCICDFCLABDAF@@AGCDCJCB@?GCEBECHDHBDECAICC@ECJBEA@AB@BGC@CGDCIECBDFBBCFGDEMCGEDEDHDADFCIDCH?FCECKBEFGEBBDHD?FDCJCDGADECBIBCBGCECKBCF?ECIDCHCEBBECBHCACJCE?A@@B??ABCICAEDBOBDBBCB@ABBEDKCAEBCGCCGBDBICEBGDJADBF@DIBDFCFDIADDFCDGDBEFCBECJDDGDICEFBEJDECGDBEDHCDFDFBCFDDBDBICCGCDDFBECLBEABGBFDECGDBCDBBGBDDCHECABEBAFBCFCHDFCBFDHFECEFAAEBGBEFDACD?A@BJCGCEDCFDHDBCFCAFDCFIDECBDHDHCBGCDDCICGCCHDCFCDFCKCDFBCHBGDGBICCCGBBGFAHFDBECBJBCEGDACCHDBADBCDBGCEBDFAECCFCBDHCADCDCHDBCD@FACEBDBICFCBFEBHDCEBDHBDDBDBGFCBDGCBEI@@CFBDFCACECBFDCICACEBFBBEDBECCFBCGHBFCCFBDBHCECBBGBDNBGCBFDBHCADF?CGBDEBEDIDEDBDGDBEBDCGBGCECICEABDGCDCFCGCEACECBBFDDGCIDEBFCCHDF@A@@@CBHCECBEHECDAECHDCBECCEEBHBDBCGDCEGDCGBDCAEBEICCFBDCGDCFCCHA?B@@AC?GBBLBDCBEGCFIEEDHFBDCG@DGDBFCGAEBCEJF@BBB?AHC@GBGCBIB?AA?CI?@??BGBCFCEADHBFCHBECCFECIBBBDCCBFAFJDDGDBBDGBBFBFDBADFCCFDCLBDBGCAECBIAEDGBBEBFDCHGCECJCBHBDF?C@CK@BDBDGEFBEBDCEEHF?HDCFHCFCCFBACGCDBDCICECAACEBGBECBDGCECCEBGDBCFCI@GBECCECBHCBEECGDEBPCBFADCHCDEADCFBDBHBDBFCDBIBDBGDBCFCDBICEEBDHDBCFDDBFBDBECHCECKABDCF?BFDCIBDCCEBGCDCADHBEABBIECECEBFCECIDEBEDHBCFBBDBBEBHBBEBBDEBCEGDBDGBACBECBDFBBDJCECGBBFBCCBGDBACGCEAAEBGDBCFCCELDDCIBCEBEBFDBDFGBFICDBDBBEFBACDIDABEFCBFBADBEBDCABFCKDBCCBBFICECE@DBBDIBGBEBCABHCFDBGBEBBFBJCHCBBFBBFDCIDBEDDHCDBCEGDHFBCFEFCDCABCMCBEBBDFBCFBEBHDEECFDIEFDGHDCDJBADCGBDCICEBCFBDFAEDHGBDEHCFBBJCG@BGDDAKBDFCFHCEBBEGCBGBDDBGHDCFAEDICBFEEEGA@AGDBDFDLAAGDCGDBCICEHBECJDBHCBCCACAEBID@BABBGDABKECGCECBIBHBD?DNDDBBHBDBBGDDBGBBFBBECH@GCAABGBECADFBCJDECHCEDCFCCBIECBHCECEFDBIDCCCFDBDBIBDEBCFCD?@DBJDB@DFBDFADHBFCDCDFCICECBECBGADBFCECHDCEFCCDA@CJECGCECFCDBFC@DGDCFDJBCBCEBCEHBDEBAHCCEBDBFACDDBICECGBBECECHCDEBCIDBCABFDBECGAEBCEACBCLAADHDFCFDGBBEBGDBBDBFCDBBFADFDKCBCDHBCAEBDGBDCDEBDBFCECIFCECCFBDECBKDEGDBFBBEHDBBDFHCBBCIDBBDDAFDBEBGCECCEBCGEDKECCEADHCAEBCECGDBDEACIECCECCECFCDICDCADFBCECBEECCHCECAEDECJDFCBEBFDICD?ADDBCDBEFCDIDGCCDCDEGBDJDEBGEBBEHEBBEHDCJFCCFADFCBDDHDFBCDGDENDFCEGCFCDBECAHCEABEBADADCHCEBCCFCBGADBECIABFCFBDCHECDCFDICAECDCDHDFCFDCFDCDFBCHEBECHEEDAEBGBDBCFCCJCBFAACFCBBFBCHCBEBEBGBDCGBEFBDJDGDBADCBEBGCCJGCECDFEBJDEBBDAHCFDEFDIEBFCBBCEBDCIECBDGCCBCCGB@EBECMCADHCEFDBIACAEECCBHBCFCEBCHCBECFDBJCDGCGCDCECBHDCGDCJBFBDFGACECGBCEBCBFBEDKBECAGCHEBCFDBBEJCFDBEAFDDFHDBFCDKDEBGCBEBECIBBFCEEGCEDFBDIFDADFBECGBCDCDIDEBDGCDBFADGDBEBGCDKCGEBDHDCCICFFCCDKECFABHCECEDFBAFDJCGAABEGGDBEGBFCDFDLDECEBFCBBEAIDFBFCEHCEAICACEBCBGCFCDFCBFDCFCJDFDHDDEGECECHCAEDCCJDCGDBBECGADDGCEDCJCBAAFBDCDCDECGDBHECCFBHCEBNDFDCHECGDCEHEAICCDBDBGDCDBFDIDFBEGCCEHFDDEHFDJEDHDBAEGCADDHBFCCFDECJCBFBCBDFCBEBAHCFDADFDBHCDECDECGDBBFCBBCEABEIDEDFCHCECDEDKCDFAAEFBHDDGCFDDFAAEJDFBFCHDAEBBEDBEICDBEGCEBFCKECCFDBFEIEFBFEHCEDIEDCEGBDDBCJFDDFAFCEDCEHCBCGEECDFDFBEBDKDGCDCEECCFCDGDJEBCEBCFCBCGEBBFDIDEFCECCDCEGDBBFCBDAGDBCGDDFHDECECBFDMDBEBGDBECCEDHCCFDDBFDACDJCEBFAADGFBDDBCGCEFCJCECECCECDEAHCFCBDBGCCACEBEIECGCFCBDGCEIDCECDFBCDBJECCFBHBDCFDDFHADDJEFCECBDCGDEICECGGEDJAFDBCFCDCDHECAFCEBFDCHDBBDAEBBEDICCECFDCDGDECHCFDEHBDFCDFDHFDDGDBACECEADDIDCFCBBECHDCDFBFCFCEAHCCEAECECCGJDCDGDCFCCHEDFCHCB?BJBAEBBEHDCDFDCCGECCECHCFBDFECJBDBBECHCEBCCCGDIDFCEHEFCEADFDIDCDCGCEEDGDBDGECDELDADFDCFBCHCECAECGHCEDBDJEDCEGCEBFDIBCEFBDFBBEGDJDBDADADHCBFDBBDFCGCECGCFCBJCBEBBECAGBFCBCECGBEAADFCDFBECEFBDKDGDBDCCBCHDEDFAECFDBHDECECIBDBDEADGEGCFCDBFBDBKABBHBEBBDFCICDDBBDDEBADAACECEDADBJCAFCEEDAFBBFCAIDCGCBBFBEABFCHDBFCICDFCADBCCCGCICDFCCEBHDCFCDADCGADBBFCACFCDODBFCEDCGCBBDFDBDGCDJDBAGDFCDIEEGDCG@BEDAAICBECFBECCFCDBDHCEAAFBCGEBHCFCDBGCDAKBDECBHCBEEBIABDBGBCCFEBACGCFDCBJBDBFBECEBCIFBDDBGDEBBA@BCB?AHBE?HBDDCFCBC@BFCBCEKCEF@CAAFEBJDIDFCDBDBGBC?FCBFBCJCBAFEBBECFIDCGCDFDI@A??ABG@DFAHDCDFADE?DBEJDCFFIBECBECBGDCBDBGBDBCECIDCHA@JHBFADGAABLBEBBBAAADCHCFAEAACAHBDBEBAHADEBBBGCDHCDCIDCEDBECHBEDBFDBIBBBGDBDBBG@?ICECBEDCHAACBABBAGBDAEDKDBE@GC@BFAB@?CIA@GBA@AHC@CAODD@GCG@JCEBHBAHDCKCG@C@FBGAJD?GDAAAG@ECJDICECNAA@EB@C@FBECIAAEBCEBCFABEBFCBGBBAEAAAJCEHB@AFCCGAABG?DDBAKBBCADBDDBIBBF?B@BABJCEBDFCCDFCGCGABBM?BDDFA@CA?JDFCBAFDCI@FBBEBGAAAACCIBECGBCJBDEB?FDBJCDFCDIDFDCFDHDEADGECDGCDIBCFA?@?DB??JCDDH@@G@CGFHDBKD@@@B@AHGHBJB?BBBAH?BGBFHBGCDBFGEIGBCIBBC?G@?FBCCBC@GCBICBFBGBCCACCPCAECGDGBEBCIADBGCGBFACAJFCBGEEBDBBECC@GFJADFB@D@BHB@A??ADG?DACEBEHDCGBCFBDBCECICGGCCNCCHCBHBFECHBFECGAAFAIDHECBDGAF?DDFBCJBCEBFDCCFDBCEICDEBFB?@F@BAA?DDBGBBGAJCHFBHFBFLCFCBDGCIEEEBICADCHACGEH@F@??@AGECCFKCFABBE@@DJBDFBFCDICF@CCI@CGCEDHCCCCCAJ@BACFDBBGCE@BABBCFDADBNCDADF@BBFCBAEBDBECJCFDCJCDFCCFBHCBCBDCDCBBBFBAECJBDEFCGBCJCBFGECKGEGBEBBFDBDHFCCFDDFDIFBCICFDIGBDDBGAAKCBADCJCDBDGDAFCECCDFBCFBBBBHAABBEAECHEACGCCBDCDHCBCBFCBCFDBKBDBCBFECFBDCHBECCFCCFGBIDCFGCFDDGCCHDCDCDCECBEBBDGCDBFCCDLCABCFCABEBDBFBCBFBDAIADDBHBDDHDBEEBFA@DABJBG@CIBECAFDABDBGCCICDFBECDCGCCAFAFBBEABJ@@?BFDBHCDBDGDBBDGBECDGCEBIBDBDHCEBCADBGDBDCHCDEBHECBDFJCEBFGCFDBCGDFDJDBBECHECBGCBBDHCCECGECCFDLBDAFEECCHDDGCDFBDCGIBEBEBGBDJBEHDGCEBICDFBCEBDDICFBDCICFCDBDBGDBBDKBECGCBECHBD@FCBECGGCEABDGECFDLCEACAEBHCEDABECHCCECCFCICFCCGDCFCICEGCABFDCIBDBFCDBFBDCJCBFCBCGCEABEFCHCDCGBDDBHADFKDC@?CCHADIBHDFBDEHCFBDFCDGCCIDEFBOCBEBGCECAECGCDBDCICBFCCEEBCFDDCFDBIDBGDBCFCACCCFADBDBIDBACEACBCEEHBF?FFCBEF?GCDFBBICFDEADIDCFDBDFADKE@CGBGCDBHHBFBJDCGGEDJAAFBDDBDBE?BGCBAACEBDBEF?AJCECCEBECCF@BIBFHBJDFDLDEHEBFDHBDJCBGCDHDGCECDGDBDGCDKEGFDFCBHDCFCAKBDEDCHCEDFDBGDBCFBDCGE@?A?@BJBFDDHBFCCEDICGECCGDEDBCEFDBEDJDFACFAECEDDHCBECEDGDCECEBDBDIDAEBEGDDMECDGFB@GBECBBGB@ACB?EABFDBDGDCDFCJCHDB@FCCFCACBHBFDBEFDICDGCBEFCDFEBDBDABHDBFECBHA?A@BAECDBDKCBDFBEDBCFJFCGEBECGBEAICEEDECCFKDEBCEACEDHDEDFCHADBFBEDBFCBFBGDDGEBDEKDEBBDCDHCEECBHCFJCECGECF@BCAADBGBCECFDDEBIDCGEBADFDIDFBDDFHADBEBDFCCNBB@HCFDBCGBEBBJEGCFDGCEBDBF@CECECBHBDEBBKCFDEDGBBEBHCGCCGBIDBGDBFCEBDGEBFEHCEBFCDKCCDGECEDCFCDGBBFADIFDCFDCFEBFDICCFECCEHDDEGDEDGCBDICEC@E?@DCADDHBFABGDDICACGBDBECEDGEJDGEADDFCCCHEBCECJDBDEBBGEDCFBHEBBECGDBBFDCEDICEDDGECDFCIBDGBDFBCGBECLCECFECDFCHEADHDDGBCGDBDGCFCCFDJDFCDECGBEHECEGCIDEBBECGECDFCGDCEJDEHBFDDGCDFHCCBGEAEGDBJDEBGCBEECHBFDDFBBCABGCEAAECADJCEFBDACFCDCCFBBGDAECDDBFDDFKBGCEDDGCCEHEFCBFEICBIBECCBGCDBHBEBDCIDFDHDEBFEDIDCFCKBDBBECEBCHBDACFCFDCCECADCBGDBBDIDEGECEGEDIEFDHDABDFADHCCEBCEECBECCFDHDECBCBKDEBEDGDEAAGDCFDJBEFEIBACFCDCFDCIADBFDCKCCBAACHAFAHBDELDEHEBDFEIDBFCBHCDBDDICDFBDGCAEADJBDBBECCFAADGCDDCGADCFDGBDADBGCEECLDBBEACHBEBBFCBCEBCEBCGECBEBDIDFECEFBDHBGBBDICECGECGDEDKDBDGAEBCEBCBGDCDFECICBFBFBCGCCEBGCDEECECJDBFCBEBGB?CGCCDDBCFEBDBBECNBDEBCFDCDHDGDCEGDHDAACFCHCFBHDDBDBEDICBFABGEBBFBDICGEBDGECHBDBCDHDFEBDFDHEFBEGDKCCDFCECHCBEBBECHFCDDACFDBIEACGCCECBGCBICEAAEACIECGDDCFCHBBDDBFCI@ABLC?EDAICGCDCGDEDCEFDDICBDCGDDGDBCGDDHADCKACFCCEAFBABDAFCECFCCIDCCDDCDFDDFDBFECDFIEBEFCHEBECDJBFEAEFDCEBDGEBDFCICFAI@?@@ECBHCFECDFDDFDCBEHCECDFCCEHCEDDHDDHDFDCGCDBIDDBDECGECAEAGDBCFCBGCECCDFBDAHBBEAECBEBIBGEACEHCDCBEBDBCKACAEDBCBCBGCEDBFDGCEAEDJEAEDBEBAEBFADHADFCJDFEDBHBDDFDHBECECFCCFDADFEDJEHCECHEDLCBEECHBEG@D@ACKCDFEBBHBAJDEFBCCFBEAGEKFDDFFBCFCCFBECFDPFDEDDFDBDFBCEBIDCFDDBHCEDCH?BDAJBCFBECCFDCHFCEAEGCCFEADICFCDCFACFBAEDAGBCIBAA@?@A@CICBFFCBDGDBIDCCECBDFACDHCCFBDBHBDADEADFCGBCEIEEBBEKCCACGBDBABEGCACBCFBBHBBEBDCGCDBBEBFDIBFBCEBGDCGCBGB?EBBECLDBADCEBGCECDFBEDIDEDBECCGDDFCFDJDECGBDHEBDCBEBACGBDDBFCCBEDFCBKDGDDFHDBFAEHCFDDGEBIBBDACFCECHCDDGCDAFBCJEBEHDDBGCEBFDBDHDEBECCEECHCICBEBGCCGCCHDBGCICFC?GBDCHCCGCCGCEBBDAGCHEBDCCFADBCADCGGFCCDNCCECEDICEFC@ECEIEBCGAEFDCBIEBCFBEECCGDCECCEGADEDBEHDCGDEDGEAFDKCBDAGCCDEBFCBFBDECGBDDGEBBECECDHDFDDFDJCEECCHDCFBEFBFEIDFBBEGECCGDDBIEGDDGEDJEBBCFCBBDGDBAECHCBCECECEABDCHCEDDFCCEGCDCBDFDAHDBADBBCBIECDEDFFCBMECFBCHGCFDDHCEEBBJEBEBDBEHFBDBDBFCBICBHEBEDHAFCBEFADDLDEDCHBDAEBCFECBIBDAEABDFCACGBBEBJEHFDHDBDAGDDAFDDFIDBDBECEEAFCFEDHDBBDGEEGDFEHECDEJDFCEDGDEAECBBGDCEIEDGDEBFEIDFDBCEDKEFGEDFBEECDGCEDGBEBBGDCIEDBCFCCECBHCECJBAGDCEBDACCHDEBEDIEDDBECCHDCEACBKDGECEDGCDCBFCHDBBFCCEFDBCFDJCDCGCDDHECDCBHBCDBECDAFCDIC?C@BGCEEBHFECEGBNDCGGDCFBFEBIDBCFCHFDBCEGBECIBEBBDFAEACGECCFDHEBEGEDBDGBBCBGCCDHADGEBCFEDJBFEFBHFBDCCFCEDCEECDIBBDFDDFBGLCCGBAFAECIBD@EABHDBBFCEDGBEDEHBDDJDBF?BFBCCBFDACFBBDCEJDCEBHEBBFDIDFDBDGDCDBACHDFCFDHBGDEBGCCEEADBDFBCLDDIDIEDGCBECBHBEADBJCBFEBFCCCCFAGEDDEHEDDEGDIDCEGBDGCDADBDDCHDFBBDHEBADCJDFBDCGCECEBBDJDCGCCGCDCEBFDBBDFDLECCEADIBECDFDFDCBDIADCCFGCEGBFBDICBFADFDIEBEDGDFBDFBLBBDDBGBFBECGEBDCHBGCDHADDFCFCBICGCDCFCECFGDCFCBAGEDGCECEBIDCAFCDFDCBGDBDDBEBCICFCCFCDBAGCAACCDABGDDBDFABCIDBDBEBFBADBACCHDBACCFADBCAEADADCBOCCCCADGCEDGACEBDHDAFBDIDDBDGC?BIB@FCECIECCFG@BBCIACECFECBECBIBDCFCIECCFAHBBDFBBEACEGBECDHCEBCDGCECCICDFACCFCDBBGDEFDACDIDCBDCCHDCGECDGBHBDEBCGECEKCFCADFCABCBIFDBDFBECGDDDBAECCIECBECGBCEECGCEBDGDAECCHBBFBDECCDBGCBEBCJDCBEBE@?@?A@FDEBFACJCCECBBCEADFBBDBBDBDCCHCEBDGCECCKDCGDDGDDEDHCECGDCABGCECBDGACBDDEDFBEJDCFDCBDDBFCHDFDCFCHCCDDGCDBDCGCCFDJCDCGBFBCFCGBEBFCCLEFDCHFECCEGCBEFBHDBFCDFCEBCECKBEF?CEFCCGCABDCICECFCIFEDDFBECCFGECEGBEBBDBKCGDBDCHDEBFDHCBGBGCGDFDFCEDCFCHCFDDEHBDCKCFDBFBCICAFCICDDACGCBGA?AC@AFDDJDFCECJCAAGCJC?EBAAEIGAEBFBDCDAI@BECBCFDABFDIDEDDBDCC?AHCBF@BHCEAAEDCOCEDDBCAGCDCAGCFDJDECGCACGBDFECFBAJDFDFDCHGBDCECHDEEBLCCECHCEJDFCCFDCHCEJCEHCDBFDJDFDDCFBEGCGCDFDAJCFCDHDAEGDBHDFCDEHDBFCAKDECDEBCCGEBEGDCFCDFBEDADIECBDBHDCDCFDDGECGDADHDFBDBFCIEFCEHBFBBEBHEDFHDCGCEKDECDFAEEHDEBGECFECFHECDFAECDGBJDBECGDEDHDFBBECHBBEBECCHCEBBFDBCDFDDHCEABDFCABDJDEABEBDAFDBFDDGDECEGCIDEDCGCEABECGCDBHBDBEADFCEDHBEBBEGDAFEIDFBDBFDCEFEJDDCDBBFCCFAFDEKECEAECEDCEHCCDCFCBEGDEKDBDCFDHBCCFADADHKCDBFBCCDAFDDBCBECFDADBFCEBCBBDHCEDBCDIDHDDBFDDBHDDIEDECCBFDLBEGCECBECEGCC@DFCGDDACBIC@CCGBEBECFDFCCECEDDGCFBADAPDCCFDBDGBCCEACCHCBDDBBECFCBCGCBCFCDCFCCBDBICBDEACDBCGBBFBACCDADBDAIADABBFBDCGBEBBGDCFBCKBACABF@GBCCE?@FEBGDDBBFAEAACADEDEBCCEFBDCBCADDGDECECIDBFCACFAGADBICACBFCCAECFDBIBDFBCFAB@AH?EBMGHEBCECACHBCABDGDBCBBCICEBCAEGDBBFDJBCFDBBBEADBDFCBACEBEFA?ACBHFDDAGEBDEGECEICBDCECECACBFBDDFECAECHDDABGDBECCECDGCCEBBCGCCFDCEEBDADACBICFCADECFCCEDHCBFBECAGCACFBCFBCACIEBDECBFDCCGACAABBFECGCCDFCDBCDFDBEFBEBECICDGDAECICD@BFHBEDCDGCCEBDLBECBEDAGCBEBFBFEBCGDBCFHEDBGDCFCDBBFCAECFAJEBDCGBGFCLDDEGCCEGDGFDBDGCEEBCGADBEDDIBFGDCG@??ACIEFDCCEJBF?@?ABG?@?IBBFBG?JCF@BF@CGAHCBEDBFCGEBOA@CFCBIDDADGCDCCKAACFDBECGBDDAECCGFCCHDCEIECGCDIECDDDECACBGCDCGEACCHDCGDBBEGBDCEEGCFCCDKCEDCGCBFBCBCHBFDBADFEDG@CDBDBMCA?EACGDBDFD?DAEB?CGECCEGDECFDJEFDFDIAAGAEBEDABDGCDEBDEBDFBDDCHAEDF@F?GAFCACFDMDFFCCEHDCKDEDEDFCDFCDCFDIABCBBCBEHBCBAEJDGBBDHCEKDCCAABDCIDEBCFDBEICBAGDBGFBGDB@BGBACABMB@GECCFACGB?FBECIBCFEEHGDBDFGBECFCEECECHFCEDJDBDBEDBFDCEACH?BGCDLDFADFCAEDIBBGABEDGCBFCBEDJDBBEGDFDBHCBBDGCECECDBBADBGCAEEAADCDCGDEBBFBEBLCBEABEFBBBDHDAECADFACIADFAEEBCBEAHCFCBAEJBE@FBDDBGDABCEFBDEBCPDBFEHDEDHEBDBCHBBCAECDFABECFCHECAFCBGCBFCBFDCEAAGCEEGDAFCDDJAECEFBEGFIBDACFCCGIFCDCEEHCDBFBDBICCDGEEBHGFIDCFEDDHEDBGCDFC@FCEBDDDKC?EGCF?DFEFGDEFCICEACGCDCCDBBFBC@CGCCCFDFDKDFACGAAABDCAAACBAAICD?ABB??@?B@BBGBECCEICFDDFCBDHDDBCDDHEDBECHBEBHDCF@BFCBFCGABECBACFCLBCEBCCCIEBBDBBEBGDCIDBAABEBFCCGCFCDBABIEGBFDEHBEBBECHBDCBFDEDHBCFDBFBCBDAACHBCBABACCBICCCEBADBEAACFDCBDBGCCFDBFBBEDGDCB?ECBEBCCECLBDFADBDCGCDFCECECCHBCBFBFCCBHCDBFDADFACCGEFDIBEBEHCAECDBGBCJCFCECLCGCFBHDDAACFBCIAFADDBCFEDCGDBG@BABCB@AAFHCDLBEFEBEH@BFBCCBCDFBBCBDFDCDCGIDAFDBCFCBEFCCBHBDCADGEBCEGHCACAFBDCFBFBEACGCEDFDBJDHFIBBGEDI@BFBBABGGCGCECGEBDJEAADBGBDACGCCLCGDDBG@DBBFBDBEJDFDADFDGCCGEDCFCDDFDBECIBCFDCBHADFADBDAFCDBIBCEBDDFDBEBEFCDHDDBECCBGBEACAADKCEGDBDBCDCCDICDADADCBGBCCDAFCDCGBCBCAEBEADBDBEJCEECCGABEBEGCICCACGEBBEBHEDABFDMCEAFCDFDBEJEFCFCDDGDGDEJCDFDBFDHDFDDGEICE@FBDBJB@EBBEEIBG@?GDFBCACECGCDBGDBDJEFDEDBHBDECKBDCADBFDHDEDCGBIBDEADIDFBCCGCDFCAIB@@EEBHDADBGBDBFCNDCFBCEHAACE?CBDGABDECBFBCHCECCCAFEDGBECCBFBCIBCCDBFCCBCCFEBGDBDGDBKHCBCAECEIBDFCCEGADBDFCEBECICDCFBDBDEBHEBBECGBBDBJEBDBGBDBBDDAGBBGBBBCECGDAE@GAAFBCJBDCEBFCABCFBCICECHCDBBDFDGDEKDCADECECHCECGDBCGCDCECBFBDCBICFACCEAFCEBDHDFACCDKDBGCEDHCBBECAFCJDBFDCEGCDFCBDGADDCGECDBGCEDKCFDECHADCEBEDBHBDCBDFCCDGCBDFECDBCIBCCHADEAACEACGBCEBAANBBFADGDBBEBDBGCEBBCFCBDEBEBFCBBHBDCECHEECBDCC@DDJCEFCBCACFAABADBEBADADBIDCFCDECHDCDBDBCBAGBDDIBEFC@DCDDGCECBKABFBHAFCBCGDAHDDBCEEAFCBECJBDFCBDCCGADBDBFBCBABCGBCDJDAAEDBBDCHBGDBEBCGBCHCFCBDBHBDFBCJCECBGDCGBDBDDALCAEHEFEICBECFBBGDHCBFBBFDCICEGCDBEGACABICAACGAEDCGCBDAEBCCKBDFBDCFBCCFBBCCBBICBDECCFBBDFBACECAFEF?EACDIBDBFCDBGBBCBFDBCDGDCDBECKBBDBBCGCBDBBCGCBECGDCDFCBHCDEGDAJCBEADFBCAECHCECEB?GECCEBADGBAECBCEBDABCHCBCFCEBFCCJDEAE@@AAFDECBCEBGCDBBFBHCBDBDGBBECFCCEBBHDECFCDGDDACGECCDGCABDODFECDICEBEBDEBDHEFCKDDB?EACCFCCFCDDFACB?EBLBADDDBFCBDBBD?EBCHDABFBDECDBCGDADJBBFCCEBBDCADFBBCDBICEDGDCBEDGCBEJBECDBFACCABCGBDLFBDDACBHADBBCFCEDABFBIBBEEFCBDBAECBECBCCDCA?BGCBCEGDAEICDACACFDABFBDCFCDCBBCDAHDCDFBBEHBACECDCCDEAACCICBDDADFDDBCGDJDGBCCADBEDGDBCBDCCFCABDDBBFBDNBECGCBCE?FBDECGBFBADBFEJCBFBBCACFCBBFDDCDHBBDFDJDBDCECHDFCBFDCIBDAFBCFCBBECBIDFBCBEDJDEADFCCEBBHECDFCCEJEBCECHBDBFBBDGCCDDHDEDGBAIACDGBDBDGCFBDCGDCFAECICFDBBDFDIDFDADGCDECCFCKDCECDDCDGDBGCCBDAFDBDIDFDBDFDHFABECADIDFBDBDFCDCCDKECECDFDBCGCABEBFBECCGBBFBEBDBBEBBHBECBDABDGCCFBEMDFCCF@AHAECBEADBCECAECHBECECHDDDGCCJCFCCGD@DBGBECCBFBCBICEBDABGBDCDBBFCCDBFCGDDCFCDIACDGDBACEBDIADCGBBCEDBDJDFCBEDDFDFIBBDBGECBEGCCFDCEBBECCHCDCDBDECDLCBGCEDCGCBEHDBGDABEDICEBFBDAADCFDEICCDDAAGCCJFDCHBEECFCBHBDECBECDBECBBGDBDHECECHDBGDBBFDBICEBDEBDFDBDCHEDDFCDCHBCFCCFDIDBEFBCFBNDCFCDDCGCECDCGDCHBDABDHDCBCDGBDBHCDBCFACCACBFAEBBCBAGADBDGCEDBFBBJE@CCGDAADCECDBEBBCGCCADBBDCEFDBBECHACBECCCFBDDBBIACEADCDAGCCDCFDICDCEACEBDFDBCHBCEBFDBBDJCDEBECBFAADBAEACHDFCCCFAEDKCFHCECBDBGCDBBDGCFCBFCDHCECCFBBDCJADABFBEIEACCFCCHDEBDJDEECBCFBDADFACCCIBCDACGCDEDCBDAFBEACHEBCDICABCFECCFDFCDCCEBBDEDDJDCGCDBEADCGFDJCCECGCCFD@CBFCAEDGEECECBHEDBECHBDFBCFDACDBIEHEFDFCHDFDMBDGBDCDGDEADHBEBCFCDCCJBECFFCDIBCEGCDBAGEDIEABEBCEBICADGCACEIDCEGEAECGFEABGECEHBCEDIDFCGCCFBGBDDJBDEGCECECDEEDIFCDBGEBDGECLCBCFCACGCDBDBBGDADCGDBBDIDCAGBDEDGBBCFDGDCEDICECFDCEBDHBABCBFBDCFBDAIBCBBEADACCBAHCBEBDGCCHCFCAECHBECEJDGDCDDFCECHECFBEBEBBDGDGCACECECCEBBHDFCDBBFBBBFCJDEAABCBCHCACFCCCHCEDCCHCCECFBEGDBDGDBCEBHCECAFACKDECDGCDGDBCFDFECFCDGDDFDDHCCFCECBEDCHFEFDHFDDGDECJDCFBGDDFCEBEDKDEGDGBEBCCHEDCECJFDBFCCECHDDDFDDFDBCEAODBFCFBBFCBCCGCDGCEBBDFCDIEFCAGDBFEHDEAJDFBBEDIDEDCFDHDDFDADGBEACGEBJ?DBBEBAHCEAEBAFBECACGDCDEHDEDCFDHBEBDACBECHCCGDAECDCKCAECAAFCCDBAEDIBEBBDBFDBHCEDCIBEBECHEDABDBFDBEACHBDBBFCHDEBCCAGDBFDCHBDBECBDEGDAADIEBFABDCFDLCCDBHAFBDADBGCAECADBHCBEDACGADBCEBDBF@?IEAADADHDEAEBCGDCHCEBBECBBDAMBDEDBHDCFDBEDCEHDBEADBEHCEBCFCJDACDBGDEHDCCFAHAACCAEBBEDDCHCDDHCGCDECHCEEADCHBDBBFADCFBCKACFDAEDHDBBDEBICECEBCHDACDBBBFAADBHDBBDCGCEJBDCGDABDACABECHCEBADFDDCBDEBJDBFDHDFAACBDHDBAFDJCEBBEHCCDBBCCAAEDHEDFCEHBCFEBDFCJECGDEEGBBEBGCECICEBBGCA@ACCBBFBDBCECHCDCICEDCECDGDBDCAAECBEGDBFDBCDFBECEDKCBAECDHBFCDDFCAAFFDBDFECHACFDBECDHBDBCCEBCBCBGCBDIEBAADCEEDJEBECGDBE@AGCDBADDDIBCGCAAECGBDCDCICEGEBDFIECDFCBEFEFDDBFDEJACFDDEFBAF?G?EGFG@FEDCECBFCBBDHBEDBGDAEAAIDDDBDEGBAECEIDFCEGDBHDAFCCBHDFEBDJEGDBDHEECDIDFCCFCAHDFBDGDEBMBAA@?CHCEEEHDDGEDBDFDBDFCJDEGDFBHEDCGEBEFBDBDCHDAFDBFCJDGEACECHBDBFDGECDHDCCDGJDBFCECBDFBCGEC?DABBFBDBHCEAFDJ@FCBCFCBDCHCFAEEEICBFBADAGCBDFCCCFBIEDDGDADFBDBDBBEBAGEBBECCEIECAEGEDDEHDEADGDCFDBCEDHDFCCFBCHBABCFDCLBECFBCECFEEBDIECFCBFEIDFDDCFBBCIDGDGCECDFDIEFDEADHDFCECCEAFDHDEAADFCHCBECDCICECGDEBFDHDBEHDGDCFEKDEHDFEHDDGBEDIDAFDAFEIEDGDBDGDEIDFBGCEBCBDEICECBFDDFBDKCFCHDFDCDFDCIDEBEDHEDDEIDFCDGDEBHECBEJEBBEDHEBEDHDECICEBECCFDADCCEBJCEDCCECHCECEDHCFBCEBGCEADECHCDIDBADCFECHCEEDGDCFBDCICEGCCEEDBEIDEDCHDFABFCEKCDFECEGDIEECCEAGCEBECGBBDCFEABEDAGCEJBDGDEDFCHBEBDBGCBEBDJDFCBHBDCFBCEBGCFDCJDBFDCCFBEBDAACBCGDICDEGCECFCDJCEBBEBGCFDAFDICFDDFFCDHDFCDGEHDBCFBGCBDEDDGBDBECIAEADFCDBADBGBDCDGBBBHBDEHD@EEHBCE@DEKBDECCGCDCFBC?GDBBDCGCEBBDFDCDBEAADCICBECBCFDBECGCCDBEBBEBCGDDFDCIDEGCFBDAHDFCBBEFCHCEBDGABHCDGEFDHCFCADFCCDICEB@DHCFCCFCDHCEACDGCFBFDBDECPBDDHCEJBFBFBBEHDFDCEICEFCBEDCIEFADGDEBEHECGEFKEDGECCEHCBDDABDAHCBEGCEAECHDFBDCFDJEGBECGBEDJCECFCAAECGCDBICEA?BFBBEACABBEICEDGBCECBCAAEAADADBHBEBDFAADCBDHCBDDFAEBCHCBDCECCEKDFCDFCBHCECDFGCECJCEBFCDAFCGBBEBDIDFCGDEBCDBDGDEBJECBDBFCEFBCECGEBBFDDIDFDDGEADCCICFDCEGCACEBGFDLCEECHDFDBFDHECIDCCBBAAECHBCBBFBBGBDCKCFBDHECDECHCECFBDJEFGDBDHEFBEGCCEJDFBFDLDBBECGDBDGCACAEBCDHCECACECHCECABDBFDCFCDBDGBDBDCGDFCHAGDECJCDECBDGBBEBBECBEIDECECGCECGDBECHECCFCBFDAEHEDCEGBEBEKBCEBCEDICBDCEFCCEDECGEBDECGCHCDFDDCGCECIDFCDDFDIADFCECCFDBJDEGEFBEGDBDDIDECADFBDFDLEDGCBFCHDACEACIBDGDDFBDFDBCFDICBECGDAFEFDCGDEBBHECCEGCEGECCECBDAFBDBFDECGECEIDFCCFFCDIDCFCEACBFCBDBHBDBDGCBECHDBFDBDGCABECEIEBECBEHECCEGDKCDFBBDGCBFCCDCHCECDDCJDFCACEGDDGCBFDJCBGGCDDCFCDCFCCHCBECBFDBKBDAFD@BACG@ADBEBIDCGBDHABECCFKDCGCAEGECDBGDBFBBECGCDBBDGCHCECEHDDCCBECGDBFBFDCBGCECCEGDEADHDBDECODFCBEHDAFDGECDFDGBFDIBEDIDFBDHDBCEEDJCDFCCFDIDEEHDCGFDKDGECGDDHCDECGDCDFEBEBJBCCEBGDDGGCBFBECJDEGDADGDDCCIDEDCHECEDGDCEADHDECGBEEDGAEBACEBHCEA@CECKCDFBCDHEAEAADDHCDEBDBKCHDFBDFDHFEBEIBA@@EJDEBFBMBBGHDBCF@?GEBKCFDGCIA@IBCFBKBDCEDGFEAJDEFCFCBCIDEACECCDBDBGDCBIDEFBHBECJBE?BGBEB@BFBEBBDBCBBHADECDCBDBDIDFAFDHDCGDBCGCDACGBDBCFDDE@BGCADHDBM??EBDFCFIDFCFDI@ECBFCCFDCBCFDBI@EGDLDBF@GDIDFBFCCFADHDFCBFIG@ABIDCFDBCFCJBDEEABGCBDCGAGEACEBKBDECHCDFDIEFCKDBFCI?AAAHCIDFCBDFDHDBADFBMADCCCBBDADDCDAG?@@@HEBBEGEEDKEFBIDAJCEBHBD@?BGBDDCGJC??GBDIDCHCDECHCEDBACECHDDCGDBBFCHBEBDBFBDHECBDIECEJCHCFCBECIDCGEBDGFEBCGECDEJECHECGBBFHECJDDBCBCHA?GCAEBDCGCECDBGBJBEDFADDFBCFDACGBECEACDCCIDCCFDGAEDJCFDCBFHCEBCFDDADHEFBCEDIDFBGCIBD?ACHDDECELDBCAECCGDBAEGCEBHDCGBICFCFDFBBDGBBDGDBBFEDLDBBDGBEAAECGECHGDCBDBHBEBBECBG?@HDCCBFBDCFBDBIECDJBBGBECPBEBHCEDGCECBDIDFDGDDCCDIBCGCDCFCH?CGDCEICECCECHDCDBFCDEBICDFAADFCDFDDGBCACBECACEAACLDBDBEBFDABGDEBGCDBCEADJBEC@HBDBGEBEDFDJEDBDECBHCCEBBBCCIDFDBDBBFDEIDFCABEBBGDACCCBIBEFCAEBBDJCFCCCGCCIDCGDDFCHBEDGECADGCECIDECBEACGBABFBCECIEDFBEBCEGEBCEJDBECEDGCFDAAEAADMDEBBBBECCGEBCBBEBJCBFDCHCBCCACBEBBEAAECCGCECJBCFCCH@CEBBAEBCDCGEJDBBABDADGCDFBEAFDADHECCFCBCBEBDFDBDBGCCBICDFCDFCBDBCHDBDDCCDJCDCGCEBCECHDBBDFBDCEBCFCCGCDKCFDCFDBBDFDAAEABFBDDBCBEABGDBBFAACACECJCECECEBEDACEGCDAEICDCFACACBFDBCFDJCECGCDCGCEDBDGFCCGCDBCFBFCCHCBFBDBCEBGCDBJDGCDFDCBDFEBACEBHBFDCEBGBFHDECDCAECICEBACE?GCFDECIDEAAFBHFBDCJCCCGBBFBBACBGBCBECIDBDFCBDFCFBDDBHCDAFBECGEAADBGCFDCMCFADCFFADEDIBEDBHEDICEABECGDFDECBFCBECBGFBEBDCEBDBIBDBFDCFCDGCEBFEFCICGCCGBAEJECI@DBIB?@A@FKCEBGBC?A?ECBICECJBDCHDECGB?BGCBCHCDDMDCEFCCFDGCBFAABFCDCDGCDBAACBGBCDI@DGBBFBDCIDBCFAACAFAGCCFCIDFEBIDEDHDDGBBIDFCCFHBDHCCKDHDBDAEECIBGCJACBABHCDHCEBIBBFADDACADKCBEACAECBIDBFDDFDAFDCEHDFDACDGCDGEACFBDBHCFBDBECBHBDEBBPBEEEBFEBFDJDBFBHCDBDHCEEDJDFCBFBDBBDCBFDKBBEBEHDCBEBCDECHCFDKDEDHCDFIEBHCBKCDGBICGCEDIECBEABHCCDMEDFAGCDAKCFDBDGBHDCHDCGCFHDBEFDDGFCDGDDHECDEJDFCFBDICGEFDIDFBEDHDCEBCGEDFCHDDIECCDDFDELEBGD@GC@AIFBEG@HDEFDHDECHBKECGBHCEAEDADGDBBDGECIDACBEBAGDBCEDIECBCFDFDDFDKBCEADEDFCDCFBEBDFBDIDFDEDHDFDCFDHDAECIDFDEDHBEBFBBDGECMECBDFBCEFCCFBHDFCCFCEDIEDFCDGEBDIDBDGEBDECGCBGBEDJDCGDEDGEBDEHDBDHECFDHCEBDEJDECEGEBAEGDDHCDCCHDEDGEBDFEBBDIDBBEBDGDBGDEDGDEADGEDBKCBBFDDFCCEBDFCCGCDDFGDEBFDGDAADHEBBFCCEBDADLAFACCAFA?ABHCECCGDEJCECCECHEBGBECFDHCCFACAECCGDDFCJCFBDHEAEBCGDCMDFDBFBACFDFDBGBEBBEBGDBCDHA@FBFDDGBBEBGIDFCGBDBAFICCGCCEBGBECCAEGCBEBFGCFCBICGECCJ@CFADAECGECCDGHCDHEEFDHCACBGBFBEBBEBJCDBFDEGBDDGBDDFCBJBDA?ECIDBACBAGBDCEIDBDFEDECGBEBFEBBIFBABEBHBECCEBEBCEBHCACFBBLC?FB@C@?GDFBBEBEKDDBHDDFDBFDAE@FDBBBBGEBBFEFCBFACDCGEBCBGADBHCECAEDBKBDBGBI?HDDHDECBJC@BBNCD@AIDFCECHCECBDBFBEBJCECGBEBBECHBGDFCCJDEBEDHCEBCEFHBFDCDFBIDFDADFCCHDCFIDCGBBCCCAGC@CEKEDCIB@EACEGEBCFCCFGDDICECFDFBCGHDEDCGCLEABIDECEHCGGB?JBD?@?CHBEBHEFBFCBFDCJDEGCCDHDFCDGDDHCD@?JHBDEDBGCAICFGDLDDDHFCCFDJCCGCCGD@DAIBDGCDFECHBFAFCJDEGDEDGCDIBFBBECMFBDBGBDCGDBAECHFCJEHCCCFBKBECGDDBHDECCFCCGDBDJDEFBGCDCDCGCEBEBCJCDDBDDCHDCDBCJDAFBDHCECCGCBFBDBKCECAGCCBHCECEDIDCGBCKECEBCHFDCDHDEBGDBECJBEBHCDEDCHCDMEACBBEDBEHCBEECHBCEBDBCEHCDEDADBBECJEDGCEBCGACECIBDECEBCGDFBBFDBIFADFADCIBACDACGBDBBECHDBCEAEDJDACFDBCDBHDFBDCGCBICDF@FCDICADCGACFCLADBECECIBCEBECDHCECCGCDFBBDGCDBECHDBBDGCBDBFBBECFCEJDBBDAAEBDBF@BGCCEBIDDCBHCBCFACCBFBCBFCCCJECCFDDECBDADBAHCDCHCDBEBCFDACDAHDEBFEJDFBCGBDBICEBDBGBCBEBDHCDDBGDBP',
			numLevels: 18,
			zoomFactor: 2
		});
		polyline.id = 1;
		GEvent.addListener(polyline, "click", function(latlng) {
			clickLine(polyline, latlng);
		});
		this.map.addOverlay(polyline);
	}
}

function createMarker(latlng) {
	var trainIcon = new GIcon(G_DEFAULT_ICON);
    trainIcon.image = "img/poezd.png";
    trainIcon.iconSize = new GSize(39, 37);
    trainIcon.shadowSize = new GSize(0, 0);
    trainIcon.iconAnchor = new GPoint(19, 13);

	mark = new GMarker(latlng, {icon : trainIcon , autoPan : true, cursor : 'pinter'});
	return mark;
}

function clickLine(polyline, latlng) {
	if (isLoading()) {
		return false;
	}
	wait();
	moveMarker();
	vertex = getNearestVertex(latlng);
	startPlay(vertex, true);

	from = getPathPoint(vertex);
	this.poezd.setLatLng(from);
	unwait();
	showDistances();
}

/**
* Определяет ближашую вершину ломаной
*/
function getNearestVertex(latlng) {
	vertex_num = 0;
	minDist = 60000000;
	delta = 60000000;
	for (i=0; i < getPathPointsLength(); i++) {
		vertex = getPathPoint(i);
		dist = vertex.distanceFrom(latlng);
		delta = dist;
		if (dist < minDist) {
			vertex_num = i;
			minDist = dist;
		}
		if (delta > dist) {
			break;
		}
	}
	return vertex_num;
}

/**
* Возвращает фрагмент видео, соответствующий вершине линии-пути
**/
function getVideoFragment(vertex) {
	time = getPathTime(vertex-1);
	for (i=1; i<this.videos.length; i++) {
		if (parseFloat(this.video_times[i]) > parseFloat(time)) {
			return i-1;
		}
	}
	return 0;
}

// ================================================

function setPoezd(poezd) {
	this.poezd = poezd;
}

function getPoezd() {
	return this.poezd;
}

function setPathTimes(path_times) {
	this.path_times	= path_times;
}

function getPathTime(vertex) {
	return this.path_times[vertex];
}

function setVideoTimes(varr) {
	this.videos = new Array(varr.length);
	this.video_times = new Array(varr.length);
	var itms = ['', '', ''];
	for (i=0; i<varr.length; i++) {
		//Уродский фикс для IE. Не понятно, почму здесь не работает split, выше работает!
		itms[0] = (varr[i]).substr(0, 11);
		start_time = (varr[i]).substr(12, 7);
		itms[1] = parseInt(start_time.replace(/^\s+/, ""));
		itms[2] = parseInt((varr[i]).substr(20, 5));
		//item = (varr[i]).split('|');
		this.videos[i] = itms[0];
		this.video_times[i] = itms[1];
		this.video_lengths[i] = itms[2];
	}
	this.videos[0] = getFirstVideo();
}

function setPathPoints(points) {
	this.path_points = points;
}

function setDistances(dists) {
	this.path_distances = dists;
}

function getPathPointsLength() {
	return this.path_points.length;
}

function getPathPoint(vertex) {
	return this.path_points[vertex];
}

function wait() {
	mapdiv = document.getElementById('map');
	mapdiv.style.cursor = 'wait';
	this.is_loading = 1;
	waitdiv = document.getElementById('_wait');
	waitdiv.innerHTML = '<img src="img/loading.gif">';
}

function unwait() {
	mapdiv = document.getElementById('map');
	mapdiv.style.cursor = 'default';
	this.is_loading = 0;
	waitdiv = document.getElementById('_wait');
	waitdiv.innerHTML = '';
}

function isLoading() {
	return this.is_loading > 0;
}

function setCurrentVid(vid) {
	this.current_vid = vid;
}

function startPlay(vertex, start) {
	vid = getVideoFragment(vertex);
	setCurrentVid(vid);
	ytplayer = document.getElementById("myytplayer");
	if (ytplayer.getPlayerState() >= 0) {
		ytplayer.stopVideo();
		//ytplayer.clearVideo();
	}

	vid_id = getVideoId(ytplayer);
	seek = getPathTime(vertex) - this.video_times[vid];
	if (seek <= 0) {
		seek = 0;
	}
	if (vid_id != this.videos[vid]) {
		ytplayer.cueVideoById(this.videos[vid], seek);
	}
	else {
		ytplayer.seekTo(seek, true);
	}
	if (start) {
		ytplayer.playVideo();
		startMarker();
	}
}

function startPlayVideo(vid, seek, start) {
	setCurrentVid(vid);
	ytplayer = document.getElementById("myytplayer");
	if (ytplayer.getPlayerState() >= 0) {
		ytplayer.stopVideo();
		//ytplayer.clearVideo();
	}

	vid_id = getVideoId(ytplayer);
	if (vid_id != this.videos[vid]) {
		ytplayer.cueVideoById(this.videos[vid], seek);
	}
	else {
		ytplayer.seekTo(seek, true);
	}
	if (start) {
		ytplayer.playVideo();
		startMarker();
	}
}

function getVideoId(ytplayer) {
	var reg = /\?v=([^&\s]{11})&/i;
	arr = reg.exec(ytplayer.getVideoUrl());
	if (arr != null) {
		return arr[1];
	}
	return false;
}

// ================================================
function goToVideo(yt_id, seek, start, zoom) {
	wait();
	for (i=0; i<this.videos.length; i++) {
		if (this.videos[i] == yt_id) {
			this.current_vid = i;
			break;
		}
	}
	time = this.video_times[this.current_vid] + seek;
	for (i=0; i<this.path_times.length; i++) {
		if (this.path_times[i] > time) {
			this.current_segment = i-1;
			break;
		}
	}
	old_poezd = getPoezd();
	from = getPathPoint(this.current_segment);

	this.poezd.setLatLng(from);
	this.map.setCenter(poezd.getLatLng(), zoom);

	startPlayVideo(this.current_vid, seek, start);
	unwait();
	showDistances();
}

function isVideoLoaded() {
	if (this.is_video_loaded > 0)
		return true;
	else
		this.is_line_loaded = 1;
}

function isLineLoaded() {
	if (this.is_line_loaded > 0)
		return true;
	else
		this.is_video_loaded = 1;
}
