scratch – Diff between revs 51 and 54

Subversion Repositories:
Rev:
Only display areas with differencesRegard whitespace
Rev 51 Rev 54
1 <!DOCTYPE html> 1 <!DOCTYPE html>
2 <html lang="en"> 2 <html lang="en">
3 <head> 3 <head>
4 <meta charset="utf-8"> 4 <meta charset="utf-8">
5 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 5 <meta http-equiv="X-UA-Compatible" content="IE=edge">
6 <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" /> 6 <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
7 <meta http-equiv="Pragma" content="no-cache" /> 7 <meta http-equiv="Pragma" content="no-cache" />
8 <meta http-equiv="Expires" content="0" /> 8 <meta http-equiv="Expires" content="0" />
9 <meta name="viewport" content="width=device-width, initial-scale=1"> 9 <meta name="viewport" content="width=device-width, initial-scale=1">
10 <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags --> 10 <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
11 <meta name="description" content="quick asset upload"> 11 <meta name="description" content="quick asset upload">
12 <meta name="author" content="Wizardry and Steamworks"> 12 <meta name="author" content="Wizardry and Steamworks">
13 <link rel="icon" href="favicon.ico"> 13 <link rel="icon" href="favicon.ico">
14   14  
15 <title>Quickload</title> 15 <title>Quickload</title>
16 16
17 <!-- Polyfill --> 17 <!-- Polyfill -->
18 <script src="js/polyfill/polyfill.min.js"></script> 18 <script src="js/polyfill/polyfill.min.js"></script>
19   19  
20 <!-- Bootstrap core CSS --> 20 <!-- Bootstrap core CSS -->
21 <link href="css/bootstrap/bootstrap.min.css" rel="stylesheet"> 21 <link href="css/bootstrap/bootstrap.min.css" rel="stylesheet">
22   22  
23 <!-- IE10 viewport hack for Surface/desktop Windows 8 bug --> 23 <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
24 <link href="css/bootstrap/ie10-viewport-bug-workaround.css" rel="stylesheet"> 24 <link href="css/bootstrap/ie10-viewport-bug-workaround.css" rel="stylesheet">
25   25  
26 <!-- Just for debugging purposes. Don't actually copy these 2 lines! --> 26 <!-- Just for debugging purposes. Don't actually copy these 2 lines! -->
27 <!--[if lt IE 9]><script src="js/bootstrap/ie8-responsive-file-warning.js"></script><![endif]--> 27 <!--[if lt IE 9]><script src="js/bootstrap/ie8-responsive-file-warning.js"></script><![endif]-->
28 <script src="js/bootstrap/ie-emulation-modes-warning.js"></script> 28 <script src="js/bootstrap/ie-emulation-modes-warning.js"></script>
29   29  
30 <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries --> 30 <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
31 <!--[if lt IE 9]> 31 <!--[if lt IE 9]>
32 <script src="js/bootstrap/html5shiv.min.js"></script> 32 <script src="js/bootstrap/html5shiv.min.js"></script>
33 <script src="js/bootstrap/respond.min.js"></script> 33 <script src="js/bootstrap/respond.min.js"></script>
34 <![endif]--> 34 <![endif]-->
35 35
36 <!-- Trumbowyg --> 36 <!-- Trumbowyg -->
37 <link href="css/trumbowyg/trumbowyg.min.css" rel="stylesheet"> 37 <link href="css/trumbowyg/trumbowyg.min.css" rel="stylesheet">
38 <!-- Local style --> 38 <!-- Local style -->
39 <link href="css/text/style.css" rel="stylesheet"> 39 <link href="css/text/style.css" rel="stylesheet">
40 </head> 40 </head>
41   41  
42 <body> 42 <body>
43   43  
44 <div class="container"> 44 <div class="container">
45   45  
46 <!-- Main component for a primary marketing message or call to action --> 46 <!-- Main component for a primary marketing message or call to action -->
47 <div class="jumbotron"> 47 <div class="jumbotron">
48 <h1>Quickload</h1> 48 <h1>Quickload</h1>
49 <p>Asset sharing platform.</p> 49 <p>Asset sharing platform.</p>
50 </div> 50 </div>
51 51
52 <ul class="nav nav-tabs"> 52 <ul class="nav nav-tabs">
53 <li><a href="index.html">Home</a></li> 53 <li><a href="index.html">Home</a></li>
54 <li><a href="files.html">Files</a></li> 54 <li><a href="files.html">Files</a></li>
55 <li class="active"><a href="#">Text</a></li> 55 <li class="active"><a href="#">Text</a></li>
56 </ul> 56 </ul>
57 57
58 <div class="panel panel-default"> 58 <div class="panel panel-default">
59 <div class="panel-heading"> 59 <div class="panel-heading">
60 <div class="form-group"> 60 <div class="form-group">
61 <div class="input-group"> 61 <div class="input-group">
62 <span class="input-group-btn"> 62 <span class="input-group-btn">
63 <button id="save" class="btn btn-default" type="button" data-toggle="tooltip" data-placement="auto" title="Generate link."> 63 <button id="save" class="btn btn-default" type="button" data-toggle="tooltip" data-placement="auto" title="Generate link.">
64 <i class="glyphicon glyphicon-share"></i> 64 <i class="glyphicon glyphicon-share"></i>
65 </button> 65 </button>
66 </span> 66 </span>
67 <input id="URL" type="text" class="form-control" readonly> 67 <input id="URL" type="text" class="form-control" readonly>
68 <span class="input-group-btn"> 68 <span class="input-group-btn">
69 <button id="copy-url" class="btn btn-default" type="button" data-clipboard-target="#URL" data-toggle="tooltip" data-placement="auto" title="Copy to clipboard."><i class="glyphicon glyphicon-paperclip"></i></button> 69 <button id="copy-url" class="btn btn-default" type="button" data-clipboard-target="#URL" data-toggle="tooltip" data-placement="auto" title="Copy to clipboard."><i class="glyphicon glyphicon-paperclip"></i></button>
70 </span> 70 </span>
71 </div> 71 </div>
72 </div> 72 </div>
73 <form id="nick-form" role="form"> 73 <form id="nick-form" role="form">
74 <div class="form-group has-feedback"> 74 <div class="form-group has-feedback">
75 <div class="input-group"> 75 <div class="input-group">
76 <span class="input-group-btn"> 76 <span class="input-group-btn">
77 <button id="go" class="btn btn-default" type="button" data-toggle="tooltip" data-placement="auto" title="Load document."> 77 <button id="go" class="btn btn-default" type="button" data-toggle="tooltip" data-placement="auto" title="Load document.">
78 <i class="glyphicon glyphicon-play"></i> 78 <i class="glyphicon glyphicon-play"></i>
79 </button> 79 </button>
80 </span> 80 </span>
81 <span class="input-group-btn"> 81 <span class="input-group-btn">
82 <button id="reset" class="btn btn-default" type="button" data-toggle="tooltip" data-placement="auto" title="Reset document."> 82 <button id="reset" class="btn btn-default" type="button" data-toggle="tooltip" data-placement="auto" title="Reset document.">
83 <i id="home-icon" class="glyphicon glyphicon-home"></i> 83 <i id="home-icon" class="glyphicon glyphicon-home"></i>
84 </button> 84 </button>
85 </span> 85 </span>
86 <input id="nick" type="text" class="form-control" pattern="^[A-Za-z0-9]{32}$" maxlength="32"> 86 <input id="nick" type="text" class="form-control" pattern="^[A-Za-z0-9]{32}$" maxlength="32">
87 <span class="input-group-btn"> 87 <span class="input-group-btn">
88 <button id="copy-nick" class="btn btn-default" type="button" data-clipboard-target="#nick" data-toggle="tooltip" data-placement="auto" title="Copy to clipboard."><i class="glyphicon glyphicon-paperclip"></i></button> 88 <button id="copy-nick" class="btn btn-default" type="button" data-clipboard-target="#nick" data-toggle="tooltip" data-placement="auto" title="Copy to clipboard."><i class="glyphicon glyphicon-paperclip"></i></button>
89 </span> 89 </span>
90 </div> 90 </div>
91 </div> 91 </div>
92 </form> 92 </form>
93 </div> 93 </div>
94 <div class="panel-body" id="editorpanel"> 94 <div class="panel-body" id="editorpanel">
95 <div id="trumbowyg" style="display: none; font-family: monospace;"> 95 <div id="trumbowyg" style="display: none; font-family: monospace;">
96 </div> 96 </div>
97 </div> 97 </div>
98 </div> 98 </div>
99   99  
100 </div> <!-- /container --> 100 </div> <!-- /container -->
101 101
102 <div id="footer"> 102 <div id="footer">
103 <div class="container"> 103 <div class="container">
104 <p class="text-muted credit">Copyright <i class="glyphicon glyphicon-copyright-mark"></i> 2017 <a href="http://grimore.org">Wizardry and Steamworks</a>.</p> 104 <p class="text-muted credit">Copyright <i class="glyphicon glyphicon-copyright-mark"></i> 2017 <a href="http://grimore.org">Wizardry and Steamworks</a>.</p>
105 </div> 105 </div>
106 </div> 106 </div>
107   107  
108 <script src="js/jquery/jquery.min.js"></script> 108 <script src="js/jquery/jquery.min.js"></script>
109 <script src="js/bootstrap/bootstrap.min.js"></script> 109 <script src="js/bootstrap/bootstrap.min.js"></script>
110 <!-- IE10 viewport hack for Surface/desktop Windows 8 bug --> 110 <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
111 <script src="js/bootstrap/ie10-viewport-bug-workaround.js"></script> 111 <script src="js/bootstrap/ie10-viewport-bug-workaround.js"></script>
112 112
113 <!-- Trumbowyg --> 113 <!-- Trumbowyg -->
114 <script src="js/trumbowyg/trumbowyg.min.js"></script> 114 <script src="js/trumbowyg/trumbowyg.min.js"></script>
115 <!-- Clipboard --> 115 <!-- Clipboard -->
116 <script src="js/clipboard/clipboard.min.js"></script> 116 <script src="js/clipboard/clipboard.min.js"></script>
117 <!-- Fingerprint 2 --> 117 <!-- Fingerprint 2 -->
118 <script src="js/fingerprintjs/fingerprint2.min.js"></script> 118 <script src="js/fingerprintjs/fingerprint2.min.js"></script>
119 <!-- js-cookie --> 119 <!-- js-cookie -->
120 <script src="js/jscookie/js.cookie.js"></script> 120 <script src="js/jscookie/js.cookie.js"></script>
121 <!-- Bootstrap Validator --> 121 <!-- Bootstrap Validator -->
122 <script src="js/validator/validator.min.js"></script> 122 <script src="js/validator/validator.min.js"></script>
123 <script> 123 <script>
124 $(document).ready(() => { 124 $(document).ready(() => {
125 // Attach the form validator. 125 // Attach the form validator.
126 $('#nick-form').validator({ 126 $('#nick-form').validator({
127 focus: false 127 focus: false
128 }); 128 });
129 129
130 // Enable the Clipboard button. 130 // Enable the Clipboard button.
131 new Clipboard('#copy-url'); 131 new Clipboard('#copy-url');
132 132
133 // Get the fingerprint. 133 // Get the fingerprint.
134 new Fingerprint2().get((result, components) => { 134 new Fingerprint2().get((result, components) => {
135 // Set the nick as a cookie. 135 // Set the nick as a cookie.
136 const fingerprint = result; 136 const fingerprint = result;
137 var nick = Cookies.get('nick'); 137 var nick = Cookies.get('nick');
138 if(!nick || nick.length !== 32) { 138 if(!nick || nick.length !== 32) {
139 Cookies.set('nick', result, { path: '' }); 139 Cookies.set('nick', result, { path: '' });
140 nick = result; 140 nick = result;
141 } 141 }
142 else 142 else
143 result = nick; 143 result = nick;
144 144
145 // Set the nick. 145 // Set the nick.
146 $('#nick').val(result); 146 $('#nick').val(result);
147 new Clipboard('#copy-nick'); 147 new Clipboard('#copy-nick');
148 148
149 if(fingerprint == nick) 149 if(fingerprint == nick)
150 $('#home-icon').addClass("text-success"); 150 $('#home-icon').addClass("text-success");
151 else 151 else
152 $('#home-icon').addClass("text-danger"); 152 $('#home-icon').addClass("text-danger");
153 -  
154 // Load the editor. -  
155 $('#trumbowyg').trumbowyg({ -  
156 autogrow: true, -  
157 disabled: true 153
158 }).on('tbwchange', () => { -  
159 $('#editor').trumbowyg('disable'); 154 function saveTextFile() {
160 $.post('text.php', { 155 $.post('text.php', {
161 data: $('#trumbowyg').trumbowyg('html'), 156 data: $('#trumbowyg').trumbowyg('html'),
162 fingerprint: result, 157 fingerprint: result,
163 action: 'SAVE', 158 action: 'SAVE',
164 timeout: 0 159 timeout: 0
165 }).done((data) => { -  
166 $('#trumbowyg').trumbowyg('enable'); -  
167 }).fail(() => { -  
168 $('#trumbowyg').trumbowyg('enable'); -  
169 }); 160 });
-   161 }
-   162 var autoSaveTimeoutID = window.setTimeout(saveTextFile, 250);
-   163
-   164 // Load the editor.
-   165 $('#trumbowyg').trumbowyg({
-   166 autogrow: true,
-   167 disabled: true
-   168 }).on('tbwchange', () => {
-   169 // Clear the value of the URL box because the URL will have changed.
-   170 $('#URL').val('');
-   171 // Reschedule saving of the file.
-   172 window.clearTimeout(autoSaveTimeoutID);
-   173 autoSaveTimeoutID = window.setTimeout(saveTextFile, 250);
170 }); 174 });
171 175
172 // Retrieve the contents of the shared file. 176 // Retrieve the contents of the shared file.
-   177 $('#trumbowyg').trumbowyg('disable');
173 $.post('text.php', 178 $.post('text.php',
174 { 179 {
175 timestamp: window.performance.now(), 180 timestamp: window.performance.now(),
176 fingerprint: result, 181 fingerprint: result,
177 action: 'LOAD' 182 action: 'LOAD'
178 }).done((data) => {; 183 }).done((data) => {;
179 $('#trumbowyg') 184 $('#trumbowyg')
180 .trumbowyg('html', data); 185 .trumbowyg('html', data);
181 $('#trumbowyg').trumbowyg('enable'); 186 $('#trumbowyg').trumbowyg('enable');
182 $('#trumbowyg').show(); 187 $('#trumbowyg').show();
183 }).fail(() => { 188 }).fail(() => {
184 $('#trumbowyg').trumbowyg('enable'); 189 $('#trumbowyg').trumbowyg('enable');
185 $('#trumbowyg').show(); 190 $('#trumbowyg').show();
186 }); 191 });
187 192
188 $('#save').click(() => { 193 $('#save').click(() => {
189 $('#editor').trumbowyg('disable'); 194 $('#editor').trumbowyg('disable');
190 -  
191 var formData = new FormData(); 195 var formData = new FormData();
192 formData.append('file', new Blob( 196 formData.append('file', new Blob(
193 [ 197 [
194 $('#trumbowyg').trumbowyg('html') 198 $('#trumbowyg').trumbowyg('html')
195 ] 199 ]
196 ), 200 ),
197 '.html' 201 '.html'
198 ); 202 );
199 203
200 $.ajax({ 204 $.ajax({
201 url: 'file.php', 205 url: 'file.php',
202 type: 'POST', 206 type: 'POST',
203 data: formData, 207 data: formData,
204 // cache: false // FF 208 // cache: false // FF
205 processData: false, 209 processData: false,
206 contentType: false 210 contentType: false
207 }).done((data) => { 211 }).done((data) => {
208 $('#URL').val(data); 212 $('#URL').val(data);
209 $('#trumbowyg').trumbowyg('enable'); 213 $('#trumbowyg').trumbowyg('enable');
210 }).fail(() => { 214 }).fail(() => {
211 $('#trumbowyg').trumbowyg('enable'); 215 $('#trumbowyg').trumbowyg('enable');
212 }); 216 });
213 }); 217 });
214 218
215 // When the button is clicked, navigate to the fingerprint. 219 // When the button is clicked, navigate to the fingerprint.
216 $('#go').click(() => { 220 $('#go').click(() => {
217 nick = $('#nick').val(); 221 nick = $('#nick').val();
218 if(!nick || nick.length != 32) 222 if(!nick || nick.length != 32)
219 return; 223 return;
220 Cookies.set('nick', nick, { path: '' }); 224 Cookies.set('nick', nick, { path: '' });
221 result = nick; 225 result = nick;
222 226
223 // Retrieve the contents of the shared file. 227 // Retrieve the contents of the shared file.
-   228 $('#editor').trumbowyg('disable');
224 $.post('text.php', 229 $.post('text.php',
225 { 230 {
226 timestamp: window.performance.now(), 231 timestamp: window.performance.now(),
227 fingerprint: nick, 232 fingerprint: nick,
228 action: 'LOAD' 233 action: 'LOAD'
229 }).done((data) => {; 234 }).done((data) => {;
230 $('#trumbowyg') 235 $('#trumbowyg')
231 .trumbowyg('html', data); 236 .trumbowyg('html', data);
232 $('#trumbowyg').trumbowyg('enable'); 237 $('#trumbowyg').trumbowyg('enable');
233 $('#trumbowyg').show(); 238 $('#trumbowyg').show();
234 239
235 if(fingerprint == nick) 240 if(fingerprint == nick)
236 $('#home-icon').addClass("text-success").removeClass("text-danger"); 241 $('#home-icon').addClass("text-success").removeClass("text-danger");
237 else 242 else
238 $('#home-icon').addClass("text-danger").removeClass("text-success"); 243 $('#home-icon').addClass("text-danger").removeClass("text-success");
239 244
240 }).fail(() => { 245 }).fail(() => {
241 $('#trumbowyg').trumbowyg('enable'); 246 $('#trumbowyg').trumbowyg('enable');
242 $('#trumbowyg').show(); 247 $('#trumbowyg').show();
243 }); 248 });
244 }); 249 });
245 250
246 // When the form is submitted, naigate to the fingerprint. 251 // When the form is submitted, naigate to the fingerprint.
247 $('#nick-form').submit((e) => { 252 $('#nick-form').submit((e) => {
248 e.preventDefault(); 253 e.preventDefault();
249 254
250 nick = $('#nick').val(); 255 nick = $('#nick').val();
251 if(!nick || nick.length != 32) 256 if(!nick || nick.length != 32)
252 return; 257 return;
253 Cookies.set('nick', nick, { path: '' }); 258 Cookies.set('nick', nick, { path: '' });
254 result = nick; 259 result = nick;
255 260
256 // Retrieve the contents of the shared file. 261 // Retrieve the contents of the shared file.
-   262 $('#editor').trumbowyg('disable');
257 $.post('text.php', 263 $.post('text.php',
258 { 264 {
259 timestamp: window.performance.now(), 265 timestamp: window.performance.now(),
260 fingerprint: nick, 266 fingerprint: nick,
261 action: 'LOAD' 267 action: 'LOAD'
262 }).done((data) => {; 268 }).done((data) => {;
263 $('#trumbowyg') 269 $('#trumbowyg')
264 .trumbowyg('html', data); 270 .trumbowyg('html', data);
265 $('#trumbowyg').trumbowyg('enable'); 271 $('#trumbowyg').trumbowyg('enable');
266 $('#trumbowyg').show(); 272 $('#trumbowyg').show();
267 273
268 if(fingerprint == nick) 274 if(fingerprint == nick)
269 $('#home-icon').addClass("text-success").removeClass("text-danger"); 275 $('#home-icon').addClass("text-success").removeClass("text-danger");
270 else 276 else
271 $('#home-icon').addClass("text-danger").removeClass("text-success"); 277 $('#home-icon').addClass("text-danger").removeClass("text-success");
272 278
273 }).fail(() => { 279 }).fail(() => {
274 $('#trumbowyg').trumbowyg('enable'); 280 $('#trumbowyg').trumbowyg('enable');
275 $('#trumbowyg').show(); 281 $('#trumbowyg').show();
276 }); 282 });
277 }); 283 });
278 284
279 // While the nick is changing, navigate to the changed fingerprint. 285 // While the nick is changing, navigate to the changed fingerprint.
280 $("#nick").on('input', () => { 286 $("#nick").on('input', () => {
281 nick = $('#nick').val(); 287 nick = $('#nick').val();
282 if(!nick || nick.length != 32) 288 if(!nick || nick.length != 32)
283 return; 289 return;
284 Cookies.set('nick', nick, { path: '' }); 290 Cookies.set('nick', nick, { path: '' });
285 result = nick; 291 result = nick;
286 292
287 // Retrieve the contents of the shared file. 293 // Retrieve the contents of the shared file.
-   294 $('#editor').trumbowyg('disable');
288 $.post('text.php', 295 $.post('text.php',
289 { 296 {
290 timestamp: window.performance.now(), 297 timestamp: window.performance.now(),
291 fingerprint: nick, 298 fingerprint: nick,
292 action: 'LOAD' 299 action: 'LOAD'
293 }).done((data) => {; 300 }).done((data) => {;
294 $('#trumbowyg') 301 $('#trumbowyg')
295 .trumbowyg('html', data); 302 .trumbowyg('html', data);
296 $('#trumbowyg').trumbowyg('enable'); 303 $('#trumbowyg').trumbowyg('enable');
297 $('#trumbowyg').show(); 304 $('#trumbowyg').show();
298 305
299 if(fingerprint == nick) 306 if(fingerprint == nick)
300 $('#home-icon').addClass("text-success").removeClass("text-danger"); 307 $('#home-icon').addClass("text-success").removeClass("text-danger");
301 else 308 else
302 $('#home-icon').addClass("text-danger").removeClass("text-success"); 309 $('#home-icon').addClass("text-danger").removeClass("text-success");
303 }).fail(() => { 310 }).fail(() => {
304 $('#trumbowyg').trumbowyg('enable'); 311 $('#trumbowyg').trumbowyg('enable');
305 $('#trumbowyg').show(); 312 $('#trumbowyg').show();
306 }); 313 });
307 }); 314 });
308 315
309 // When the reset button is pressed, navigate to the fingerprint. 316 // When the reset button is pressed, navigate to the fingerprint.
310 $('#reset').click(() => { 317 $('#reset').click(() => {
311 Cookies.set('nick', fingerprint, { path: '' }); 318 Cookies.set('nick', fingerprint, { path: '' });
312 $('#nick').val(fingerprint); 319 $('#nick').val(fingerprint);
313 result = fingerprint; 320 result = fingerprint;
314 nick = fingerprint; 321 nick = fingerprint;
315 322
316 // Retrieve the contents of the shared file. 323 // Retrieve the contents of the shared file.
-   324 $('#editor').trumbowyg('disable');
317 $.post('text.php', 325 $.post('text.php',
318 { 326 {
319 timestamp: window.performance.now(), 327 timestamp: window.performance.now(),
320 fingerprint: fingerprint, 328 fingerprint: fingerprint,
321 action: 'LOAD' 329 action: 'LOAD'
322 }).done((data) => {; 330 }).done((data) => {;
323 $('#trumbowyg') 331 $('#trumbowyg')
324 .trumbowyg('html', data); 332 .trumbowyg('html', data);
325 $('#trumbowyg').trumbowyg('enable'); 333 $('#trumbowyg').trumbowyg('enable');
326 $('#trumbowyg').show(); 334 $('#trumbowyg').show();
327 335
328 if(fingerprint == nick) 336 if(fingerprint == nick)
329 $('#home-icon').addClass("text-success").removeClass("text-danger"); 337 $('#home-icon').addClass("text-success").removeClass("text-danger");
330 else 338 else
331 $('#home-icon').addClass("text-danger").removeClass("text-success"); 339 $('#home-icon').addClass("text-danger").removeClass("text-success");
332 }).fail(() => { 340 }).fail(() => {
333 $('#trumbowyg').trumbowyg('enable'); 341 $('#trumbowyg').trumbowyg('enable');
334 $('#trumbowyg').show(); 342 $('#trumbowyg').show();
335 }); 343 });
336 }); 344 });
337 }); 345 });
338 }); 346 });
339 </script> 347 </script>
340 </body> 348 </body>
341 </html> 349 </html>
342   350