Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Jquery - json - AJAX - Cache' / 16 сообщений из 16, страница 1 из 1
04.07.2012, 13:22
    #37865928
drakut
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Jquery - json - AJAX - Cache'
Задача состоит в передаче от клиента серверу ajax-запросом неких данных в формате JSON, распознавании их на сервере (CLS) и пробном редактировании и отправке обратно клиенту. Отправка серверу делается из обычной HTML-странички с помощью подключенной библиотеки JQUERY:

КЛИЕНТ
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
<!DOCTYPE html>
<head>
    <title>index</title>
    <META content="" name="keywords">
    <META content="" name="Description">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <link rel="stylesheet" href="styles/reset.css" type="text/css" media="screen">
    <link rel="stylesheet" href="styles/css-base.css" type="text/css" media="screen">
    <link rel="stylesheet" href="styles/main_css.css" type="text/css" media="screen">
    <script type="text/javascript" src="js/jquery-1.6.2.min.js"></script>
	<script type="text/javascript" src="js/jquery.json-2.3.min.js"></script>

	<script type="text/javascript">
		$("#alephvisit_showform").live('click', function(){

		//набор различных данных
                var data = {Name: "Sasha", Phone: "123456"};
		//var data = {PHONE: "phone", NAME: "name", COMMENTS: "comments", PHOTO: "photo", COUNTRY: "country", MODID: "modId"};
		//var data = {"PHONE": "phone", "NAME": "name"}
		//var data = {PHONE: [ "phone", "name", "comments", "photo", "country", "modId"]};
		//var data = {obj :{PHONE: "phone", NAME: "name"}};
		//var simple = "String";

		//кодируем данные, использовал подключенную библиотеку
                var jsondata=$.toJSON(data);
                
                // вот  тут  DAiMor упомянул о другом способе кодирования 
                // - не знаю какой правильный
		//var jsondata = JSON.stringify(data)
		
		$.ajax({
			contentType: "JSON",
			type:"POST",
			url: "/csp/unima/test.test.cls",
			processdata: false,
			datatype: "JSON",
			data: jsondata,
			success: function(msg) {
				//var obj = jQuery.parseJSON(msg);	
				//alert("You'll not belive - it's ok");
				//alert(obj.Name);
				alert(msg);
			},
			error: function(){
				alert ("Error connecting to server");
			}
		});
	});
	</script>

</head>
<body>
    <div id="plan"><div class="plan">
		<div class="plan-img">
			<a id="alephvisit_showform" href="#"><span>Проверка!</span></a>
		</div>
		
		<div class="descr-container">
			<div rel="link1" class="descr">
			</div>
		</div>

	</div></div>
</body>
</html>


Встроенные стредства Cache для работы с JSON, как я понял, можно использовать только в составе ZEN, что в моем случае не подходит (сервер должен только приянять данные от клиента, обработать, и отослать обратно), поэтому для обработки JSON я использовал класс CacheJSON https://github.com/PlanetCache/CacheJSON#readme.

СЕРВЕР
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
Class test.test Extends (%CSP.Page, utils.CacheJSON) [ ClassType = "", ProcedureBlock ]
{
Parameter CONTENTTYPE = "JSON";
Parameter CHARSET = "UTF-8";
Parameter NOCHARSETCONVERT = 1;

ClassMethod OnHTTPHeader(ByRef DoPage As %Boolean, Format As %String = "") As %Status
{
	Set %response.Headers("EXPIRES")="Thu, 29 Oct 1998 17:04:19 GMT"
	Set %response.Headers("CACHE-CONTROL")="private"
	Set %response.Headers("PRAGMA")="no-cache"
	Set %response.CharSet = ..#CHARSET
	Do %response.WriteHTTPHeader(%request.Method'="HEAD")
	Quit 1
}

ClassMethod OnPage() As %Status
{
	//Do ..sessionLogin()
		
	//Do $zutil(168,##class(EBD.utils.common).pathCsp())
	
	//Получаем JSON
	S Request=%request.Content
	S jsonRequest=Request

	//S obj = ##class(test.Request).GetObjectFromJSON(jsonRequest)
	//S obj = ..Decode(jsonRequest)
	//Do $System.OBJ.Dump(obj)
	//D ..PrintVariable(jsonRequest, "jsonRequest")
	//S obj = ##class(utils.CacheJSON).GetObjectFromJSON(jsonRequest)
	//w %request.Get("json")	
	//Q $ZCVT(%request.Data("json"),"L")
	//Q %request.Count("String")
	//S param=%request.Next("")
	s obj = ..Decode(%request.Content)
	//w ##class(%CSP.Stream).ContentTypeGet() 
	//s obj = %request.Get(%request.Next(""))
	//w obj.GetAt("PHONE")
	w obj
	Q 1
}
}

Данные клиентом отправляются верные, смотрел FireBug-ом, но на сервере я получаю какой-то "4@%CSP.BinaryStream". метод GetObjectFromJSON не работает почему-то, при выполнении на клиент идет csp-страничка с ошибкой об отсутствии метода (там генерация кода, и он, кажется, некорректно может прочитать название свойства класса)

Вопросы:
1) может быть неправильно кодирую в JSON на клиенте? это должна быть строка?
2) правильно ли принимаются данные на сервере, %request.Content ?
3) правильно ли указаны заголовки на сервере

p.s. - от гиперсобытий Кашэ отказался, не рекомендуйте. закомментированный код оставил специально, чтобы посмотреть что я уже пытался. Рамки задачи я описал достаточно подробно, помогите пожалуйста.
...
Рейтинг: 0 / 0
04.07.2012, 14:01
    #37866019
Valeriu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Jquery - json - AJAX - Cache'
Я в этом не так четко понимаю, но посоветовал бы посетить
страницу :
(Там у человека много разьеснений на счет Json and Ajax
На github тоже очень много его примеров.)

http://gradvs1.mgateway.com/download/ajax3.0.546.pdf
и
http://gradvs1.mgateway.com/main/
...
Рейтинг: 0 / 0
04.07.2012, 14:20
    #37866053
drakut
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Jquery - json - AJAX - Cache'
Valeriu, ничего нового, но спасибо. Думаю одна из проблем в неправильной приемке данных на сервере. Если отправлять просто

Код: plaintext
1.
2.
3.
$.ajax({
           ...
           data: {Name:"sasha", Phone:"12345"}
           ...

то на сервере работает вот такой доступ к отправленным от клиента данным:

Код: plaintext
1.
2.
3.
...
S Request=%request.Get("NAME")
...

Но это отправка уже не JSON, а хотелось бы отправлять именно объекты - для простоты обращения к свойствам и упрощения кодинга в целом. Ну и для красоты что-ли...
...
Рейтинг: 0 / 0
04.07.2012, 15:06
    #37866133
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Jquery - json - AJAX - Cache'
drakutНу и для красоты что-ли...
Эва!

Типа не просто отправил данные... Но сделал это красиво!
...
Рейтинг: 0 / 0
04.07.2012, 15:14
    #37866150
drakut
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Jquery - json - AJAX - Cache'
krvsa, прошу по делу
...
Рейтинг: 0 / 0
04.07.2012, 15:18
    #37866161
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Jquery - json - AJAX - Cache'
drakutkrvsa, прошу по делу
Да ты че...
А поговорить? (с)
...
Рейтинг: 0 / 0
04.07.2012, 15:21
    #37866172
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Jquery - json - AJAX - Cache'
автор// вот тут DAiMor упомянул о другом способе кодирования
// - не знаю какой правильный
//var jsondata = JSON.stringify(data)

DAiMor плохого не посоветует :-) , но такой вариант будет работать во всех браузерах кроме IE ранних версий
но для IE я подгружаю json2.js , и тогда работает везде

%request.Content это Stream а не строка соответственно ее еще нужно прочитать.
Код: sql
1.
s obj = ..Decode(%request.Content.Read())


utils.CacheJSON парсить стрим не умеет, поэтому нужно передавать ему строку, но не забываем про ограничение строки по длине в 32килобайта. либо дописать возможность работы со стримом в CacheJSON
...
Рейтинг: 0 / 0
04.07.2012, 15:28
    #37866192
drakut
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Jquery - json - AJAX - Cache'
DAiMor, спасибо БОЛЬШОЕ. А как парсить? преобразовать в строку? я думал данные отправляются обычной строкой.. я в замешательстве
...
Рейтинг: 0 / 0
04.07.2012, 15:42
    #37866227
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Jquery - json - AJAX - Cache'
drakutDAiMor, спасибо БОЛЬШОЕ. А как парсить? преобразовать в строку? я думал данные отправляются обычной строкой.. я в замешательстве

что именно парсить?
я строчку уже привел, что то еще надо ?

неважно что ты передаешь текстом, сервер в данном случае ожидает что там может прийти много данных, и поэтому собирает полученные данные в поток, потому как строки в каше не резиновые и ограниченные длиной до 32килобайт или до 3.5 мегабайт если включена поддержка длинных строк, но чтение из потока методом Read по умолчанию читает 32000байт.
...
Рейтинг: 0 / 0
04.07.2012, 15:52
    #37866251
doublefint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Jquery - json - AJAX - Cache'
drakut, как-то так :

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
Class wui.test Extends %CSP.Page {

ClassMethod OnPage() As %Status {
	m args=%request.Data  Q:$d(args) ..Test(.args)

	&html<<!doctype html>
	<head lang="ru">
		<meta charset="utf-8" />
		<title>index</title>
	</head><body>
		<button id="send" type="button">Проверка!</button>
	<script type="text/javascript" src="js/jquery-1.7.2.min.js"></script>
	<!-- for old ie 
		script type="text/javascript" src="js/jquery.json-2.3.min.js"></script
	-->
	<script type="text/javascript">
	$(function(){ //запустится когда загрузится страница

		$("#send").click(function(){

			//набор различных данных
			//var data = {Name: "Sasha", Phone: "123456"};
			//var data = {PHONE: "phone", NAME: "name", COMMENTS: "comments", PHOTO: "photo", COUNTRY: "country", MODID: "modId"};
			//var data = {"PHONE": "phone", "NAME": "name"}
			var data = {PHONE: [ "phone", "name", "comments", "photo", "country", "modId"]};
			//var data = {obj :{PHONE: "phone", NAME: "name"}};
			//var simple = "String";

			// вот тут DAiMor упомянул о другом способе кодирования 
			// - не знаю какой правильный -
			//Для старых версий браузеров у которых нет объекта JSON
			var jsondata = (JSON) ? JSON.stringify(data) : $.toJSON(data);

			$.ajax({
				type:"POST"
				,url: window.location+""
				,datatype: "text" //если указать json - jquery будет его парсить
				,data: {json: jsondata}

				,success: function(msg) {
					alert(msg);
				}
			});

		});

});
	</script></body></html>>
		Quit $$$OK
}

/// Разбор ответа
ClassMethod Test(ByRef args As %String) As %Status {
		w $g(args("json",1))
		Q 1
}

}


...
Рейтинг: 0 / 0
04.07.2012, 15:53
    #37866256
drakut
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Jquery - json - AJAX - Cache'
DAiMor,
с ваших слов я так понял, что нужно сначала нужно прочитать из потока входящие данные, а потом их парсить. То есть
Код: plaintext
s req = %request.Content.Read()

и req надо еще парсить, а вот как?
...
Рейтинг: 0 / 0
04.07.2012, 16:09
    #37866293
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Jquery - json - AJAX - Cache'
drakutВстроенные стредства Cache для работы с JSON, как я понял, можно использовать только в составе ZEN, что в моем случае не подходитМожно. Пример можно найти здесь: 12670293

Привожу ещё один пример по отправке JSON с клиента на сервер и обратно, используя лишь стандартные средства:
CSP+JSON, используя ZEN<CSP:CLASS INCLUDES="%callout">
<html>
<head>
<title></title>
<script type="text/javascript" src="zenutils.js"></script>
<script type="text/javascript" src="zenCSLM.js"></script>

<script language="cache" method="GetArray" arguments="&pMetaData,&pData" returntype="%Status">
  
  //var data = {PHONE: "phone", NAME: "name", COMMENTS: "comments", PHOTO: "photo", COUNTRY: "country", MODID: "modId"};
  
  Set pMetaData = $LB("PHONE","NAME","COMMENTS","PHOTO","COUNTRY","MODID")
  Set pData(1) = $LB("phone","name","comments","photo","country","modId")

  Quit $$$OK
</script>

  <script language="cache" method="SrvSave" arguments="json:%String" returntype="%String">
  new format,tIO,tXDEV,export,tChunk,obj
  
  ##; преобразуем входную JSON-строку в объект
  do ##class(%ZEN.Auxiliary.jsonProvider).%ParseJSON(json,,.obj)
  
  if $IsObject(obj) {

    ##; посмотрим содержимое поля Phone
    set ^tmp(1)=obj.Phone

  }
  
  ##; подготовим выходные данные
  do ..GetArray(.pMetaData,.pData)
  
  // собираем в строку всё, что выводится через write
  
  set tIO=$IO,tXDEV="|XDEV|"_+$JOB,$ZT="Trap"
  Do {
    /// For $$$IsUnicode use UTF-8
    Open tXDEV:($ZF(-6,$$$XSLTLibrary,12):"":"S":/HOSTNAME="XSLT":/IOT=$S(($zcvt($get(format),"L")[",utf8")||$$$IsUnicode:"UTF8",1:"RAW"):/IBU=16384:/OBU=16384)
    Use tXDEV
    
    Quit:$$$ISERR(##class(%ZEN.Auxiliary.jsonProvider).%ArrayToJSON(.pMetaData,.pData))
    
    // Flush any remaining output
    Write *-3
    
    // Now read back a string (up to the maximum possible length, 32k or ~4MB for long strings)
    Set export = ""
    While (1) {
      #dim tChunk As %String
      Read tChunk:0
      Quit:'$L(tChunk)
      Set export = export _ tChunk
    }
    
  } While (0)

:Exit
  Close tXDEV
  Use tIO
  Quit export
:Trap
  Set $ZT=""
  Goto Exit
</script>

<script type="text/javascript">
function test()
{
  //набор различных данных
  var data = {Name: "Sasha", Phone: "123456"};  

  // преобразуем JSON-объект в строку
  var dataStr=ZLM.jsonEncode(data,true);
  zenAlert("data=",dataStr);
  
  // передадим наш объект на сервер и получим результат
  var result=#server(..SrvSave(dataStr))#;
  
  // преобразуем строку в JSON-объект
  var obj=ZLM.jsonParseObject(result);
  zenAlert("result=",result);
  zenAlert("obj=",obj);
  
}
</script>

</head>
<body>
  <button onclick="test();">test</button>
</body>
</html>
drakutp.s. - от гиперсобытий Кашэ отказался, не рекомендуйтеВам виднее, но пример выше в таком случае придётся переделывать самостоятельно.
...
Рейтинг: 0 / 0
04.07.2012, 16:40
    #37866363
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Jquery - json - AJAX - Cache'
drakutDAiMor,
с ваших слов я так понял, что нужно сначала нужно прочитать из потока входящие данные, а потом их парсить. То есть
Код: plaintext
s req = %request.Content.Read()

и req надо еще парсить, а вот как?
в вашем случае вы уже парсите с помощью utils.CacheJSON
с помощью метода
Decode()
куда вы и передадите вашу строку, и строка примет вид
s obj = ..Decode(req)
только, передавать нужно ему не поток а строку, а он вернет объект типа %ArrayOfDataTypes или %ListOfDataTypes
из которого без труда
...
Рейтинг: 0 / 0
04.07.2012, 19:09
    #37866613
drakut
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Jquery - json - AJAX - Cache'
DAiMor, как преобразовывать поток в строку? Как раз интересовал момент с передачей данных:
Код: plaintext
data: {json: jsondata}
я передавал как
Код: plaintext
data: jsondata 
а в jsondata уже сама JSON-строка, поэтому на сервере никак не получалось "выцепить" эти данные. Видимо, передавать чистый JSON все равно никак нельзя.

servit, спасибо, знаю, читал =) но сейчас интересны как раз места с получением данных от клиента, их кодированием/декодированием и прочее, а этот пример никак не поможет.

-------------------------------------------------------------------------------------------------------------------------

Уважаемые кашевары, спасибо за помощь, на данный момент вот что (история еще не закончена) :

index.html :
...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
<script type="text/javascript">
		$("#alephvisit_showform").live('click', function(){
		var data = {Name: "Sasha", Phone: "123456"};
		//var data = {PHONE: "phone", NAME: "name", COMMENTS: "comments", PHOTO: "photo", COUNTRY: "country", MODID: "modId"};
		//var data = {"PHONE": "phone", "NAME": "name"}
		//var data = {PHONE: [ "phone", "name", "comments", "photo", "country", "modId"]};
		//var data = {obj :{PHONE: "phone", NAME: "name"}};
		//var simple = "String";
		var jsondata=$.toJSON(data);
		//var jsondata = JSON.stringify(data)
		//var jsondata=data;
		$.ajax({
			type:"POST",
			url: "/csp/unima/test.test.cls",
			processdata: false,
			datatype: "text",
			data: {json: jsondata},
			success: function(msg) {
				//var obj = jQuery.parseJSON(msg);
				var obj = JSON.parse(msg);				
				//alert("You'll not belive - it's ok");
				//alert(obj.Name);
				//console.log(msg)
				alert(msg);
			},
			error: function(){
				alert ("Error connecting to server");
			}
		});
	});
	</script>
...

test.test.cls :
Class test.test Extends (%CSP.Page, utils.CacheJSON) [ ClassType = "", ProcedureBlock ]
{

Parameter CONTENTTYPE = "TEXT";

Parameter CHARSET = "UTF-8";

Parameter NOCHARSETCONVERT = 1;

ClassMethod OnHTTPHeader(ByRef DoPage As %Boolean, Format As %String = "") As %Status
{
Set %response.Headers("EXPIRES")="Thu, 29 Oct 1998 17:04:19 GMT"
Set %response.Headers("CACHE-CONTROL")="private"
Set %response.Headers("PRAGMA")="no-cache"
Set %response.CharSet = ..#CHARSET
Do %response.WriteHTTPHeader(%request.Method'="HEAD")
Quit 1
}

ClassMethod OnPage() As %Status
{
//Do ..sessionLogin()

//Do $zutil(168,##class(EBD.utils.common).pathCsp())

//Получаем JSON
m stream=%request.Data
S jsonRequest = $G(stream("json",1))
//D ..PrintVariable(.jsonRequest, "jsonRequest")

//строим объект из пришедших данных. У класса-родителя должны быть все свойства "приходящего" от клиента объекта
S obj=##class(test.Request).GetObjectFromJSON(jsonRequest)

//Строим ответный объект
S Response=##class(test.Request).%New()
S Response.Name = obj.Name_"123"
S Response.Phone = "server was here"

//преобразуем ответный объект в JSON
S jsonObj=Response.GetJSONFromObject()
//D ..PrintVariable(.jsonObj, "jsonObj")
W jsonObj
Q 1
}}

Теперь проблема в парсинге обработанных данных на клиенте:
JSON.parse: unexpected character
есть подозрение что кашэ что-то там не то делает. В фаербаге смотрю что приходит - вроде все ок, не пойму что такое.
...
Рейтинг: 0 / 0
04.07.2012, 20:37
    #37866676
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Jquery - json - AJAX - Cache'
drakutservit, спасибо, знаю, читал =) но сейчас интересны как раз места с получением данных от клиента, их кодированием/декодированием и прочее, а этот пример никак не поможет.Не буду спрашивать запускали ли Вы пример выше, но чтобы функционал моей серверной части совпал с Вашим последним вариантом, сделайте следующее изменение в коде:
замените строку

Quit:$$$ISERR(##class(%ZEN.Auxiliary.jsonProvider).%ArrayToJSON(.pMetaData,.pData))

на

#; подготовим выходные данные
set obj.Name=obj.Name_"123"
set obj.Phone="server was here"
Quit:$$$ISERR(##class(%ZEN.Auxiliary.jsonProvider).%ObjectToJSON(obj))

PS: в вышедшей вчера Caché 2012.2.RC появились ещё два класса: %ZEN.Auxiliary.jsonArrayProvider , %ZEN.Auxiliary.jsonSQLProvider (примеры в документации).
...
Рейтинг: 0 / 0
05.07.2012, 14:54
    #37867698
drakut
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Jquery - json - AJAX - Cache'
Проблема с парсером ответа от сервера решилась. Его вообще не надо парсить (только если браузер не старый). Нужно было у параметра CONTENTTYPE поставить значение json маленькими буквами:
Код: java
1.
2.
3.
4.
Class test.test Extends (%CSP.Page, utils.CacheJSON) [ ClassType = "", ProcedureBlock ]
{
Parameter CONTENTTYPE = "json"
...




На клиенте тоже у datatype указываем json, и с ответом обращаемся как с объектом:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
<script type="text/javascript">
		$("#alephvisit_showform").live('click', function(){
		var data = {Name: "Sasha", Phone: "123456"};
		var jsondata=$.toJSON(data);
		$.ajax({
			type:"POST",
			url: "/csp/unima/test.test.cls",
			processdata: false,
			datatype: "json",
			data: {json: jsondata},
			success: function(msg) {
				alert(msg.Name);
			},
			error: function(){
				alert ("Error connecting to server");
			}
		});
	});
	</script>
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Jquery - json - AJAX - Cache' / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]