| 1 |
"use strict"; |
| 2 |
|
| 3 |
/** |
| 4 |
* Browser adapter for Setup Wizard Booking Resource creation and editing. |
| 5 |
* |
| 6 |
* The adapter keeps existing updates separate from new drafts. It sends only |
| 7 |
* changed existing Resources, and the server remains authoritative for stale |
| 8 |
* detection, authorization, edition rules, and persistence. |
| 9 |
* |
| 10 |
* @package Booking Calendar |
| 11 |
*/ |
| 12 |
(function ($, window, document) { |
| 13 |
'use strict'; |
| 14 |
|
| 15 |
var module_config = window.wpbc_setup_wizard_booking_resources || { |
| 16 |
i18n: {} |
| 17 |
}; |
| 18 |
|
| 19 |
/** |
| 20 |
* Create one isolated Resource editor adapter. |
| 21 |
* |
| 22 |
* @param {Object} config Translated presentation strings. |
| 23 |
* @return {Object} Setup Wizard step adapter. |
| 24 |
*/ |
| 25 |
function create_booking_resources_adapter(config) { |
| 26 |
var shell_api = null; |
| 27 |
var root = null; |
| 28 |
var editor = null; |
| 29 |
var editable_fields = ['title', 'description', 'picture_url', 'base_cost']; |
| 30 |
|
| 31 |
/** |
| 32 |
* Return a translated string or fallback. |
| 33 |
* |
| 34 |
* @param {string} key Translation key. |
| 35 |
* @param {string} fallback Fallback text. |
| 36 |
* @return {string} Localized text. |
| 37 |
*/ |
| 38 |
function get_message(key, fallback) { |
| 39 |
return config.i18n && config.i18n[key] ? config.i18n[key] : fallback; |
| 40 |
} |
| 41 |
|
| 42 |
/** |
| 43 |
* Replace one `%s` token without interpreting replacement tokens. |
| 44 |
* |
| 45 |
* @param {string} message Message template. |
| 46 |
* @param {string} replacement Plain-text replacement. |
| 47 |
* @return {string} Formatted message. |
| 48 |
*/ |
| 49 |
function format_message(message, replacement) { |
| 50 |
return String(message).replace('%s', function () { |
| 51 |
return String(replacement); |
| 52 |
}); |
| 53 |
} |
| 54 |
|
| 55 |
/** |
| 56 |
* Return a detached JSON-safe copy. |
| 57 |
* |
| 58 |
* @param {Object} source Source object. |
| 59 |
* @return {Object} Detached copy. |
| 60 |
*/ |
| 61 |
function clone_resource(source) { |
| 62 |
return JSON.parse(JSON.stringify(source || {})); |
| 63 |
} |
| 64 |
|
| 65 |
/** |
| 66 |
* Create one unsaved Resource proposal. |
| 67 |
* |
| 68 |
* @return {Object} JSON-safe draft. |
| 69 |
*/ |
| 70 |
function create_resource_draft() { |
| 71 |
return { |
| 72 |
draft_id: 'draft-' + Date.now() + '-' + Math.floor(Math.random() * 100000), |
| 73 |
title: get_message('new_resource', 'New Booking Resource'), |
| 74 |
description: '', |
| 75 |
picture_url: '', |
| 76 |
base_cost: '0.00' |
| 77 |
}; |
| 78 |
} |
| 79 |
|
| 80 |
/** |
| 81 |
* Return one details control by stable field name. |
| 82 |
* |
| 83 |
* @param {string} field_name Resource DTO field. |
| 84 |
* @return {HTMLElement|null} Matching control. |
| 85 |
*/ |
| 86 |
function get_resource_field(field_name) { |
| 87 |
return editor ? editor.node.querySelector('[data-wpbc-resource-field="' + field_name + '"]') : null; |
| 88 |
} |
| 89 |
|
| 90 |
/** |
| 91 |
* Return the selected new or existing Resource. |
| 92 |
* |
| 93 |
* @return {Object|null} Selected Resource or null. |
| 94 |
*/ |
| 95 |
function get_selected_resource() { |
| 96 |
if (!editor || null === editor.selected_index) { |
| 97 |
return null; |
| 98 |
} |
| 99 |
if ('existing' === editor.selected_type) { |
| 100 |
return editor.existing_resources[editor.selected_index] || null; |
| 101 |
} |
| 102 |
return editor.new_resources[editor.selected_index] || null; |
| 103 |
} |
| 104 |
|
| 105 |
/** |
| 106 |
* Test whether editable values differ from authorized source values. |
| 107 |
* |
| 108 |
* @param {Object} resource Current browser Resource. |
| 109 |
* @param {Object} baseline Authorized source Resource. |
| 110 |
* @return {boolean} True when at least one editable field changed. |
| 111 |
*/ |
| 112 |
function resource_is_dirty(resource, baseline) { |
| 113 |
return editable_fields.some(function (field_name) { |
| 114 |
return String(resource[field_name] || '') !== String(baseline[field_name] || ''); |
| 115 |
}); |
| 116 |
} |
| 117 |
|
| 118 |
/** |
| 119 |
* Build data-only update records for changed existing Resources. |
| 120 |
* |
| 121 |
* @return {Array} Existing Resource update payload. |
| 122 |
*/ |
| 123 |
function get_existing_updates() { |
| 124 |
return editor.existing_resources.reduce(function (updates, resource, resource_index) { |
| 125 |
var baseline = editor.existing_baselines[resource_index]; |
| 126 |
var update; |
| 127 |
if (!baseline || !resource_is_dirty(resource, baseline)) { |
| 128 |
return updates; |
| 129 |
} |
| 130 |
update = { |
| 131 |
resource_id: Number(resource.resource_id || resource.id || 0), |
| 132 |
source_fingerprint: String(baseline.source_fingerprint || '') |
| 133 |
}; |
| 134 |
editable_fields.forEach(function (field_name) { |
| 135 |
update[field_name] = String(resource[field_name] || ''); |
| 136 |
}); |
| 137 |
updates.push(update); |
| 138 |
return updates; |
| 139 |
}, []); |
| 140 |
} |
| 141 |
|
| 142 |
/** |
| 143 |
* Write new drafts and changed existing Resources to separate transports. |
| 144 |
* |
| 145 |
* @return {void} |
| 146 |
*/ |
| 147 |
function sync_transport() { |
| 148 |
if (!editor) { |
| 149 |
return; |
| 150 |
} |
| 151 |
editor.new_transport.value = JSON.stringify(editor.new_resources); |
| 152 |
editor.update_transport.value = JSON.stringify(get_existing_updates()); |
| 153 |
} |
| 154 |
|
| 155 |
/** |
| 156 |
* Persist visible detail controls into the selected Resource. |
| 157 |
* |
| 158 |
* @return {void} |
| 159 |
*/ |
| 160 |
function sync_selected_resource() { |
| 161 |
var resource = get_selected_resource(); |
| 162 |
if (!resource) { |
| 163 |
sync_transport(); |
| 164 |
return; |
| 165 |
} |
| 166 |
editable_fields.forEach(function (field_name) { |
| 167 |
var field = get_resource_field(field_name); |
| 168 |
if (field && !field.disabled) { |
| 169 |
resource[field_name] = field.value; |
| 170 |
} |
| 171 |
}); |
| 172 |
sync_transport(); |
| 173 |
} |
| 174 |
|
| 175 |
/** |
| 176 |
* Update the selected Resource summary and picture preview. |
| 177 |
* |
| 178 |
* @return {void} |
| 179 |
*/ |
| 180 |
function render_details() { |
| 181 |
var resource = get_selected_resource(); |
| 182 |
var fields = editor && editor.node.querySelector('[data-wpbc-resource-fields]'); |
| 183 |
var empty = editor && editor.node.querySelector('[data-wpbc-resource-empty]'); |
| 184 |
var title_control = get_resource_field('title'); |
| 185 |
var picture_url; |
| 186 |
var image; |
| 187 |
var placeholder; |
| 188 |
var remove_picture; |
| 189 |
if (fields) { |
| 190 |
fields.hidden = !resource; |
| 191 |
} |
| 192 |
if (empty) { |
| 193 |
empty.hidden = Boolean(resource); |
| 194 |
} |
| 195 |
if (!resource) { |
| 196 |
return; |
| 197 |
} |
| 198 |
if (title_control) { |
| 199 |
title_control.setAttribute('data-wpbc-setup-wizard-error-control-for', 'existing' === editor.selected_type ? 'existing_booking_resources' : 'booking_resources'); |
| 200 |
} |
| 201 |
editable_fields.forEach(function (field_name) { |
| 202 |
var field = get_resource_field(field_name); |
| 203 |
if (field) { |
| 204 |
field.value = undefined !== resource[field_name] ? resource[field_name] : ''; |
| 205 |
} |
| 206 |
}); |
| 207 |
picture_url = String(resource.picture_url || '').trim(); |
| 208 |
image = editor.node.querySelector('[data-wpbc-resource-picture-image]'); |
| 209 |
placeholder = editor.node.querySelector('[data-wpbc-resource-picture-placeholder]'); |
| 210 |
remove_picture = editor.node.querySelector('[data-wpbc-remove-resource-picture]'); |
| 211 |
if (image) { |
| 212 |
image.hidden = !picture_url; |
| 213 |
if (picture_url) { |
| 214 |
image.src = picture_url; |
| 215 |
} else { |
| 216 |
image.removeAttribute('src'); |
| 217 |
} |
| 218 |
} |
| 219 |
if (placeholder) { |
| 220 |
placeholder.hidden = Boolean(picture_url); |
| 221 |
} |
| 222 |
if (remove_picture) { |
| 223 |
remove_picture.disabled = !editor.media_upload_available || !picture_url; |
| 224 |
} |
| 225 |
} |
| 226 |
|
| 227 |
/** |
| 228 |
* Expose the existing Resource dirty state through its server-rendered badge. |
| 229 |
* |
| 230 |
* @param {HTMLElement} card Existing Resource card. |
| 231 |
* @param {number} resource_index Resource index in the authorized list. |
| 232 |
* @return {void} |
| 233 |
*/ |
| 234 |
function render_existing_card_status(card, resource_index) { |
| 235 |
var status_badge = card.querySelector('[data-wpbc-resource-status]'); |
| 236 |
var resource = editor.existing_resources[resource_index]; |
| 237 |
var baseline = editor.existing_baselines[resource_index]; |
| 238 |
var is_changed = Boolean(resource && baseline && resource_is_dirty(resource, baseline)); |
| 239 |
if (status_badge) { |
| 240 |
status_badge.textContent = is_changed ? status_badge.dataset.changedLabel : status_badge.dataset.existingLabel; |
| 241 |
status_badge.classList.toggle('is-existing', !is_changed); |
| 242 |
status_badge.classList.toggle('is-changed', is_changed); |
| 243 |
} |
| 244 |
} |
| 245 |
|
| 246 |
/** |
| 247 |
* Update the server-rendered existing Resource cards. |
| 248 |
* |
| 249 |
* @return {void} |
| 250 |
*/ |
| 251 |
function render_existing_cards() { |
| 252 |
editor.existing_cards.forEach(function (card, resource_index) { |
| 253 |
var resource = editor.existing_resources[resource_index]; |
| 254 |
var selection = card.querySelector('input[type="radio"]'); |
| 255 |
var image = card.querySelector('img'); |
| 256 |
var placeholder = card.querySelector('.wpbc-bi-image-fill'); |
| 257 |
if (!resource) { |
| 258 |
return; |
| 259 |
} |
| 260 |
card.classList.toggle('is-selected', 'existing' === editor.selected_type && resource_index === editor.selected_index); |
| 261 |
selection.checked = 'existing' === editor.selected_type && resource_index === editor.selected_index; |
| 262 |
card.querySelector('strong').textContent = resource.title || get_message('new_resource', 'New Booking Resource'); |
| 263 |
render_existing_card_status(card, resource_index); |
| 264 |
if (resource.picture_url) { |
| 265 |
image.src = resource.picture_url; |
| 266 |
image.hidden = false; |
| 267 |
placeholder.hidden = true; |
| 268 |
} else { |
| 269 |
image.removeAttribute('src'); |
| 270 |
image.hidden = true; |
| 271 |
placeholder.hidden = false; |
| 272 |
} |
| 273 |
}); |
| 274 |
} |
| 275 |
|
| 276 |
/** |
| 277 |
* Render new proposal cards and refresh existing card state. |
| 278 |
* |
| 279 |
* @return {void} |
| 280 |
*/ |
| 281 |
function render_cards() { |
| 282 |
var fragment; |
| 283 |
if (!editor || !editor.new_list || !editor.template) { |
| 284 |
return; |
| 285 |
} |
| 286 |
editor.new_list.innerHTML = ''; |
| 287 |
fragment = document.createDocumentFragment(); |
| 288 |
editor.new_resources.forEach(function (resource, resource_index) { |
| 289 |
var card = editor.template.content.firstElementChild.cloneNode(true); |
| 290 |
var selection = card.querySelector('input[type="radio"]'); |
| 291 |
var image = card.querySelector('img'); |
| 292 |
var placeholder = card.querySelector('.wpbc-bi-image-fill'); |
| 293 |
var remove_button = card.querySelector('[data-wpbc-remove-resource]'); |
| 294 |
card.classList.toggle('is-selected', 'new' === editor.selected_type && resource_index === editor.selected_index); |
| 295 |
selection.checked = 'new' === editor.selected_type && resource_index === editor.selected_index; |
| 296 |
selection.dataset.wpbcResourceSelection = 'new:' + String(resource_index); |
| 297 |
card.querySelector('strong').textContent = resource.title || get_message('new_resource', 'New Booking Resource'); |
| 298 |
if (resource.picture_url) { |
| 299 |
image.src = resource.picture_url; |
| 300 |
image.hidden = false; |
| 301 |
placeholder.hidden = true; |
| 302 |
} |
| 303 |
remove_button.dataset.wpbcRemoveResource = String(resource_index); |
| 304 |
remove_button.setAttribute('aria-label', format_message(get_message('remove_resource', 'Remove %s'), resource.title || get_message('new_resource', 'New Booking Resource'))); |
| 305 |
fragment.appendChild(card); |
| 306 |
}); |
| 307 |
editor.new_list.appendChild(fragment); |
| 308 |
render_existing_cards(); |
| 309 |
sync_transport(); |
| 310 |
render_details(); |
| 311 |
} |
| 312 |
|
| 313 |
/** |
| 314 |
* Select a Resource from a stable `type:index` browser value. |
| 315 |
* |
| 316 |
* @param {string} selection_value Browser selection value. |
| 317 |
* @return {void} |
| 318 |
*/ |
| 319 |
function select_resource(selection_value) { |
| 320 |
var selection_parts = String(selection_value || '').split(':'); |
| 321 |
var selected_type = selection_parts[0]; |
| 322 |
var selected_index = parseInt(selection_parts[1], 10); |
| 323 |
var selected_card; |
| 324 |
var selected_control; |
| 325 |
if (['new', 'existing'].indexOf(selected_type) < 0 || isNaN(selected_index)) { |
| 326 |
return; |
| 327 |
} |
| 328 |
selected_card = 'existing' === selected_type ? editor.existing_cards[selected_index] : editor.new_list.querySelector('[data-wpbc-resource-selection="new:' + String(selected_index) + '"]'); |
| 329 |
if (!selected_card) { |
| 330 |
return; |
| 331 |
} |
| 332 |
sync_selected_resource(); |
| 333 |
editor.selected_type = selected_type; |
| 334 |
editor.selected_index = selected_index; |
| 335 |
render_cards(); |
| 336 |
selected_control = 'existing' === selected_type ? selected_card.querySelector('input[type="radio"]') : editor.new_list.querySelector('[data-wpbc-resource-selection="new:' + String(selected_index) + '"]'); |
| 337 |
if (selected_control) { |
| 338 |
try { |
| 339 |
selected_control.focus({ |
| 340 |
preventScroll: true |
| 341 |
}); |
| 342 |
} catch (focus_error) { |
| 343 |
selected_control.focus(); |
| 344 |
} |
| 345 |
} |
| 346 |
} |
| 347 |
|
| 348 |
/** |
| 349 |
* Handle delegated editor button actions. |
| 350 |
* |
| 351 |
* @param {MouseEvent} event Click event. |
| 352 |
* @return {void} |
| 353 |
*/ |
| 354 |
function handle_click(event) { |
| 355 |
var remove_button = event.target.closest('[data-wpbc-remove-resource]'); |
| 356 |
var remove_index; |
| 357 |
var focus_target; |
| 358 |
if (event.target.closest('[data-wpbc-add-resource]')) { |
| 359 |
if (!editor.can_create || editor.new_resources.length >= editor.max_resources) { |
| 360 |
shell_api.set_field_error('booking_resources', get_message('resource_limit', 'The Booking Resource limit for this account has been reached.')); |
| 361 |
return; |
| 362 |
} |
| 363 |
sync_selected_resource(); |
| 364 |
editor.new_resources.push(create_resource_draft()); |
| 365 |
editor.selected_type = 'new'; |
| 366 |
editor.selected_index = editor.new_resources.length - 1; |
| 367 |
render_cards(); |
| 368 |
shell_api.clear_field_error('booking_resources'); |
| 369 |
get_resource_field('title').focus(); |
| 370 |
return; |
| 371 |
} |
| 372 |
if (remove_button) { |
| 373 |
remove_index = parseInt(remove_button.dataset.wpbcRemoveResource, 10); |
| 374 |
if (!isNaN(remove_index) && editor.new_resources[remove_index]) { |
| 375 |
editor.new_resources.splice(remove_index, 1); |
| 376 |
if (editor.new_resources.length) { |
| 377 |
editor.selected_type = 'new'; |
| 378 |
editor.selected_index = Math.max(0, Math.min(editor.selected_index, editor.new_resources.length - 1)); |
| 379 |
} else if (editor.existing_resources.length) { |
| 380 |
editor.selected_type = 'existing'; |
| 381 |
editor.selected_index = 0; |
| 382 |
} else { |
| 383 |
editor.selected_type = null; |
| 384 |
editor.selected_index = null; |
| 385 |
} |
| 386 |
render_cards(); |
| 387 |
shell_api.set_status(get_message('resource_removed', 'Unsaved Booking Resource removed from this setup.')); |
| 388 |
focus_target = editor.new_list.querySelector('input[type="radio"]') || (editor.existing_list ? editor.existing_list.querySelector('input[type="radio"]') : null) || editor.node.querySelector('[data-wpbc-add-resource]'); |
| 389 |
if (focus_target) { |
| 390 |
focus_target.focus(); |
| 391 |
} |
| 392 |
} |
| 393 |
return; |
| 394 |
} |
| 395 |
if (event.target.closest('[data-wpbc-remove-resource-picture]') && editor.media_upload_available) { |
| 396 |
var picture_field = get_resource_field('picture_url'); |
| 397 |
if (picture_field) { |
| 398 |
picture_field.value = ''; |
| 399 |
sync_selected_resource(); |
| 400 |
render_cards(); |
| 401 |
} |
| 402 |
} |
| 403 |
} |
| 404 |
|
| 405 |
/** |
| 406 |
* Handle selection and committed field changes. |
| 407 |
* |
| 408 |
* @param {Event} event Change event. |
| 409 |
* @return {void} |
| 410 |
*/ |
| 411 |
function handle_change(event) { |
| 412 |
if (event.target.matches('[data-wpbc-resource-selection]')) { |
| 413 |
select_resource(event.target.dataset.wpbcResourceSelection); |
| 414 |
return; |
| 415 |
} |
| 416 |
if (event.target.matches('[data-wpbc-resource-field]')) { |
| 417 |
sync_selected_resource(); |
| 418 |
render_cards(); |
| 419 |
shell_api.clear_field_error('booking_resources'); |
| 420 |
shell_api.clear_field_error('existing_booking_resources'); |
| 421 |
} |
| 422 |
} |
| 423 |
|
| 424 |
/** |
| 425 |
* Handle live text editing without reconstructing the active controls. |
| 426 |
* |
| 427 |
* @param {InputEvent} event Input event. |
| 428 |
* @return {void} |
| 429 |
*/ |
| 430 |
function handle_input(event) { |
| 431 |
var resource; |
| 432 |
var card; |
| 433 |
if (!event.target.matches('[data-wpbc-resource-field]')) { |
| 434 |
return; |
| 435 |
} |
| 436 |
sync_selected_resource(); |
| 437 |
resource = get_selected_resource(); |
| 438 |
card = 'existing' === editor.selected_type ? editor.existing_cards[editor.selected_index] : editor.new_list.children[editor.selected_index]; |
| 439 |
if (card && resource) { |
| 440 |
card.querySelector('strong').textContent = resource.title || get_message('new_resource', 'New Booking Resource'); |
| 441 |
if ('existing' === editor.selected_type) { |
| 442 |
render_existing_card_status(card, editor.selected_index); |
| 443 |
} |
| 444 |
} |
| 445 |
shell_api.clear_field_error('booking_resources'); |
| 446 |
shell_api.clear_field_error('existing_booking_resources'); |
| 447 |
} |
| 448 |
|
| 449 |
/** |
| 450 |
* Refresh after the shared WordPress media picker sets the URL field. |
| 451 |
* |
| 452 |
* @return {void} |
| 453 |
*/ |
| 454 |
function handle_media_url_set() { |
| 455 |
sync_selected_resource(); |
| 456 |
render_cards(); |
| 457 |
} |
| 458 |
|
| 459 |
/** |
| 460 |
* Parse one JSON array transport without trusting its shape. |
| 461 |
* |
| 462 |
* @param {string} encoded_value JSON value. |
| 463 |
* @return {Array} Decoded array or an empty array. |
| 464 |
*/ |
| 465 |
function parse_array(encoded_value) { |
| 466 |
var parsed_value; |
| 467 |
try { |
| 468 |
parsed_value = JSON.parse(encoded_value || '[]'); |
| 469 |
} catch (parse_error) { |
| 470 |
parsed_value = []; |
| 471 |
} |
| 472 |
return Array.isArray(parsed_value) ? parsed_value : []; |
| 473 |
} |
| 474 |
|
| 475 |
/** |
| 476 |
* Initialize this step from the shell and data-only transports. |
| 477 |
* |
| 478 |
* @param {Object} registered_shell_api Shared wizard services. |
| 479 |
* @return {void} |
| 480 |
*/ |
| 481 |
function initialize(registered_shell_api) { |
| 482 |
var editor_node; |
| 483 |
var new_transport; |
| 484 |
var update_transport; |
| 485 |
var existing_source; |
| 486 |
var existing_resources; |
| 487 |
shell_api = registered_shell_api; |
| 488 |
root = shell_api.root; |
| 489 |
editor_node = root.querySelector('[data-wpbc-booking-resources-editor]'); |
| 490 |
new_transport = root.querySelector('[data-wpbc-booking-resource-drafts]'); |
| 491 |
update_transport = root.querySelector('[data-wpbc-existing-resource-updates]'); |
| 492 |
existing_source = root.querySelector('[data-wpbc-existing-resource-source]'); |
| 493 |
if (!editor_node || !new_transport || !update_transport || !existing_source) { |
| 494 |
return; |
| 495 |
} |
| 496 |
existing_resources = parse_array(existing_source.value); |
| 497 |
editor = { |
| 498 |
node: editor_node, |
| 499 |
new_transport: new_transport, |
| 500 |
update_transport: update_transport, |
| 501 |
new_list: editor_node.querySelector('[data-wpbc-new-resource-list]'), |
| 502 |
existing_list: editor_node.querySelector('[data-wpbc-existing-resource-list]'), |
| 503 |
existing_cards: Array.prototype.slice.call(editor_node.querySelectorAll('[data-wpbc-existing-resource-card]')), |
| 504 |
template: root.querySelector('[data-wpbc-resource-card-template]'), |
| 505 |
new_resources: parse_array(new_transport.value), |
| 506 |
existing_resources: existing_resources.map(clone_resource), |
| 507 |
existing_baselines: existing_resources.map(clone_resource), |
| 508 |
selected_type: null, |
| 509 |
selected_index: null, |
| 510 |
can_create: 'true' === editor_node.dataset.canCreate, |
| 511 |
pricing_available: 'true' === editor_node.dataset.pricingAvailable, |
| 512 |
media_upload_available: 'true' === editor_node.dataset.mediaUploadAvailable, |
| 513 |
max_resources: parseInt(new_transport.dataset.maxResourceDrafts || '0', 10) |
| 514 |
}; |
| 515 |
if (editor.new_resources.length) { |
| 516 |
editor.selected_type = 'new'; |
| 517 |
editor.selected_index = 0; |
| 518 |
} else if (editor.existing_resources.length) { |
| 519 |
editor.selected_type = 'existing'; |
| 520 |
editor.selected_index = 0; |
| 521 |
} |
| 522 |
editor.node.addEventListener('click', handle_click); |
| 523 |
editor.node.addEventListener('change', handle_change); |
| 524 |
editor.node.addEventListener('input', handle_input); |
| 525 |
$(document).off('wpbc_media_upload_url_set.wpbcSetupWizardResources', '#wpbc-setup-wizard-resource-picture-url').on('wpbc_media_upload_url_set.wpbcSetupWizardResources', '#wpbc-setup-wizard-resource-picture-url', handle_media_url_set); |
| 526 |
render_cards(); |
| 527 |
} |
| 528 |
|
| 529 |
/** |
| 530 |
* Validate new drafts and changed existing Resources before navigation. |
| 531 |
* |
| 532 |
* @return {HTMLElement|null} First invalid control or null. |
| 533 |
*/ |
| 534 |
function validate() { |
| 535 |
var first_invalid = null; |
| 536 |
sync_selected_resource(); |
| 537 |
[{ |
| 538 |
type: 'new', |
| 539 |
resources: editor.new_resources, |
| 540 |
field_id: 'booking_resources' |
| 541 |
}, { |
| 542 |
type: 'existing', |
| 543 |
resources: editor.existing_resources, |
| 544 |
field_id: 'existing_booking_resources' |
| 545 |
}].some(function (collection) { |
| 546 |
return collection.resources.some(function (resource, resource_index) { |
| 547 |
var baseline = 'existing' === collection.type ? editor.existing_baselines[resource_index] : null; |
| 548 |
var price = Number(resource.base_cost); |
| 549 |
var title_missing = !String(resource.title || '').trim(); |
| 550 |
if (baseline && !resource_is_dirty(resource, baseline)) { |
| 551 |
return false; |
| 552 |
} |
| 553 |
if (!title_missing && (!editor.pricing_available || isFinite(price) && price >= 0)) { |
| 554 |
return false; |
| 555 |
} |
| 556 |
editor.selected_type = collection.type; |
| 557 |
editor.selected_index = resource_index; |
| 558 |
render_cards(); |
| 559 |
first_invalid = get_resource_field(title_missing ? 'title' : 'base_cost'); |
| 560 |
shell_api.set_field_error(collection.field_id, title_missing ? get_message('resource_title_required', 'Enter a name for every Booking Resource.') : get_message('resource_price_invalid', 'Enter a valid non-negative base cost.')); |
| 561 |
return true; |
| 562 |
}); |
| 563 |
}); |
| 564 |
return first_invalid; |
| 565 |
} |
| 566 |
return { |
| 567 |
initialize: initialize, |
| 568 |
sync: sync_selected_resource, |
| 569 |
validate: validate |
| 570 |
}; |
| 571 |
} |
| 572 |
window.wpbc_setup_editor_modules = window.wpbc_setup_editor_modules || {}; |
| 573 |
window.wpbc_setup_editor_modules.booking_resources = { |
| 574 |
create: create_booking_resources_adapter |
| 575 |
}; |
| 576 |
if (window.wpbc_setup_wizard_api && 'function' === typeof window.wpbc_setup_wizard_api.register_step_adapter) { |
| 577 |
window.wpbc_setup_wizard_api.register_step_adapter(create_booking_resources_adapter(module_config)); |
| 578 |
} |
| 579 |
})(jQuery, window, document); |
| 580 |
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5jbHVkZXMvcGFnZS1zZXR1cC13aXphcmQvc3RlcC1ib29raW5nLXJlc291cmNlcy9fb3V0L3N0ZXAtYm9va2luZy1yZXNvdXJjZXMuanMiLCJuYW1lcyI6WyIkIiwid2luZG93IiwiZG9jdW1lbnQiLCJtb2R1bGVfY29uZmlnIiwid3BiY19zZXR1cF93aXphcmRfYm9va2luZ19yZXNvdXJjZXMiLCJpMThuIiwiY3JlYXRlX2Jvb2tpbmdfcmVzb3VyY2VzX2FkYXB0ZXIiLCJjb25maWciLCJzaGVsbF9hcGkiLCJyb290IiwiZWRpdG9yIiwiZWRpdGFibGVfZmllbGRzIiwiZ2V0X21lc3NhZ2UiLCJrZXkiLCJmYWxsYmFjayIsImZvcm1hdF9tZXNzYWdlIiwibWVzc2FnZSIsInJlcGxhY2VtZW50IiwiU3RyaW5nIiwicmVwbGFjZSIsImNsb25lX3Jlc291cmNlIiwic291cmNlIiwiSlNPTiIsInBhcnNlIiwic3RyaW5naWZ5IiwiY3JlYXRlX3Jlc291cmNlX2RyYWZ0IiwiZHJhZnRfaWQiLCJEYXRlIiwibm93IiwiTWF0aCIsImZsb29yIiwicmFuZG9tIiwidGl0bGUiLCJkZXNjcmlwdGlvbiIsInBpY3R1cmVfdXJsIiwiYmFzZV9jb3N0IiwiZ2V0X3Jlc291cmNlX2ZpZWxkIiwiZmllbGRfbmFtZSIsIm5vZGUiLCJxdWVyeVNlbGVjdG9yIiwiZ2V0X3NlbGVjdGVkX3Jlc291cmNlIiwic2VsZWN0ZWRfaW5kZXgiLCJzZWxlY3RlZF90eXBlIiwiZXhpc3RpbmdfcmVzb3VyY2VzIiwibmV3X3Jlc291cmNlcyIsInJlc291cmNlX2lzX2RpcnR5IiwicmVzb3VyY2UiLCJiYXNlbGluZSIsInNvbWUiLCJnZXRfZXhpc3RpbmdfdXBkYXRlcyIsInJlZHVjZSIsInVwZGF0ZXMiLCJyZXNvdXJjZV9pbmRleCIsImV4aXN0aW5nX2Jhc2VsaW5lcyIsInVwZGF0ZSIsInJlc291cmNlX2lkIiwiTnVtYmVyIiwiaWQiLCJzb3VyY2VfZmluZ2VycHJpbnQiLCJmb3JFYWNoIiwicHVzaCIsInN5bmNfdHJhbnNwb3J0IiwibmV3X3RyYW5zcG9ydCIsInZhbHVlIiwidXBkYXRlX3RyYW5zcG9ydCIsInN5bmNfc2VsZWN0ZWRfcmVzb3VyY2UiLCJmaWVsZCIsImRpc2FibGVkIiwicmVuZGVyX2RldGFpbHMiLCJmaWVsZHMiLCJlbXB0eSIsInRpdGxlX2NvbnRyb2wiLCJpbWFnZSIsInBsYWNlaG9sZGVyIiwicmVtb3ZlX3BpY3R1cmUiLCJoaWRkZW4iLCJCb29sZWFuIiwic2V0QXR0cmlidXRlIiwidW5kZWZpbmVkIiwidHJpbSIsInNyYyIsInJlbW92ZUF0dHJpYnV0ZSIsIm1lZGlhX3VwbG9hZF9hdmFpbGFibGUiLCJyZW5kZXJfZXhpc3RpbmdfY2FyZF9zdGF0dXMiLCJjYXJkIiwic3RhdHVzX2JhZGdlIiwiaXNfY2hhbmdlZCIsInRleHRDb250ZW50IiwiZGF0YXNldCIsImNoYW5nZWRMYWJlbCIsImV4aXN0aW5nTGFiZWwiLCJjbGFzc0xpc3QiLCJ0b2dnbGUiLCJyZW5kZXJfZXhpc3RpbmdfY2FyZHMiLCJleGlzdGluZ19jYXJkcyIsInNlbGVjdGlvbiIsImNoZWNrZWQiLCJyZW5kZXJfY2FyZHMiLCJmcmFnbWVudCIsIm5ld19saXN0IiwidGVtcGxhdGUiLCJpbm5lckhUTUwiLCJjcmVhdGVEb2N1bWVudEZyYWdtZW50IiwiY29udGVudCIsImZpcnN0RWxlbWVudENoaWxkIiwiY2xvbmVOb2RlIiwicmVtb3ZlX2J1dHRvbiIsIndwYmNSZXNvdXJjZVNlbGVjdGlvbiIsIndwYmNSZW1vdmVSZXNvdXJjZSIsImFwcGVuZENoaWxkIiwic2VsZWN0X3Jlc291cmNlIiwic2VsZWN0aW9uX3ZhbHVlIiwic2VsZWN0aW9uX3BhcnRzIiwic3BsaXQiLCJwYXJzZUludCIsInNlbGVjdGVkX2NhcmQiLCJzZWxlY3RlZF9jb250cm9sIiwiaW5kZXhPZiIsImlzTmFOIiwiZm9jdXMiLCJwcmV2ZW50U2Nyb2xsIiwiZm9jdXNfZXJyb3IiLCJoYW5kbGVfY2xpY2siLCJldmVudCIsInRhcmdldCIsImNsb3Nlc3QiLCJyZW1vdmVfaW5kZXgiLCJmb2N1c190YXJnZXQiLCJjYW5fY3JlYXRlIiwibGVuZ3RoIiwibWF4X3Jlc291cmNlcyIsInNldF9maWVsZF9lcnJvciIsImNsZWFyX2ZpZWxkX2Vycm9yIiwic3BsaWNlIiwibWF4IiwibWluIiwic2V0X3N0YXR1cyIsImV4aXN0aW5nX2xpc3QiLCJwaWN0dXJlX2ZpZWxkIiwiaGFuZGxlX2NoYW5nZSIsIm1hdGNoZXMiLCJoYW5kbGVfaW5wdXQiLCJjaGlsZHJlbiIsImhhbmRsZV9tZWRpYV91cmxfc2V0IiwicGFyc2VfYXJyYXkiLCJlbmNvZGVkX3ZhbHVlIiwicGFyc2VkX3ZhbHVlIiwicGFyc2VfZXJyb3IiLCJBcnJheSIsImlzQXJyYXkiLCJpbml0aWFsaXplIiwicmVnaXN0ZXJlZF9zaGVsbF9hcGkiLCJlZGl0b3Jfbm9kZSIsImV4aXN0aW5nX3NvdXJjZSIsInByb3RvdHlwZSIsInNsaWNlIiwiY2FsbCIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJtYXAiLCJjYW5DcmVhdGUiLCJwcmljaW5nX2F2YWlsYWJsZSIsInByaWNpbmdBdmFpbGFibGUiLCJtZWRpYVVwbG9hZEF2YWlsYWJsZSIsIm1heFJlc291cmNlRHJhZnRzIiwiYWRkRXZlbnRMaXN0ZW5lciIsIm9mZiIsIm9uIiwidmFsaWRhdGUiLCJmaXJzdF9pbnZhbGlkIiwidHlwZSIsInJlc291cmNlcyIsImZpZWxkX2lkIiwiY29sbGVjdGlvbiIsInByaWNlIiwidGl0bGVfbWlzc2luZyIsImlzRmluaXRlIiwic3luYyIsIndwYmNfc2V0dXBfZWRpdG9yX21vZHVsZXMiLCJib29raW5nX3Jlc291cmNlcyIsImNyZWF0ZSIsIndwYmNfc2V0dXBfd2l6YXJkX2FwaSIsInJlZ2lzdGVyX3N0ZXBfYWRhcHRlciIsImpRdWVyeSJdLCJzb3VyY2VzIjpbImluY2x1ZGVzL3BhZ2Utc2V0dXAtd2l6YXJkL3N0ZXAtYm9va2luZy1yZXNvdXJjZXMvX3NyYy9zdGVwLWJvb2tpbmctcmVzb3VyY2VzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQnJvd3NlciBhZGFwdGVyIGZvciBTZXR1cCBXaXphcmQgQm9va2luZyBSZXNvdXJjZSBjcmVhdGlvbiBhbmQgZWRpdGluZy5cbiAqXG4gKiBUaGUgYWRhcHRlciBrZWVwcyBleGlzdGluZyB1cGRhdGVzIHNlcGFyYXRlIGZyb20gbmV3IGRyYWZ0cy4gSXQgc2VuZHMgb25seVxuICogY2hhbmdlZCBleGlzdGluZyBSZXNvdXJjZXMsIGFuZCB0aGUgc2VydmVyIHJlbWFpbnMgYXV0aG9yaXRhdGl2ZSBmb3Igc3RhbGVcbiAqIGRldGVjdGlvbiwgYXV0aG9yaXphdGlvbiwgZWRpdGlvbiBydWxlcywgYW5kIHBlcnNpc3RlbmNlLlxuICpcbiAqIEBwYWNrYWdlIEJvb2tpbmcgQ2FsZW5kYXJcbiAqL1xuKCBmdW5jdGlvbiAoICQsIHdpbmRvdywgZG9jdW1lbnQgKSB7XG5cdCd1c2Ugc3RyaWN0JztcblxuXHR2YXIgbW9kdWxlX2NvbmZpZyA9IHdpbmRvdy53cGJjX3NldHVwX3dpemFyZF9ib29raW5nX3Jlc291cmNlcyB8fCB7IGkxOG46IHt9IH07XG5cblx0LyoqXG5cdCAqIENyZWF0ZSBvbmUgaXNvbGF0ZWQgUmVzb3VyY2UgZWRpdG9yIGFkYXB0ZXIuXG5cdCAqXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgVHJhbnNsYXRlZCBwcmVzZW50YXRpb24gc3RyaW5ncy5cblx0ICogQHJldHVybiB7T2JqZWN0fSBTZXR1cCBXaXphcmQgc3RlcCBhZGFwdGVyLlxuXHQgKi9cblx0ZnVuY3Rpb24gY3JlYXRlX2Jvb2tpbmdfcmVzb3VyY2VzX2FkYXB0ZXIoIGNvbmZpZyApIHtcblx0XHR2YXIgc2hlbGxfYXBpID0gbnVsbDtcblx0XHR2YXIgcm9vdCA9IG51bGw7XG5cdFx0dmFyIGVkaXRvciA9IG51bGw7XG5cdFx0dmFyIGVkaXRhYmxlX2ZpZWxkcyA9IFsgJ3RpdGxlJywgJ2Rlc2NyaXB0aW9uJywgJ3BpY3R1cmVfdXJsJywgJ2Jhc2VfY29zdCcgXTtcblxuXHRcdC8qKlxuXHRcdCAqIFJldHVybiBhIHRyYW5zbGF0ZWQgc3RyaW5nIG9yIGZhbGxiYWNrLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IGtleSAgICAgIFRyYW5zbGF0aW9uIGtleS5cblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gZmFsbGJhY2sgRmFsbGJhY2sgdGV4dC5cblx0XHQgKiBAcmV0dXJuIHtzdHJpbmd9IExvY2FsaXplZCB0ZXh0LlxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIGdldF9tZXNzYWdlKCBrZXksIGZhbGxiYWNrICkge1xuXHRcdFx0cmV0dXJuIGNvbmZpZy5pMThuICYmIGNvbmZpZy5pMThuWyBrZXkgXSA/IGNvbmZpZy5pMThuWyBrZXkgXSA6IGZhbGxiYWNrO1xuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIFJlcGxhY2Ugb25lIGAlc2AgdG9rZW4gd2l0aG91dCBpbnRlcnByZXRpbmcgcmVwbGFjZW1lbnQgdG9rZW5zLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgICAgIE1lc3NhZ2UgdGVtcGxhdGUuXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IHJlcGxhY2VtZW50IFBsYWluLXRleHQgcmVwbGFjZW1lbnQuXG5cdFx0ICogQHJldHVybiB7c3RyaW5nfSBGb3JtYXR0ZWQgbWVzc2FnZS5cblx0XHQgKi9cblx0XHRmdW5jdGlvbiBmb3JtYXRfbWVzc2FnZSggbWVzc2FnZSwgcmVwbGFjZW1lbnQgKSB7XG5cdFx0XHRyZXR1cm4gU3RyaW5nKCBtZXNzYWdlICkucmVwbGFjZSggJyVzJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gU3RyaW5nKCByZXBsYWNlbWVudCApO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIFJldHVybiBhIGRldGFjaGVkIEpTT04tc2FmZSBjb3B5LlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBTb3VyY2Ugb2JqZWN0LlxuXHRcdCAqIEByZXR1cm4ge09iamVjdH0gRGV0YWNoZWQgY29weS5cblx0XHQgKi9cblx0XHRmdW5jdGlvbiBjbG9uZV9yZXNvdXJjZSggc291cmNlICkge1xuXHRcdFx0cmV0dXJuIEpTT04ucGFyc2UoIEpTT04uc3RyaW5naWZ5KCBzb3VyY2UgfHwge30gKSApO1xuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIENyZWF0ZSBvbmUgdW5zYXZlZCBSZXNvdXJjZSBwcm9wb3NhbC5cblx0XHQgKlxuXHRcdCAqIEByZXR1cm4ge09iamVjdH0gSlNPTi1zYWZlIGRyYWZ0LlxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIGNyZWF0ZV9yZXNvdXJjZV9kcmFmdCgpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGRyYWZ0X2lkOiAnZHJhZnQtJyArIERhdGUubm93KCkgKyAnLScgKyBNYXRoLmZsb29yKCBNYXRoLnJhbmRvbSgpICogMTAwMDAwICksXG5cdFx0XHRcdHRpdGxlOiBnZXRfbWVzc2FnZSggJ25ld19yZXNvdXJjZScsICdOZXcgQm9va2luZyBSZXNvdXJjZScgKSxcblx0XHRcdFx0ZGVzY3JpcHRpb246ICcnLFxuXHRcdFx0XHRwaWN0dXJlX3VybDogJycsXG5cdFx0XHRcdGJhc2VfY29zdDogJzAuMDAnXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIFJldHVybiBvbmUgZGV0YWlscyBjb250cm9sIGJ5IHN0YWJsZSBmaWVsZCBuYW1lLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkX25hbWUgUmVzb3VyY2UgRFRPIGZpZWxkLlxuXHRcdCAqIEByZXR1cm4ge0hUTUxFbGVtZW50fG51bGx9IE1hdGNoaW5nIGNvbnRyb2wuXG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gZ2V0X3Jlc291cmNlX2ZpZWxkKCBmaWVsZF9uYW1lICkge1xuXHRcdFx0cmV0dXJuIGVkaXRvciA/IGVkaXRvci5ub2RlLnF1ZXJ5U2VsZWN0b3IoICdbZGF0YS13cGJjLXJlc291cmNlLWZpZWxkPVwiJyArIGZpZWxkX25hbWUgKyAnXCJdJyApIDogbnVsbDtcblx0XHR9XG5cblx0XHQvKipcblx0XHQgKiBSZXR1cm4gdGhlIHNlbGVjdGVkIG5ldyBvciBleGlzdGluZyBSZXNvdXJjZS5cblx0XHQgKlxuXHRcdCAqIEByZXR1cm4ge09iamVjdHxudWxsfSBTZWxlY3RlZCBSZXNvdXJjZSBvciBudWxsLlxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIGdldF9zZWxlY3RlZF9yZXNvdXJjZSgpIHtcblx0XHRcdGlmICggISBlZGl0b3IgfHwgbnVsbCA9PT0gZWRpdG9yLnNlbGVjdGVkX2luZGV4ICkge1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblx0XHRcdGlmICggJ2V4aXN0aW5nJyA9PT0gZWRpdG9yLnNlbGVjdGVkX3R5cGUgKSB7XG5cdFx0XHRcdHJldHVybiBlZGl0b3IuZXhpc3RpbmdfcmVzb3VyY2VzWyBlZGl0b3Iuc2VsZWN0ZWRfaW5kZXggXSB8fCBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZWRpdG9yLm5ld19yZXNvdXJjZXNbIGVkaXRvci5zZWxlY3RlZF9pbmRleCBdIHx8IG51bGw7XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogVGVzdCB3aGV0aGVyIGVkaXRhYmxlIHZhbHVlcyBkaWZmZXIgZnJvbSBhdXRob3JpemVkIHNvdXJjZSB2YWx1ZXMuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gcmVzb3VyY2UgQ3VycmVudCBicm93c2VyIFJlc291cmNlLlxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBiYXNlbGluZSBBdXRob3JpemVkIHNvdXJjZSBSZXNvdXJjZS5cblx0XHQgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIHdoZW4gYXQgbGVhc3Qgb25lIGVkaXRhYmxlIGZpZWxkIGNoYW5nZWQuXG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gcmVzb3VyY2VfaXNfZGlydHkoIHJlc291cmNlLCBiYXNlbGluZSApIHtcblx0XHRcdHJldHVybiBlZGl0YWJsZV9maWVsZHMuc29tZSggZnVuY3Rpb24gKCBmaWVsZF9uYW1lICkge1xuXHRcdFx0XHRyZXR1cm4gU3RyaW5nKCByZXNvdXJjZVsgZmllbGRfbmFtZSBdIHx8ICcnICkgIT09IFN0cmluZyggYmFzZWxpbmVbIGZpZWxkX25hbWUgXSB8fCAnJyApO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIEJ1aWxkIGRhdGEtb25seSB1cGRhdGUgcmVjb3JkcyBmb3IgY2hhbmdlZCBleGlzdGluZyBSZXNvdXJjZXMuXG5cdFx0ICpcblx0XHQgKiBAcmV0dXJuIHtBcnJheX0gRXhpc3RpbmcgUmVzb3VyY2UgdXBkYXRlIHBheWxvYWQuXG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gZ2V0X2V4aXN0aW5nX3VwZGF0ZXMoKSB7XG5cdFx0XHRyZXR1cm4gZWRpdG9yLmV4aXN0aW5nX3Jlc291cmNlcy5yZWR1Y2UoIGZ1bmN0aW9uICggdXBkYXRlcywgcmVzb3VyY2UsIHJlc291cmNlX2luZGV4ICkge1xuXHRcdFx0XHR2YXIgYmFzZWxpbmUgPSBlZGl0b3IuZXhpc3RpbmdfYmFzZWxpbmVzWyByZXNvdXJjZV9pbmRleCBdO1xuXHRcdFx0XHR2YXIgdXBkYXRlO1xuXG5cdFx0XHRcdGlmICggISBiYXNlbGluZSB8fCAhIHJlc291cmNlX2lzX2RpcnR5KCByZXNvdXJjZSwgYmFzZWxpbmUgKSApIHtcblx0XHRcdFx0XHRyZXR1cm4gdXBkYXRlcztcblx0XHRcdFx0fVxuXHRcdFx0XHR1cGRhdGUgPSB7XG5cdFx0XHRcdFx0cmVzb3VyY2VfaWQ6IE51bWJlciggcmVzb3VyY2UucmVzb3VyY2VfaWQgfHwgcmVzb3VyY2UuaWQgfHwgMCApLFxuXHRcdFx0XHRcdHNvdXJjZV9maW5nZXJwcmludDogU3RyaW5nKCBiYXNlbGluZS5zb3VyY2VfZmluZ2VycHJpbnQgfHwgJycgKVxuXHRcdFx0XHR9O1xuXHRcdFx0XHRlZGl0YWJsZV9maWVsZHMuZm9yRWFjaCggZnVuY3Rpb24gKCBmaWVsZF9uYW1lICkge1xuXHRcdFx0XHRcdHVwZGF0ZVsgZmllbGRfbmFtZSBdID0gU3RyaW5nKCByZXNvdXJjZVsgZmllbGRfbmFtZSBdIHx8ICcnICk7XG5cdFx0XHRcdH0gKTtcblx0XHRcdFx0dXBkYXRlcy5wdXNoKCB1cGRhdGUgKTtcblxuXHRcdFx0XHRyZXR1cm4gdXBkYXRlcztcblx0XHRcdH0sIFtdICk7XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogV3JpdGUgbmV3IGRyYWZ0cyBhbmQgY2hhbmdlZCBleGlzdGluZyBSZXNvdXJjZXMgdG8gc2VwYXJhdGUgdHJhbnNwb3J0cy5cblx0XHQgKlxuXHRcdCAqIEByZXR1cm4ge3ZvaWR9XG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gc3luY190cmFuc3BvcnQoKSB7XG5cdFx0XHRpZiAoICEgZWRpdG9yICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRlZGl0b3IubmV3X3RyYW5zcG9ydC52YWx1ZSA9IEpTT04uc3RyaW5naWZ5KCBlZGl0b3IubmV3X3Jlc291cmNlcyApO1xuXHRcdFx0ZWRpdG9yLnVwZGF0ZV90cmFuc3BvcnQudmFsdWUgPSBKU09OLnN0cmluZ2lmeSggZ2V0X2V4aXN0aW5nX3VwZGF0ZXMoKSApO1xuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIFBlcnNpc3QgdmlzaWJsZSBkZXRhaWwgY29udHJvbHMgaW50byB0aGUgc2VsZWN0ZWQgUmVzb3VyY2UuXG5cdFx0ICpcblx0XHQgKiBAcmV0dXJuIHt2b2lkfVxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIHN5bmNfc2VsZWN0ZWRfcmVzb3VyY2UoKSB7XG5cdFx0XHR2YXIgcmVzb3VyY2UgPSBnZXRfc2VsZWN0ZWRfcmVzb3VyY2UoKTtcblxuXHRcdFx0aWYgKCAhIHJlc291cmNlICkge1xuXHRcdFx0XHRzeW5jX3RyYW5zcG9ydCgpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRlZGl0YWJsZV9maWVsZHMuZm9yRWFjaCggZnVuY3Rpb24gKCBmaWVsZF9uYW1lICkge1xuXHRcdFx0XHR2YXIgZmllbGQgPSBnZXRfcmVzb3VyY2VfZmllbGQoIGZpZWxkX25hbWUgKTtcblx0XHRcdFx0aWYgKCBmaWVsZCAmJiAhIGZpZWxkLmRpc2FibGVkICkge1xuXHRcdFx0XHRcdHJlc291cmNlWyBmaWVsZF9uYW1lIF0gPSBmaWVsZC52YWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdFx0c3luY190cmFuc3BvcnQoKTtcblx0XHR9XG5cblx0XHQvKipcblx0XHQgKiBVcGRhdGUgdGhlIHNlbGVjdGVkIFJlc291cmNlIHN1bW1hcnkgYW5kIHBpY3R1cmUgcHJldmlldy5cblx0XHQgKlxuXHRcdCAqIEByZXR1cm4ge3ZvaWR9XG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gcmVuZGVyX2RldGFpbHMoKSB7XG5cdFx0XHR2YXIgcmVzb3VyY2UgPSBnZXRfc2VsZWN0ZWRfcmVzb3VyY2UoKTtcblx0XHRcdHZhciBmaWVsZHMgPSBlZGl0b3IgJiYgZWRpdG9yLm5vZGUucXVlcnlTZWxlY3RvciggJ1tkYXRhLXdwYmMtcmVzb3VyY2UtZmllbGRzXScgKTtcblx0XHRcdHZhciBlbXB0eSA9IGVkaXRvciAmJiBlZGl0b3Iubm9kZS5xdWVyeVNlbGVjdG9yKCAnW2RhdGEtd3BiYy1yZXNvdXJjZS1lbXB0eV0nICk7XG5cdFx0XHR2YXIgdGl0bGVfY29udHJvbCA9IGdldF9yZXNvdXJjZV9maWVsZCggJ3RpdGxlJyApO1xuXHRcdFx0dmFyIHBpY3R1cmVfdXJsO1xuXHRcdFx0dmFyIGltYWdlO1xuXHRcdFx0dmFyIHBsYWNlaG9sZGVyO1xuXHRcdFx0dmFyIHJlbW92ZV9waWN0dXJlO1xuXG5cdFx0XHRpZiAoIGZpZWxkcyApIHtcblx0XHRcdFx0ZmllbGRzLmhpZGRlbiA9ICEgcmVzb3VyY2U7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIGVtcHR5ICkge1xuXHRcdFx0XHRlbXB0eS5oaWRkZW4gPSBCb29sZWFuKCByZXNvdXJjZSApO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCAhIHJlc291cmNlICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRpZiAoIHRpdGxlX2NvbnRyb2wgKSB7XG5cdFx0XHRcdHRpdGxlX2NvbnRyb2wuc2V0QXR0cmlidXRlKFxuXHRcdFx0XHRcdCdkYXRhLXdwYmMtc2V0dXAtd2l6YXJkLWVycm9yLWNvbnRyb2wtZm9yJyxcblx0XHRcdFx0XHQnZXhpc3RpbmcnID09PSBlZGl0b3Iuc2VsZWN0ZWRfdHlwZSA/ICdleGlzdGluZ19ib29raW5nX3Jlc291cmNlcycgOiAnYm9va2luZ19yZXNvdXJjZXMnXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdGVkaXRhYmxlX2ZpZWxkcy5mb3JFYWNoKCBmdW5jdGlvbiAoIGZpZWxkX25hbWUgKSB7XG5cdFx0XHRcdHZhciBmaWVsZCA9IGdldF9yZXNvdXJjZV9maWVsZCggZmllbGRfbmFtZSApO1xuXHRcdFx0XHRpZiAoIGZpZWxkICkge1xuXHRcdFx0XHRcdGZpZWxkLnZhbHVlID0gdW5kZWZpbmVkICE9PSByZXNvdXJjZVsgZmllbGRfbmFtZSBdID8gcmVzb3VyY2VbIGZpZWxkX25hbWUgXSA6ICcnO1xuXHRcdFx0XHR9XG5cdFx0XHR9ICk7XG5cblx0XHRcdHBpY3R1cmVfdXJsID0gU3RyaW5nKCByZXNvdXJjZS5waWN0dXJlX3VybCB8fCAnJyApLnRyaW0oKTtcblx0XHRcdGltYWdlID0gZWRpdG9yLm5vZGUucXVlcnlTZWxlY3RvciggJ1tkYXRhLXdwYmMtcmVzb3VyY2UtcGljdHVyZS1pbWFnZV0nICk7XG5cdFx0XHRwbGFjZWhvbGRlciA9IGVkaXRvci5ub2RlLnF1ZXJ5U2VsZWN0b3IoICdbZGF0YS13cGJjLXJlc291cmNlLXBpY3R1cmUtcGxhY2Vob2xkZXJdJyApO1xuXHRcdFx0cmVtb3ZlX3BpY3R1cmUgPSBlZGl0b3Iubm9kZS5xdWVyeVNlbGVjdG9yKCAnW2RhdGEtd3BiYy1yZW1vdmUtcmVzb3VyY2UtcGljdHVyZV0nICk7XG5cdFx0XHRpZiAoIGltYWdlICkge1xuXHRcdFx0XHRpbWFnZS5oaWRkZW4gPSAhIHBpY3R1cmVfdXJsO1xuXHRcdFx0XHRpZiAoIHBpY3R1cmVfdXJsICkge1xuXHRcdFx0XHRcdGltYWdlLnNyYyA9IHBpY3R1cmVfdXJsO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGltYWdlLnJlbW92ZUF0dHJpYnV0ZSggJ3NyYycgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKCBwbGFjZWhvbGRlciApIHtcblx0XHRcdFx0cGxhY2Vob2xkZXIuaGlkZGVuID0gQm9vbGVhbiggcGljdHVyZV91cmwgKTtcblx0XHRcdH1cblx0XHRcdGlmICggcmVtb3ZlX3BpY3R1cmUgKSB7XG5cdFx0XHRcdHJlbW92ZV9waWN0dXJlLmRpc2FibGVkID0gISBlZGl0b3IubWVkaWFfdXBsb2FkX2F2YWlsYWJsZSB8fCAhIHBpY3R1cmVfdXJsO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIEV4cG9zZSB0aGUgZXhpc3RpbmcgUmVzb3VyY2UgZGlydHkgc3RhdGUgdGhyb3VnaCBpdHMgc2VydmVyLXJlbmRlcmVkIGJhZGdlLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtIVE1MRWxlbWVudH0gY2FyZCAgICAgICAgICAgRXhpc3RpbmcgUmVzb3VyY2UgY2FyZC5cblx0XHQgKiBAcGFyYW0ge251bWJlcn0gICAgICByZXNvdXJjZV9pbmRleCBSZXNvdXJjZSBpbmRleCBpbiB0aGUgYXV0aG9yaXplZCBsaXN0LlxuXHRcdCAqIEByZXR1cm4ge3ZvaWR9XG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gcmVuZGVyX2V4aXN0aW5nX2NhcmRfc3RhdHVzKCBjYXJkLCByZXNvdXJjZV9pbmRleCApIHtcblx0XHRcdHZhciBzdGF0dXNfYmFkZ2UgPSBjYXJkLnF1ZXJ5U2VsZWN0b3IoICdbZGF0YS13cGJjLXJlc291cmNlLXN0YXR1c10nICk7XG5cdFx0XHR2YXIgcmVzb3VyY2UgPSBlZGl0b3IuZXhpc3RpbmdfcmVzb3VyY2VzWyByZXNvdXJjZV9pbmRleCBdO1xuXHRcdFx0dmFyIGJhc2VsaW5lID0gZWRpdG9yLmV4aXN0aW5nX2Jhc2VsaW5lc1sgcmVzb3VyY2VfaW5kZXggXTtcblx0XHRcdHZhciBpc19jaGFuZ2VkID0gQm9vbGVhbiggcmVzb3VyY2UgJiYgYmFzZWxpbmUgJiYgcmVzb3VyY2VfaXNfZGlydHkoIHJlc291cmNlLCBiYXNlbGluZSApICk7XG5cblx0XHRcdGlmICggc3RhdHVzX2JhZGdlICkge1xuXHRcdFx0XHRzdGF0dXNfYmFkZ2UudGV4dENvbnRlbnQgPSBpc19jaGFuZ2VkID8gc3RhdHVzX2JhZGdlLmRhdGFzZXQuY2hhbmdlZExhYmVsIDogc3RhdHVzX2JhZGdlLmRhdGFzZXQuZXhpc3RpbmdMYWJlbDtcblx0XHRcdFx0c3RhdHVzX2JhZGdlLmNsYXNzTGlzdC50b2dnbGUoICdpcy1leGlzdGluZycsICEgaXNfY2hhbmdlZCApO1xuXHRcdFx0XHRzdGF0dXNfYmFkZ2UuY2xhc3NMaXN0LnRvZ2dsZSggJ2lzLWNoYW5nZWQnLCBpc19jaGFuZ2VkICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogVXBkYXRlIHRoZSBzZXJ2ZXItcmVuZGVyZWQgZXhpc3RpbmcgUmVzb3VyY2UgY2FyZHMuXG5cdFx0ICpcblx0XHQgKiBAcmV0dXJuIHt2b2lkfVxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIHJlbmRlcl9leGlzdGluZ19jYXJkcygpIHtcblx0XHRcdGVkaXRvci5leGlzdGluZ19jYXJkcy5mb3JFYWNoKCBmdW5jdGlvbiAoIGNhcmQsIHJlc291cmNlX2luZGV4ICkge1xuXHRcdFx0XHR2YXIgcmVzb3VyY2UgPSBlZGl0b3IuZXhpc3RpbmdfcmVzb3VyY2VzWyByZXNvdXJjZV9pbmRleCBdO1xuXHRcdFx0XHR2YXIgc2VsZWN0aW9uID0gY2FyZC5xdWVyeVNlbGVjdG9yKCAnaW5wdXRbdHlwZT1cInJhZGlvXCJdJyApO1xuXHRcdFx0XHR2YXIgaW1hZ2UgPSBjYXJkLnF1ZXJ5U2VsZWN0b3IoICdpbWcnICk7XG5cdFx0XHRcdHZhciBwbGFjZWhvbGRlciA9IGNhcmQucXVlcnlTZWxlY3RvciggJy53cGJjLWJpLWltYWdlLWZpbGwnICk7XG5cblx0XHRcdFx0aWYgKCAhIHJlc291cmNlICkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRjYXJkLmNsYXNzTGlzdC50b2dnbGUoICdpcy1zZWxlY3RlZCcsICdleGlzdGluZycgPT09IGVkaXRvci5zZWxlY3RlZF90eXBlICYmIHJlc291cmNlX2luZGV4ID09PSBlZGl0b3Iuc2VsZWN0ZWRfaW5kZXggKTtcblx0XHRcdFx0c2VsZWN0aW9uLmNoZWNrZWQgPSAnZXhpc3RpbmcnID09PSBlZGl0b3Iuc2VsZWN0ZWRfdHlwZSAmJiByZXNvdXJjZV9pbmRleCA9PT0gZWRpdG9yLnNlbGVjdGVkX2luZGV4O1xuXHRcdFx0XHRjYXJkLnF1ZXJ5U2VsZWN0b3IoICdzdHJvbmcnICkudGV4dENvbnRlbnQgPSByZXNvdXJjZS50aXRsZSB8fCBnZXRfbWVzc2FnZSggJ25ld19yZXNvdXJjZScsICdOZXcgQm9va2luZyBSZXNvdXJjZScgKTtcblx0XHRcdFx0cmVuZGVyX2V4aXN0aW5nX2NhcmRfc3RhdHVzKCBjYXJkLCByZXNvdXJjZV9pbmRleCApO1xuXHRcdFx0XHRpZiAoIHJlc291cmNlLnBpY3R1cmVfdXJsICkge1xuXHRcdFx0XHRcdGltYWdlLnNyYyA9IHJlc291cmNlLnBpY3R1cmVfdXJsO1xuXHRcdFx0XHRcdGltYWdlLmhpZGRlbiA9IGZhbHNlO1xuXHRcdFx0XHRcdHBsYWNlaG9sZGVyLmhpZGRlbiA9IHRydWU7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aW1hZ2UucmVtb3ZlQXR0cmlidXRlKCAnc3JjJyApO1xuXHRcdFx0XHRcdGltYWdlLmhpZGRlbiA9IHRydWU7XG5cdFx0XHRcdFx0cGxhY2Vob2xkZXIuaGlkZGVuID0gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHQvKipcblx0XHQgKiBSZW5kZXIgbmV3IHByb3Bvc2FsIGNhcmRzIGFuZCByZWZyZXNoIGV4aXN0aW5nIGNhcmQgc3RhdGUuXG5cdFx0ICpcblx0XHQgKiBAcmV0dXJuIHt2b2lkfVxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIHJlbmRlcl9jYXJkcygpIHtcblx0XHRcdHZhciBmcmFnbWVudDtcblxuXHRcdFx0aWYgKCAhIGVkaXRvciB8fCAhIGVkaXRvci5uZXdfbGlzdCB8fCAhIGVkaXRvci50ZW1wbGF0ZSApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0ZWRpdG9yLm5ld19saXN0LmlubmVySFRNTCA9ICcnO1xuXHRcdFx0ZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG5cdFx0XHRlZGl0b3IubmV3X3Jlc291cmNlcy5mb3JFYWNoKCBmdW5jdGlvbiAoIHJlc291cmNlLCByZXNvdXJjZV9pbmRleCApIHtcblx0XHRcdFx0dmFyIGNhcmQgPSBlZGl0b3IudGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZC5jbG9uZU5vZGUoIHRydWUgKTtcblx0XHRcdFx0dmFyIHNlbGVjdGlvbiA9IGNhcmQucXVlcnlTZWxlY3RvciggJ2lucHV0W3R5cGU9XCJyYWRpb1wiXScgKTtcblx0XHRcdFx0dmFyIGltYWdlID0gY2FyZC5xdWVyeVNlbGVjdG9yKCAnaW1nJyApO1xuXHRcdFx0XHR2YXIgcGxhY2Vob2xkZXIgPSBjYXJkLnF1ZXJ5U2VsZWN0b3IoICcud3BiYy1iaS1pbWFnZS1maWxsJyApO1xuXHRcdFx0XHR2YXIgcmVtb3ZlX2J1dHRvbiA9IGNhcmQucXVlcnlTZWxlY3RvciggJ1tkYXRhLXdwYmMtcmVtb3ZlLXJlc291cmNlXScgKTtcblxuXHRcdFx0XHRjYXJkLmNsYXNzTGlzdC50b2dnbGUoICdpcy1zZWxlY3RlZCcsICduZXcnID09PSBlZGl0b3Iuc2VsZWN0ZWRfdHlwZSAmJiByZXNvdXJjZV9pbmRleCA9PT0gZWRpdG9yLnNlbGVjdGVkX2luZGV4ICk7XG5cdFx0XHRcdHNlbGVjdGlvbi5jaGVja2VkID0gJ25ldycgPT09IGVkaXRvci5zZWxlY3RlZF90eXBlICYmIHJlc291cmNlX2luZGV4ID09PSBlZGl0b3Iuc2VsZWN0ZWRfaW5kZXg7XG5cdFx0XHRcdHNlbGVjdGlvbi5kYXRhc2V0LndwYmNSZXNvdXJjZVNlbGVjdGlvbiA9ICduZXc6JyArIFN0cmluZyggcmVzb3VyY2VfaW5kZXggKTtcblx0XHRcdFx0Y2FyZC5xdWVyeVNlbGVjdG9yKCAnc3Ryb25nJyApLnRleHRDb250ZW50ID0gcmVzb3VyY2UudGl0bGUgfHwgZ2V0X21lc3NhZ2UoICduZXdfcmVzb3VyY2UnLCAnTmV3IEJvb2tpbmcgUmVzb3VyY2UnICk7XG5cdFx0XHRcdGlmICggcmVzb3VyY2UucGljdHVyZV91cmwgKSB7XG5cdFx0XHRcdFx0aW1hZ2Uuc3JjID0gcmVzb3VyY2UucGljdHVyZV91cmw7XG5cdFx0XHRcdFx0aW1hZ2UuaGlkZGVuID0gZmFsc2U7XG5cdFx0XHRcdFx0cGxhY2Vob2xkZXIuaGlkZGVuID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZW1vdmVfYnV0dG9uLmRhdGFzZXQud3BiY1JlbW92ZVJlc291cmNlID0gU3RyaW5nKCByZXNvdXJjZV9pbmRleCApO1xuXHRcdFx0XHRyZW1vdmVfYnV0dG9uLnNldEF0dHJpYnV0ZSggJ2FyaWEtbGFiZWwnLCBmb3JtYXRfbWVzc2FnZSggZ2V0X21lc3NhZ2UoICdyZW1vdmVfcmVzb3VyY2UnLCAnUmVtb3ZlICVzJyApLCByZXNvdXJjZS50aXRsZSB8fCBnZXRfbWVzc2FnZSggJ25ld19yZXNvdXJjZScsICdOZXcgQm9va2luZyBSZXNvdXJjZScgKSApICk7XG5cdFx0XHRcdGZyYWdtZW50LmFwcGVuZENoaWxkKCBjYXJkICk7XG5cdFx0XHR9ICk7XG5cdFx0XHRlZGl0b3IubmV3X2xpc3QuYXBwZW5kQ2hpbGQoIGZyYWdtZW50ICk7XG5cdFx0XHRyZW5kZXJfZXhpc3RpbmdfY2FyZHMoKTtcblx0XHRcdHN5bmNfdHJhbnNwb3J0KCk7XG5cdFx0XHRyZW5kZXJfZGV0YWlscygpO1xuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIFNlbGVjdCBhIFJlc291cmNlIGZyb20gYSBzdGFibGUgYHR5cGU6aW5kZXhgIGJyb3dzZXIgdmFsdWUuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0aW9uX3ZhbHVlIEJyb3dzZXIgc2VsZWN0aW9uIHZhbHVlLlxuXHRcdCAqIEByZXR1cm4ge3ZvaWR9XG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gc2VsZWN0X3Jlc291cmNlKCBzZWxlY3Rpb25fdmFsdWUgKSB7XG5cdFx0XHR2YXIgc2VsZWN0aW9uX3BhcnRzID0gU3RyaW5nKCBzZWxlY3Rpb25fdmFsdWUgfHwgJycgKS5zcGxpdCggJzonICk7XG5cdFx0XHR2YXIgc2VsZWN0ZWRfdHlwZSA9IHNlbGVjdGlvbl9wYXJ0c1sgMCBdO1xuXHRcdFx0dmFyIHNlbGVjdGVkX2luZGV4ID0gcGFyc2VJbnQoIHNlbGVjdGlvbl9wYXJ0c1sgMSBdLCAxMCApO1xuXHRcdFx0dmFyIHNlbGVjdGVkX2NhcmQ7XG5cdFx0XHR2YXIgc2VsZWN0ZWRfY29udHJvbDtcblxuXHRcdFx0aWYgKCBbICduZXcnLCAnZXhpc3RpbmcnIF0uaW5kZXhPZiggc2VsZWN0ZWRfdHlwZSApIDwgMCB8fCBpc05hTiggc2VsZWN0ZWRfaW5kZXggKSApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0c2VsZWN0ZWRfY2FyZCA9ICdleGlzdGluZycgPT09IHNlbGVjdGVkX3R5cGVcblx0XHRcdFx0PyBlZGl0b3IuZXhpc3RpbmdfY2FyZHNbIHNlbGVjdGVkX2luZGV4IF1cblx0XHRcdFx0OiBlZGl0b3IubmV3X2xpc3QucXVlcnlTZWxlY3RvciggJ1tkYXRhLXdwYmMtcmVzb3VyY2Utc2VsZWN0aW9uPVwibmV3OicgKyBTdHJpbmcoIHNlbGVjdGVkX2luZGV4ICkgKyAnXCJdJyApO1xuXHRcdFx0aWYgKCAhIHNlbGVjdGVkX2NhcmQgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdHN5bmNfc2VsZWN0ZWRfcmVzb3VyY2UoKTtcblx0XHRcdGVkaXRvci5zZWxlY3RlZF90eXBlID0gc2VsZWN0ZWRfdHlwZTtcblx0XHRcdGVkaXRvci5zZWxlY3RlZF9pbmRleCA9IHNlbGVjdGVkX2luZGV4O1xuXHRcdFx0cmVuZGVyX2NhcmRzKCk7XG5cdFx0XHRzZWxlY3RlZF9jb250cm9sID0gJ2V4aXN0aW5nJyA9PT0gc2VsZWN0ZWRfdHlwZVxuXHRcdFx0XHQ/IHNlbGVjdGVkX2NhcmQucXVlcnlTZWxlY3RvciggJ2lucHV0W3R5cGU9XCJyYWRpb1wiXScgKVxuXHRcdFx0XHQ6IGVkaXRvci5uZXdfbGlzdC5xdWVyeVNlbGVjdG9yKCAnW2RhdGEtd3BiYy1yZXNvdXJjZS1zZWxlY3Rpb249XCJuZXc6JyArIFN0cmluZyggc2VsZWN0ZWRfaW5kZXggKSArICdcIl0nICk7XG5cdFx0XHRpZiAoIHNlbGVjdGVkX2NvbnRyb2wgKSB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0c2VsZWN0ZWRfY29udHJvbC5mb2N1cyggeyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH0gKTtcblx0XHRcdFx0fSBjYXRjaCAoIGZvY3VzX2Vycm9yICkge1xuXHRcdFx0XHRcdHNlbGVjdGVkX2NvbnRyb2wuZm9jdXMoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIEhhbmRsZSBkZWxlZ2F0ZWQgZWRpdG9yIGJ1dHRvbiBhY3Rpb25zLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudCBDbGljayBldmVudC5cblx0XHQgKiBAcmV0dXJuIHt2b2lkfVxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIGhhbmRsZV9jbGljayggZXZlbnQgKSB7XG5cdFx0XHR2YXIgcmVtb3ZlX2J1dHRvbiA9IGV2ZW50LnRhcmdldC5jbG9zZXN0KCAnW2RhdGEtd3BiYy1yZW1vdmUtcmVzb3VyY2VdJyApO1xuXHRcdFx0dmFyIHJlbW92ZV9pbmRleDtcblx0XHRcdHZhciBmb2N1c190YXJnZXQ7XG5cblx0XHRcdGlmICggZXZlbnQudGFyZ2V0LmNsb3Nlc3QoICdbZGF0YS13cGJjLWFkZC1yZXNvdXJjZV0nICkgKSB7XG5cdFx0XHRcdGlmICggISBlZGl0b3IuY2FuX2NyZWF0ZSB8fCBlZGl0b3IubmV3X3Jlc291cmNlcy5sZW5ndGggPj0gZWRpdG9yLm1heF9yZXNvdXJjZXMgKSB7XG5cdFx0XHRcdFx0c2hlbGxfYXBpLnNldF9maWVsZF9lcnJvciggJ2Jvb2tpbmdfcmVzb3VyY2VzJywgZ2V0X21lc3NhZ2UoICdyZXNvdXJjZV9saW1pdCcsICdUaGUgQm9va2luZyBSZXNvdXJjZSBsaW1pdCBmb3IgdGhpcyBhY2NvdW50IGhhcyBiZWVuIHJlYWNoZWQuJyApICk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHN5bmNfc2VsZWN0ZWRfcmVzb3VyY2UoKTtcblx0XHRcdFx0ZWRpdG9yLm5ld19yZXNvdXJjZXMucHVzaCggY3JlYXRlX3Jlc291cmNlX2RyYWZ0KCkgKTtcblx0XHRcdFx0ZWRpdG9yLnNlbGVjdGVkX3R5cGUgPSAnbmV3Jztcblx0XHRcdFx0ZWRpdG9yLnNlbGVjdGVkX2luZGV4ID0gZWRpdG9yLm5ld19yZXNvdXJjZXMubGVuZ3RoIC0gMTtcblx0XHRcdFx0cmVuZGVyX2NhcmRzKCk7XG5cdFx0XHRcdHNoZWxsX2FwaS5jbGVhcl9maWVsZF9lcnJvciggJ2Jvb2tpbmdfcmVzb3VyY2VzJyApO1xuXHRcdFx0XHRnZXRfcmVzb3VyY2VfZmllbGQoICd0aXRsZScgKS5mb2N1cygpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmICggcmVtb3ZlX2J1dHRvbiApIHtcblx0XHRcdFx0cmVtb3ZlX2luZGV4ID0gcGFyc2VJbnQoIHJlbW92ZV9idXR0b24uZGF0YXNldC53cGJjUmVtb3ZlUmVzb3VyY2UsIDEwICk7XG5cdFx0XHRcdGlmICggISBpc05hTiggcmVtb3ZlX2luZGV4ICkgJiYgZWRpdG9yLm5ld19yZXNvdXJjZXNbIHJlbW92ZV9pbmRleCBdICkge1xuXHRcdFx0XHRcdGVkaXRvci5uZXdfcmVzb3VyY2VzLnNwbGljZSggcmVtb3ZlX2luZGV4LCAxICk7XG5cdFx0XHRcdFx0aWYgKCBlZGl0b3IubmV3X3Jlc291cmNlcy5sZW5ndGggKSB7XG5cdFx0XHRcdFx0XHRlZGl0b3Iuc2VsZWN0ZWRfdHlwZSA9ICduZXcnO1xuXHRcdFx0XHRcdFx0ZWRpdG9yLnNlbGVjdGVkX2luZGV4ID0gTWF0aC5tYXgoIDAsIE1hdGgubWluKCBlZGl0b3Iuc2VsZWN0ZWRfaW5kZXgsIGVkaXRvci5uZXdfcmVzb3VyY2VzLmxlbmd0aCAtIDEgKSApO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIGVkaXRvci5leGlzdGluZ19yZXNvdXJjZXMubGVuZ3RoICkge1xuXHRcdFx0XHRcdFx0ZWRpdG9yLnNlbGVjdGVkX3R5cGUgPSAnZXhpc3RpbmcnO1xuXHRcdFx0XHRcdFx0ZWRpdG9yLnNlbGVjdGVkX2luZGV4ID0gMDtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0ZWRpdG9yLnNlbGVjdGVkX3R5cGUgPSBudWxsO1xuXHRcdFx0XHRcdFx0ZWRpdG9yLnNlbGVjdGVkX2luZGV4ID0gbnVsbDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmVuZGVyX2NhcmRzKCk7XG5cdFx0XHRcdFx0c2hlbGxfYXBpLnNldF9zdGF0dXMoIGdldF9tZXNzYWdlKCAncmVzb3VyY2VfcmVtb3ZlZCcsICdVbnNhdmVkIEJvb2tpbmcgUmVzb3VyY2UgcmVtb3ZlZCBmcm9tIHRoaXMgc2V0dXAuJyApICk7XG5cdFx0XHRcdFx0Zm9jdXNfdGFyZ2V0ID0gZWRpdG9yLm5ld19saXN0LnF1ZXJ5U2VsZWN0b3IoICdpbnB1dFt0eXBlPVwicmFkaW9cIl0nICkgfHwgKCBlZGl0b3IuZXhpc3RpbmdfbGlzdCA/IGVkaXRvci5leGlzdGluZ19saXN0LnF1ZXJ5U2VsZWN0b3IoICdpbnB1dFt0eXBlPVwicmFkaW9cIl0nICkgOiBudWxsICkgfHwgZWRpdG9yLm5vZGUucXVlcnlTZWxlY3RvciggJ1tkYXRhLXdwYmMtYWRkLXJlc291cmNlXScgKTtcblx0XHRcdFx0XHRpZiAoIGZvY3VzX3RhcmdldCApIHtcblx0XHRcdFx0XHRcdGZvY3VzX3RhcmdldC5mb2N1cygpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmICggZXZlbnQudGFyZ2V0LmNsb3Nlc3QoICdbZGF0YS13cGJjLXJlbW92ZS1yZXNvdXJjZS1waWN0dXJlXScgKSAmJiBlZGl0b3IubWVkaWFfdXBsb2FkX2F2YWlsYWJsZSApIHtcblx0XHRcdFx0dmFyIHBpY3R1cmVfZmllbGQgPSBnZXRfcmVzb3VyY2VfZmllbGQoICdwaWN0dXJlX3VybCcgKTtcblx0XHRcdFx0aWYgKCBwaWN0dXJlX2ZpZWxkICkge1xuXHRcdFx0XHRcdHBpY3R1cmVfZmllbGQudmFsdWUgPSAnJztcblx0XHRcdFx0XHRzeW5jX3NlbGVjdGVkX3Jlc291cmNlKCk7XG5cdFx0XHRcdFx0cmVuZGVyX2NhcmRzKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvKipcblx0XHQgKiBIYW5kbGUgc2VsZWN0aW9uIGFuZCBjb21taXR0ZWQgZmllbGQgY2hhbmdlcy5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IENoYW5nZSBldmVudC5cblx0XHQgKiBAcmV0dXJuIHt2b2lkfVxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIGhhbmRsZV9jaGFuZ2UoIGV2ZW50ICkge1xuXHRcdFx0aWYgKCBldmVudC50YXJnZXQubWF0Y2hlcyggJ1tkYXRhLXdwYmMtcmVzb3VyY2Utc2VsZWN0aW9uXScgKSApIHtcblx0XHRcdFx0c2VsZWN0X3Jlc291cmNlKCBldmVudC50YXJnZXQuZGF0YXNldC53cGJjUmVzb3VyY2VTZWxlY3Rpb24gKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCBldmVudC50YXJnZXQubWF0Y2hlcyggJ1tkYXRhLXdwYmMtcmVzb3VyY2UtZmllbGRdJyApICkge1xuXHRcdFx0XHRzeW5jX3NlbGVjdGVkX3Jlc291cmNlKCk7XG5cdFx0XHRcdHJlbmRlcl9jYXJkcygpO1xuXHRcdFx0XHRzaGVsbF9hcGkuY2xlYXJfZmllbGRfZXJyb3IoICdib29raW5nX3Jlc291cmNlcycgKTtcblx0XHRcdFx0c2hlbGxfYXBpLmNsZWFyX2ZpZWxkX2Vycm9yKCAnZXhpc3RpbmdfYm9va2luZ19yZXNvdXJjZXMnICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogSGFuZGxlIGxpdmUgdGV4dCBlZGl0aW5nIHdpdGhvdXQgcmVjb25zdHJ1Y3RpbmcgdGhlIGFjdGl2ZSBjb250cm9scy5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7SW5wdXRFdmVudH0gZXZlbnQgSW5wdXQgZXZlbnQuXG5cdFx0ICogQHJldHVybiB7dm9pZH1cblx0XHQgKi9cblx0XHRmdW5jdGlvbiBoYW5kbGVfaW5wdXQoIGV2ZW50ICkge1xuXHRcdFx0dmFyIHJlc291cmNlO1xuXHRcdFx0dmFyIGNhcmQ7XG5cblx0XHRcdGlmICggISBldmVudC50YXJnZXQubWF0Y2hlcyggJ1tkYXRhLXdwYmMtcmVzb3VyY2UtZmllbGRdJyApICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRzeW5jX3NlbGVjdGVkX3Jlc291cmNlKCk7XG5cdFx0XHRyZXNvdXJjZSA9IGdldF9zZWxlY3RlZF9yZXNvdXJjZSgpO1xuXHRcdFx0Y2FyZCA9ICdleGlzdGluZycgPT09IGVkaXRvci5zZWxlY3RlZF90eXBlID8gZWRpdG9yLmV4aXN0aW5nX2NhcmRzWyBlZGl0b3Iuc2VsZWN0ZWRfaW5kZXggXSA6IGVkaXRvci5uZXdfbGlzdC5jaGlsZHJlblsgZWRpdG9yLnNlbGVjdGVkX2luZGV4IF07XG5cdFx0XHRpZiAoIGNhcmQgJiYgcmVzb3VyY2UgKSB7XG5cdFx0XHRcdGNhcmQucXVlcnlTZWxlY3RvciggJ3N0cm9uZycgKS50ZXh0Q29udGVudCA9IHJlc291cmNlLnRpdGxlIHx8IGdldF9tZXNzYWdlKCAnbmV3X3Jlc291cmNlJywgJ05ldyBCb29raW5nIFJlc291cmNlJyApO1xuXHRcdFx0XHRpZiAoICdleGlzdGluZycgPT09IGVkaXRvci5zZWxlY3RlZF90eXBlICkge1xuXHRcdFx0XHRcdHJlbmRlcl9leGlzdGluZ19jYXJkX3N0YXR1cyggY2FyZCwgZWRpdG9yLnNlbGVjdGVkX2luZGV4ICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHNoZWxsX2FwaS5jbGVhcl9maWVsZF9lcnJvciggJ2Jvb2tpbmdfcmVzb3VyY2VzJyApO1xuXHRcdFx0c2hlbGxfYXBpLmNsZWFyX2ZpZWxkX2Vycm9yKCAnZXhpc3RpbmdfYm9va2luZ19yZXNvdXJjZXMnICk7XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogUmVmcmVzaCBhZnRlciB0aGUgc2hhcmVkIFdvcmRQcmVzcyBtZWRpYSBwaWNrZXIgc2V0cyB0aGUgVVJMIGZpZWxkLlxuXHRcdCAqXG5cdFx0ICogQHJldHVybiB7dm9pZH1cblx0XHQgKi9cblx0XHRmdW5jdGlvbiBoYW5kbGVfbWVkaWFfdXJsX3NldCgpIHtcblx0XHRcdHN5bmNfc2VsZWN0ZWRfcmVzb3VyY2UoKTtcblx0XHRcdHJlbmRlcl9jYXJkcygpO1xuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIFBhcnNlIG9uZSBKU09OIGFycmF5IHRyYW5zcG9ydCB3aXRob3V0IHRydXN0aW5nIGl0cyBzaGFwZS5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGVkX3ZhbHVlIEpTT04gdmFsdWUuXG5cdFx0ICogQHJldHVybiB7QXJyYXl9IERlY29kZWQgYXJyYXkgb3IgYW4gZW1wdHkgYXJyYXkuXG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gcGFyc2VfYXJyYXkoIGVuY29kZWRfdmFsdWUgKSB7XG5cdFx0XHR2YXIgcGFyc2VkX3ZhbHVlO1xuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRwYXJzZWRfdmFsdWUgPSBKU09OLnBhcnNlKCBlbmNvZGVkX3ZhbHVlIHx8ICdbXScgKTtcblx0XHRcdH0gY2F0Y2ggKCBwYXJzZV9lcnJvciApIHtcblx0XHRcdFx0cGFyc2VkX3ZhbHVlID0gW107XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBBcnJheS5pc0FycmF5KCBwYXJzZWRfdmFsdWUgKSA/IHBhcnNlZF92YWx1ZSA6IFtdO1xuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIEluaXRpYWxpemUgdGhpcyBzdGVwIGZyb20gdGhlIHNoZWxsIGFuZCBkYXRhLW9ubHkgdHJhbnNwb3J0cy5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSByZWdpc3RlcmVkX3NoZWxsX2FwaSBTaGFyZWQgd2l6YXJkIHNlcnZpY2VzLlxuXHRcdCAqIEByZXR1cm4ge3ZvaWR9XG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gaW5pdGlhbGl6ZSggcmVnaXN0ZXJlZF9zaGVsbF9hcGkgKSB7XG5cdFx0XHR2YXIgZWRpdG9yX25vZGU7XG5cdFx0XHR2YXIgbmV3X3RyYW5zcG9ydDtcblx0XHRcdHZhciB1cGRhdGVfdHJhbnNwb3J0O1xuXHRcdFx0dmFyIGV4aXN0aW5nX3NvdXJjZTtcblx0XHRcdHZhciBleGlzdGluZ19yZXNvdXJjZXM7XG5cblx0XHRcdHNoZWxsX2FwaSA9IHJlZ2lzdGVyZWRfc2hlbGxfYXBpO1xuXHRcdFx0cm9vdCA9IHNoZWxsX2FwaS5yb290O1xuXHRcdFx0ZWRpdG9yX25vZGUgPSByb290LnF1ZXJ5U2VsZWN0b3IoICdbZGF0YS13cGJjLWJvb2tpbmctcmVzb3VyY2VzLWVkaXRvcl0nICk7XG5cdFx0XHRuZXdfdHJhbnNwb3J0ID0gcm9vdC5xdWVyeVNlbGVjdG9yKCAnW2RhdGEtd3BiYy1ib29raW5nLXJlc291cmNlLWRyYWZ0c10nICk7XG5cdFx0XHR1cGRhdGVfdHJhbnNwb3J0ID0gcm9vdC5xdWVyeVNlbGVjdG9yKCAnW2RhdGEtd3BiYy1leGlzdGluZy1yZXNvdXJjZS11cGRhdGVzXScgKTtcblx0XHRcdGV4aXN0aW5nX3NvdXJjZSA9IHJvb3QucXVlcnlTZWxlY3RvciggJ1tkYXRhLXdwYmMtZXhpc3RpbmctcmVzb3VyY2Utc291cmNlXScgKTtcblx0XHRcdGlmICggISBlZGl0b3Jfbm9kZSB8fCAhIG5ld190cmFuc3BvcnQgfHwgISB1cGRhdGVfdHJhbnNwb3J0IHx8ICEgZXhpc3Rpbmdfc291cmNlICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGV4aXN0aW5nX3Jlc291cmNlcyA9IHBhcnNlX2FycmF5KCBleGlzdGluZ19zb3VyY2UudmFsdWUgKTtcblx0XHRcdGVkaXRvciA9IHtcblx0XHRcdFx0bm9kZTogZWRpdG9yX25vZGUsXG5cdFx0XHRcdG5ld190cmFuc3BvcnQ6IG5ld190cmFuc3BvcnQsXG5cdFx0XHRcdHVwZGF0ZV90cmFuc3BvcnQ6IHVwZGF0ZV90cmFuc3BvcnQsXG5cdFx0XHRcdG5ld19saXN0OiBlZGl0b3Jfbm9kZS5xdWVyeVNlbGVjdG9yKCAnW2RhdGEtd3BiYy1uZXctcmVzb3VyY2UtbGlzdF0nICksXG5cdFx0XHRcdGV4aXN0aW5nX2xpc3Q6IGVkaXRvcl9ub2RlLnF1ZXJ5U2VsZWN0b3IoICdbZGF0YS13cGJjLWV4aXN0aW5nLXJlc291cmNlLWxpc3RdJyApLFxuXHRcdFx0XHRleGlzdGluZ19jYXJkczogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGVkaXRvcl9ub2RlLnF1ZXJ5U2VsZWN0b3JBbGwoICdbZGF0YS13cGJjLWV4aXN0aW5nLXJlc291cmNlLWNhcmRdJyApICksXG5cdFx0XHRcdHRlbXBsYXRlOiByb290LnF1ZXJ5U2VsZWN0b3IoICdbZGF0YS13cGJjLXJlc291cmNlLWNhcmQtdGVtcGxhdGVdJyApLFxuXHRcdFx0XHRuZXdfcmVzb3VyY2VzOiBwYXJzZV9hcnJheSggbmV3X3RyYW5zcG9ydC52YWx1ZSApLFxuXHRcdFx0XHRleGlzdGluZ19yZXNvdXJjZXM6IGV4aXN0aW5nX3Jlc291cmNlcy5tYXAoIGNsb25lX3Jlc291cmNlICksXG5cdFx0XHRcdGV4aXN0aW5nX2Jhc2VsaW5lczogZXhpc3RpbmdfcmVzb3VyY2VzLm1hcCggY2xvbmVfcmVzb3VyY2UgKSxcblx0XHRcdFx0c2VsZWN0ZWRfdHlwZTogbnVsbCxcblx0XHRcdFx0c2VsZWN0ZWRfaW5kZXg6IG51bGwsXG5cdFx0XHRcdGNhbl9jcmVhdGU6ICd0cnVlJyA9PT0gZWRpdG9yX25vZGUuZGF0YXNldC5jYW5DcmVhdGUsXG5cdFx0XHRcdHByaWNpbmdfYXZhaWxhYmxlOiAndHJ1ZScgPT09IGVkaXRvcl9ub2RlLmRhdGFzZXQucHJpY2luZ0F2YWlsYWJsZSxcblx0XHRcdFx0bWVkaWFfdXBsb2FkX2F2YWlsYWJsZTogJ3RydWUnID09PSBlZGl0b3Jfbm9kZS5kYXRhc2V0Lm1lZGlhVXBsb2FkQXZhaWxhYmxlLFxuXHRcdFx0XHRtYXhfcmVzb3VyY2VzOiBwYXJzZUludCggbmV3X3RyYW5zcG9ydC5kYXRhc2V0Lm1heFJlc291cmNlRHJhZnRzIHx8ICcwJywgMTAgKVxuXHRcdFx0fTtcblx0XHRcdGlmICggZWRpdG9yLm5ld19yZXNvdXJjZXMubGVuZ3RoICkge1xuXHRcdFx0XHRlZGl0b3Iuc2VsZWN0ZWRfdHlwZSA9ICduZXcnO1xuXHRcdFx0XHRlZGl0b3Iuc2VsZWN0ZWRfaW5kZXggPSAwO1xuXHRcdFx0fSBlbHNlIGlmICggZWRpdG9yLmV4aXN0aW5nX3Jlc291cmNlcy5sZW5ndGggKSB7XG5cdFx0XHRcdGVkaXRvci5zZWxlY3RlZF90eXBlID0gJ2V4aXN0aW5nJztcblx0XHRcdFx0ZWRpdG9yLnNlbGVjdGVkX2luZGV4ID0gMDtcblx0XHRcdH1cblx0XHRcdGVkaXRvci5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoICdjbGljaycsIGhhbmRsZV9jbGljayApO1xuXHRcdFx0ZWRpdG9yLm5vZGUuYWRkRXZlbnRMaXN0ZW5lciggJ2NoYW5nZScsIGhhbmRsZV9jaGFuZ2UgKTtcblx0XHRcdGVkaXRvci5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoICdpbnB1dCcsIGhhbmRsZV9pbnB1dCApO1xuXHRcdFx0JCggZG9jdW1lbnQgKVxuXHRcdFx0XHQub2ZmKCAnd3BiY19tZWRpYV91cGxvYWRfdXJsX3NldC53cGJjU2V0dXBXaXphcmRSZXNvdXJjZXMnLCAnI3dwYmMtc2V0dXAtd2l6YXJkLXJlc291cmNlLXBpY3R1cmUtdXJsJyApXG5cdFx0XHRcdC5vbiggJ3dwYmNfbWVkaWFfdXBsb2FkX3VybF9zZXQud3BiY1NldHVwV2l6YXJkUmVzb3VyY2VzJywgJyN3cGJjLXNldHVwLXdpemFyZC1yZXNvdXJjZS1waWN0dXJlLXVybCcsIGhhbmRsZV9tZWRpYV91cmxfc2V0ICk7XG5cdFx0XHRyZW5kZXJfY2FyZHMoKTtcblx0XHR9XG5cblx0XHQvKipcblx0XHQgKiBWYWxpZGF0ZSBuZXcgZHJhZnRzIGFuZCBjaGFuZ2VkIGV4aXN0aW5nIFJlc291cmNlcyBiZWZvcmUgbmF2aWdhdGlvbi5cblx0XHQgKlxuXHRcdCAqIEByZXR1cm4ge0hUTUxFbGVtZW50fG51bGx9IEZpcnN0IGludmFsaWQgY29udHJvbCBvciBudWxsLlxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIHZhbGlkYXRlKCkge1xuXHRcdFx0dmFyIGZpcnN0X2ludmFsaWQgPSBudWxsO1xuXG5cdFx0XHRzeW5jX3NlbGVjdGVkX3Jlc291cmNlKCk7XG5cdFx0XHRbXG5cdFx0XHRcdHsgdHlwZTogJ25ldycsIHJlc291cmNlczogZWRpdG9yLm5ld19yZXNvdXJjZXMsIGZpZWxkX2lkOiAnYm9va2luZ19yZXNvdXJjZXMnIH0sXG5cdFx0XHRcdHsgdHlwZTogJ2V4aXN0aW5nJywgcmVzb3VyY2VzOiBlZGl0b3IuZXhpc3RpbmdfcmVzb3VyY2VzLCBmaWVsZF9pZDogJ2V4aXN0aW5nX2Jvb2tpbmdfcmVzb3VyY2VzJyB9XG5cdFx0XHRdLnNvbWUoIGZ1bmN0aW9uICggY29sbGVjdGlvbiApIHtcblx0XHRcdFx0cmV0dXJuIGNvbGxlY3Rpb24ucmVzb3VyY2VzLnNvbWUoIGZ1bmN0aW9uICggcmVzb3VyY2UsIHJlc291cmNlX2luZGV4ICkge1xuXHRcdFx0XHRcdHZhciBiYXNlbGluZSA9ICdleGlzdGluZycgPT09IGNvbGxlY3Rpb24udHlwZSA/IGVkaXRvci5leGlzdGluZ19iYXNlbGluZXNbIHJlc291cmNlX2luZGV4IF0gOiBudWxsO1xuXHRcdFx0XHRcdHZhciBwcmljZSA9IE51bWJlciggcmVzb3VyY2UuYmFzZV9jb3N0ICk7XG5cdFx0XHRcdFx0dmFyIHRpdGxlX21pc3NpbmcgPSAhIFN0cmluZyggcmVzb3VyY2UudGl0bGUgfHwgJycgKS50cmltKCk7XG5cblx0XHRcdFx0XHRpZiAoIGJhc2VsaW5lICYmICEgcmVzb3VyY2VfaXNfZGlydHkoIHJlc291cmNlLCBiYXNlbGluZSApICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoICEgdGl0bGVfbWlzc2luZyAmJiAoICEgZWRpdG9yLnByaWNpbmdfYXZhaWxhYmxlIHx8ICggaXNGaW5pdGUoIHByaWNlICkgJiYgcHJpY2UgPj0gMCApICkgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVkaXRvci5zZWxlY3RlZF90eXBlID0gY29sbGVjdGlvbi50eXBlO1xuXHRcdFx0XHRcdGVkaXRvci5zZWxlY3RlZF9pbmRleCA9IHJlc291cmNlX2luZGV4O1xuXHRcdFx0XHRcdHJlbmRlcl9jYXJkcygpO1xuXHRcdFx0XHRcdGZpcnN0X2ludmFsaWQgPSBnZXRfcmVzb3VyY2VfZmllbGQoIHRpdGxlX21pc3NpbmcgPyAndGl0bGUnIDogJ2Jhc2VfY29zdCcgKTtcblx0XHRcdFx0XHRzaGVsbF9hcGkuc2V0X2ZpZWxkX2Vycm9yKCBjb2xsZWN0aW9uLmZpZWxkX2lkLCB0aXRsZV9taXNzaW5nID8gZ2V0X21lc3NhZ2UoICdyZXNvdXJjZV90aXRsZV9yZXF1aXJlZCcsICdFbnRlciBhIG5hbWUgZm9yIGV2ZXJ5IEJvb2tpbmcgUmVzb3VyY2UuJyApIDogZ2V0X21lc3NhZ2UoICdyZXNvdXJjZV9wcmljZV9pbnZhbGlkJywgJ0VudGVyIGEgdmFsaWQgbm9uLW5lZ2F0aXZlIGJhc2UgY29zdC4nICkgKTtcblxuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9ICk7XG5cdFx0XHR9ICk7XG5cblx0XHRcdHJldHVybiBmaXJzdF9pbnZhbGlkO1xuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRpbml0aWFsaXplOiBpbml0aWFsaXplLFxuXHRcdFx0c3luYzogc3luY19zZWxlY3RlZF9yZXNvdXJjZSxcblx0XHRcdHZhbGlkYXRlOiB2YWxpZGF0ZVxuXHRcdH07XG5cdH1cblxuXHR3aW5kb3cud3BiY19zZXR1cF9lZGl0b3JfbW9kdWxlcyA9IHdpbmRvdy53cGJjX3NldHVwX2VkaXRvcl9tb2R1bGVzIHx8IHt9O1xuXHR3aW5kb3cud3BiY19zZXR1cF9lZGl0b3JfbW9kdWxlcy5ib29raW5nX3Jlc291cmNlcyA9IHsgY3JlYXRlOiBjcmVhdGVfYm9va2luZ19yZXNvdXJjZXNfYWRhcHRlciB9O1xuXHRpZiAoIHdpbmRvdy53cGJjX3NldHVwX3dpemFyZF9hcGkgJiYgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIHdpbmRvdy53cGJjX3NldHVwX3dpemFyZF9hcGkucmVnaXN0ZXJfc3RlcF9hZGFwdGVyICkge1xuXHRcdHdpbmRvdy53cGJjX3NldHVwX3dpemFyZF9hcGkucmVnaXN0ZXJfc3RlcF9hZGFwdGVyKCBjcmVhdGVfYm9va2luZ19yZXNvdXJjZXNfYWRhcHRlciggbW9kdWxlX2NvbmZpZyApICk7XG5cdH1cbn0oIGpRdWVyeSwgd2luZG93LCBkb2N1bWVudCApICk7XG4iXSwibWFwcGluZ3MiOiI7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0UsV0FBV0EsQ0FBQyxFQUFFQyxNQUFNLEVBQUVDLFFBQVEsRUFBRztFQUNsQyxZQUFZOztFQUVaLElBQUlDLGFBQWEsR0FBR0YsTUFBTSxDQUFDRyxtQ0FBbUMsSUFBSTtJQUFFQyxJQUFJLEVBQUUsQ0FB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 |
| 581 |
|