Files
rspade_system/storage-broken/rsx-tmp/babel_50f0fc9efe7b37be76ec4433bd3979b7.js
root 78553d4edf Fix code quality violations for publish
Remove unused blade settings pages not linked from UI
Convert remaining frontend pages to SPA actions
Convert settings user_settings and general to SPA actions
Convert settings profile pages to SPA actions
Convert contacts and projects add/edit pages to SPA actions
Convert clients add/edit page to SPA action with loading pattern
Refactor component scoped IDs from $id to $sid
Fix jqhtml comment syntax and implement universal error component system
Update all application code to use new unified error system
Remove all backwards compatibility - unified error system complete
Phase 5: Remove old response classes
Phase 3-4: Ajax response handler sends new format, old helpers deprecated
Phase 2: Add client-side unified error foundation
Phase 1: Add server-side unified error foundation
Add unified Ajax error response system with constants

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-21 04:35:01 +00:00

254 lines
28 KiB
JavaScript
Executable File

"use strict";
/**
* Sample_Datagrid_Component
*
* Full-featured data table with:
* - Row selection (checkboxes)
* - Pagination
* - Row actions (view, edit, delete)
* - Loading states with placeholders
* - Empty states
*
* Usage:
* <Sample_Datagrid_Component
* $title="Client List"
* $entity_name="clients"
* $selectable=true
* $pagination=true
* $allow_delete=true
* $view_url="/clients/{id}"
* $edit_url="/clients/{id}/edit"
* $api_url="/api/clients"
* $columns=columns_definition
* />
*/
class Sample_Datagrid_Component extends Component {
async on_load() {
const that = this;
// If API URL provided, fetch data
if (that.args.api_url) {
const response = await fetch(that.args.api_url);
that.data = await response.json();
} else {
// Generate sample data for demonstration
that.data = that.generate_sample_data();
}
}
on_ready() {
const that = this;
// Select all checkbox
if (that.args.selectable) {
that.$sid('select_all').on('change', e => {
const checked = e.target.checked;
that.$.find('tbody input[type="checkbox"]').prop('checked', checked);
that.update_selection_count();
});
// Individual row checkboxes
that.$.find('tbody input[type="checkbox"]').on('change', () => {
that.update_selection_count();
});
}
// Delete buttons
if (that.args.allow_delete) {
that.$.find('button[data-id]').on('click', e => {
const $button = $(e.currentTarget);
const id = $button.data('id');
that.confirm_delete(id);
});
}
// Pagination
if (that.args.pagination !== false) {
that.$sid('prev_page').on('click', e => {
e.preventDefault();
that.go_to_page(that.data.pagination.current_page - 1);
});
that.$sid('next_page').on('click', e => {
e.preventDefault();
that.go_to_page(that.data.pagination.current_page + 1);
});
that.$.find('.page-link[data-page]').on('click', e => {
e.preventDefault();
const $link = $(e.currentTarget);
const page = int($link.data('page'));
that.go_to_page(page);
});
}
}
/**
* Update UI to show how many rows are selected
*/
update_selection_count() {
const that = this;
const selected = that.$.find('tbody input[type="checkbox"]:checked').length;
if (selected > 0) {
// Could show a banner: "3 items selected"
console.log(`${selected} items selected`);
// Fire event for parent components to listen to
that.$.trigger('selection:changed', {
count: selected
});
}
}
/**
* Get array of selected IDs
*/
get_selected_ids() {
const that = this;
const ids = [];
that.$.find('tbody input[type="checkbox"]:checked').each((i, checkbox) => {
const $checkbox = $(checkbox);
const id = $checkbox.data('id');
if (id) ids.push(id);
});
return ids;
}
/**
* Clear all selections
*/
clear_selection() {
const that = this;
that.$.find('input[type="checkbox"]').prop('checked', false);
that.update_selection_count();
}
/**
* Confirm deletion of a row
*/
confirm_delete(id) {
const that = this;
// In a real app, show a Bootstrap modal
if (confirm('Are you sure you want to delete this item?')) {
that.delete_row(id);
}
}
/**
* Delete a row (would typically make API call)
*/
async delete_row(id) {
const that = this;
try {
// Make API call
// await fetch(`${that.args.api_url}/${id}`, { method: 'DELETE' });
// Remove row from data
that.data.rows = that.data.rows.filter(row => row.id !== id);
// Re-render component
that.refresh();
// Show success message
console.log(`Deleted item ${id}`);
} catch (error) {
console.error('Delete failed:', error);
alert('Failed to delete item');
}
}
/**
* Navigate to a specific page
*/
async go_to_page(page) {
const that = this;
if (page < 1 || page > that.data.pagination.total_pages) {
return;
}
// Show loading state
that.$.find('tbody').css('opacity', '0.5');
try {
// Fetch new page
const url = `${that.args.api_url}?page=${page}`;
const response = await fetch(url);
that.data = await response.json();
// Re-render
that.refresh();
} catch (error) {
console.error('Pagination failed:', error);
that.$.find('tbody').css('opacity', '1');
}
}
/**
* Refresh the table (reload data and re-render)
*/
async reload_data() {
const that = this;
that.data = {}; // Clear data to show loading state
that.refresh();
await that.on_load();
that.refresh();
}
/**
* Generate sample data for demonstration purposes
*/
generate_sample_data() {
const that = this;
const statuses = [{
label: 'Active',
color: 'success'
}, {
label: 'Pending',
color: 'warning'
}, {
label: 'Inactive',
color: 'secondary'
}, {
label: 'Suspended',
color: 'danger'
}];
const first_names = ['John', 'Sarah', 'Michael', 'Emily', 'David', 'Lisa', 'Robert', 'Jennifer', 'William', 'Amanda'];
const last_names = ['Smith', 'Johnson', 'Brown', 'Garcia', 'Martinez', 'Lee', 'Anderson', 'Thompson', 'White', 'Davis'];
const companies = ['Acme Corp', 'Tech Solutions', 'Global Enterprises', 'Innovation Labs', 'Digital Systems', 'Cloud Services', 'Smart Industries', 'Future Networks', 'Prime Consulting', 'Elite Partners'];
const rows = [];
const count = that.args.showing || 10;
for (let i = 0; i < count; i++) {
const first_name = first_names[Math.floor(Math.random() * first_names.length)];
const last_name = last_names[Math.floor(Math.random() * last_names.length)];
const company = companies[Math.floor(Math.random() * companies.length)];
const status = statuses[Math.floor(Math.random() * statuses.length)];
rows.push({
id: `C${str(i + 1).padStart(3, '0')}`,
name: `${first_name} ${last_name}`,
company: company,
email: `${first_name.toLowerCase()}.${last_name.toLowerCase()}@${company.toLowerCase().replace(/\s+/g, '')}.com`,
phone: `(555) ${str(Math.floor(Math.random() * 900) + 100)}-${str(Math.floor(Math.random() * 9000) + 1000)}`,
status: status.label,
status_color: status.color,
created: that.random_date()
});
}
return {
rows: rows,
pagination: {
current_page: 1,
total_pages: Math.ceil((that.args.total || 100) / count),
from: 1,
to: count,
total: that.args.total || 100,
pages: [1, 2, 3, '...', Math.ceil((that.args.total || 100) / count)]
}
};
}
/**
* Generate random date for sample data
*/
random_date() {
const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
const month = months[Math.floor(Math.random() * 12)];
const day = Math.floor(Math.random() * 28) + 1;
return `${month} ${str(day).padStart(2, '0')}, 2024`;
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTYW1wbGVfRGF0YWdyaWRfQ29tcG9uZW50IiwiSnFodG1sX0NvbXBvbmVudCIsIm9uX2xvYWQiLCJ0aGF0IiwiYXJncyIsImFwaV91cmwiLCJyZXNwb25zZSIsImZldGNoIiwiZGF0YSIsImpzb24iLCJnZW5lcmF0ZV9zYW1wbGVfZGF0YSIsIm9uX3JlYWR5Iiwic2VsZWN0YWJsZSIsIiRpZCIsIm9uIiwiZSIsImNoZWNrZWQiLCJ0YXJnZXQiLCIkIiwiZmluZCIsInByb3AiLCJ1cGRhdGVfc2VsZWN0aW9uX2NvdW50IiwiYWxsb3dfZGVsZXRlIiwiJGJ1dHRvbiIsImN1cnJlbnRUYXJnZXQiLCJpZCIsImNvbmZpcm1fZGVsZXRlIiwicGFnaW5hdGlvbiIsInByZXZlbnREZWZhdWx0IiwiZ29fdG9fcGFnZSIsImN1cnJlbnRfcGFnZSIsIiRsaW5rIiwicGFnZSIsImludCIsInNlbGVjdGVkIiwibGVuZ3RoIiwiY29uc29sZSIsImxvZyIsInRyaWdnZXIiLCJjb3VudCIsImdldF9zZWxlY3RlZF9pZHMiLCJpZHMiLCJlYWNoIiwiaSIsImNoZWNrYm94IiwiJGNoZWNrYm94IiwicHVzaCIsImNsZWFyX3NlbGVjdGlvbiIsImNvbmZpcm0iLCJkZWxldGVfcm93Iiwicm93cyIsImZpbHRlciIsInJvdyIsInJlZnJlc2giLCJlcnJvciIsImFsZXJ0IiwidG90YWxfcGFnZXMiLCJjc3MiLCJ1cmwiLCJyZWxvYWRfZGF0YSIsInN0YXR1c2VzIiwibGFiZWwiLCJjb2xvciIsImZpcnN0X25hbWVzIiwibGFzdF9uYW1lcyIsImNvbXBhbmllcyIsInNob3dpbmciLCJmaXJzdF9uYW1lIiwiTWF0aCIsImZsb29yIiwicmFuZG9tIiwibGFzdF9uYW1lIiwiY29tcGFueSIsInN0YXR1cyIsInN0ciIsInBhZFN0YXJ0IiwibmFtZSIsImVtYWlsIiwidG9Mb3dlckNhc2UiLCJyZXBsYWNlIiwicGhvbmUiLCJzdGF0dXNfY29sb3IiLCJjcmVhdGVkIiwicmFuZG9tX2RhdGUiLCJjZWlsIiwidG90YWwiLCJmcm9tIiwidG8iLCJwYWdlcyIsIm1vbnRocyIsIm1vbnRoIiwiZGF5Il0sInNvdXJjZXMiOlsicnN4L3RoZW1lL2NvbXBvbmVudHMvX2FyY2hpdmVkL3VuZmluaXNoZWQvU2FtcGxlX0RhdGFncmlkX0NvbXBvbmVudC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNhbXBsZV9EYXRhZ3JpZF9Db21wb25lbnRcbiAqXG4gKiBGdWxsLWZlYXR1cmVkIGRhdGEgdGFibGUgd2l0aDpcbiAqIC0gUm93IHNlbGVjdGlvbiAoY2hlY2tib3hlcylcbiAqIC0gUGFnaW5hdGlvblxuICogLSBSb3cgYWN0aW9ucyAodmlldywgZWRpdCwgZGVsZXRlKVxuICogLSBMb2FkaW5nIHN0YXRlcyB3aXRoIHBsYWNlaG9sZGVyc1xuICogLSBFbXB0eSBzdGF0ZXNcbiAqXG4gKiBVc2FnZTpcbiAqIDxTYW1wbGVfRGF0YWdyaWRfQ29tcG9uZW50XG4gKiAgICR0aXRsZT1cIkNsaWVudCBMaXN0XCJcbiAqICAgJGVudGl0eV9uYW1lPVwiY2xpZW50c1wiXG4gKiAgICRzZWxlY3RhYmxlPXRydWVcbiAqICAgJHBhZ2luYXRpb249dHJ1ZVxuICogICAkYWxsb3dfZGVsZXRlPXRydWVcbiAqICAgJHZpZXdfdXJsPVwiL2NsaWVudHMve2lkfVwiXG4gKiAgICRlZGl0X3VybD1cIi9jbGllbnRzL3tpZH0vZWRpdFwiXG4gKiAgICRhcGlfdXJsPVwiL2FwaS9jbGllbnRzXCJcbiAqICAgJGNvbHVtbnM9Y29sdW1uc19kZWZpbml0aW9uXG4gKiAvPlxuICovXG5jbGFzcyBTYW1wbGVfRGF0YWdyaWRfQ29tcG9uZW50IGV4dGVuZHMgSnFodG1sX0NvbXBvbmVudCB7XG5cbiAgYXN5bmMgb25fbG9hZCgpIHtcbiAgICBjb25zdCB0aGF0ID0gdGhpcztcbiAgICAvLyBJZiBBUEkgVVJMIHByb3ZpZGVkLCBmZXRjaCBkYXRhXG4gICAgaWYgKHRoYXQuYXJncy5hcGlfdXJsKSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHRoYXQuYXJncy5hcGlfdXJsKTtcbiAgICAgIHRoYXQuZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gR2VuZXJhdGUgc2FtcGxlIGRhdGEgZm9yIGRlbW9uc3RyYXRpb25cbiAgICAgIHRoYXQuZGF0YSA9IHRoYXQuZ2VuZXJhdGVfc2FtcGxlX2RhdGEoKTtcbiAgICB9XG4gIH1cblxuICBvbl9yZWFkeSgpIHtcbiAgICBjb25zdCB0aGF0ID0gdGhpcztcbiAgICAvLyBTZWxlY3QgYWxsIGNoZWNrYm94XG4gICAgaWYgKHRoYXQuYXJncy5zZWxlY3RhYmxlKSB7XG4gICAgICB0aGF0LiRpZCgnc2VsZWN0X2FsbCcpLm9uKCdjaGFuZ2UnLCAoZSkgPT4ge1xuICAgICAgICBjb25zdCBjaGVja2VkID0gZS50YXJnZXQuY2hlY2tlZDtcbiAgICAgICAgdGhhdC4kLmZpbmQoJ3Rib2R5IGlucHV0W3R5cGU9XCJjaGVja2JveFwiXScpLnByb3AoJ2NoZWNrZWQnLCBjaGVja2VkKTtcbiAgICAgICAgdGhhdC51cGRhdGVfc2VsZWN0aW9uX2NvdW50KCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gSW5kaXZpZHVhbCByb3cgY2hlY2tib3hlc1xuICAgICAgdGhhdC4kLmZpbmQoJ3Rib2R5IGlucHV0W3R5cGU9XCJjaGVja2JveFwiXScpLm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgIHRoYXQudXBkYXRlX3NlbGVjdGlvbl9jb3VudCgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gRGVsZXRlIGJ1dHRvbnNcbiAgICBpZiAodGhhdC5hcmdzLmFsbG93X2RlbGV0ZSkge1xuICAgICAgdGhhdC4kLmZpbmQoJ2J1dHRvbltkYXRhLWlkXScpLm9uKCdjbGljaycsIChlKSA9PiB7XG4gICAgICAgIGNvbnN0ICRidXR0b24gPSAkKGUuY3VycmVudFRhcmdldCk7XG4gICAgICAgIGNvbnN0IGlkID0gJGJ1dHRvbi5kYXRhKCdpZCcpO1xuICAgICAgICB0aGF0LmNvbmZpcm1fZGVsZXRlKGlkKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFBhZ2luYXRpb25cbiAgICBpZiAodGhhdC5hcmdzLnBhZ2luYXRpb24gIT09IGZhbHNlKSB7XG4gICAgICB0aGF0LiRpZCgncHJldl9wYWdlJykub24oJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGF0LmdvX3RvX3BhZ2UodGhhdC5kYXRhLnBhZ2luYXRpb24uY3VycmVudF9wYWdlIC0gMSk7XG4gICAgICB9KTtcblxuICAgICAgdGhhdC4kaWQoJ25leHRfcGFnZScpLm9uKCdjbGljaycsIChlKSA9PiB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhhdC5nb190b19wYWdlKHRoYXQuZGF0YS5wYWdpbmF0aW9uLmN1cnJlbnRfcGFnZSArIDEpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoYXQuJC5maW5kKCcucGFnZS1saW5rW2RhdGEtcGFnZV0nKS5vbignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnN0ICRsaW5rID0gJChlLmN1cnJlbnRUYXJnZXQpO1xuICAgICAgICBjb25zdCBwYWdlID0gaW50KCRsaW5rLmRhdGEoJ3BhZ2UnKSk7XG4gICAgICAgIHRoYXQuZ29fdG9fcGFnZShwYWdlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgVUkgdG8gc2hvdyBob3cgbWFueSByb3dzIGFyZSBzZWxlY3RlZFxuICAgKi9cbiAgdXBkYXRlX3NlbGVjdGlvbl9jb3VudCgpIHtcbiAgICBjb25zdCB0aGF0ID0gdGhpcztcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoYXQuJC5maW5kKCd0Ym9keSBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl06Y2hlY2tlZCcpLmxlbmd0aDtcblxuICAgIGlmIChzZWxlY3RlZCA+IDApIHtcbiAgICAgIC8vIENvdWxkIHNob3cgYSBiYW5uZXI6IFwiMyBpdGVtcyBzZWxlY3RlZFwiXG4gICAgICBjb25zb2xlLmxvZyhgJHtzZWxlY3RlZH0gaXRlbXMgc2VsZWN0ZWRgKTtcblxuICAgICAgLy8gRmlyZSBldmVudCBmb3IgcGFyZW50IGNvbXBvbmVudHMgdG8gbGlzdGVuIHRvXG4gICAgICB0aGF0LiQudHJpZ2dlcignc2VsZWN0aW9uOmNoYW5nZWQnLCB7IGNvdW50OiBzZWxlY3RlZCB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFycmF5IG9mIHNlbGVjdGVkIElEc1xuICAgKi9cbiAgZ2V0X3NlbGVjdGVkX2lkcygpIHtcbiAgICBjb25zdCB0aGF0ID0gdGhpcztcbiAgICBjb25zdCBpZHMgPSBbXTtcbiAgICB0aGF0LiQuZmluZCgndGJvZHkgaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdOmNoZWNrZWQnKS5lYWNoKChpLCBjaGVja2JveCkgPT4ge1xuICAgICAgY29uc3QgJGNoZWNrYm94ID0gJChjaGVja2JveCk7XG4gICAgICBjb25zdCBpZCA9ICRjaGVja2JveC5kYXRhKCdpZCcpO1xuICAgICAgaWYgKGlkKSBpZHMucHVzaChpZCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGlkcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgc2VsZWN0aW9uc1xuICAgKi9cbiAgY2xlYXJfc2VsZWN0aW9uKCkge1xuICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuICAgIHRoYXQuJC5maW5kKCdpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0nKS5wcm9wKCdjaGVja2VkJywgZmFsc2UpO1xuICAgIHRoYXQudXBkYXRlX3NlbGVjdGlvbl9jb3VudCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpcm0gZGVsZXRpb24gb2YgYSByb3dcbiAgICovXG4gIGNvbmZpcm1fZGVsZXRlKGlkKSB7XG4gICAgY29uc3QgdGhhdCA9IHRoaXM7XG4gICAgLy8gSW4gYSByZWFsIGFwcCwgc2hvdyBhIEJvb3RzdHJhcCBtb2RhbFxuICAgIGlmIChjb25maXJtKCdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgaXRlbT8nKSkge1xuICAgICAgdGhhdC5kZWxldGVfcm93KGlkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGEgcm93ICh3b3VsZCB0eXBpY2FsbHkgbWFrZSBBUEkgY2FsbClcbiAgICovXG4gIGFzeW5jIGRlbGV0ZV9yb3coaWQpIHtcbiAgICBjb25zdCB0aGF0ID0gdGhpcztcbiAgICB0cnkge1xuICAgICAgLy8gTWFrZSBBUEkgY2FsbFxuICAgICAgLy8gYXdhaXQgZmV0Y2goYCR7dGhhdC5hcmdzLmFwaV91cmx9LyR7aWR9YCwgeyBtZXRob2Q6ICdERUxFVEUnIH0pO1xuXG4gICAgICAvLyBSZW1vdmUgcm93IGZyb20gZGF0YVxuICAgICAgdGhhdC5kYXRhLnJvd3MgPSB0aGF0LmRhdGEucm93cy5maWx0ZXIocm93ID0+IHJvdy5pZCAhPT0gaWQpO1xuXG4gICAgICAvLyBSZS1yZW5kZXIgY29tcG9uZW50XG4gICAgICB0aGF0LnJlZnJlc2goKTtcblxuICAgICAgLy8gU2hvdyBzdWNjZXNzIG1lc3NhZ2VcbiAgICAgIGNvbnNvbGUubG9nKGBEZWxldGVkIGl0ZW0gJHtpZH1gKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRGVsZXRlIGZhaWxlZDonLCBlcnJvcik7XG4gICAgICBhbGVydCgnRmFpbGVkIHRvIGRlbGV0ZSBpdGVtJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE5hdmlnYXRlIHRvIGEgc3BlY2lmaWMgcGFnZVxuICAgKi9cbiAgYXN5bmMgZ29fdG9fcGFnZShwYWdlKSB7XG4gICAgY29uc3QgdGhhdCA9IHRoaXM7XG4gICAgaWYgKHBhZ2UgPCAxIHx8IHBhZ2UgPiB0aGF0LmRhdGEucGFnaW5hdGlvbi50b3RhbF9wYWdlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNob3cgbG9hZGluZyBzdGF0ZVxuICAgIHRoYXQuJC5maW5kKCd0Ym9keScpLmNzcygnb3BhY2l0eScsICcwLjUnKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBGZXRjaCBuZXcgcGFnZVxuICAgICAgY29uc3QgdXJsID0gYCR7dGhhdC5hcmdzLmFwaV91cmx9P3BhZ2U9JHtwYWdlfWA7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgICB0aGF0LmRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICAgIC8vIFJlLXJlbmRlclxuICAgICAgdGhhdC5yZWZyZXNoKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1BhZ2luYXRpb24gZmFpbGVkOicsIGVycm9yKTtcbiAgICAgIHRoYXQuJC5maW5kKCd0Ym9keScpLmNzcygnb3BhY2l0eScsICcxJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZnJlc2ggdGhlIHRhYmxlIChyZWxvYWQgZGF0YSBhbmQgcmUtcmVuZGVyKVxuICAgKi9cbiAgYXN5bmMgcmVsb2FkX2RhdGEoKSB7XG4gICAgY29uc3QgdGhhdCA9IHRoaXM7XG4gICAgdGhhdC5kYXRhID0ge307IC8vIENsZWFyIGRhdGEgdG8gc2hvdyBsb2FkaW5nIHN0YXRlXG4gICAgdGhhdC5yZWZyZXNoKCk7XG5cbiAgICBhd2FpdCB0aGF0Lm9uX2xvYWQoKTtcbiAgICB0aGF0LnJlZnJlc2goKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBzYW1wbGUgZGF0YSBmb3IgZGVtb25zdHJhdGlvbiBwdXJwb3Nlc1xuICAgKi9cbiAgZ2VuZXJhdGVfc2FtcGxlX2RhdGEoKSB7XG4gICAgY29uc3QgdGhhdCA9IHRoaXM7XG4gICAgY29uc3Qgc3RhdHVzZXMgPSBbXG4gICAgICB7IGxhYmVsOiAnQWN0aXZlJywgY29sb3I6ICdzdWNjZXNzJyB9LFxuICAgICAgeyBsYWJlbDogJ1BlbmRpbmcnLCBjb2xvcjogJ3dhcm5pbmcnIH0sXG4gICAgICB7IGxhYmVsOiAnSW5hY3RpdmUnLCBjb2xvcjogJ3NlY29uZGFyeScgfSxcbiAgICAgIHsgbGFiZWw6ICdTdXNwZW5kZWQnLCBjb2xvcjogJ2RhbmdlcicgfVxuICAgIF07XG5cbiAgICBjb25zdCBmaXJzdF9uYW1lcyA9IFsnSm9obicsICdTYXJhaCcsICdNaWNoYWVsJywgJ0VtaWx5JywgJ0RhdmlkJywgJ0xpc2EnLCAnUm9iZXJ0JywgJ0plbm5pZmVyJywgJ1dpbGxpYW0nLCAnQW1hbmRhJ107XG4gICAgY29uc3QgbGFzdF9uYW1lcyA9IFsnU21pdGgnLCAnSm9obnNvbicsICdCcm93bicsICdHYXJjaWEnLCAnTWFydGluZXonLCAnTGVlJywgJ0FuZGVyc29uJywgJ1Rob21wc29uJywgJ1doaXRlJywgJ0RhdmlzJ107XG4gICAgY29uc3QgY29tcGFuaWVzID0gWydBY21lIENvcnAnLCAnVGVjaCBTb2x1dGlvbnMnLCAnR2xvYmFsIEVudGVycHJpc2VzJywgJ0lubm92YXRpb24gTGFicycsICdEaWdpdGFsIFN5c3RlbXMnLCAnQ2xvdWQgU2VydmljZXMnLCAnU21hcnQgSW5kdXN0cmllcycsICdGdXR1cmUgTmV0d29ya3MnLCAnUHJpbWUgQ29uc3VsdGluZycsICdFbGl0ZSBQYXJ0bmVycyddO1xuXG4gICAgY29uc3Qgcm93cyA9IFtdO1xuICAgIGNvbnN0IGNvdW50ID0gdGhhdC5hcmdzLnNob3dpbmcgfHwgMTA7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IGZpcnN0X25hbWUgPSBmaXJzdF9uYW1lc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBmaXJzdF9uYW1lcy5sZW5ndGgpXTtcbiAgICAgIGNvbnN0IGxhc3RfbmFtZSA9IGxhc3RfbmFtZXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbGFzdF9uYW1lcy5sZW5ndGgpXTtcbiAgICAgIGNvbnN0IGNvbXBhbnkgPSBjb21wYW5pZXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY29tcGFuaWVzLmxlbmd0aCldO1xuICAgICAgY29uc3Qgc3RhdHVzID0gc3RhdHVzZXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogc3RhdHVzZXMubGVuZ3RoKV07XG5cbiAgICAgIHJvd3MucHVzaCh7XG4gICAgICAgIGlkOiBgQyR7c3RyKGkgKyAxKS5wYWRTdGFydCgzLCAnMCcpfWAsXG4gICAgICAgIG5hbWU6IGAke2ZpcnN0X25hbWV9ICR7bGFzdF9uYW1lfWAsXG4gICAgICAgIGNvbXBhbnk6IGNvbXBhbnksXG4gICAgICAgIGVtYWlsOiBgJHtmaXJzdF9uYW1lLnRvTG93ZXJDYXNlKCl9LiR7bGFzdF9uYW1lLnRvTG93ZXJDYXNlKCl9QCR7Y29tcGFueS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccysvZywgJycpfS5jb21gLFxuICAgICAgICBwaG9uZTogYCg1NTUpICR7c3RyKE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDkwMCkgKyAxMDApfS0ke3N0cihNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA5MDAwKSArIDEwMDApfWAsXG4gICAgICAgIHN0YXR1czogc3RhdHVzLmxhYmVsLFxuICAgICAgICBzdGF0dXNfY29sb3I6IHN0YXR1cy5jb2xvcixcbiAgICAgICAgY3JlYXRlZDogdGhhdC5yYW5kb21fZGF0ZSgpXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcm93czogcm93cyxcbiAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgY3VycmVudF9wYWdlOiAxLFxuICAgICAgICB0b3RhbF9wYWdlczogTWF0aC5jZWlsKCh0aGF0LmFyZ3MudG90YWwgfHwgMTAwKSAvIGNvdW50KSxcbiAgICAgICAgZnJvbTogMSxcbiAgICAgICAgdG86IGNvdW50LFxuICAgICAgICB0b3RhbDogdGhhdC5hcmdzLnRvdGFsIHx8IDEwMCxcbiAgICAgICAgcGFnZXM6IFsxLCAyLCAzLCAnLi4uJywgTWF0aC5jZWlsKCh0aGF0LmFyZ3MudG90YWwgfHwgMTAwKSAvIGNvdW50KV1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIHJhbmRvbSBkYXRlIGZvciBzYW1wbGUgZGF0YVxuICAgKi9cbiAgcmFuZG9tX2RhdGUoKSB7XG4gICAgY29uc3QgbW9udGhzID0gWydKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsICdKdWwnLCAnQXVnJywgJ1NlcCcsICdPY3QnLCAnTm92JywgJ0RlYyddO1xuICAgIGNvbnN0IG1vbnRoID0gbW9udGhzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEyKV07XG4gICAgY29uc3QgZGF5ID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMjgpICsgMTtcbiAgICByZXR1cm4gYCR7bW9udGh9ICR7c3RyKGRheSkucGFkU3RhcnQoMiwgJzAnKX0sIDIwMjRgO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU1BLHlCQUF5QixTQUFTQyxnQkFBZ0IsQ0FBQztFQUV2RCxNQUFNQyxPQUFPQSxDQUFBLEVBQUc7SUFDZCxNQUFNQyxJQUFJLEdBQUcsSUFBSTtJQUNqQjtJQUNBLElBQUlBLElBQUksQ0FBQ0MsSUFBSSxDQUFDQyxPQUFPLEVBQUU7TUFDckIsTUFBTUMsUUFBUSxHQUFHLE1BQU1DLEtBQUssQ0FBQ0osSUFBSSxDQUFDQyxJQUFJLENBQUNDLE9BQU8sQ0FBQztNQUMvQ0YsSUFBSSxDQUFDSyxJQUFJLEdBQUcsTUFBTUYsUUFBUSxDQUFDRyxJQUFJLENBQUMsQ0FBQztJQUNuQyxDQUFDLE1BQU07TUFDTDtNQUNBTixJQUFJLENBQUNLLElBQUksR0FBR0wsSUFBSSxDQUFDTyxvQkFBb0IsQ0FBQyxDQUFDO0lBQ3pDO0VBQ0Y7RUFFQUMsUUFBUUEsQ0FBQSxFQUFHO0lBQ1QsTUFBTVIsSUFBSSxHQUFHLElBQUk7SUFDakI7SUFDQSxJQUFJQSxJQUFJLENBQUNDLElBQUksQ0FBQ1EsVUFBVSxFQUFFO01BQ3hCVCxJQUFJLENBQUNVLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQ0MsRUFBRSxDQUFDLFFBQVEsRUFBR0MsQ0FBQyxJQUFLO1FBQ3pDLE1BQU1DLE9BQU8sR0FBR0QsQ0FBQyxDQUFDRSxNQUFNLENBQUNELE9BQU87UUFDaENiLElBQUksQ0FBQ2UsQ0FBQyxDQUFDQyxJQUFJLENBQUMsOEJBQThCLENBQUMsQ0FBQ0MsSUFBSSxDQUFDLFNBQVMsRUFBRUosT0FBTyxDQUFDO1FBQ3BFYixJQUFJLENBQUNrQixzQkFBc0IsQ0FBQyxDQUFDO01BQy9CLENBQUMsQ0FBQzs7TUFFRjtNQUNBbEIsSUFBSSxDQUFDZSxDQUFDLENBQUNDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDTCxFQUFFLENBQUMsUUFBUSxFQUFFLE1BQU07UUFDN0RYLElBQUksQ0FBQ2tCLHNCQUFzQixDQUFDLENBQUM7TUFDL0IsQ0FBQyxDQUFDO0lBQ0o7O0lBRUE7SUFDQSxJQUFJbEIsSUFBSSxDQUFDQyxJQUFJLENBQUNrQixZQUFZLEVBQUU7TUFDMUJuQixJQUFJLENBQUNlLENBQUMsQ0FBQ0MsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUNMLEVBQUUsQ0FBQyxPQUFPLEVBQUdDLENBQUMsSUFBSztRQUNoRCxNQUFNUSxPQUFPLEdBQUdMLENBQUMsQ0FBQ0gsQ0FBQyxDQUFDUyxhQUFhLENBQUM7UUFDbEMsTUFBTUMsRUFBRSxHQUFHRixPQUFPLENBQUNmLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDN0JMLElBQUksQ0FBQ3VCLGNBQWMsQ0FBQ0QsRUFBRSxDQUFDO01BQ3pCLENBQUMsQ0FBQztJQUNKOztJQUVBO0lBQ0EsSUFBSXRCLElBQUksQ0FBQ0MsSUFBSSxDQUFDdUIsVUFBVSxLQUFLLEtBQUssRUFBRTtNQUNsQ3hCLElBQUksQ0FBQ1UsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDQyxFQUFFLENBQUMsT0FBTyxFQUFHQyxDQUFDLElBQUs7UUFDdkNBLENBQUMsQ0FBQ2EsY0FBYyxDQUFDLENBQUM7UUFDbEJ6QixJQUFJLENBQUMwQixVQUFVLENBQUMxQixJQUFJLENBQUNLLElBQUksQ0FBQ21CLFVBQVUsQ0FBQ0csWUFBWSxHQUFHLENBQUMsQ0FBQztNQUN4RCxDQUFDLENBQUM7TUFFRjNCLElBQUksQ0FBQ1UsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDQyxFQUFFLENBQUMsT0FBTyxFQUFHQyxDQUFDLElBQUs7UUFDdkNBLENBQUMsQ0FBQ2EsY0FBYyxDQUFDLENBQUM7UUFDbEJ6QixJQUFJLENBQUMwQixVQUFVLENBQUMxQixJQUFJLENBQUNLLElBQUksQ0FBQ21CLFVBQVUsQ0FBQ0csWUFBWSxHQUFHLENBQUMsQ0FBQztNQUN4RCxDQUFDLENBQUM7TUFFRjNCLElBQUksQ0FBQ2UsQ0FBQyxDQUFDQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQ0wsRUFBRSxDQUFDLE9BQU8sRUFBR0MsQ0FBQyxJQUFLO1FBQ3REQSxDQUFDLENBQUNhLGNBQWMsQ0FBQyxDQUFDO1FBQ2xCLE1BQU1HLEtBQUssR0FBR2IsQ0FBQyxDQUFDSCxDQUFDLENBQUNTLGFBQWEsQ0FBQztRQUNoQyxNQUFNUSxJQUFJLEdBQUdDLEdBQUcsQ0FBQ0YsS0FBSyxDQUFDdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BDTCxJQUFJLENBQUMwQixVQUFVLENBQUNHLElBQUksQ0FBQztNQUN2QixDQUFDLENBQUM7SUFDSjtFQUNGOztFQUVBO0FBQ0Y7QUFDQTtFQUNFWCxzQkFBc0JBLENBQUEsRUFBRztJQUN2QixNQUFNbEIsSUFBSSxHQUFHLElBQUk7SUFDakIsTUFBTStCLFFBQVEsR0FBRy9CLElBQUksQ0FBQ2UsQ0FBQyxDQUFDQyxJQUFJLENBQUMsc0NBQXNDLENBQUMsQ0FBQ2dCLE1BQU07SUFFM0UsSUFBSUQsUUFBUSxHQUFHLENBQUMsRUFBRTtNQUNoQjtNQUNBRSxPQUFPLENBQUNDLEdBQUcsQ0FBQyxHQUFHSCxRQUFRLGlCQUFpQixDQUFDOztNQUV6QztNQUNBL0IsSUFBSSxDQUFDZSxDQUFDLENBQUNvQixPQUFPLENBQUMsbUJBQW1CLEVBQUU7UUFBRUMsS0FBSyxFQUFFTDtNQUFTLENBQUMsQ0FBQztJQUMxRDtFQUNGOztFQUVBO0FBQ0Y7QUFDQTtFQUNFTSxnQkFBZ0JBLENBQUEsRUFBRztJQUNqQixNQUFNckMsSUFBSSxHQUFHLElBQUk7SUFDakIsTUFBTXNDLEdBQUcsR0FBRyxFQUFFO0lBQ2R0QyxJQUFJLENBQUNlLENBQUMsQ0FBQ0MsSUFBSSxDQUFDLHNDQUFzQyxDQUFDLENBQUN1QixJQUFJLENBQUMsQ0FBQ0MsQ0FBQyxFQUFFQyxRQUFRLEtBQUs7TUFDeEUsTUFBTUMsU0FBUyxHQUFHM0IsQ0FBQyxDQUFDMEIsUUFBUSxDQUFDO01BQzdCLE1BQU1uQixFQUFFLEdBQUdvQixTQUFTLENBQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDO01BQy9CLElBQUlpQixFQUFFLEVBQUVnQixHQUFHLENBQUNLLElBQUksQ0FBQ3JCLEVBQUUsQ0FBQztJQUN0QixDQUFDLENBQUM7SUFDRixPQUFPZ0IsR0FBRztFQUNaOztFQUVBO0FBQ0Y7QUFDQTtFQUNFTSxlQUFlQSxDQUFBLEVBQUc7SUFDaEIsTUFBTTVDLElBQUksR0FBRyxJQUFJO0lBQ2pCQSxJQUFJLENBQUNlLENBQUMsQ0FBQ0MsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUNDLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDO0lBQzVEakIsSUFBSSxDQUFDa0Isc0JBQXNCLENBQUMsQ0FBQztFQUMvQjs7RUFFQTtBQUNGO0FBQ0E7RUFDRUssY0FBY0EsQ0FBQ0QsRUFBRSxFQUFFO0lBQ2pCLE1BQU10QixJQUFJLEdBQUcsSUFBSTtJQUNqQjtJQUNBLElBQUk2QyxPQUFPLENBQUMsNENBQTRDLENBQUMsRUFBRTtNQUN6RDdDLElBQUksQ0FBQzhDLFVBQVUsQ0FBQ3hCLEVBQUUsQ0FBQztJQUNyQjtFQUNGOztFQUVBO0FBQ0Y7QUFDQTtFQUNFLE1BQU13QixVQUFVQSxDQUFDeEIsRUFBRSxFQUFFO0lBQ25CLE1BQU10QixJQUFJLEdBQUcsSUFBSTtJQUNqQixJQUFJO01BQ0Y7TUFDQTs7TUFFQTtNQUNBQSxJQUFJLENBQUNLLElBQUksQ0FBQzBDLElBQUksR0FBRy9DLElBQUksQ0FBQ0ssSUFBSSxDQUFDMEMsSUFBSSxDQUFDQyxNQUFNLENBQUNDLEdBQUcsSUFBSUEsR0FBRyxDQUFDM0IsRUFBRSxLQUFLQSxFQUFFLENBQUM7O01BRTVEO01BQ0F0QixJQUFJLENBQUNrRCxPQUFPLENBQUMsQ0FBQzs7TUFFZDtNQUNBakIsT0FBTyxDQUFDQyxHQUFHLENBQUMsZ0JBQWdCWixFQUFFLEVBQUUsQ0FBQztJQUNuQyxDQUFDLENBQUMsT0FBTzZCLEtBQUssRUFBRTtNQUNkbEIsT0FBTyxDQUFDa0IsS0FBSyxDQUFDLGdCQUFnQixFQUFFQSxLQUFLLENBQUM7TUFDdENDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQztJQUNoQztFQUNGOztFQUVBO0FBQ0Y7QUFDQTtFQUNFLE1BQU0xQixVQUFVQSxDQUFDRyxJQUFJLEVBQUU7SUFDckIsTUFBTTdCLElBQUksR0FBRyxJQUFJO0lBQ2pCLElBQUk2QixJQUFJLEdBQUcsQ0FBQyxJQUFJQSxJQUFJLEdBQUc3QixJQUFJLENBQUNLLElBQUksQ0FBQ21CLFVBQVUsQ0FBQzZCLFdBQVcsRUFBRTtNQUN2RDtJQUNGOztJQUVBO0lBQ0FyRCxJQUFJLENBQUNlLENBQUMsQ0FBQ0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDc0MsR0FBRyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUM7SUFFMUMsSUFBSTtNQUNGO01BQ0EsTUFBTUMsR0FBRyxHQUFHLEdBQUd2RCxJQUFJLENBQUNDLElBQUksQ0FBQ0MsT0FBTyxTQUFTMkIsSUFBSSxFQUFFO01BQy9DLE1BQU0xQixRQUFRLEdBQUcsTUFBTUMsS0FBSyxDQUFDbUQsR0FBRyxDQUFDO01BQ2pDdkQsSUFBSSxDQUFDSyxJQUFJLEdBQUcsTUFBTUYsUUFBUSxDQUFDRyxJQUFJLENBQUMsQ0FBQzs7TUFFakM7TUFDQU4sSUFBSSxDQUFDa0QsT0FBTyxDQUFDLENBQUM7SUFDaEIsQ0FBQyxDQUFDLE9BQU9DLEtBQUssRUFBRTtNQUNkbEIsT0FBTyxDQUFDa0IsS0FBSyxDQUFDLG9CQUFvQixFQUFFQSxLQUFLLENBQUM7TUFDMUNuRCxJQUFJLENBQUNlLENBQUMsQ0FBQ0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDc0MsR0FBRyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUM7SUFDMUM7RUFDRjs7RUFFQTtBQUNGO0FBQ0E7RUFDRSxNQUFNRSxXQUFXQSxDQUFBLEVBQUc7SUFDbEIsTUFBTXhELElBQUksR0FBRyxJQUFJO0lBQ2pCQSxJQUFJLENBQUNLLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hCTCxJQUFJLENBQUNrRCxPQUFPLENBQUMsQ0FBQztJQUVkLE1BQU1sRCxJQUFJLENBQUNELE9BQU8sQ0FBQyxDQUFDO0lBQ3BCQyxJQUFJLENBQUNrRCxPQUFPLENBQUMsQ0FBQztFQUNoQjs7RUFFQTtBQUNGO0FBQ0E7RUFDRTNDLG9CQUFvQkEsQ0FBQSxFQUFHO0lBQ3JCLE1BQU1QLElBQUksR0FBRyxJQUFJO0lBQ2pCLE1BQU15RCxRQUFRLEdBQUcsQ0FDZjtNQUFFQyxLQUFLLEVBQUUsUUFBUTtNQUFFQyxLQUFLLEVBQUU7SUFBVSxDQUFDLEVBQ3JDO01BQUVELEtBQUssRUFBRSxTQUFTO01BQUVDLEtBQUssRUFBRTtJQUFVLENBQUMsRUFDdEM7TUFBRUQsS0FBSyxFQUFFLFVBQVU7TUFBRUMsS0FBSyxFQUFFO0lBQVksQ0FBQyxFQUN6QztNQUFFRCxLQUFLLEVBQUUsV0FBVztNQUFFQyxLQUFLLEVBQUU7SUFBUyxDQUFDLENBQ3hDO0lBRUQsTUFBTUMsV0FBVyxHQUFHLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDO0lBQ3JILE1BQU1DLFVBQVUsR0FBRyxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQztJQUN2SCxNQUFNQyxTQUFTLEdBQUcsQ0FBQyxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsb0JBQW9CLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLENBQUM7SUFFNU0sTUFBTWYsSUFBSSxHQUFHLEVBQUU7SUFDZixNQUFNWCxLQUFLLEdBQUdwQyxJQUFJLENBQUNDLElBQUksQ0FBQzhELE9BQU8sSUFBSSxFQUFFO0lBRXJDLEtBQUssSUFBSXZCLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR0osS0FBSyxFQUFFSSxDQUFDLEVBQUUsRUFBRTtNQUM5QixNQUFNd0IsVUFBVSxHQUFHSixXQUFXLENBQUNLLElBQUksQ0FBQ0MsS0FBSyxDQUFDRCxJQUFJLENBQUNFLE1BQU0sQ0FBQyxDQUFDLEdBQUdQLFdBQVcsQ0FBQzVCLE1BQU0sQ0FBQyxDQUFDO01BQzlFLE1BQU1vQyxTQUFTLEdBQUdQLFVBQVUsQ0FBQ0ksSUFBSSxDQUFDQyxLQUFLLENBQUNELElBQUksQ0FBQ0UsTUFBTSxDQUFDLENBQUMsR0FBR04sVUFBVSxDQUFDN0IsTUFBTSxDQUFDLENBQUM7TUFDM0UsTUFBTXFDLE9BQU8sR0FBR1AsU0FBUyxDQUFDRyxJQUFJLENBQUNDLEtBQUssQ0FBQ0QsSUFBSSxDQUFDRSxNQUFNLENBQUMsQ0FBQyxHQUFHTCxTQUFTLENBQUM5QixNQUFNLENBQUMsQ0FBQztNQUN2RSxNQUFNc0MsTUFBTSxHQUFHYixRQUFRLENBQUNRLElBQUksQ0FBQ0MsS0FBSyxDQUFDRCxJQUFJLENBQUNFLE1BQU0sQ0FBQyxDQUFDLEdBQUdWLFFBQVEsQ0FBQ3pCLE1BQU0sQ0FBQyxDQUFDO01BRXBFZSxJQUFJLENBQUNKLElBQUksQ0FBQztRQUNSckIsRUFBRSxFQUFFLElBQUlpRCxHQUFHLENBQUMvQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUNnQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFO1FBQ3JDQyxJQUFJLEVBQUUsR0FBR1QsVUFBVSxJQUFJSSxTQUFTLEVBQUU7UUFDbENDLE9BQU8sRUFBRUEsT0FBTztRQUNoQkssS0FBSyxFQUFFLEdBQUdWLFVBQVUsQ0FBQ1csV0FBVyxDQUFDLENBQUMsSUFBSVAsU0FBUyxDQUFDTyxXQUFXLENBQUMsQ0FBQyxJQUFJTixPQUFPLENBQUNNLFdBQVcsQ0FBQyxDQUFDLENBQUNDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU07UUFDaEhDLEtBQUssRUFBRSxTQUFTTixHQUFHLENBQUNOLElBQUksQ0FBQ0MsS0FBSyxDQUFDRCxJQUFJLENBQUNFLE1BQU0sQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUlJLEdBQUcsQ0FBQ04sSUFBSSxDQUFDQyxLQUFLLENBQUNELElBQUksQ0FBQ0UsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRTtRQUM1R0csTUFBTSxFQUFFQSxNQUFNLENBQUNaLEtBQUs7UUFDcEJvQixZQUFZLEVBQUVSLE1BQU0sQ0FBQ1gsS0FBSztRQUMxQm9CLE9BQU8sRUFBRS9FLElBQUksQ0FBQ2dGLFdBQVcsQ0FBQztNQUM1QixDQUFDLENBQUM7SUFDSjtJQUVBLE9BQU87TUFDTGpDLElBQUksRUFBRUEsSUFBSTtNQUNWdkIsVUFBVSxFQUFFO1FBQ1ZHLFlBQVksRUFBRSxDQUFDO1FBQ2YwQixXQUFXLEVBQUVZLElBQUksQ0FBQ2dCLElBQUksQ0FBQyxDQUFDakYsSUFBSSxDQUFDQyxJQUFJLENBQUNpRixLQUFLLElBQUksR0FBRyxJQUFJOUMsS0FBSyxDQUFDO1FBQ3hEK0MsSUFBSSxFQUFFLENBQUM7UUFDUEMsRUFBRSxFQUFFaEQsS0FBSztRQUNUOEMsS0FBSyxFQUFFbEYsSUFBSSxDQUFDQyxJQUFJLENBQUNpRixLQUFLLElBQUksR0FBRztRQUM3QkcsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFcEIsSUFBSSxDQUFDZ0IsSUFBSSxDQUFDLENBQUNqRixJQUFJLENBQUNDLElBQUksQ0FBQ2lGLEtBQUssSUFBSSxHQUFHLElBQUk5QyxLQUFLLENBQUM7TUFDckU7SUFDRixDQUFDO0VBQ0g7O0VBRUE7QUFDRjtBQUNBO0VBQ0U0QyxXQUFXQSxDQUFBLEVBQUc7SUFDWixNQUFNTSxNQUFNLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQztJQUNuRyxNQUFNQyxLQUFLLEdBQUdELE1BQU0sQ0FBQ3JCLElBQUksQ0FBQ0MsS0FBSyxDQUFDRCxJQUFJLENBQUNFLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDcEQsTUFBTXFCLEdBQUcsR0FBR3ZCLElBQUksQ0FBQ0MsS0FBSyxDQUFDRCxJQUFJLENBQUNFLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQztJQUM5QyxPQUFPLEdBQUdvQixLQUFLLElBQUloQixHQUFHLENBQUNpQixHQUFHLENBQUMsQ0FBQ2hCLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLFFBQVE7RUFDdEQ7QUFDRiIsImlnbm9yZUxpc3QiOltdfQ==