PluginProbe
Booking Calendar / 11.4.2
Booking Calendar v11.4.2
11.9 11.8.4 11.8.3 11.8.2 11.8.1 11.8 11.7 11.6.1 11.6 11.5 11.4.3 11.4.2 11.4.1 11.4 11.3 11.2.1 11.2 11.1 11.0 10.15.7 10.15.6 10.1.3 10.10 10.10.1 10.10.2 All 205 releases
booking / includes / page-bookings / _out / bookings__listing.js

bookings__listing.js in Booking Calendar 11.4.2, at includes/page-bookings/_out/bookings__listing.js

503 lines 74.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 "use strict";
2
3 jQuery('body').on({
4 'touchmove': function (e) {
5 jQuery('.timespartly').each(function (index) {
6 var td_el = jQuery(this).get(0);
7 if (undefined != td_el._tippy) {
8 var instance = td_el._tippy;
9 instance.hide();
10 }
11 });
12 }
13 });
14
15 /**
16 * Request Object
17 * Here we can define Search parameters and Update it later, when some parameter was changed
18 *
19 */
20 var wpbc_ajx_booking_listing = function (obj, $) {
21 // Secure parameters for Ajax ------------------------------------------------------------------------------------
22 var p_secure = obj.security_obj = obj.security_obj || {
23 user_id: 0,
24 nonce: '',
25 locale: ''
26 };
27 obj.set_secure_param = function (param_key, param_val) {
28 p_secure[param_key] = param_val;
29 };
30 obj.get_secure_param = function (param_key) {
31 return p_secure[param_key];
32 };
33
34 // Listing Search parameters ------------------------------------------------------------------------------------
35 var p_listing = obj.search_request_obj = obj.search_request_obj || {
36 sort: "booking_id",
37 sort_type: "DESC",
38 page_num: 1,
39 page_items_count: 10,
40 create_date: "",
41 keyword: "",
42 source: ""
43 };
44 obj.search_set_all_params = function (request_param_obj) {
45 p_listing = request_param_obj;
46 };
47 obj.search_get_all_params = function () {
48 return p_listing;
49 };
50 obj.search_get_param = function (param_key) {
51 return p_listing[param_key];
52 };
53 obj.search_set_param = function (param_key, param_val) {
54 // if ( Array.isArray( param_val ) ){
55 // param_val = JSON.stringify( param_val );
56 // }
57 p_listing[param_key] = param_val;
58 };
59 obj.search_set_params_arr = function (params_arr) {
60 _.each(params_arr, function (p_val, p_key, p_data) {
61 // Define different Search parameters for request
62 this.search_set_param(p_key, p_val);
63 });
64 };
65
66 // Other parameters ------------------------------------------------------------------------------------
67 var p_other = obj.other_obj = obj.other_obj || {};
68 obj.set_other_param = function (param_key, param_val) {
69 p_other[param_key] = param_val;
70 };
71 obj.get_other_param = function (param_key) {
72 return p_other[param_key];
73 };
74 return obj;
75 }(wpbc_ajx_booking_listing || {}, jQuery);
76
77 /**
78 * Ajax ------------------------------------------------------------------------------------------------------ */
79
80 /**
81 * Send Ajax search request
82 * for searching specific Keyword and other params
83 */
84 function wpbc_ajx_booking_ajax_search_request() {
85 console.groupCollapsed('AJX_BOOKING_LISTING');
86 console.log(' == Before Ajax Send - search_get_all_params() == ', wpbc_ajx_booking_listing.search_get_all_params());
87 wpbc_booking_listing_reload_button__spin_start();
88 wpbc_booking_listing_reload__message_show();
89
90 /*
91 //FixIn: forVideo
92 if ( ! is_this_action ){
93 //wpbc_ajx_booking__actual_listing__hide();
94 jQuery( wpbc_ajx_booking_listing.get_other_param( 'listing_container' ) ).html(
95 '<div style="width:100%;text-align: center;" id="wpbc_loading_section"><span class="wpbc_icn_autorenew wpbc_spin"></span></div>'
96 + jQuery( wpbc_ajx_booking_listing.get_other_param( 'listing_container' ) ).html()
97 );
98 if ( 'function' === typeof (jQuery( '#wpbc_loading_section' ).wpbc_my_modal) ){ // FixIn: 9.0.1.5.
99 jQuery( '#wpbc_loading_section' ).wpbc_my_modal( 'show' );
100 } else {
101 alert( 'Warning! Booking Calendar. Its seems that you have deactivated loading of Bootstrap JS files at Booking Settings General page in Advanced section.' )
102 }
103 }
104 is_this_action = false;
105 */
106 // Start Ajax
107 jQuery.post(wpbc_url_ajax, {
108 action: 'WPBC_AJX_BOOKING_LISTING',
109 wpbc_ajx_user_id: wpbc_ajx_booking_listing.get_secure_param('user_id'),
110 nonce: wpbc_ajx_booking_listing.get_secure_param('nonce'),
111 wpbc_ajx_locale: wpbc_ajx_booking_listing.get_secure_param('locale'),
112 search_params: wpbc_ajx_booking_listing.search_get_all_params()
113 },
114 /**
115 * S u c c e s s
116 *
117 * @param response_data - its object returned from Ajax - class-live-searcg.php
118 * @param textStatus - 'success'
119 * @param jqXHR - Object
120 */
121 function (response_data, textStatus, jqXHR) {
122 //FixIn: forVideo
123 //jQuery( '#wpbc_loading_section' ).wpbc_my_modal( 'hide' );
124
125 try {
126 console.log(' == Response WPBC_AJX_BOOKING_LISTING == ', response_data);
127 console.groupEnd();
128 // Probably Error
129 if (typeof response_data !== 'object' || response_data === null) {
130 jQuery('.wpbc_ajx_under_toolbar_row').hide(); // FixIn: 9.6.1.5.
131 wpbc_booking_listing_reload_button__spin_pause();
132 wpbc_booking_listing_reload__message_hide();
133 jQuery(wpbc_ajx_booking_listing.get_other_param('listing_container')).html('<div class="wpbc-settings-notice notice-warning" style="text-align:left">' + response_data + '</div>');
134 return;
135 }
136
137 // Reload page, after filter toolbar was reseted
138 if (undefined != response_data['ajx_cleaned_params'] && 'reset_done' === response_data['ajx_cleaned_params']['ui_reset']) {
139 wpbc_booking_listing_reload__message_hide();
140 window.location.href = response_data['ajx_cleaned_params']['ui_reset_url'];
141 // location.reload();
142 return;
143 }
144
145 // Show listing
146 if (response_data['ajx_count'] > 0) {
147 wpbc_ajx_booking_show_listing(response_data['ajx_items'], response_data['ajx_search_params'], response_data['ajx_booking_resources']);
148 wpbc_pagination_echo(wpbc_ajx_booking_listing.get_other_param('pagination_container'), wpbc_ajx_booking_listing.get_other_param('pagination_container_header'), wpbc_ajx_booking_listing.get_other_param('pagination_container_footer'), {
149 'page_active': response_data['ajx_search_params']['page_num'],
150 'pages_count': Math.ceil(response_data['ajx_count'] / response_data['ajx_search_params']['page_items_count']),
151 'page_items_count': response_data['ajx_search_params']['page_items_count'],
152 'sort_type': response_data['ajx_search_params']['sort_type'],
153 'total_count': response_data['ajx_count']
154 });
155 wpbc_ajx_booking_define_ui_hooks(); // Redefine Hooks, because we show new DOM elements
156 } else {
157 wpbc_ajx_booking__actual_listing__hide();
158 jQuery(wpbc_ajx_booking_listing.get_other_param('listing_container')).html('<div class="wpbc-settings-notice0 notice-warning0" style="text-align:center;font-size: 15px;margin: 2em 0;">' + '<p><strong>No results found for current filter options...</strong></p>' + '<p><strong><a href="javascript:void(0)" ' + ' onclick="javascript:wpbc_ajx_booking_send_search_request_with_params( {' + ' \'ui_reset\': \'make_reset\', ' + ' \'page_num\': 1 ' + '} );">Reset filters</a> to show all bookings.</strong></p>' + '</div>');
159 }
160
161 // Update new booking count
162 if (undefined !== response_data['ajx_new_bookings_count']) {
163 var ajx_new_bookings_count = parseInt(response_data['ajx_new_bookings_count']);
164 if (ajx_new_bookings_count > 0) {
165 jQuery('.wpbc_badge_count').show();
166 }
167 jQuery('.bk-update-count').html(ajx_new_bookings_count);
168 }
169 wpbc_booking_listing_reload_button__spin_pause();
170 wpbc_booking_listing_reload__message_hide();
171 jQuery('#ajax_respond').html(response_data); // For ability to show response, add such DIV element to page
172 } finally {
173 wpbc_booking_listing_reload_button__spin_pause();
174 wpbc_booking_listing_reload__message_hide();
175 }
176 }).fail(function (jqXHR, textStatus, errorThrown) {
177 if (window.console && window.console.log) {
178 console.log('Ajax_Error', jqXHR, textStatus, errorThrown);
179 }
180 jQuery('.wpbc_ajx_under_toolbar_row').hide(); // FixIn: 9.6.1.5.
181 wpbc_booking_listing_reload_button__spin_pause();
182 wpbc_booking_listing_reload__message_hide();
183 var error_message = '<strong>' + 'Error!' + '</strong> ' + errorThrown;
184 if (jqXHR.responseText) {
185 error_message += jqXHR.responseText;
186 }
187 error_message = error_message.replace(/\n/g, "<br />");
188 wpbc_ajx_booking_show_message(error_message);
189 })
190 // .done( function ( data, textStatus, jqXHR ) { if ( window.console && window.console.log ){ console.log( 'second success', data, textStatus, jqXHR ); } })
191 // .always( function ( data_jqXHR, textStatus, jqXHR_errorThrown ) { if ( window.console && window.console.log ){ console.log( 'always finished', data_jqXHR, textStatus, jqXHR_errorThrown ); } })
192 ; // End Ajax
193 }
194
195 /**
196 * Views ----------------------------------------------------------------------------------------------------- */
197
198 /**
199 * Show Listing Table and define gMail checkbox hooks
200 *
201 * @param json_items_arr - JSON object with Items
202 * @param json_search_params - JSON object with Search
203 */
204 function wpbc_ajx_booking_show_listing(json_items_arr, json_search_params, json_booking_resources) {
205 wpbc_ajx_define_templates__resource_manipulation(json_items_arr, json_search_params, json_booking_resources);
206
207 //console.log( 'json_items_arr' , json_items_arr, json_search_params );
208 jQuery('.wpbc_ajx_under_toolbar_row').css("display", "flex"); // FixIn: 9.6.1.5.
209 var list_header_tpl = wp.template('wpbc_ajx_booking_list_header');
210 var list_footer_tpl = wp.template('wpbc_ajx_booking_list_footer');
211 var list_row_tpl = wp.template('wpbc_ajx_booking_list_row');
212
213 // Header.
214 jQuery(wpbc_ajx_booking_listing.get_other_param('listing_container')).html(list_header_tpl());
215 // Send to template all request params: jQuery( wpbc_ajx_booking_listing.get_other_param( 'listing_container' ) ).html( list_header_tpl(wpbc_ajx_booking_listing.search_get_all_params()) );
216 // Body.
217 jQuery(wpbc_ajx_booking_listing.get_other_param('listing_container')).append('<div class="wpbc_selectable_body"></div>');
218 // Footer.
219 jQuery(wpbc_ajx_booking_listing.get_other_param('listing_container')).append(list_footer_tpl());
220
221 // R o w s
222 console.groupCollapsed('LISTING_ROWS'); // LISTING_ROWS
223 _.each(json_items_arr, function (p_val, p_key, p_data) {
224 if ('undefined' !== typeof json_search_params['keyword']) {
225 // Parameter for marking keyword with different color in a list
226 p_val['__search_request_keyword__'] = json_search_params['keyword'];
227 } else {
228 p_val['__search_request_keyword__'] = '';
229 }
230 p_val['booking_resources'] = json_booking_resources;
231 jQuery(wpbc_ajx_booking_listing.get_other_param('listing_container') + ' .wpbc_selectable_body').append(list_row_tpl(p_val));
232 });
233 console.groupEnd(); // LISTING_ROWS
234
235 wpbc_define_gmail_checkbox_selection(jQuery); // Redefine Hooks for clicking at Checkboxes
236 }
237
238 /**
239 * Define template for changing booking resources & update it each time, when listing updating, useful for showing actual booking resources.
240 *
241 * @param json_items_arr - JSON object with Items
242 * @param json_search_params - JSON object with Search
243 * @param json_booking_resources - JSON object with Resources
244 */
245 function wpbc_ajx_define_templates__resource_manipulation(json_items_arr, json_search_params, json_booking_resources) {
246 // -------------------------------------------------------------------------------------------------------------
247 // New. 2025-04-21.
248 // -------------------------------------------------------------------------------------------------------------
249 // Change booking resource in Modal.
250 var modal__change_booking_resource = wp.template('wpbc_ajx__modal__change_booking_resource');
251 jQuery('#section_in_in_modal__change_booking_resource').html(modal__change_booking_resource({
252 'ajx_search_params': json_search_params,
253 'ajx_booking_resources': json_booking_resources
254 }));
255
256 // Duplicate booking into another resource in Modal. New. 2025-04-21.
257 var modal__duplicate_booking_to_other_resource = wp.template('wpbc_ajx__modal__duplicate_booking_to_other_resource');
258 jQuery('#section_in_in_modal__duplicate_booking_to_other_resource').html(modal__duplicate_booking_to_other_resource({
259 'ajx_search_params': json_search_params,
260 'ajx_booking_resources': json_booking_resources
261 }));
262 // -------------------------------------------------------------------------------------------------------------
263 }
264
265 /**
266 * Show just message instead of listing and hide pagination
267 */
268 function wpbc_ajx_booking_show_message(message) {
269 wpbc_ajx_booking__actual_listing__hide();
270 jQuery(wpbc_ajx_booking_listing.get_other_param('listing_container')).html('<div class="wpbc-settings-notice notice-warning" style="text-align:left">' + message + '</div>');
271 }
272
273 /**
274 * H o o k s - its Action/Times when need to re-Render Views ----------------------------------------------- */
275
276 /**
277 * Send Ajax Search Request after Updating search request parameters
278 *
279 * @param params_arr
280 */
281 function wpbc_ajx_booking_send_search_request_with_params(params_arr) {
282 // Define different Search parameters for request
283 _.each(params_arr, function (p_val, p_key, p_data) {
284 //console.log( 'Request for: ', p_key, p_val );
285 wpbc_ajx_booking_listing.search_set_param(p_key, p_val);
286 });
287
288 // Send Ajax Request
289 wpbc_ajx_booking_ajax_search_request();
290 }
291
292 /**
293 * Search request for "Page Number"
294 * @param page_number int
295 */
296 function wpbc_ajx_booking_pagination_click(page_number) {
297 wpbc_ajx_booking_send_search_request_with_params({
298 'page_num': page_number
299 });
300 }
301
302 /**
303 * Keyword Searching ----------------------------------------------------------------------------------------- */
304
305 /**
306 * Search request for "Keyword", also set current page to 1
307 *
308 * @param element_id - HTML ID of element, where was entered keyword
309 */
310 function wpbc_ajx_booking_send_search_request_for_keyword(element_id) {
311 // We need to Reset page_num to 1 with each new search, because we can be at page #4, but after new search we can have totally only 1 page
312 wpbc_ajx_booking_send_search_request_with_params({
313 'keyword': jQuery(element_id).val(),
314 'page_num': 1
315 });
316 }
317
318 /**
319 * Send search request after few seconds (usually after 1,5 sec)
320 * Closure function. Its useful, for do not send too many Ajax requests, when someone make fast typing.
321 */
322 var wpbc_ajx_booking_searching_after_few_seconds = function () {
323 var closed_timer = 0;
324 return function (element_id, timer_delay) {
325 // Get default value of "timer_delay", if parameter was not passed into the function.
326 timer_delay = typeof timer_delay !== 'undefined' ? timer_delay : 1500;
327 clearTimeout(closed_timer); // Clear previous timer
328
329 // Start new Timer
330 closed_timer = setTimeout(wpbc_ajx_booking_send_search_request_for_keyword.bind(null, element_id), timer_delay);
331 };
332 }();
333
334 /**
335 * Define Dynamic Hooks (like pagination click, which renew each time with new listing showing) ------------- */
336
337 /**
338 * Define HTML ui Hooks: on KeyUp | Change | -> Sort Order & Number Items / Page
339 * We are hcnaged it each time, when showing new listing, because DOM elements chnaged
340 */
341 function wpbc_ajx_booking_define_ui_hooks() {
342 if ('function' === typeof wpbc_define_tippy_tooltips) {
343 wpbc_define_tippy_tooltips('.wpbc__list__table ');
344 }
345 wpbc_ajx_booking__ui_define__locale();
346 wpbc_ajx_booking__ui_define__remark();
347 wpbc_boo_listing__init_hook__sort_by();
348
349 // Items Per Page.
350 jQuery('.wpbc_items_per_page').on('change', function (event) {
351 wpbc_ajx_booking_send_search_request_with_params({
352 'page_items_count': jQuery(this).val(),
353 'page_num': 1
354 });
355 });
356
357 // Sorting.
358 jQuery('.wpbc_items_sort_type').on('change', function (event) {
359 wpbc_ajx_booking_send_search_request_with_params({
360 'sort_type': jQuery(this).val()
361 });
362 });
363 }
364
365 /**
366 * Show / Hide Listing --------------------------------------------------------------------------------------- */
367
368 /**
369 * Show Listing Table - Sending Ajax Request - with parameters that we early defined in "wpbc_ajx_booking_listing" Obj.
370 */
371 function wpbc_ajx_booking__actual_listing__show() {
372 wpbc_ajx_booking_ajax_search_request(); // Send Ajax Request - with parameters that we early defined in "wpbc_ajx_booking_listing" Obj.
373 }
374
375 /**
376 * Hide Listing Table ( and Pagination )
377 */
378 function wpbc_ajx_booking__actual_listing__hide() {
379 jQuery('.wpbc_ajx_under_toolbar_row').hide(); // FixIn: 9.6.1.5.
380 jQuery(wpbc_ajx_booking_listing.get_other_param('listing_container')).html('');
381 jQuery(wpbc_ajx_booking_listing.get_other_param('pagination_container')).html('');
382 }
383
384 /**
385 * Support functions for Content Template data --------------------------------------------------------------- */
386
387 /**
388 * Highlight strings,
389 * by inserting <span class="fieldvalue name fieldsearchvalue">...</span> html elements into the string.
390 * @param {string} booking_details - Source string
391 * @param {string} booking_keyword - Keyword to highlight
392 * @returns {string}
393 */
394 function wpbc_get_highlighted_search_keyword(booking_details, booking_keyword) {
395 booking_keyword = booking_keyword.trim().toLowerCase();
396 if (0 == booking_keyword.length) {
397 return booking_details;
398 }
399
400 // Highlight substring withing HTML tags in "Content of booking fields data" -- e.g. starting from > and ending with <
401 let keywordRegex = new RegExp(`fieldvalue[^<>]*>([^<]*${booking_keyword}[^<]*)`, 'gim');
402
403 //let matches = [...booking_details.toLowerCase().matchAll( keywordRegex )];
404 let matches = booking_details.toLowerCase().matchAll(keywordRegex);
405 matches = Array.from(matches);
406 let strings_arr = [];
407 let pos_previous = 0;
408 let search_pos_start;
409 let search_pos_end;
410 for (const match of matches) {
411 search_pos_start = match.index + match[0].toLowerCase().indexOf('>', 0) + 1;
412 strings_arr.push(booking_details.substr(pos_previous, search_pos_start - pos_previous));
413 search_pos_end = booking_details.toLowerCase().indexOf('<', search_pos_start);
414 strings_arr.push('<span class="fieldvalue name fieldsearchvalue">' + booking_details.substr(search_pos_start, search_pos_end - search_pos_start) + '</span>');
415 pos_previous = search_pos_end;
416 }
417 strings_arr.push(booking_details.substr(pos_previous, booking_details.length - pos_previous));
418 return strings_arr.join('');
419 }
420
421 /**
422 * Convert special HTML characters from: &amp; -> &
423 *
424 * @param text
425 * @returns {*}
426 */
427 function wpbc_decode_HTML_entities(text) {
428 var textArea = document.createElement('textarea');
429 textArea.innerHTML = text;
430 return textArea.value;
431 }
432
433 /**
434 * Convert TO special HTML characters from: & -> &amp;
435 *
436 * @param text
437 * @returns {*}
438 */
439 function wpbc_encode_HTML_entities(text) {
440 var textArea = document.createElement('textarea');
441 textArea.innerText = text;
442 return textArea.innerHTML;
443 }
444
445 /**
446 * Support Functions - Spin Icon in Buttons ------------------------------------------------------------------ */
447
448 /**
449 * Spin button in Filter toolbar - Start
450 */
451 function wpbc_booking_listing_reload_button__spin_start() {
452 jQuery('#wpbc_booking_listing_reload_button .menu_icon.wpbc_spin').removeClass('wpbc_animation_pause');
453 }
454
455 /**
456 * Spin button in Filter toolbar - Pause
457 */
458 function wpbc_booking_listing_reload_button__spin_pause() {
459 jQuery('#wpbc_booking_listing_reload_button .menu_icon.wpbc_spin').addClass('wpbc_animation_pause');
460 }
461
462 /**
463 * Show visible feedback while Booking Listing is loading.
464 */
465 function wpbc_booking_listing_reload__message_show() {
466 var ajax_working = document.getElementById('ajax_working');
467 if (!ajax_working) {
468 return;
469 }
470 wpbc_booking_listing_reload__message_hide();
471 var listing_container = '';
472 if ('undefined' !== typeof wpbc_ajx_booking_listing && 'function' === typeof wpbc_ajx_booking_listing.get_other_param) {
473 listing_container = wpbc_ajx_booking_listing.get_other_param('listing_container');
474 }
475 if (listing_container && jQuery(listing_container).find('.wpbc_spins_loading_container').length) {
476 return;
477 }
478 var unique_div_id = 'wpbc_notice_' + new Date().getTime();
479 jQuery(ajax_working).append('<div id="' + unique_div_id + '" class="wpbc_booking_listing_reload_notice" style="opacity: 1;">' + '<div id="wpbc_alert_message" class="wpbc_alert_message">' + '<div class="wpbc_inner_message notice notice-info "> ' + '<a class="close" href="javascript:void(0)" onclick="javascript:jQuery(this).parent().hide();">&times;</a> ' + '<span class="wpdevelop wpbc_booking_listing_reload_processing">' + '<span class="wpbc_icn_rotate_right wpbc_spin wpbc_ajax_icon wpbc_processing wpbc_icn_autorenew" aria-hidden="true"></span>' + '</span> Loading bookings...' + '</div>' + '</div>' + '</div>');
480 }
481
482 /**
483 * Hide Booking Listing loading feedback.
484 */
485 function wpbc_booking_listing_reload__message_hide() {
486 jQuery('.wpbc_booking_listing_reload_notice').remove();
487 jQuery('.wpbc_booking_listing_reload_processing').closest('[id^="wpbc_notice_"], .wpbc_inner_message').remove();
488 }
489
490 /**
491 * Spin button in Filter toolbar - is Spinning ?
492 *
493 * @returns {boolean}
494 */
495 function wpbc_booking_listing_reload_button__is_spin() {
496 if (jQuery('#wpbc_booking_listing_reload_button .menu_icon.wpbc_spin').hasClass('wpbc_animation_pause')) {
497 return true;
498 } else {
499 return false;
500 }
501 }
502 //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5jbHVkZXMvcGFnZS1ib29raW5ncy9fb3V0L2Jvb2tpbmdzX19saXN0aW5nLmpzIiwibmFtZXMiOlsialF1ZXJ5Iiwib24iLCJ0b3VjaG1vdmUiLCJlIiwiZWFjaCIsImluZGV4IiwidGRfZWwiLCJnZXQiLCJ1bmRlZmluZWQiLCJfdGlwcHkiLCJpbnN0YW5jZSIsImhpZGUiLCJ3cGJjX2FqeF9ib29raW5nX2xpc3RpbmciLCJvYmoiLCIkIiwicF9zZWN1cmUiLCJzZWN1cml0eV9vYmoiLCJ1c2VyX2lkIiwibm9uY2UiLCJsb2NhbGUiLCJzZXRfc2VjdXJlX3BhcmFtIiwicGFyYW1fa2V5IiwicGFyYW1fdmFsIiwiZ2V0X3NlY3VyZV9wYXJhbSIsInBfbGlzdGluZyIsInNlYXJjaF9yZXF1ZXN0X29iaiIsInNvcnQiLCJzb3J0X3R5cGUiLCJwYWdlX251bSIsInBhZ2VfaXRlbXNfY291bnQiLCJjcmVhdGVfZGF0ZSIsImtleXdvcmQiLCJzb3VyY2UiLCJzZWFyY2hfc2V0X2FsbF9wYXJhbXMiLCJyZXF1ZXN0X3BhcmFtX29iaiIsInNlYXJjaF9nZXRfYWxsX3BhcmFtcyIsInNlYXJjaF9nZXRfcGFyYW0iLCJzZWFyY2hfc2V0X3BhcmFtIiwic2VhcmNoX3NldF9wYXJhbXNfYXJyIiwicGFyYW1zX2FyciIsIl8iLCJwX3ZhbCIsInBfa2V5IiwicF9kYXRhIiwicF9vdGhlciIsIm90aGVyX29iaiIsInNldF9vdGhlcl9wYXJhbSIsImdldF9vdGhlcl9wYXJhbSIsIndwYmNfYWp4X2Jvb2tpbmdfYWpheF9zZWFyY2hfcmVxdWVzdCIsImNvbnNvbGUiLCJncm91cENvbGxhcHNlZCIsImxvZyIsIndwYmNfYm9va2luZ19saXN0aW5nX3JlbG9hZF9idXR0b25fX3NwaW5fc3RhcnQiLCJ3cGJjX2Jvb2tpbmdfbGlzdGluZ19yZWxvYWRfX21lc3NhZ2Vfc2hvdyIsInBvc3QiLCJ3cGJjX3VybF9hamF4IiwiYWN0aW9uIiwid3BiY19hanhfdXNlcl9pZCIsIndwYmNfYWp4X2xvY2FsZSIsInNlYXJjaF9wYXJhbXMiLCJyZXNwb25zZV9kYXRhIiwidGV4dFN0YXR1cyIsImpxWEhSIiwiZ3JvdXBFbmQiLCJ3cGJjX2Jvb2tpbmdfbGlzdGluZ19yZWxvYWRfYnV0dG9uX19zcGluX3BhdXNlIiwid3BiY19ib29raW5nX2xpc3RpbmdfcmVsb2FkX19tZXNzYWdlX2hpZGUiLCJodG1sIiwid2luZG93IiwibG9jYXRpb24iLCJocmVmIiwid3BiY19hanhfYm9va2luZ19zaG93X2xpc3RpbmciLCJ3cGJjX3BhZ2luYXRpb25fZWNobyIsIk1hdGgiLCJjZWlsIiwid3BiY19hanhfYm9va2luZ19kZWZpbmVfdWlfaG9va3MiLCJ3cGJjX2FqeF9ib29raW5nX19hY3R1YWxfbGlzdGluZ19faGlkZSIsImFqeF9uZXdfYm9va2luZ3NfY291bnQiLCJwYXJzZUludCIsInNob3ciLCJmYWlsIiwiZXJyb3JUaHJvd24iLCJlcnJvcl9tZXNzYWdlIiwicmVzcG9uc2VUZXh0IiwicmVwbGFjZSIsIndwYmNfYWp4X2Jvb2tpbmdfc2hvd19tZXNzYWdlIiwianNvbl9pdGVtc19hcnIiLCJqc29uX3NlYXJjaF9wYXJhbXMiLCJqc29uX2Jvb2tpbmdfcmVzb3VyY2VzIiwid3BiY19hanhfZGVmaW5lX3RlbXBsYXRlc19fcmVzb3VyY2VfbWFuaXB1bGF0aW9uIiwiY3NzIiwibGlzdF9oZWFkZXJfdHBsIiwid3AiLCJ0ZW1wbGF0ZSIsImxpc3RfZm9vdGVyX3RwbCIsImxpc3Rfcm93X3RwbCIsImFwcGVuZCIsIndwYmNfZGVmaW5lX2dtYWlsX2NoZWNrYm94X3NlbGVjdGlvbiIsIm1vZGFsX19jaGFuZ2VfYm9va2luZ19yZXNvdXJjZSIsIm1vZGFsX19kdXBsaWNhdGVfYm9va2luZ190b19vdGhlcl9yZXNvdXJjZSIsIm1lc3NhZ2UiLCJ3cGJjX2FqeF9ib29raW5nX3NlbmRfc2VhcmNoX3JlcXVlc3Rfd2l0aF9wYXJhbXMiLCJ3cGJjX2FqeF9ib29raW5nX3BhZ2luYXRpb25fY2xpY2siLCJwYWdlX251bWJlciIsIndwYmNfYWp4X2Jvb2tpbmdfc2VuZF9zZWFyY2hfcmVxdWVzdF9mb3Jfa2V5d29yZCIsImVsZW1lbnRfaWQiLCJ2YWwiLCJ3cGJjX2FqeF9ib29raW5nX3NlYXJjaGluZ19hZnRlcl9mZXdfc2Vjb25kcyIsImNsb3NlZF90aW1lciIsInRpbWVyX2RlbGF5IiwiY2xlYXJUaW1lb3V0Iiwic2V0VGltZW91dCIsImJpbmQiLCJ3cGJjX2RlZmluZV90aXBweV90b29sdGlwcyIsIndwYmNfYWp4X2Jvb2tpbmdfX3VpX2RlZmluZV9fbG9jYWxlIiwid3BiY19hanhfYm9va2luZ19fdWlfZGVmaW5lX19yZW1hcmsiLCJ3cGJjX2Jvb19saXN0aW5nX19pbml0X2hvb2tfX3NvcnRfYnkiLCJldmVudCIsIndwYmNfYWp4X2Jvb2tpbmdfX2FjdHVhbF9saXN0aW5nX19zaG93Iiwid3BiY19nZXRfaGlnaGxpZ2h0ZWRfc2VhcmNoX2tleXdvcmQiLCJib29raW5nX2RldGFpbHMiLCJib29raW5nX2tleXdvcmQiLCJ0cmltIiwidG9Mb3dlckNhc2UiLCJsZW5ndGgiLCJrZXl3b3JkUmVnZXgiLCJSZWdFeHAiLCJtYXRjaGVzIiwibWF0Y2hBbGwiLCJBcnJheSIsImZyb20iLCJzdHJpbmdzX2FyciIsInBvc19wcmV2aW91cyIsInNlYXJjaF9wb3Nfc3RhcnQiLCJzZWFyY2hfcG9zX2VuZCIsIm1hdGNoIiwiaW5kZXhPZiIsInB1c2giLCJzdWJzdHIiLCJqb2luIiwid3BiY19kZWNvZGVfSFRNTF9lbnRpdGllcyIsInRleHQiLCJ0ZXh0QXJlYSIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsImlubmVySFRNTCIsInZhbHVlIiwid3BiY19lbmNvZGVfSFRNTF9lbnRpdGllcyIsImlubmVyVGV4dCIsInJlbW92ZUNsYXNzIiwiYWRkQ2xhc3MiLCJhamF4X3dvcmtpbmciLCJnZXRFbGVtZW50QnlJZCIsImxpc3RpbmdfY29udGFpbmVyIiwiZmluZCIsInVuaXF1ZV9kaXZfaWQiLCJEYXRlIiwiZ2V0VGltZSIsInJlbW92ZSIsImNsb3Nlc3QiLCJ3cGJjX2Jvb2tpbmdfbGlzdGluZ19yZWxvYWRfYnV0dG9uX19pc19zcGluIiwiaGFzQ2xhc3MiXSwic291cmNlcyI6WyJpbmNsdWRlcy9wYWdlLWJvb2tpbmdzL19zcmMvYm9va2luZ3NfX2xpc3RpbmcuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XHJcblxyXG5qUXVlcnkoJ2JvZHknKS5vbih7XHJcbiAgICAndG91Y2htb3ZlJzogZnVuY3Rpb24oZSkge1xyXG5cclxuXHRcdGpRdWVyeSggJy50aW1lc3BhcnRseScgKS5lYWNoKCBmdW5jdGlvbiAoIGluZGV4ICl7XHJcblxyXG5cdFx0XHR2YXIgdGRfZWwgPSBqUXVlcnkoIHRoaXMgKS5nZXQoIDAgKTtcclxuXHJcblx0XHRcdGlmICggKHVuZGVmaW5lZCAhPSB0ZF9lbC5fdGlwcHkpICl7XHJcblxyXG5cdFx0XHRcdHZhciBpbnN0YW5jZSA9IHRkX2VsLl90aXBweTtcclxuXHRcdFx0XHRpbnN0YW5jZS5oaWRlKCk7XHJcblx0XHRcdH1cclxuXHRcdH0gKTtcclxuXHR9XHJcbn0pO1xyXG5cclxuLyoqXHJcbiAqIFJlcXVlc3QgT2JqZWN0XHJcbiAqIEhlcmUgd2UgY2FuICBkZWZpbmUgU2VhcmNoIHBhcmFtZXRlcnMgYW5kIFVwZGF0ZSBpdCBsYXRlciwgIHdoZW4gIHNvbWUgcGFyYW1ldGVyIHdhcyBjaGFuZ2VkXHJcbiAqXHJcbiAqL1xyXG52YXIgd3BiY19hanhfYm9va2luZ19saXN0aW5nID0gKGZ1bmN0aW9uICggb2JqLCAkKSB7XHJcblxyXG5cdC8vIFNlY3VyZSBwYXJhbWV0ZXJzIGZvciBBamF4XHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHR2YXIgcF9zZWN1cmUgPSBvYmouc2VjdXJpdHlfb2JqID0gb2JqLnNlY3VyaXR5X29iaiB8fCB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVzZXJfaWQ6IDAsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG5vbmNlICA6ICcnLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsb2NhbGUgOiAnJ1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICB9O1xyXG5cclxuXHRvYmouc2V0X3NlY3VyZV9wYXJhbSA9IGZ1bmN0aW9uICggcGFyYW1fa2V5LCBwYXJhbV92YWwgKSB7XHJcblx0XHRwX3NlY3VyZVsgcGFyYW1fa2V5IF0gPSBwYXJhbV92YWw7XHJcblx0fTtcclxuXHJcblx0b2JqLmdldF9zZWN1cmVfcGFyYW0gPSBmdW5jdGlvbiAoIHBhcmFtX2tleSApIHtcclxuXHRcdHJldHVybiBwX3NlY3VyZVsgcGFyYW1fa2V5IF07XHJcblx0fTtcclxuXHJcblxyXG5cdC8vIExpc3RpbmcgU2VhcmNoIHBhcmFtZXRlcnNcdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdHZhciBwX2xpc3RpbmcgPSBvYmouc2VhcmNoX3JlcXVlc3Rfb2JqID0gb2JqLnNlYXJjaF9yZXF1ZXN0X29iaiB8fCB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHNvcnQgICAgICAgICAgICA6IFwiYm9va2luZ19pZFwiLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzb3J0X3R5cGUgICAgICAgOiBcIkRFU0NcIixcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cGFnZV9udW0gICAgICAgIDogMSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cGFnZV9pdGVtc19jb3VudDogMTAsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNyZWF0ZV9kYXRlICAgICA6IFwiXCIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGtleXdvcmQgICAgICAgICA6IFwiXCIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHNvdXJjZSAgICAgICAgICA6IFwiXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH07XHJcblxyXG5cdG9iai5zZWFyY2hfc2V0X2FsbF9wYXJhbXMgPSBmdW5jdGlvbiAoIHJlcXVlc3RfcGFyYW1fb2JqICkge1xyXG5cdFx0cF9saXN0aW5nID0gcmVxdWVzdF9wYXJhbV9vYmo7XHJcblx0fTtcclxuXHJcblx0b2JqLnNlYXJjaF9nZXRfYWxsX3BhcmFtcyA9IGZ1bmN0aW9uICgpIHtcclxuXHRcdHJldHVybiBwX2xpc3Rpbmc7XHJcblx0fTtcclxuXHJcblx0b2JqLnNlYXJjaF9nZXRfcGFyYW0gPSBmdW5jdGlvbiAoIHBhcmFtX2tleSApIHtcclxuXHRcdHJldHVybiBwX2xpc3RpbmdbIHBhcmFtX2tleSBdO1xyXG5cdH07XHJcblxyXG5cdG9iai5zZWFyY2hfc2V0X3BhcmFtID0gZnVuY3Rpb24gKCBwYXJhbV9rZXksIHBhcmFtX3ZhbCApIHtcclxuXHRcdC8vIGlmICggQXJyYXkuaXNBcnJheSggcGFyYW1fdmFsICkgKXtcclxuXHRcdC8vIFx0cGFyYW1fdmFsID0gSlNPTi5zdHJpbmdpZnkoIHBhcmFtX3ZhbCApO1xyXG5cdFx0Ly8gfVxyXG5cdFx0cF9saXN0aW5nWyBwYXJhbV9rZXkgXSA9IHBhcmFtX3ZhbDtcclxuXHR9O1xyXG5cclxuXHRvYmouc2VhcmNoX3NldF9wYXJhbXNfYXJyID0gZnVuY3Rpb24oIHBhcmFtc19hcnIgKXtcclxuXHRcdF8uZWFjaCggcGFyYW1zX2FyciwgZnVuY3Rpb24gKCBwX3ZhbCwgcF9rZXksIHBfZGF0YSApe1x0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIERlZmluZSBkaWZmZXJlbnQgU2VhcmNoICBwYXJhbWV0ZXJzIGZvciByZXF1ZXN0XHJcblx0XHRcdHRoaXMuc2VhcmNoX3NldF9wYXJhbSggcF9rZXksIHBfdmFsICk7XHJcblx0XHR9ICk7XHJcblx0fVxyXG5cclxuXHJcblx0Ly8gT3RoZXIgcGFyYW1ldGVycyBcdFx0XHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHR2YXIgcF9vdGhlciA9IG9iai5vdGhlcl9vYmogPSBvYmoub3RoZXJfb2JqIHx8IHsgfTtcclxuXHJcblx0b2JqLnNldF9vdGhlcl9wYXJhbSA9IGZ1bmN0aW9uICggcGFyYW1fa2V5LCBwYXJhbV92YWwgKSB7XHJcblx0XHRwX290aGVyWyBwYXJhbV9rZXkgXSA9IHBhcmFtX3ZhbDtcclxuXHR9O1xyXG5cclxuXHRvYmouZ2V0X290aGVyX3BhcmFtID0gZnVuY3Rpb24gKCBwYXJhbV9rZXkgKSB7XHJcblx0XHRyZXR1cm4gcF9vdGhlclsgcGFyYW1fa2V5IF07XHJcblx0fTtcclxuXHJcblxyXG5cdHJldHVybiBvYmo7XHJcbn0oIHdwYmNfYWp4X2Jvb2tpbmdfbGlzdGluZyB8fCB7fSwgalF1ZXJ5ICkpO1xyXG5cclxuXHJcbi8qKlxyXG4gKiAgIEFqYXggIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xyXG5cclxuLyoqXHJcbiAqIFNlbmQgQWpheCBzZWFyY2ggcmVxdWVzdFxyXG4gKiBmb3Igc2VhcmNoaW5nIHNwZWNpZmljIEtleXdvcmQgYW5kIG90aGVyIHBhcmFtc1xyXG4gKi9cclxuZnVuY3Rpb24gd3BiY19hanhfYm9va2luZ19hamF4X3NlYXJjaF9yZXF1ZXN0KCl7XHJcblxyXG5jb25zb2xlLmdyb3VwQ29sbGFwc2VkKCdBSlhfQk9PS0lOR19MSVNUSU5HJyk7IGNvbnNvbGUubG9nKCAnID09IEJlZm9yZSBBamF4IFNlbmQgLSBzZWFyY2hfZ2V0X2FsbF9wYXJhbXMoKSA9PSAnICwgd3BiY19hanhfYm9va2luZ19saXN0aW5nLnNlYXJjaF9nZXRfYWxsX3BhcmFtcygpICk7XHJcblxyXG5cdHdwYmNfYm9va2luZ19saXN0aW5nX3JlbG9hZF9idXR0b25fX3NwaW5fc3RhcnQoKTtcclxuXHR3cGJjX2Jvb2tpbmdfbGlzdGluZ19yZWxvYWRfX21lc3NhZ2Vfc2hvdygpO1xyXG5cclxuLypcclxuLy9GaXhJbjogZm9yVmlkZW9cclxuaWYgKCAhIGlzX3RoaXNfYWN0aW9uICl7XHJcblx0Ly93cGJjX2FqeF9ib29raW5nX19hY3R1YWxfbGlzdGluZ19faGlkZSgpO1xyXG5cdGpRdWVyeSggd3BiY19hanhfYm9va2luZ19saXN0aW5nLmdldF9vdGhlcl9wYXJhbSggJ2xpc3RpbmdfY29udGFpbmVyJyApICkuaHRtbChcclxuXHRcdCc8ZGl2IHN0eWxlPVwid2lkdGg6MTAwJTt0ZXh0LWFsaWduOiBjZW50ZXI7XCIgaWQ9XCJ3cGJjX2xvYWRpbmdfc2VjdGlvblwiPjxzcGFuIGNsYXNzPVwid3BiY19pY25fYXV0b3JlbmV3IHdwYmNfc3BpblwiPjwvc3Bhbj48L2Rpdj4nXHJcblx0XHQrIGpRdWVyeSggd3BiY19hanhfYm9va2luZ19saXN0aW5nLmdldF9vdGhlcl9wYXJhbSggJ2xpc3RpbmdfY29udGFpbmVyJyApICkuaHRtbCgpXHJcblx0KTtcclxuXHRpZiAoICdmdW5jdGlvbicgPT09IHR5cGVvZiAoalF1ZXJ5KCAnI3dwYmNfbG9hZGluZ19zZWN0aW9uJyApLndwYmNfbXlfbW9kYWwpICl7XHRcdFx0Ly8gRml4SW46IDkuMC4xLjUuXHJcblx0XHRqUXVlcnkoICcjd3BiY19sb2FkaW5nX3NlY3Rpb24nICkud3BiY19teV9tb2RhbCggJ3Nob3cnICk7XHJcblx0fSBlbHNlIHtcclxuXHRcdGFsZXJ0KCAnV2FybmluZyEgQm9va2luZyBDYWxlbmRhci4gSXRzIHNlZW1zIHRoYXQgIHlvdSBoYXZlIGRlYWN0aXZhdGVkIGxvYWRpbmcgb2YgQm9vdHN0cmFwIEpTIGZpbGVzIGF0IEJvb2tpbmcgU2V0dGluZ3MgR2VuZXJhbCBwYWdlIGluIEFkdmFuY2VkIHNlY3Rpb24uJyApXHJcblx0fVxyXG59XHJcbmlzX3RoaXNfYWN0aW9uID0gZmFsc2U7XHJcbiovXHJcblx0Ly8gU3RhcnQgQWpheFxyXG5cdGpRdWVyeS5wb3N0KCB3cGJjX3VybF9hamF4LFxyXG5cdFx0XHRcdHtcclxuXHRcdFx0XHRcdGFjdGlvbiAgICAgICAgICA6ICdXUEJDX0FKWF9CT09LSU5HX0xJU1RJTkcnLFxyXG5cdFx0XHRcdFx0d3BiY19hanhfdXNlcl9pZDogd3BiY19hanhfYm9va2luZ19saXN0aW5nLmdldF9zZWN1cmVfcGFyYW0oICd1c2VyX2lkJyApLFxyXG5cdFx0XHRcdFx0bm9uY2UgICAgICAgICAgIDogd3BiY19hanhfYm9va2luZ19saXN0aW5nLmdldF9zZWN1cmVfcGFyYW0oICdub25jZScgKSxcclxuXHRcdFx0XHRcdHdwYmNfYWp4X2xvY2FsZSA6IHdwYmNfYWp4X2Jvb2tpbmdfbGlzdGluZy5nZXRfc2VjdXJlX3BhcmFtKCAnbG9jYWxlJyApLFxyXG5cclxuXHRcdFx0XHRcdHNlYXJjaF9wYXJhbXNcdDogd3BiY19hanhfYm9va2luZ19saXN0aW5nLnNlYXJjaF9nZXRfYWxsX3BhcmFtcygpXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHQvKipcclxuXHRcdFx0XHQgKiBTIHUgYyBjIGUgcyBzXHJcblx0XHRcdFx0ICpcclxuXHRcdFx0XHQgKiBAcGFyYW0gcmVzcG9uc2VfZGF0YVx0XHQtXHRpdHMgb2JqZWN0IHJldHVybmVkIGZyb20gIEFqYXggLSBjbGFzcy1saXZlLXNlYXJjZy5waHBcclxuXHRcdFx0XHQgKiBAcGFyYW0gdGV4dFN0YXR1c1x0XHQtXHQnc3VjY2VzcydcclxuXHRcdFx0XHQgKiBAcGFyYW0ganFYSFJcdFx0XHRcdC1cdE9iamVjdFxyXG5cdFx0XHRcdCAqL1xyXG5cdFx0XHRcdGZ1bmN0aW9uICggcmVzcG9uc2VfZGF0YSwgdGV4dFN0YXR1cywganFYSFIgKSB7XHJcbi8vRml4SW46IGZvclZpZGVvXHJcbi8valF1ZXJ5KCAnI3dwYmNfbG9hZGluZ19zZWN0aW9uJyApLndwYmNfbXlfbW9kYWwoICdoaWRlJyApO1xyXG5cclxudHJ5IHtcclxuY29uc29sZS5sb2coICcgPT0gUmVzcG9uc2UgV1BCQ19BSlhfQk9PS0lOR19MSVNUSU5HID09ICcsIHJlc3BvbnNlX2RhdGEgKTsgY29uc29sZS5ncm91cEVuZCgpO1xyXG5cdFx0XHRcdFx0Ly8gUHJvYmFibHkgRXJyb3JcclxuXHRcdFx0XHRcdGlmICggKHR5cGVvZiByZXNwb25zZV9kYXRhICE9PSAnb2JqZWN0JykgfHwgKHJlc3BvbnNlX2RhdGEgPT09IG51bGwpICl7XHJcblx0XHRcdFx0XHRcdGpRdWVyeSggJy53cGJjX2FqeF91bmRlcl90b29sYmFyX3JvdycgKS5oaWRlKCk7XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBGaXhJbjogOS42LjEuNS5cclxuXHRcdFx0XHRcdFx0d3BiY19ib29raW5nX2xpc3RpbmdfcmVsb2FkX2J1dHRvbl9fc3Bpbl9wYXVzZSgpO1xyXG5cdFx0XHRcdFx0XHR3cGJjX2Jvb2tpbmdfbGlzdGluZ19yZWxvYWRfX21lc3NhZ2VfaGlkZSgpO1xyXG5cdFx0XHRcdFx0XHRqUXVlcnkoIHdwYmNfYWp4X2Jvb2tpbmdfbGlzdGluZy5nZXRfb3RoZXJfcGFyYW0oICdsaXN0aW5nX2NvbnRhaW5lcicgKSApLmh0bWwoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnPGRpdiBjbGFzcz1cIndwYmMtc2V0dGluZ3Mtbm90aWNlIG5vdGljZS13YXJuaW5nXCIgc3R5bGU9XCJ0ZXh0LWFsaWduOmxlZnRcIj4nICtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzcG9uc2VfZGF0YSArXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnPC9kaXY+J1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Ly8gUmVsb2FkIHBhZ2UsIGFmdGVyIGZpbHRlciB0b29sYmFyIHdhcyByZXNldGVkXHJcblx0XHRcdFx0XHRpZiAoICAgICAgICggICAgIHVuZGVmaW5lZCAhPSByZXNwb25zZV9kYXRhWyAnYWp4X2NsZWFuZWRfcGFyYW1zJyBdKVxyXG5cdFx0XHRcdFx0XHRcdCYmICggJ3Jlc2V0X2RvbmUnID09PSByZXNwb25zZV9kYXRhWyAnYWp4X2NsZWFuZWRfcGFyYW1zJyBdWyAndWlfcmVzZXQnIF0pXHJcblx0XHRcdFx0XHQpe1xyXG5cdFx0XHRcdFx0XHR3cGJjX2Jvb2tpbmdfbGlzdGluZ19yZWxvYWRfX21lc3NhZ2VfaGlkZSgpO1xyXG5cdFx0XHRcdFx0XHR3aW5kb3cubG9jYXRpb24uaHJlZiA9IHJlc3BvbnNlX2RhdGFbICdhanhfY2xlYW5lZF9wYXJhbXMnIF1bJ3VpX3Jlc2V0X3VybCddO1xyXG5cdFx0XHRcdFx0XHQvLyBsb2NhdGlvbi5yZWxvYWQoKTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8vIFNob3cgbGlzdGluZ1xyXG5cdFx0XHRcdFx0aWYgKCByZXNwb25zZV9kYXRhWyAnYWp4X2NvdW50JyBdID4gMCApe1xyXG5cclxuXHRcdFx0XHRcdFx0d3BiY19hanhfYm9va2luZ19zaG93X2xpc3RpbmcoIHJlc3BvbnNlX2RhdGFbICdhanhfaXRlbXMnIF0sIHJlc3BvbnNlX2RhdGFbICdhanhfc2VhcmNoX3BhcmFtcycgXSwgcmVzcG9uc2VfZGF0YVsgJ2FqeF9ib29raW5nX3Jlc291cmNlcycgXSApO1xyXG5cclxuXHRcdFx0XHRcdFx0d3BiY19wYWdpbmF0aW9uX2VjaG8oXHJcblx0XHRcdFx0XHRcdFx0d3BiY19hanhfYm9va2luZ19saXN0aW5nLmdldF9vdGhlcl9wYXJhbSggJ3BhZ2luYXRpb25fY29udGFpbmVyJyApLFxyXG5cdFx0XHRcdFx0XHRcdHdwYmNfYWp4X2Jvb2tpbmdfbGlzdGluZy5nZXRfb3RoZXJfcGFyYW0oICdwYWdpbmF0aW9uX2NvbnRhaW5lcl9oZWFkZXInICksXHJcblx0XHRcdFx0XHRcdFx0d3BiY19hanhfYm9va2luZ19saXN0aW5nLmdldF9vdGhlcl9wYXJhbSggJ3BhZ2luYXRpb25fY29udGFpbmVyX2Zvb3RlcicgKSxcclxuXHRcdFx0XHRcdFx0XHR7XHJcblx0XHRcdFx0XHRcdFx0XHQncGFnZV9hY3RpdmUnOiByZXNwb25zZV9kYXRhWyAnYWp4X3NlYXJjaF9wYXJhbXMnIF1bICdwYWdlX251bScgXSxcclxuXHRcdFx0XHRcdFx0XHRcdCdwYWdlc19jb3VudCc6IE1hdGguY2VpbCggcmVzcG9uc2VfZGF0YVsgJ2FqeF9jb3VudCcgXSAvIHJlc3BvbnNlX2RhdGFbICdhanhfc2VhcmNoX3BhcmFtcycgXVsgJ3BhZ2VfaXRlbXNfY291bnQnIF0gKSxcclxuXHJcblx0XHRcdFx0XHRcdFx0XHQncGFnZV9pdGVtc19jb3VudCc6IHJlc3BvbnNlX2RhdGFbICdhanhfc2VhcmNoX3BhcmFtcycgXVsgJ3BhZ2VfaXRlbXNfY291bnQnIF0sXHJcblx0XHRcdFx0XHRcdFx0XHQnc29ydF90eXBlJyAgICAgICA6IHJlc3BvbnNlX2RhdGFbICdhanhfc2VhcmNoX3BhcmFtcycgXVsgJ3NvcnRfdHlwZScgXSxcclxuXHRcdFx0XHRcdFx0XHRcdCd0b3RhbF9jb3VudCcgICAgIDogcmVzcG9uc2VfZGF0YVsgJ2FqeF9jb3VudCcgXSxcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdHdwYmNfYWp4X2Jvb2tpbmdfZGVmaW5lX3VpX2hvb2tzKCk7XHRcdFx0XHRcdFx0Ly8gUmVkZWZpbmUgSG9va3MsIGJlY2F1c2Ugd2Ugc2hvdyBuZXcgRE9NIGVsZW1lbnRzXHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdHdwYmNfYWp4X2Jvb2tpbmdfX2FjdHVhbF9saXN0aW5nX19oaWRlKCk7XHJcblx0XHRcdFx0XHRcdGpRdWVyeSggd3BiY19hanhfYm9va2luZ19saXN0aW5nLmdldF9vdGhlcl9wYXJhbSggJ2xpc3RpbmdfY29udGFpbmVyJyApICkuaHRtbChcclxuXHRcdFx0XHRcdFx0XHQnPGRpdiBjbGFzcz1cIndwYmMtc2V0dGluZ3Mtbm90aWNlMCBub3RpY2Utd2FybmluZzBcIiBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO2ZvbnQtc2l6ZTogMTVweDttYXJnaW46IDJlbSAwO1wiPicgK1xyXG5cdFx0XHRcdFx0XHRcdFx0JzxwPjxzdHJvbmc+Tm8gcmVzdWx0cyBmb3VuZCBmb3IgY3VycmVudCBmaWx0ZXIgb3B0aW9ucy4uLjwvc3Ryb25nPjwvcD4nICtcclxuXHRcdFx0XHRcdFx0XHRcdCc8cD48c3Ryb25nPjxhICBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCIgJyArXHJcblx0XHRcdFx0XHRcdFx0XHRcdCcgb25jbGljaz1cImphdmFzY3JpcHQ6d3BiY19hanhfYm9va2luZ19zZW5kX3NlYXJjaF9yZXF1ZXN0X3dpdGhfcGFyYW1zKCB7JyArXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0JyBcXCd1aV9yZXNldFxcJzogXFwnbWFrZV9yZXNldFxcJywgJyArXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0JyBcXCdwYWdlX251bVxcJzogMSAnICtcclxuXHRcdFx0XHRcdFx0XHRcdFx0J30gKTtcIj5SZXNldCBmaWx0ZXJzPC9hPiB0byBzaG93IGFsbCBib29raW5ncy48L3N0cm9uZz48L3A+JyArXHJcblx0XHRcdFx0XHRcdFx0JzwvZGl2PidcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvLyBVcGRhdGUgbmV3IGJvb2tpbmcgY291bnRcclxuXHRcdFx0XHRcdGlmICggdW5kZWZpbmVkICE9PSByZXNwb25zZV9kYXRhWyAnYWp4X25ld19ib29raW5nc19jb3VudCcgXSApe1xyXG5cdFx0XHRcdFx0XHR2YXIgYWp4X25ld19ib29raW5nc19jb3VudCA9IHBhcnNlSW50KCByZXNwb25zZV9kYXRhWyAnYWp4X25ld19ib29raW5nc19jb3VudCcgXSApXHJcblx0XHRcdFx0XHRcdGlmIChhanhfbmV3X2Jvb2tpbmdzX2NvdW50PjApe1xyXG5cdFx0XHRcdFx0XHRcdGpRdWVyeSggJy53cGJjX2JhZGdlX2NvdW50JyApLnNob3coKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRqUXVlcnkoICcuYmstdXBkYXRlLWNvdW50JyApLmh0bWwoIGFqeF9uZXdfYm9va2luZ3NfY291bnQgKTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR3cGJjX2Jvb2tpbmdfbGlzdGluZ19yZWxvYWRfYnV0dG9uX19zcGluX3BhdXNlKCk7XHJcblx0XHRcdFx0XHR3cGJjX2Jvb2tpbmdfbGlzdGluZ19yZWxvYWRfX21lc3NhZ2VfaGlkZSgpO1xyXG5cclxuXHRcdFx0XHRcdGpRdWVyeSggJyNhamF4X3Jlc3BvbmQnICkuaHRtbCggcmVzcG9uc2VfZGF0YSApO1x0XHQvLyBGb3IgYWJpbGl0eSB0byBzaG93IHJlc3BvbnNlLCBhZGQgc3VjaCBESVYgZWxlbWVudCB0byBwYWdlXHJcbn0gZmluYWxseSB7XHJcblx0XHRcdFx0XHR3cGJjX2Jvb2tpbmdfbGlzdGluZ19yZWxvYWRfYnV0dG9uX19zcGluX3BhdXNlKCk7XHJcblx0XHRcdFx0XHR3cGJjX2Jvb2tpbmdfbGlzdGluZ19yZWxvYWRfX21lc3NhZ2VfaGlkZSgpO1xyXG59XHJcblx0XHRcdFx0fVxyXG5cdFx0XHQgICkuZmFpbCggZnVuY3Rpb24gKCBqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24gKSB7ICAgIGlmICggd2luZG93LmNvbnNvbGUgJiYgd2luZG93LmNvbnNvbGUubG9nICl7IGNvbnNvbGUubG9nKCAnQWpheF9FcnJvcicsIGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93biApOyB9XHJcblx0XHRcdFx0XHRqUXVlcnkoICcud3BiY19hanhfdW5kZXJfdG9vbGJhcl9yb3cnICkuaGlkZSgpO1x0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBGaXhJbjogOS42LjEuNS5cclxuXHRcdFx0XHRcdHdwYmNfYm9va2luZ19saXN0aW5nX3JlbG9hZF9idXR0b25fX3NwaW5fcGF1c2UoKTtcclxuXHRcdFx0XHRcdHdwYmNfYm9va2luZ19saXN0aW5nX3JlbG9hZF9fbWVzc2FnZV9oaWRlKCk7XHJcblx0XHRcdFx0XHR2YXIgZXJyb3JfbWVzc2FnZSA9ICc8c3Ryb25nPicgKyAnRXJyb3IhJyArICc8L3N0cm9uZz4gJyArIGVycm9yVGhyb3duIDtcclxuXHRcdFx0XHRcdGlmICgganFYSFIucmVzcG9uc2VUZXh0ICl7XHJcblx0XHRcdFx0XHRcdGVycm9yX21lc3NhZ2UgKz0ganFYSFIucmVzcG9uc2VUZXh0O1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0ZXJyb3JfbWVzc2FnZSA9IGVycm9yX21lc3NhZ2UucmVwbGFjZSggL1xcbi9nLCBcIjxiciAvPlwiICk7XHJcblxyXG5cdFx0XHRcdFx0d3BiY19hanhfYm9va2luZ19zaG93X21lc3NhZ2UoIGVycm9yX21lc3NhZ2UgKTtcclxuXHRcdFx0ICB9KVxyXG5cdCAgICAgICAgICAvLyAuZG9uZSggICBmdW5jdGlvbiAoIGRhdGEsIHRleHRTdGF0dXMsIGpxWEhSICkgeyAgIGlmICggd2luZG93LmNvbnNvbGUgJiYgd2luZG93LmNvbnNvbGUubG9nICl7IGNvbnNvbGUubG9nKCAnc2Vjb25kIHN1Y2Nlc3MnLCBkYXRhLCB0ZXh0U3RhdHVzLCBqcVhIUiApOyB9ICAgIH0pXHJcblx0XHRcdCAgLy8gLmFsd2F5cyggZnVuY3Rpb24gKCBkYXRhX2pxWEhSLCB0ZXh0U3RhdHVzLCBqcVhIUl9lcnJvclRocm93biApIHsgICBpZiAoIHdpbmRvdy5jb25zb2xlICYmIHdpbmRvdy5jb25zb2xlLmxvZyApeyBjb25zb2xlLmxvZyggJ2Fsd2F5cyBmaW5pc2hlZCcsIGRhdGFfanFYSFIsIHRleHRTdGF0dXMsIGpxWEhSX2Vycm9yVGhyb3duICk7IH0gICAgIH0pXHJcblx0XHRcdCAgOyAgLy8gRW5kIEFqYXhcclxufVxyXG5cclxuXHJcbi8qKlxyXG4gKiAgIFZpZXdzICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xyXG5cclxuLyoqXHJcbiAqIFNob3cgTGlzdGluZyBUYWJsZSBcdFx0YW5kIGRlZmluZSBnTWFpbCBjaGVja2JveCBob29rc1xyXG4gKlxyXG4gKiBAcGFyYW0ganNvbl9pdGVtc19hcnJcdFx0LSBKU09OIG9iamVjdCB3aXRoIEl0ZW1zXHJcbiAqIEBwYXJhbSBqc29uX3NlYXJjaF9wYXJhbXNcdC0gSlNPTiBvYmplY3Qgd2l0aCBTZWFyY2hcclxuICovXHJcbmZ1bmN0aW9uIHdwYmNfYWp4X2Jvb2tpbmdfc2hvd19saXN0aW5nKCBqc29uX2l0ZW1zX2FyciwganNvbl9zZWFyY2hfcGFyYW1zLCBqc29uX2Jvb2tpbmdfcmVzb3VyY2VzICl7XHJcblxyXG5cdHdwYmNfYWp4X2RlZmluZV90ZW1wbGF0ZXNfX3Jlc291cmNlX21hbmlwdWxhdGlvbigganNvbl9pdGVtc19hcnIsIGpzb25fc2VhcmNoX3BhcmFtcywganNvbl9ib29raW5nX3Jlc291cmNlcyApO1xyXG5cclxuLy9jb25zb2xlLmxvZyggJ2pzb25faXRlbXNfYXJyJyAsIGpzb25faXRlbXNfYXJyLCBqc29uX3NlYXJjaF9wYXJhbXMgKTtcclxuXHRqUXVlcnkoICcud3BiY19hanhfdW5kZXJfdG9vbGJhcl9yb3cnICkuY3NzKCBcImRpc3BsYXlcIiwgXCJmbGV4XCIgKTtcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIEZpeEluOiA5LjYuMS41LlxyXG5cdHZhciBsaXN0X2hlYWRlcl90cGwgPSB3cC50ZW1wbGF0ZSggJ3dwYmNfYWp4X2Jvb2tpbmdfbGlzdF9oZWFkZXInICk7XHJcblx0dmFyIGxpc3RfZm9vdGVyX3RwbCA9IHdwLnRlbXBsYXRlKCAnd3BiY19hanhfYm9va2luZ19saXN0X2Zvb3RlcicgKTtcclxuXHR2YXIgbGlzdF9yb3dfdHBsICAgID0gd3AudGVtcGxhdGUoICd3cGJjX2FqeF9ib29raW5nX2xpc3Rfcm93JyApO1xyXG5cclxuXHJcblx0Ly8gSGVhZGVyLlxyXG5cdGpRdWVyeSggd3BiY19hanhfYm9va2luZ19saXN0aW5nLmdldF9vdGhlcl9wYXJhbSggJ2xpc3RpbmdfY29udGFpbmVyJyApICkuaHRtbCggbGlzdF9oZWFkZXJfdHBsKCkgKTtcclxuXHQvLyBTZW5kIHRvIHRlbXBsYXRlIGFsbCByZXF1ZXN0IHBhcmFtczogalF1ZXJ5KCB3cGJjX2FqeF9ib29raW5nX2xpc3RpbmcuZ2V0X290aGVyX3BhcmFtKCAnbGlzdGluZ19jb250YWluZXInICkgKS5odG1sKCBsaXN0X2hlYWRlcl90cGwod3BiY19hanhfYm9va2luZ19saXN0aW5nLnNlYXJjaF9nZXRfYWxsX3BhcmFtcygpKSApO1xyXG5cdC8vIEJvZHkuXHJcblx0alF1ZXJ5KCB3cGJjX2FqeF9ib29raW5nX2xpc3RpbmcuZ2V0X290aGVyX3BhcmFtKCAnbGlzdGluZ19jb250YWluZXInICkgKS5hcHBlbmQoICc8ZGl2IGNsYXNzPVwid3BiY19zZWxlY3RhYmxlX2JvZHlcIj48L2Rpdj4nICk7XHJcblx0Ly8gRm9vdGVyLlxyXG5cdGpRdWVyeSggd3BiY19hanhfYm9va2luZ19saXN0aW5nLmdldF9vdGhlcl9wYXJhbSggJ2xpc3RpbmdfY29udGFpbmVyJyApICkuYXBwZW5kKCBsaXN0X2Zvb3Rlcl90cGwoKSApO1xyXG5cclxuXHQvLyBSIG8gdyBzXHJcbmNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQoICdMSVNUSU5HX1JPV1MnICk7XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIExJU1RJTkdfUk9XU1xyXG5cdF8uZWFjaCgganNvbl9pdGVtc19hcnIsIGZ1bmN0aW9uICggcF92YWwsIHBfa2V5LCBwX2RhdGEgKXtcclxuXHRcdGlmICggJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBqc29uX3NlYXJjaF9wYXJhbXNbICdrZXl3b3JkJyBdICl7XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBQYXJhbWV0ZXIgZm9yIG1hcmtpbmcga2V5d29yZCB3aXRoIGRpZmZlcmVudCBjb2xvciBpbiBhIGxpc3RcclxuXHRcdFx0cF92YWxbICdfX3NlYXJjaF9yZXF1ZXN0X2tleXdvcmRfXycgXSA9IGpzb25fc2VhcmNoX3BhcmFtc1sgJ2tleXdvcmQnIF07XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRwX3ZhbFsgJ19fc2VhcmNoX3JlcXVlc3Rfa2V5d29yZF9fJyBdID0gJyc7XHJcblx0XHR9XHJcblx0XHRwX3ZhbFsgJ2Jvb2tpbmdfcmVzb3VyY2VzJyBdID0ganNvbl9ib29raW5nX3Jlc291cmNlcztcclxuXHRcdGpRdWVyeSggd3BiY19hanhfYm9va2luZ19saXN0aW5nLmdldF9vdGhlcl9wYXJhbSggJ2xpc3RpbmdfY29udGFpbmVyJyApICsgJyAud3BiY19zZWxlY3RhYmxlX2JvZHknICkuYXBwZW5kKCBsaXN0X3Jvd190cGwoIHBfdmFsICkgKTtcclxuXHR9ICk7XHJcbmNvbnNvbGUuZ3JvdXBFbmQoKTsgXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBMSVNUSU5HX1JPV1NcclxuXHJcblx0d3BiY19kZWZpbmVfZ21haWxfY2hlY2tib3hfc2VsZWN0aW9uKCBqUXVlcnkgKTtcdFx0XHRcdFx0XHQvLyBSZWRlZmluZSBIb29rcyBmb3IgY2xpY2tpbmcgYXQgQ2hlY2tib3hlc1xyXG59XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmUgdGVtcGxhdGUgZm9yIGNoYW5naW5nIGJvb2tpbmcgcmVzb3VyY2VzICYgIHVwZGF0ZSBpdCBlYWNoIHRpbWUsICB3aGVuICBsaXN0aW5nIHVwZGF0aW5nLCB1c2VmdWwgIGZvciBzaG93aW5nIGFjdHVhbCAgYm9va2luZyByZXNvdXJjZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ganNvbl9pdGVtc19hcnJcdFx0LSBKU09OIG9iamVjdCB3aXRoIEl0ZW1zXHJcblx0ICogQHBhcmFtIGpzb25fc2VhcmNoX3BhcmFtc1x0LSBKU09OIG9iamVjdCB3aXRoIFNlYXJjaFxyXG5cdCAqIEBwYXJhbSBqc29uX2Jvb2tpbmdfcmVzb3VyY2VzXHQtIEpTT04gb2JqZWN0IHdpdGggUmVzb3VyY2VzXHJcblx0ICovXHJcblx0ZnVuY3Rpb24gd3BiY19hanhfZGVmaW5lX3RlbXBsYXRlc19fcmVzb3VyY2VfbWFuaXB1bGF0aW9uKCBqc29uX2l0ZW1zX2FyciwganNvbl9zZWFyY2hfcGFyYW1zLCBqc29uX2Jvb2tpbmdfcmVzb3VyY2VzICl7XHJcblxyXG5cdFx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdFx0Ly8gTmV3LiAyMDI1LTA0LTIxLlxyXG5cdFx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdFx0Ly8gQ2hhbmdlIGJvb2tpbmcgcmVzb3VyY2UgaW4gTW9kYWwuXHJcblx0XHR2YXIgbW9kYWxfX2NoYW5nZV9ib29raW5nX3Jlc291cmNlID0gd3AudGVtcGxhdGUoICd3cGJjX2FqeF9fbW9kYWxfX2NoYW5nZV9ib29raW5nX3Jlc291cmNlJyApO1xyXG5cclxuXHRcdGpRdWVyeSggJyNzZWN0aW9uX2luX2luX21vZGFsX19jaGFuZ2VfYm9va2luZ19yZXNvdXJjZScgKS5odG1sKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1vZGFsX19jaGFuZ2VfYm9va2luZ19yZXNvdXJjZSgge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J2FqeF9zZWFyY2hfcGFyYW1zJyAgICA6IGpzb25fc2VhcmNoX3BhcmFtcyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdhanhfYm9va2luZ19yZXNvdXJjZXMnOiBqc29uX2Jvb2tpbmdfcmVzb3VyY2VzXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSApXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xyXG5cclxuXHRcdC8vIER1cGxpY2F0ZSBib29raW5nIGludG8gYW5vdGhlciByZXNvdXJjZSBpbiBNb2RhbC4gTmV3LiAyMDI1LTA0LTIxLlxyXG5cdFx0dmFyIG1vZGFsX19kdXBsaWNhdGVfYm9va2luZ190b19vdGhlcl9yZXNvdXJjZSA9IHdwLnRlbXBsYXRlKCAnd3BiY19hanhfX21vZGFsX19kdXBsaWNhdGVfYm9va2luZ190b19vdGhlcl9yZXNvdXJjZScgKTtcclxuXHJcblx0XHRqUXVlcnkoICcjc2VjdGlvbl9pbl9pbl9tb2RhbF9fZHVwbGljYXRlX2Jvb2tpbmdfdG9fb3RoZXJfcmVzb3VyY2UnICkuaHRtbChcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtb2RhbF9fZHVwbGljYXRlX2Jvb2tpbmdfdG9fb3RoZXJfcmVzb3VyY2UoIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdhanhfc2VhcmNoX3BhcmFtcycgICAgOiBqc29uX3NlYXJjaF9wYXJhbXMsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnYWp4X2Jvb2tpbmdfcmVzb3VyY2VzJzoganNvbl9ib29raW5nX3Jlc291cmNlc1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblx0fVxyXG5cclxuXHJcbi8qKlxyXG4gKiBTaG93IGp1c3QgbWVzc2FnZSBpbnN0ZWFkIG9mIGxpc3RpbmcgYW5kIGhpZGUgcGFnaW5hdGlvblxyXG4gKi9cclxuZnVuY3Rpb24gd3BiY19hanhfYm9va2luZ19zaG93X21lc3NhZ2UoIG1lc3NhZ2UgKXtcclxuXHJcblx0d3BiY19hanhfYm9va2luZ19fYWN0dWFsX2xpc3RpbmdfX2hpZGUoKTtcclxuXHJcblx0alF1ZXJ5KCB3cGJjX2FqeF9ib29raW5nX2xpc3RpbmcuZ2V0X290aGVyX3BhcmFtKCAnbGlzdGluZ19jb250YWluZXInICkgKS5odG1sKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnPGRpdiBjbGFzcz1cIndwYmMtc2V0dGluZ3Mtbm90aWNlIG5vdGljZS13YXJuaW5nXCIgc3R5bGU9XCJ0ZXh0LWFsaWduOmxlZnRcIj4nICtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlICtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0JzwvZGl2PidcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xyXG59XHJcblxyXG5cclxuLyoqXHJcbiAqICAgSCBvIG8gayBzICAtICBpdHMgQWN0aW9uL1RpbWVzIHdoZW4gbmVlZCB0byByZS1SZW5kZXIgVmlld3MgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXHJcblxyXG4vKipcclxuICogU2VuZCBBamF4IFNlYXJjaCBSZXF1ZXN0IGFmdGVyIFVwZGF0aW5nIHNlYXJjaCByZXF1ZXN0IHBhcmFtZXRlcnNcclxuICpcclxuICogQHBhcmFtIHBhcmFtc19hcnJcclxuICovXHJcbmZ1bmN0aW9uIHdwYmNfYWp4X2Jvb2tpbmdfc2VuZF9zZWFyY2hfcmVxdWVzdF93aXRoX3BhcmFtcyAoIHBhcmFtc19hcnIgKXtcclxuXHJcblx0Ly8gRGVmaW5lIGRpZmZlcmVudCBTZWFyY2ggIHBhcmFtZXRlcnMgZm9yIHJlcXVlc3RcclxuXHRfLmVhY2goIHBhcmFtc19hcnIsIGZ1bmN0aW9uICggcF92YWwsIHBfa2V5LCBwX2RhdGEgKSB7XHJcblx0XHQvL2NvbnNvbGUubG9nKCAnUmVxdWVzdCBmb3I6ICcsIHBfa2V5LCBwX3ZhbCApO1xyXG5cdFx0d3BiY19hanhfYm9va2luZ19saXN0aW5nLnNlYXJjaF9zZXRfcGFyYW0oIHBfa2V5LCBwX3ZhbCApO1xyXG5cdH0pO1xyXG5cclxuXHQvLyBTZW5kIEFqYXggUmVxdWVzdFxyXG5cdHdwYmNfYWp4X2Jvb2tpbmdfYWpheF9zZWFyY2hfcmVxdWVzdCgpO1xyXG59XHJcblxyXG4vKipcclxuICogU2VhcmNoIHJlcXVlc3QgZm9yIFwiUGFnZSBOdW1iZXJcIlxyXG4gKiBAcGFyYW0gcGFnZV9udW1iZXJcdGludFxyXG4gKi9cclxuZnVuY3Rpb24gd3BiY19hanhfYm9va2luZ19wYWdpbmF0aW9uX2NsaWNrKCBwYWdlX251bWJlciApe1xyXG5cclxuXHR3cGJjX2FqeF9ib29raW5nX3NlbmRfc2VhcmNoX3JlcXVlc3Rfd2l0aF9wYXJhbXMoIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQncGFnZV9udW0nOiBwYWdlX251bWJlclxyXG5cdFx0XHRcdFx0XHRcdFx0XHR9ICk7XHJcbn1cclxuXHJcblxyXG4vKipcclxuICogICBLZXl3b3JkIFNlYXJjaGluZyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cclxuXHJcbi8qKlxyXG4gKiBTZWFyY2ggcmVxdWVzdCBmb3IgXCJLZXl3b3JkXCIsIGFsc28gc2V0IGN1cnJlbnQgcGFnZSB0byAgMVxyXG4gKlxyXG4gKiBAcGFyYW0gZWxlbWVudF9pZFx0LVx0SFRNTCBJRCAgb2YgZWxlbWVudCwgIHdoZXJlIHdhcyBlbnRlcmVkIGtleXdvcmRcclxuICovXHJcbmZ1bmN0aW9uIHdwYmNfYWp4X2Jvb2tpbmdfc2VuZF9zZWFyY2hfcmVxdWVzdF9mb3Jfa2V5d29yZCggZWxlbWVudF9pZCApIHtcclxuXHJcblx0Ly8gV2UgbmVlZCB0byBSZXNldCBwYWdlX251bSB0byAxIHdpdGggZWFjaCBuZXcgc2VhcmNoLCBiZWNhdXNlIHdlIGNhbiBiZSBhdCBwYWdlICM0LCAgYnV0IGFmdGVyICBuZXcgc2VhcmNoICB3ZSBjYW4gIGhhdmUgdG90YWxseSAgb25seSAgMSBwYWdlXHJcblx0d3BiY19hanhfYm9va2luZ19zZW5kX3NlYXJjaF9yZXF1ZXN0X3dpdGhfcGFyYW1zKCB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQna2V5d29yZCcgIDogalF1ZXJ5KCBlbGVtZW50X2lkICkudmFsKCksXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQncGFnZV9udW0nOiAxXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSApO1xyXG59XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlbmQgc2VhcmNoIHJlcXVlc3QgYWZ0ZXIgZmV3IHNlY29uZHMgKHVzdWFsbHkgYWZ0ZXIgMSw1IHNlYylcclxuXHQgKiBDbG9zdXJlIGZ1bmN0aW9uLiBJdHMgdXNlZnVsLCAgZm9yIGRvICBub3Qgc2VuZCB0b28gbWFueSBBamF4IHJlcXVlc3RzLCB3aGVuIHNvbWVvbmUgbWFrZSBmYXN0IHR5cGluZy5cclxuXHQgKi9cclxuXHR2YXIgd3BiY19hanhfYm9va2luZ19zZWFyY2hpbmdfYWZ0ZXJfZmV3X3NlY29uZHMgPSBmdW5jdGlvbiAoKXtcclxuXHJcblx0XHR2YXIgY2xvc2VkX3RpbWVyID0gMDtcclxuXHJcblx0XHRyZXR1cm4gZnVuY3Rpb24gKCBlbGVtZW50X2lkLCB0aW1lcl9kZWxheSApe1xyXG5cclxuXHRcdFx0Ly8gR2V0IGRlZmF1bHQgdmFsdWUgb2YgXCJ0aW1lcl9kZWxheVwiLCAgaWYgcGFyYW1ldGVyIHdhcyBub3QgcGFzc2VkIGludG8gdGhlIGZ1bmN0aW9uLlxyXG5cdFx0XHR0aW1lcl9kZWxheSA9IHR5cGVvZiB0aW1lcl9kZWxheSAhPT0gJ3VuZGVmaW5lZCcgPyB0aW1lcl9kZWxheSA6IDE1MDA7XHJcblxyXG5cdFx0XHRjbGVhclRpbWVvdXQoIGNsb3NlZF90aW1lciApO1x0XHQvLyBDbGVhciBwcmV2aW91cyB0aW1lclxyXG5cclxuXHRcdFx0Ly8gU3RhcnQgbmV3IFRpbWVyXHJcblx0XHRcdGNsb3NlZF90aW1lciA9IHNldFRpbWVvdXQoIHdwYmNfYWp4X2Jvb2tpbmdfc2VuZF9zZWFyY2hfcmVxdWVzdF9mb3Jfa2V5d29yZC5iaW5kKCAgbnVsbCwgZWxlbWVudF9pZCApLCB0aW1lcl9kZWxheSApO1xyXG5cdFx0fVxyXG5cdH0oKTtcclxuXHJcblxyXG4vKipcclxuICogICBEZWZpbmUgRHluYW1pYyBIb29rcyAgKGxpa2UgcGFnaW5hdGlvbiBjbGljaywgd2hpY2ggcmVuZXcgZWFjaCB0aW1lIHdpdGggbmV3IGxpc3Rpbmcgc2hvd2luZykgIC0tLS0tLS0tLS0tLS0gKi9cclxuXHJcblx0LyoqXHJcblx0ICogRGVmaW5lIEhUTUwgdWkgSG9va3M6IG9uIEtleVVwIHwgQ2hhbmdlIHwgLT4gU29ydCBPcmRlciAmIE51bWJlciBJdGVtcyAvIFBhZ2VcclxuXHQgKiBXZSBhcmUgaGNuYWdlZCBpdCBlYWNoICB0aW1lLCB3aGVuIHNob3dpbmcgbmV3IGxpc3RpbmcsIGJlY2F1c2UgRE9NIGVsZW1lbnRzIGNobmFnZWRcclxuXHQgKi9cclxuXHRmdW5jdGlvbiB3cGJjX2FqeF9ib29raW5nX2RlZmluZV91aV9ob29rcygpIHtcclxuXHJcblx0XHRpZiAoICdmdW5jdGlvbicgPT09IHR5cGVvZiAod3BiY19kZWZpbmVfdGlwcHlfdG9vbHRpcHMpICkge1xyXG5cdFx0XHR3cGJjX2RlZmluZV90aXBweV90b29sdGlwcyggJy53cGJjX19saXN0X190YWJsZSAnICk7XHJcblx0XHR9XHJcblxyXG5cdFx0d3BiY19hanhfYm9va2luZ19fdWlfZGVmaW5lX19sb2NhbGUoKTtcclxuXHRcdHdwYmNfYWp4X2Jvb2tpbmdfX3VpX2RlZmluZV9fcmVtYXJrKCk7XHJcblxyXG5cdFx0d3BiY19ib29fbGlzdGluZ19faW5pdF9ob29rX19zb3J0X2J5KCk7XHJcblxyXG5cdFx0Ly8gSXRlbXMgUGVyIFBhZ2UuXHJcblx0XHRqUXVlcnkoICcud3BiY19pdGVtc19wZXJfcGFnZScgKS5vbihcclxuXHRcdFx0J2NoYW5nZScsXHJcblx0XHRcdGZ1bmN0aW9uIChldmVudCkge1xyXG5cdFx0XHRcdHdwYmNfYWp4X2Jvb2tpbmdfc2VuZF9zZWFyY2hfcmVxdWVzdF93aXRoX3BhcmFtcyhcclxuXHRcdFx0XHRcdHtcclxuXHRcdFx0XHRcdFx0J3BhZ2VfaXRlbXNfY291bnQnOiBqUXVlcnkoIHRoaXMgKS52YWwoKSxcclxuXHRcdFx0XHRcdFx0J3BhZ2VfbnVtJyAgICAgICAgOiAxXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0KTtcclxuXHRcdFx0fVxyXG5cdFx0KTtcclxuXHJcblx0XHQvLyBTb3J0aW5nLlxyXG5cdFx0alF1ZXJ5KCAnLndwYmNfaXRlbXNfc29ydF90eXBlJyApLm9uKFxyXG5cdFx0XHQnY2hhbmdlJyxcclxuXHRcdFx0ZnVuY3Rpb24gKGV2ZW50KSB7XHJcblx0XHRcdFx0d3BiY19hanhfYm9va2luZ19zZW5kX3NlYXJjaF9yZXF1ZXN0X3dpdGhfcGFyYW1zKCB7ICdzb3J0X3R5cGUnOiBqUXVlcnkoIHRoaXMgKS52YWwoKSB9ICk7XHJcblx0XHRcdH1cclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHJcbi8qKlxyXG4gKiAgIFNob3cgLyBIaWRlIExpc3RpbmcgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xyXG5cclxuLyoqXHJcbiAqICBTaG93IExpc3RpbmcgVGFibGUgXHQtIFx0U2VuZGluZyBBamF4IFJlcXVlc3RcdC1cdHdpdGggcGFyYW1ldGVycyB0aGF0ICB3ZSBlYXJseSAgZGVmaW5lZCBpbiBcIndwYmNfYWp4X2Jvb2tpbmdfbGlzdGluZ1wiIE9iai5cclxuICovXHJcbmZ1bmN0aW9uIHdwYmNfYWp4X2Jvb2tpbmdfX2FjdHVhbF9saXN0aW5nX19zaG93KCl7XHJcblxyXG5cdHdwYmNfYWp4X2Jvb2tpbmdfYWpheF9zZWFyY2hfcmVxdWVzdCgpO1x0XHRcdC8vIFNlbmQgQWpheCBSZXF1ZXN0XHQtXHR3aXRoIHBhcmFtZXRlcnMgdGhhdCAgd2UgZWFybHkgIGRlZmluZWQgaW4gXCJ3cGJjX2FqeF9ib29raW5nX2xpc3RpbmdcIiBPYmouXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBIaWRlIExpc3RpbmcgVGFibGUgKCBhbmQgUGFnaW5hdGlvbiApXHJcbiAqL1xyXG5mdW5jdGlvbiB3cGJjX2FqeF9ib29raW5nX19hY3R1YWxfbGlzdGluZ19faGlkZSgpe1xyXG5cdGpRdWVyeSggJy53cGJjX2FqeF91bmRlcl90b29sYmFyX3JvdycgKS5oaWRlKCk7XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRml4SW46IDkuNi4xLjUuXHJcblx0alF1ZXJ5KCB3cGJjX2FqeF9ib29raW5nX2xpc3RpbmcuZ2V0X290aGVyX3BhcmFtKCAnbGlzdGluZ19jb250YWluZXInICkgICAgKS5odG1sKCAnJyApO1xyXG5cdGpRdWVyeSggd3BiY19hanhfYm9va2luZ19saXN0aW5nLmdldF9vdGhlcl9wYXJhbSggJ3BhZ2luYXRpb25fY29udGFpbmVyJyApICkuaHRtbCggJycgKTtcclxufVxyXG5cclxuXHJcbi8qKlxyXG4gKiAgIFN1cHBvcnQgZnVuY3Rpb25zIGZvciBDb250ZW50IFRlbXBsYXRlIGRhdGEgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xyXG5cclxuLyoqXHJcbiAqIEhpZ2hsaWdodCBzdHJpbmdzLFxyXG4gKiBieSBpbnNlcnRpbmcgPHNwYW4gY2xhc3M9XCJmaWVsZHZhbHVlIG5hbWUgZmllbGRzZWFyY2h2YWx1ZVwiPi4uLjwvc3Bhbj4gaHRtbCAgZWxlbWVudHMgaW50byB0aGUgc3RyaW5nLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gYm9va2luZ19kZXRhaWxzIFx0LSBTb3VyY2Ugc3RyaW5nXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBib29raW5nX2tleXdvcmRcdC0gS2V5d29yZCB0byBoaWdobGlnaHRcclxuICogQHJldHVybnMge3N0cmluZ31cclxuICovXHJcbmZ1bmN0aW9uIHdwYmNfZ2V0X2hpZ2hsaWdodGVkX3NlYXJjaF9rZXl3b3JkKCBib29raW5nX2RldGFpbHMsIGJvb2tpbmdfa2V5d29yZCApe1xyXG5cclxuXHRib29raW5nX2tleXdvcmQgPSBib29raW5nX2tleXdvcmQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcblx0aWYgKCAwID09IGJvb2tpbmdfa2V5d29yZC5sZW5ndGggKXtcclxuXHRcdHJldHVybiBib29raW5nX2RldGFpbHM7XHJcblx0fVxyXG5cclxuXHQvLyBIaWdobGlnaHQgc3Vic3RyaW5nIHdpdGhpbmcgSFRNTCB0YWdzIGluIFwiQ29udGVudCBvZiBib29raW5nIGZpZWxkcyBkYXRhXCIgLS0gZS5nLiBzdGFydGluZyBmcm9tICA+ICBhbmQgZW5kaW5nIHdpdGggPFxyXG5cdGxldCBrZXl3b3JkUmVnZXggPSBuZXcgUmVnRXhwKCBgZmllbGR2YWx1ZVtePD5dKj4oW148XSoke2Jvb2tpbmdfa2V5d29yZH1bXjxdKilgLCAnZ2ltJyApO1xyXG5cclxuXHQvL2xldCBtYXRjaGVzID0gWy4uLmJvb2tpbmdfZGV0YWlscy50b0xvd2VyQ2FzZSgpLm1hdGNoQWxsKCBrZXl3b3JkUmVnZXggKV07XHJcblx0bGV0IG1hdGNoZXMgPSBib29raW5nX2RldGFpbHMudG9Mb3dlckNhc2UoKS5tYXRjaEFsbCgga2V5d29yZFJlZ2V4ICk7XHJcblx0XHRtYXRjaGVzID0gQXJyYXkuZnJvbSggbWF0Y2hlcyApO1xyXG5cclxuXHRsZXQgc3RyaW5nc19hcnIgPSBbXTtcclxuXHRsZXQgcG9zX3ByZXZpb3VzID0gMDtcclxuXHRsZXQgc2VhcmNoX3Bvc19zdGFydDtcclxuXHRsZXQgc2VhcmNoX3Bvc19lbmQ7XHJcblxyXG5cdGZvciAoIGNvbnN0IG1hdGNoIG9mIG1hdGNoZXMgKXtcclxuXHJcblx0XHRzZWFyY2hfcG9zX3N0YXJ0ID0gbWF0Y2guaW5kZXggKyBtYXRjaFsgMCBdLnRvTG93ZXJDYXNlKCkuaW5kZXhPZiggJz4nLCAwICkgKyAxIDtcclxuXHJcblx0XHRzdHJpbmdzX2Fyci5wdXNoKCBib29raW5nX2RldGFpbHMuc3Vic3RyKCBwb3NfcHJldmlvdXMsIChzZWFyY2hfcG9zX3N0YXJ0IC0gcG9zX3ByZXZpb3VzKSApICk7XHJcblxyXG5cdFx0c2VhcmNoX3Bvc19lbmQgPSBib29raW5nX2RldGFpbHMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCAnPCcsIHNlYXJjaF9wb3Nfc3RhcnQgKTtcclxuXHJcblx0XHRzdHJpbmdzX2Fyci5wdXNoKCAnPHNwYW4gY2xhc3M9XCJmaWVsZHZhbHVlIG5hbWUgZmllbGRzZWFyY2h2YWx1ZVwiPicgKyBib29raW5nX2RldGFpbHMuc3Vic3RyKCBzZWFyY2hfcG9zX3N0YXJ0LCAoc2VhcmNoX3Bvc19lbmQgLSBzZWFyY2hfcG9zX3N0YXJ0KSApICsgJzwvc3Bhbj4nICk7XHJcblxyXG5cdFx0cG9zX3ByZXZpb3VzID0gc2VhcmNoX3Bvc19lbmQ7XHJcblx0fVxyXG5cclxuXHRzdHJpbmdzX2Fyci5wdXNoKCBib29raW5nX2RldGFpbHMuc3Vic3RyKCBwb3NfcHJldmlvdXMsIChib29raW5nX2RldGFpbHMubGVuZ3RoIC0gcG9zX3ByZXZpb3VzKSApICk7XHJcblxyXG5cdHJldHVybiBzdHJpbmdzX2Fyci5qb2luKCAnJyApO1xyXG59XHJcblxyXG4vKipcclxuICogQ29udmVydCBzcGVjaWFsIEhUTUwgY2hhcmFjdGVycyAgIGZyb206XHQgJmFtcDsgXHQtPiBcdCZcclxuICpcclxuICogQHBhcmFtIHRleHRcclxuICogQHJldHVybnMgeyp9XHJcbiAqL1xyXG5mdW5jdGlvbiB3cGJjX2RlY29kZV9IVE1MX2VudGl0aWVzKCB0ZXh0ICl7XHJcblx0dmFyIHRleHRBcmVhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ3RleHRhcmVhJyApO1xyXG5cdHRleHRBcmVhLmlubmVySFRNTCA9IHRleHQ7XHJcblx0cmV0dXJuIHRleHRBcmVhLnZhbHVlO1xyXG59XHJcblxyXG4vKipcclxuICogQ29udmVydCBUTyBzcGVjaWFsIEhUTUwgY2hhcmFjdGVycyAgIGZyb206XHQgJiBcdC0+IFx0JmFtcDtcclxuICpcclxuICogQHBhcmFtIHRleHRcclxuICogQHJldHVybnMgeyp9XHJcbiAqL1xyXG5mdW5jdGlvbiB3cGJjX2VuY29kZV9IVE1MX2VudGl0aWVzKHRleHQpIHtcclxuICB2YXIgdGV4dEFyZWEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpO1xyXG4gIHRleHRBcmVhLmlubmVyVGV4dCA9IHRleHQ7XHJcbiAgcmV0dXJuIHRleHRBcmVhLmlubmVySFRNTDtcclxufVxyXG5cclxuXHJcbi8qKlxyXG4gKiAgIFN1cHBvcnQgRnVuY3Rpb25zIC0gU3BpbiBJY29uIGluIEJ1dHRvbnMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xyXG5cclxuLyoqXHJcbiAqIFNwaW4gYnV0dG9uIGluIEZpbHRlciB0b29sYmFyICAtICBTdGFydFxyXG4gKi9cclxuZnVuY3Rpb24gd3BiY19ib29raW5nX2xpc3RpbmdfcmVsb2FkX2J1dHRvbl9fc3Bpbl9zdGFydCgpe1xyXG5cdGpRdWVyeSggJyN3cGJjX2Jvb2tpbmdfbGlzdGluZ19yZWxvYWRfYnV0dG9uIC5tZW51X2ljb24ud3BiY19zcGluJykucmVtb3ZlQ2xhc3MoICd3cGJjX2FuaW1hdGlvbl9wYXVzZScgKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFNwaW4gYnV0dG9uIGluIEZpbHRlciB0b29sYmFyICAtICBQYXVzZVxyXG4gKi9cclxuZnVuY3Rpb24gd3BiY19ib29raW5nX2xpc3RpbmdfcmVsb2FkX2J1dHRvbl9fc3Bpbl9wYXVzZSgpe1xyXG5cdGpRdWVyeSggJyN3cGJjX2Jvb2tpbmdfbGlzdGluZ19yZWxvYWRfYnV0dG9uIC5tZW51X2ljb24ud3BiY19zcGluJyApLmFkZENsYXNzKCAnd3BiY19hbmltYXRpb25fcGF1c2UnICk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTaG93IHZpc2libGUgZmVlZGJhY2sgd2hpbGUgQm9va2luZyBMaXN0aW5nIGlzIGxvYWRpbmcuXHJcbiAqL1xyXG5mdW5jdGlvbiB3cGJjX2Jvb2tpbmdfbGlzdGluZ19yZWxvYWRfX21lc3NhZ2Vfc2hvdygpe1xyXG5cclxuXHR2YXIgYWpheF93b3JraW5nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoICdhamF4X3dvcmtpbmcnICk7XHJcblxyXG5cdGlmICggISBhamF4X3dvcmtpbmcgKSB7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cclxuXHR3cGJjX2Jvb2tpbmdfbGlzdGluZ19yZWxvYWRfX21lc3NhZ2VfaGlkZSgpO1xyXG5cclxuXHR2YXIgbGlzdGluZ19jb250YWluZXIgPSAnJztcclxuXHRpZiAoXHJcblx0XHQgICAoICd1bmRlZmluZWQnICE9PSB0eXBlb2Ygd3BiY19hanhfYm9va2luZ19saXN0aW5nIClcclxuXHRcdCYmICggJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIHdwYmNfYWp4X2Jvb2tpbmdfbGlzdGluZy5nZXRfb3RoZXJfcGFyYW0gKVxyXG5cdCkge1xyXG5cdFx0bGlzdGluZ19jb250YWluZXIgPSB3cGJjX2FqeF9ib29raW5nX2xpc3RpbmcuZ2V0X290aGVyX3BhcmFtKCAnbGlzdGluZ19jb250YWluZXInICk7XHJcblx0fVxyXG5cclxuXHRpZiAoXHJcblx0XHQgICBsaXN0aW5nX2NvbnRhaW5lclxyXG5cdFx0JiYgalF1ZXJ5KCBsaXN0aW5nX2NvbnRhaW5lciApLmZpbmQoICcud3BiY19zcGluc19sb2FkaW5nX2NvbnRhaW5lcicgKS5sZW5ndGhcclxuXHQpIHtcclxuXHRcdHJldHVybjtcclxuXHR9XHJcblxyXG5cdHZhciB1bmlxdWVfZGl2X2lkID0gJ3dwYmNfbm90aWNlXycgKyAoIG5ldyBEYXRlKCkgKS5nZXRUaW1lKCk7XHJcblxyXG5cdGpRdWVyeSggYWpheF93b3JraW5nICkuYXBwZW5kKFxyXG5cdFx0JzxkaXYgaWQ9XCInICsgdW5pcXVlX2Rpdl9pZCArICdcIiBjbGFzcz1cIndwYmNfYm9va2luZ19saXN0aW5nX3JlbG9hZF9ub3RpY2VcIiBzdHlsZT1cIm9wYWNpdHk6IDE7XCI+JyArXHJcblx0XHRcdCc8ZGl2IGlkPVwid3BiY19hbGVydF9tZXNzYWdlXCIgY2xhc3M9XCJ3cGJjX2FsZXJ0X21lc3NhZ2VcIj4nICtcclxuXHRcdFx0XHQnPGRpdiBjbGFzcz1cIndwYmNfaW5uZXJfbWVzc2FnZSBub3RpY2Ugbm90aWNlLWluZm8gXCI+ICcgK1xyXG5cdFx0XHRcdFx0JzxhIGNsYXNzPVwiY2xvc2VcIiBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCIgb25jbGljaz1cImphdmFzY3JpcHQ6alF1ZXJ5KHRoaXMpLnBhcmVudCgpLmhpZGUoKTtcIj4mdGltZXM7PC9hPiAnICtcclxuXHRcdFx0XHRcdCc8c3BhbiBjbGFzcz1cIndwZGV2ZWxvcCB3cGJjX2Jvb2tpbmdfbGlzdGluZ19yZWxvYWRfcHJvY2Vzc2luZ1wiPicgK1xyXG5cdFx0XHRcdFx0XHQnPHNwYW4gY2xhc3M9XCJ3cGJjX2ljbl9yb3RhdGVfcmlnaHQgd3BiY19zcGluIHdwYmNfYWpheF9pY29uIHdwYmNfcHJvY2Vzc2luZyB3cGJjX2ljbl9hdXRvcmVuZXdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+JyArXHJcblx0XHRcdFx0XHQnPC9zcGFuPiBMb2FkaW5nIGJvb2tpbmdzLi4uJyArXHJcblx0XHRcdFx0JzwvZGl2PicgK1xyXG5cdFx0XHQnPC9kaXY+JyArXHJcblx0XHQnPC9kaXY+J1xyXG5cdCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBIaWRlIEJvb2tpbmcgTGlzdGluZyBsb2FkaW5nIGZlZWRiYWNrLlxyXG4gKi9cclxuZnVuY3Rpb24gd3BiY19ib29raW5nX2xpc3RpbmdfcmVsb2FkX19tZXNzYWdlX2hpZGUoKXtcclxuXHRqUXVlcnkoICcud3BiY19ib29raW5nX2xpc3RpbmdfcmVsb2FkX25vdGljZScgKS5yZW1vdmUoKTtcclxuXHRqUXVlcnkoICcud3BiY19ib29raW5nX2xpc3RpbmdfcmVsb2FkX3Byb2Nlc3NpbmcnICkuY2xvc2VzdCggJ1tpZF49XCJ3cGJjX25vdGljZV9cIl0sIC53cGJjX2lubmVyX21lc3NhZ2UnICkucmVtb3ZlKCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTcGluIGJ1dHRvbiBpbiBGaWx0ZXIgdG9vbGJhciAgLSAgaXMgU3Bpbm5pbmcgP1xyXG4gKlxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbmZ1bmN0aW9uIHdwYmNfYm9va2luZ19saXN0aW5nX3JlbG9hZF9idXR0b25fX2lzX3NwaW4oKXtcclxuICAgIGlmICggalF1ZXJ5KCAnI3dwYmNfYm9va2luZ19saXN0aW5nX3JlbG9hZF9idXR0b24gLm1lbnVfaWNvbi53cGJjX3NwaW4nICkuaGFzQ2xhc3MoICd3cGJjX2FuaW1hdGlvbl9wYXVzZScgKSApe1xyXG5cdFx0cmV0dXJuIHRydWU7XHJcblx0fSBlbHNlIHtcclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHR9XHJcbn1c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
503