| 1 |
"use strict"; |
| 2 |
|
| 3 |
function wpbc_user_data_saver__read_attr_or_data($el, attr_name, data_name) { |
| 4 |
var attr_value = $el.attr(attr_name); |
| 5 |
if (attr_value !== undefined) { |
| 6 |
return attr_value; |
| 7 |
} |
| 8 |
return $el.data(data_name); |
| 9 |
} |
| 10 |
function wpbc_save_custom_user_data_from_element(el) { |
| 11 |
if (typeof WPBC_UserDataSaver === 'undefined') { |
| 12 |
console.error('WPBC | Global AJAX object is missing.'); |
| 13 |
return false; |
| 14 |
} |
| 15 |
const $el = jQuery(el); |
| 16 |
const user_id = wpbc_user_data_saver__read_attr_or_data($el, 'data-wpbc-u-save-user-id', 'wpbc-u-save-user-id'); |
| 17 |
const nonce = wpbc_user_data_saver__read_attr_or_data($el, 'data-wpbc-u-save-nonce', 'wpbc-u-save-nonce'); |
| 18 |
const nonce_action = wpbc_user_data_saver__read_attr_or_data($el, 'data-wpbc-u-save-action', 'wpbc-u-save-action'); |
| 19 |
const data_name = wpbc_user_data_saver__read_attr_or_data($el, 'data-wpbc-u-save-name', 'wpbc-u-save-name'); |
| 20 |
const fields_raw = wpbc_user_data_saver__read_attr_or_data($el, 'data-wpbc-u-save-fields', 'wpbc-u-save-fields') || ''; |
| 21 |
const inline_value = wpbc_user_data_saver__read_attr_or_data($el, 'data-wpbc-u-save-value', 'wpbc-u-save-value'); |
| 22 |
const json = wpbc_user_data_saver__read_attr_or_data($el, 'data-wpbc-u-save-value-json', 'wpbc-u-save-value-json'); |
| 23 |
const callbackFnName = wpbc_user_data_saver__read_attr_or_data($el, 'data-wpbc-u-save-callback', 'wpbc-u-save-callback'); |
| 24 |
const callbackFn = typeof window[callbackFnName] === 'function' ? window[callbackFnName] : null; |
| 25 |
if (callbackFnName && !callbackFn) { |
| 26 |
console.warn('WPBC | Callback not found:', callbackFnName); |
| 27 |
} |
| 28 |
if (!user_id || !nonce || !nonce_action || !data_name) { |
| 29 |
console.error('WPBC | Missing required data attributes.'); |
| 30 |
return false; |
| 31 |
} |
| 32 |
let serialized = ''; |
| 33 |
if (typeof json === 'string' && json.trim() !== '') { |
| 34 |
try { |
| 35 |
serialized = jQuery.param(JSON.parse(json)); |
| 36 |
} catch (e) { |
| 37 |
console.error('WPBC | Invalid JSON in data-wpbc-u-save-value-json'); |
| 38 |
return false; |
| 39 |
} |
| 40 |
} else if (inline_value !== undefined) { |
| 41 |
// Save simple direct value as single param. |
| 42 |
serialized = jQuery.param({ |
| 43 |
value: inline_value |
| 44 |
}); |
| 45 |
} else if (fields_raw) { |
| 46 |
const fields = fields_raw.split(',').map(s => s.trim()).filter(Boolean); |
| 47 |
const data = {}; |
| 48 |
fields.forEach(function (selector) { |
| 49 |
const $field = jQuery(selector); |
| 50 |
if ($field.length) { |
| 51 |
const key = $field.attr('name') || $field.attr('id'); |
| 52 |
if (key) { |
| 53 |
data[key] = $field.val(); |
| 54 |
} else { |
| 55 |
console.warn('WPBC | Field missing name/id:', $field); |
| 56 |
} |
| 57 |
} |
| 58 |
}); |
| 59 |
serialized = jQuery.param(data); |
| 60 |
} else { |
| 61 |
console.error('WPBC | Missing data-wpbc-u-save-fields or data-wpbc-u-save-value.'); |
| 62 |
return false; |
| 63 |
} |
| 64 |
jQuery(document).trigger('wpbc:userdata:beforeSave', [$el, serialized]); |
| 65 |
return jQuery.ajax({ |
| 66 |
url: WPBC_UserDataSaver.ajax_url, |
| 67 |
type: 'POST', |
| 68 |
data: { |
| 69 |
action: WPBC_UserDataSaver.action, |
| 70 |
user_id: user_id, |
| 71 |
nonce: nonce, |
| 72 |
nonce_action: nonce_action, |
| 73 |
data_name: data_name, |
| 74 |
data_value: serialized |
| 75 |
}, |
| 76 |
success: function (response) { |
| 77 |
jQuery(document).trigger('wpbc:userdata:afterSave', [response]); |
| 78 |
if (response.success) { |
| 79 |
// console.log( 'WPBC | ' + (response.data.message || 'Saved successfully.') ); |
| 80 |
if (callbackFn) { |
| 81 |
callbackFn(response); |
| 82 |
} |
| 83 |
} else { |
| 84 |
console.error('WPBC | ' + (response.data.message || 'Save error.')); |
| 85 |
} |
| 86 |
}, |
| 87 |
error: function (xhr) { |
| 88 |
console.error('WPBC | AJAX error: ' + xhr.status + ' ' + xhr.statusText); |
| 89 |
} |
| 90 |
}); |
| 91 |
} |
| 92 |
|
| 93 |
/** |
| 94 |
* Note: |
| 95 |
// This binds a handler *to event 'click'*, labeled 'myFeature' |
| 96 |
$(document).on('click.myFeature', function () { ... }); |
| 97 |
|
| 98 |
// This binds another *to 'click'*, labeled 'debug' |
| 99 |
$(document).on('click.debug', function () { ... }); |
| 100 |
|
| 101 |
// This fires the event 'click' — both will run: |
| 102 |
$(document).trigger('click'); |
| 103 |
|
| 104 |
// This removes only handlers with .myFeature |
| 105 |
$(document).off('click.myFeature'); |
| 106 |
*/ |
| 107 |
|
| 108 |
// jQuery( document ).on( 'wpbc:userdata:beforeSave.customLogger', function (e, $el, data) { |
| 109 |
// // $el.prop('disabled', true); // Example: disable the clicked element |
| 110 |
// } ); |
| 111 |
|
| 112 |
// jQuery( document ).on( 'wpbc:userdata:afterSave.customLogger', function (e, response) { |
| 113 |
// |
| 114 |
// console.log( 'Save finished. Server responded with:', response ); |
| 115 |
// |
| 116 |
// if ( response.success ) { |
| 117 |
// console.log( 'Saved!' ); |
| 118 |
// } else { |
| 119 |
// console.log( 'Error: ' + ( response.data?.message || 'Unknown error' ) ); |
| 120 |
// } |
| 121 |
// |
| 122 |
// // Optional: re-enable all save buttons |
| 123 |
// // jQuery('[data-wpbc-u-save-name]').prop('disabled', false); |
| 124 |
// } ); |
| 125 |
|
| 126 |
// To remove it: |
| 127 |
// jQuery(document).off('wpbc:userdata:afterSave.customLogger'); |
| 128 |
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5jbHVkZXMvc2F2ZS11c2VyLW1ldGEvX291dC9zYXZlLXVzZXItbWV0YS5qcyIsIm5hbWVzIjpbIndwYmNfdXNlcl9kYXRhX3NhdmVyX19yZWFkX2F0dHJfb3JfZGF0YSIsIiRlbCIsImF0dHJfbmFtZSIsImRhdGFfbmFtZSIsImF0dHJfdmFsdWUiLCJhdHRyIiwidW5kZWZpbmVkIiwiZGF0YSIsIndwYmNfc2F2ZV9jdXN0b21fdXNlcl9kYXRhX2Zyb21fZWxlbWVudCIsImVsIiwiV1BCQ19Vc2VyRGF0YVNhdmVyIiwiY29uc29sZSIsImVycm9yIiwialF1ZXJ5IiwidXNlcl9pZCIsIm5vbmNlIiwibm9uY2VfYWN0aW9uIiwiZmllbGRzX3JhdyIsImlubGluZV92YWx1ZSIsImpzb24iLCJjYWxsYmFja0ZuTmFtZSIsImNhbGxiYWNrRm4iLCJ3aW5kb3ciLCJ3YXJuIiwic2VyaWFsaXplZCIsInRyaW0iLCJwYXJhbSIsIkpTT04iLCJwYXJzZSIsImUiLCJ2YWx1ZSIsImZpZWxkcyIsInNwbGl0IiwibWFwIiwicyIsImZpbHRlciIsIkJvb2xlYW4iLCJmb3JFYWNoIiwic2VsZWN0b3IiLCIkZmllbGQiLCJsZW5ndGgiLCJrZXkiLCJ2YWwiLCJkb2N1bWVudCIsInRyaWdnZXIiLCJhamF4IiwidXJsIiwiYWpheF91cmwiLCJ0eXBlIiwiYWN0aW9uIiwiZGF0YV92YWx1ZSIsInN1Y2Nlc3MiLCJyZXNwb25zZSIsIm1lc3NhZ2UiLCJ4aHIiLCJzdGF0dXMiLCJzdGF0dXNUZXh0Il0sInNvdXJjZXMiOlsiaW5jbHVkZXMvc2F2ZS11c2VyLW1ldGEvX3NyYy9zYXZlLXVzZXItbWV0YS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiB3cGJjX3VzZXJfZGF0YV9zYXZlcl9fcmVhZF9hdHRyX29yX2RhdGEoICRlbCwgYXR0cl9uYW1lLCBkYXRhX25hbWUgKSB7XHJcblx0dmFyIGF0dHJfdmFsdWUgPSAkZWwuYXR0ciggYXR0cl9uYW1lICk7XHJcblxyXG5cdGlmICggYXR0cl92YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xyXG5cdFx0cmV0dXJuIGF0dHJfdmFsdWU7XHJcblx0fVxyXG5cclxuXHRyZXR1cm4gJGVsLmRhdGEoIGRhdGFfbmFtZSApO1xyXG59XHJcblxyXG5mdW5jdGlvbiB3cGJjX3NhdmVfY3VzdG9tX3VzZXJfZGF0YV9mcm9tX2VsZW1lbnQoZWwpIHtcclxuXHJcblx0aWYgKCB0eXBlb2YgV1BCQ19Vc2VyRGF0YVNhdmVyID09PSAndW5kZWZpbmVkJyApIHtcclxuXHRcdGNvbnNvbGUuZXJyb3IoICdXUEJDIHwgR2xvYmFsIEFKQVggb2JqZWN0IGlzIG1pc3NpbmcuJyApO1xyXG5cdFx0cmV0dXJuIGZhbHNlO1xyXG5cdH1cclxuXHJcblx0Y29uc3QgJGVsID0galF1ZXJ5KCBlbCApO1xyXG5cclxuXHRjb25zdCB1c2VyX2lkICAgICAgPSB3cGJjX3VzZXJfZGF0YV9zYXZlcl9fcmVhZF9hdHRyX29yX2RhdGEoICRlbCwgJ2RhdGEtd3BiYy11LXNhdmUtdXNlci1pZCcsICd3cGJjLXUtc2F2ZS11c2VyLWlkJyApO1xyXG5cdGNvbnN0IG5vbmNlICAgICAgICA9IHdwYmNfdXNlcl9kYXRhX3NhdmVyX19yZWFkX2F0dHJfb3JfZGF0YSggJGVsLCAnZGF0YS13cGJjLXUtc2F2ZS1ub25jZScsICd3cGJjLXUtc2F2ZS1ub25jZScgKTtcclxuXHRjb25zdCBub25jZV9hY3Rpb24gPSB3cGJjX3VzZXJfZGF0YV9zYXZlcl9fcmVhZF9hdHRyX29yX2RhdGEoICRlbCwgJ2RhdGEtd3BiYy11LXNhdmUtYWN0aW9uJywgJ3dwYmMtdS1zYXZlLWFjdGlvbicgKTtcclxuXHRjb25zdCBkYXRhX25hbWUgICAgPSB3cGJjX3VzZXJfZGF0YV9zYXZlcl9fcmVhZF9hdHRyX29yX2RhdGEoICRlbCwgJ2RhdGEtd3BiYy11LXNhdmUtbmFtZScsICd3cGJjLXUtc2F2ZS1uYW1lJyApO1xyXG5cdGNvbnN0IGZpZWxkc19yYXcgICA9IHdwYmNfdXNlcl9kYXRhX3NhdmVyX19yZWFkX2F0dHJfb3JfZGF0YSggJGVsLCAnZGF0YS13cGJjLXUtc2F2ZS1maWVsZHMnLCAnd3BiYy11LXNhdmUtZmllbGRzJyApIHx8ICcnO1xyXG5cdGNvbnN0IGlubGluZV92YWx1ZSA9IHdwYmNfdXNlcl9kYXRhX3NhdmVyX19yZWFkX2F0dHJfb3JfZGF0YSggJGVsLCAnZGF0YS13cGJjLXUtc2F2ZS12YWx1ZScsICd3cGJjLXUtc2F2ZS12YWx1ZScgKTtcclxuXHRjb25zdCBqc29uICAgICAgICAgPSB3cGJjX3VzZXJfZGF0YV9zYXZlcl9fcmVhZF9hdHRyX29yX2RhdGEoICRlbCwgJ2RhdGEtd3BiYy11LXNhdmUtdmFsdWUtanNvbicsICd3cGJjLXUtc2F2ZS12YWx1ZS1qc29uJyApO1xyXG5cclxuXHRjb25zdCBjYWxsYmFja0ZuTmFtZSA9IHdwYmNfdXNlcl9kYXRhX3NhdmVyX19yZWFkX2F0dHJfb3JfZGF0YSggJGVsLCAnZGF0YS13cGJjLXUtc2F2ZS1jYWxsYmFjaycsICd3cGJjLXUtc2F2ZS1jYWxsYmFjaycgKTtcclxuXHRjb25zdCBjYWxsYmFja0ZuICAgICA9IHR5cGVvZiB3aW5kb3dbY2FsbGJhY2tGbk5hbWVdID09PSAnZnVuY3Rpb24nID8gd2luZG93W2NhbGxiYWNrRm5OYW1lXSA6IG51bGw7XHJcblx0aWYgKCBjYWxsYmFja0ZuTmFtZSAmJiAhY2FsbGJhY2tGbiApIHtcclxuXHRcdGNvbnNvbGUud2FybiggJ1dQQkMgfCBDYWxsYmFjayBub3QgZm91bmQ6JywgY2FsbGJhY2tGbk5hbWUgKTtcclxuXHR9XHJcblxyXG5cdGlmICggIXVzZXJfaWQgfHwgIW5vbmNlIHx8ICFub25jZV9hY3Rpb24gfHwgIWRhdGFfbmFtZSApIHtcclxuXHRcdGNvbnNvbGUuZXJyb3IoICdXUEJDIHwgTWlzc2luZyByZXF1aXJlZCBkYXRhIGF0dHJpYnV0ZXMuJyApO1xyXG5cdFx0cmV0dXJuIGZhbHNlO1xyXG5cdH1cclxuXHJcblx0bGV0IHNlcmlhbGl6ZWQgPSAnJztcclxuXHJcblx0aWYgKCB0eXBlb2YganNvbiA9PT0gJ3N0cmluZycgJiYganNvbi50cmltKCkgIT09ICcnICkge1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0c2VyaWFsaXplZCA9IGpRdWVyeS5wYXJhbSggSlNPTi5wYXJzZSgganNvbiApICk7XHJcblx0XHR9IGNhdGNoICggZSApIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1dQQkMgfCBJbnZhbGlkIEpTT04gaW4gZGF0YS13cGJjLXUtc2F2ZS12YWx1ZS1qc29uJyApO1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblx0fSBlbHNlIGlmICggaW5saW5lX3ZhbHVlICE9PSB1bmRlZmluZWQgKSB7XHJcblx0XHQvLyBTYXZlIHNpbXBsZSBkaXJlY3QgdmFsdWUgYXMgc2luZ2xlIHBhcmFtLlxyXG5cdFx0c2VyaWFsaXplZCA9IGpRdWVyeS5wYXJhbSggeyB2YWx1ZTogaW5saW5lX3ZhbHVlIH0gKTtcclxuXHR9IGVsc2UgaWYgKCBmaWVsZHNfcmF3ICkge1xyXG5cdFx0Y29uc3QgZmllbGRzID0gZmllbGRzX3Jhdy5zcGxpdCggJywnICkubWFwKCBzID0+IHMudHJpbSgpICkuZmlsdGVyKCBCb29sZWFuICk7XHJcblx0XHRjb25zdCBkYXRhICAgPSB7fTtcclxuXHJcblx0XHRmaWVsZHMuZm9yRWFjaCggZnVuY3Rpb24gKHNlbGVjdG9yKSB7XHJcblx0XHRcdGNvbnN0ICRmaWVsZCA9IGpRdWVyeSggc2VsZWN0b3IgKTtcclxuXHRcdFx0aWYgKCAkZmllbGQubGVuZ3RoICkge1xyXG5cdFx0XHRcdGNvbnN0IGtleSA9ICRmaWVsZC5hdHRyKCAnbmFtZScgKSB8fCAkZmllbGQuYXR0ciggJ2lkJyApO1xyXG5cdFx0XHRcdGlmICgga2V5ICkge1xyXG5cdFx0XHRcdFx0ZGF0YVtrZXldID0gJGZpZWxkLnZhbCgpO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdXUEJDIHwgRmllbGQgbWlzc2luZyBuYW1lL2lkOicsICRmaWVsZCApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSApO1xyXG5cclxuXHRcdHNlcmlhbGl6ZWQgPSBqUXVlcnkucGFyYW0oIGRhdGEgKTtcclxuXHR9IGVsc2Uge1xyXG5cdFx0Y29uc29sZS5lcnJvciggJ1dQQkMgfCBNaXNzaW5nIGRhdGEtd3BiYy11LXNhdmUtZmllbGRzIG9yIGRhdGEtd3BiYy11LXNhdmUtdmFsdWUuJyApO1xyXG5cdFx0cmV0dXJuIGZhbHNlO1xyXG5cdH1cclxuXHJcblx0alF1ZXJ5KCBkb2N1bWVudCApLnRyaWdnZXIoICd3cGJjOnVzZXJkYXRhOmJlZm9yZVNhdmUnLCBbICRlbCwgc2VyaWFsaXplZCBdICk7XHJcblxyXG5cdHJldHVybiBqUXVlcnkuYWpheCgge1xyXG5cdFx0dXJsICAgIDogV1BCQ19Vc2VyRGF0YVNhdmVyLmFqYXhfdXJsLFxyXG5cdFx0dHlwZSAgIDogJ1BPU1QnLFxyXG5cdFx0ZGF0YSAgIDoge1xyXG5cdFx0XHRhY3Rpb24gICAgICA6IFdQQkNfVXNlckRhdGFTYXZlci5hY3Rpb24sXHJcblx0XHRcdHVzZXJfaWQgICAgIDogdXNlcl9pZCxcclxuXHRcdFx0bm9uY2UgICAgICAgOiBub25jZSxcclxuXHRcdFx0bm9uY2VfYWN0aW9uOiBub25jZV9hY3Rpb24sXHJcblx0XHRcdGRhdGFfbmFtZSAgIDogZGF0YV9uYW1lLFxyXG5cdFx0XHRkYXRhX3ZhbHVlICA6IHNlcmlhbGl6ZWRcclxuXHRcdH0sXHJcblx0XHRzdWNjZXNzOiBmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuXHJcblx0XHRcdGpRdWVyeSggZG9jdW1lbnQgKS50cmlnZ2VyKCAnd3BiYzp1c2VyZGF0YTphZnRlclNhdmUnLCBbIHJlc3BvbnNlIF0gKTtcclxuXHJcblx0XHRcdGlmICggcmVzcG9uc2Uuc3VjY2VzcyApIHtcclxuXHRcdFx0XHQvLyBjb25zb2xlLmxvZyggJ1dQQkMgfCAnICsgKHJlc3BvbnNlLmRhdGEubWVzc2FnZSB8fCAnU2F2ZWQgc3VjY2Vzc2Z1bGx5LicpICk7XHJcblx0XHRcdFx0aWYgKCBjYWxsYmFja0ZuICkge1xyXG5cdFx0XHRcdFx0Y2FsbGJhY2tGbiggcmVzcG9uc2UgKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1dQQkMgfCAnICsgKCByZXNwb25zZS5kYXRhLm1lc3NhZ2UgfHwgJ1NhdmUgZXJyb3IuJyApICk7XHJcblx0XHRcdH1cclxuXHRcdH0sXHJcblx0XHRlcnJvciAgOiBmdW5jdGlvbiAoIHhociApIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1dQQkMgfCBBSkFYIGVycm9yOiAnICsgeGhyLnN0YXR1cyArICcgJyArIHhoci5zdGF0dXNUZXh0ICk7XHJcblx0XHR9XHJcblx0fSApO1xyXG59XHJcblxyXG4vKipcclxuICogTm90ZTpcclxuIC8vIFRoaXMgYmluZHMgYSBoYW5kbGVyICp0byBldmVudCAnY2xpY2snKiwgbGFiZWxlZCAnbXlGZWF0dXJlJ1xyXG4kKGRvY3VtZW50KS5vbignY2xpY2subXlGZWF0dXJlJywgZnVuY3Rpb24gKCkgeyAuLi4gfSk7XHJcblxyXG4vLyBUaGlzIGJpbmRzIGFub3RoZXIgKnRvICdjbGljaycqLCBsYWJlbGVkICdkZWJ1ZydcclxuJChkb2N1bWVudCkub24oJ2NsaWNrLmRlYnVnJywgZnVuY3Rpb24gKCkgeyAuLi4gfSk7XHJcblxyXG4vLyBUaGlzIGZpcmVzIHRoZSBldmVudCAnY2xpY2snIOKAlCBib3RoIHdpbGwgcnVuOlxyXG4kKGRvY3VtZW50KS50cmlnZ2VyKCdjbGljaycpO1xyXG5cclxuLy8gVGhpcyByZW1vdmVzIG9ubHkgaGFuZGxlcnMgd2l0aCAubXlGZWF0dXJlXHJcbiQoZG9jdW1lbnQpLm9mZignY2xpY2subXlGZWF0dXJlJyk7XHJcbiAqL1xyXG5cclxuXHJcbi8vIGpRdWVyeSggZG9jdW1lbnQgKS5vbiggJ3dwYmM6dXNlcmRhdGE6YmVmb3JlU2F2ZS5jdXN0b21Mb2dnZXInLCBmdW5jdGlvbiAoZSwgJGVsLCBkYXRhKSB7XHJcbi8vIFx0Ly8gJGVsLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7ICAvLyBFeGFtcGxlOiBkaXNhYmxlIHRoZSBjbGlja2VkIGVsZW1lbnRcclxuLy8gfSApO1xyXG5cclxuLy8galF1ZXJ5KCBkb2N1bWVudCApLm9uKCAnd3BiYzp1c2VyZGF0YTphZnRlclNhdmUuY3VzdG9tTG9nZ2VyJywgZnVuY3Rpb24gKGUsIHJlc3BvbnNlKSB7XHJcbi8vXHJcbi8vIFx0Y29uc29sZS5sb2coICdTYXZlIGZpbmlzaGVkLiBTZXJ2ZXIgcmVzcG9uZGVkIHdpdGg6JywgcmVzcG9uc2UgKTtcclxuLy9cclxuLy8gXHRpZiAoIHJlc3BvbnNlLnN1Y2Nlc3MgKSB7XHJcbi8vIFx0XHRjb25zb2xlLmxvZyggJ1NhdmVkIScgKTtcclxuLy8gXHR9IGVsc2Uge1xyXG4vLyBcdFx0Y29uc29sZS5sb2coICdFcnJvcjogJyArICggcmVzcG9uc2UuZGF0YT8ubWVzc2FnZSB8fCAnVW5rbm93biBlcnJvcicgKSApO1xyXG4vLyBcdH1cclxuLy9cclxuLy8gXHQvLyBPcHRpb25hbDogcmUtZW5hYmxlIGFsbCBzYXZlIGJ1dHRvbnNcclxuLy8gXHQvLyBqUXVlcnkoJ1tkYXRhLXdwYmMtdS1zYXZlLW5hbWVdJykucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7XHJcbi8vIH0gKTtcclxuXHJcbi8vIFRvIHJlbW92ZSBpdDpcclxuLy8galF1ZXJ5KGRvY3VtZW50KS5vZmYoJ3dwYmM6dXNlcmRhdGE6YWZ0ZXJTYXZlLmN1c3RvbUxvZ2dlcicpO1xyXG4iXSwibWFwcGluZ3MiOiI7O0FBQUEsU0FBU0EsdUNBQXVDQSxDQUFFQyxHQUFHLEVBQUVDLFNBQVMsRUFBRUMsU0FBUyxFQUFHO0VBQzdFLElBQUlDLFVBQVUsR0FBR0gsR0FBRyxDQUFDSSxJQUFJLENBQUVILFNBQVUsQ0FBQztFQUV0QyxJQUFLRSxVQUFVLEtBQUtFLFNBQVMsRUFBRztJQUMvQixPQUFPRixVQUFVO0VBQ2xCO0VBRUEsT0FBT0gsR0FB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 |
| 129 |
|