1"use strict"; 2 3(function (window, $) { 4 'use strict'; 5 6 var config = window.wpbc_booking_resource_selector_config || {}; 7 var active_native_contexts = {}; 8 var loaded_script_urls = {}; 9 $('script[src]').each(function () { 10 loaded_script_urls[String(this.src || '')] = true; 11 }); 12 13 /** Return a normalized Booking Resource ID from a selection form. */ 14 function get_selected_resource_id($form) { 15 return Number($form.find('[name="wpbc_resource_selector_resource"]:checked').first().val() || 0); 16 } 17 18 /** 19 * Apply the public text search for one Resource catalog. 20 * 21 * Filtering only hides cards already authorized and rendered by the server; 22 * it cannot add Resource IDs to the signed selection context. 23 * 24 * @param {jQuery} $catalog Resource catalog root. 25 * @return {void} 26 */ 27 function filter_resource_catalog($catalog) { 28 var search_term = String($catalog.find('[data-wpbc-resource-catalog-search]').val() || '').toLocaleLowerCase().trim(); 29 var visible_count = 0; 30 $catalog.find('[data-resource-id]').each(function () { 31 var $card = $(this); 32 var searchable_text = String($card.attr('data-resource-search') || '').toLocaleLowerCase(); 33 var is_visible = !search_term || searchable_text.indexOf(search_term) !== -1; 34 var $resource_input = $card.find('[name="wpbc_resource_selector_resource"]'); 35 $card.prop('hidden', !is_visible); 36 $resource_input.prop('disabled', !is_visible); 37 if (is_visible) { 38 visible_count += 1; 39 } else if ($resource_input.prop('checked')) { 40 $resource_input.prop('checked', false); 41 $card.removeClass('is-selected'); 42 } 43 }); 44 $catalog.find('[data-wpbc-resource-catalog-empty]').prop('hidden', 0 !== visible_count); 45 $catalog.find('[data-wpbc-resource-catalog-status]').text(String(visible_count) + ' ' + (1 === visible_count ? config.resource_found || 'Booking Resource found.' : config.resources_found || 'Booking Resources found.')); 46 } 47 48 /** Toggle one selector loading state without clearing its current stage. */ 49 function set_loading($root, is_loading) { 50 $root.toggleClass('is-loading', is_loading).attr('aria-busy', is_loading ? 'true' : 'false'); 51 $root.find('> .wpbc_booking_resource_selector__stage').attr('aria-busy', is_loading ? 'true' : 'false'); 52 $root.find('> .wpbc_booking_resource_selector__loading').prop('hidden', !is_loading).attr('aria-hidden', is_loading ? 'false' : 'true'); 53 $root.find('.wpbc_booking_resource_selector__selection_form :input').prop('disabled', is_loading); 54 if (!is_loading) { 55 $root.find('[data-wpbc-resource-catalog]').each(function () { 56 filter_resource_catalog($(this)); 57 }); 58 } 59 } 60 61 /** Display and focus one controlled AJAX or initialization error. */ 62 function show_error($root, message) { 63 var $notice = $root.find('> .wpbc_booking_resource_selector__ajax_notice'); 64 $notice.empty().append($('<span>').text(message || config.error || 'Unable to load the booking form.')).prop('hidden', false); 65 if ($notice.get(0) && typeof $notice.get(0).focus === 'function') { 66 $notice.trigger('focus'); 67 } 68 } 69 70 /** Clear the selector AJAX error. */ 71 function clear_error($root) { 72 $root.find('> .wpbc_booking_resource_selector__ajax_notice').empty().prop('hidden', true); 73 } 74 75 /** Return a registered context only while its native form remains live. */ 76 function get_native_context(resource_id) { 77 resource_id = Number(resource_id || 0); 78 var context = active_native_contexts[resource_id]; 79 if (!context || !context.element || !document.documentElement.contains(context.element)) { 80 delete active_native_contexts[resource_id]; 81 return null; 82 } 83 return context; 84 } 85 86 /** Detect any other live native Booking Calendar form for the same resource. */ 87 function has_duplicate_resource_form($root, resource_id) { 88 resource_id = Number(resource_id || 0); 89 if (!resource_id) { 90 return false; 91 } 92 var context = get_native_context(resource_id); 93 if (context && !$.contains($root.get(0), context.element)) { 94 return true; 95 } 96 return $('[id="booking_form' + resource_id + '"]').filter(function () { 97 return !$.contains($root.get(0), this); 98 }).length > 0; 99 } 100 101 /** Register the signed resource context used by final booking submission. */ 102 function register_native_form($native) { 103 var resource_id = Number($native.data('resource-id') || 0); 104 var context_token = String($native.attr('data-resource-selector-context-token') || ''); 105 var allow_past = '1' === String($native.attr('data-allow-past') || '0') ? 1 : 0; 106 var existing = get_native_context(resource_id); 107 if (!resource_id || !context_token) { 108 return false;
109 } 110 if (existing && existing.element !== $native.get(0)) { 111 return false; 112 } 113 active_native_contexts[resource_id] = { 114 element: $native.get(0), 115 resource_id: resource_id, 116 context_token: context_token, 117 allow_past: allow_past 118 }; 119 return true; 120 } 121 122 /** Remove one native form from the local submission registry. */ 123 function unregister_native_form($native) { 124 var resource_id = Number($native.data('resource-id') || 0); 125 var context = get_native_context(resource_id); 126 if (context && context.element === $native.get(0)) { 127 delete active_native_contexts[resource_id]; 128 } 129 } 130 131 /** Prepare a newly inserted native form for resource-bound submission. */ 132 function prepare_native_form($scope) { 133 var $native = $scope.find('.wpbc_booking_resource_selector__native_form').first(); 134 if (!$native.length) { 135 return true; 136 } 137 return register_native_form($native); 138 } 139 140 /** Convert a script URL to the same absolute form used by script elements. */ 141 function get_absolute_script_url(url) { 142 var anchor = document.createElement('a'); 143 anchor.href = String(url || ''); 144 return anchor.href; 145 } 146 147 /** Return a rejected promise carrying one controlled message. */ 148 function rejected_stage(message) { 149 var deferred = $.Deferred(); 150 deferred.reject({ 151 wpbc_message: message 152 }); 153 return deferred.promise(); 154 } 155 156 /** Execute renderer scripts sequentially while the request owns the stage. */ 157 function execute_scripts(scripts, owns_stage) { 158 var sequence = $.Deferred().resolve().promise(); 159 $.each(scripts, function (index, script) { 160 sequence = sequence.then(function () { 161 if (!owns_stage()) { 162 return rejected_stage(''); 163 } 164 if (script.src) { 165 var absolute_url = get_absolute_script_url(script.src); 166 if (loaded_script_urls[absolute_url]) { 167 return undefined; 168 } 169 return $.ajax({ 170 url: absolute_url, 171 dataType: 'script', 172 cache: true 173 }).then(function () { 174 loaded_script_urls[absolute_url] = true; 175 }); 176 } 177 if (script.code) { 178 $.globalEval(script.code); 179 } 180 return undefined; 181 }); 182 }); 183 return sequence; 184 } 185 186 /** Initialize native controls whose core handlers bind on document ready. */ 187 function initialize_ajax_form_controls() { 188 if (typeof window.wpbc_hook__init_booking_form_wizard_buttons === 'function') { 189 window.wpbc_hook__init_booking_form_wizard_buttons(); 190 } 191 } 192 193 /** Destroy native calendars and unregister context before stage removal. */ 194 function cleanup_native_form($root) { 195 $root.find('.wpbc_booking_resource_selector__native_form').each(function () { 196 var $native = $(this); 197 var resource_id = Number($native.data('resource-id') || 0); 198 var $calendar = $native.find('#calendar_booking' + resource_id); 199 unregister_native_form($native); 200 if (!resource_id || !$calendar.length || !$.datepick || typeof $calendar.datepick !== 'function') { 201 return; 202 } 203 try { 204 var instance = typeof $.datepick._getInst === 'function' ? $.datepick._getInst($calendar.get(0)) : null; 205 if (instance) { 206 $calendar.datepick('destroy'); 207 } 208 } catch (error) { 209 $calendar.removeClass('hasDatepick'); 210 } 211 }); 212 } 213 214 /** Restore the configured initial Resource choice after Start over. */ 215 function restore_resource_selection($root) { 216 var resource_id = Number($root.attr('data-selected-resource-id') || 0); 217 if (!resource_id) { 218 return; 219 } 220 var $input = $root.find('[name="wpbc_resource_selector_resource"][value="' + resource_id + '"]').first(); 221 if ($input.length) { 222 $input.closest('.wpbc_booking_resource_selector__choices').find('.wpbc_booking_resource_selector__choice').removeClass('is-selected'); 223 $input.prop('checked', true).closest('.wpbc_booking_resource_selector__choice').addClass('is-selected'); 224 } 225 } 226 227 /** Focus the new stage heading and keep the component near the viewport. */ 228 function focus_stage($root) { 229 var $target = $root.find('> .wpbc_booking_resource_selector__stage .wpbc_booking_resource_selector__heading h3, > .wpbc_booking_resource_selector__stage .wpbc_booking_resource_selector__notice').first(); 230 if ($target.length) { 231 $target.attr('tabindex', '-1');
232 try { 233 $target.get(0).focus({ 234 preventScroll: true 235 }); 236 } catch (error) { 237 $target.trigger('focus'); 238 } 239 } 240 if ($root.get(0) && typeof $root.get(0).scrollIntoView === 'function') { 241 var reduce_motion = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches; 242 $root.get(0).scrollIntoView({ 243 behavior: reduce_motion ? 'auto' : 'smooth', 244 block: 'nearest' 245 }); 246 } 247 } 248 249 /** Determine whether an AJAX callback still owns the component state. */ 250 function is_current_request($root, request_id) { 251 return Number($root.data('wpbc-resource-selector-request-id') || 0) === Number(request_id); 252 } 253 254 /** Finish only the current request so stale callbacks cannot alter the UI. */ 255 function finish_request($root, request_id) { 256 if (!is_current_request($root, request_id)) { 257 return; 258 } 259 $root.removeData('wpbc-resource-selector-request'); 260 set_loading($root, false); 261 } 262 263 /** Replace a complete stage with DOM-before-script initialization ordering. */ 264 function replace_stage($root, html, stage, resource_id, request_id) { 265 if (!is_current_request($root, request_id)) { 266 return rejected_stage(''); 267 } 268 if ('booking' === stage && has_duplicate_resource_form($root, resource_id)) { 269 return rejected_stage(config.duplicate_resource); 270 } 271 var parsed = $.parseHTML(String(html || ''), document, true) || []; 272 var scripts = [];
273 var $container = $('<div>').append(parsed); 274 $container.find('script').addBack('script').each(function () { 275 scripts.push({ 276 src: this.src || '', 277 code: this.src ? '' : this.text || this.textContent || '' 278 }); 279 $(this).remove(); 280 }); 281 cleanup_native_form($root); 282 $root.attr('data-resource-selector-stage', stage); 283 $root.find('> .wpbc_booking_resource_selector__stage').empty().append($container.contents()); 284 if (!prepare_native_form($root)) { 285 cleanup_native_form($root); 286 $root.find('.wpbc_booking_resource_selector__native_form :input').prop('disabled', true); 287 return rejected_stage(config.initialization_error || config.error); 288 } 289 return execute_scripts(scripts, function () { 290 return is_current_request($root, request_id); 291 }).then(function () { 292 if (!is_current_request($root, request_id)) { 293 return rejected_stage(''); 294 } 295 initialize_ajax_form_controls(); 296 if ('resource' === stage) { 297 restore_resource_selection($root); 298 } 299 }); 300 } 301 302 /** Request and render the next Booking Resource selector stage. */ 303 function resolve_stage($root, resource_id) { 304 if (!$root || !$root.length) { 305 return; 306 } 307 resource_id = Number(resource_id || 0); 308 if (resource_id) { 309 $root.attr('data-selected-resource-id', resource_id); 310 } 311 var previous_request = $root.data('wpbc-resource-selector-request'); 312 var request_id = Number($root.data('wpbc-resource-selector-request-id') || 0) + 1; 313 $root.data('wpbc-resource-selector-request-id', request_id); 314 if (previous_request && previous_request.readyState !== 4) { 315 previous_request.abort(); 316 } 317 clear_error($root); 318 set_loading($root, true); 319 var request = $.post(config.ajax_url, { 320 action: config.action, 321 nonce: config.nonce, 322 config_token: $root.attr('data-config-token') || '', 323 resource_id: resource_id 324 }); 325 $root.data('wpbc-resource-selector-request', request); 326 request.done(function (response) { 327 if (!is_current_request($root, request_id)) { 328 return; 329 } 330 if (!response || !response.success || !response.data) { 331 show_error($root, response && response.data && response.data.message ? response.data.message : config.error); 332 finish_request($root, request_id); 333 return; 334 } 335 var stage = response.data.stage || ''; 336 var replacement = replace_stage($root, response.data.html, stage, response.data.resource_id, request_id); 337 replacement.done(function () { 338 if (!is_current_request($root, request_id)) { 339 return; 340 } 341 if (Number(response.data.resource_id || 0)) { 342 $root.attr('data-selected-resource-id', Number(response.data.resource_id)); 343 } 344 finish_request($root, request_id); 345 focus_stage($root); 346 }).fail(function (error) { 347 if (!is_current_request($root, request_id)) { 348 return; 349 } 350 show_error($root, error && error.wpbc_message ? error.wpbc_message : config.initialization_error || config.error); 351 finish_request($root, request_id); 352 }); 353 }).fail(function (xhr, status) { 354 if ('abort' === status || !is_current_request($root, request_id)) { 355 return; 356 } 357 var response = xhr.responseJSON; 358 show_error($root, response && response.data && response.data.message ? response.data.message : config.error); 359 finish_request($root, request_id); 360 }); 361 } 362 363 /** Resolve the selected Booking Resource through AJAX. */ 364 $(document).on('submit', '.wpbc_booking_resource_selector__selection_form', function (event) { 365 if (!config.ajax_url || !config.action) { 366 return; 367 } 368 event.preventDefault(); 369 var $form = $(this); 370 resolve_stage($form.closest('.wpbc_booking_resource_selector'), get_selected_resource_id($form)); 371 }); 372 373 /** Keep selected card styling independent from CSS :has() support. */ 374 $(document).on('change', '.wpbc_booking_resource_selector__choice > input', function () { 375 var $input = $(this); 376 $input.closest('.wpbc_booking_resource_selector__choices').find('.wpbc_booking_resource_selector__choice').removeClass('is-selected'); 377 $input.closest('.wpbc_booking_resource_selector__choice').addClass('is-selected'); 378 }); 379 380 /** Filter cards without changing the server-authorized Resource set. */ 381 $(document).on('input', '.wpbc_booking_resource_catalog [data-wpbc-resource-catalog-search]', function () { 382 filter_resource_catalog($(this).closest('[data-wpbc-resource-catalog]')); 383 }); 384 385 /** Return to Resource selection without reloading the public page. */ 386 $(document).on('click', '.wpbc_booking_resource_selector [data-wpbc-resource-selector-action="start-over"]', function (event) { 387 if (!config.ajax_url || !config.action) { 388 return; 389 } 390 event.preventDefault(); 391 var $root = $(this).closest('.wpbc_booking_resource_selector'); 392 if ($root.hasClass('is-loading')) { 393 return; 394 } 395 resolve_stage($root, 0); 396 }); 397 398 /** Add the signed resource context to the core booking-create request. */ 399 $('body').on('wpbc_before_booking_create.wpbc_booking_resource_selector', function (event, resource_id, params) { 400 var context = get_native_context(resource_id); 401 if (!context || !params) { 402 return; 403 } 404 params.resource_selector_required = 1; 405 params.resource_selector_context_token = context.context_token; 406 params.allow_past = context.allow_past; 407 }); 408 $(function () { 409 $('.wpbc_booking_resource_selector').each(function () { 410 var $root = $(this);
411 var $native = $root.find('.wpbc_booking_resource_selector__native_form').first(); 412 if ($native.length) { 413 $root.attr('data-selected-resource-id', Number($native.data('resource-id') || 0)); 414 } 415 var duplicate = $native.length && has_duplicate_resource_form($root, Number($native.data('resource-id') || 0)); 416 if (duplicate || !prepare_native_form($root)) { 417 cleanup_native_form($root); 418 $root.find('.wpbc_booking_resource_selector__native_form :input').prop('disabled', true); 419 show_error($root, duplicate ? config.duplicate_resource : config.initialization_error); 420 } 421 }); 422 }); 423})(window, jQuery); 424//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5jbHVkZXMvYm9va2luZy1yZXNvdXJjZS1zZWxlY3Rvci9fb3V0L2Jvb2tpbmctcmVzb3VyY2Utc2VsZWN0b3IuanMiLCJuYW1lcyI6WyJ3aW5kb3ciLCIkIiwiY29uZmlnIiwid3BiY19ib29raW5nX3Jlc291cmNlX3NlbGVjdG9yX2NvbmZpZyIsImFjdGl2ZV9uYXRpdmVfY29udGV4dHMiLCJsb2FkZWRfc2NyaXB0X3VybHMiLCJlYWNoIiwiU3RyaW5nIiwic3JjIiwiZ2V0X3NlbGVjdGVkX3Jlc291cmNlX2lkIiwiJGZvcm0iLCJOdW1iZXIiLCJmaW5kIiwiZmlyc3QiLCJ2YWwiLCJmaWx0ZXJfcmVzb3VyY2VfY2F0YWxvZyIsIiRjYXRhbG9nIiwic2VhcmNoX3Rlcm0iLCJ0b0xvY2FsZUxvd2VyQ2FzZSIsInRyaW0iLCJ2aXNpYmxlX2NvdW50IiwiJGNhcmQiLCJzZWFyY2hhYmxlX3RleHQiLCJhdHRyIiwiaXNfdmlzaWJsZSIsImluZGV4T2YiLCIkcmVzb3VyY2VfaW5wdXQiLCJwcm9wIiwicmVtb3ZlQ2xhc3MiLCJ0ZXh0IiwicmVzb3VyY2VfZm91bmQiLCJyZXNvdXJjZXNfZm91bmQiLCJzZXRfbG9hZGluZyIsIiRyb290IiwiaXNfbG9hZGluZyIsInRvZ2dsZUNsYXNzIiwic2hvd19lcnJvciIsIm1lc3NhZ2UiLCIkbm90aWNlIiwiZW1wdHkiLCJhcHBlbmQiLCJlcnJvciIsImdldCIsImZvY3VzIiwidHJpZ2dlciIsImNsZWFyX2Vycm9yIiwiZ2V0X25hdGl2ZV9jb250ZXh0IiwicmVzb3VyY2VfaWQiLCJjb250ZXh0IiwiZWxlbWVudCIsImRvY3VtZW50IiwiZG9jdW1lbnRFbGVtZW50IiwiY29udGFpbnMiLCJoYXNfZHVwbGljYXRlX3Jlc291cmNlX2Zvcm0iLCJmaWx0ZXIiLCJsZW5ndGgiLCJyZWdpc3Rlcl9uYXRpdmVfZm9ybSIsIiRuYXRpdmUiLCJkYXRhIiwiY29udGV4dF90b2tlbiIsImFsbG93X3Bhc3QiLCJleGlzdGluZyIsInVucmVnaXN0ZXJfbmF0aXZlX2Zvcm0iLCJwcmVwYXJlX25hdGl2ZV9mb3JtIiwiJHNjb3BlIiwiZ2V0X2Fic29sdXRlX3NjcmlwdF91cmwiLCJ1cmwiLCJhbmNob3IiLCJjcmVhdGVFbGVtZW50IiwiaHJlZiIsInJlamVjdGVkX3N0YWdlIiwiZGVmZXJyZWQiLCJEZWZlcnJlZCIsInJlamVjdCIsIndwYmNfbWVzc2FnZSIsInByb21pc2UiLCJleGVjdXRlX3NjcmlwdHMiLCJzY3JpcHRzIiwib3duc19zdGFnZSIsInNlcXVlbmNlIiwicmVzb2x2ZSIsImluZGV4Iiwic2NyaXB0IiwidGhlbiIsImFic29sdXRlX3VybCIsInVuZGVmaW5lZCIsImFqYXgiLCJkYXRhVHlwZSIsImNhY2hlIiwiY29kZSIsImdsb2JhbEV2YWwiLCJpbml0aWFsaXplX2FqYXhfZm9ybV9jb250cm9scyIsIndwYmNfaG9va19faW5pdF9ib29raW5nX2Zvcm1fd2l6YXJkX2J1dHRvbnMiLCJjbGVhbnVwX25hdGl2ZV9mb3JtIiwiJGNhbGVuZGFyIiwiZGF0ZXBpY2siLCJpbnN0YW5jZSIsIl9nZXRJbnN0IiwicmVzdG9yZV9yZXNvdXJjZV9zZWxlY3Rpb24iLCIkaW5wdXQiLCJjbG9zZXN0IiwiYWRkQ2xhc3MiLCJmb2N1c19zdGFnZSIsIiR0YXJnZXQiLCJwcmV2ZW50U2Nyb2xsIiwic2Nyb2xsSW50b1ZpZXciLCJyZWR1Y2VfbW90aW9uIiwibWF0Y2hNZWRpYSIsIm1hdGNoZXMiLCJiZWhhdmlvciIsImJsb2NrIiwiaXNfY3VycmVudF9yZXF1ZXN0IiwicmVxdWVzdF9pZCIsImZpbmlzaF9yZXF1ZXN0IiwicmVtb3ZlRGF0YSIsInJlcGxhY2Vfc3RhZ2UiLCJodG1sIiwic3RhZ2UiLCJkdXBsaWNhdGVfcmVzb3VyY2UiLCJwYXJzZWQiLCJwYXJzZUhUTUwiLCIkY29udGFpbmVyIiwiYWRkQmFjayIsInB1c2giLCJ0ZXh0Q29udGVudCIsInJlbW92ZSIsImNvbnRlbnRzIiwiaW5pdGlhbGl6YXRpb25fZXJyb3IiLCJyZXNvbHZlX3N0YWdlIiwicHJldmlvdXNfcmVxdWVzdCIsInJlYWR5U3RhdGUiLCJhYm9ydCIsInJlcXVlc3QiLCJwb3N0IiwiYWpheF91cmwiLCJhY3Rpb24iLCJub25jZSIsImNvbmZpZ190b2tlbiIsImRvbmUiLCJyZXNwb25zZSIsInN1Y2Nlc3MiLCJyZXBsYWNlbWVudCIsImZhaWwiLCJ4aHIiLCJzdGF0dXMiLCJyZXNwb25zZUpTT04iLCJvbiIsImV2ZW50IiwicHJldmVudERlZmF1bHQiLCJoYXNDbGFzcyIsInBhcmFtcyIsInJlc291cmNlX3NlbGVjdG9yX3JlcXVpcmVkIiwicmVzb3VyY2Vfc2VsZWN0b3JfY29udGV4dF90b2tlbiIsImR1cGxpY2F0ZSIsImpRdWVyeSJdLCJzb3VyY2VzIjpbImluY2x1ZGVzL2Jvb2tpbmctcmVzb3VyY2Utc2VsZWN0b3IvX3NyYy9ib29raW5nLXJlc291cmNlLXNlbGVjdG9yLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIiggZnVuY3Rpb24gKCB3aW5kb3csICQgKSB7XG5cdCd1c2Ugc3RyaWN0JztcblxuXHR2YXIgY29uZmlnID0gd2luZG93LndwYmNfYm9va2luZ19yZXNvdXJjZV9zZWxlY3Rvcl9jb25maWcgfHwge307XG5cdHZhciBhY3RpdmVfbmF0aXZlX2NvbnRleHRzID0ge307XG5cdHZhciBsb2FkZWRfc2NyaXB0X3VybHMgPSB7fTtcblxuXHQkKCAnc2NyaXB0W3NyY10nICkuZWFjaCggZnVuY3Rpb24gKCkge1xuXHRcdGxvYWRlZF9zY3JpcHRfdXJsc1sgU3RyaW5nKCB0aGlzLnNyYyB8fCAnJyApIF0gPSB0cnVlO1xuXHR9ICk7XG5cblx0LyoqIFJldHVybi
424BhIG5vcm1hbGl6ZWQgQm9va2luZyBSZXNvdXJjZSBJRCBmcm9tIGEgc2VsZWN0aW9uIGZvcm0uICovXG5cdGZ1bmN0aW9uIGdldF9zZWxlY3RlZF9yZXNvdXJjZV9pZCggJGZvcm0gKSB7XG5cdFx0cmV0dXJuIE51bWJlciggJGZvcm0uZmluZCggJ1tuYW1lPVwid3BiY19yZXNvdXJjZV9zZWxlY3Rvcl9yZXNvdXJjZVwiXTpjaGVja2VkJyApLmZpcnN0KCkudmFsKCkgfHwgMCApO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFwcGx5IHRoZSBwdWJsaWMgdGV4dCBzZWFyY2ggZm9yIG9uZSBSZXNvdXJjZSBjYXRhbG9nLlxuXHQgKlxuXHQgKiBGaWx0ZXJpbmcgb25seSBoaWRlcyBjYXJkcyBhbHJlYWR5IGF1dGhvcml6ZWQgYW5kIHJlbmRlcmVkIGJ5IHRoZSBzZXJ2ZXI7XG5cdCAqIGl0IGNhbm5vdCBhZGQgUmVzb3VyY2UgSURzIHRvIHRoZSBzaWduZWQgc2VsZWN0aW9uIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7alF1ZXJ5fSAkY2F0YWxvZyBSZXNvdXJjZSBjYXRhbG9nIHJvb3QuXG5cdCAqIEByZXR1cm4ge3ZvaWR9XG5cdCAqL1xuXHRmdW5jdGlvbiBmaWx0ZXJfcmVzb3VyY2VfY2F0YWxvZyggJGNhdGFsb2cgKSB7XG5cdFx0dmFyIHNlYXJjaF90ZXJtID0gU3RyaW5nKCAkY2F0YWxvZy5maW5kKCAnW2RhdGEtd3BiYy1yZXNvdXJjZS1jYXRhbG9nLXNlYXJjaF0nICkudmFsKCkgfHwgJycgKS50b0xvY2FsZUxvd2VyQ2FzZSgpLnRyaW0oKTtcblx0XHR2YXIgdmlzaWJsZV9jb3VudCA9IDA7XG5cblx0XHQkY2F0YWxvZy5maW5kKCAnW2RhdGEtcmVzb3VyY2UtaWRdJyApLmVhY2goIGZ1bmN0aW9uICgpIHtcblx0XHRcdHZhciAkY2FyZCA9ICQoIHRoaXMgKTtcblx0XHRcdHZhciBzZWFyY2hhYmxlX3RleHQgPSBTdHJpbmcoICRjYXJkLmF0dHIoICdkYXRhLXJlc291cmNlLXNlYXJjaCcgKSB8fCAnJyApLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG5cdFx0XHR2YXIgaXNfdmlzaWJsZSA9ICEgc2VhcmNoX3Rlcm0gfHwgc2VhcmNoYWJsZV90ZXh0LmluZGV4T2YoIHNlYXJjaF90ZXJtICkgIT09IC0xO1xuXHRcdFx0dmFyICRyZXNvdXJjZV9pbnB1dCA9ICRjYXJkLmZpbmQoICdbbmFtZT1cIndwYmNfcmVzb3VyY2Vfc2VsZWN0b3JfcmVzb3VyY2VcIl0nICk7XG5cblx0XHRcdCRjYXJkLnByb3AoICdoaWRkZW4nLCAhIGlzX3Zpc2libGUgKTtcblx0XHRcdCRyZXNvdXJjZV9pbnB1dC5wcm9wKCAnZGlzYWJsZWQnLCAhIGlzX3Zpc2libGUgKTtcblx0XHRcdGlmICggaXNfdmlzaWJsZSApIHtcblx0XHRcdFx0dmlzaWJsZV9jb3VudCArPSAxO1xuXHRcdFx0fSBlbHNlIGlmICggJHJlc291cmNlX2lucHV0LnByb3AoICdjaGVja2VkJyApICkge1xuXHRcdFx0XHQkcmVzb3VyY2VfaW5wdXQucHJvcCggJ2NoZWNrZWQnLCBmYWxzZSApO1xuXHRcdFx0XHQkY2FyZC5yZW1vdmVDbGFzcyggJ2lzLXNlbGVjdGVkJyApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblxuXHRcdCRjYXRhbG9nLmZpbmQoICdbZGF0YS13cGJjLXJlc291cmNlLWNhdGFsb2ctZW1wdHldJyApLnByb3AoICdoaWRkZW4nLCAwICE9PSB2aXNpYmxlX2NvdW50ICk7XG5cdFx0JGNhdGFsb2cuZmluZCggJ1tkYXRhLXdwYmMtcmVzb3VyY2UtY2F0YWxvZy1zdGF0dXNdJyApLnRleHQoXG5cdFx0XHRTdHJpbmcoIHZpc2libGVfY291bnQgKSArICcgJyArICggMSA9PT0gdmlzaWJsZV9jb3VudCA/ICggY29uZmlnLnJlc291cmNlX2ZvdW5kIHx8ICdCb29raW5nIFJlc291cmNlIGZvdW5kLicgKSA6ICggY29uZmlnLnJlc291cmNlc19mb3VuZCB8fCAnQm9va2luZyBSZXNvdXJjZXMgZm91bmQuJyApIClcblx0XHQpO1xuXHR9XG5cblx0LyoqIFRvZ2dsZSBvbmUgc2VsZWN0b3IgbG9hZGluZyBzdGF0ZSB3aXRob3V0IGNsZWFyaW5nIGl0cyBjdXJyZW50IHN0YWdlLiAqL1xuXHRmdW5jdGlvbiBzZXRfbG9hZGluZyggJHJvb3QsIGlzX2xvYWRpbmcgKSB7XG5cdFx0JHJvb3QudG9nZ2xlQ2xhc3MoICdpcy1sb2FkaW5nJywgaXNfbG9hZGluZyApLmF0dHIoICdhcmlhLWJ1c3knLCBpc19sb2FkaW5nID8gJ3RydWUnIDogJ2ZhbHNlJyApO1xuXHRcdCRyb290LmZpbmQoICc+IC53cGJjX2Jvb2tpbmdfcmVzb3VyY2Vfc2VsZWN0b3JfX3N0YWdlJyApLmF0dHIoICdhcmlhLWJ1c3knLCBpc19sb2FkaW5nID8gJ3RydWUnIDogJ2ZhbHNlJyApO1xuXHRcdCRyb290LmZpbmQoICc+IC53cGJjX2Jvb2tpbmdfcmVzb3VyY2Vfc2VsZWN0b3JfX2xvYWRpbmcnICkucHJvcCggJ2hpZGRlbicsICEgaXNfbG9hZGluZyApLmF0dHIoICdhcmlhLWhpZGRlbicsIGlzX2xvYWRpbmcgPyAnZmFsc2UnIDogJ3RydWUnICk7XG5cdFx0JHJvb3QuZmluZCggJy53cGJjX2Jvb2tpbmdfcmVzb3VyY2Vfc2VsZWN0b3JfX3NlbGVjdGlvbl9mb3JtIDppbnB1dCcgKS5wcm9wKCAnZGlzYWJsZWQnLCBpc19sb2FkaW5nICk7XG5cdFx0aWYgKCAhIGlzX2xvYWRpbmcgKSB7XG5cdFx0XHQkcm9vdC5maW5kKCAnW2RhdGEtd3BiYy1yZXNvdXJjZS1jYXRhbG9nXScgKS5lYWNoKCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGZpbHRlcl9yZXNvdXJjZV9jYXRhbG9nKCAkKCB0aGlzICkgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cdH1cblxuXHQvKiogRGlzcGxheSBhbmQgZm9jdXMgb25lIGNvbnRyb2xsZWQgQUpBWCBvciBpbml0aWFsaXphdGlvbiBlcnJvci4gKi9cblx0ZnVuY3Rpb24gc2hvd19lcnJvciggJHJvb3QsIG1lc3NhZ2UgKSB7XG5cdFx0dmFyICRub3RpY2UgPSAkcm9vdC5maW5kKCAnPiAud3BiY19ib29raW5nX3Jlc291cmNlX3NlbGVjdG9yX19hamF4X25vdGljZScgKTtcblx0XHQkbm90aWNlLmVtcHR5KCkuYXBwZW5kKCAkKCAnPHNwYW4+JyApLnRleHQoIG1lc3NhZ2UgfHwgY29uZmlnLmVycm9yIHx8ICdVbmFibGUgdG8gbG9hZCB0aGUgYm9va2luZyBmb3JtLicgKSApLnByb3AoICdoaWRkZW4nLCBmYWxzZSApO1xuXHRcdGlmICggJG5vdGljZS5nZXQoIDAgKSAmJiB0eXBlb2YgJG5vdGljZS5nZXQoIDAgKS5mb2N1cyA9PT0gJ2Z1bmN0aW9uJyApIHtcblx0XHRcdCRub3RpY2UudHJpZ2dlciggJ2ZvY3VzJyApO1xuXHRcdH1cblx0fVxuXG5cdC8qKiBDbGVhciB0aGUgc2VsZWN0b3IgQUpBWCBlcnJvci4gKi9cblx0ZnVuY3Rpb24gY2xlYXJfZXJyb3IoICRyb290ICkge1xuXHRcdCRyb290LmZpbmQoICc+IC53cGJjX2Jvb2tpbmdfcmVzb3VyY2Vfc2VsZWN0b3JfX2FqYXhfbm90aWNlJyApLmVtcHR5KCkucHJvcCggJ2hpZGRlbicsIHRydWUgKTtcblx0fVxuXG5cdC8qKiBSZXR1cm4gYSByZWdpc3RlcmVkIGNvbnRleHQgb25seSB3aGlsZSBpdHMgbmF0aXZlIGZvcm0gcmVtYWlucyBsaXZlLiAqL1xuXHRmdW5jdGlvbiBnZXRfbmF0aXZlX2NvbnRleHQoIHJlc291cmNlX2lkICkge1xuXHRcdHJlc291cmNlX2lkID0gTnVtYmVyKCByZXNvdXJjZV9pZCB8fCAwICk7XG5cdFx0dmFyIGNvbnRleHQgPSBhY3RpdmVfbmF0aXZlX2NvbnRleHRzWyByZXNvdXJjZV9pZCBdO1xuXHRcdGlmICggISBjb250ZXh0IHx8ICEgY29udGV4dC5lbGVtZW50IHx8ICEgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNvbnRhaW5zKCBjb250ZXh0LmVsZW1lbnQgKSApIHtcblx0XHRcdGRlbGV0ZSBhY3RpdmVfbmF0aXZlX2NvbnRleHRzWyByZXNvdXJjZV9pZCBdO1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXHRcdHJldHVybi
424Bjb250ZXh0O1xuXHR9XG5cblx0LyoqIERldGVjdCBhbnkgb3RoZXIgbGl2ZSBuYXRpdmUgQm9va2luZyBDYWxlbmRhciBmb3JtIGZvciB0aGUgc2FtZSByZXNvdXJjZS4gKi9cblx0ZnVuY3Rpb24gaGFzX2R1cGxpY2F0ZV9yZXNvdXJjZV9mb3JtKCAkcm9vdCwgcmVzb3VyY2VfaWQgKSB7XG5cdFx0cmVzb3VyY2VfaWQgPSBOdW1iZXIoIHJlc291cmNlX2lkIHx8IDAgKTtcblx0XHRpZiAoICEgcmVzb3VyY2VfaWQgKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0dmFyIGNvbnRleHQgPSBnZXRfbmF0aXZlX2NvbnRleHQoIHJlc291cmNlX2lkICk7XG5cdFx0aWYgKCBjb250ZXh0ICYmICEgJC5jb250YWlucyggJHJvb3QuZ2V0KCAwICksIGNvbnRleHQuZWxlbWVudCApICkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuICQoICdbaWQ9XCJib29raW5nX2Zvcm0nICsgcmVzb3VyY2VfaWQgKyAnXCJdJyApLmZpbHRlciggZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuICEgJC5jb250YWlucyggJHJvb3QuZ2V0KCAwICksIHRoaXMgKTtcblx0XHR9ICkubGVuZ3RoID4gMDtcblx0fVxuXG5cdC8qKiBSZWdpc3RlciB0aGUgc2lnbmVkIHJlc291cmNlIGNvbnRleHQgdXNlZCBieSBmaW5hbCBib29raW5nIHN1Ym1pc3Npb24uICovXG5cdGZ1bmN0aW9uIHJlZ2lzdGVyX25hdGl2ZV9mb3JtKCAkbmF0aXZlICkge1xuXHRcdHZhciByZXNvdXJjZV9pZCA9IE51bWJlciggJG5hdGl2ZS5kYXRhKCAncmVzb3VyY2UtaWQnICkgfHwgMCApO1xuXHRcdHZhciBjb250ZXh0X3Rva2VuID0gU3RyaW5nKCAkbmF0aXZlLmF0dHIoICdkYXRhLXJlc291cmNlLXNlbGVjdG9yLWNvbnRleHQtdG9rZW4nICkgfHwgJycgKTtcblx0XHR2YXIgYWxsb3dfcGFzdCA9ICcxJyA9PT0gU3RyaW5nKCAkbmF0aXZlLmF0dHIoICdkYXRhLWFsbG93LXBhc3QnICkgfHwgJzAnICkgPyAxIDogMDtcblx0XHR2YXIgZXhpc3RpbmcgPSBnZXRfbmF0aXZlX2NvbnRleHQoIHJlc291cmNlX2lkICk7XG5cblx0XHRpZiAoICEgcmVzb3VyY2VfaWQgfHwgISBjb250ZXh0X3Rva2VuICkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRpZiAoIGV4aXN0aW5nICYmIGV4aXN0aW5nLmVsZW1lbnQgIT09ICRuYXRpdmUuZ2V0KCAwICkgKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0YWN0aXZlX25hdGl2ZV9jb250ZXh0c1sgcmVzb3VyY2VfaWQgXSA9IHtcblx0XHRcdGVsZW1lbnQ6ICRuYXRpdmUuZ2V0KCAwICksXG5cdFx0XHRyZXNvdXJjZV9pZDogcmVzb3VyY2VfaWQsXG5cdFx0XHRjb250ZXh0X3Rva2VuOiBjb250ZXh0X3Rva2VuLFxuXHRcdFx0YWxsb3dfcGFzdDogYWxsb3dfcGFzdFxuXHRcdH07XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHQvKiogUmVtb3ZlIG9uZSBuYXRpdmUgZm9ybSBmcm9tIHRoZSBsb2NhbCBzdWJtaXNzaW9uIHJlZ2lzdHJ5LiAqL1xuXHRmdW5jdGlvbiB1bnJlZ2lzdGVyX25hdGl2ZV9mb3JtKCAkbmF0aXZlICkge1xuXHRcdHZhciByZXNvdXJjZV9pZCA9IE51bWJlciggJG5hdGl2ZS5kYXRhKCAncmVzb3VyY2UtaWQnICkgfHwgMCApO1xuXHRcdHZhciBjb250ZXh0ID0gZ2V0X25hdGl2ZV9jb250ZXh0KCByZXNvdXJjZV9pZCApO1xuXHRcdGlmICggY29udGV4dCAmJiBjb250ZXh0LmVsZW1lbnQgPT09ICRuYXRpdmUuZ2V0KCAwICkgKSB7XG5cdFx0XHRkZWxldGUgYWN0aXZlX25hdGl2ZV9jb250ZXh0c1sgcmVzb3VyY2VfaWQgXTtcblx0XHR9XG5cdH1cblxuXHQvKiogUHJlcGFyZSBhIG5ld2x5IGluc2VydGVkIG5hdGl2ZSBmb3JtIGZvciByZXNvdXJjZS1ib3VuZCBzdWJtaXNzaW9uLiAqL1xuXHRmdW5jdGlvbiBwcmVwYXJlX25hdGl2ZV9mb3JtKCAkc2NvcGUgKSB7XG5cdFx0dmFyICRuYXRpdmUgPSAkc2NvcGUuZmluZCggJy53cGJjX2Jvb2tpbmdfcmVzb3VyY2Vfc2VsZWN0b3JfX25hdGl2ZV9mb3JtJyApLmZpcnN0KCk7XG5cdFx0aWYgKCAhICRuYXRpdmUubGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlZ2lzdGVyX25hdGl2ZV9mb3JtKCAkbmF0aXZlICk7XG5cdH1cblxuXHQvKiogQ29udmVydCBhIHNjcmlwdCBVUkwgdG8gdGhlIHNhbWUgYWJzb2x1dGUgZm9ybSB1c2VkIGJ5IHNjcmlwdCBlbGVtZW50cy4gKi9cblx0ZnVuY3Rpb24gZ2V0X2Fic29sdXRlX3NjcmlwdF91cmwoIHVybCApIHtcblx0XHR2YXIgYW5jaG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ2EnICk7XG5cdFx0YW5jaG9yLmhyZWYgPSBTdHJpbmcoIHVybCB8fCAnJyApO1xuXHRcdHJldHVybiBhbmNob3IuaHJlZjtcblx0fVxuXG5cdC8qKiBSZXR1cm4gYSByZWplY3RlZCBwcm9taXNlIGNhcnJ5aW5nIG9uZSBjb250cm9sbGVkIG1lc3NhZ2UuICovXG5cdGZ1bmN0aW9uIHJlamVjdGVkX3N0YWdlKCBtZXNzYWdlICkge1xuXHRcdHZhciBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTtcblx0XHRkZWZlcnJlZC5yZWplY3QoIHsgd3BiY19tZXNzYWdlOiBtZXNzYWdlIH0gKTtcblx0XHRyZXR1cm4gZGVmZXJyZWQucHJvbWlzZSgpO1xuXHR9XG5cblx0LyoqIEV4ZWN1dGUgcmVuZGVyZXIgc2NyaXB0cyBzZXF1ZW50aWFsbHkgd2hpbGUgdGhlIHJlcXVlc3Qgb3ducyB0aGUgc3RhZ2UuICovXG5cdGZ1bmN0aW9uIGV4ZWN1dGVfc2NyaXB0cyggc2NyaXB0cywgb3duc19zdGFnZSApIHtcblx0XHR2YXIgc2VxdWVuY2UgPSAkLkRlZmVycmVkKCkucmVzb2x2ZSgpLnByb21pc2UoKTtcblxuXHRcdCQuZWFjaCggc2NyaXB0cywgZnVuY3Rpb24gKCBpbmRleCwgc2NyaXB0ICkge1xuXHRcdFx0c2VxdWVuY2UgPSBzZXF1ZW5jZS50aGVuKCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGlmICggISBvd25zX3N0YWdlKCkgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHJlamVjdGVkX3N0YWdlKCAnJyApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICggc2NyaXB0LnNyYyApIHtcblx0XHRcdFx0XHR2YXIgYWJzb2x1dGVfdXJsID0gZ2V0X2Fic29sdXRlX3NjcmlwdF91cmwoIHNjcmlwdC5zcmMgKTtcblx0XHRcdFx0XHRpZiAoIGxvYWRlZF9zY3JpcHRfdXJsc1sgYWJzb2x1dGVfdXJsIF0gKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gJC5hamF4KCB7IHVybDogYWJzb2x1dGVfdXJsLCBkYXRhVHlwZTogJ3NjcmlwdCcsIGNhY2hlOiB0cnVlIH0gKS50aG
424VuKCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRsb2FkZWRfc2NyaXB0X3VybHNbIGFic29sdXRlX3VybCBdID0gdHJ1ZTtcblx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCBzY3JpcHQuY29kZSApIHtcblx0XHRcdFx0XHQkLmdsb2JhbEV2YWwoIHNjcmlwdC5jb2RlICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH0gKTtcblx0XHR9ICk7XG5cblx0XHRyZXR1cm4gc2VxdWVuY2U7XG5cdH1cblxuXHQvKiogSW5pdGlhbGl6ZSBuYXRpdmUgY29udHJvbHMgd2hvc2UgY29yZSBoYW5kbGVycyBiaW5kIG9uIGRvY3VtZW50IHJlYWR5LiAqL1xuXHRmdW5jdGlvbiBpbml0aWFsaXplX2FqYXhfZm9ybV9jb250cm9scygpIHtcblx0XHRpZiAoIHR5cGVvZiB3aW5kb3cud3BiY19ob29rX19pbml0X2Jvb2tpbmdfZm9ybV93aXphcmRfYnV0dG9ucyA9PT0gJ2Z1bmN0aW9uJyApIHtcblx0XHRcdHdpbmRvdy53cGJjX2hvb2tfX2luaXRfYm9va2luZ19mb3JtX3dpemFyZF9idXR0b25zKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqIERlc3Ryb3kgbmF0aXZlIGNhbGVuZGFycyBhbmQgdW5yZWdpc3RlciBjb250ZXh0IGJlZm9yZSBzdGFnZSByZW1vdmFsLiAqL1xuXHRmdW5jdGlvbiBjbGVhbnVwX25hdGl2ZV9mb3JtKCAkcm9vdCApIHtcblx0XHQkcm9vdC5maW5kKCAnLndwYmNfYm9va2luZ19yZXNvdXJjZV9zZWxlY3Rvcl9fbmF0aXZlX2Zvcm0nICkuZWFjaCggZnVuY3Rpb24gKCkge1xuXHRcdFx0dmFyICRuYXRpdmUgPSAkKCB0aGlzICk7XG5cdFx0XHR2YXIgcmVzb3VyY2VfaWQgPSBOdW1iZXIoICRuYXRpdmUuZGF0YSggJ3Jlc291cmNlLWlkJyApIHx8IDAgKTtcblx0XHRcdHZhciAkY2FsZW5kYXIgPSAkbmF0aXZlLmZpbmQoICcjY2FsZW5kYXJfYm9va2luZycgKyByZXNvdXJjZV9pZCApO1xuXG5cdFx0XHR1bnJlZ2lzdGVyX25hdGl2ZV9mb3JtKCAkbmF0aXZlICk7XG5cdFx0XHRpZiAoICEgcmVzb3VyY2VfaWQgfHwgISAkY2FsZW5kYXIubGVuZ3RoIHx8ICEgJC5kYXRlcGljayB8fCB0eXBlb2YgJGNhbGVuZGFyLmRhdGVwaWNrICE9PSAnZnVuY3Rpb24nICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdHZhciBpbnN0YW5jZSA9IHR5cGVvZiAkLmRhdGVwaWNrLl9nZXRJbnN0ID09PSAnZnVuY3Rpb24nID8gJC5kYXRlcGljay5fZ2V0SW5zdCggJGNhbGVuZGFyLmdldCggMCApICkgOiBudWxsO1xuXHRcdFx0XHRpZiAoIGluc3RhbmNlICkge1xuXHRcdFx0XHRcdCRjYWxlbmRhci5kYXRlcGljayggJ2Rlc3Ryb3knICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKCBlcnJvciApIHtcblx0XHRcdFx0JGNhbGVuZGFyLnJlbW92ZUNsYXNzKCAnaGFzRGF0ZXBpY2snICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9XG5cblx0LyoqIFJlc3RvcmUgdGhlIGNvbmZpZ3VyZWQgaW5pdGlhbCBSZXNvdXJjZSBjaG9pY2UgYWZ0ZXIgU3RhcnQgb3Zlci4gKi9cblx0ZnVuY3Rpb24gcmVzdG9yZV9yZXNvdXJjZV9zZWxlY3Rpb24oICRyb290ICkge1xuXHRcdHZhciByZXNvdXJjZV9pZCA9IE51bWJlciggJHJvb3QuYXR0ciggJ2RhdGEtc2VsZWN0ZWQtcmVzb3VyY2UtaWQnICkgfHwgMCApO1xuXHRcdGlmICggISByZXNvdXJjZV9pZCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dmFyICRpbnB1dCA9ICRyb290LmZpbmQoICdbbmFtZT1cIndwYmNfcmVzb3VyY2Vfc2VsZWN0b3JfcmVzb3VyY2VcIl1bdmFsdWU9XCInICsgcmVzb3VyY2VfaWQgKyAnXCJdJyApLmZpcnN0KCk7XG5cdFx0aWYgKCAkaW5wdXQubGVuZ3RoICkge1xuXHRcdFx0JGlucHV0LmNsb3Nlc3QoICcud3BiY19ib29raW5nX3Jlc291cmNlX3NlbGVjdG9yX19jaG9pY2VzJyApLmZpbmQoICcud3BiY19ib29raW5nX3Jlc291cmNlX3NlbGVjdG9yX19jaG9pY2UnICkucmVtb3ZlQ2xhc3MoICdpcy1zZWxlY3RlZCcgKTtcblx0XHRcdCRpbnB1dC5wcm9wKCAnY2hlY2tlZCcsIHRydWUgKS5jbG9zZXN0KCAnLndwYmNfYm9va2luZ19yZXNvdXJjZV9zZWxlY3Rvcl9fY2hvaWNlJyApLmFkZENsYXNzKCAnaXMtc2VsZWN0ZWQnICk7XG5cdFx0fVxuXHR9XG5cblx0LyoqIEZvY3VzIHRoZSBuZXcgc3RhZ2UgaGVhZGluZyBhbmQga2VlcCB0aGUgY29tcG9uZW50IG5lYXIgdGhlIHZpZXdwb3J0LiAqL1xuXHRmdW5jdGlvbiBmb2N1c19zdGFnZSggJHJvb3QgKSB7XG5cdFx0dmFyICR0YXJnZXQgPSAkcm9vdC5maW5kKCAnPiAud3BiY19ib29raW5nX3Jlc291cmNlX3NlbGVjdG9yX19zdGFnZSAud3BiY19ib29raW5nX3Jlc291cmNlX3NlbGVjdG9yX19oZWFkaW5nIGgzLCA+IC53cGJjX2Jvb2tpbmdfcmVzb3VyY2Vfc2VsZWN0b3JfX3N0YWdlIC53cGJjX2Jvb2tpbmdfcmVzb3VyY2Vfc2VsZWN0b3JfX25vdGljZScgKS5maXJzdCgpO1xuXHRcdGlmICggJHRhcmdldC5sZW5ndGggKSB7XG5cdFx0XHQkdGFyZ2V0LmF0dHIoICd0YWJpbmRleCcsICctMScgKTtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdCR0YXJnZXQuZ2V0KCAwICkuZm9jdXMoIHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9ICk7XG5cdFx0XHR9IGNhdGNoICggZXJyb3IgKSB7XG5cdFx0XHRcdCR0YXJnZXQudHJpZ2dlciggJ2ZvY3VzJyApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICggJHJvb3QuZ2V0KCAwICkgJiYgdHlwZW9mICRyb290LmdldCggMCApLnNjcm9sbEludG9WaWV3ID09PSAnZnVuY3Rpb24nICkge1xuXHRcdFx0dmFyIHJlZHVjZV9tb3Rpb24gPSB3aW5kb3cubWF0Y2hNZWRpYSAmJiB3aW5kb3cubWF0Y2hNZWRpYSggJyhwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpJyApLm1hdGNoZXM7XG5cdFx0XHQkcm9vdC5nZXQoIDAgKS5zY3JvbGxJbnRvVmlldyggeyBiZWhhdmlvcjogcmVkdWNlX21vdGlvbiA/ICdhdXRvJyA6ICdzbW9vdGgnLCBibG9jazogJ25lYXJlc3QnIH0gKTtcblx0XHR9XG5cdH1cblxuXHQvKiogRGV0ZXJtaW5lIHdoZXRoZXIgYW4gQUpBWCBjYWxsYmFjayBzdGlsbCBvd25zIHRoZSBjb21wb25lbnQgc3RhdGUuICovXG5cdGZ1bmN0aW9uIGlzX2N1cnJlbnRfcmVxdWVzdCggJHJvb3QsIHJlcXVlc3RfaWQgKSB7XG5cdFx0cmV0dXJuIE51bWJlciggJHJvb3QuZGF0YSggJ3dwYmMtcmVzb3VyY2Utc2VsZWN0b3ItcmVxdWVzdC1pZCcgKSB8fCAwICkgPT09IE51bWJlciggcmVxdWVzdF9pZCApO1xuXHR9XG5cblx0LyoqIEZpbmlzaCBvbmx5IHRoZSBjdXJyZW50IHJlcXVlc3Qgc28gc3RhbGUgY2FsbGJhY2tzIGNhbm5vdCBhbHRlciB0aGUgVUkuICovXG5cdGZ1bmN0aW9uIGZpbmlzaF9yZXF1ZXN0KCAkcm9vdCwgcmVxdWVzdF9pZCApIHtcblx0XHRpZiAoICEgaXNfY3VycmVudF9yZXF1ZXN0KCAkcm9vdCwgcmVxdWVzdF9pZCApICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHQkcm9vdC5yZW1vdmVEYXRhKCAnd3BiYy1yZXNvdXJjZS1zZWxlY3Rvci1yZXF1ZXN0JyApO1xuXHRcdHNldF9sb2FkaW5nKCAkcm9vdCwgZmFsc2UgKTtcblx0fVxuXG5cdC8qKiBSZXBsYWNlIGEgY29tcGxldGUgc3RhZ2Ugd2l0aCBET00tYmVmb3JlLXNjcmlwdCBpbml0aWFsaXphdGlvbiBvcmRlcmluZy4gKi9cblx0ZnVuY3Rpb24gcmVwbGFjZV9zdGFnZSggJHJvb3QsIGh0bWwsIHN0YWdlLCByZXNvdXJjZV9pZCwgcmVxdWVzdF9pZCApIHtcblx0XHRpZiAoICEgaXNfY3VycmVudF9yZXF1ZXN0KCAkcm9vdCwgcmVxdWVzdF9pZCApICkge1xuXHRcdFx0cmV0dXJuIHJlamVjdGVkX3N0YWdlKCAnJyApO1xuXHRcdH1cblx0XHRpZiAoICdib29raW5nJyA9PT0gc3RhZ2UgJiYgaGFzX2R1cGxpY2F0ZV9yZXNvdXJjZV9mb3JtKCAkcm9vdCwgcmVzb3VyY2VfaWQgKSApIHtcblx0XHRcdHJldHVybi
424ByZWplY3RlZF9zdGFnZSggY29uZmlnLmR1cGxpY2F0ZV9yZXNvdXJjZSApO1xuXHRcdH1cblxuXHRcdHZhciBwYXJzZWQgPSAkLnBhcnNlSFRNTCggU3RyaW5nKCBodG1sIHx8ICcnICksIGRvY3VtZW50LCB0cnVlICkgfHwgW107XG5cdFx0dmFyIHNjcmlwdHMgPSBbXTtcblx0XHR2YXIgJGNvbnRhaW5lciA9ICQoICc8ZGl2PicgKS5hcHBlbmQoIHBhcnNlZCApO1xuXG5cdFx0JGNvbnRhaW5lci5maW5kKCAnc2NyaXB0JyApLmFkZEJhY2soICdzY3JpcHQnICkuZWFjaCggZnVuY3Rpb24gKCkge1xuXHRcdFx0c2NyaXB0cy5wdXNoKCB7IHNyYzogdGhpcy5zcmMgfHwgJycsIGNvZGU6IHRoaXMuc3JjID8gJycgOiAoIHRoaXMudGV4dCB8fCB0aGlzLnRleHRDb250ZW50IHx8ICcnICkgfSApO1xuXHRcdFx0JCggdGhpcyApLnJlbW92ZSgpO1xuXHRcdH0gKTtcblxuXHRcdGNsZWFudXBfbmF0aXZlX2Zvcm0oICRyb290ICk7XG5cdFx0JHJvb3QuYXR0ciggJ2RhdGEtcmVzb3VyY2Utc2VsZWN0b3Itc3RhZ2UnLCBzdGFnZSApO1xuXHRcdCRyb290LmZpbmQoICc+IC53cGJjX2Jvb2tpbmdfcmVzb3VyY2Vfc2VsZWN0b3JfX3N0YWdlJyApLmVtcHR5KCkuYXBwZW5kKCAkY29udGFpbmVyLmNvbnRlbnRzKCkgKTtcblxuXHRcdGlmICggISBwcmVwYXJlX25hdGl2ZV9mb3JtKCAkcm9vdCApICkge1xuXHRcdFx0Y2xlYW51cF9uYXRpdmVfZm9ybSggJHJvb3QgKTtcblx0XHRcdCRyb290LmZpbmQoICcud3BiY19ib29raW5nX3Jlc291cmNlX3NlbGVjdG9yX19uYXRpdmVfZm9ybSA6aW5wdXQnICkucHJvcCggJ2Rpc2FibGVkJywgdHJ1ZSApO1xuXHRcdFx0cmV0dXJuIHJlamVjdGVkX3N0YWdlKCBjb25maWcuaW5pdGlhbGl6YXRpb25fZXJyb3IgfHwgY29uZmlnLmVycm9yICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGV4ZWN1dGVfc2NyaXB0cyggc2NyaXB0cywgZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIGlzX2N1cnJlbnRfcmVxdWVzdCggJHJvb3QsIHJlcXVlc3RfaWQgKTtcblx0XHR9ICkudGhlbiggZnVuY3Rpb24gKCkge1xuXHRcdFx0aWYgKCAhIGlzX2N1cnJlbnRfcmVxdWVzdCggJHJvb3QsIHJlcXVlc3RfaWQgKSApIHtcblx0XHRcdFx0cmV0dXJuIHJlamVjdGVkX3N0YWdlKCAnJyApO1xuXHRcdFx0fVxuXHRcdFx0aW5pdGlhbGl6ZV9hamF4X2Zvcm1fY29udHJvbHMoKTtcblx0XHRcdGlmICggJ3Jlc291cmNlJyA9PT0gc3RhZ2UgKSB7XG5cdFx0XHRcdHJlc3RvcmVfcmVzb3VyY2Vfc2VsZWN0aW9uKCAkcm9vdCApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fVxuXG5cdC8qKiBSZXF1ZXN0IGFuZCByZW5kZXIgdGhlIG5leHQgQm9va2luZyBSZXNvdXJjZSBzZWxlY3RvciBzdGFnZS4gKi9cblx0ZnVuY3Rpb24gcmVzb2x2ZV9zdGFnZSggJHJvb3QsIHJlc291cmNlX2lkICkge1xuXHRcdGlmICggISAkcm9vdCB8fCAhICRyb290Lmxlbmd0aCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRyZXNvdXJjZV9pZCA9IE51bWJlciggcmVzb3VyY2VfaWQgfHwgMCApO1xuXHRcdGlmICggcmVzb3VyY2VfaWQgKSB7XG5cdFx0XHQkcm9vdC5hdHRyKCAnZGF0YS1zZWxlY3RlZC1yZXNvdXJjZS1pZCcsIHJlc291cmNlX2lkICk7XG5cdFx0fVxuXG5cdFx0dmFyIHByZXZpb3VzX3JlcXVlc3QgPSAkcm9vdC5kYXRhKCAnd3BiYy1yZXNvdXJjZS1zZWxlY3Rvci1yZXF1ZXN0JyApO1xuXHRcdHZhciByZXF1ZXN0X2lkID0gTnVtYmVyKCAkcm9vdC5kYXRhKCAnd3BiYy1yZXNvdXJjZS1zZWxlY3Rvci1yZXF1ZXN0LWlkJyApIHx8IDAgKSArIDE7XG5cdFx0JHJvb3QuZGF0YSggJ3dwYmMtcmVzb3VyY2Utc2VsZWN0b3ItcmVxdWVzdC1pZCcsIHJlcXVlc3RfaWQgKTtcblx0XHRpZiAoIHByZXZpb3VzX3JlcXVlc3QgJiYgcHJldmlvdXNfcmVxdWVzdC5yZWFkeVN0YXRlICE9PSA0ICkge1xuXHRcdFx0cHJldmlvdXNfcmVxdWVzdC5hYm9ydCgpO1xuXHRcdH1cblxuXHRcdGNsZWFyX2Vycm9yKCAkcm9vdCApO1xuXHRcdHNldF9sb2FkaW5nKCAkcm9vdCwgdHJ1ZSApO1xuXHRcdHZhciByZXF1ZXN0ID0gJC5wb3N0KCBjb25maWcuYWpheF91cmwsIHtcblx0XHRcdGFjdGlvbjogY29uZmlnLmFjdGlvbixcblx0XHRcdG5vbmNlOiBjb25maWcubm9uY2UsXG5cdFx0XHRjb25maWdfdG9rZW46ICRyb290LmF0dHIoICdkYXRhLWNvbmZpZy10b2tlbicgKSB8fCAnJyxcblx0XHRcdHJlc291cmNlX2lkOiByZXNvdXJjZV9pZFxuXHRcdH0gKTtcblx0XHQkcm9vdC5kYXRhKCAnd3BiYy1yZXNvdXJjZS1zZWxlY3Rvci1yZXF1ZXN0JywgcmVxdWVzdCApO1xuXG5cdFx0cmVxdWVzdC5kb25lKCBmdW5jdGlvbiAoIHJlc3BvbnNlICkge1xuXHRcdFx0aWYgKCAhIGlzX2N1cnJlbnRfcmVxdWVzdCggJHJvb3QsIHJlcXVlc3RfaWQgKSApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCAhIHJlc3BvbnNlIHx8ICEgcmVzcG9uc2Uuc3VjY2VzcyB8fCAhIHJlc3BvbnNlLmRhdGEgKSB7XG5cdFx0XHRcdHNob3dfZXJyb3IoICRyb290LCByZXNwb25zZSAmJiByZXNwb25zZS5kYXRhICYmIHJlc3BvbnNlLmRhdGEubWVzc2FnZSA/IHJlc3BvbnNlLmRhdGEubWVzc2FnZSA6IGNvbmZpZy5lcnJvciApO1xuXHRcdFx0XHRmaW5pc2hfcmVxdWVzdCggJHJvb3QsIHJlcXVlc3RfaWQgKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgc3RhZ2UgPSByZXNwb25zZS5kYXRhLnN0YWdlIHx8ICcnO1xuXHRcdFx0dmFyIHJlcGxhY2VtZW50ID0gcmVwbGFjZV9zdGFnZSggJHJvb3QsIHJlc3BvbnNlLmRhdGEuaHRtbCwgc3RhZ2UsIHJlc3BvbnNlLmRhdGEucmVzb3VyY2VfaWQsIHJlcXVlc3RfaWQgKTtcblx0XHRcdHJlcGxhY2VtZW50LmRvbmUoIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0aWYgKCAhIGlzX2N1cnJlbnRfcmVxdWVzdCggJHJvb3QsIHJlcXVlc3RfaWQgKSApIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCBOdW1iZXIoIHJlc3BvbnNlLmRhdGEucmVzb3VyY2VfaWQgfHwgMCApICkge1xuXHRcdFx0XHRcdCRyb290LmF0dHIoICdkYXRhLXNlbGVjdGVkLXJlc291cmNlLWlkJywgTnVtYmVyKCByZXNwb25zZS5kYXRhLnJlc291cmNlX2lkICkgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRmaW5pc2hfcmVxdWVzdCggJHJvb3QsIHJlcXVlc3RfaWQgKTtcblx0XHRcdFx0Zm9jdXNfc3RhZ2UoICRyb290ICk7XG5cdFx0XHR9ICkuZmFpbCggZnVuY3Rpb24gKCBlcnJvciApIHtcblx0XHRcdFx0aWYgKCAhIGlzX2N1cnJlbnRfcmVxdWVzdCggJHJvb3QsIHJlcXVlc3RfaWQgKSApIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0c2hvd19lcnJvciggJHJvb3QsIGVycm9yICYmIGVycm9yLndwYmNfbWVzc2FnZSA/IGVycm9yLndwYmNfbWVzc2FnZSA6ICggY29uZmlnLmluaXRpYWxpemF0aW9uX2Vycm9yIHx8IGNvbmZpZy5lcnJvciApICk7XG5cdFx0XHRcdGZpbmlzaF9yZXF1ZXN0KCAkcm9vdCwgcmVxdWVzdF9pZCApO1xuXHRcdFx0fSApO1xuXHRcdH0gKS5mYWlsKCBmdW5jdGlvbiAoIHhociwgc3RhdHVzICkge1xuXHRcdFx0aWYgKCAnYWJvcnQnID09PSBzdGF0dXMgfHwgISBpc19jdXJyZW50X3JlcXVlc3QoICRyb290LCByZXF1ZXN0X2lkICkgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdHZhciByZXNwb25zZSA9IHhoci5yZXNwb25zZUpTT047XG5cdFx0XHRzaG93X2Vycm9yKCAkcm9vdCwgcmVzcG9uc2UgJiYgcmVzcG9uc2UuZGF0YSAmJiByZXNwb25zZS5kYXRhLm1lc3NhZ2UgPyByZXNwb25zZS5kYXRhLm1lc3NhZ2UgO
424iBjb25maWcuZXJyb3IgKTtcblx0XHRcdGZpbmlzaF9yZXF1ZXN0KCAkcm9vdCwgcmVxdWVzdF9pZCApO1xuXHRcdH0gKTtcblx0fVxuXG5cdC8qKiBSZXNvbHZlIHRoZSBzZWxlY3RlZCBCb29raW5nIFJlc291cmNlIHRocm91Z2ggQUpBWC4gKi9cblx0JCggZG9jdW1lbnQgKS5vbiggJ3N1Ym1pdCcsICcud3BiY19ib29raW5nX3Jlc291cmNlX3NlbGVjdG9yX19zZWxlY3Rpb25fZm9ybScsIGZ1bmN0aW9uICggZXZlbnQgKSB7XG5cdFx0aWYgKCAhIGNvbmZpZy5hamF4X3VybCB8fCAhIGNvbmZpZy5hY3Rpb24gKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0dmFyICRmb3JtID0gJCggdGhpcyApO1xuXHRcdHJlc29sdmVfc3RhZ2UoICRmb3JtLmNsb3Nlc3QoICcud3BiY19ib29raW5nX3Jlc291cmNlX3NlbGVjdG9yJyApLCBnZXRfc2VsZWN0ZWRfcmVzb3VyY2VfaWQoICRmb3JtICkgKTtcblx0fSApO1xuXG5cdC8qKiBLZWVwIHNlbGVjdGVkIGNhcmQgc3R5bGluZyBpbmRlcGVuZGVudCBmcm9tIENTUyA6aGFzKCkgc3VwcG9ydC4gKi9cblx0JCggZG9jdW1lbnQgKS5vbiggJ2NoYW5nZScsICcud3BiY19ib29raW5nX3Jlc291cmNlX3NlbGVjdG9yX19jaG9pY2UgPiBpbnB1dCcsIGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgJGlucHV0ID0gJCggdGhpcyApO1xuXHRcdCRpbnB1dC5jbG9zZXN0KCAnLndwYmNfYm9va2luZ19yZXNvdXJjZV9zZWxlY3Rvcl9fY2hvaWNlcycgKS5maW5kKCAnLndwYmNfYm9va2luZ19yZXNvdXJjZV9zZWxlY3Rvcl9fY2hvaWNlJyApLnJlbW92ZUNsYXNzKCAnaXMtc2VsZWN0ZWQnICk7XG5cdFx0JGlucHV0LmNsb3Nlc3QoICcud3BiY19ib29raW5nX3Jlc291cmNlX3NlbGVjdG9yX19jaG9pY2UnICkuYWRk
424Q2xhc3MoICdpcy1zZWxlY3RlZCcgKTtcblx0fSApO1xuXG5cdC8qKiBGaWx0ZXIgY2FyZHMgd2l0aG91dCBjaGFuZ2luZyB0aGUgc2VydmVyLWF1dGhvcml6ZWQgUmVzb3VyY2Ugc2V0LiAqL1xuXHQkKCBkb2N1bWVudCApLm9uKCAnaW5wdXQnLCAnLndwYmNfYm9va2luZ19yZXNvdXJjZV9jYXRhbG9nIFtkYXRhLXdwYmMtcmVzb3VyY2UtY2F0YWxvZy1zZWFyY2hdJywgZnVuY3Rpb24gKCkge1xuXHRcdGZpbHRlcl9yZXNvdXJjZV9jYXRhbG9nKCAkKCB0aGlzICkuY2xvc2VzdCggJ1tkYXRhLXdwYmMtcmVzb3VyY2UtY2F0YWxvZ10nICkgKTtcblx0fSApO1xuXG5cdC8qKiBSZXR1cm4gdG8gUmVzb3VyY2Ugc2VsZWN0aW9uIHdpdGhvdXQgcmVsb2FkaW5nIHRoZSBwdWJsaWMgcGFnZS4gKi9cblx0JCggZG9jdW1lbnQgKS5vbiggJ2NsaWNrJywgJy53cGJjX2Jvb2tpbmdfcmVzb3VyY2Vfc2VsZWN0b3IgW2RhdGEtd3BiYy1yZXNvdXJjZS1zZWxlY3Rvci1hY3Rpb249XCJzdGFydC1vdmVyXCJdJywgZnVuY3Rpb24gKCBldmVudCApIHtcblx0XHRpZiAoICEgY29uZmlnLmFqYXhfdXJsIHx8ICEgY29uZmlnLmFjdGlvbiApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHR2YXIgJHJvb3QgPSAkKCB0aGlzICkuY2xvc2VzdCggJy53cGJjX2Jvb2tpbmdfcmVzb3VyY2Vfc2VsZWN0b3InICk7XG5cdFx0aWYgKCAkcm9vdC5oYXNDbGFzcyggJ2lzLWxvYWRpbmcnICkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHJlc29sdmVfc3RhZ2UoICRyb290LCAwICk7XG5cdH0gKTtcblxuXHQvKiogQWRkIHRoZSBzaWduZWQgcmVzb3VyY2UgY29udGV4dCB0byB0aGUgY29yZSBib29raW5nLWNyZWF0ZSByZXF1ZXN0LiAqL1xuXHQkKCAnYm9keScgKS5vbiggJ3dwYmNfYmVmb3JlX2Jvb2tpbmdfY3JlYXRlLndwYmNfYm9va2luZ19yZXNvdXJjZV9zZWxlY3RvcicsIGZ1bmN0aW9uICggZXZlbnQsIHJlc291cmNlX2lkLCBwYXJhbXMgKSB7XG5cdFx0dmFyIGNvbnRleHQgPSBnZXRfbmF0aXZlX2NvbnRleHQoIHJlc291cmNlX2lkICk7XG5cdFx0aWYgKCAhIGNvbnRleHQgfHwgISBwYXJhbXMgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHBhcmFtcy5yZXNvdXJjZV9zZWxlY3Rvcl9yZXF1aXJlZCA9IDE7XG5cdFx0cGFyYW1zLnJlc291cmNlX3NlbGVjdG9yX2NvbnRleHRfdG9rZW4gPSBjb250ZXh0LmNvbnRleHRfdG9rZW47XG5cdFx0cGFyYW1zLmFsbG93X3Bhc3QgPSBjb250ZXh0LmFsbG93X3Bhc3Q7XG5cdH0gKTtcblxuXHQkKCBmdW5jdGlvbiAoKSB7XG5cdFx0JCggJy53cGJjX2Jvb2tpbmdfcmVzb3VyY2Vfc2VsZWN0b3InICkuZWFjaCggZnVuY3Rpb24gKCkge1xuXHRcdFx0dmFyICRyb290ID0gJCggdGhpcyApO1xuXHRcdFx0dmFyICRuYXRpdmUgPSAkcm9vdC5maW5kKCAnLndwYmNfYm9va2luZ19yZXNvdXJjZV9zZWxlY3Rvcl9fbmF0aXZlX2Zvcm0nICkuZmlyc3QoKTtcblx0XHRcdGlmICggJG5hdGl2ZS5sZW5ndGggKSB7XG5cdFx0XHRcdCRyb290LmF0dHIoICdkYXRhLXNlbGVjdGVkLXJlc291cmNlLWlkJywgTnVtYmVyKCAkbmF0aXZlLmRhdGEoICdyZXNvdXJjZS1pZCcgKSB8fCAwICkgKTtcblx0XHRcdH1cblx0XHRcdHZhciBkdXBsaWNhdGUgPSAkbmF0aXZlLmxlbmd0aCAmJiBoYXNfZHVwbGljYXRlX3Jlc291cmNlX2Zvcm0oICRyb290LCBOdW1iZXIoICRuYXRpdmUuZGF0YSggJ3Jlc291cmNlLWlkJyApIHx8IDAgKSApO1xuXHRcdFx0aWYgKCBkdXBsaWNhdGUgfHwgISBwcmVwYXJlX25hdGl2ZV9mb3JtKCAkcm9vdCApICkge1xuXHRcdFx0XHRjbGVhbnVwX25hdGl2ZV9mb3JtKCAkcm9vdCApO1xuXHRcdFx0XHQkcm9vdC5maW5kKCAnLndwYmNfYm9va2luZ19yZXNvdXJjZV9zZWxlY3Rvcl9fbmF0aXZlX2Zvcm0gOmlucHV0JyApLnByb3AoICdkaXNhYmxlZCcsIHRydWUgKTtcblx0XHRcdFx0c2hvd19lcnJvciggJHJvb3QsIGR1cGxpY2F0ZSA/IGNvbmZpZy5kdXBsaWNhdGVfcmVzb3VyY2UgOiBjb25maWcuaW5pdGlhbGl6YXRpb25fZXJyb3IgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0gKTtcbn0gKSggd2luZG93LCBqUXVlcnkgKTtcbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQSxDQUFFLFVBQVdBLE1BQU0sRUFBRUMsQ0FBQyxFQUFHO0VBQ3hCLFlBQVk7O0VBRVosSUFBSUMsTUFBTSxHQUFHRixNQUFNLENBQUNHLHFDQUFxQyxJQUFJLENBQUMsQ0FBQztFQUMvRCxJQUFJQyxzQkFBc0IsR0FBRyxDQUFDLENBQUM7RUFDL0IsSUFBSUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO0VBRTNCSixDQUFDLENBQUUsYUFBYyxDQUFDLENBQUNLLElBQUksQ0FBRSxZQUFZO0lBQ3BDRCxrQkFBa0IsQ0FBRUUsTUFBTSxDQUFFLElBQUksQ0FBQ0MsR0FBRyxJQUFJLEVBQUcsQ0FBQyxDQUFFLEdBQUcsSUFBSTtFQUN0RCxDQUFFLENBQUM7O0VBRUg7RUFDQSxTQUFTQyx3QkFBd0JBLENBQUVDLEtBQUssRUFBRztJQUMxQyxPQUFPQyxNQUFNLENBQUVELEtBQUssQ0FBQ0UsSUFBSSxDQUFFLGtEQUFtRCxDQUFDLENBQUNDLEtBQUssQ0FBQyxDQUFDLENBQUNDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBRSxDQUFDO0VBQ3JHOztFQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNDLFNBQVNDLHVCQUF1QkEsQ0FBRUMsUUFBUSxFQUFHO0lBQzVDLElBQUlDL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
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.