PluginProbe
Booking Calendar / 11.1
Booking Calendar v11.1
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 10.11 10.11.2 All 203 releases
booking / includes / page-form-builder / _out / export / debug-ui.js

debug-ui.js in Booking Calendar 11.1, at includes/page-form-builder/_out/export/debug-ui.js

714 lines 85.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 "use strict";
2
3 /**
4 * Debug UI — populate existing textareas, bind existing buttons.
5 *
6 * IMPORTANT:
7 * - This file does NOT create any markup anymore.
8 * - All blocks/textareas/buttons must exist in PHP template.
9 *
10 * @file: ../includes/page-form-builder/_out/export/debug-ui.js
11 */
12 (function (w, d) {
13 'use strict';
14
15 // Prevent double init (if file is injected twice).
16 if (w.__wpbc_bfb__debug_ui_inited === '1') {
17 return;
18 }
19 w.__wpbc_bfb__debug_ui_inited = '1';
20 const DEBUG_PANEL_ID = 'wpbc_bfb__debug_export_panel';
21 const DEBUG_TAB_SEL = '.wpbc_bfb__tab_section__debug_tab';
22 function has_debug_ui() {
23 return !!(d.getElementById(DEBUG_PANEL_ID) || d.querySelector(DEBUG_TAB_SEL));
24 }
25 if (!has_debug_ui()) {
26 return;
27 }
28
29 // -----------------------------------------------------------------------------------------------------------------
30 // Helpers
31 // -----------------------------------------------------------------------------------------------------------------
32 function show_message(msg, type, timeout) {
33 const m = String(msg || '');
34 const t = String(type || 'info');
35 if (typeof w.wpbc_admin_show_message === 'function') {
36 try {
37 w.wpbc_admin_show_message(m, t, timeout || 6000);
38 return;
39 } catch (_e) {}
40 }
41
42 // Fallback.
43 if (t === 'error') {
44 console.error(m);
45 } else {
46 console.log(m);
47 }
48 }
49 function safe_json_parse(text) {
50 const raw = String(text == null ? '' : text).trim();
51 if (!raw) {
52 return null;
53 }
54 try {
55 return JSON.parse(raw);
56 } catch (e) {
57 return null;
58 }
59 }
60
61 // ---------------------------
62 // Safe event dispatch helper (reuse preview contract)
63 // ---------------------------
64 function dispatch_event_safe(event_name, detail) {
65 if (typeof w.wpbc_bfb__dispatch_event_safe === 'function') {
66 try {
67 w.wpbc_bfb__dispatch_event_safe(event_name, detail);
68 return;
69 } catch (_e) {}
70 }
71 try {
72 d.dispatchEvent(new CustomEvent(event_name, {
73 detail: detail || {}
74 }));
75 } catch (_e2) {}
76 }
77 function with_builder(cb) {
78 if (w.wpbc_bfb_api && w.wpbc_bfb_api.ready && typeof w.wpbc_bfb_api.ready.then === 'function') {
79 w.wpbc_bfb_api.ready.then(function (b) {
80 cb(b || w.wpbc_bfb || null);
81 });
82 return;
83 }
84 cb(w.wpbc_bfb || null);
85 }
86 function is_debug_tab_visible() {
87 const root = d.querySelector(DEBUG_TAB_SEL);
88 if (!root) {
89 return true;
90 }
91 try {
92 if (root.hasAttribute('hidden')) {
93 return false;
94 }
95 const aria = String(root.getAttribute('aria-hidden') || '').toLowerCase();
96 if (aria === 'true') {
97 return false;
98 }
99 } catch (_e) {}
100 return true;
101 }
102 function get_debug_panel() {
103 return d.getElementById(DEBUG_PANEL_ID) || null;
104 }
105 function set_value(textarea_id, value) {
106 const el = d.getElementById(textarea_id);
107 if (!el) {
108 return;
109 }
110 el.value = String(value || '');
111 try {
112 el.dispatchEvent(new Event('input', {
113 bubbles: true
114 }));
115 } catch (_) {}
116 }
117 function set_value_if_empty(textarea_id, value) {
118 const el = d.getElementById(textarea_id);
119 if (!el) {
120 return;
121 }
122 if (String(el.value || '').trim() !== '') {
123 return;
124 }
125 set_value(textarea_id, value);
126 }
127 function copy_text_to_clipboard(text, btn) {
128 const raw = String(text || '');
129 if (!raw) {
130 return;
131 }
132 if (typeof w.wpbc_copy_to_clipboard === 'function') {
133 try {
134 const orig = btn ? String(btn.textContent || '') : '';
135 w.wpbc_copy_to_clipboard(raw).then(function (ok) {
136 if (!btn) {
137 return;
138 }
139 btn.textContent = ok ? 'Copied!' : 'Press Ctrl/Cmd+C to copy';
140 w.setTimeout(function () {
141 btn.textContent = orig;
142 }, 1500);
143 }, function () {
144 if (btn) {
145 btn.textContent = 'Press Ctrl/Cmd+C to copy';
146 }
147 });
148 return;
149 } catch (_e) {}
150 }
151 show_message('Copy helper is not available. Please copy manually.', 'info', 4000);
152 }
153
154 // -----------------------------------------------------------------------------------------------------------------
155 // Data getters
156 // -----------------------------------------------------------------------------------------------------------------
157 function get_current_form_name() {
158 const cfg = w.WPBC_BFB_Ajax || {};
159 const v = cfg && cfg.form_name ? String(cfg.form_name) : '';
160 return v ? v : 'standard';
161 }
162
163 // ---------------------------
164 // Builder structure getter
165 // ---------------------------
166 function get_current_structure() {
167 if (w.wpbc_bfb && typeof w.wpbc_bfb.get_structure === 'function') {
168 try {
169 return w.wpbc_bfb.get_structure();
170 } catch (_e) {
171 return [];
172 }
173 }
174 return [];
175 }
176
177 // ---------------------------
178 // Settings collector (reuses Preview contract)
179 // ---------------------------
180 function get_current_form_settings(form_name) {
181 let form_settings = {
182 options: {},
183 css_vars: {}
184 };
185 dispatch_event_safe('wpbc:bfb:form_settings:collect', {
186 settings: form_settings,
187 form_name: form_name || 'standard'
188 });
189
190 // Strict: require correct shape.
191 if (!form_settings || typeof form_settings !== 'object') {
192 form_settings = {
193 options: {},
194 css_vars: {}
195 };
196 }
197 if (!form_settings.options || typeof form_settings.options !== 'object') {
198 form_settings.options = {};
199 }
200 if (!form_settings.css_vars || typeof form_settings.css_vars !== 'object') {
201 form_settings.css_vars = {};
202 }
203 return form_settings;
204 }
205
206 /**
207 * Parse combined length value like "100%", "320px", "12.5rem".
208 *
209 * @param {string} value
210 * @return {{num:string, unit:string}}
211 */
212 function parse_length_value(value) {
213 const raw = String(value == null ? '' : value).trim();
214 const m = raw.match(/^\s*(-?\d+(?:\.\d+)?)\s*([a-z%]*)\s*$/i);
215 if (!m) {
216 return {
217 num: raw,
218 unit: ''
219 };
220 }
221 return {
222 num: m[1] || '',
223 unit: m[2] || ''
224 };
225 }
226
227 // -----------------------------------------------------------------------------------------------------------------
228 // Import logic (unchanged)
229 // -----------------------------------------------------------------------------------------------------------------
230 function normalize_imported_settings(parsed) {
231 // Accept either:
232 // 1) { options:{}, css_vars:{}, bfb_options:{} }
233 // 2) { options:{...} } (css_vars optional)
234 // 3) { ...optionsMap... } (we wrap into {options:...})
235 var out = parsed;
236 if (!out || typeof out !== 'object') {
237 return {
238 options: {},
239 css_vars: {}
240 };
241 }
242 var has_shape = Object.prototype.hasOwnProperty.call(out, 'options') || Object.prototype.hasOwnProperty.call(out, 'css_vars') || Object.prototype.hasOwnProperty.call(out, 'bfb_options');
243 if (!has_shape) {
244 out = {
245 options: out,
246 css_vars: {}
247 };
248 }
249 if (!out.options || typeof out.options !== 'object') {
250 out.options = {};
251 }
252 if (!out.css_vars || typeof out.css_vars !== 'object') {
253 out.css_vars = {};
254 }
255 if (out.bfb_options && typeof out.bfb_options !== 'object') {
256 out.bfb_options = {};
257 }
258 return out;
259 }
260
261 /**
262 * Apply canvas effects immediately (without relying on DOM events).
263 * This fixes the case when canvas was rebuilt after settings apply.
264 *
265 * @param {Object} settings_obj Normalized settings pack {options, css_vars, ...}
266 * @param {Object} ctx
267 */
268 function run_settings_effects_now(settings_obj, ctx) {
269 try {
270 var eff = w.WPBC_BFB_Settings_Effects || null;
271 if (!eff || typeof eff.apply_all !== 'function') {
272 return;
273 }
274 if (!settings_obj || !settings_obj.options || typeof settings_obj.options !== 'object') {
275 return;
276 }
277 eff.apply_all(settings_obj.options, ctx || {
278 source: 'debug-import'
279 });
280 } catch (e) {
281 console.error('Debug UI: run_settings_effects_now error', e);
282 }
283 }
284 function apply_imported_settings(settings_obj) {
285 var form_name = get_current_form_name();
286
287 // 1) Update sidebar UI + let modules react.
288 dispatch_event_safe('wpbc:bfb:form_settings:apply', {
289 settings: settings_obj,
290 form_name: form_name
291 });
292
293 // Optional hint for any listeners that want to refresh debug outputs.
294 dispatch_event_safe('wpbc:bfb:form_settings:changed', {
295 settings: settings_obj,
296 form_name: form_name,
297 source: 'debug-import'
298 });
299
300 // 2) Apply effects right away to current canvas (no rebuild yet).
301 // (Even if rebuild happens later, this gives immediate feedback.)
302 run_settings_effects_now(settings_obj, {
303 source: 'debug-import-apply'
304 });
305 }
306 function apply_imported_structure(structure_arr, on_done) {
307 with_builder(function (builder) {
308 if (!builder) {
309 show_message('Debug UI: Builder is not ready.', 'error', 8000);
310 if (typeof on_done === 'function') {
311 on_done(false, null);
312 }
313 return;
314 }
315 try {
316 // Prefer canonical loader if present (keeps compatibility with legacy callers).
317 if (typeof w.wpbc_bfb__on_structure_loaded === 'function') {
318 w.wpbc_bfb__on_structure_loaded(structure_arr);
319 } else if (typeof builder.load_saved_structure === 'function') {
320 builder.load_saved_structure(structure_arr, {
321 deferIfTyping: false
322 });
323 } else if (w.wpbc_bfb_api && typeof w.wpbc_bfb_api.load_structure === 'function') {
324 w.wpbc_bfb_api.load_structure(structure_arr);
325 } else {
326 show_message('Debug UI: No structure loader found.', 'error', 8000);
327 if (typeof on_done === 'function') {
328 on_done(false, builder);
329 }
330 return;
331 }
332
333 // IMPORTANT:
334 // Do NOT do rebuild:true here, because load_saved_structure() already rebuilt DOM.
335 // Rebuild:true would rebuild twice and can wipe effects.
336 if (typeof builder.refresh_canvas === 'function') {
337 builder.refresh_canvas({
338 hard: true,
339 rebuild: false,
340 reinit: true,
341 source: 'debug-import-structure'
342 });
343 }
344 if (typeof on_done === 'function') {
345 on_done(true, builder);
346 }
347 } catch (e) {
348 show_message('Debug UI: Failed to apply structure. Check console.', 'error', 8000);
349 console.error('Debug UI apply_imported_structure error', e);
350 if (typeof on_done === 'function') {
351 on_done(false, builder);
352 }
353 }
354 });
355 }
356 function import_from_textareas(mode) {
357 var s_text = (d.getElementById('wpbc_bfb__structure_import') || {}).value || '';
358 var o_text = (d.getElementById('wpbc_bfb__settings_import') || {}).value || '';
359 var structure = null;
360 var settings = null;
361 if (mode === 'structure' || mode === 'both') {
362 var parsed_s = safe_json_parse(s_text);
363 if (!Array.isArray(parsed_s)) {
364 show_message('Debug UI: Structure JSON must be an array.', 'error', 8000);
365 return;
366 }
367 structure = parsed_s;
368 }
369 if (mode === 'settings' || mode === 'both') {
370 var parsed_o = safe_json_parse(o_text);
371 if (!parsed_o || typeof parsed_o !== 'object') {
372 show_message('Debug UI: Settings JSON must be an object.', 'error', 8000);
373 return;
374 }
375 settings = normalize_imported_settings(parsed_o);
376 }
377
378 // Apply settings first (updates sidebar + immediate effects).
379 if (settings) {
380 apply_imported_settings(settings);
381 }
382
383 // Structure path: structure load rebuilds DOM -> re-apply settings AFTER load.
384 if (structure) {
385 apply_imported_structure(structure, function (ok) {
386 if (!ok) {
387 return;
388 }
389
390 // Re-dispatch settings apply AFTER structure rebuild, so settings_effects.js
391 // applies to the FINAL DOM (new wrappers).
392 if (settings) {
393 var form_name = get_current_form_name();
394
395 // 1) Dispatch apply again (this is what settings_effects.js listens for).
396 dispatch_event_safe('wpbc:bfb:form_settings:apply', {
397 settings: settings,
398 form_name: form_name
399 });
400
401 // 2) Direct call fallback (in case the effects listener is not ready at that moment).
402 run_settings_effects_now(settings, {
403 source: 'debug-import-after-structure'
404 });
405 setTimeout(function () {
406 run_settings_effects_now(settings, {
407 source: 'debug-import-after-structure-delayed'
408 });
409 }, 60);
410 }
411 show_message('Imported into Builder (structure/settings).', 'success', 3000);
412 setTimeout(function () {
413 schedule_update();
414 }, 160);
415 });
416 return;
417 }
418
419 // Settings-only import: DO NOT rebuild structure.
420 with_builder(function (builder) {
421 if (builder && typeof builder.refresh_canvas === 'function') {
422 builder.refresh_canvas({
423 hard: true,
424 rebuild: false,
425 reinit: true,
426 source: 'debug-import-settings-only'
427 });
428 }
429
430 // Ensure effects apply even if refresh_canvas rebuilt some preview markup.
431 if (settings) {
432 run_settings_effects_now(settings, {
433 source: 'debug-import-settings-only'
434 });
435 setTimeout(function () {
436 run_settings_effects_now(settings, {
437 source: 'debug-import-settings-only-delayed'
438 });
439 }, 60);
440 }
441 show_message('Imported settings into UI.', 'success', 2500);
442 setTimeout(function () {
443 schedule_update();
444 }, 160);
445 });
446 }
447
448 // -----------------------------------------------------------------------------------------------------------------
449 // Populate outputs (NO UI creation)
450 // -----------------------------------------------------------------------------------------------------------------
451 function render_outputs(structure) {
452 if (!is_debug_tab_visible()) {
453 return;
454 }
455 const form_name = get_current_form_name();
456 const form_settings = get_current_form_settings(form_name);
457
458 // Exporter outputs (Advanced + Content).
459 if (w.WPBC_BFB_Exporter && typeof w.WPBC_BFB_Exporter.export_all === 'function') {
460 let export_options = {
461 gapPercent: 3
462 };
463
464 // Best-effort: match Preview export options (width + slug) for accurate output.
465 try {
466 const width_combined = form_settings && form_settings.options ? form_settings.options.booking_form_layout_width || '' : '';
467 const parsed_width = parse_length_value(width_combined);
468 const width_unit = parsed_width.unit ? parsed_width.unit : '%';
469 export_options = {
470 gapPercent: 3,
471 form_slug: form_name,
472 form_width_value: parsed_width.num,
473 form_width_unit: width_unit
474 };
475 } catch (_e1) {}
476 try {
477 const pkg = w.WPBC_BFB_Exporter.export_all(structure || [], export_options);
478 set_value('wpbc_bfb__advanced_form_output', pkg && pkg.advanced_form ? pkg.advanced_form : '');
479 set_value('wpbc_bfb__content_form_output', pkg && pkg.fields_data ? pkg.fields_data : '');
480 } catch (e2) {
481 set_value('wpbc_bfb__advanced_form_output', '// Exporter error: ' + (e2 && e2.message ? e2.message : String(e2)));
482 set_value('wpbc_bfb__content_form_output', '');
483 }
484 } else {
485 set_value('wpbc_bfb__advanced_form_output', '// WPBC_BFB_Exporter not loaded.');
486 set_value('wpbc_bfb__content_form_output', '// WPBC_BFB_Exporter not loaded.');
487 }
488
489 // Structure JSON export + prefill import.
490 try {
491 const s = JSON.stringify(structure || [], null, 2);
492 set_value('wpbc_bfb__structure_output', s);
493 set_value_if_empty('wpbc_bfb__structure_import', s);
494 } catch (e3) {
495 set_value('wpbc_bfb__structure_output', '// Error serializing structure: ' + (e3 && e3.message ? e3.message : String(e3)));
496 }
497
498 // Settings JSON export + prefill import.
499 try {
500 const o = JSON.stringify(form_settings || {
501 options: {},
502 css_vars: {}
503 }, null, 2);
504 set_value('wpbc_bfb__settings_output', o);
505 set_value_if_empty('wpbc_bfb__settings_import', o);
506 } catch (e4) {
507 set_value('wpbc_bfb__settings_output', '// Error serializing settings: ' + (e4 && e4.message ? e4.message : String(e4)));
508 }
509 }
510
511 // Debounce to avoid heavy exports on rapid drag/drop.
512 let update_timer = 0;
513 function schedule_update(structure) {
514 w.clearTimeout(update_timer);
515 update_timer = w.setTimeout(function () {
516 render_outputs(structure || get_current_structure());
517 }, 80);
518 }
519
520 // -----------------------------------------------------------------------------------------------------------------
521 // Bind existing buttons (no UI creation)
522 // -----------------------------------------------------------------------------------------------------------------
523 function bind_debug_buttons_once() {
524 const panel = get_debug_panel();
525 if (!panel) {
526 return;
527 }
528
529 // 1) If you later add data attributes, we support them.
530 const data_btns = panel.querySelectorAll('[data-wpbc-bfb-debug-action]');
531 if (data_btns && data_btns.length) {
532 data_btns.forEach(function (btn) {
533 if (!btn || !btn.addEventListener) {
534 return;
535 }
536 if (btn.getAttribute('data-wpbc-bfb-debug-bound') === '1') {
537 return;
538 }
539 btn.setAttribute('data-wpbc-bfb-debug-bound', '1');
540 btn.addEventListener('click', function (e) {
541 e.preventDefault();
542 const action = String(btn.getAttribute('data-wpbc-bfb-debug-action') || '').toLowerCase();
543 const target = String(btn.getAttribute('data-wpbc-bfb-debug-target') || '');
544 if (action === 'copy' && target) {
545 const ta = d.getElementById(target);
546 if (ta) {
547 copy_text_to_clipboard(ta.value, btn);
548 }
549 return;
550 }
551 if (action === 'apply_structure') {
552 import_from_textareas('structure');
553 return;
554 }
555 if (action === 'apply_settings') {
556 import_from_textareas('settings');
557 return;
558 }
559 if (action === 'apply_both') {
560 import_from_textareas('both');
561 return;
562 }
563 if (action === 'refresh') {
564 schedule_update();
565 return;
566 }
567 });
568 });
569 return; // data-attrs are the preferred binding method.
570 }
571
572 // 2) Fallback binding for your current HTML (by textarea id + button order in block).
573 const blocks = panel.querySelectorAll('.wpbc_bfb__debug_block');
574 if (!blocks || !blocks.length) {
575 return;
576 }
577 blocks.forEach(function (block) {
578 const ta = block.querySelector('textarea');
579 if (!ta || !ta.id) {
580 return;
581 }
582 const btns = block.querySelectorAll('button');
583 if (!btns || !btns.length) {
584 return;
585 }
586
587 // Copy = always first button.
588 const btn_copy = btns[0];
589 if (btn_copy && btn_copy.getAttribute('data-wpbc-bfb-debug-bound') !== '1') {
590 btn_copy.setAttribute('data-wpbc-bfb-debug-bound', '1');
591 btn_copy.addEventListener('click', function (e) {
592 e.preventDefault();
593 copy_text_to_clipboard(ta.value, btn_copy);
594 });
595 }
596
597 // Import blocks have more buttons.
598 if (ta.id === 'wpbc_bfb__structure_import') {
599 if (btns[1] && btns[1].getAttribute('data-wpbc-bfb-debug-bound') !== '1') {
600 btns[1].setAttribute('data-wpbc-bfb-debug-bound', '1');
601 btns[1].addEventListener('click', function (e) {
602 e.preventDefault();
603 import_from_textareas('structure');
604 });
605 }
606 if (btns[2] && btns[2].getAttribute('data-wpbc-bfb-debug-bound') !== '1') {
607 btns[2].setAttribute('data-wpbc-bfb-debug-bound', '1');
608 btns[2].addEventListener('click', function (e) {
609 e.preventDefault();
610 import_from_textareas('both');
611 });
612 }
613 }
614 if (ta.id === 'wpbc_bfb__settings_import') {
615 if (btns[1] && btns[1].getAttribute('data-wpbc-bfb-debug-bound') !== '1') {
616 btns[1].setAttribute('data-wpbc-bfb-debug-bound', '1');
617 btns[1].addEventListener('click', function (e) {
618 e.preventDefault();
619 import_from_textareas('settings');
620 });
621 }
622 if (btns[2] && btns[2].getAttribute('data-wpbc-bfb-debug-bound') !== '1') {
623 btns[2].setAttribute('data-wpbc-bfb-debug-bound', '1');
624 btns[2].addEventListener('click', function (e) {
625 e.preventDefault();
626 import_from_textareas('both');
627 });
628 }
629 }
630 });
631 }
632
633 // -----------------------------------------------------------------------------------------------------------------
634 // Wiring
635 // -----------------------------------------------------------------------------------------------------------------
636 d.addEventListener('DOMContentLoaded', function () {
637 bind_debug_buttons_once();
638 schedule_update();
639 });
640
641 // Refresh when switching to Debug tab OR debug internal tabs.
642 d.addEventListener('wpbc:bfb:top-tab', function (ev) {
643 const tab_id = ev && ev.detail && ev.detail.tab ? String(ev.detail.tab) : '';
644 if (tab_id === 'debug_tab' || tab_id.indexOf('debug_mode__') === 0) {
645 bind_debug_buttons_once();
646 schedule_update();
647 }
648 });
649
650 // Fallback event (if you still dispatch it somewhere).
651 d.addEventListener('wpbc:bfb:structure:change', function () {
652 schedule_update();
653 });
654
655 // Settings apply/changed should refresh debug output.
656 d.addEventListener('wpbc:bfb:form_settings:apply', function () {
657 schedule_update();
658 }, {
659 passive: true
660 });
661 d.addEventListener('wpbc:bfb:form_settings:changed', function () {
662 schedule_update();
663 }, {
664 passive: true
665 });
666
667 // Low-cost fallback: refresh on any change to SO controls (data-wpbc-u-save-*).
668 d.addEventListener('change', function (e) {
669 const t = e ? e.target : null;
670 if (!t || !t.getAttribute) {
671 return;
672 }
673 const attrs = t.attributes || null;
674 if (!attrs || !attrs.length) {
675 return;
676 }
677 for (let i = 0; i < attrs.length; i++) {
678 const n = attrs[i] ? String(attrs[i].name || '') : '';
679 if (n && n.indexOf('data-wpbc-u-save-') === 0) {
680 schedule_update();
681 return;
682 }
683 }
684 }, {
685 passive: true
686 });
687
688 // Prefer EventBus when available.
689 (function hook_bus() {
690 const Core = w.WPBC_BFB_Core || {};
691 const EV = Core.WPBC_BFB_Events || null;
692 if (!EV || !w.wpbc_bfb_api || !w.wpbc_bfb_api.ready) {
693 return;
694 }
695 w.wpbc_bfb_api.ready.then(function (builder) {
696 if (!builder || !builder.bus || typeof builder.bus.on !== 'function') {
697 return;
698 }
699 [EV.STRUCTURE_CHANGE, EV.FIELD_ADD, EV.FIELD_REMOVE, EV.STRUCTURE_LOADED].filter(Boolean).forEach(function (event_name) {
700 try {
701 builder.bus.on(event_name, function () {
702 schedule_update();
703 });
704 } catch (e) {
705 if (w._wpbc && w._wpbc.dev && typeof w._wpbc.dev.error === 'function') {
706 w._wpbc.dev.error('debug-ui: bus.on failed', event_name, e);
707 }
708 }
709 });
710 });
711 })();
712 })(window, document);
713 //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5jbHVkZXMvcGFnZS1mb3JtLWJ1aWxkZXIvX291dC9leHBvcnQvZGVidWctdWkuanMiLCJuYW1lcyI6WyJ3IiwiZCIsIl9fd3BiY19iZmJfX2RlYnVnX3VpX2luaXRlZCIsIkRFQlVHX1BBTkVMX0lEIiwiREVCVUdfVEFCX1NFTCIsImhhc19kZWJ1Z191aSIsImdldEVsZW1lbnRCeUlkIiwicXVlcnlTZWxlY3RvciIsInNob3dfbWVzc2FnZSIsIm1zZyIsInR5cGUiLCJ0aW1lb3V0IiwibSIsIlN0cmluZyIsInQiLCJ3cGJjX2FkbWluX3Nob3dfbWVzc2FnZSIsIl9lIiwiY29uc29sZSIsImVycm9yIiwibG9nIiwic2FmZV9qc29uX3BhcnNlIiwidGV4dCIsInJhdyIsInRyaW0iLCJKU09OIiwicGFyc2UiLCJlIiwiZGlzcGF0Y2hfZXZlbnRfc2FmZSIsImV2ZW50X25hbWUiLCJkZXRhaWwiLCJ3cGJjX2JmYl9fZGlzcGF0Y2hfZXZlbnRfc2FmZSIsImRpc3BhdGNoRXZlbnQiLCJDdXN0b21FdmVudCIsIl9lMiIsIndpdGhfYnVpbGRlciIsImNiIiwid3BiY19iZmJfYXBpIiwicmVhZHkiLCJ0aGVuIiwiYiIsIndwYmNfYmZiIiwiaXNfZGVidWdfdGFiX3Zpc2libGUiLCJyb290IiwiaGFzQXR0cmlidXRlIiwiYXJpYSIsImdldEF0dHJpYnV0ZSIsInRvTG93ZXJDYXNlIiwiZ2V0X2RlYnVnX3BhbmVsIiwic2V0X3ZhbHVlIiwidGV4dGFyZWFfaWQiLCJ2YWx1ZSIsImVsIiwiRXZlbnQiLCJidWJibGVzIiwiXyIsInNldF92YWx1ZV9pZl9lbXB0eSIsImNvcHlfdGV4dF90b19jbGlwYm9hcmQiLCJidG4iLCJ3cGJjX2NvcHlfdG9fY2xpcGJvYXJkIiwib3JpZyIsInRleHRDb250ZW50Iiwib2siLCJzZXRUaW1lb3V0IiwiZ2V0X2N1cnJlbnRfZm9ybV9uYW1lIiwiY2ZnIiwiV1BCQ19CRkJfQWpheCIsInYiLCJmb3JtX25hbWUiLCJnZXRfY3VycmVudF9zdHJ1Y3R1cmUiLCJnZXRfc3RydWN0dXJlIiwiZ2V0X2N1cnJlbnRfZm9ybV9zZXR0aW5ncyIsImZvcm1fc2V0dGluZ3MiLCJvcHRpb25zIiwiY3NzX3ZhcnMiLCJzZXR0aW5ncyIsInBhcnNlX2xlbmd0aF92YWx1ZSIsIm1hdGNoIiwibnVtIiwidW5pdCIsIm5vcm1hbGl6ZV9pbXBvcnRlZF9zZXR0aW5ncyIsInBhcnNlZCIsIm91dCIsImhhc19zaGFwZSIsIk9iamVjdCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImJmYl9vcHRpb25zIiwicnVuX3NldHRpbmdzX2VmZmVjdHNfbm93Iiwic2V0dGluZ3Nfb2JqIiwiY3R4IiwiZWZmIiwiV1BCQ19CRkJfU2V0dGluZ3NfRWZmZWN0cyIsImFwcGx5X2FsbCIsInNvdXJjZSIsImFwcGx5X2ltcG9ydGVkX3NldHRpbmdzIiwiYXBwbHlfaW1wb3J0ZWRfc3RydWN0dXJlIiwic3RydWN0dXJlX2FyciIsIm9uX2RvbmUiLCJidWlsZGVyIiwid3BiY19iZmJfX29uX3N0cnVjdHVyZV9sb2FkZWQiLCJsb2FkX3NhdmVkX3N0cnVjdHVyZSIsImRlZmVySWZUeXBpbmciLCJsb2FkX3N0cnVjdHVyZSIsInJlZnJlc2hfY2FudmFzIiwiaGFyZCIsInJlYnVpbGQiLCJyZWluaXQiLCJpbXBvcnRfZnJvbV90ZXh0YXJlYXMiLCJtb2RlIiwic190ZXh0Iiwib190ZXh0Iiwic3RydWN0dXJlIiwicGFyc2VkX3MiLCJBcnJheSIsImlzQXJyYXkiLCJwYXJzZWRfbyIsInNjaGVkdWxlX3VwZGF0ZSIsInJlbmRlcl9vdXRwdXRzIiwiV1BCQ19CRkJfRXhwb3J0ZXIiLCJleHBvcnRfYWxsIiwiZXhwb3J0X29wdGlvbnMiLCJnYXBQZXJjZW50Iiwid2lkdGhfY29tYmluZWQiLCJib29raW5nX2Zvcm1fbGF5b3V0X3dpZHRoIiwicGFyc2VkX3dpZHRoIiwid2lkdGhfdW5pdCIsImZvcm1fc2x1ZyIsImZvcm1fd2lkdGhfdmFsdWUiLCJmb3JtX3dpZHRoX3VuaXQiLCJfZTEiLCJwa2ciLCJhZHZhbmNlZF9mb3JtIiwiZmllbGRzX2RhdGEiLCJlMiIsIm1lc3NhZ2UiLCJzIiwic3RyaW5naWZ5IiwiZTMiLCJvIiwiZTQiLCJ1cGRhdGVfdGltZXIiLCJjbGVhclRpbWVvdXQiLCJiaW5kX2RlYnVnX2J1dHRvbnNfb25jZSIsInBhbmVsIiwiZGF0YV9idG5zIiwicXVlcnlTZWxlY3RvckFsbCIsImxlbmd0aCIsImZvckVhY2giLCJhZGRFdmVudExpc3RlbmVyIiwic2V0QXR0cmlidXRlIiwicHJldmVudERlZmF1bHQiLCJhY3Rpb24iLCJ0YXJnZXQiLCJ0YSIsImJsb2NrcyIsImJsb2NrIiwiaWQiLCJidG5zIiwiYnRuX2NvcHkiLCJldiIsInRhYl9pZCIsInRhYiIsImluZGV4T2YiLCJwYXNzaXZlIiwiYXR0cnMiLCJhdHRyaWJ1dGVzIiwiaSIsIm4iLCJuYW1lIiwiaG9va19idXMiLCJDb3JlIiwiV1BCQ19CRkJfQ29yZSIsIkVWIiwiV1BCQ19CRkJfRXZlbnRzIiwiYnVzIiwib24iLCJTVFJVQ1RVUkVfQ0hBTkdFIiwiRklFTERfQUREIiwiRklFTERfUkVNT1ZFIiwiU1RSVUNUVVJFX0xPQURFRCIsImZpbHRlciIsIkJvb2xlYW4iLCJfd3BiYyIsImRldiIsIndpbmRvdyIsImRvY3VtZW50Il0sInNvdXJjZXMiOlsiaW5jbHVkZXMvcGFnZS1mb3JtLWJ1aWxkZXIvX3NyYy9leHBvcnQvZGVidWctdWkuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIERlYnVnIFVJIOKAlCBwb3B1bGF0ZSBleGlzdGluZyB0ZXh0YXJlYXMsIGJpbmQgZXhpc3RpbmcgYnV0dG9ucy5cclxuICpcclxuICogSU1QT1JUQU5UOlxyXG4gKiAtIFRoaXMgZmlsZSBkb2VzIE5PVCBjcmVhdGUgYW55IG1hcmt1cCBhbnltb3JlLlxyXG4gKiAtIEFsbCBibG9ja3MvdGV4dGFyZWFzL2J1dHRvbnMgbXVzdCBleGlzdCBpbiBQSFAgdGVtcGxhdGUuXHJcbiAqXHJcbiAqIEBmaWxlOiAuLi9pbmNsdWRlcy9wYWdlLWZvcm0tYnVpbGRlci9fb3V0L2V4cG9ydC9kZWJ1Zy11aS5qc1xyXG4gKi9cclxuKGZ1bmN0aW9uICh3LCBkKSB7XHJcblx0J3VzZSBzdHJpY3QnO1xyXG5cclxuXHQvLyBQcmV2ZW50IGRvdWJsZSBpbml0IChpZiBmaWxlIGlzIGluamVjdGVkIHR3aWNlKS5cclxuXHRpZiAoIHcuX193cGJjX2JmYl9fZGVidWdfdWlfaW5pdGVkID09PSAnMScgKSB7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cdHcuX193cGJjX2JmYl9fZGVidWdfdWlfaW5pdGVkID0gJzEnO1xyXG5cclxuXHRjb25zdCBERUJVR19QQU5FTF9JRCA9ICd3cGJjX2JmYl9fZGVidWdfZXhwb3J0X3BhbmVsJztcclxuXHRjb25zdCBERUJVR19UQUJfU0VMICA9ICcud3BiY19iZmJfX3RhYl9zZWN0aW9uX19kZWJ1Z190YWInO1xyXG5cclxuXHRmdW5jdGlvbiBoYXNfZGVidWdfdWkoKSB7XHJcblx0XHRyZXR1cm4gISEgKCBkLmdldEVsZW1lbnRCeUlkKCBERUJVR19QQU5FTF9JRCApIHx8IGQucXVlcnlTZWxlY3RvciggREVCVUdfVEFCX1NFTCApICk7XHJcblx0fVxyXG5cclxuXHRpZiAoICEgaGFzX2RlYnVnX3VpKCkgKSB7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdC8vIEhlbHBlcnNcclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdGZ1bmN0aW9uIHNob3dfbWVzc2FnZSggbXNnLCB0eXBlLCB0aW1lb3V0ICkge1xyXG5cdFx0Y29uc3QgbSA9IFN0cmluZyggbXNnIHx8ICcnICk7XHJcblx0XHRjb25zdCB0ID0gU3RyaW5nKCB0eXBlIHx8ICdpbmZvJyApO1xyXG5cclxuXHRcdGlmICggdHlwZW9mIHcud3BiY19hZG1pbl9zaG93X21lc3NhZ2UgPT09ICdmdW5jdGlvbicgKSB7XHJcblx0XHRcdHRyeSB7XHJcblx0XHRcdFx0dy53cGJjX2FkbWluX3Nob3dfbWVzc2FnZSggbSwgdCwgdGltZW91dCB8fCA2MDAwICk7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9IGNhdGNoICggX2UgKSB7fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEZhbGxiYWNrLlxyXG5cdFx0aWYgKCB0ID09PSAnZXJyb3InICkge1xyXG5cdFx0XHRjb25zb2xlLmVycm9yKCBtICk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRjb25zb2xlLmxvZyggbSApO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gc2FmZV9qc29uX3BhcnNlKCB0ZXh0ICkge1xyXG5cdFx0Y29uc3QgcmF3ID0gU3RyaW5nKCB0ZXh0ID09IG51bGwgPyAnJyA6IHRleHQgKS50cmltKCk7XHJcblx0XHRpZiAoICEgcmF3ICkge1xyXG5cdFx0XHRyZXR1cm4gbnVsbDtcclxuXHRcdH1cclxuXHRcdHRyeSB7XHJcblx0XHRcdHJldHVybiBKU09OLnBhcnNlKCByYXcgKTtcclxuXHRcdH0gY2F0Y2ggKCBlICkge1xyXG5cdFx0XHRyZXR1cm4gbnVsbDtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdC8vIFNhZmUgZXZlbnQgZGlzcGF0Y2ggaGVscGVyIChyZXVzZSBwcmV2aWV3IGNvbnRyYWN0KVxyXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdGZ1bmN0aW9uIGRpc3BhdGNoX2V2ZW50X3NhZmUoIGV2ZW50X25hbWUsIGRldGFpbCApIHtcclxuXHRcdGlmICggdHlwZW9mIHcud3BiY19iZmJfX2Rpc3BhdGNoX2V2ZW50X3NhZmUgPT09ICdmdW5jdGlvbicgKSB7XHJcblx0XHRcdHRyeSB7XHJcblx0XHRcdFx0dy53cGJjX2JmYl9fZGlzcGF0Y2hfZXZlbnRfc2FmZSggZXZlbnRfbmFtZSwgZGV0YWlsICk7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9IGNhdGNoICggX2UgKSB7fVxyXG5cdFx0fVxyXG5cdFx0dHJ5IHtcclxuXHRcdFx0ZC5kaXNwYXRjaEV2ZW50KCBuZXcgQ3VzdG9tRXZlbnQoIGV2ZW50X25hbWUsIHsgZGV0YWlsOiBkZXRhaWwgfHwge30gfSApICk7XHJcblx0XHR9IGNhdGNoICggX2UyICkge31cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHdpdGhfYnVpbGRlciggY2IgKSB7XHJcblx0XHRpZiAoIHcud3BiY19iZmJfYXBpICYmIHcud3BiY19iZmJfYXBpLnJlYWR5ICYmIHR5cGVvZiB3LndwYmNfYmZiX2FwaS5yZWFkeS50aGVuID09PSAnZnVuY3Rpb24nICkge1xyXG5cdFx0XHR3LndwYmNfYmZiX2FwaS5yZWFkeS50aGVuKCBmdW5jdGlvbiAoIGIgKSB7XHJcblx0XHRcdFx0Y2IoIGIgfHwgdy53cGJjX2JmYiB8fCBudWxsICk7XHJcblx0XHRcdH0gKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdFx0Y2IoIHcud3BiY19iZmIgfHwgbnVsbCApO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gaXNfZGVidWdfdGFiX3Zpc2libGUoKSB7XHJcblx0XHRjb25zdCByb290ID0gZC5xdWVyeVNlbGVjdG9yKCBERUJVR19UQUJfU0VMICk7XHJcblx0XHRpZiAoICEgcm9vdCApIHtcclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHR9XHJcblx0XHR0cnkge1xyXG5cdFx0XHRpZiAoIHJvb3QuaGFzQXR0cmlidXRlKCAnaGlkZGVuJyApICkge1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0fVxyXG5cdFx0XHRjb25zdCBhcmlhID0gU3RyaW5nKCByb290LmdldEF0dHJpYnV0ZSggJ2FyaWEtaGlkZGVuJyApIHx8ICcnICkudG9Mb3dlckNhc2UoKTtcclxuXHRcdFx0aWYgKCBhcmlhID09PSAndHJ1ZScgKSB7XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHR9XHJcblx0XHR9IGNhdGNoICggX2UgKSB7fVxyXG5cdFx0cmV0dXJuIHRydWU7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBnZXRfZGVidWdfcGFuZWwoKSB7XHJcblx0XHRyZXR1cm4gZC5nZXRFbGVtZW50QnlJZCggREVCVUdfUEFORUxfSUQgKSB8fCBudWxsO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gc2V0X3ZhbHVlKCB0ZXh0YXJlYV9pZCwgdmFsdWUgKSB7XHJcblx0XHRjb25zdCBlbCA9IGQuZ2V0RWxlbWVudEJ5SWQoIHRleHRhcmVhX2lkICk7XHJcblx0XHRpZiAoICEgZWwgKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdGVsLnZhbHVlID0gU3RyaW5nKCB2YWx1ZSB8fCAnJyApO1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0ZWwuZGlzcGF0Y2hFdmVudCggbmV3IEV2ZW50KCAnaW5wdXQnLCB7IGJ1YmJsZXM6IHRydWUgfSApICk7XHJcblx0XHR9IGNhdGNoICggXyApIHt9XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBzZXRfdmFsdWVfaWZfZW1wdHkoIHRleHRhcmVhX2lkLCB2YWx1ZSApIHtcclxuXHRcdGNvbnN0IGVsID0gZC5nZXRFbGVtZW50QnlJZCggdGV4dGFyZWFfaWQgKTtcclxuXHRcdGlmICggISBlbCApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdFx0aWYgKCBTdHJpbmcoIGVsLnZhbHVlIHx8ICcnICkudHJpbSgpICE9PSAnJyApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdFx0c2V0X3ZhbHVlKCB0ZXh0YXJlYV9pZCwgdmFsdWUgKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGNvcHlfdGV4dF90b19jbGlwYm9hcmQoIHRleHQsIGJ0biApIHtcclxuXHRcdGNvbnN0IHJhdyA9IFN0cmluZyggdGV4dCB8fCAnJyApO1xyXG5cdFx0aWYgKCAhIHJhdyApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdHlwZW9mIHcud3BiY19jb3B5X3RvX2NsaXBib2FyZCA9PT0gJ2Z1bmN0aW9uJyApIHtcclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRjb25zdCBvcmlnID0gYnRuID8gU3RyaW5nKCBidG4udGV4dENvbnRlbnQgfHwgJycgKSA6ICcnO1xyXG5cdFx0XHRcdHcud3BiY19jb3B5X3RvX2NsaXBib2FyZCggcmF3ICkudGhlbihcclxuXHRcdFx0XHRcdGZ1bmN0aW9uICggb2sgKSB7XHJcblx0XHRcdFx0XHRcdGlmICggISBidG4gKSB7XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdGJ0bi50ZXh0Q29udGVudCA9IG9rID8gJ0NvcGllZCEnIDogJ1ByZXNzIEN0cmwvQ21kK0MgdG8gY29weSc7XHJcblx0XHRcdFx0XHRcdHcuc2V0VGltZW91dCggZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdFx0XHRcdGJ0bi50ZXh0Q29udGVudCA9IG9yaWc7XHJcblx0XHRcdFx0XHRcdH0sIDE1MDAgKTtcclxuXHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHRmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0XHRcdGlmICggYnRuICkge1xyXG5cdFx0XHRcdFx0XHRcdGJ0bi50ZXh0Q29udGVudCA9ICdQcmVzcyBDdHJsL0NtZCtDIHRvIGNvcHknO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0KTtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH0gY2F0Y2ggKCBfZSApIHt9XHJcblx0XHR9XHJcblxyXG5cdFx0c2hvd19tZXNzYWdlKCAnQ29weSBoZWxwZXIgaXMgbm90IGF2YWlsYWJsZS4gUGxlYXNlIGNvcHkgbWFudWFsbHkuJywgJ2luZm8nLCA0MDAwICk7XHJcblx0fVxyXG5cclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdC8vIERhdGEgZ2V0dGVyc1xyXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0ZnVuY3Rpb24gZ2V0X2N1cnJlbnRfZm9ybV9uYW1lKCkge1xyXG5cdFx0Y29uc3QgY2ZnID0gdy5XUEJDX0JGQl9BamF4IHx8IHt9O1xyXG5cdFx0Y29uc3QgdiAgID0gY2ZnICYmIGNmZy5mb3JtX25hbWUgPyBTdHJpbmcoIGNmZy5mb3JtX25hbWUgKSA6ICcnO1xyXG5cdFx0cmV0dXJuIHYgPyB2IDogJ3N0YW5kYXJkJztcclxuXHR9XHJcblxyXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdC8vIEJ1aWxkZXIgc3RydWN0dXJlIGdldHRlclxyXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdGZ1bmN0aW9uIGdldF9jdXJyZW50X3N0cnVjdHVyZSgpIHtcclxuXHRcdGlmICggdy53cGJjX2JmYiAmJiB0eXBlb2Ygdy53cGJjX2JmYi5nZXRfc3RydWN0dXJlID09PSAnZnVuY3Rpb24nICkge1xyXG5cdFx0XHR0cnkge1xyXG5cdFx0XHRcdHJldHVybiB3LndwYmNfYmZiLmdldF9zdHJ1Y3R1cmUoKTtcclxuXHRcdFx0fSBjYXRjaCAoIF9lICkge1xyXG5cdFx0XHRcdHJldHVybiBbXTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIFtdO1xyXG5cdH1cclxuXHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0Ly8gU2V0dGluZ3MgY29sbGVjdG9yIChyZXVzZXMgUHJldmlldyBjb250cmFjdClcclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHRmdW5jdGlvbiBnZXRfY3VycmVudF9mb3JtX3NldHRpbmdzKCBmb3JtX25hbWUgKSB7XHJcblx0XHRsZXQgZm9ybV9zZXR0aW5ncyA9IHsgb3B0aW9uczoge30sIGNzc192YXJzOiB7fSB9O1xyXG5cclxuXHRcdGRpc3BhdGNoX2V2ZW50X3NhZmUoICd3cGJjOmJmYjpmb3JtX3NldHRpbmdzOmNvbGxlY3QnLCB7XHJcblx0XHRcdHNldHRpbmdzIDogZm9ybV9zZXR0aW5ncyxcclxuXHRcdFx0Zm9ybV9uYW1lOiBmb3JtX25hbWUgfHwgJ3N0YW5kYXJkJ1xyXG5cdFx0fSApO1xyXG5cclxuXHRcdC8vIFN0cmljdDogcmVxdWlyZSBjb3JyZWN0IHNoYXBlLlxyXG5cdFx0aWYgKCAhIGZvcm1fc2V0dGluZ3MgfHwgdHlwZW9mIGZvcm1fc2V0dGluZ3MgIT09ICdvYmplY3QnICkge1xyXG5cdFx0XHRmb3JtX3NldHRpbmdzID0geyBvcHRpb25zOiB7fSwgY3NzX3ZhcnM6IHt9IH07XHJcblx0XHR9XHJcblx0XHRpZiAoICEgZm9ybV9zZXR0aW5ncy5vcHRpb25zIHx8IHR5cGVvZiBmb3JtX3NldHRpbmdzLm9wdGlvbnMgIT09ICdvYmplY3QnICkge1xyXG5cdFx0XHRmb3JtX3NldHRpbmdzLm9wdGlvbnMgPSB7fTtcclxuXHRcdH1cclxuXHRcdGlmICggISBmb3JtX3NldHRpbmdzLmNzc192YXJzIHx8IHR5cGVvZiBmb3JtX3NldHRpbmdzLmNzc192YXJzICE9PSAnb2JqZWN0JyApIHtcclxuXHRcdFx0Zm9ybV9zZXR0aW5ncy5jc3NfdmFycyA9IHt9O1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBmb3JtX3NldHRpbmdzO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUGFyc2UgY29tYmluZWQgbGVuZ3RoIHZhbHVlIGxpa2UgXCIxMDAlXCIsIFwiMzIwcHhcIiwgXCIxMi41cmVtXCIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcclxuXHQgKiBAcmV0dXJuIHt7bnVtOnN0cmluZywgdW5pdDpzdHJpbmd9fVxyXG5cdCAqL1xyXG5cdGZ1bmN0aW9uIHBhcnNlX2xlbmd0aF92YWx1ZSggdmFsdWUgKSB7XHJcblx0XHRjb25zdCByYXcgPSBTdHJpbmcoIHZhbHVlID09IG51bGwgPyAnJyA6IHZhbHVlICkudHJpbSgpO1xyXG5cdFx0Y29uc3QgbSAgID0gcmF3Lm1hdGNoKCAvXlxccyooLT9cXGQrKD86XFwuXFxkKyk/KVxccyooW2EteiVdKilcXHMqJC9pICk7XHJcblx0XHRpZiAoICEgbSApIHtcclxuXHRcdFx0cmV0dXJuIHsgbnVtOiByYXcsIHVuaXQ6ICcnIH07XHJcblx0XHR9XHJcblx0XHRyZXR1cm4geyBudW06ICggbVsxXSB8fCAnJyApLCB1bml0OiAoIG1bMl0gfHwgJycgKSB9O1xyXG5cdH1cclxuXHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHQvLyBJbXBvcnQgbG9naWMgKHVuY2hhbmdlZClcclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdGZ1bmN0aW9uIG5vcm1hbGl6ZV9pbXBvcnRlZF9zZXR0aW5ncyggcGFyc2VkICkge1xyXG5cclxuXHRcdC8vIEFjY2VwdCBlaXRoZXI6XHJcblx0XHQvLyAxKSB7IG9wdGlvbnM6e30sIGNzc192YXJzOnt9LCBiZmJfb3B0aW9uczp7fSB9XHJcblx0XHQvLyAyKSB7IG9wdGlvbnM6ey4uLn0gfSAoY3NzX3ZhcnMgb3B0aW9uYWwpXHJcblx0XHQvLyAzKSB7IC4uLm9wdGlvbnNNYXAuLi4gfSAod2Ugd3JhcCBpbnRvIHtvcHRpb25zOi4uLn0pXHJcblx0XHR2YXIgb3V0ID0gcGFyc2VkO1xyXG5cclxuXHRcdGlmICggISBvdXQgfHwgdHlwZW9mIG91dCAhPT0gJ29iamVjdCcgKSB7XHJcblx0XHRcdHJldHVybiB7IG9wdGlvbnM6IHt9LCBjc3NfdmFyczoge30gfTtcclxuXHRcdH1cclxuXHJcblx0XHR2YXIgaGFzX3NoYXBlID1cclxuXHRcdFx0XHRPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoIG91dCwgJ29wdGlvbnMnICkgfHxcclxuXHRcdFx0XHRPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoIG91dCwgJ2Nzc192YXJzJyApIHx8XHJcblx0XHRcdFx0T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKCBvdXQsICdiZmJfb3B0aW9ucycgKTtcclxuXHJcblx0XHRpZiAoICEgaGFzX3NoYXBlICkge1xyXG5cdFx0XHRvdXQgPSB7IG9wdGlvbnM6IG91dCwgY3NzX3ZhcnM6IHt9IH07XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCAhIG91dC5vcHRpb25zIHx8IHR5cGVvZiBvdXQub3B0aW9ucyAhPT0gJ29iamVjdCcgKSB7XHJcblx0XHRcdG91dC5vcHRpb25zID0ge307XHJcblx0XHR9XHJcblx0XHRpZiAoICEgb3V0LmNzc192YXJzIHx8IHR5cGVvZiBvdXQuY3NzX3ZhcnMgIT09ICdvYmplY3QnICkge1xyXG5cdFx0XHRvdXQuY3NzX3ZhcnMgPSB7fTtcclxuXHRcdH1cclxuXHRcdGlmICggb3V0LmJmYl9vcHRpb25zICYmIHR5cGVvZiBvdXQuYmZiX29wdGlvbnMgIT09ICdvYmplY3QnICkge1xyXG5cdFx0XHRvdXQuYmZiX29wdGlvbnMgPSB7fTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gb3V0O1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQXBwbHkgY2FudmFzIGVmZmVjdHMgaW1tZWRpYXRlbHkgKHdpdGhvdXQgcmVseWluZyBvbiBET00gZXZlbnRzKS5cclxuXHQgKiBUaGlzIGZpeGVzIHRoZSBjYXNlIHdoZW4gY2FudmFzIHdhcyByZWJ1aWx0IGFmdGVyIHNldHRpbmdzIGFwcGx5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IHNldHRpbmdzX29iaiBOb3JtYWxpemVkIHNldHRpbmdzIHBhY2sge29wdGlvbnMsIGNzc192YXJzLCAuLi59XHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGN0eFxyXG5cdCAqL1xyXG5cdGZ1bmN0aW9uIHJ1bl9zZXR0aW5nc19lZmZlY3RzX25vdyggc2V0dGluZ3Nfb2JqLCBjdHggKSB7XHJcblx0XHR0cnkge1xyXG5cdFx0XHR2YXIgZWZmID0gdy5XUEJDX0JGQl9TZXR0aW5nc19FZmZlY3RzIHx8IG51bGw7XHJcblx0XHRcdGlmICggISBlZmYgfHwgdHlwZW9mIGVmZi5hcHBseV9hbGwgIT09ICdmdW5jdGlvbicgKSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICggISBzZXR0aW5nc19vYmogfHwgISBzZXR0aW5nc19vYmoub3B0aW9ucyB8fCB0eXBlb2Ygc2V0dGluZ3Nfb2JqLm9wdGlvbnMgIT09ICdvYmplY3QnICkge1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cdFx0XHRlZmYuYXBwbHlfYWxsKCBzZXR0aW5nc19vYmoub3B0aW9ucywgY3R4IHx8IHsgc291cmNlOiAnZGVidWctaW1wb3J0JyB9ICk7XHJcblx0XHR9IGNhdGNoICggZSApIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvciggJ0RlYnVnIFVJOiBydW5fc2V0dGluZ3NfZWZmZWN0c19ub3cgZXJyb3InLCBlICk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBhcHBseV9pbXBvcnRlZF9zZXR0aW5ncyggc2V0dGluZ3Nfb2JqICkge1xyXG5cdFx0dmFyIGZvcm1fbmFtZSA9IGdldF9jdXJyZW50X2Zvcm1fbmFtZSgpO1xyXG5cclxuXHRcdC8vIDEpIFVwZGF0ZSBzaWRlYmFyIFVJICsgbGV0IG1vZHVsZXMgcmVhY3QuXHJcblx0XHRkaXNwYXRjaF9ldmVudF9zYWZlKCAnd3BiYzpiZmI6Zm9ybV9zZXR0aW5nczphcHBseScsIHtcclxuXHRcdFx0c2V0dGluZ3MgOiBzZXR0aW5nc19vYmosXHJcblx0XHRcdGZvcm1fbmFtZTogZm9ybV9uYW1lXHJcblx0XHR9ICk7XHJcblxyXG5cdFx0Ly8gT3B0aW9uYWwgaGludCBmb3IgYW55IGxpc3RlbmVycyB0aGF0IHdhbnQgdG8gcmVmcmVzaCBkZWJ1ZyBvdXRwdXRzLlxyXG5cdFx0ZGlzcGF0Y2hfZXZlbnRfc2FmZSggJ3dwYmM6YmZiOmZvcm1fc2V0dGluZ3M6Y2hhbmdlZCcsIHtcclxuXHRcdFx0c2V0dGluZ3MgOiBzZXR0aW5nc19vYmosXHJcblx0XHRcdGZvcm1fbmFtZTogZm9ybV9uYW1lLFxyXG5cdFx0XHRzb3VyY2UgICA6ICdkZWJ1Zy1pbXBvcnQnXHJcblx0XHR9ICk7XHJcblxyXG5cdFx0Ly8gMikgQXBwbHkgZWZmZWN0cyByaWdodCBhd2F5IHRvIGN1cnJlbnQgY2FudmFzIChubyByZWJ1aWxkIHlldCkuXHJcblx0XHQvLyAoRXZlbiBpZiByZWJ1aWxkIGhhcHBlbnMgbGF0ZXIsIHRoaXMgZ2l2ZXMgaW1tZWRpYXRlIGZlZWRiYWNrLilcclxuXHRcdHJ1bl9zZXR0aW5nc19lZmZlY3RzX25vdyggc2V0dGluZ3Nfb2JqLCB7IHNvdXJjZTogJ2RlYnVnLWltcG9ydC1hcHBseScgfSApO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gYXBwbHlfaW1wb3J0ZWRfc3RydWN0dXJlKCBzdHJ1Y3R1cmVfYXJyLCBvbl9kb25lICkge1xyXG5cdFx0d2l0aF9idWlsZGVyKCBmdW5jdGlvbiAoIGJ1aWxkZXIgKSB7XHJcblx0XHRcdGlmICggISBidWlsZGVyICkge1xyXG5cdFx0XHRcdHNob3dfbWVzc2FnZSggJ0RlYnVnIFVJOiBCdWlsZGVyIGlzIG5vdCByZWFkeS4nLCAnZXJyb3InLCA4MDAwICk7XHJcblx0XHRcdFx0aWYgKCB0eXBlb2Ygb25fZG9uZSA9PT0gJ2Z1bmN0aW9uJyApIHtcclxuXHRcdFx0XHRcdG9uX2RvbmUoIGZhbHNlLCBudWxsICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHQvLyBQcmVmZXIgY2Fub25pY2FsIGxvYWRlciBpZiBwcmVzZW50IChrZWVwcyBjb21wYXRpYmlsaXR5IHdpdGggbGVnYWN5IGNhbGxlcnMpLlxyXG5cdFx0XHRcdGlmICggdHlwZW9mIHcud3BiY19iZmJfX29uX3N0cnVjdHVyZV9sb2FkZWQgPT09ICdmdW5jdGlvbicgKSB7XHJcblx0XHRcdFx0XHR3LndwYmNfYmZiX19vbl9zdHJ1Y3R1cmVfbG9hZGVkKCBzdHJ1Y3R1cmVfYXJyICk7XHJcblx0XHRcdFx0fSBlbHNlIGlmICggdHlwZW9mIGJ1aWxkZXIubG9hZF9zYXZlZF9zdHJ1Y3R1cmUgPT09ICdmdW5jdGlvbicgKSB7XHJcblx0XHRcdFx0XHRidWlsZGVyLmxvYWRfc2F2ZWRfc3RydWN0dXJlKCBzdHJ1Y3R1cmVfYXJyLCB7IGRlZmVySWZUeXBpbmc6IGZhbHNlIH0gKTtcclxuXHRcdFx0XHR9IGVsc2UgaWYgKCB3LndwYmNfYmZiX2FwaSAmJiB0eXBlb2Ygdy53cGJjX2JmYl9hcGkubG9hZF9zdHJ1Y3R1cmUgPT09ICdmdW5jdGlvbicgKSB7XHJcblx0XHRcdFx0XHR3LndwYmNfYmZiX2FwaS5sb2FkX3N0cnVjdHVyZSggc3RydWN0dXJlX2FyciApO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRzaG93X21lc3NhZ2UoICdEZWJ1ZyBVSTogTm8gc3RydWN0dXJlIGxvYWRlciBmb3VuZC4nLCAnZXJyb3InLCA4MDAwICk7XHJcblx0XHRcdFx0XHRpZiAoIHR5cGVvZiBvbl9kb25lID09PSAnZnVuY3Rpb24nICkge1xyXG5cdFx0XHRcdFx0XHRvbl9kb25lKCBmYWxzZSwgYnVpbGRlciApO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Ly8gSU1QT1JUQU5UOlxyXG5cdFx0XHRcdC8vIERvIE5PVCBkbyByZWJ1aWxkOnRydWUgaGVyZSwgYmVjYXVzZSBsb2FkX3NhdmVkX3N0cnVjdHVyZSgpIGFscmVhZHkgcmVidWlsdCBET00uXHJcblx0XHRcdFx0Ly8gUmVidWlsZDp0cnVlIHdvdWxkIHJlYnVpbGQgdHdpY2UgYW5kIGNhbiB3aXBlIGVmZmVjdHMuXHJcblx0XHRcdFx0aWYgKCB0eXBlb2YgYnVpbGRlci5yZWZyZXNoX2NhbnZhcyA9PT0gJ2Z1bmN0aW9uJyApIHtcclxuXHRcdFx0XHRcdGJ1aWxkZXIucmVmcmVzaF9jYW52YXMoIHtcclxuXHRcdFx0XHRcdFx0aGFyZCAgIDogdHJ1ZSxcclxuXHRcdFx0XHRcdFx0cmVidWlsZDogZmFsc2UsXHJcblx0XHRcdFx0XHRcdHJlaW5pdCA6IHRydWUsXHJcblx0XHRcdFx0XHRcdHNvdXJjZSA6ICdkZWJ1Zy1pbXBvcnQtc3RydWN0dXJlJ1xyXG5cdFx0XHRcdFx0fSApO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKCB0eXBlb2Ygb25fZG9uZSA9PT0gJ2Z1bmN0aW9uJyApIHtcclxuXHRcdFx0XHRcdG9uX2RvbmUoIHRydWUsIGJ1aWxkZXIgKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gY2F0Y2ggKCBlICkge1xyXG5cdFx0XHRcdHNob3dfbWVzc2FnZSggJ0RlYnVnIFVJOiBGYWlsZWQgdG8gYXBwbHkgc3RydWN0dXJlLiBDaGVjayBjb25zb2xlLicsICdlcnJvcicsIDgwMDAgKTtcclxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCAnRGVidWcgVUkgYXBwbHlfaW1wb3J0ZWRfc3RydWN0dXJlIGVycm9yJywgZSApO1xyXG5cdFx0XHRcdGlmICggdHlwZW9mIG9uX2RvbmUgPT09ICdmdW5jdGlvbicgKSB7XHJcblx0XHRcdFx0XHRvbl9kb25lKCBmYWxzZSwgYnVpbGRlciApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSApO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gaW1wb3J0X2Zyb21fdGV4dGFyZWFzKCBtb2RlICkge1xyXG5cdFx0dmFyIHNfdGV4dCA9ICggZC5nZXRFbGVtZW50QnlJZCggJ3dwYmNfYmZiX19zdHJ1Y3R1cmVfaW1wb3J0JyApIHx8IHt9ICkudmFsdWUgfHwgJyc7XHJcblx0XHR2YXIgb190ZXh0ID0gKCBkLmdldEVsZW1lbnRCeUlkKCAnd3BiY19iZmJfX3NldHRpbmdzX2ltcG9ydCcgKSB8fCB7fSApLnZhbHVlIHx8ICcnO1xyXG5cclxuXHRcdHZhciBzdHJ1Y3R1cmUgPSBudWxsO1xyXG5cdFx0dmFyIHNldHRpbmdzICA9IG51bGw7XHJcblxyXG5cdFx0aWYgKCBtb2RlID09PSAnc3RydWN0dXJlJyB8fCBtb2RlID09PSAnYm90aCcgKSB7XHJcblx0XHRcdHZhciBwYXJzZWRfcyA9IHNhZmVfanNvbl9wYXJzZSggc190ZXh0ICk7XHJcblx0XHRcdGlmICggISBBcnJheS5pc0FycmF5KCBwYXJzZWRfcyApICkge1xyXG5cdFx0XHRcdHNob3dfbWVzc2FnZSggJ0RlYnVnIFVJOiBTdHJ1Y3R1cmUgSlNPTiBtdXN0IGJlIGFuIGFycmF5LicsICdlcnJvcicsIDgwMDAgKTtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHRcdFx0c3RydWN0dXJlID0gcGFyc2VkX3M7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBtb2RlID09PSAnc2V0dGluZ3MnIHx8IG1vZGUgPT09ICdib3RoJyApIHtcclxuXHRcdFx0dmFyIHBhcnNlZF9vID0gc2FmZV9qc29uX3BhcnNlKCBvX3RleHQgKTtcclxuXHRcdFx0aWYgKCAhIHBhcnNlZF9vIHx8IHR5cGVvZiBwYXJzZWRfbyAhPT0gJ29iamVjdCcgKSB7XHJcblx0XHRcdFx0c2hvd19tZXNzYWdlKCAnRGVidWcgVUk6IFNldHRpbmdzIEpTT04gbXVzdCBiZSBhbiBvYmplY3QuJywgJ2Vycm9yJywgODAwMCApO1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cdFx0XHRzZXR0aW5ncyA9IG5vcm1hbGl6ZV9pbXBvcnRlZF9zZXR0aW5ncyggcGFyc2VkX28gKTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBBcHBseSBzZXR0aW5ncyBmaXJzdCAodXBkYXRlcyBzaWRlYmFyICsgaW1tZWRpYXRlIGVmZmVjdHMpLlxyXG5cdFx0aWYgKCBzZXR0aW5ncyApIHtcclxuXHRcdFx0YXBwbHlfaW1wb3J0ZWRfc2V0dGluZ3MoIHNldHRpbmdzICk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gU3RydWN0dXJlIHBhdGg6IHN0cnVjdHVyZSBsb2FkIHJlYnVpbGRzIERPTSAtPiByZS1hcHBseSBzZXR0aW5ncyBBRlRFUiBsb2FkLlxyXG5cdFx0aWYgKCBzdHJ1Y3R1cmUgKSB7XHJcblx0XHRcdGFwcGx5X2ltcG9ydGVkX3N0cnVjdHVyZSggc3RydWN0dXJlLCBmdW5jdGlvbiAoIG9rICkge1xyXG5cdFx0XHRcdGlmICggISBvayApIHtcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8vIFJlLWRpc3BhdGNoIHNldHRpbmdzIGFwcGx5IEFGVEVSIHN0cnVjdHVyZSByZWJ1aWxkLCBzbyBzZXR0aW5nc19lZmZlY3RzLmpzXHJcblx0XHRcdFx0Ly8gYXBwbGllcyB0byB0aGUgRklOQUwgRE9NIChuZXcgd3JhcHBlcnMpLlxyXG5cdFx0XHRcdGlmICggc2V0dGluZ3MgKSB7XHJcblx0XHRcdFx0XHR2YXIgZm9ybV9uYW1lID0gZ2V0X2N1cnJlbnRfZm9ybV9uYW1lKCk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gMSkgRGlzcGF0Y2ggYXBwbHkgYWdhaW4gKHRoaXMgaXMgd2hhdCBzZXR0aW5nc19lZmZlY3RzLmpzIGxpc3RlbnMgZm9yKS5cclxuXHRcdFx0XHRcdGRpc3BhdGNoX2V2ZW50X3NhZmUoICd3cGJjOmJmYjpmb3JtX3NldHRpbmdzOmFwcGx5Jywge1xyXG5cdFx0XHRcdFx0XHRzZXR0aW5ncyA6IHNldHRpbmdzLFxyXG5cdFx0XHRcdFx0XHRmb3JtX25hbWU6IGZvcm1fbmFtZVxyXG5cdFx0XHRcdFx0fSApO1xyXG5cclxuXHRcdFx0XHRcdC8vIDIpIERpcmVjdCBjYWxsIGZhbGxiYWNrIChpbiBjYXNlIHRoZSBlZmZlY3RzIGxpc3RlbmVyIGlzIG5vdCByZWFkeSBhdCB0aGF0IG1vbWVudCkuXHJcblx0XHRcdFx0XHRydW5fc2V0dGluZ3NfZWZmZWN0c19ub3coIHNldHRpbmdzLCB7IHNvdXJjZTogJ2RlYnVnLWltcG9ydC1hZnRlci1zdHJ1Y3R1cmUnIH0gKTtcclxuXHJcblx0XHRcdFx0XHRzZXRUaW1lb3V0KCBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0XHRcdHJ1bl9zZXR0aW5nc19lZmZlY3RzX25vdyggc2V0dGluZ3MsIHsgc291cmNlOiAnZGVidWctaW1wb3J0LWFmdGVyLXN0cnVjdHVyZS1kZWxheWVkJyB9ICk7XHJcblx0XHRcdFx0XHR9LCA2MCApO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0c2hvd19tZXNzYWdlKCAnSW1wb3J0ZWQgaW50byBCdWlsZGVyIChzdHJ1Y3R1cmUvc2V0dGluZ3MpLicsICdzdWNjZXNzJywgMzAwMCApO1xyXG5cclxuXHRcdFx0XHRzZXRUaW1lb3V0KCBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0XHRzY2hlZHVsZV91cGRhdGUoKTtcclxuXHRcdFx0XHR9LCAxNjAgKTtcclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFNldHRpbmdzLW9ubHkgaW1wb3J0OiBETyBOT1QgcmVidWlsZCBzdHJ1Y3R1cmUuXHJcblx0XHR3aXRoX2J1aWxkZXIoIGZ1bmN0aW9uICggYnVpbGRlciApIHtcclxuXHRcdFx0aWYgKCBidWlsZGVyICYmIHR5cGVvZiBidWlsZGVyLnJlZnJlc2hfY2FudmFzID09PSAnZnVuY3Rpb24nICkge1xyXG5cdFx0XHRcdGJ1aWxkZXIucmVmcmVzaF9jYW52YXMoIHtcclxuXHRcdFx0XHRcdGhhcmQgICA6IHRydWUsXHJcblx0XHRcdFx0XHRyZWJ1aWxkOiBmYWxzZSxcclxuXHRcdFx0XHRcdHJlaW5pdCA6IHRydWUsXHJcblx0XHRcdFx0XHRzb3VyY2UgOiAnZGVidWctaW1wb3J0LXNldHRpbmdzLW9ubHknXHJcblx0XHRcdFx0fSApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBFbnN1cmUgZWZmZWN0cyBhcHBseSBldmVuIGlmIHJlZnJlc2hfY2FudmFzIHJlYnVpbHQgc29tZSBwcmV2aWV3IG1hcmt1cC5cclxuXHRcdFx0aWYgKCBzZXR0aW5ncyApIHtcclxuXHRcdFx0XHRydW5fc2V0dGluZ3NfZWZmZWN0c19ub3coIHNldHRpbmdzLCB7IHNvdXJjZTogJ2RlYnVnLWltcG9ydC1zZXR0aW5ncy1vbmx5JyB9ICk7XHJcblx0XHRcdFx0c2V0VGltZW91dCggZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdFx0cnVuX3NldHRpbmdzX2VmZmVjdHNfbm93KCBzZXR0aW5ncywgeyBzb3VyY2U6ICdkZWJ1Zy1pbXBvcnQtc2V0dGluZ3Mtb25seS1kZWxheWVkJyB9ICk7XHJcblx0XHRcdFx0fSwgNjAgKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0c2hvd19tZXNzYWdlKCAnSW1wb3J0ZWQgc2V0dGluZ3MgaW50byBVSS4nLCAnc3VjY2VzcycsIDI1MDAgKTtcclxuXHJcblx0XHRcdHNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRzY2hlZHVsZV91cGRhdGUoKTtcclxuXHRcdFx0fSwgMTYwICk7XHJcblx0XHR9ICk7XHJcblx0fVxyXG5cclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdC8vIFBvcHVsYXRlIG91dHB1dHMgKE5PIFVJIGNyZWF0aW9uKVxyXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0ZnVuY3Rpb24gcmVuZGVyX291dHB1dHMoIHN0cnVjdHVyZSApIHtcclxuXHRcdGlmICggISBpc19kZWJ1Z190YWJfdmlzaWJsZSgpICkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgZm9ybV9uYW1lICAgICA9IGdldF9jdXJyZW50X2Zvcm1fbmFtZSgpO1xyXG5cdFx0Y29uc3QgZm9ybV9zZXR0aW5ncyA9IGdldF9jdXJyZW50X2Zvcm1fc2V0dGluZ3MoIGZvcm1fbmFtZSApO1xyXG5cclxuXHRcdC8vIEV4cG9ydGVyIG91dHB1dHMgKEFkdmFuY2VkICsgQ29udGVudCkuXHJcblx0XHRpZiAoIHcuV1BCQ19CRkJfRXhwb3J0ZXIgJiYgdHlwZW9mIHcuV1BCQ19CRkJfRXhwb3J0ZXIuZXhwb3J0X2FsbCA9PT0gJ2Z1bmN0aW9uJyApIHtcclxuXHRcdFx0bGV0IGV4cG9ydF9vcHRpb25zID0geyBnYXBQZXJjZW50OiAzIH07XHJcblxyXG5cdFx0XHQvLyBCZXN0LWVmZm9ydDogbWF0Y2ggUHJldmlldyBleHBvcnQgb3B0aW9ucyAod2lkdGggKyBzbHVnKSBmb3IgYWNjdXJhdGUgb3V0cHV0LlxyXG5cdFx0XHR0cnkge1xyXG5cdFx0XHRcdGNvbnN0IHdpZHRoX2NvbWJpbmVkID0gKCBmb3JtX3NldHRpbmdzICYmIGZvcm1fc2V0dGluZ3Mub3B0aW9ucyApXHJcblx0XHRcdFx0XHQ/ICggZm9ybV9zZXR0aW5ncy5vcHRpb25zLmJvb2tpbmdfZm9ybV9sYXlvdXRfd2lkdGggfHwgJycgKVxyXG5cdFx0XHRcdFx0OiAnJztcclxuXHJcblx0XHRcdFx0Y29uc3QgcGFyc2VkX3dpZHRoID0gcGFyc2VfbGVuZ3RoX3ZhbHVlKCB3aWR0aF9jb21iaW5lZCApO1xyXG5cdFx0XHRcdGNvbnN0IHdpZHRoX3VuaXQgICA9IHBhcnNlZF93aWR0aC51bml0ID8gcGFyc2VkX3dpZHRoLnVuaXQgOiAnJSc7XHJcblxyXG5cdFx0XHRcdGV4cG9ydF9vcHRpb25zID0ge1xyXG5cdFx0XHRcdFx0Z2FwUGVyY2VudCAgICAgIDogMyxcclxuXHRcdFx0XHRcdGZvcm1fc2x1ZyAgICAgICA6IGZvcm1fbmFtZSxcclxuXHRcdFx0XHRcdGZvcm1fd2lkdGhfdmFsdWU6IHBhcnNlZF93aWR0aC5udW0sXHJcblx0XHRcdFx0XHRmb3JtX3dpZHRoX3VuaXQgOiB3aWR0aF91bml0XHJcblx0XHRcdFx0fTtcclxuXHRcdFx0fSBjYXRjaCAoIF9lMSApIHt9XHJcblxyXG5cdFx0XHR0cnkge1xyXG5cdFx0XHRcdGNvbnN0IHBrZyA9IHcuV1BCQ19CRkJfRXhwb3J0ZXIuZXhwb3J0X2FsbCggc3RydWN0dXJlIHx8IFtdLCBleHBvcnRfb3B0aW9ucyApO1xyXG5cclxuXHRcdFx0XHRzZXRfdmFsdWUoICd3cGJjX2JmYl9fYWR2YW5jZWRfZm9ybV9vdXRwdXQnLCAoIHBrZyAmJiBwa2cuYWR2YW5jZWRfZm9ybSApID8gcGtnLmFkdmFuY2VkX2Zvcm0gOiAnJyApO1xyXG5cdFx0XHRcdHNldF92YWx1ZSggJ3dwYmNfYmZiX19jb250ZW50X2Zvcm1fb3V0cHV0JywgKCBwa2cgJiYgcGtnLmZpZWxkc19kYXRhICkgPyBwa2cuZmllbGRzX2RhdGEgOiAnJyApO1xyXG5cdFx0XHR9IGNhdGNoICggZTIgKSB7XHJcblx0XHRcdFx0c2V0X3ZhbHVlKCAnd3BiY19iZmJfX2FkdmFuY2VkX2Zvcm1fb3V0cHV0JywgJy8vIEV4cG9ydGVyIGVycm9yOiAnICsgKCAoIGUyICYmIGUyLm1lc3NhZ2UgKSA/IGUyLm1lc3NhZ2UgOiBTdHJpbmcoIGUyICkgKSApO1xyXG5cdFx0XHRcdHNldF92YWx1ZSggJ3dwYmNfYmZiX19jb250ZW50X2Zvcm1fb3V0cHV0JywgJycgKTtcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0c2V0X3ZhbHVlKCAnd3BiY19iZmJfX2FkdmFuY2VkX2Zvcm1fb3V0cHV0JywgJy8vIFdQQkNfQkZCX0V4cG9ydGVyIG5vdCBsb2FkZWQuJyApO1xyXG5cdFx0XHRzZXRfdmFsdWUoICd3cGJjX2JmYl9fY29udGVudF9mb3JtX291dHB1dCcsICAnLy8gV1BCQ19CRkJfRXhwb3J0ZXIgbm90IGxvYWRlZC4nICk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gU3RydWN0dXJlIEpTT04gZXhwb3J0ICsgcHJlZmlsbCBpbXBvcnQuXHJcblx0XHR0cnkge1xyXG5cdFx0XHRjb25zdCBzID0gSlNPTi5zdHJpbmdpZnkoIHN0cnVjdHVyZSB8fCBbXSwgbnVsbCwgMiApO1xyXG5cdFx0XHRzZXRfdmFsdWUoICd3cGJjX2JmYl9fc3RydWN0dXJlX291dHB1dCcsIHMgKTtcclxuXHRcdFx0c2V0X3ZhbHVlX2lmX2VtcHR5KCAnd3BiY19iZmJfX3N0cnVjdHVyZV9pbXBvcnQnLCBzICk7XHJcblx0XHR9IGNhdGNoICggZTMgKSB7XHJcblx0XHRcdHNldF92YWx1ZSggJ3dwYmNfYmZiX19zdHJ1Y3R1cmVfb3V0cHV0JywgJy8vIEVycm9yIHNlcmlhbGl6aW5nIHN0cnVjdHVyZTogJyArICggKCBlMyAmJiBlMy5tZXNzYWdlICkgPyBlMy5tZXNzYWdlIDogU3RyaW5nKCBlMyApICkgKTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBTZXR0aW5ncyBKU09OIGV4cG9ydCArIHByZWZpbGwgaW1wb3J0LlxyXG5cdFx0dHJ5IHtcclxuXHRcdFx0Y29uc3QgbyA9IEpTT04uc3RyaW5naWZ5KCBmb3JtX3NldHRpbmdzIHx8IHsgb3B0aW9uczoge30sIGNzc192YXJzOiB7fSB9LCBudWxsLCAyICk7XHJcblx0XHRcdHNldF92YWx1ZSggJ3dwYmNfYmZiX19zZXR0aW5nc19vdXRwdXQnLCBvICk7XHJcblx0XHRcdHNldF92YWx1ZV9pZl9lbXB0eSggJ3dwYmNfYmZiX19zZXR0aW5nc19pbXBvcnQnLCBvICk7XHJcblx0XHR9IGNhdGNoICggZTQgKSB7XHJcblx0XHRcdHNldF92YWx1ZSggJ3dwYmNfYmZiX19zZXR0aW5nc19vdXRwdXQnLCAnLy8gRXJyb3Igc2VyaWFsaXppbmcgc2V0dGluZ3M6ICcgKyAoICggZTQgJiYgZTQubWVzc2FnZSApID8gZTQubWVzc2FnZSA6IFN0cmluZyggZTQgKSApICk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvLyBEZWJvdW5jZSB0byBhdm9pZCBoZWF2eSBleHBvcnRzIG9uIHJhcGlkIGRyYWcvZHJvcC5cclxuXHRsZXQgdXBkYXRlX3RpbWVyID0gMDtcclxuXHJcblx0ZnVuY3Rpb24gc2NoZWR1bGVfdXBkYXRlKCBzdHJ1Y3R1cmUgKSB7XHJcblx0XHR3LmNsZWFyVGltZW91dCggdXBkYXRlX3RpbWVyICk7XHJcblx0XHR1cGRhdGVfdGltZXIgPSB3LnNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0cmVuZGVyX291dHB1dHMoIHN0cnVjdHVyZSB8fCBnZXRfY3VycmVudF9zdHJ1Y3R1cmUoKSApO1xyXG5cdFx0fSwgODAgKTtcclxuXHR9XHJcblxyXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0Ly8gQmluZCBleGlzdGluZyBidXR0b25zIChubyBVSSBjcmVhdGlvbilcclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdGZ1bmN0aW9uIGJpbmRfZGVidWdfYnV0dG9uc19vbmNlKCkge1xyXG5cdFx0Y29uc3QgcGFuZWwgPSBnZXRfZGVidWdfcGFuZWwoKTtcclxuXHRcdGlmICggISBwYW5lbCApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIDEpIElmIHlvdSBsYXRlciBhZGQgZGF0YSBhdHRyaWJ1dGVzLCB3ZSBzdXBwb3J0IHRoZW0uXHJcblx0XHRjb25zdCBkYXRhX2J0bnMgPSBwYW5lbC5xdWVyeVNlbGVjdG9yQWxsKCAnW2RhdGEtd3BiYy1iZmItZGVidWctYWN0aW9uXScgKTtcclxuXHRcdGlmICggZGF0YV9idG5zICYmIGRhdGFfYnRucy5sZW5ndGggKSB7XHJcblx0XHRcdGRhdGFfYnRucy5mb3JFYWNoKCBmdW5jdGlvbiAoIGJ0biApIHtcclxuXHRcdFx0XHRpZiAoICEgYnRuIHx8ICEgYnRuLmFkZEV2ZW50TGlzdGVuZXIgKSB7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmICggYnRuLmdldEF0dHJpYnV0ZSggJ2RhdGEtd3BiYy1iZmItZGVidWctYm91bmQnICkgPT09ICcxJyApIHtcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0YnRuLnNldEF0dHJpYnV0ZSggJ2RhdGEtd3BiYy1iZmItZGVidWctYm91bmQnLCAnMScgKTtcclxuXHJcblx0XHRcdFx0YnRuLmFkZEV2ZW50TGlzdGVuZXIoICdjbGljaycsIGZ1bmN0aW9uICggZSApIHtcclxuXHRcdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBhY3Rpb24gPSBTdHJpbmcoIGJ0bi5nZXRBdHRyaWJ1dGUoICdkYXRhLXdwYmMtYmZiLWRlYnVnLWFjdGlvbicgKSB8fCAnJyApLnRvTG93ZXJDYXNlKCk7XHJcblx0XHRcdFx0XHRjb25zdCB0YXJnZXQgPSBTdHJpbmcoIGJ0bi5nZXRBdHRyaWJ1dGUoICdkYXRhLXdwYmMtYmZiLWRlYnVnLXRhcmdldCcgKSB8fCAnJyApO1xyXG5cclxuXHRcdFx0XHRcdGlmICggYWN0aW9uID09PSAnY29weScgJiYgdGFyZ2V0ICkge1xyXG5cdFx0XHRcdFx0XHRjb25zdCB0YSA9IGQuZ2V0RWxlbWVudEJ5SWQoIHRhcmdldCApO1xyXG5cdFx0XHRcdFx0XHRpZiAoIHRhICkge1xyXG5cdFx0XHRcdFx0XHRcdGNvcHlfdGV4dF90b19jbGlwYm9hcmQoIHRhLnZhbHVlLCBidG4gKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBhY3Rpb24gPT09ICdhcHBseV9zdHJ1Y3R1cmUnICkge1xyXG5cdFx0XHRcdFx0XHRpbXBvcnRfZnJvbV90ZXh0YXJlYXMoICdzdHJ1Y3R1cmUnICk7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGlmICggYWN0aW9uID09PSAnYXBwbHlfc2V0dGluZ3MnICkge1xyXG5cdFx0XHRcdFx0XHRpbXBvcnRfZnJvbV90ZXh0YXJlYXMoICdzZXR0aW5ncycgKTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYgKCBhY3Rpb24gPT09ICdhcHBseV9ib3RoJyApIHtcclxuXHRcdFx0XHRcdFx0aW1wb3J0X2Zyb21fdGV4dGFyZWFzKCAnYm90aCcgKTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYgKCBhY3Rpb24gPT09ICdyZWZyZXNoJyApIHtcclxuXHRcdFx0XHRcdFx0c2NoZWR1bGVfdXBkYXRlKCk7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9ICk7XHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHRcdHJldHVybjsgLy8gZGF0YS1hdHRycyBhcmUgdGhlIHByZWZlcnJlZCBiaW5kaW5nIG1ldGhvZC5cclxuXHRcdH1cclxuXHJcblx0XHQvLyAyKSBGYWxsYmFjayBiaW5kaW5nIGZvciB5b3VyIGN1cnJlbnQgSFRNTCAoYnkgdGV4dGFyZWEgaWQgKyBidXR0b24gb3JkZXIgaW4gYmxvY2spLlxyXG5cdFx0Y29uc3QgYmxvY2tzID0gcGFuZWwucXVlcnlTZWxlY3RvckFsbCggJy53cGJjX2JmYl9fZGVidWdfYmxvY2snICk7XHJcblx0XHRpZiAoICEgYmxvY2tzIHx8ICEgYmxvY2tzLmxlbmd0aCApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdGJsb2Nrcy5mb3JFYWNoKCBmdW5jdGlvbiAoIGJsb2NrICkge1xyXG5cdFx0XHRjb25zdCB0YSA9IGJsb2NrLnF1ZXJ5U2VsZWN0b3IoICd0ZXh0YXJlYScgKTtcclxuXHRcdFx0aWYgKCAhIHRhIHx8ICEgdGEuaWQgKSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBidG5zID0gYmxvY2sucXVlcnlTZWxlY3RvckFsbCggJ2J1dHRvbicgKTtcclxuXHRcdFx0aWYgKCAhIGJ0bnMgfHwgISBidG5zLmxlbmd0aCApIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIENvcHkgPSBhbHdheXMgZmlyc3QgYnV0dG9uLlxyXG5cdFx0XHRjb25zdCBidG5fY29weSA9IGJ0bnNbMF07XHJcblx0XHRcdGlmICggYnRuX2NvcHkgJiYgYnRuX2NvcHkuZ2V0QXR0cmlidXRlKCAnZGF0YS13cGJjLWJmYi1kZWJ1Zy1ib3VuZCcgKSAhPT0gJzEnICkge1xyXG5cdFx0XHRcdGJ0bl9jb3B5LnNldEF0dHJpYnV0ZSggJ2RhdGEtd3BiYy1iZmItZGVidWctYm91bmQnLCAnMScgKTtcclxuXHRcdFx0XHRidG5fY29weS5hZGRFdmVudExpc3RlbmVyKCAnY2xpY2snLCBmdW5jdGlvbiAoIGUgKSB7XHJcblx0XHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHRjb3B5X3RleHRfdG9fY2xpcGJvYXJkKCB0YS52YWx1ZSwgYnRuX2NvcHkgKTtcclxuXHRcdFx0XHR9ICk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIEltcG9ydCBibG9ja3MgaGF2ZSBtb3JlIGJ1dHRvbnMuXHJcblx0XHRcdGlmICggdGEuaWQgPT09ICd3cGJjX2JmYl9fc3RydWN0dXJlX2ltcG9ydCcgKSB7XHJcblx0XHRcdFx0aWYgKCBidG5zWzFdICYmIGJ0bnNbMV0uZ2V0QXR0cmlidXRlKCAnZGF0YS13cGJjLWJmYi1kZWJ1Zy1ib3VuZCcgKSAhPT0gJzEnICkge1xyXG5cdFx0XHRcdFx0YnRuc1sxXS5zZXRBdHRyaWJ1dGUoICdkYXRhLXdwYmMtYmZiLWRlYnVnLWJvdW5kJywgJzEnICk7XHJcblx0XHRcdFx0XHRidG5zWzFdLmFkZEV2ZW50TGlzdGVuZXIoICdjbGljaycsIGZ1bmN0aW9uICggZSApIHtcclxuXHRcdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0XHRpbXBvcnRfZnJvbV90ZXh0YXJlYXMoICdzdHJ1Y3R1cmUnICk7XHJcblx0XHRcdFx0XHR9ICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmICggYnRuc1syXSAmJiBidG5zWzJdLmdldEF0dHJpYnV0ZSggJ2RhdGEtd3BiYy1iZmItZGVidWctYm91bmQnICkgIT09ICcxJyApIHtcclxuXHRcdFx0XHRcdGJ0bnNbMl0uc2V0QXR0cmlidXRlKCAnZGF0YS13cGJjLWJmYi1kZWJ1Zy1ib3VuZCcsICcxJyApO1xyXG5cdFx0XHRcdFx0YnRuc1syXS5hZGRFdmVudExpc3RlbmVyKCAnY2xpY2snLCBmdW5jdGlvbiAoIGUgKSB7XHJcblx0XHRcdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRcdFx0aW1wb3J0X2Zyb21fdGV4dGFyZWFzKCAnYm90aCcgKTtcclxuXHRcdFx0XHRcdH0gKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggdGEuaWQgPT09ICd3cGJjX2JmYl9fc2V0dGluZ3NfaW1wb3J0JyApIHtcclxuXHRcdFx0XHRpZiAoIGJ0bnNbMV0gJiYgYnRuc1sxXS5nZXRBdHRyaWJ1dGUoICdkYXRhLXdwYmMtYmZiLWRlYnVnLWJvdW5kJyApICE9PSAnMScgKSB7XHJcblx0XHRcdFx0XHRidG5zWzFdLnNldEF0dHJpYnV0ZSggJ2RhdGEtd3BiYy1iZmItZGVidWctYm91bmQnLCAnMScgKTtcclxuXHRcdFx0XHRcdGJ0bnNbMV0uYWRkRXZlbnRMaXN0ZW5lciggJ2NsaWNrJywgZnVuY3Rpb24gKCBlICkge1xyXG5cdFx0XHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHRcdGltcG9ydF9mcm9tX3RleHRhcmVhcyggJ3NldHRpbmdzJyApO1xyXG5cdFx0XHRcdFx0fSApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRpZiAoIGJ0bnNbMl0gJiYgYnRuc1syXS5nZXRBdHRyaWJ1dGUoICdkYXRhLXdwYmMtYmZiLWRlYnVnLWJvdW5kJyApICE9PSAnMScgKSB7XHJcblx0XHRcdFx0XHRidG5zWzJdLnNldEF0dHJpYnV0ZSggJ2RhdGEtd3BiYy1iZmItZGVidWctYm91bmQnLCAnMScgKTtcclxuXHRcdFx0XHRcdGJ0bnNbMl0uYWRkRXZlbnRMaXN0ZW5lciggJ2NsaWNrJywgZnVuY3Rpb24gKCBlICkge1xyXG5cdFx0XHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHRcdGltcG9ydF9mcm9tX3RleHRhcmVhcyggJ2JvdGgnICk7XHJcblx0XHRcdFx0XHR9ICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9ICk7XHJcblx0fVxyXG5cclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdC8vIFdpcmluZ1xyXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0ZC5hZGRFdmVudExpc3RlbmVyKCAnRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uICgpIHtcclxuXHRcdGJpbmRfZGVidWdfYnV0dG9uc19vbmNlKCk7XHJcblx0XHRzY2hlZHVsZV91cGRhdGUoKTtcclxuXHR9ICk7XHJcblxyXG5cdC8vIFJlZnJlc2ggd2hlbiBzd2l0Y2hpbmcgdG8gRGVidWcgdGFiIE9SIGRlYnVnIGludGVybmFsIHRhYnMuXHJcblx0ZC5hZGRFdmVudExpc3RlbmVyKCAnd3BiYzpiZmI6dG9wLXRhYicsIGZ1bmN0aW9uICggZXYgKSB7XHJcblx0XHRjb25zdCB0YWJfaWQgPSAoIGV2ICYmIGV2LmRldGFpbCAmJiBldi5kZXRhaWwudGFiICkgPyBTdHJpbmcoIGV2LmRldGFpbC50YWIgKSA6ICcnO1xyXG5cdFx0aWYgKCB0YWJfaWQgPT09ICdkZWJ1Z190YWInIHx8IHRhYl9pZC5pbmRleE9mKCAnZGVidWdfbW9kZV9fJyApID09PSAwICkge1xyXG5cdFx0XHRiaW5kX2RlYnVnX2J1dHRvbnNfb25jZSgpO1xyXG5cdFx0XHRzY2hlZHVsZV91cGRhdGUoKTtcclxuXHRcdH1cclxuXHR9ICk7XHJcblxyXG5cdC8vIEZhbGxiYWNrIGV2ZW50IChpZiB5b3Ugc3RpbGwgZGlzcGF0Y2ggaXQgc29tZXdoZXJlKS5cclxuXHRkLmFkZEV2ZW50TGlzdGVuZXIoICd3cGJjOmJmYjpzdHJ1Y3R1cmU6Y2hhbmdlJywgZnVuY3Rpb24gKCkge1xyXG5cdFx0c2NoZWR1bGVfdXBkYXRlKCk7XHJcblx0fSApO1xyXG5cclxuXHQvLyBTZXR0aW5ncyBhcHBseS9jaGFuZ2VkIHNob3VsZCByZWZyZXNoIGRlYnVnIG91dHB1dC5cclxuXHRkLmFkZEV2ZW50TGlzdGVuZXIoICd3cGJjOmJmYjpmb3JtX3NldHRpbmdzOmFwcGx5JywgZnVuY3Rpb24gKCkge1xyXG5cdFx0c2NoZWR1bGVfdXBkYXRlKCk7XHJcblx0fSwgeyBwYXNzaXZlOiB0cnVlIH0gKTtcclxuXHJcblx0ZC5hZGRFdmVudExpc3RlbmVyKCAnd3BiYzpiZmI6Zm9ybV9zZXR0aW5nczpjaGFuZ2VkJywgZnVuY3Rpb24gKCkge1xyXG5cdFx0c2NoZWR1bGVfdXBkYXRlKCk7XHJcblx0fSwgeyBwYXNzaXZlOiB0cnVlIH0gKTtcclxuXHJcblx0Ly8gTG93LWNvc3QgZmFsbGJhY2s6IHJlZnJlc2ggb24gYW55IGNoYW5nZSB0byBTTyBjb250cm9scyAoZGF0YS13cGJjLXUtc2F2ZS0qKS5cclxuXHRkLmFkZEV2ZW50TGlzdGVuZXIoXHJcblx0XHQnY2hhbmdlJyxcclxuXHRcdGZ1bmN0aW9uICggZSApIHtcclxuXHRcdFx0Y29uc3QgdCA9IGUgPyBlLnRhcmdldCA6IG51bGw7XHJcblx0XHRcdGlmICggISB0IHx8ICEgdC5nZXRBdHRyaWJ1dGUgKSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBhdHRycyA9IHQuYXR0cmlidXRlcyB8fCBudWxsO1xyXG5cdFx0XHRpZiAoICEgYXR0cnMgfHwgISBhdHRycy5sZW5ndGggKSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBhdHRycy5sZW5ndGg7IGkrKyApIHtcclxuXHRcdFx0XHRjb25zdCBuID0gYXR0cnNbaV0gPyBTdHJpbmcoIGF0dHJzW2ldLm5hbWUgfHwgJycgKSA6ICcnO1xyXG5cdFx0XHRcdGlmICggbiAmJiBuLmluZGV4T2YoICdkYXRhLXdwYmMtdS1zYXZlLScgKSA9PT0gMCApIHtcclxuXHRcdFx0XHRcdHNjaGVkdWxlX3VwZGF0ZSgpO1xyXG5cdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSxcclxuXHRcdHsgcGFzc2l2ZTogdHJ1ZSB9XHJcblx0KTtcclxuXHJcblx0Ly8gUHJlZmVyIEV2ZW50QnVzIHdoZW4gYXZhaWxhYmxlLlxyXG5cdChmdW5jdGlvbiBob29rX2J1cygpIHtcclxuXHRcdGNvbnN0IENvcmUgPSB3LldQQkNfQkZCX0NvcmUgfHwge307XHJcblx0XHRjb25zdCBFViAgID0gQ29yZS5XUEJDX0JGQl9FdmVudHMgfHwgbnVsbDtcclxuXHJcblx0XHRpZiAoICEgRVYgfHwgISB3LndwYmNfYmZiX2FwaSB8fCAhIHcud3BiY19iZmJfYXBpLnJlYWR5ICkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0dy53cGJjX2JmYl9hcGkucmVhZHkudGhlbiggZnVuY3Rpb24gKCBidWlsZGVyICkge1xyXG5cdFx0XHRpZiAoICEgYnVpbGRlciB8fCAhIGJ1aWxkZXIuYnVzIHx8IHR5cGVvZiBidWlsZGVyLmJ1cy5vbiAhPT0gJ2Z1bmN0aW9uJyApIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdFtcclxuXHRcdFx0XHRFVi5TVFJVQ1RVUkVfQ0hBTkdFLFxyXG5cdFx0XHRcdEVWLkZJRUxEX0FERCxcclxuXHRcdFx0XHRFVi5GSUVMRF9SRU1PVkUsXHJcblx0XHRcdFx0RVYuU1RSVUNUVVJFX0xPQURFRFxyXG5cdFx0XHRdLmZpbHRlciggQm9vbGVhbiApLmZvckVhY2goIGZ1bmN0aW9uICggZXZlbnRfbmFtZSApIHtcclxuXHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0YnVpbGRlci5idXMub24oIGV2ZW50X25hbWUsIGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRcdFx0c2NoZWR1bGVfdXBkYXRlKCk7XHJcblx0XHRcdFx0XHR9ICk7XHJcblx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7XHJcblx0XHRcdFx0XHRpZiAoIHcuX3dwYmMgJiYgdy5fd3BiYy5kZXYgJiYgdHlwZW9mIHcuX3dwYmMuZGV2LmVycm9yID09PSAnZnVuY3Rpb24nICkge1xyXG5cdFx0XHRcdFx0XHR3Ll93cGJjLmRldi5lcnJvciggJ2RlYnVnLXVpOiBidXMub24gZmFpbGVkJywgZXZlbnRfbmFtZSwgZSApO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSApO1xyXG5cdFx0fSApO1xyXG5cdH0pKCk7XHJcbn0pKCB3aW5kb3csIGRvY3VtZW50ICk7Il0sIm1hcHBpbmdzIjoiOztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsVUFBVUEsQ0FBQyxFQUFFQyxDQUFDLEVBQUU7RUFDaEIsWUFBWTs7RUFFWjtFQUNBLElBQUtELENBQUMsQ0FBQ0UsMkJBQTJCLEtBQUssR0FBRyxFQUFHO0lBQzVDO0VBQ0Q7RUFDQUYsQ0FBQyxDQUFDRSwyQkFBMkIsR0FBRyxHQUFHO0VBRW5DLE1BQU1DLGNBQWMsR0FBRyw4QkFBOEI7RUFDckQsTUFBTUMsYUFBYSxHQUFJLG1DQUFtQztFQUUxRCxTQUFTQyxZQUFZQSxDQUFBLEVBQUc7SUFDdkIsT0FBTyxDQUFDLEVBQUlKLENBQUMsQ0FBQ0ssY0FBYyxDQUFFSCxjQUFlLENBQUMsSUFBSUYsQ0FBQyxDQUFDTSxhQUFhLENBQUVILGFBQWMsQ0FBQyxDQUFFO0VBQ3JGO0VBRUEsSUFBSyxDQUFFQyxZQUFZLENBQUMsQ0FBQyxFQUFHO0lBQ3ZCO0VBQ0Q7O0VBRUE7RUFDQTtFQUNBO0VBQ0EsU0FBU0csWUFBWUEsQ0FBRUMsR0FBRyxFQUFFQyxJQUFJLEVBQUVDLE9BQU8sRUFBRztJQUMzQyxNQUFNQyxDQUFDLEdBQUdDLE1BQU0sQ0FBRUosR0FBRyxJQUFJLEVBQUcsQ0FBQztJQUM3QixNQUFNSyxDQUFDLEdBQUdELE1BQU0sQ0FBRUgsSUFBSSxJQUFJLE1BQU8sQ0FBQztJQUVsQyxJQUFLLE9BQU9WLENBQUMsQ0FBQ2UsdUJBQXVCLEtBQUssVUFBVSxFQUFHO01B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
714