Standardize settings file naming and relocate documentation files Fix code quality violations from rsx:check Reorganize user_management directory into logical subdirectories Move Quill Bundle to core and align with Tom Select pattern Simplify Site Settings page to focus on core site information Complete Phase 5: Multi-tenant authentication with login flow and site selection Add route query parameter rule and synchronize filename validation logic Fix critical bug in UpdateNpmCommand causing missing JavaScript stubs Implement filename convention rule and resolve VS Code auto-rename conflict Implement js-sanitizer RPC server to eliminate 900+ Node.js process spawns Implement RPC server architecture for JavaScript parsing WIP: Add RPC server infrastructure for JS parsing (partial implementation) Update jqhtml terminology from destroy to stop, fix datagrid DOM preservation Add JQHTML-CLASS-01 rule and fix redundant class names Improve code quality rules and resolve violations Remove legacy fatal error format in favor of unified 'fatal' error type Filter internal keys from window.rsxapp output Update button styling and comprehensive form/modal documentation Add conditional fly-in animation for modals Fix non-deterministic bundle compilation 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
254 lines
28 KiB
JavaScript
Executable File
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 Jqhtml_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.$id('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.$id('prev_page').on('click', e => {
|
|
e.preventDefault();
|
|
that.go_to_page(that.data.pagination.current_page - 1);
|
|
});
|
|
that.$id('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+IHJvdy5pZCAhPT0gaWQpO1xuXG4gICAgICAvLyBSZS1yZW5kZXIgY29tcG9uZW50XG4gICAgICB0aGF0LnJlZnJlc2goKTtcblxuICAgICAgLy8gU2hvdyBzdWNjZXNzIG1lc3NhZ2VcbiAgICAgIGNvbnNvbGUubG9nKGBEZWxldGVkIGl0ZW0gJHtpZH1gKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRGVsZXRlIGZhaWxlZDonLCBlcnJvcik7XG4gICAgICBhbGVydCgnRmFpbGVkIHRvIGRlbGV0ZSBpdGVtJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE5hdmlnYXRlIHRvIGEgc3BlY2lmaWMgcGFnZVxuICAgKi9cbiAgYXN5bmMgZ29fdG9fcGFnZShwYWdlKSB7XG4gICAgY29uc3QgdGhhdCA9IHRoaXM7XG4gICAgaWYgKHBhZ2UgPCAxIHx8IHBhZ2UgPiB0aGF0LmRhdGEucGFnaW5hdGlvbi50b3RhbF9wYWdlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNob3cgbG9hZGluZyBzdGF0ZVxuICAgIHRoYXQuJC5maW5kKCd0Ym9keScpLmNzcygnb3BhY2l0eScsICcwLjUnKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBGZXRjaCBuZXcgcGFnZVxuICAgICAgY29uc3QgdXJsID0gYCR7dGhhdC5hcmdzLmFwaV91cmx9P3BhZ2U9JHtwYWdlfWA7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgICB0aGF0LmRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICAgIC8vIFJlLXJlbmRlclxuICAgICAgdGhhdC5yZWZyZXNoKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1BhZ2luYXRpb24gZmFpbGVkOicsIGVycm9yKTtcbiAgICAgIHRoYXQuJC5maW5kKCd0Ym9keScpLmNzcygnb3BhY2l0eScsICcxJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZnJlc2ggdGhlIHRhYmxlIChyZWxvYWQgZGF0YSBhbmQgcmUtcmVuZGVyKVxuICAgKi9cbiAgYXN5bmMgcmVsb2FkX2RhdGEoKSB7XG4gICAgY29uc3QgdGhhdCA9IHRoaXM7XG4gICAgdGhhdC5kYXRhID0ge307IC8vIENsZWFyIGRhdGEgdG8gc2hvdyBsb2FkaW5nIHN0YXRlXG4gICAgdGhhdC5yZWZyZXNoKCk7XG5cbiAgICBhd2FpdCB0aGF0Lm9uX2xvYWQoKTtcbiAgICB0aGF0LnJlZnJlc2goKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBzYW1wbGUgZGF0YSBmb3IgZGVtb25zdHJhdGlvbiBwdXJwb3Nlc1xuICAgKi9cbiAgZ2VuZXJhdGVfc2FtcGxlX2RhdGEoKSB7XG4gICAgY29uc3QgdGhhdCA9IHRoaXM7XG4gICAgY29uc3Qgc3RhdHVzZXMgPSBbXG4gICAgICB7IGxhYmVsOiAnQWN0aXZlJywgY29sb3I6ICdzdWNjZXNzJyB9LFxuICAgICAgeyBsYWJlbDogJ1BlbmRpbmcnLCBjb2xvcjogJ3dhcm5pbmcnIH0sXG4gICAgICB7IGxhYmVsOiAnSW5hY3RpdmUnLCBjb2xvcjogJ3NlY29uZGFyeScgfSxcbiAgICAgIHsgbGFiZWw6ICdTdXNwZW5kZWQnLCBjb2xvcjogJ2RhbmdlcicgfVxuICAgIF07XG5cbiAgICBjb25zdCBmaXJzdF9uYW1lcyA9IFsnSm9obicsICdTYXJhaCcsICdNaWNoYWVsJywgJ0VtaWx5JywgJ0RhdmlkJywgJ0xpc2EnLCAnUm9iZXJ0JywgJ0plbm5pZmVyJywgJ1dpbGxpYW0nLCAnQW1hbmRhJ107XG4gICAgY29uc3QgbGFzdF9uYW1lcyA9IFsnU21pdGgnLCAnSm9obnNvbicsICdCcm93bicsICdHYXJjaWEnLCAnTWFydGluZXonLCAnTGVlJywgJ0FuZGVyc29uJywgJ1Rob21wc29uJywgJ1doaXRlJywgJ0RhdmlzJ107XG4gICAgY29uc3QgY29tcGFuaWVzID0gWydBY21lIENvcnAnLCAnVGVjaCBTb2x1dGlvbnMnLCAnR2xvYmFsIEVudGVycHJpc2VzJywgJ0lubm92YXRpb24gTGFicycsICdEaWdpdGFsIFN5c3RlbXMnLCAnQ2xvdWQgU2VydmljZXMnLCAnU21hcnQgSW5kdXN0cmllcycsICdGdXR1cmUgTmV0d29ya3MnLCAnUHJpbWUgQ29uc3VsdGluZycsICdFbGl0ZSBQYXJ0bmVycyddO1xuXG4gICAgY29uc3Qgcm93cyA9IFtdO1xuICAgIGNvbnN0IGNvdW50ID0gdGhhdC5hcmdzLnNob3dpbmcgfHwgMTA7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IGZpcnN0X25hbWUgPSBmaXJzdF9uYW1lc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBmaXJzdF9uYW1lcy5sZW5ndGgpXTtcbiAgICAgIGNvbnN0IGxhc3RfbmFtZSA9IGxhc3RfbmFtZXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbGFzdF9uYW1lcy5sZW5ndGgpXTtcbiAgICAgIGNvbnN0IGNvbXBhbnkgPSBjb21wYW5pZXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY29tcGFuaWVzLmxlbmd0aCldO1xuICAgICAgY29uc3Qgc3RhdHVzID0gc3RhdHVzZXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogc3RhdHVzZXMubGVuZ3RoKV07XG5cbiAgICAgIHJvd3MucHVzaCh7XG4gICAgICAgIGlkOiBgQyR7c3RyKGkgKyAxKS5wYWRTdGFydCgzLCAnMCcpfWAsXG4gICAgICAgIG5hbWU6IGAke2ZpcnN0X25hbWV9ICR7bGFzdF9uYW1lfWAsXG4gICAgICAgIGNvbXBhbnk6IGNvbXBhbnksXG4gICAgICAgIGVtYWlsOiBgJHtmaXJzdF9uYW1lLnRvTG93ZXJDYXNlKCl9LiR7bGFzdF9uYW1lLnRvTG93ZXJDYXNlKCl9QCR7Y29tcGFueS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccysvZywgJycpfS5jb21gLFxuICAgICAgICBwaG9uZTogYCg1NTUpICR7c3RyKE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDkwMCkgKyAxMDApfS0ke3N0cihNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA5MDAwKSArIDEwMDApfWAsXG4gICAgICAgIHN0YXR1czogc3RhdHVzLmxhYmVsLFxuICAgICAgICBzdGF0dXNfY29sb3I6IHN0YXR1cy5jb2xvcixcbiAgICAgICAgY3JlYXRlZDogdGhhdC5yYW5kb21fZGF0ZSgpXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcm93czogcm93cyxcbiAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgY3VycmVudF9wYWdlOiAxLFxuICAgICAgICB0b3RhbF9wYWdlczogTWF0aC5jZWlsKCh0aGF0LmFyZ3MudG90YWwgfHwgMTAwKSAvIGNvdW50KSxcbiAgICAgICAgZnJvbTogMSxcbiAgICAgICAgdG86IGNvdW50LFxuICAgICAgICB0b3RhbDogdGhhdC5hcmdzLnRvdGFsIHx8IDEwMCxcbiAgICAgICAgcGFnZXM6IFsxLCAyLCAzLCAnLi4uJywgTWF0aC5jZWlsKCh0aGF0LmFyZ3MudG90YWwgfHwgMTAwKSAvIGNvdW50KV1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIHJhbmRvbSBkYXRlIGZvciBzYW1wbGUgZGF0YVxuICAgKi9cbiAgcmFuZG9tX2RhdGUoKSB7XG4gICAgY29uc3QgbW9udGhzID0gWydKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsICdKdWwnLCAnQXVnJywgJ1NlcCcsICdPY3QnLCAnTm92JywgJ0RlYyddO1xuICAgIGNvbnN0IG1vbnRoID0gbW9udGhzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEyKV07XG4gICAgY29uc3QgZGF5ID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMjgpICsgMTtcbiAgICByZXR1cm4gYCR7bW9udGh9ICR7c3RyKGRheSkucGFkU3RhcnQoMiwgJzAnKX0sIDIwMjRgO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU1BLHlCQUF5QixTQUFTQyxnQkFBZ0IsQ0FBQztFQUV2RCxNQUFNQyxPQUFPQSxDQUFBLEVBQUc7SUFDZCxNQUFNQyxJQUFJLEdBQUcsSUFBSTtJQUNqQjtJQUNBLElBQUlBLElBQUksQ0FBQ0MsSUFBSSxDQUFDQyxPQUFPLEVBQUU7TUFDckIsTUFBTUMsUUFBUSxHQUFHLE1BQU1DLEtBQUssQ0FBQ0osSUFBSSxDQUFDQyxJQUFJLENBQUNDLE9BQU8sQ0FBQztNQUMvQ0YsSUFBSSxDQUFDSyxJQUFJLEdBQUcsTUFBTUYsUUFBUSxDQUFDRyxJQUFJLENBQUMsQ0FBQztJQUNuQyxDQUFDLE1BQU07TUFDTDtNQUNBTixJQUFJLENBQUNLLElBQUksR0FBR0wsSUFBSSxDQUFDTyxvQkFBb0Is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
|