@c80/ui 1.0.20 → 1.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -585,11 +585,11 @@ export class C80TableComponent {
|
|
|
585
585
|
}
|
|
586
586
|
}
|
|
587
587
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: C80TableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
588
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: C80TableComponent, isStandalone: true, selector: "c80-table", inputs: { data$: "data$", columns: "columns", size: "size", multiple: "multiple", noConfirm: ["noConfirm", "noConfirm", (value) => value === '' || value === true || value === 'true'] }, outputs: { createAction: "createAction", updateAction: "updateAction", deleteAction: "deleteAction", cancelAction: "cancelAction", viewAction: "viewAction", getRowButtonAction: "getRowButtonAction", moveUpAction: "moveUpAction", moveDownAction: "moveDownAction", enableAction: "enableAction", searchTerm: "searchTerm", errorEvent: "errorEvent", selectable: "selectable" }, ngImport: i0, template: "<div class=\"table-responsive\" [style.max-height]=\"getTableMaxHeight()\" [style.overflow-y]=\"size > 0 ? 'auto' : 'visible'\">\n <!-- Search Bar -->\n @if (hasSearchTermListener()) {\n <div class=\"search-container\">\n <div class=\"search-input-wrapper\">\n <div class=\"input-group\">\n <span class=\"input-group-text\">\n <c80-icon icon=\"search\" [size]=\".8\"></c80-icon>\n </span>\n <input type=\"text\" class=\"form-control search-input\" placeholder=\"Buscar...\" [value]=\"searchValue()\" (input)=\"onSearchInput($event)\" aria-label=\"Buscar en la tabla\" />\n @if (searchValue()) {\n <button class=\"btn btn-outline-secondary btn-borrar\" type=\"button\" (click)=\"clearSearch()\" title=\"Limpiar b\u00FAsqueda\">\n <c80-icon icon=\"cancel\" [size]=\".7\"></c80-icon>\n </button>\n }\n </div>\n </div>\n </div>\n }\n\n <table class=\"table table-bordered table-hover align-middle\">\n <thead class=\"thead table-light sticky-header\">\n <tr>\n @if (hasSelectableListener() && data().length !== 0) {\n <th class=\"text-center selection-column\">\n @if (multiple) {\n <input type=\"checkbox\" [checked]=\"selectAllChecked()\" [indeterminate]=\"selectAllIndeterminate()\" (change)=\"toggleSelectAll()\" aria-label=\"Seleccionar todo\" />\n }\n </th>\n }\n @for (col of columns; track col) {\n @if (col.visible !== false) {\n @if (col.type === 'boolean') {\n <th class=\"text-center boolean-column\">{{ col.label }}</th>\n }\n @else if (col.type === 'number') {\n <th class=\"text-center number-column\">{{ col.label }}</th>\n }\n @else {\n <th>{{ col.label }}</th>\n }\n }\n }\n @if (hasCreateActionListener() || hasUpdateActionListener() || hasDeleteActionListener() ||\n hasCancelActionListener() || hasViewActionListener() || hasGetRowButtonListener() ||\n hasMoveUpActionListener() || hasMoveDownActionListener()) {\n <th class=\"table-actions-header\">\n <div class=\"actions-wrapper\">\n <span>Actions</span>\n @if (hasCreateActionListener()) {\n <c80-icon button icon=\"add\" [disabled]=\"creating()\" title=\"Agregar\" [size]=\".6\" (iconClick)=\"startCreate()\"></c80-icon>\n }\n </div>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of data(); track trackById(i, row); let i = $index) {\n <tr>\n @if (hasSelectableListener() && data().length !== 0) {\n <td class=\"text-center selection-column\">\n <input type=\"checkbox\" [checked]=\"isItemSelected(row)\" (change)=\"toggleItemSelection(row)\" [attr.aria-label]=\"'Seleccionar fila ' + (i + 1)\" />\n </td>\n }\n @for (col of columns; track col) {\n @if (col.visible !== false) {\n @if (col.type === 'boolean') {\n <td class=\"text-center boolean-column\">\n @if (editing() === row['id'] && !col.readOnly) {\n <input type=\"checkbox\" [checked]=\"!!editRow()?.[col.accessor]\" (change)=\"onEditInput($event, col.accessor, col)\" [attr.aria-label]=\"col.label\" />\n }\n @else {\n @if (getCellValue(row, col.accessor) === true) {\n <c80-icon icon=\"check\" [size]=\".7\"></c80-icon>\n <br />\n }\n @else if (getCellValue(row, col.accessor) === false) {\n <c80-icon icon=\"cancel\" [size]=\".7\"></c80-icon>\n <br />\n }\n }\n </td>\n }\n @else if (col.type === 'number') {\n <td class=\"text-center number-column\">\n @if (editing() === row['id'] && !col.readOnly) {\n <input class=\"form-control form-control-sm\" type=\"number\" [value]=\"editRow()?.[col.accessor] ?? ''\" [placeholder]=\"col.label\" (input)=\"onEditInput($event, col.accessor, col)\" />\n }\n @else {\n <span [style.color]=\"getCellColor(getCellValue(row, col.accessor), col)\">{{ getDisplayValue(getCellValue(row,\n col.accessor)) }}</span>\n }\n </td>\n }\n @else {\n <td>\n @if (editing() === row['id'] && !col.readOnly) {\n @if (col.type === 'enum') {\n <select class=\"form-control form-control-sm\" [value]=\"editRow()?.[col.accessor] ?? ''\" (change)=\"onEditInput($event, col.accessor, col)\">\n <option value=\"\">{{ col.label }}</option>\n @for (option of getEnumOptions(col); track option.value) {\n <option [value]=\"option.value\">{{ option.label }}</option>\n }\n </select>\n }\n @else {\n <input class=\"form-control form-control-sm\" [type]=\"col.type === 'password' ? 'password' : 'text'\" [value]=\"editRow()?.[col.accessor] ?? ''\" [placeholder]=\"col.label\" (input)=\"onEditInput($event, col.accessor, col)\" />\n }\n }\n @else {\n @if (col.type === 'password') {\n <span [style.color]=\"getCellColor(getCellValue(row, col.accessor), col)\">******</span>\n }\n @else if (col.type === 'enum') {\n <span [style.color]=\"getCellColor(getCellValue(row, col.accessor), col)\">{{\n getEnumDisplayValue(getCellValue(row, col.accessor), col)\n }}</span>\n }\n @else if (getCellValue(row, col.accessor) === true) {\n <c80-icon icon=\"check\" [size]=\".7\"></c80-icon>\n }\n @else if (getCellValue(row, col.accessor) === false) {\n <c80-icon icon=\"cancel\" [size]=\".7\"></c80-icon>\n }\n @else {\n <span [style.color]=\"getCellColor(getCellValue(row, col.accessor), col)\">{{ getDisplayValue(getCellValue(row,\n col.accessor)) }}</span>\n }\n }\n </td>\n }\n }\n }\n @if (hasCreateActionListener() || hasUpdateActionListener() || hasDeleteActionListener() ||\n hasCancelActionListener() || hasViewActionListener() || hasGetRowButtonListener() ||\n hasMoveUpActionListener() || hasMoveDownActionListener()) {\n <td class=\"text-center actions-cell\">\n <div class=\"actions-container\">\n @if (editing() === row['id']) {\n <c80-icon button icon=\"check\" title=\"Guardar\" (iconClick)=\"saveEdit(row)\" [size]=\".7\"></c80-icon>\n <c80-icon button icon=\"cancel\" color=\"warn\" title=\"Cancelar\" (iconClick)=\"cancelEdit()\" [size]=\".7\"></c80-icon>\n }\n @else {\n @if (hasUpdateActionListener()) {\n <c80-icon button icon=\"edit\" title=\"Editar\" (iconClick)=\"onEdit(row)\" [size]=\".7\"></c80-icon>\n }\n @if (hasCancelActionListener()) {\n <c80-icon button icon=\"cancel_circle\" color=\"secondary\" title=\"Cancelar\" (iconClick)=\"onCancel(row)\" [size]=\".7\"></c80-icon>\n }\n @if (hasViewActionListener()) {\n <c80-icon button icon=\"view\" color=\"primary\" title=\"Ver\" (iconClick)=\"onView(row)\" [size]=\".7\"></c80-icon>\n }\n @if (hasGetRowButtonListener()) {\n <c80-icon button icon=\"get\" color=\"success\" title=\"Vincular\" (iconClick)=\"onGetRowButton(row)\" [size]=\".7\"></c80-icon>\n }\n @if (hasMoveUpActionListener()) {\n <c80-icon button icon=\"arrow_up\" color=\"secondary\" title=\"Mover arriba\" (iconClick)=\"onMoveUp(row)\" [size]=\".7\"></c80-icon>\n }\n @if (hasMoveDownActionListener()) {\n <c80-icon button icon=\"arrow_down\" color=\"secondary\" title=\"Mover abajo\" (iconClick)=\"onMoveDown(row)\" [size]=\".7\"></c80-icon>\n }\n @if (hasEnableActionListener()) {\n <c80-icon button [icon]=\"getCellValue(row, 'enabled') ? 'toggle_on' : 'toggle_off'\" [color]=\"getCellValue(row, 'enabled') ? 'success' : 'secondary'\" [title]=\"getCellValue(row, 'enabled') ? 'Deshabilitar' : 'Habilitar'\"\n (iconClick)=\"onEnable(row)\" [size]=\".7\">\n </c80-icon>\n }\n @if (hasDeleteActionListener()) {\n <c80-icon button icon=\"delete\" color=\"warn\" title=\"Borrar\" (iconClick)=\"onDelete(row)\" [size]=\".7\"></c80-icon>\n }\n }\n </div>\n </td>\n }\n </tr>\n }\n @if (creating() && hasCreateActionListener()) {\n <tr>\n @if (hasSelectableListener() && data().length !== 0) {\n <td class=\"text-center selection-column\">\n <!-- Empty cell for alignment -->\n </td>\n }\n @for (col of columns; track col) {\n @if (col.visible !== false) {\n @if (col.type === 'boolean') {\n <td class=\"text-center\">\n @if (!col.readOnly) {\n <input type=\"checkbox\" [checked]=\"!!newRow()?.[col.accessor]\" (change)=\"onInput($event, col.accessor, col)\" [attr.aria-label]=\"col.label\" />\n }\n @else {\n <!-- ReadOnly boolean column in create mode shows empty -->\n <span class=\"text-muted\">-</span>\n }\n </td>\n } @else if (col.type === 'number') {\n <td class=\"text-center number-column\">\n @if (!col.readOnly) {\n <input class=\"form-control form-control-sm\" type=\"number\" [value]=\"newRow()?.[col.accessor] ?? ''\" [placeholder]=\"col.label\" (input)=\"onInput($event, col.accessor, col)\" />\n }\n @else {\n <!-- ReadOnly number column in create mode shows empty -->\n <span class=\"text-muted\">-</span>\n }\n </td>\n } @else {\n <td>\n @if (!col.readOnly) {\n @if (col.type === 'enum') {\n <select class=\"form-control form-control-sm\" [value]=\"newRow()?.[col.accessor] ?? ''\" (change)=\"onInput($event, col.accessor, col)\">\n <option value=\"\">{{ col.label }}</option>\n @for (option of getEnumOptions(col); track option.value) {\n <option [value]=\"option.value\">{{ option.label }}</option>\n }\n </select>\n }\n @else {\n <input class=\"form-control form-control-sm\" type=\"text\" [value]=\"newRow()?.[col.accessor] ?? ''\" [placeholder]=\"col.label\" (input)=\"onInput($event, col.accessor, col)\" />\n }\n }\n @else {\n <!-- ReadOnly column in create mode shows empty -->\n <span class=\"text-muted\">-</span>\n }\n </td>\n }\n }\n }\n <td class=\"text-center actions-cell\">\n <div class=\"actions-container\">\n <c80-icon button icon=\"check\" title=\"Guardar\" (iconClick)=\"saveCreate()\" [size]=\".7\"></c80-icon>\n <c80-icon button icon=\"cancel\" color=\"warn\" title=\"Cancelar\" (iconClick)=\"cancelCreate()\" [size]=\".7\"></c80-icon>\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n @if (data().length === 0) {\n <div class=\"text-center text-muted py-3 small\">\n No hay datos para mostrar.\n </div>\n }\n</div>\n\n<c80-modal></c80-modal>", styles: ["@charset \"UTF-8\";input[type=checkbox]{width:1.3rem!important;height:1.3rem!important;accent-color:rgba(226,0,0,.7647058824);background:#fff;margin:0 .25rem;vertical-align:middle;cursor:pointer}.table-responsive{width:100%;overflow-x:auto}.table-responsive .search-container{margin-bottom:-.06rem}.table-responsive .search-container .search-input-wrapper .input-group .btn-borrar{border-bottom-right-radius:0;border-color:#dee2e6}.table-responsive .search-container .search-input-wrapper .input-group .input-group-text{background-color:#f8f9fa;border-color:#dee2e6;border-bottom-left-radius:0;color:#6c757d}.table-responsive .search-container .search-input-wrapper .input-group .input-group-text c80-icon{display:flex;align-items:center;justify-content:center;padding-bottom:.2rem}.table-responsive .search-container .search-input-wrapper .input-group .search-input{border-color:#dee2e6;border-bottom-right-radius:0;font-size:.95rem;outline:none!important}.table-responsive .search-container .search-input-wrapper .input-group .search-input:focus{outline:none!important}.table-responsive .search-container .search-input-wrapper .input-group .search-input::placeholder{color:#999;font-style:italic}.table-responsive .table{min-width:0px;margin-bottom:.5rem}.table-responsive .table .sticky-header{position:sticky;top:0;z-index:10;background-color:#f8f9fa!important}.table-responsive .table .sticky-header .table-actions-header{display:table-cell;vertical-align:middle;padding:.2rem .6rem!important;background-color:#f8f9fa!important}.table-responsive .table .sticky-header .actions-wrapper{display:flex;align-items:center;justify-content:center;gap:.5rem;height:100%}.table-responsive .table .sticky-header th{max-height:31px!important;vertical-align:middle!important;padding:.2rem .6rem!important;font-size:small!important;background-color:#f8f9fa!important;border-bottom:2px solid #dee2e6}.table-responsive .table tbody td{height:35px!important;min-height:35px!important;max-height:35px!important;vertical-align:middle!important;padding:.2rem .8rem!important;font-size:small}.table-responsive .table tbody tr{height:35px!important;min-height:35px!important;max-height:35px!important;cursor:pointer}.table-responsive .table tbody tr:hover{background-color:#f5f5f5}.table-responsive .table tbody input{border:1px solid rgba(34,0,255,.37);height:100%!important;font-size:smaller!important}.table-responsive .table thead th.boolean-column,.table-responsive .table tbody td.boolean-column,.table-responsive .table thead th.selection-column,.table-responsive .table tbody td.selection-column,.table-responsive .table thead th.table-actions-header,.table-responsive .table tbody td.table-actions-header{width:1%;white-space:nowrap}.table-responsive .table thead th.number-column,.table-responsive .table tbody td.number-column{width:1%;white-space:nowrap;text-align:center}.table-responsive .table thead th.number-column input[type=number],.table-responsive .table tbody td.number-column input[type=number]{min-width:120px!important;width:120px!important;text-align:center}.table-responsive .table .actions-cell{white-space:nowrap;padding:0!important}.table-responsive .table .actions-container{display:flex;flex-direction:row;justify-content:center;align-items:center;width:100%;height:100%}\n"], dependencies: [{ kind: "component", type: C80IconComponent, selector: "c80-icon", inputs: ["icon", "color", "customColor", "disabled", "size", "button", "type"], outputs: ["iconClick"] }, { kind: "component", type: C80ModalComponent, selector: "c80-modal" }] });
|
|
588
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: C80TableComponent, isStandalone: true, selector: "c80-table", inputs: { data$: "data$", columns: "columns", size: "size", multiple: "multiple", noConfirm: ["noConfirm", "noConfirm", (value) => value === '' || value === true || value === 'true'] }, outputs: { createAction: "createAction", updateAction: "updateAction", deleteAction: "deleteAction", cancelAction: "cancelAction", viewAction: "viewAction", getRowButtonAction: "getRowButtonAction", moveUpAction: "moveUpAction", moveDownAction: "moveDownAction", enableAction: "enableAction", searchTerm: "searchTerm", errorEvent: "errorEvent", selectable: "selectable" }, ngImport: i0, template: "<div class=\"table-responsive\" [style.max-height]=\"getTableMaxHeight()\" [style.overflow-y]=\"size > 0 ? 'auto' : 'visible'\">\n <!-- Search Bar -->\n @if (hasSearchTermListener()) {\n <div class=\"search-container\">\n <div class=\"search-input-wrapper\">\n <div class=\"input-group\">\n <span class=\"input-group-text\">\n <c80-icon icon=\"search\" [size]=\".8\"></c80-icon>\n </span>\n <input type=\"text\" class=\"form-control search-input\" placeholder=\"Buscar...\" [value]=\"searchValue()\" (input)=\"onSearchInput($event)\" aria-label=\"Buscar en la tabla\" />\n @if (searchValue()) {\n <button class=\"btn btn-outline-secondary btn-borrar\" type=\"button\" (click)=\"clearSearch()\" title=\"Limpiar b\u00FAsqueda\">\n <c80-icon icon=\"cancel\" [size]=\".7\"></c80-icon>\n </button>\n }\n </div>\n </div>\n </div>\n }\n\n <table class=\"table table-bordered table-hover align-middle\">\n <thead class=\"thead table-light sticky-header\">\n <tr>\n @if (hasSelectableListener() && data().length !== 0) {\n <th class=\"text-center selection-column\">\n @if (multiple) {\n <input type=\"checkbox\" [checked]=\"selectAllChecked()\" [indeterminate]=\"selectAllIndeterminate()\" (change)=\"toggleSelectAll()\" aria-label=\"Seleccionar todo\" />\n }\n </th>\n }\n @for (col of columns; track col) {\n @if (col.visible !== false) {\n @if (col.type === 'boolean') {\n <th class=\"text-center boolean-column\">{{ col.label }}</th>\n }\n @else if (col.type === 'number') {\n <th class=\"text-center number-column\">{{ col.label }}</th>\n }\n @else {\n <th>{{ col.label }}</th>\n }\n }\n }\n @if (hasCreateActionListener() || hasUpdateActionListener() || hasDeleteActionListener() ||\n hasCancelActionListener() || hasViewActionListener() || hasGetRowButtonListener() ||\n hasMoveUpActionListener() || hasMoveDownActionListener()) {\n <th class=\"table-actions-header\">\n <div class=\"actions-wrapper\">\n <span>Actions</span>\n @if (hasCreateActionListener()) {\n <c80-icon button icon=\"add\" [disabled]=\"creating()\" title=\"Agregar\" [size]=\".6\" (iconClick)=\"startCreate()\"></c80-icon>\n }\n </div>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of data(); track trackById(i, row); let i = $index) {\n <tr>\n @if (hasSelectableListener() && data().length !== 0) {\n <td class=\"text-center selection-column\">\n <input type=\"checkbox\" [checked]=\"isItemSelected(row)\" (change)=\"toggleItemSelection(row)\" [attr.aria-label]=\"'Seleccionar fila ' + (i + 1)\" />\n </td>\n }\n @for (col of columns; track col) {\n @if (col.visible !== false) {\n @if (col.type === 'boolean') {\n <td class=\"text-center boolean-column\">\n @if (editing() === row['id'] && !col.readOnly) {\n <input type=\"checkbox\" [checked]=\"!!editRow()?.[col.accessor]\" (change)=\"onEditInput($event, col.accessor, col)\" [attr.aria-label]=\"col.label\" />\n }\n @else {\n @if (getCellValue(row, col.accessor) === true) {\n <c80-icon icon=\"check\" [size]=\".7\"></c80-icon>\n <br />\n }\n @else if (getCellValue(row, col.accessor) === false) {\n <c80-icon icon=\"cancel\" [size]=\".7\"></c80-icon>\n <br />\n }\n }\n </td>\n }\n @else if (col.type === 'number') {\n <td class=\"text-center number-column\">\n @if (editing() === row['id'] && !col.readOnly) {\n <input class=\"form-control form-control-sm\" type=\"number\" [value]=\"editRow()?.[col.accessor] ?? ''\" [placeholder]=\"col.label\" (input)=\"onEditInput($event, col.accessor, col)\" />\n }\n @else {\n <span [style.color]=\"getCellColor(getCellValue(row, col.accessor), col)\">{{ getDisplayValue(getCellValue(row,\n col.accessor)) }}</span>\n }\n </td>\n }\n @else {\n <td>\n @if (editing() === row['id'] && !col.readOnly) {\n @if (col.type === 'enum') {\n <select class=\"form-control form-control-sm\" [value]=\"editRow()?.[col.accessor] ?? ''\" (change)=\"onEditInput($event, col.accessor, col)\">\n <option value=\"\">{{ col.label }}</option>\n @for (option of getEnumOptions(col); track option.value) {\n <option [value]=\"option.value\">{{ option.label }}</option>\n }\n </select>\n }\n @else {\n <input class=\"form-control form-control-sm\" [type]=\"col.type === 'password' ? 'password' : 'text'\" [value]=\"editRow()?.[col.accessor] ?? ''\" [placeholder]=\"col.label\" (input)=\"onEditInput($event, col.accessor, col)\" />\n }\n }\n @else {\n @if (col.type === 'password') {\n <span [style.color]=\"getCellColor(getCellValue(row, col.accessor), col)\">******</span>\n }\n @else if (col.type === 'enum') {\n <span [style.color]=\"getCellColor(getCellValue(row, col.accessor), col)\">{{\n getEnumDisplayValue(getCellValue(row, col.accessor), col)\n }}</span>\n }\n @else if (getCellValue(row, col.accessor) === true) {\n <c80-icon icon=\"check\" [size]=\".7\"></c80-icon>\n }\n @else if (getCellValue(row, col.accessor) === false) {\n <c80-icon icon=\"cancel\" [size]=\".7\"></c80-icon>\n }\n @else {\n <span [style.color]=\"getCellColor(getCellValue(row, col.accessor), col)\">{{ getDisplayValue(getCellValue(row,\n col.accessor)) }}</span>\n }\n }\n </td>\n }\n }\n }\n @if (hasCreateActionListener() || hasUpdateActionListener() || hasDeleteActionListener() ||\n hasCancelActionListener() || hasViewActionListener() || hasGetRowButtonListener() ||\n hasMoveUpActionListener() || hasMoveDownActionListener()) {\n <td class=\"text-center actions-cell\">\n <div class=\"actions-container\">\n @if (editing() === row['id']) {\n <c80-icon button icon=\"check\" title=\"Guardar\" (iconClick)=\"saveEdit(row)\" [size]=\".7\"></c80-icon>\n <c80-icon button icon=\"cancel\" color=\"warn\" title=\"Cancelar\" (iconClick)=\"cancelEdit()\" [size]=\".7\"></c80-icon>\n }\n @else {\n @if (hasUpdateActionListener()) {\n <c80-icon button icon=\"edit\" title=\"Editar\" (iconClick)=\"onEdit(row)\" [size]=\".7\"></c80-icon>\n }\n @if (hasCancelActionListener()) {\n <c80-icon button icon=\"cancel_circle\" color=\"secondary\" title=\"Cancelar\" (iconClick)=\"onCancel(row)\" [size]=\".7\"></c80-icon>\n }\n @if (hasViewActionListener()) {\n <c80-icon button icon=\"view\" color=\"primary\" title=\"Ver\" (iconClick)=\"onView(row)\" [size]=\".7\"></c80-icon>\n }\n @if (hasGetRowButtonListener()) {\n <c80-icon button icon=\"get\" color=\"success\" title=\"Vincular\" (iconClick)=\"onGetRowButton(row)\" [size]=\".7\"></c80-icon>\n }\n @if (hasMoveUpActionListener()) {\n <c80-icon button icon=\"arrow_up\" color=\"secondary\" title=\"Mover arriba\" (iconClick)=\"onMoveUp(row)\" [size]=\".7\"></c80-icon>\n }\n @if (hasMoveDownActionListener()) {\n <c80-icon button icon=\"arrow_down\" color=\"secondary\" title=\"Mover abajo\" (iconClick)=\"onMoveDown(row)\" [size]=\".7\"></c80-icon>\n }\n @if (hasEnableActionListener()) {\n <c80-icon button [icon]=\"getCellValue(row, 'enabled') ? 'toggle_on' : 'toggle_off'\" [color]=\"getCellValue(row, 'enabled') ? 'success' : 'secondary'\" [title]=\"getCellValue(row, 'enabled') ? 'Deshabilitar' : 'Habilitar'\"\n (iconClick)=\"onEnable(row)\" [size]=\".7\">\n </c80-icon>\n }\n @if (hasDeleteActionListener()) {\n <c80-icon button icon=\"delete\" color=\"warn\" title=\"Borrar\" (iconClick)=\"onDelete(row)\" [size]=\".7\"></c80-icon>\n }\n }\n </div>\n </td>\n }\n </tr>\n }\n @if (creating() && hasCreateActionListener()) {\n <tr>\n @if (hasSelectableListener() && data().length !== 0) {\n <td class=\"text-center selection-column\">\n <!-- Empty cell for alignment -->\n </td>\n }\n @for (col of columns; track col) {\n @if (col.visible !== false) {\n @if (col.type === 'boolean') {\n <td class=\"text-center\">\n @if (!col.readOnly) {\n <input type=\"checkbox\" [checked]=\"!!newRow()?.[col.accessor]\" (change)=\"onInput($event, col.accessor, col)\" [attr.aria-label]=\"col.label\" />\n }\n @else {\n <!-- ReadOnly boolean column in create mode shows empty -->\n <span class=\"text-muted\">-</span>\n }\n </td>\n } @else if (col.type === 'number') {\n <td class=\"text-center number-column\">\n @if (!col.readOnly) {\n <input class=\"form-control form-control-sm\" type=\"number\" [value]=\"newRow()?.[col.accessor] ?? ''\" [placeholder]=\"col.label\" (input)=\"onInput($event, col.accessor, col)\" />\n }\n @else {\n <!-- ReadOnly number column in create mode shows empty -->\n <span class=\"text-muted\">-</span>\n }\n </td>\n } @else {\n <td>\n @if (!col.readOnly) {\n @if (col.type === 'enum') {\n <select class=\"form-control form-control-sm\" [value]=\"newRow()?.[col.accessor] ?? ''\" (change)=\"onInput($event, col.accessor, col)\">\n <option value=\"\">{{ col.label }}</option>\n @for (option of getEnumOptions(col); track option.value) {\n <option [value]=\"option.value\">{{ option.label }}</option>\n }\n </select>\n }\n @else {\n <input class=\"form-control form-control-sm\" type=\"text\" [value]=\"newRow()?.[col.accessor] ?? ''\" [placeholder]=\"col.label\" (input)=\"onInput($event, col.accessor, col)\" />\n }\n }\n @else {\n <!-- ReadOnly column in create mode shows empty -->\n <span class=\"text-muted\">-</span>\n }\n </td>\n }\n }\n }\n <td class=\"text-center actions-cell\">\n <div class=\"actions-container\">\n <c80-icon button icon=\"check\" title=\"Guardar\" (iconClick)=\"saveCreate()\" [size]=\".7\"></c80-icon>\n <c80-icon button icon=\"cancel\" color=\"warn\" title=\"Cancelar\" (iconClick)=\"cancelCreate()\" [size]=\".7\"></c80-icon>\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n @if (data().length === 0) {\n <div class=\"text-center text-muted py-3 small\">\n No hay datos para mostrar.\n </div>\n }\n</div>\n\n<c80-modal></c80-modal>", styles: ["@charset \"UTF-8\";input[type=checkbox]{width:1.3rem!important;height:1.3rem!important;accent-color:rgba(226,0,0,.7647058824);background:#fff;margin:0 .25rem;vertical-align:middle;cursor:pointer}.table-responsive{width:100%;overflow-x:auto}.table-responsive .search-container{margin-bottom:-.06rem}.table-responsive .search-container .search-input-wrapper .input-group .btn-borrar{border-bottom-right-radius:0;border-color:#dee2e6}.table-responsive .search-container .search-input-wrapper .input-group .input-group-text{background-color:#f8f9fa;border-color:#dee2e6;border-bottom-left-radius:0;color:#6c757d;width:56px}.table-responsive .search-container .search-input-wrapper .input-group .input-group-text c80-icon{display:flex;align-items:center;justify-content:center;padding-bottom:.2rem}.table-responsive .search-container .search-input-wrapper .input-group .search-input{border-color:#dee2e6;border-bottom-right-radius:0;font-size:.95rem;outline:none!important}.table-responsive .search-container .search-input-wrapper .input-group .search-input:focus{outline:none!important}.table-responsive .search-container .search-input-wrapper .input-group .search-input::placeholder{color:#999;font-style:italic}.table-responsive .table{min-width:0px;margin-bottom:.5rem}.table-responsive .table .sticky-header{position:sticky;top:0;z-index:10;background-color:#f8f9fa!important}.table-responsive .table .sticky-header .table-actions-header{display:table-cell;vertical-align:middle;padding:.2rem .6rem!important;background-color:#f8f9fa!important}.table-responsive .table .sticky-header .actions-wrapper{display:flex;align-items:center;justify-content:center;gap:.5rem;height:100%}.table-responsive .table .sticky-header th{max-height:31px!important;vertical-align:middle!important;padding:.2rem .6rem!important;font-size:small!important;background-color:#f8f9fa!important;border-bottom:2px solid #dee2e6}.table-responsive .table tbody td{height:35px!important;min-height:35px!important;max-height:35px!important;vertical-align:middle!important;padding:.2rem .8rem!important;font-size:small}.table-responsive .table tbody tr{height:35px!important;min-height:35px!important;max-height:35px!important;cursor:pointer}.table-responsive .table tbody tr:hover{background-color:#f5f5f5}.table-responsive .table tbody input{border:1px solid rgba(34,0,255,.37);height:100%!important;font-size:smaller!important}.table-responsive .table thead th.boolean-column,.table-responsive .table tbody td.boolean-column,.table-responsive .table thead th.selection-column,.table-responsive .table tbody td.selection-column,.table-responsive .table thead th.table-actions-header,.table-responsive .table tbody td.table-actions-header{width:1%;white-space:nowrap}.table-responsive .table thead th.number-column,.table-responsive .table tbody td.number-column{width:1%;white-space:nowrap;text-align:center}.table-responsive .table thead th.number-column input[type=number],.table-responsive .table tbody td.number-column input[type=number]{min-width:120px!important;width:120px!important;text-align:center}.table-responsive .table .actions-cell{white-space:nowrap;padding:0!important}.table-responsive .table .actions-container{display:flex;flex-direction:row;justify-content:center;align-items:center;width:100%;height:100%}\n"], dependencies: [{ kind: "component", type: C80IconComponent, selector: "c80-icon", inputs: ["icon", "color", "customColor", "disabled", "size", "button", "type"], outputs: ["iconClick"] }, { kind: "component", type: C80ModalComponent, selector: "c80-modal" }] });
|
|
589
589
|
}
|
|
590
590
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: C80TableComponent, decorators: [{
|
|
591
591
|
type: Component,
|
|
592
|
-
args: [{ selector: 'c80-table', standalone: true, imports: [C80IconComponent, C80ModalComponent], template: "<div class=\"table-responsive\" [style.max-height]=\"getTableMaxHeight()\" [style.overflow-y]=\"size > 0 ? 'auto' : 'visible'\">\n <!-- Search Bar -->\n @if (hasSearchTermListener()) {\n <div class=\"search-container\">\n <div class=\"search-input-wrapper\">\n <div class=\"input-group\">\n <span class=\"input-group-text\">\n <c80-icon icon=\"search\" [size]=\".8\"></c80-icon>\n </span>\n <input type=\"text\" class=\"form-control search-input\" placeholder=\"Buscar...\" [value]=\"searchValue()\" (input)=\"onSearchInput($event)\" aria-label=\"Buscar en la tabla\" />\n @if (searchValue()) {\n <button class=\"btn btn-outline-secondary btn-borrar\" type=\"button\" (click)=\"clearSearch()\" title=\"Limpiar b\u00FAsqueda\">\n <c80-icon icon=\"cancel\" [size]=\".7\"></c80-icon>\n </button>\n }\n </div>\n </div>\n </div>\n }\n\n <table class=\"table table-bordered table-hover align-middle\">\n <thead class=\"thead table-light sticky-header\">\n <tr>\n @if (hasSelectableListener() && data().length !== 0) {\n <th class=\"text-center selection-column\">\n @if (multiple) {\n <input type=\"checkbox\" [checked]=\"selectAllChecked()\" [indeterminate]=\"selectAllIndeterminate()\" (change)=\"toggleSelectAll()\" aria-label=\"Seleccionar todo\" />\n }\n </th>\n }\n @for (col of columns; track col) {\n @if (col.visible !== false) {\n @if (col.type === 'boolean') {\n <th class=\"text-center boolean-column\">{{ col.label }}</th>\n }\n @else if (col.type === 'number') {\n <th class=\"text-center number-column\">{{ col.label }}</th>\n }\n @else {\n <th>{{ col.label }}</th>\n }\n }\n }\n @if (hasCreateActionListener() || hasUpdateActionListener() || hasDeleteActionListener() ||\n hasCancelActionListener() || hasViewActionListener() || hasGetRowButtonListener() ||\n hasMoveUpActionListener() || hasMoveDownActionListener()) {\n <th class=\"table-actions-header\">\n <div class=\"actions-wrapper\">\n <span>Actions</span>\n @if (hasCreateActionListener()) {\n <c80-icon button icon=\"add\" [disabled]=\"creating()\" title=\"Agregar\" [size]=\".6\" (iconClick)=\"startCreate()\"></c80-icon>\n }\n </div>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of data(); track trackById(i, row); let i = $index) {\n <tr>\n @if (hasSelectableListener() && data().length !== 0) {\n <td class=\"text-center selection-column\">\n <input type=\"checkbox\" [checked]=\"isItemSelected(row)\" (change)=\"toggleItemSelection(row)\" [attr.aria-label]=\"'Seleccionar fila ' + (i + 1)\" />\n </td>\n }\n @for (col of columns; track col) {\n @if (col.visible !== false) {\n @if (col.type === 'boolean') {\n <td class=\"text-center boolean-column\">\n @if (editing() === row['id'] && !col.readOnly) {\n <input type=\"checkbox\" [checked]=\"!!editRow()?.[col.accessor]\" (change)=\"onEditInput($event, col.accessor, col)\" [attr.aria-label]=\"col.label\" />\n }\n @else {\n @if (getCellValue(row, col.accessor) === true) {\n <c80-icon icon=\"check\" [size]=\".7\"></c80-icon>\n <br />\n }\n @else if (getCellValue(row, col.accessor) === false) {\n <c80-icon icon=\"cancel\" [size]=\".7\"></c80-icon>\n <br />\n }\n }\n </td>\n }\n @else if (col.type === 'number') {\n <td class=\"text-center number-column\">\n @if (editing() === row['id'] && !col.readOnly) {\n <input class=\"form-control form-control-sm\" type=\"number\" [value]=\"editRow()?.[col.accessor] ?? ''\" [placeholder]=\"col.label\" (input)=\"onEditInput($event, col.accessor, col)\" />\n }\n @else {\n <span [style.color]=\"getCellColor(getCellValue(row, col.accessor), col)\">{{ getDisplayValue(getCellValue(row,\n col.accessor)) }}</span>\n }\n </td>\n }\n @else {\n <td>\n @if (editing() === row['id'] && !col.readOnly) {\n @if (col.type === 'enum') {\n <select class=\"form-control form-control-sm\" [value]=\"editRow()?.[col.accessor] ?? ''\" (change)=\"onEditInput($event, col.accessor, col)\">\n <option value=\"\">{{ col.label }}</option>\n @for (option of getEnumOptions(col); track option.value) {\n <option [value]=\"option.value\">{{ option.label }}</option>\n }\n </select>\n }\n @else {\n <input class=\"form-control form-control-sm\" [type]=\"col.type === 'password' ? 'password' : 'text'\" [value]=\"editRow()?.[col.accessor] ?? ''\" [placeholder]=\"col.label\" (input)=\"onEditInput($event, col.accessor, col)\" />\n }\n }\n @else {\n @if (col.type === 'password') {\n <span [style.color]=\"getCellColor(getCellValue(row, col.accessor), col)\">******</span>\n }\n @else if (col.type === 'enum') {\n <span [style.color]=\"getCellColor(getCellValue(row, col.accessor), col)\">{{\n getEnumDisplayValue(getCellValue(row, col.accessor), col)\n }}</span>\n }\n @else if (getCellValue(row, col.accessor) === true) {\n <c80-icon icon=\"check\" [size]=\".7\"></c80-icon>\n }\n @else if (getCellValue(row, col.accessor) === false) {\n <c80-icon icon=\"cancel\" [size]=\".7\"></c80-icon>\n }\n @else {\n <span [style.color]=\"getCellColor(getCellValue(row, col.accessor), col)\">{{ getDisplayValue(getCellValue(row,\n col.accessor)) }}</span>\n }\n }\n </td>\n }\n }\n }\n @if (hasCreateActionListener() || hasUpdateActionListener() || hasDeleteActionListener() ||\n hasCancelActionListener() || hasViewActionListener() || hasGetRowButtonListener() ||\n hasMoveUpActionListener() || hasMoveDownActionListener()) {\n <td class=\"text-center actions-cell\">\n <div class=\"actions-container\">\n @if (editing() === row['id']) {\n <c80-icon button icon=\"check\" title=\"Guardar\" (iconClick)=\"saveEdit(row)\" [size]=\".7\"></c80-icon>\n <c80-icon button icon=\"cancel\" color=\"warn\" title=\"Cancelar\" (iconClick)=\"cancelEdit()\" [size]=\".7\"></c80-icon>\n }\n @else {\n @if (hasUpdateActionListener()) {\n <c80-icon button icon=\"edit\" title=\"Editar\" (iconClick)=\"onEdit(row)\" [size]=\".7\"></c80-icon>\n }\n @if (hasCancelActionListener()) {\n <c80-icon button icon=\"cancel_circle\" color=\"secondary\" title=\"Cancelar\" (iconClick)=\"onCancel(row)\" [size]=\".7\"></c80-icon>\n }\n @if (hasViewActionListener()) {\n <c80-icon button icon=\"view\" color=\"primary\" title=\"Ver\" (iconClick)=\"onView(row)\" [size]=\".7\"></c80-icon>\n }\n @if (hasGetRowButtonListener()) {\n <c80-icon button icon=\"get\" color=\"success\" title=\"Vincular\" (iconClick)=\"onGetRowButton(row)\" [size]=\".7\"></c80-icon>\n }\n @if (hasMoveUpActionListener()) {\n <c80-icon button icon=\"arrow_up\" color=\"secondary\" title=\"Mover arriba\" (iconClick)=\"onMoveUp(row)\" [size]=\".7\"></c80-icon>\n }\n @if (hasMoveDownActionListener()) {\n <c80-icon button icon=\"arrow_down\" color=\"secondary\" title=\"Mover abajo\" (iconClick)=\"onMoveDown(row)\" [size]=\".7\"></c80-icon>\n }\n @if (hasEnableActionListener()) {\n <c80-icon button [icon]=\"getCellValue(row, 'enabled') ? 'toggle_on' : 'toggle_off'\" [color]=\"getCellValue(row, 'enabled') ? 'success' : 'secondary'\" [title]=\"getCellValue(row, 'enabled') ? 'Deshabilitar' : 'Habilitar'\"\n (iconClick)=\"onEnable(row)\" [size]=\".7\">\n </c80-icon>\n }\n @if (hasDeleteActionListener()) {\n <c80-icon button icon=\"delete\" color=\"warn\" title=\"Borrar\" (iconClick)=\"onDelete(row)\" [size]=\".7\"></c80-icon>\n }\n }\n </div>\n </td>\n }\n </tr>\n }\n @if (creating() && hasCreateActionListener()) {\n <tr>\n @if (hasSelectableListener() && data().length !== 0) {\n <td class=\"text-center selection-column\">\n <!-- Empty cell for alignment -->\n </td>\n }\n @for (col of columns; track col) {\n @if (col.visible !== false) {\n @if (col.type === 'boolean') {\n <td class=\"text-center\">\n @if (!col.readOnly) {\n <input type=\"checkbox\" [checked]=\"!!newRow()?.[col.accessor]\" (change)=\"onInput($event, col.accessor, col)\" [attr.aria-label]=\"col.label\" />\n }\n @else {\n <!-- ReadOnly boolean column in create mode shows empty -->\n <span class=\"text-muted\">-</span>\n }\n </td>\n } @else if (col.type === 'number') {\n <td class=\"text-center number-column\">\n @if (!col.readOnly) {\n <input class=\"form-control form-control-sm\" type=\"number\" [value]=\"newRow()?.[col.accessor] ?? ''\" [placeholder]=\"col.label\" (input)=\"onInput($event, col.accessor, col)\" />\n }\n @else {\n <!-- ReadOnly number column in create mode shows empty -->\n <span class=\"text-muted\">-</span>\n }\n </td>\n } @else {\n <td>\n @if (!col.readOnly) {\n @if (col.type === 'enum') {\n <select class=\"form-control form-control-sm\" [value]=\"newRow()?.[col.accessor] ?? ''\" (change)=\"onInput($event, col.accessor, col)\">\n <option value=\"\">{{ col.label }}</option>\n @for (option of getEnumOptions(col); track option.value) {\n <option [value]=\"option.value\">{{ option.label }}</option>\n }\n </select>\n }\n @else {\n <input class=\"form-control form-control-sm\" type=\"text\" [value]=\"newRow()?.[col.accessor] ?? ''\" [placeholder]=\"col.label\" (input)=\"onInput($event, col.accessor, col)\" />\n }\n }\n @else {\n <!-- ReadOnly column in create mode shows empty -->\n <span class=\"text-muted\">-</span>\n }\n </td>\n }\n }\n }\n <td class=\"text-center actions-cell\">\n <div class=\"actions-container\">\n <c80-icon button icon=\"check\" title=\"Guardar\" (iconClick)=\"saveCreate()\" [size]=\".7\"></c80-icon>\n <c80-icon button icon=\"cancel\" color=\"warn\" title=\"Cancelar\" (iconClick)=\"cancelCreate()\" [size]=\".7\"></c80-icon>\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n @if (data().length === 0) {\n <div class=\"text-center text-muted py-3 small\">\n No hay datos para mostrar.\n </div>\n }\n</div>\n\n<c80-modal></c80-modal>", styles: ["@charset \"UTF-8\";input[type=checkbox]{width:1.3rem!important;height:1.3rem!important;accent-color:rgba(226,0,0,.7647058824);background:#fff;margin:0 .25rem;vertical-align:middle;cursor:pointer}.table-responsive{width:100%;overflow-x:auto}.table-responsive .search-container{margin-bottom:-.06rem}.table-responsive .search-container .search-input-wrapper .input-group .btn-borrar{border-bottom-right-radius:0;border-color:#dee2e6}.table-responsive .search-container .search-input-wrapper .input-group .input-group-text{background-color:#f8f9fa;border-color:#dee2e6;border-bottom-left-radius:0;color:#6c757d}.table-responsive .search-container .search-input-wrapper .input-group .input-group-text c80-icon{display:flex;align-items:center;justify-content:center;padding-bottom:.2rem}.table-responsive .search-container .search-input-wrapper .input-group .search-input{border-color:#dee2e6;border-bottom-right-radius:0;font-size:.95rem;outline:none!important}.table-responsive .search-container .search-input-wrapper .input-group .search-input:focus{outline:none!important}.table-responsive .search-container .search-input-wrapper .input-group .search-input::placeholder{color:#999;font-style:italic}.table-responsive .table{min-width:0px;margin-bottom:.5rem}.table-responsive .table .sticky-header{position:sticky;top:0;z-index:10;background-color:#f8f9fa!important}.table-responsive .table .sticky-header .table-actions-header{display:table-cell;vertical-align:middle;padding:.2rem .6rem!important;background-color:#f8f9fa!important}.table-responsive .table .sticky-header .actions-wrapper{display:flex;align-items:center;justify-content:center;gap:.5rem;height:100%}.table-responsive .table .sticky-header th{max-height:31px!important;vertical-align:middle!important;padding:.2rem .6rem!important;font-size:small!important;background-color:#f8f9fa!important;border-bottom:2px solid #dee2e6}.table-responsive .table tbody td{height:35px!important;min-height:35px!important;max-height:35px!important;vertical-align:middle!important;padding:.2rem .8rem!important;font-size:small}.table-responsive .table tbody tr{height:35px!important;min-height:35px!important;max-height:35px!important;cursor:pointer}.table-responsive .table tbody tr:hover{background-color:#f5f5f5}.table-responsive .table tbody input{border:1px solid rgba(34,0,255,.37);height:100%!important;font-size:smaller!important}.table-responsive .table thead th.boolean-column,.table-responsive .table tbody td.boolean-column,.table-responsive .table thead th.selection-column,.table-responsive .table tbody td.selection-column,.table-responsive .table thead th.table-actions-header,.table-responsive .table tbody td.table-actions-header{width:1%;white-space:nowrap}.table-responsive .table thead th.number-column,.table-responsive .table tbody td.number-column{width:1%;white-space:nowrap;text-align:center}.table-responsive .table thead th.number-column input[type=number],.table-responsive .table tbody td.number-column input[type=number]{min-width:120px!important;width:120px!important;text-align:center}.table-responsive .table .actions-cell{white-space:nowrap;padding:0!important}.table-responsive .table .actions-container{display:flex;flex-direction:row;justify-content:center;align-items:center;width:100%;height:100%}\n"] }]
|
|
592
|
+
args: [{ selector: 'c80-table', standalone: true, imports: [C80IconComponent, C80ModalComponent], template: "<div class=\"table-responsive\" [style.max-height]=\"getTableMaxHeight()\" [style.overflow-y]=\"size > 0 ? 'auto' : 'visible'\">\n <!-- Search Bar -->\n @if (hasSearchTermListener()) {\n <div class=\"search-container\">\n <div class=\"search-input-wrapper\">\n <div class=\"input-group\">\n <span class=\"input-group-text\">\n <c80-icon icon=\"search\" [size]=\".8\"></c80-icon>\n </span>\n <input type=\"text\" class=\"form-control search-input\" placeholder=\"Buscar...\" [value]=\"searchValue()\" (input)=\"onSearchInput($event)\" aria-label=\"Buscar en la tabla\" />\n @if (searchValue()) {\n <button class=\"btn btn-outline-secondary btn-borrar\" type=\"button\" (click)=\"clearSearch()\" title=\"Limpiar b\u00FAsqueda\">\n <c80-icon icon=\"cancel\" [size]=\".7\"></c80-icon>\n </button>\n }\n </div>\n </div>\n </div>\n }\n\n <table class=\"table table-bordered table-hover align-middle\">\n <thead class=\"thead table-light sticky-header\">\n <tr>\n @if (hasSelectableListener() && data().length !== 0) {\n <th class=\"text-center selection-column\">\n @if (multiple) {\n <input type=\"checkbox\" [checked]=\"selectAllChecked()\" [indeterminate]=\"selectAllIndeterminate()\" (change)=\"toggleSelectAll()\" aria-label=\"Seleccionar todo\" />\n }\n </th>\n }\n @for (col of columns; track col) {\n @if (col.visible !== false) {\n @if (col.type === 'boolean') {\n <th class=\"text-center boolean-column\">{{ col.label }}</th>\n }\n @else if (col.type === 'number') {\n <th class=\"text-center number-column\">{{ col.label }}</th>\n }\n @else {\n <th>{{ col.label }}</th>\n }\n }\n }\n @if (hasCreateActionListener() || hasUpdateActionListener() || hasDeleteActionListener() ||\n hasCancelActionListener() || hasViewActionListener() || hasGetRowButtonListener() ||\n hasMoveUpActionListener() || hasMoveDownActionListener()) {\n <th class=\"table-actions-header\">\n <div class=\"actions-wrapper\">\n <span>Actions</span>\n @if (hasCreateActionListener()) {\n <c80-icon button icon=\"add\" [disabled]=\"creating()\" title=\"Agregar\" [size]=\".6\" (iconClick)=\"startCreate()\"></c80-icon>\n }\n </div>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of data(); track trackById(i, row); let i = $index) {\n <tr>\n @if (hasSelectableListener() && data().length !== 0) {\n <td class=\"text-center selection-column\">\n <input type=\"checkbox\" [checked]=\"isItemSelected(row)\" (change)=\"toggleItemSelection(row)\" [attr.aria-label]=\"'Seleccionar fila ' + (i + 1)\" />\n </td>\n }\n @for (col of columns; track col) {\n @if (col.visible !== false) {\n @if (col.type === 'boolean') {\n <td class=\"text-center boolean-column\">\n @if (editing() === row['id'] && !col.readOnly) {\n <input type=\"checkbox\" [checked]=\"!!editRow()?.[col.accessor]\" (change)=\"onEditInput($event, col.accessor, col)\" [attr.aria-label]=\"col.label\" />\n }\n @else {\n @if (getCellValue(row, col.accessor) === true) {\n <c80-icon icon=\"check\" [size]=\".7\"></c80-icon>\n <br />\n }\n @else if (getCellValue(row, col.accessor) === false) {\n <c80-icon icon=\"cancel\" [size]=\".7\"></c80-icon>\n <br />\n }\n }\n </td>\n }\n @else if (col.type === 'number') {\n <td class=\"text-center number-column\">\n @if (editing() === row['id'] && !col.readOnly) {\n <input class=\"form-control form-control-sm\" type=\"number\" [value]=\"editRow()?.[col.accessor] ?? ''\" [placeholder]=\"col.label\" (input)=\"onEditInput($event, col.accessor, col)\" />\n }\n @else {\n <span [style.color]=\"getCellColor(getCellValue(row, col.accessor), col)\">{{ getDisplayValue(getCellValue(row,\n col.accessor)) }}</span>\n }\n </td>\n }\n @else {\n <td>\n @if (editing() === row['id'] && !col.readOnly) {\n @if (col.type === 'enum') {\n <select class=\"form-control form-control-sm\" [value]=\"editRow()?.[col.accessor] ?? ''\" (change)=\"onEditInput($event, col.accessor, col)\">\n <option value=\"\">{{ col.label }}</option>\n @for (option of getEnumOptions(col); track option.value) {\n <option [value]=\"option.value\">{{ option.label }}</option>\n }\n </select>\n }\n @else {\n <input class=\"form-control form-control-sm\" [type]=\"col.type === 'password' ? 'password' : 'text'\" [value]=\"editRow()?.[col.accessor] ?? ''\" [placeholder]=\"col.label\" (input)=\"onEditInput($event, col.accessor, col)\" />\n }\n }\n @else {\n @if (col.type === 'password') {\n <span [style.color]=\"getCellColor(getCellValue(row, col.accessor), col)\">******</span>\n }\n @else if (col.type === 'enum') {\n <span [style.color]=\"getCellColor(getCellValue(row, col.accessor), col)\">{{\n getEnumDisplayValue(getCellValue(row, col.accessor), col)\n }}</span>\n }\n @else if (getCellValue(row, col.accessor) === true) {\n <c80-icon icon=\"check\" [size]=\".7\"></c80-icon>\n }\n @else if (getCellValue(row, col.accessor) === false) {\n <c80-icon icon=\"cancel\" [size]=\".7\"></c80-icon>\n }\n @else {\n <span [style.color]=\"getCellColor(getCellValue(row, col.accessor), col)\">{{ getDisplayValue(getCellValue(row,\n col.accessor)) }}</span>\n }\n }\n </td>\n }\n }\n }\n @if (hasCreateActionListener() || hasUpdateActionListener() || hasDeleteActionListener() ||\n hasCancelActionListener() || hasViewActionListener() || hasGetRowButtonListener() ||\n hasMoveUpActionListener() || hasMoveDownActionListener()) {\n <td class=\"text-center actions-cell\">\n <div class=\"actions-container\">\n @if (editing() === row['id']) {\n <c80-icon button icon=\"check\" title=\"Guardar\" (iconClick)=\"saveEdit(row)\" [size]=\".7\"></c80-icon>\n <c80-icon button icon=\"cancel\" color=\"warn\" title=\"Cancelar\" (iconClick)=\"cancelEdit()\" [size]=\".7\"></c80-icon>\n }\n @else {\n @if (hasUpdateActionListener()) {\n <c80-icon button icon=\"edit\" title=\"Editar\" (iconClick)=\"onEdit(row)\" [size]=\".7\"></c80-icon>\n }\n @if (hasCancelActionListener()) {\n <c80-icon button icon=\"cancel_circle\" color=\"secondary\" title=\"Cancelar\" (iconClick)=\"onCancel(row)\" [size]=\".7\"></c80-icon>\n }\n @if (hasViewActionListener()) {\n <c80-icon button icon=\"view\" color=\"primary\" title=\"Ver\" (iconClick)=\"onView(row)\" [size]=\".7\"></c80-icon>\n }\n @if (hasGetRowButtonListener()) {\n <c80-icon button icon=\"get\" color=\"success\" title=\"Vincular\" (iconClick)=\"onGetRowButton(row)\" [size]=\".7\"></c80-icon>\n }\n @if (hasMoveUpActionListener()) {\n <c80-icon button icon=\"arrow_up\" color=\"secondary\" title=\"Mover arriba\" (iconClick)=\"onMoveUp(row)\" [size]=\".7\"></c80-icon>\n }\n @if (hasMoveDownActionListener()) {\n <c80-icon button icon=\"arrow_down\" color=\"secondary\" title=\"Mover abajo\" (iconClick)=\"onMoveDown(row)\" [size]=\".7\"></c80-icon>\n }\n @if (hasEnableActionListener()) {\n <c80-icon button [icon]=\"getCellValue(row, 'enabled') ? 'toggle_on' : 'toggle_off'\" [color]=\"getCellValue(row, 'enabled') ? 'success' : 'secondary'\" [title]=\"getCellValue(row, 'enabled') ? 'Deshabilitar' : 'Habilitar'\"\n (iconClick)=\"onEnable(row)\" [size]=\".7\">\n </c80-icon>\n }\n @if (hasDeleteActionListener()) {\n <c80-icon button icon=\"delete\" color=\"warn\" title=\"Borrar\" (iconClick)=\"onDelete(row)\" [size]=\".7\"></c80-icon>\n }\n }\n </div>\n </td>\n }\n </tr>\n }\n @if (creating() && hasCreateActionListener()) {\n <tr>\n @if (hasSelectableListener() && data().length !== 0) {\n <td class=\"text-center selection-column\">\n <!-- Empty cell for alignment -->\n </td>\n }\n @for (col of columns; track col) {\n @if (col.visible !== false) {\n @if (col.type === 'boolean') {\n <td class=\"text-center\">\n @if (!col.readOnly) {\n <input type=\"checkbox\" [checked]=\"!!newRow()?.[col.accessor]\" (change)=\"onInput($event, col.accessor, col)\" [attr.aria-label]=\"col.label\" />\n }\n @else {\n <!-- ReadOnly boolean column in create mode shows empty -->\n <span class=\"text-muted\">-</span>\n }\n </td>\n } @else if (col.type === 'number') {\n <td class=\"text-center number-column\">\n @if (!col.readOnly) {\n <input class=\"form-control form-control-sm\" type=\"number\" [value]=\"newRow()?.[col.accessor] ?? ''\" [placeholder]=\"col.label\" (input)=\"onInput($event, col.accessor, col)\" />\n }\n @else {\n <!-- ReadOnly number column in create mode shows empty -->\n <span class=\"text-muted\">-</span>\n }\n </td>\n } @else {\n <td>\n @if (!col.readOnly) {\n @if (col.type === 'enum') {\n <select class=\"form-control form-control-sm\" [value]=\"newRow()?.[col.accessor] ?? ''\" (change)=\"onInput($event, col.accessor, col)\">\n <option value=\"\">{{ col.label }}</option>\n @for (option of getEnumOptions(col); track option.value) {\n <option [value]=\"option.value\">{{ option.label }}</option>\n }\n </select>\n }\n @else {\n <input class=\"form-control form-control-sm\" type=\"text\" [value]=\"newRow()?.[col.accessor] ?? ''\" [placeholder]=\"col.label\" (input)=\"onInput($event, col.accessor, col)\" />\n }\n }\n @else {\n <!-- ReadOnly column in create mode shows empty -->\n <span class=\"text-muted\">-</span>\n }\n </td>\n }\n }\n }\n <td class=\"text-center actions-cell\">\n <div class=\"actions-container\">\n <c80-icon button icon=\"check\" title=\"Guardar\" (iconClick)=\"saveCreate()\" [size]=\".7\"></c80-icon>\n <c80-icon button icon=\"cancel\" color=\"warn\" title=\"Cancelar\" (iconClick)=\"cancelCreate()\" [size]=\".7\"></c80-icon>\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n @if (data().length === 0) {\n <div class=\"text-center text-muted py-3 small\">\n No hay datos para mostrar.\n </div>\n }\n</div>\n\n<c80-modal></c80-modal>", styles: ["@charset \"UTF-8\";input[type=checkbox]{width:1.3rem!important;height:1.3rem!important;accent-color:rgba(226,0,0,.7647058824);background:#fff;margin:0 .25rem;vertical-align:middle;cursor:pointer}.table-responsive{width:100%;overflow-x:auto}.table-responsive .search-container{margin-bottom:-.06rem}.table-responsive .search-container .search-input-wrapper .input-group .btn-borrar{border-bottom-right-radius:0;border-color:#dee2e6}.table-responsive .search-container .search-input-wrapper .input-group .input-group-text{background-color:#f8f9fa;border-color:#dee2e6;border-bottom-left-radius:0;color:#6c757d;width:56px}.table-responsive .search-container .search-input-wrapper .input-group .input-group-text c80-icon{display:flex;align-items:center;justify-content:center;padding-bottom:.2rem}.table-responsive .search-container .search-input-wrapper .input-group .search-input{border-color:#dee2e6;border-bottom-right-radius:0;font-size:.95rem;outline:none!important}.table-responsive .search-container .search-input-wrapper .input-group .search-input:focus{outline:none!important}.table-responsive .search-container .search-input-wrapper .input-group .search-input::placeholder{color:#999;font-style:italic}.table-responsive .table{min-width:0px;margin-bottom:.5rem}.table-responsive .table .sticky-header{position:sticky;top:0;z-index:10;background-color:#f8f9fa!important}.table-responsive .table .sticky-header .table-actions-header{display:table-cell;vertical-align:middle;padding:.2rem .6rem!important;background-color:#f8f9fa!important}.table-responsive .table .sticky-header .actions-wrapper{display:flex;align-items:center;justify-content:center;gap:.5rem;height:100%}.table-responsive .table .sticky-header th{max-height:31px!important;vertical-align:middle!important;padding:.2rem .6rem!important;font-size:small!important;background-color:#f8f9fa!important;border-bottom:2px solid #dee2e6}.table-responsive .table tbody td{height:35px!important;min-height:35px!important;max-height:35px!important;vertical-align:middle!important;padding:.2rem .8rem!important;font-size:small}.table-responsive .table tbody tr{height:35px!important;min-height:35px!important;max-height:35px!important;cursor:pointer}.table-responsive .table tbody tr:hover{background-color:#f5f5f5}.table-responsive .table tbody input{border:1px solid rgba(34,0,255,.37);height:100%!important;font-size:smaller!important}.table-responsive .table thead th.boolean-column,.table-responsive .table tbody td.boolean-column,.table-responsive .table thead th.selection-column,.table-responsive .table tbody td.selection-column,.table-responsive .table thead th.table-actions-header,.table-responsive .table tbody td.table-actions-header{width:1%;white-space:nowrap}.table-responsive .table thead th.number-column,.table-responsive .table tbody td.number-column{width:1%;white-space:nowrap;text-align:center}.table-responsive .table thead th.number-column input[type=number],.table-responsive .table tbody td.number-column input[type=number]{min-width:120px!important;width:120px!important;text-align:center}.table-responsive .table .actions-cell{white-space:nowrap;padding:0!important}.table-responsive .table .actions-container{display:flex;flex-direction:row;justify-content:center;align-items:center;width:100%;height:100%}\n"] }]
|
|
593
593
|
}], propDecorators: { data$: [{
|
|
594
594
|
type: Input
|
|
595
595
|
}], columns: [{
|
|
@@ -626,4 +626,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
626
626
|
}], selectable: [{
|
|
627
627
|
type: Output
|
|
628
628
|
}] } });
|
|
629
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy91aS9zcmMvbGliL3RhYmxlL3RhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL2xpYnMvdWkvc3JjL2xpYi90YWJsZS90YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sTUFBTSxFQUNOLFlBQVksRUFHWixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxNQUFNLFVBQVUsQ0FBQzs7QUF1QjNELE1BQU0sT0FBTyxpQkFBaUI7SUFDWCxZQUFZLEdBQWlCLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUMxRCxLQUFLLENBQW1CO0lBQ3hCLE9BQU8sR0FBcUIsRUFBRSxDQUFDO0lBQy9CLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyw2REFBNkQ7SUFDdkUsUUFBUSxHQUFHLElBQUksQ0FBQyxDQUFDLHlDQUF5QztJQUVuRSxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsZ0RBQWdEO0lBQ3pELFlBQVksR0FBRyxJQUFJLFlBQVksRUFBeUQsQ0FBQztJQUN6RixZQUFZLEdBQUcsSUFBSSxZQUFZLEVBQXFFLENBQUM7SUFDckcsWUFBWSxHQUFHLElBQUksWUFBWSxFQUFnRCxDQUFDO0lBQ2hGLFlBQVksR0FBRyxJQUFJLFlBQVksRUFBZ0QsQ0FBQztJQUNoRixVQUFVLEdBQUcsSUFBSSxZQUFZLEVBQUssQ0FBQztJQUNuQyxrQkFBa0IsR0FBRyxJQUFJLFlBQVksRUFBSyxDQUFDO0lBQzNDLFlBQVksR0FBRyxJQUFJLFlBQVksRUFBZ0QsQ0FBQztJQUNoRixjQUFjLEdBQUcsSUFBSSxZQUFZLEVBQWdELENBQUM7SUFDbEYsWUFBWSxHQUFHLElBQUksWUFBWSxFQUFrRSxDQUFDO0lBQ2xHLFVBQVUsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO0lBRXhDLFVBQVUsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO0lBQ3hDLFVBQVUsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBRXRDLElBQUksR0FBRyxNQUFNLENBQU0sRUFBRSxDQUFDLENBQUM7SUFDdkIsSUFBSSxHQUFHLE1BQU0sQ0FBVyxFQUFFLENBQUMsQ0FBQztJQUNyQyxRQUFRLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pCLE1BQU0sR0FBRyxNQUFNLENBQW9CLElBQUksQ0FBQyxDQUFDO0lBQ2hDLE9BQU8sR0FBRyxNQUFNLENBQVksSUFBSSxDQUFDLENBQUMsQ0FBQyx5QkFBeUI7SUFDNUQsT0FBTyxHQUFHLE1BQU0sQ0FBb0IsSUFBSSxDQUFDLENBQUM7SUFDMUMsYUFBYSxHQUFHLE1BQU0sQ0FBVSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDM0MsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QyxXQUFXLEdBQUcsTUFBTSxDQUFTLEVBQUUsQ0FBQyxDQUFDO0lBRTFDLDBDQUEwQztJQUNqQyx1QkFBdUIsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEMsdUJBQXVCLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hDLHVCQUF1QixHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4Qyx1QkFBdUIsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEMscUJBQXFCLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RDLHVCQUF1QixHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4Qyx1QkFBdUIsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEMseUJBQXlCLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFDLHVCQUF1QixHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QyxxQkFBcUIsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEMscUJBQXFCLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXZDLE9BQU8sQ0FBZ0I7SUFFdkIsZUFBZSxDQUFDLEdBQVk7UUFDbEMsT0FBUSxHQUFXLEVBQUUsT0FBTyxJQUFJLHVCQUF1QixDQUFDO0lBQzFELENBQUM7SUFFRCxRQUFRO1FBQ04sc0NBQXNDO1FBQ3RDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNqRSxJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUV6RCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPO1FBQ3hCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUM7WUFDbEMsSUFBSSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3JCLHFDQUFxQztnQkFDckMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQ3hDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxLQUFLLEtBQUssQ0FDaEMsQ0FBQztnQkFDRixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDekQsa0VBQWtFO2dCQUNsRSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUMzQixDQUFDO1lBQ0QsS0FBSyxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FDbEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNsRCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFFNUIsbURBQW1EO1FBQ25ELElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVELE9BQU8sQ0FBQyxLQUFZLEVBQUUsR0FBVyxFQUFFLEdBQW9CO1FBQ3JELElBQUksR0FBRyxFQUFFLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM1QixNQUFNLE9BQU8sR0FBSSxLQUFLLENBQUMsTUFBMkIsQ0FBQyxPQUFPLENBQUM7WUFDM0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDbEMsQ0FBQzthQUFNLElBQUksR0FBRyxFQUFFLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUNoQyxNQUFNLEtBQUssR0FBSSxLQUFLLENBQUMsTUFBNEIsQ0FBQyxLQUFLLENBQUM7WUFDeEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDaEMsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBMEIsQ0FBQztZQUNoRCxJQUFJLE1BQU0sSUFBSSxPQUFPLE1BQU0sQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQy9DLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2QyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQU07UUFDbkIsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBTyxDQUFDO1FBRTNCLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3BCLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUN6Qyx1QkFBdUIsRUFDdkIscUZBQXFGLEVBQ3JGLFVBQVUsRUFDVixVQUFVLENBQ1gsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7Z0JBQ3JCLEVBQUU7Z0JBQ0YsSUFBSSxFQUFFLENBQUMsT0FBZ0IsRUFBRSxFQUFFO29CQUN6QixJQUFJLE9BQU87d0JBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNqQyxDQUFDO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQU07UUFDbkIsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBTyxDQUFDO1FBRTNCLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3BCLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUN6Qyx1QkFBdUIsRUFDdkIsbURBQW1ELEVBQ25ELG1CQUFtQixFQUNuQixhQUFhLENBQ2QsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7Z0JBQ3JCLEVBQUU7Z0JBQ0YsSUFBSSxFQUFFLENBQUMsT0FBZ0IsRUFBRSxFQUFFO29CQUN6QixJQUFJLE9BQU87d0JBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNqQyxDQUFDO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEIsNkRBQTZEO1FBQzdELE1BQU0sR0FBRyxHQUFlLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsT0FBTzthQUNULE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sS0FBSyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO2FBQ3ZELE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ2QsR0FBK0IsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3RELENBQUMsQ0FBQyxDQUFDO1FBQ0wsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUVELFlBQVk7UUFDVixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQsWUFBWSxDQUFDLEdBQVcsRUFBRSxLQUFjO1FBQ3RDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsT0FBTztZQUFFLE9BQU87UUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELFVBQVU7UUFDUixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLEdBQUc7WUFBRSxPQUFPO1FBRWpCLGtGQUFrRjtRQUNsRixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sS0FBSyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUYsTUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUNuRCxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ2xFLE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxFQUFFLEVBQTZCLENBQWUsQ0FBQztRQUVoRCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztZQUNyQixHQUFHLEVBQUUsU0FBUztZQUNkLElBQUksRUFBRSxDQUFDLE9BQWdCLEVBQUUsRUFBRTtnQkFDekIsSUFBSSxPQUFPLEVBQUUsQ0FBQztvQkFDWixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3RCLENBQUM7WUFDSCxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNIOzs7T0FHRztJQUNLLGdCQUFnQixDQUFDLEtBQWMsRUFBRSxHQUFtQjtRQUMxRCxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssU0FBUztZQUFFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6RCxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssUUFBUTtZQUFFLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2RCxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssVUFBVTtZQUNsRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFbkMseUNBQXlDO1FBQ3pDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QixJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzVELElBQUksT0FBTyxXQUFXLEtBQUssU0FBUztnQkFBRSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkUsSUFBSSxPQUFPLFdBQVcsS0FBSyxRQUFRO2dCQUFFLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNqRSxJQUFJLE9BQU8sV0FBVyxLQUFLLFFBQVE7Z0JBQUUsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hFLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxzREFBc0Q7SUFDOUMsU0FBUyxDQUFDLEtBQWM7UUFDOUIsSUFBSSxPQUFPLEtBQUssS0FBSyxTQUFTO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDN0MsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1lBQzNCLE9BQU8sS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxLQUFLLE1BQU0sSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssR0FBRyxDQUFDO1FBQ3ZFLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtZQUFFLE9BQU8sS0FBSyxLQUFLLENBQUMsQ0FBQztRQUNsRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxxREFBcUQ7SUFDN0MsUUFBUSxDQUFDLEtBQWM7UUFDN0IsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDNUMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1lBQzNCLE9BQU8sS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekQsSUFBSSxPQUFPLEtBQUssS0FBSyxTQUFTO1lBQUUsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxpRkFBaUY7SUFDekUsYUFBYSxDQUFDLEtBQWM7UUFDbEMsSUFBSSxLQUFLLElBQUksSUFBSTtZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQzdCLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQzVDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxLQUFLLFNBQVM7WUFDekQsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkIsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUM7Z0JBQ0gsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9CLENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1AsT0FBTyxpQkFBaUIsQ0FBQztZQUMzQixDQUFDO1FBQ0gsQ0FBQztRQUNELCtEQUErRDtRQUMvRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxNQUFNLENBQUMsR0FBTTtRQUNYLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQU8sQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sSUFBSSxHQUFlLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsT0FBTzthQUNULE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sS0FBSyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO2FBQ3ZELE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ2YsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2xELElBQWdDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUMxRCxDQUFDLENBQUMsQ0FBQztRQUNMLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxVQUFVO1FBQ1IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFZLEVBQUUsR0FBVyxFQUFFLEdBQW9CO1FBQ3pELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsT0FBTztZQUFFLE9BQU87UUFDckIsSUFBSSxHQUFHLEVBQUUsSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzVCLE1BQU0sT0FBTyxHQUFJLEtBQUssQ0FBQyxNQUEyQixDQUFDLE9BQU8sQ0FBQztZQUMzRCxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNuRCxDQUFDO2FBQU0sSUFBSSxHQUFHLEVBQUUsSUFBSSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ2hDLE1BQU0sS0FBSyxHQUFJLEtBQUssQ0FBQyxNQUE0QixDQUFDLEtBQUssQ0FBQztZQUN4RCxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNqRCxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUEwQixDQUFDO1lBQ2hELElBQUksTUFBTSxJQUFJLE9BQU8sTUFBTSxDQUFDLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDL0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ3hELENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELFFBQVEsQ0FBQyxHQUFNO1FBQ2IsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxRQUFRLElBQUksT0FBTyxFQUFFLEtBQUssUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ3ZFLE9BQU87UUFDVCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FDeEMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEtBQUssS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FDaEQsQ0FBQztRQUNGLE1BQU0sU0FBUyxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDbkQsR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQ3ZDLElBQUksQ0FBQyxPQUFPLEVBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQzdCLEdBQUcsQ0FDSixDQUFDO1lBQ0YsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLEVBQUUsRUFBNkIsQ0FBZSxDQUFDO1FBRWhELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDO1lBQ3JCLEVBQUU7WUFDRixPQUFPLEVBQUUsU0FBUztZQUNsQixJQUFJLEVBQUUsQ0FBQyxPQUFnQixFQUFFLEVBQUU7Z0JBQ3pCLElBQUksT0FBTyxFQUFFLENBQUM7b0JBQ1osSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNwQixDQUFDO1lBQ0gsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILFNBQVMsQ0FBQyxLQUFhLEVBQUUsR0FBTTtRQUM3QixNQUFNLEVBQUUsR0FDTixHQUFHLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxJQUFJLElBQUksSUFBSSxHQUFHO1lBQzNDLENBQUMsQ0FBRSxHQUErQixDQUFDLElBQUksQ0FBQztZQUN4QyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ2hCLE9BQU8sT0FBTyxFQUFFLEtBQUssUUFBUSxJQUFJLE9BQU8sRUFBRSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDdkUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLEdBQU07UUFDWCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxjQUFjLENBQUMsR0FBTTtRQUNuQixJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBTTtRQUNuQixNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFPLENBQUM7UUFDM0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7WUFDckIsRUFBRTtZQUNGLElBQUksRUFBRSxDQUFDLE9BQWdCLEVBQUUsRUFBRTtnQkFDekIsSUFBSSxPQUFPO29CQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNqQyxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFNO1FBQ3JCLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQU8sQ0FBQztRQUMzQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQztZQUN2QixFQUFFO1lBQ0YsSUFBSSxFQUFFLENBQUMsT0FBZ0IsRUFBRSxFQUFFO2dCQUN6QixJQUFJLE9BQU87b0JBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2pDLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQU07UUFDbkIsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBTyxDQUFDO1FBQzNCLE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQVksQ0FBQztRQUNqRCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztZQUNyQixFQUFFO1lBQ0YsT0FBTyxFQUFFLENBQUMsY0FBYyxFQUFFLDJCQUEyQjtZQUNyRCxJQUFJLEVBQUUsQ0FBQyxPQUFnQixFQUFFLEVBQUU7Z0JBQ3pCLElBQUksT0FBTztvQkFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDakMsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILGFBQWEsQ0FBQyxLQUFZO1FBQ3hCLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUEwQixDQUFDO1FBQ2hELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDM0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsV0FBVztRQUNULElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRDs7T0FFRztJQUNLLGNBQWMsQ0FBQyxHQUFRLEVBQUUsUUFBZ0I7UUFDL0MsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUNqRCxPQUFPLE9BQU8sSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQzNFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNWLENBQUM7SUFFRDs7T0FFRztJQUNILFlBQVksQ0FBQyxHQUFNLEVBQUUsUUFBZ0I7UUFDbkMsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDM0IsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM1QyxDQUFDO1FBQ0QsT0FBUSxHQUErQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRDs7T0FFRztJQUNILGVBQWUsQ0FBQyxLQUFjO1FBQzVCLHlCQUF5QjtRQUN6QixJQUFJLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNoQixPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUM7UUFDRCxpRkFBaUY7UUFDakYsSUFBSSxLQUFLLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDcEIsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQztRQUNELG1EQUFtRDtRQUNuRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDaEQsSUFBSSxDQUFDO2dCQUNILE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMvQixDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNQLE9BQU8saUJBQWlCLENBQUM7WUFDM0IsQ0FBQztRQUNILENBQUM7UUFDRCxpRUFBaUU7UUFDakUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDO1FBQ0QsZ0NBQWdDO1FBQ2hDLElBQ0UsT0FBTyxLQUFLLEtBQUssUUFBUTtZQUN6QixPQUFPLEtBQUssS0FBSyxRQUFRO1lBQ3pCLE9BQU8sS0FBSyxLQUFLLFNBQVMsRUFDMUIsQ0FBQztZQUNELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZCLENBQUM7UUFDRCxzRUFBc0U7UUFDdEUsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQ7O09BRUc7SUFDSCxtQkFBbUIsQ0FBQyxLQUFjLEVBQUUsR0FBbUI7UUFDckQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN6QyxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUM7UUFDRCxNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQXdCLENBQUMsQ0FBQztRQUN4RCxPQUFPLENBQ0wsWUFBWTtZQUNaLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7Z0JBQ3JELENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO2dCQUNmLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FDVCxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsY0FBYyxDQUNaLEdBQW1CO1FBRW5CLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSTtZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3pCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDdkQsS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQ25ELEtBQUs7U0FDTixDQUFDLENBQUMsQ0FBQztJQUNOLENBQUM7SUFFRDs7T0FFRztJQUNILFlBQVksQ0FBQyxLQUFjLEVBQUUsR0FBbUI7UUFDOUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMxQyxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQXdCLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsaUJBQWlCO1FBQ2YsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ25CLE9BQU8sU0FBUyxDQUFDLENBQUMsdUJBQXVCO1FBQzNDLENBQUM7UUFDRCw4QkFBOEI7UUFDOUIsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDO1FBQ3ZCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyRCxPQUFPLEdBQUcsU0FBUyxJQUFJLENBQUM7SUFDMUIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsY0FBYztRQUNaLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVEOzs7T0FHRztJQUNLLGlCQUFpQjtRQUN2QixNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUM5QyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFaEMsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDNUQsMkRBQTJEO1lBQzNELElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN0QixPQUFPO1FBQ1QsQ0FBQztRQUVELGtEQUFrRDtRQUNsRCxNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBTyxDQUFDLENBQUMsQ0FBQztRQUV4RSx5RUFBeUU7UUFDekUsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsQ0FDaEMsS0FBSyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FDaEUsQ0FBQztRQUVGLGtEQUFrRDtRQUNsRCxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQsZUFBZTtRQUNiLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzlDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUU3QixJQUFJLGdCQUFnQixDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDOUMsZUFBZTtZQUNmLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN4QixDQUFDO2FBQU0sQ0FBQztZQUNOLGFBQWE7WUFDYixNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBTyxDQUFDLENBQUMsQ0FBQztZQUMvRCxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMvQixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDdkIsQ0FBQztJQUNILENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxJQUFPO1FBQ3pCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQU8sQ0FBQztRQUM1QixNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBRXZELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkIsMkRBQTJEO1lBQzNELElBQUksZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQzdCLG1DQUFtQztnQkFDbkMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDM0IsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLGlDQUFpQztnQkFDakMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ3pCLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMzQixDQUFDO1FBQ0gsQ0FBQzthQUFNLElBQUksZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDcEMsdURBQXVEO1lBQ3ZELGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5QixDQUFDO2FBQU0sQ0FBQztZQUNOLDZDQUE2QztZQUM3QyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDM0IsQ0FBQztRQUVELElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFBQyxjQUFjLENBQUMsSUFBTztRQUN0QixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFPLENBQUM7UUFDNUIsT0FBTyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFTyxvQkFBb0I7UUFDMUIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLElBQUksQ0FBQztRQUNoRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDO1FBRXRDLElBQUksYUFBYSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QyxDQUFDO2FBQU0sSUFBSSxhQUFhLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDeEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLENBQUM7SUFDSCxDQUFDO0lBRU8sYUFBYTtRQUNuQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDekMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUM5QyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQU8sQ0FBQyxDQUNsQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVPLFlBQVksQ0FBQyxLQUFVO1FBQzdCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0QsSUFBSSxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzlCLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDN0IsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDbEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBb0IsQ0FBQztvQkFDckUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBb0IsQ0FBQztvQkFFckUsSUFBSSxHQUFHLENBQUMsS0FBSyxLQUFLLEtBQUssRUFBRSxDQUFDO3dCQUN4QixJQUFJLE1BQU0sR0FBRyxNQUFNOzRCQUFFLE9BQU8sQ0FBQyxDQUFDO3dCQUM5QixJQUFJLE1BQU0sR0FBRyxNQUFNOzRCQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7d0JBQy9CLE9BQU8sQ0FBQyxDQUFDO29CQUNYLENBQUM7eUJBQU0sQ0FBQzt3QkFDTixJQUFJLE1BQU0sR0FBRyxNQUFNOzRCQUFFLE9BQU8sQ0FBQyxDQUFDO3dCQUM5QixJQUFJLE1BQU0sR0FBRyxNQUFNOzRCQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7d0JBQy9CLE9BQU8sQ0FBQyxDQUFDO29CQUNYLENBQUM7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO3dHQTNuQlUsaUJBQWlCOzRGQUFqQixpQkFBaUIscUtBTVIsQ0FBQyxLQUF1QixFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssRUFBRSxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLE1BQU0sa1pDekNyRyxrcFdBcVB1QixteEdEdE5YLGdCQUFnQiw2SkFBRSxpQkFBaUI7OzRGQUlsQyxpQkFBaUI7a0JBUjdCLFNBQVM7K0JBRUUsV0FBVyxjQUNULElBQUksV0FDUCxDQUFDLGdCQUFnQixFQUFFLGlCQUFpQixDQUFDOzhCQU1yQyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVOLFNBQVM7c0JBRFIsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEtBQXVCLEVBQUUsRUFBRSxDQUFDLEtBQUssS0FBSyxFQUFFLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssTUFBTSxFQUFFO2dCQUUzRixZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csa0JBQWtCO3NCQUEzQixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBRUcsVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBzaWduYWwsXG4gIEV2ZW50RW1pdHRlcixcbiAgT25Jbml0LFxuICBPbkRlc3Ryb3ksXG4gIGluamVjdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEM4MEljb25Db21wb25lbnQgfSBmcm9tICcuLi9pY29uL2ljb24uY29tcG9uZW50JztcbmltcG9ydCB7IEM4ME1vZGFsQ29tcG9uZW50LCBNb2RhbFNlcnZpY2UgfSBmcm9tICcuLi9tb2RhbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQzgwVGFibGVDb2xEZWYge1xuICBhY2Nlc3Nvcjogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xuICB2aXNpYmxlPzogYm9vbGVhbjsgLy8gU2kgbm8gc2UgZXNwZWNpZmljYSwgc2UgYXN1bWUgdHJ1ZVxuICB0eXBlPzogJ3N0cmluZycgfCAnbnVtYmVyJyB8ICdib29sZWFuJyB8ICdwYXNzd29yZCcgfCAnZW51bSc7IC8vIFRpcG8gZGUgZGF0byBwYXJhIGxhIGNvbHVtbmFcbiAgb3JkZXI/OiAnQVNDJyB8ICdERVNDJzsgLy8gT3JkZW5hbWllbnRvIGRlIGxhIGNvbHVtbmFcbiAgcmVhZE9ubHk/OiBib29sZWFuOyAvLyBTaSBubyBzZSBlc3BlY2lmaWNhLCBzZSBhc3VtZSBmYWxzZVxuICBlbnVtPzogUmVjb3JkPHN0cmluZyB8IG51bWJlciwgc3RyaW5nPjsgLy8gT3BjaW9uZXMgZGVsIGVudW0gcGFyYSB0eXBlICdlbnVtJ1xuICBjb2xvcj86IFJlY29yZDxzdHJpbmcgfCBudW1iZXIsIHN0cmluZz47IC8vIENvbG9yZXMgQ1NTIGJhc2Fkb3MgZW4gZWwgdmFsb3IgZGUgbGEgY2VsZGFcbn1cblxuZXhwb3J0IHR5cGUgSUQgPSBudW1iZXIgfCBzdHJpbmc7XG5cbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2M4MC10YWJsZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDODBJY29uQ29tcG9uZW50LCBDODBNb2RhbENvbXBvbmVudF0sXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuc2NzcycsXG59KVxuZXhwb3J0IGNsYXNzIEM4MFRhYmxlQ29tcG9uZW50PFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbW9kYWxTZXJ2aWNlOiBNb2RhbFNlcnZpY2UgPSBpbmplY3QoTW9kYWxTZXJ2aWNlKTtcbiAgQElucHV0KCkgZGF0YSQhOiBPYnNlcnZhYmxlPFRbXT47XG4gIEBJbnB1dCgpIGNvbHVtbnM6IEM4MFRhYmxlQ29sRGVmW10gPSBbXTtcbiAgQElucHV0KCkgc2l6ZSA9IDA7IC8vIFRhbWHDsW8gZGUgbGEgdGFibGEgKDAgPSBzaW4gbMOtbWl0ZSwgPiAwIGFwbGljYSBtYXgtaGVpZ2h0KVxuICBASW5wdXQoKSBtdWx0aXBsZSA9IHRydWU7IC8vIFBlcm1pdGUgc2VsZWNjacOzbiBtw7psdGlwbGUgcG9yIGRlZmVjdG9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiAodmFsdWU6IGJvb2xlYW4gfCBzdHJpbmcpID0+IHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gJ3RydWUnIH0pXG4gIG5vQ29uZmlybSA9IGZhbHNlOyAvLyBTaSBlcyB0cnVlLCBubyBtdWVzdHJhIGNvbmZpcm1hY2lvbmVzIG1vZGFsZXNcbiAgQE91dHB1dCgpIGNyZWF0ZUFjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8eyByb3c6IFBhcnRpYWw8VD47IGRvbmU6IChyZXN1bHQ6IGJvb2xlYW4pID0+IHZvaWQ7IH0+KCk7XG4gIEBPdXRwdXQoKSB1cGRhdGVBY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPHsgaWQ6IElEOyBjaGFuZ2VzOiBQYXJ0aWFsPFQ+OyBkb25lOiAocmVzdWx0OiBib29sZWFuKSA9PiB2b2lkOyB9PigpO1xuICBAT3V0cHV0KCkgZGVsZXRlQWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjx7IGlkOiBJRDsgZG9uZTogKHJlc3VsdDogYm9vbGVhbikgPT4gdm9pZDsgfT4oKTtcbiAgQE91dHB1dCgpIGNhbmNlbEFjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8eyBpZDogSUQ7IGRvbmU6IChyZXN1bHQ6IGJvb2xlYW4pID0+IHZvaWQ7IH0+KCk7XG4gIEBPdXRwdXQoKSB2aWV3QWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxUPigpO1xuICBAT3V0cHV0KCkgZ2V0Um93QnV0dG9uQWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxUPigpO1xuICBAT3V0cHV0KCkgbW92ZVVwQWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjx7IGlkOiBJRDsgZG9uZTogKHJlc3VsdDogYm9vbGVhbikgPT4gdm9pZDsgfT4oKTtcbiAgQE91dHB1dCgpIG1vdmVEb3duQWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjx7IGlkOiBJRDsgZG9uZTogKHJlc3VsdDogYm9vbGVhbikgPT4gdm9pZDsgfT4oKTtcbiAgQE91dHB1dCgpIGVuYWJsZUFjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8eyBpZDogSUQ7IGVuYWJsZWQ6IGJvb2xlYW47IGRvbmU6IChyZXN1bHQ6IGJvb2xlYW4pID0+IHZvaWQ7IH0+KCk7XG4gIEBPdXRwdXQoKSBzZWFyY2hUZXJtID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgQE91dHB1dCgpIGVycm9yRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIHNlbGVjdGFibGUgPSBuZXcgRXZlbnRFbWl0dGVyPFRbXT4oKTtcblxuICByZWFkb25seSBkYXRhID0gc2lnbmFsPFRbXT4oW10pO1xuICByZWFkb25seSBrZXlzID0gc2lnbmFsPHN0cmluZ1tdPihbXSk7XG4gIGNyZWF0aW5nID0gc2lnbmFsKGZhbHNlKTtcbiAgbmV3Um93ID0gc2lnbmFsPFBhcnRpYWw8VD4gfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgZWRpdGluZyA9IHNpZ25hbDxJRCB8IG51bGw+KG51bGwpOyAvLyBpZCBvZiByb3cgYmVpbmcgZWRpdGVkXG4gIHJlYWRvbmx5IGVkaXRSb3cgPSBzaWduYWw8UGFydGlhbDxUPiB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSBzZWxlY3RlZEl0ZW1zID0gc2lnbmFsPFNldDxJRD4+KG5ldyBTZXQoKSk7XG4gIHJlYWRvbmx5IHNlbGVjdEFsbENoZWNrZWQgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBzZWxlY3RBbGxJbmRldGVybWluYXRlID0gc2lnbmFsKGZhbHNlKTtcbiAgcmVhZG9ubHkgc2VhcmNoVmFsdWUgPSBzaWduYWw8c3RyaW5nPignJyk7XG5cbiAgLy8gRmxhZ3MgdG8gY2hlY2sgaWYgZXZlbnRzIGhhdmUgbGlzdGVuZXJzXG4gIHJlYWRvbmx5IGhhc0NyZWF0ZUFjdGlvbkxpc3RlbmVyID0gc2lnbmFsKGZhbHNlKTtcbiAgcmVhZG9ubHkgaGFzVXBkYXRlQWN0aW9uTGlzdGVuZXIgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBoYXNEZWxldGVBY3Rpb25MaXN0ZW5lciA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IGhhc0NhbmNlbEFjdGlvbkxpc3RlbmVyID0gc2lnbmFsKGZhbHNlKTtcbiAgcmVhZG9ubHkgaGFzVmlld0FjdGlvbkxpc3RlbmVyID0gc2lnbmFsKGZhbHNlKTtcbiAgcmVhZG9ubHkgaGFzR2V0Um93QnV0dG9uTGlzdGVuZXIgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBoYXNNb3ZlVXBBY3Rpb25MaXN0ZW5lciA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IGhhc01vdmVEb3duQWN0aW9uTGlzdGVuZXIgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBoYXNFbmFibGVBY3Rpb25MaXN0ZW5lciA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IGhhc1NlYXJjaFRlcm1MaXN0ZW5lciA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IGhhc1NlbGVjdGFibGVMaXN0ZW5lciA9IHNpZ25hbChmYWxzZSk7XG5cbiAgcHJpdmF0ZSBkYXRhU3ViPzogU3Vic2NyaXB0aW9uO1xuXG4gIHByaXZhdGUgZ2V0RXJyb3JNZXNzYWdlKGVycjogdW5rbm93bik6IHN0cmluZyB7XG4gICAgcmV0dXJuIChlcnIgYXMgYW55KT8ubWVzc2FnZSB8fCAnRXJyb3IgYWwgY2FyZ2FyIGRhdG9zJztcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIC8vIENoZWNrIGlmIHRoZSBvdXRwdXRzIGhhdmUgbGlzdGVuZXJzXG4gICAgdGhpcy5oYXNDcmVhdGVBY3Rpb25MaXN0ZW5lci5zZXQodGhpcy5jcmVhdGVBY3Rpb24ub2JzZXJ2ZWQpO1xuICAgIHRoaXMuaGFzVXBkYXRlQWN0aW9uTGlzdGVuZXIuc2V0KHRoaXMudXBkYXRlQWN0aW9uLm9ic2VydmVkKTtcbiAgICB0aGlzLmhhc0RlbGV0ZUFjdGlvbkxpc3RlbmVyLnNldCh0aGlzLmRlbGV0ZUFjdGlvbi5vYnNlcnZlZCk7XG4gICAgdGhpcy5oYXNDYW5jZWxBY3Rpb25MaXN0ZW5lci5zZXQodGhpcy5jYW5jZWxBY3Rpb24ub2JzZXJ2ZWQpO1xuICAgIHRoaXMuaGFzVmlld0FjdGlvbkxpc3RlbmVyLnNldCh0aGlzLnZpZXdBY3Rpb24ub2JzZXJ2ZWQpO1xuICAgIHRoaXMuaGFzR2V0Um93QnV0dG9uTGlzdGVuZXIuc2V0KHRoaXMuZ2V0Um93QnV0dG9uQWN0aW9uLm9ic2VydmVkKTtcbiAgICB0aGlzLmhhc01vdmVVcEFjdGlvbkxpc3RlbmVyLnNldCh0aGlzLm1vdmVVcEFjdGlvbi5vYnNlcnZlZCk7XG4gICAgdGhpcy5oYXNNb3ZlRG93bkFjdGlvbkxpc3RlbmVyLnNldCh0aGlzLm1vdmVEb3duQWN0aW9uLm9ic2VydmVkKTtcbiAgICB0aGlzLmhhc0VuYWJsZUFjdGlvbkxpc3RlbmVyLnNldCh0aGlzLmVuYWJsZUFjdGlvbi5vYnNlcnZlZCk7XG4gICAgdGhpcy5oYXNTZWFyY2hUZXJtTGlzdGVuZXIuc2V0KHRoaXMuc2VhcmNoVGVybS5vYnNlcnZlZCk7XG4gICAgdGhpcy5oYXNTZWxlY3RhYmxlTGlzdGVuZXIuc2V0KHRoaXMuc2VsZWN0YWJsZS5vYnNlcnZlZCk7XG5cbiAgICBpZiAoIXRoaXMuZGF0YSQpIHJldHVybjtcbiAgICB0aGlzLmRhdGFTdWIgPSB0aGlzLmRhdGEkLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoaXRlbXMpID0+IHtcbiAgICAgICAgdGhpcy5hcHBseVNvcnRpbmcoaXRlbXMpO1xuICAgICAgICB0aGlzLmRhdGEuc2V0KGl0ZW1zKTtcbiAgICAgICAgLy8gU29sbyBtb3N0cmFyIGxhcyBjb2x1bW5hcyB2aXNpYmxlc1xuICAgICAgICBjb25zdCB2aXNpYmxlQ29sdW1ucyA9IHRoaXMuY29sdW1ucy5maWx0ZXIoXG4gICAgICAgICAgKGNvbCkgPT4gY29sPy52aXNpYmxlICE9PSBmYWxzZVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmtleXMuc2V0KHZpc2libGVDb2x1bW5zLm1hcCgoY29sKSA9PiBjb2wuYWNjZXNzb3IpKTtcbiAgICAgICAgLy8gTWFudGVuZXIgbGEgc2VsZWNjacOzbiBleGlzdGVudGUgZGVzcHXDqXMgZGUgYWN0dWFsaXphciBsb3MgZGF0b3NcbiAgICAgICAgdGhpcy5wcmVzZXJ2ZVNlbGVjdGlvbigpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+XG4gICAgICAgIHRoaXMuZXJyb3JFdmVudC5lbWl0KHRoaXMuZ2V0RXJyb3JNZXNzYWdlKGVycikpLFxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5kYXRhU3ViPy51bnN1YnNjcmliZSgpO1xuXG4gICAgLy8gQ2xvc2UgYW55IG9wZW4gbW9kYWwgd2hlbiBjb21wb25lbnQgaXMgZGVzdHJveWVkXG4gICAgdGhpcy5tb2RhbFNlcnZpY2UuY2xvc2VNb2RhbCgpO1xuICB9XG5cbiAgb25JbnB1dChldmVudDogRXZlbnQsIGtleTogc3RyaW5nLCBjb2w/OiBDODBUYWJsZUNvbERlZikge1xuICAgIGlmIChjb2w/LnR5cGUgPT09ICdib29sZWFuJykge1xuICAgICAgY29uc3QgY2hlY2tlZCA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkuY2hlY2tlZDtcbiAgICAgIHRoaXMudXBkYXRlTmV3Um93KGtleSwgY2hlY2tlZCk7XG4gICAgfSBlbHNlIGlmIChjb2w/LnR5cGUgPT09ICdlbnVtJykge1xuICAgICAgY29uc3QgdmFsdWUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxTZWxlY3RFbGVtZW50KS52YWx1ZTtcbiAgICAgIHRoaXMudXBkYXRlTmV3Um93KGtleSwgdmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICAgIGlmICh0YXJnZXQgJiYgdHlwZW9mIHRhcmdldC52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy51cGRhdGVOZXdSb3coa2V5LCB0YXJnZXQudmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG9uRGVsZXRlKHJvdzogVCkge1xuICAgIGNvbnN0IGlkID0gcm93WydpZCddIGFzIElEO1xuXG4gICAgbGV0IGNvbmZpcm1lZCA9IHRydWU7XG4gICAgaWYgKCF0aGlzLm5vQ29uZmlybSkge1xuICAgICAgY29uZmlybWVkID0gYXdhaXQgdGhpcy5tb2RhbFNlcnZpY2UuY29uZmlybShcbiAgICAgICAgJ0NvbmZpcm1hciBlbGltaW5hY2nDs24nLFxuICAgICAgICAnwr9Fc3TDoSBzZWd1cm8gZGUgcXVlIGRlc2VhIGVsaW1pbmFyIGVzdGUgZWxlbWVudG8/IEVzdGEgYWNjacOzbiBubyBzZSBwdWVkZSBkZXNoYWNlci4nLFxuICAgICAgICAnRWxpbWluYXInLFxuICAgICAgICAnQ2FuY2VsYXInXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChjb25maXJtZWQpIHtcbiAgICAgIHRoaXMuZGVsZXRlQWN0aW9uLmVtaXQoe1xuICAgICAgICBpZCxcbiAgICAgICAgZG9uZTogKHN1Y2Nlc3M6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICBpZiAoc3VjY2VzcykgdGhpcy5jYW5jZWxFZGl0KCk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBvbkNhbmNlbChyb3c6IFQpIHtcbiAgICBjb25zdCBpZCA9IHJvd1snaWQnXSBhcyBJRDtcblxuICAgIGxldCBjb25maXJtZWQgPSB0cnVlO1xuICAgIGlmICghdGhpcy5ub0NvbmZpcm0pIHtcbiAgICAgIGNvbmZpcm1lZCA9IGF3YWl0IHRoaXMubW9kYWxTZXJ2aWNlLmNvbmZpcm0oXG4gICAgICAgICdDb25maXJtYXIgY2FuY2VsYWNpw7NuJyxcbiAgICAgICAgJ8K/RXN0w6Egc2VndXJvIGRlIHF1ZSBkZXNlYSBjYW5jZWxhciBlc3RlIGVsZW1lbnRvPycsXG4gICAgICAgICdDYW5jZWxhciBlbGVtZW50bycsXG4gICAgICAgICdObyBjYW5jZWxhcidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpcm1lZCkge1xuICAgICAgdGhpcy5jYW5jZWxBY3Rpb24uZW1pdCh7XG4gICAgICAgIGlkLFxuICAgICAgICBkb25lOiAoc3VjY2VzczogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIGlmIChzdWNjZXNzKSB0aGlzLmNhbmNlbEVkaXQoKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHN0YXJ0Q3JlYXRlKCkge1xuICAgIHRoaXMuY3JlYXRpbmcuc2V0KHRydWUpO1xuICAgIC8vIEluaWNpYWxpemEgbmV3Um93IHNvbG8gY29uIGNvbHVtbmFzIHZpc2libGVzIHkgbm8gcmVhZE9ubHlcbiAgICBjb25zdCByb3c6IFBhcnRpYWw8VD4gPSB7fTtcbiAgICB0aGlzLmNvbHVtbnNcbiAgICAgIC5maWx0ZXIoKGNvbCkgPT4gY29sLnZpc2libGUgIT09IGZhbHNlICYmICFjb2wucmVhZE9ubHkpXG4gICAgICAuZm9yRWFjaCgoY29sKSA9PiB7XG4gICAgICAgIChyb3cgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2NvbC5hY2Nlc3Nvcl0gPSAnJztcbiAgICAgIH0pO1xuICAgIHRoaXMubmV3Um93LnNldChyb3cpO1xuICB9XG5cbiAgY2FuY2VsQ3JlYXRlKCkge1xuICAgIHRoaXMuY3JlYXRpbmcuc2V0KGZhbHNlKTtcbiAgICB0aGlzLm5ld1Jvdy5zZXQobnVsbCk7XG4gIH1cblxuICB1cGRhdGVOZXdSb3coa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMubmV3Um93KCk7XG4gICAgaWYgKCFjdXJyZW50KSByZXR1cm47XG4gICAgdGhpcy5uZXdSb3cuc2V0KHsgLi4uY3VycmVudCwgW2tleV06IHZhbHVlIH0pO1xuICB9XG5cbiAgc2F2ZUNyZWF0ZSgpIHtcbiAgICBjb25zdCByb3cgPSB0aGlzLm5ld1JvdygpO1xuICAgIGlmICghcm93KSByZXR1cm47XG5cbiAgICAvLyBWYWxpZGFyIGNhbXBvcyByZXF1ZXJpZG9zIGFudGVzIGRlIGNyZWFyIC0gc29sbyBjb2x1bW5hcyB2aXNpYmxlcyB5IG5vIHJlYWRPbmx5XG4gICAgY29uc3QgdmlzaWJsZUNvbHVtbnMgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKChjb2wpID0+IGNvbC52aXNpYmxlICE9PSBmYWxzZSAmJiAhY29sLnJlYWRPbmx5KTtcbiAgICBjb25zdCBjb252ZXJ0ZWQgPSB2aXNpYmxlQ29sdW1ucy5yZWR1Y2UoKGFjYywgY29sKSA9PiB7XG4gICAgICBhY2NbY29sLmFjY2Vzc29yXSA9IHRoaXMuY29udmVydENlbGxWYWx1ZShyb3dbY29sLmFjY2Vzc29yXSwgY29sKTtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIGFzIFBhcnRpYWw8VD47XG5cbiAgICB0aGlzLmNyZWF0ZUFjdGlvbi5lbWl0KHtcbiAgICAgIHJvdzogY29udmVydGVkLFxuICAgICAgZG9uZTogKHN1Y2Nlc3M6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgICB0aGlzLmNhbmNlbENyZWF0ZSgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgY2VsbCB2YWx1ZSBiYXNlZCBvbiBjb2x1bW4gdHlwZSBvciBzYW1wbGUgZGF0YS5cbiAgICogSGFuZGxlcyBzdHJpbmdpZmljYXRpb24gb2Ygb2JqZWN0cyBmb3Igc3RyaW5nIGNvbHVtbnMuXG4gICAqL1xuICAvKipcbiAgICogQ29udmVydHMgYSBjZWxsIHZhbHVlIGJhc2VkIG9uIGNvbHVtbiB0eXBlIG9yIHNhbXBsZSBkYXRhLlxuICAgKiBEZWxlZ2F0ZXMgdG8gdHlwZS1zcGVjaWZpYyBoZWxwZXJzIGZvciBjbGFyaXR5IGFuZCBtYWludGFpbmFiaWxpdHkuXG4gICAqL1xuICBwcml2YXRlIGNvbnZlcnRDZWxsVmFsdWUodmFsdWU6IHVua25vd24sIGNvbDogQzgwVGFibGVDb2xEZWYpOiB1bmtub3duIHtcbiAgICBpZiAoY29sLnR5cGUgPT09ICdib29sZWFuJykgcmV0dXJuIHRoaXMudG9Cb29sZWFuKHZhbHVlKTtcbiAgICBpZiAoY29sLnR5cGUgPT09ICdudW1iZXInKSByZXR1cm4gdGhpcy50b051bWJlcih2YWx1ZSk7XG4gICAgaWYgKGNvbC50eXBlID09PSAnc3RyaW5nJyB8fCBjb2wudHlwZSA9PT0gJ3Bhc3N3b3JkJylcbiAgICAgIHJldHVybiB0aGlzLnRvU3RyaW5nVmFsdWUodmFsdWUpO1xuXG4gICAgLy8gRmFsbGJhY2s6IHVzZSBzYW1wbGUgZGF0YSBpZiBhdmFpbGFibGVcbiAgICBjb25zdCBzYW1wbGUgPSB0aGlzLmRhdGEoKVswXTtcbiAgICBpZiAoc2FtcGxlKSB7XG4gICAgICBjb25zdCBzYW1wbGVWYWx1ZSA9IHRoaXMuZ2V0Q2VsbFZhbHVlKHNhbXBsZSwgY29sLmFjY2Vzc29yKTtcbiAgICAgIGlmICh0eXBlb2Ygc2FtcGxlVmFsdWUgPT09ICdib29sZWFuJykgcmV0dXJuIHRoaXMudG9Cb29sZWFuKHZhbHVlKTtcbiAgICAgIGlmICh0eXBlb2Ygc2FtcGxlVmFsdWUgPT09ICdudW1iZXInKSByZXR1cm4gdGhpcy50b051bWJlcih2YWx1ZSk7XG4gICAgICBpZiAodHlwZW9mIHNhbXBsZVZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIHRoaXMudG9TdHJpbmdWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKiBDb252ZXJ0cyB2YWx1ZSB0byBib29sZWFuIHVzaW5nIGJlc3QgcHJhY3RpY2VzLiAqL1xuICBwcml2YXRlIHRvQm9vbGVhbih2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykgcmV0dXJuIHZhbHVlO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKVxuICAgICAgcmV0dXJuIHZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZScgfHwgdmFsdWUudHJpbSgpID09PSAnMSc7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHJldHVybiB2YWx1ZSA9PT0gMTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKiogQ29udmVydHMgdmFsdWUgdG8gbnVtYmVyIHVzaW5nIGJlc3QgcHJhY3RpY2VzLiAqL1xuICBwcml2YXRlIHRvTnVtYmVyKHZhbHVlOiB1bmtub3duKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykgcmV0dXJuIHZhbHVlO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKVxuICAgICAgcmV0dXJuIHZhbHVlLnRyaW0oKSA9PT0gJycgPyB1bmRlZmluZWQgOiBOdW1iZXIodmFsdWUpO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykgcmV0dXJuIHZhbHVlID8gMSA6IDA7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBDb252ZXJ0cyB2YWx1ZSB0byBzdHJpbmcgdXNpbmcgYmVzdCBwcmFjdGljZXMsIGFsd2F5cyBzdHJpbmdpZmllcyBvYmplY3RzLiAqL1xuICBwcml2YXRlIHRvU3RyaW5nVmFsdWUodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gJyc7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiB2YWx1ZTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJylcbiAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiAnW29iamVjdCBPYmplY3RdJztcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gRm9yIGZ1bmN0aW9ucywgc3ltYm9scywgdW5kZWZpbmVkLCBldGMuLCByZXR1cm4gZW1wdHkgc3RyaW5nXG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgb25FZGl0KHJvdzogVCkge1xuICAgIHRoaXMuZWRpdGluZy5zZXQocm93WydpZCddIGFzIElEKTtcbiAgICBjb25zdCBlZGl0OiBQYXJ0aWFsPFQ+ID0ge307XG4gICAgdGhpcy5jb2x1bW5zXG4gICAgICAuZmlsdGVyKChjb2wpID0+IGNvbC52aXNpYmxlICE9PSBmYWxzZSAmJiAhY29sLnJlYWRPbmx5KVxuICAgICAgLmZvckVhY2goKGNvbCkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0Q2VsbFZhbHVlKHJvdywgY29sLmFjY2Vzc29yKTtcbiAgICAgICAgKGVkaXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2NvbC5hY2Nlc3Nvcl0gPSB2YWx1ZTtcbiAgICAgIH0pO1xuICAgIHRoaXMuZWRpdFJvdy5zZXQoZWRpdCk7XG4gIH1cblxuICBjYW5jZWxFZGl0KCkge1xuICAgIHRoaXMuZWRpdGluZy5zZXQobnVsbCk7XG4gICAgdGhpcy5lZGl0Um93LnNldChudWxsKTtcbiAgfVxuXG4gIG9uRWRpdElucHV0KGV2ZW50OiBFdmVudCwga2V5OiBzdHJpbmcsIGNvbD86IEM4MFRhYmxlQ29sRGVmKSB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuZWRpdFJvdygpO1xuICAgIGlmICghY3VycmVudCkgcmV0dXJuO1xuICAgIGlmIChjb2w/LnR5cGUgPT09ICdib29sZWFuJykge1xuICAgICAgY29uc3QgY2hlY2tlZCA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkuY2hlY2tlZDtcbiAgICAgIHRoaXMuZWRpdFJvdy5zZXQoeyAuLi5jdXJyZW50LCBba2V5XTogY2hlY2tlZCB9KTtcbiAgICB9IGVsc2UgaWYgKGNvbD8udHlwZSA9PT0gJ2VudW0nKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IChldmVudC50YXJnZXQgYXMgSFRNTFNlbGVjdEVsZW1lbnQpLnZhbHVlO1xuICAgICAgdGhpcy5lZGl0Um93LnNldCh7IC4uLmN1cnJlbnQsIFtrZXldOiB2YWx1ZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgICBpZiAodGFyZ2V0ICYmIHR5cGVvZiB0YXJnZXQudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMuZWRpdFJvdy5zZXQoeyAuLi5jdXJyZW50LCBba2V5XTogdGFyZ2V0LnZhbHVlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNhdmVFZGl0KHJvdzogVCkge1xuICAgIGNvbnN0IGlkID0gcm93WydpZCddO1xuICAgIGlmICgodHlwZW9mIGlkICE9PSAnc3RyaW5nJyAmJiB0eXBlb2YgaWQgIT09ICdudW1iZXInKSB8fCAhdGhpcy5lZGl0Um93KCkpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgdmlzaWJsZUNvbHVtbnMgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKFxuICAgICAgKGNvbCkgPT4gY29sLnZpc2libGUgIT09IGZhbHNlICYmICFjb2wucmVhZE9ubHlcbiAgICApO1xuICAgIGNvbnN0IGNvbnZlcnRlZCA9IHZpc2libGVDb2x1bW5zLnJlZHVjZSgoYWNjLCBjb2wpID0+IHtcbiAgICAgIGFjY1tjb2wuYWNjZXNzb3JdID0gdGhpcy5jb252ZXJ0Q2VsbFZhbHVlKFxuICAgICAgICB0aGlzLmVkaXRSb3coKSFbY29sLmFjY2Vzc29yXSxcbiAgICAgICAgY29sXG4gICAgICApO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgYXMgUGFydGlhbDxUPjtcblxuICAgIHRoaXMudXBkYXRlQWN0aW9uLmVtaXQoe1xuICAgICAgaWQsXG4gICAgICBjaGFuZ2VzOiBjb252ZXJ0ZWQsXG4gICAgICBkb25lOiAoc3VjY2VzczogYm9vbGVhbikgPT4ge1xuICAgICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICAgIHRoaXMuY2FuY2VsRWRpdCgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYWNrQnkgZnVuY3Rpb24gZm9yIG5nRm9yIHRvIGF2b2lkIERPTSByZS1jcmVhdGlvbiAoTkcwOTU2IHdhcm5pbmcpLlxuICAgKi9cbiAgdHJhY2tCeUlkKGluZGV4OiBudW1iZXIsIHJvdzogVCk6IG51bWJlciB8IHN0cmluZyB7XG4gICAgY29uc3QgaWQgPVxuICAgICAgcm93ICYmIHR5cGVvZiByb3cgPT09ICdvYmplY3QnICYmICdpZCcgaW4gcm93XG4gICAgICAgID8gKHJvdyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbJ2lkJ11cbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHR5cGVvZiBpZCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGlkID09PSAnbnVtYmVyJyA/IGlkIDogaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgdGhlIHZpZXcgZXZlbnQgd2l0aCB0aGUgZW50aXJlIHJvdyBkYXRhXG4gICAqL1xuICBvblZpZXcocm93OiBUKTogdm9pZCB7XG4gICAgdGhpcy52aWV3QWN0aW9uLmVtaXQocm93KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgZ2V0Um93QnV0dG9uQWN0aW9uIGV2ZW50IHdpdGggdGhlIGVudGlyZSByb3cgZGF0YVxuICAgKi9cbiAgb25HZXRSb3dCdXR0b24ocm93OiBUKTogdm9pZCB7XG4gICAgdGhpcy5nZXRSb3dCdXR0b25BY3Rpb24uZW1pdChyb3cpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBtb3ZlVXBBY3Rpb24gZXZlbnQgd2l0aCB0aGUgcm93IGlkXG4gICAqL1xuICBhc3luYyBvbk1vdmVVcChyb3c6IFQpIHtcbiAgICBjb25zdCBpZCA9IHJvd1snaWQnXSBhcyBJRDtcbiAgICB0aGlzLm1vdmVVcEFjdGlvbi5lbWl0KHtcbiAgICAgIGlkLFxuICAgICAgZG9uZTogKHN1Y2Nlc3M6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKHN1Y2Nlc3MpIHRoaXMuY2FuY2VsRWRpdCgpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgbW92ZURvd25BY3Rpb24gZXZlbnQgd2l0aCB0aGUgcm93IGlkXG4gICAqL1xuICBhc3luYyBvbk1vdmVEb3duKHJvdzogVCkge1xuICAgIGNvbnN0IGlkID0gcm93WydpZCddIGFzIElEO1xuICAgIHRoaXMubW92ZURvd25BY3Rpb24uZW1pdCh7XG4gICAgICBpZCxcbiAgICAgIGRvbmU6IChzdWNjZXNzOiBib29sZWFuKSA9PiB7XG4gICAgICAgIGlmIChzdWNjZXNzKSB0aGlzLmNhbmNlbEVkaXQoKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgdGhlIGVuYWJsZUFjdGlvbiBldmVudCB3aXRoIHRoZSByb3cgaWQgYW5kIGN1cnJlbnQgZW5hYmxlZCBzdGF0dXNcbiAgICovXG4gIGFzeW5jIG9uRW5hYmxlKHJvdzogVCkge1xuICAgIGNvbnN0IGlkID0gcm93WydpZCddIGFzIElEO1xuICAgIGNvbnN0IGN1cnJlbnRFbmFibGVkID0gcm93WydlbmFibGVkJ10gYXMgYm9vbGVhbjtcbiAgICB0aGlzLmVuYWJsZUFjdGlvbi5lbWl0KHtcbiAgICAgIGlkLFxuICAgICAgZW5hYmxlZDogIWN1cnJlbnRFbmFibGVkLCAvLyBUb2dnbGUgdGhlIGN1cnJlbnQgc3RhdGVcbiAgICAgIGRvbmU6IChzdWNjZXNzOiBib29sZWFuKSA9PiB7XG4gICAgICAgIGlmIChzdWNjZXNzKSB0aGlzLmNhbmNlbEVkaXQoKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBzZWFyY2ggaW5wdXQgY2hhbmdlcyB3aXRoIGRlYm91bmNpbmdcbiAgICovXG4gIG9uU2VhcmNoSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgY29uc3QgdmFsdWUgPSB0YXJnZXQudmFsdWU7XG4gICAgdGhpcy5zZWFyY2hWYWx1ZS5zZXQodmFsdWUpO1xuICAgIHRoaXMuc2VhcmNoVGVybS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIHNlYXJjaCBpbnB1dFxuICAgKi9cbiAgY2xlYXJTZWFyY2goKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hWYWx1ZS5zZXQoJycpO1xuICAgIHRoaXMuc2VhcmNoVGVybS5lbWl0KCcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2YWx1ZSBmcm9tIGFuIG9iamVjdCB1c2luZyBkb3Qgbm90YXRpb24gKGUuZy4sICd0YXNrLm5hbWUnKVxuICAgKi9cbiAgcHJpdmF0ZSBnZXROZXN0ZWRWYWx1ZShvYmo6IGFueSwgYWNjZXNzb3I6IHN0cmluZyk6IHVua25vd24ge1xuICAgIHJldHVybiBhY2Nlc3Nvci5zcGxpdCgnLicpLnJlZHVjZSgoY3VycmVudCwga2V5KSA9PiB7XG4gICAgICByZXR1cm4gY3VycmVudCAmJiB0eXBlb2YgY3VycmVudCA9PT0gJ29iamVjdCcgPyBjdXJyZW50W2tleV0gOiB1bmRlZmluZWQ7XG4gICAgfSwgb2JqKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2YWx1ZSBmb3IgYSBjZWxsIHVzaW5nIHRoZSBhY2Nlc3Nvciwgc3VwcG9ydGluZyBkb3Qgbm90YXRpb24gZm9yIG5lc3RlZCBwcm9wZXJ0aWVzXG4gICAqL1xuICBnZXRDZWxsVmFsdWUocm93OiBULCBhY2Nlc3Nvcjogc3RyaW5nKTogdW5rbm93biB7XG4gICAgaWYgKGFjY2Vzc29yLmluY2x1ZGVzKCcuJykpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldE5lc3RlZFZhbHVlKHJvdywgYWNjZXNzb3IpO1xuICAgIH1cbiAgICByZXR1cm4gKHJvdyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbYWNjZXNzb3JdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGRpc3BsYXkgdmFsdWUgZm9yIGEgY2VsbCwgc2hvd2luZyAnLScgZm9yIGZhbHN5IHZhbHVlcyBleGNlcHQgMCwgZmFsc2UsIGFuZCBlbXB0eSBvYmplY3RzL2FycmF5c1xuICAgKi9cbiAgZ2V0RGlzcGxheVZhbHVlKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgICAvLyBJZiB2YWx1ZSBpcyAwLCBzaG93IGl0XG4gICAgaWYgKHZhbHVlID09PSAwKSB7XG4gICAgICByZXR1cm4gJzAnO1xuICAgIH1cbiAgICAvLyBJZiB2YWx1ZSBpcyBmYWxzZSwgaXQgc2hvdWxkIGJlIGhhbmRsZWQgYnkgYm9vbGVhbiBsb2dpYyBpbiB0ZW1wbGF0ZSwgbm90IGhlcmVcbiAgICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gJ2ZhbHNlJztcbiAgICB9XG4gICAgLy8gSGFuZGxlIG9iamVjdHMgYW5kIGFycmF5cyAoaW5jbHVkaW5nIGVtcHR5IG9uZXMpXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuICdbb2JqZWN0IE9iamVjdF0nO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBJZiB2YWx1ZSBpcyBvdGhlciBmYWxzeSB2YWx1ZXMgKG51bGwsIHVuZGVmaW5lZCwgJycpLCBzaG93ICctJ1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybiAnLSc7XG4gICAgfVxuICAgIC8vIEhhbmRsZSBvdGhlciB0eXBlcyBleHBsaWNpdGx5XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fFxuICAgICAgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fFxuICAgICAgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbidcbiAgICApIHtcbiAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgIH1cbiAgICAvLyBGb3IgYW55IG90aGVyIHR5cGUgKGZ1bmN0aW9uLCBzeW1ib2wsIGV0Yy4pLCByZXR1cm4gYSBzYWZlIGZhbGxiYWNrXG4gICAgcmV0dXJuICctJztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBkaXNwbGF5IHRleHQgZm9yIGFuIGVudW0gdmFsdWVcbiAgICovXG4gIGdldEVudW1EaXNwbGF5VmFsdWUodmFsdWU6IHVua25vd24sIGNvbDogQzgwVGFibGVDb2xEZWYpOiBzdHJpbmcge1xuICAgIGlmICghY29sLmVudW0gfHwgKHZhbHVlICE9PSAwICYmICF2YWx1ZSkpIHtcbiAgICAgIHJldHVybiAnLSc7XG4gICAgfVxuICAgIGNvbnN0IGRpc3BsYXlWYWx1ZSA9IGNvbC5lbnVtW3ZhbHVlIGFzIHN0cmluZyB8IG51bWJlcl07XG4gICAgcmV0dXJuIChcbiAgICAgIGRpc3BsYXlWYWx1ZSB8fFxuICAgICAgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJ1xuICAgICAgICA/IFN0cmluZyh2YWx1ZSlcbiAgICAgICAgOiAnLScpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBlbnVtIG9wdGlvbnMgYXMgYW4gYXJyYXkgZm9yIHNlbGVjdCBkcm9wZG93bnNcbiAgICovXG4gIGdldEVudW1PcHRpb25zKFxuICAgIGNvbDogQzgwVGFibGVDb2xEZWZcbiAgKTogeyB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyOyBsYWJlbDogc3RyaW5nIH1bXSB7XG4gICAgaWYgKCFjb2wuZW51bSkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhjb2wuZW51bSkubWFwKChbdmFsdWUsIGxhYmVsXSkgPT4gKHtcbiAgICAgIHZhbHVlOiBpc05hTihOdW1iZXIodmFsdWUpKSA/IHZhbHVlIDogTnVtYmVyKHZhbHVlKSxcbiAgICAgIGxhYmVsLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBDU1MgY29sb3IgZm9yIGEgY2VsbCB2YWx1ZSBiYXNlZCBvbiB0aGUgY29sdW1uJ3MgY29sb3IgY29uZmlndXJhdGlvblxuICAgKi9cbiAgZ2V0Q2VsbENvbG9yKHZhbHVlOiB1bmtub3duLCBjb2w6IEM4MFRhYmxlQ29sRGVmKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWNvbC5jb2xvciB8fCAodmFsdWUgIT09IDAgJiYgIXZhbHVlKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGNvbC5jb2xvclt2YWx1ZSBhcyBzdHJpbmcgfCBudW1iZXJdO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGEgZWwgbWF4LWhlaWdodCBkZSBsYSB0YWJsYSBiYXNhZG8gZW4gZWwgdGFtYcOxb1xuICAgKiBTaSBzaXplIGVzIDAsIHJldG9ybmEgdW5kZWZpbmVkIChzaW4gbMOtbWl0ZSBkZSBhbHR1cmEpXG4gICAqL1xuICBnZXRUYWJsZU1heEhlaWdodCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnNpemUgPD0gMCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDsgLy8gU2luIGzDrW1pdGUgZGUgYWx0dXJhXG4gICAgfVxuICAgIC8vIEFsdHVyYSBiYXNlIGRlIDQwMHB4ICogc2l6ZVxuICAgIGNvbnN0IGJhc2VIZWlnaHQgPSA0MDA7XG4gICAgY29uc3QgbWF4SGVpZ2h0ID0gTWF0aC5yb3VuZChiYXNlSGVpZ2h0ICogdGhpcy5zaXplKTtcbiAgICByZXR1cm4gYCR7bWF4SGVpZ2h0fXB4YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3Rpb24gbWV0aG9kc1xuICAgKi9cbiAgY2xlYXJTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1zLnNldChuZXcgU2V0KCkpO1xuICAgIHRoaXMudXBkYXRlU2VsZWN0QWxsU3RhdGUoKTtcbiAgICB0aGlzLmVtaXRTZWxlY3Rpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYW50aWVuZSBsYSBzZWxlY2Npw7NuIGV4aXN0ZW50ZSBkZXNwdcOpcyBkZSBhY3R1YWxpemFyIGxvcyBkYXRvcyxcbiAgICogZWxpbWluYW5kbyBzb2xvIGxvcyBJRHMgcXVlIHlhIG5vIGV4aXN0ZW4gZW4gbG9zIG51ZXZvcyBkYXRvc1xuICAgKi9cbiAgcHJpdmF0ZSBwcmVzZXJ2ZVNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50U2VsZWN0aW9uID0gdGhpcy5zZWxlY3RlZEl0ZW1zKCk7XG4gICAgY29uc3QgY3VycmVudERhdGEgPSB0aGlzLmRhdGEoKTtcblxuICAgIGlmIChjdXJyZW50U2VsZWN0aW9uLnNpemUgPT09IDAgfHwgY3VycmVudERhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBTaSBubyBoYXkgc2VsZWNjacOzbiBvIG5vIGhheSBkYXRvcywgbGltcGlhciBsYSBzZWxlY2Npw7NuXG4gICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gT2J0ZW5lciBsb3MgSURzIGRpc3BvbmlibGVzIGVuIGxvcyBudWV2b3MgZGF0b3NcbiAgICBjb25zdCBhdmFpbGFibGVJZHMgPSBuZXcgU2V0KGN1cnJlbnREYXRhLm1hcChpdGVtID0+IGl0ZW1bJ2lkJ10gYXMgSUQpKTtcblxuICAgIC8vIEZpbHRyYXIgbGEgc2VsZWNjacOzbiBhY3R1YWwgcGFyYSBtYW50ZW5lciBzb2xvIGxvcyBJRHMgcXVlIGHDum4gZXhpc3RlblxuICAgIGNvbnN0IHByZXNlcnZlZFNlbGVjdGlvbiA9IG5ldyBTZXQoXG4gICAgICBBcnJheS5mcm9tKGN1cnJlbnRTZWxlY3Rpb24pLmZpbHRlcihpZCA9PiBhdmFpbGFibGVJZHMuaGFzKGlkKSlcbiAgICApO1xuXG4gICAgLy8gQWN0dWFsaXphciBsYSBzZWxlY2Npw7NuIGNvbiBsb3MgSURzIHByZXNlcnZhZG9zXG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1zLnNldChwcmVzZXJ2ZWRTZWxlY3Rpb24pO1xuICAgIHRoaXMudXBkYXRlU2VsZWN0QWxsU3RhdGUoKTtcbiAgICB0aGlzLmVtaXRTZWxlY3Rpb24oKTtcbiAgfVxuXG4gIHRvZ2dsZVNlbGVjdEFsbCgpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50U2VsZWN0aW9uID0gdGhpcy5zZWxlY3RlZEl0ZW1zKCk7XG4gICAgY29uc3QgYWxsSXRlbXMgPSB0aGlzLmRhdGEoKTtcblxuICAgIGlmIChjdXJyZW50U2VsZWN0aW9uLnNpemUgPT09IGFsbEl0ZW1zLmxlbmd0aCkge1xuICAgICAgLy8gRGVzZWxlY3QgYWxsXG4gICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNlbGVjdCBhbGxcbiAgICAgIGNvbnN0IGFsbElkcyA9IG5ldyBTZXQoYWxsSXRlbXMubWFwKGl0ZW0gPT4gaXRlbVsnaWQnXSBhcyBJRCkpO1xuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zLnNldChhbGxJZHMpO1xuICAgICAgdGhpcy51cGRhdGVTZWxlY3RBbGxTdGF0ZSgpO1xuICAgICAgdGhpcy5lbWl0U2VsZWN0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlSXRlbVNlbGVjdGlvbihpdGVtOiBUKTogdm9pZCB7XG4gICAgY29uc3QgaWQgPSBpdGVtWydpZCddIGFzIElEO1xuICAgIGNvbnN0IGN1cnJlbnRTZWxlY3Rpb24gPSBuZXcgU2V0KHRoaXMuc2VsZWN0ZWRJdGVtcygpKTtcblxuICAgIGlmICghdGhpcy5tdWx0aXBsZSkge1xuICAgICAgLy8gU2VsZWNjacOzbiBzaW1wbGU6IHNvbG8gcGVybWl0aXIgdW4gZWxlbWVudG8gc2VsZWNjaW9uYWRvXG4gICAgICBpZiAoY3VycmVudFNlbGVjdGlvbi5oYXMoaWQpKSB7XG4gICAgICAgIC8vIERlc2VsZWNjaW9uYXIgZWwgZWxlbWVudG8gYWN0dWFsXG4gICAgICAgIGN1cnJlbnRTZWxlY3Rpb24uY2xlYXIoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFNlbGVjY2lvbmFyIHNvbG8gZXN0ZSBlbGVtZW50b1xuICAgICAgICBjdXJyZW50U2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgICAgIGN1cnJlbnRTZWxlY3Rpb24uYWRkKGlkKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGN1cnJlbnRTZWxlY3Rpb24uaGFzKGlkKSkge1xuICAgICAgLy8gU2VsZWNjacOzbiBtw7psdGlwbGU6IGRlc2VsZWNjaW9uYXIgZWxlbWVudG8gZXhpc3RlbnRlXG4gICAgICBjdXJyZW50U2VsZWN0aW9uLmRlbGV0ZShpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNlbGVjY2nDs24gbcO6bHRpcGxlOiBhZ3JlZ2FyIG51ZXZvIGVsZW1lbnRvXG4gICAgICBjdXJyZW50U2VsZWN0aW9uLmFkZChpZCk7XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1zLnNldChjdXJyZW50U2VsZWN0aW9uKTtcbiAgICB0aGlzLnVwZGF0ZVNlbGVjdEFsbFN0YXRlKCk7XG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uKCk7XG4gIH0gaXNJdGVtU2VsZWN0ZWQoaXRlbTogVCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGlkID0gaXRlbVsnaWQnXSBhcyBJRDtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEl0ZW1zKCkuaGFzKGlkKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU2VsZWN0QWxsU3RhdGUoKTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZWN0ZWRDb3VudCA9IHRoaXMuc2VsZWN0ZWRJdGVtcygpLnNpemU7XG4gICAgY29uc3QgdG90YWxDb3VudCA9IHRoaXMuZGF0YSgpLmxlbmd0aDtcblxuICAgIGlmIChzZWxlY3RlZENvdW50ID09PSAwKSB7XG4gICAgICB0aGlzLnNlbGVjdEFsbENoZWNrZWQuc2V0KGZhbHNlKTtcbiAgICAgIHRoaXMuc2VsZWN0QWxsSW5kZXRlcm1pbmF0ZS5zZXQoZmFsc2UpO1xuICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRDb3VudCA9PT0gdG90YWxDb3VudCkge1xuICAgICAgdGhpcy5zZWxlY3RBbGxDaGVja2VkLnNldCh0cnVlKTtcbiAgICAgIHRoaXMuc2VsZWN0QWxsSW5kZXRlcm1pbmF0ZS5zZXQoZmFsc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdEFsbENoZWNrZWQuc2V0KGZhbHNlKTtcbiAgICAgIHRoaXMuc2VsZWN0QWxsSW5kZXRlcm1pbmF0ZS5zZXQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0U2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkSWRzID0gdGhpcy5zZWxlY3RlZEl0ZW1zKCk7XG4gICAgY29uc3Qgc2VsZWN0ZWRJdGVtcyA9IHRoaXMuZGF0YSgpLmZpbHRlcihpdGVtID0+XG4gICAgICBzZWxlY3RlZElkcy5oYXMoaXRlbVsnaWQnXSBhcyBJRClcbiAgICApO1xuICAgIHRoaXMuc2VsZWN0YWJsZS5lbWl0KHNlbGVjdGVkSXRlbXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVNvcnRpbmcoaXRlbXM6IFRbXSk6IHZvaWQge1xuICAgIGNvbnN0IG9yZGVyZWRDb2x1bW5zID0gdGhpcy5jb2x1bW5zLmZpbHRlcigoY29sKSA9PiBjb2wub3JkZXIpO1xuICAgIGlmIChvcmRlcmVkQ29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICBvcmRlcmVkQ29sdW1ucy5mb3JFYWNoKChjb2wpID0+IHtcbiAgICAgICAgaXRlbXMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhbHVlQSA9IHRoaXMuZ2V0Q2VsbFZhbHVlKGEsIGNvbC5hY2Nlc3NvcikgYXMgc3RyaW5nIHwgbnVtYmVyO1xuICAgICAgICAgIGNvbnN0IHZhbHVlQiA9IHRoaXMuZ2V0Q2VsbFZhbHVlKGIsIGNvbC5hY2Nlc3NvcikgYXMgc3RyaW5nIHwgbnVtYmVyO1xuXG4gICAgICAgICAgaWYgKGNvbC5vcmRlciA9PT0gJ0FTQycpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZUEgPiB2YWx1ZUIpIHJldHVybiAxO1xuICAgICAgICAgICAgaWYgKHZhbHVlQSA8IHZhbHVlQikgcmV0dXJuIC0xO1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZUEgPCB2YWx1ZUIpIHJldHVybiAxO1xuICAgICAgICAgICAgaWYgKHZhbHVlQSA+IHZhbHVlQikgcmV0dXJuIC0xO1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInRhYmxlLXJlc3BvbnNpdmVcIiBbc3R5bGUubWF4LWhlaWdodF09XCJnZXRUYWJsZU1heEhlaWdodCgpXCIgW3N0eWxlLm92ZXJmbG93LXldPVwic2l6ZSA+IDAgPyAnYXV0bycgOiAndmlzaWJsZSdcIj5cbiAgPCEtLSBTZWFyY2ggQmFyIC0tPlxuICBAaWYgKGhhc1NlYXJjaFRlcm1MaXN0ZW5lcigpKSB7XG4gIDxkaXYgY2xhc3M9XCJzZWFyY2gtY29udGFpbmVyXCI+XG4gICAgPGRpdiBjbGFzcz1cInNlYXJjaC1pbnB1dC13cmFwcGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnB1dC1ncm91cC10ZXh0XCI+XG4gICAgICAgICAgPGM4MC1pY29uIGljb249XCJzZWFyY2hcIiBbc2l6ZV09XCIuOFwiPjwvYzgwLWljb24+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgc2VhcmNoLWlucHV0XCIgcGxhY2Vob2xkZXI9XCJCdXNjYXIuLi5cIiBbdmFsdWVdPVwic2VhcmNoVmFsdWUoKVwiIChpbnB1dCk9XCJvblNlYXJjaElucHV0KCRldmVudClcIiBhcmlhLWxhYmVsPVwiQnVzY2FyIGVuIGxhIHRhYmxhXCIgLz5cbiAgICAgICAgQGlmIChzZWFyY2hWYWx1ZSgpKSB7XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5IGJ0bi1ib3JyYXJcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImNsZWFyU2VhcmNoKClcIiB0aXRsZT1cIkxpbXBpYXIgYsO6c3F1ZWRhXCI+XG4gICAgICAgICAgPGM4MC1pY29uIGljb249XCJjYW5jZWxcIiBbc2l6ZV09XCIuN1wiPjwvYzgwLWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIH1cblxuICA8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1ib3JkZXJlZCB0YWJsZS1ob3ZlciBhbGlnbi1taWRkbGVcIj5cbiAgICA8dGhlYWQgY2xhc3M9XCJ0aGVhZCB0YWJsZS1saWdodCBzdGlja3ktaGVhZGVyXCI+XG4gICAgICA8dHI+XG4gICAgICAgIEBpZiAoaGFzU2VsZWN0YWJsZUxpc3RlbmVyKCkgJiYgZGF0YSgpLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICA8dGggY2xhc3M9XCJ0ZXh0LWNlbnRlciBzZWxlY3Rpb24tY29sdW1uXCI+XG4gICAgICAgICAgQGlmIChtdWx0aXBsZSkge1xuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJzZWxlY3RBbGxDaGVja2VkKClcIiBbaW5kZXRlcm1pbmF0ZV09XCJzZWxlY3RBbGxJbmRldGVybWluYXRlKClcIiAoY2hhbmdlKT1cInRvZ2dsZVNlbGVjdEFsbCgpXCIgYXJpYS1sYWJlbD1cIlNlbGVjY2lvbmFyIHRvZG9cIiAvPlxuICAgICAgICAgIH1cbiAgICAgICAgPC90aD5cbiAgICAgICAgfVxuICAgICAgICBAZm9yIChjb2wgb2YgY29sdW1uczsgdHJhY2sgY29sKSB7XG4gICAgICAgIEBpZiAoY29sLnZpc2libGUgIT09IGZhbHNlKSB7XG4gICAgICAgIEBpZiAoY29sLnR5cGUgPT09ICdib29sZWFuJykge1xuICAgICAgICA8dGggY2xhc3M9XCJ0ZXh0LWNlbnRlciBib29sZWFuLWNvbHVtblwiPnt7IGNvbC5sYWJlbCB9fTwvdGg+XG4gICAgICAgIH1cbiAgICAgICAgQGVsc2UgaWYgKGNvbC50eXBlID09PSAnbnVtYmVyJykge1xuICAgICAgICA8dGggY2xhc3M9XCJ0ZXh0LWNlbnRlciBudW1iZXItY29sdW1uXCI+e3sgY29sLmxhYmVsIH19PC90aD5cbiAgICAgICAgfVxuICAgICAgICBAZWxzZSB7XG4gICAgICAgIDx0aD57eyBjb2wubGFiZWwgfX08L3RoPlxuICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBAaWYgKGhhc0NyZWF0ZUFjdGlvbkxpc3RlbmVyKCkgfHwgaGFzVXBkYXRlQWN0aW9uTGlzdGVuZXIoKSB8fCBoYXNEZWxldGVBY3Rpb25MaXN0ZW5lcigpIHx8XG4gICAgICAgIGhhc0NhbmNlbEFjdGlvbkxpc3RlbmVyKCkgfHwgaGFzVmlld0FjdGlvbkxpc3RlbmVyKCkgfHwgaGFzR2V0Um93QnV0dG9uTGlzdGVuZXIoKSB8fFxuICAgICAgICBoYXNNb3ZlVXBBY3Rpb25MaXN0ZW5lcigpIHx8IGhhc01vdmVEb3duQWN0aW9uTGlzdGVuZXIoKSkge1xuICAgICAgICA8dGggY2xhc3M9XCJ0YWJsZS1hY3Rpb25zLWhlYWRlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25zLXdyYXBwZXJcIj5cbiAgICAgICAgICAgIDxzcGFuPkFjdGlvbnM8L3NwYW4+XG4gICAgICAgICAgICBAaWYgKGhhc0NyZWF0ZUFjdGlvbkxpc3RlbmVyKCkpIHtcbiAgICAgICAgICAgIDxjODAtaWNvbiBidXR0b24gaWNvbj1cImFkZFwiIFtkaXNhYmxlZF09XCJjcmVhdGluZygpXCIgdGl0bGU9XCJBZ3JlZ2FyXCIgW3NpemVdPVwiLjZcIiAoaWNvbkNsaWNrKT1cInN0YXJ0Q3JlYXRlKClcIj48L2M4MC1pY29uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3RoPlxuICAgICAgICB9XG4gICAgICA8L3RyPlxuICAgIDwvdGhlYWQ+XG4gICAgPHRib2R5PlxuICAgICAgQGZvciAocm93IG9mIGRhdGEoKTsgdHJhY2sgdHJhY2tCeUlkKGksIHJvdyk7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICA8dHI+XG4gICAgICAgIEBpZiAoaGFzU2VsZWN0YWJsZUxpc3RlbmVyKCkgJiYgZGF0YSgpLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LWNlbnRlciBzZWxlY3Rpb24tY29sdW1uXCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtjaGVja2VkXT1cImlzSXRlbVNlbGVjdGVkKHJvdylcIiAoY2hhbmdlKT1cInRvZ2dsZUl0ZW1TZWxlY3Rpb24ocm93KVwiIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1NlbGVjY2lvbmFyIGZpbGEgJyArIChpICsgMSlcIiAvPlxuICAgICAgICA8L3RkPlxuICAgICAgICB9XG4gICAgICAgIEBmb3IgKGNvbCBvZiBjb2x1bW5zOyB0cmFjayBjb2wpIHtcbiAgICAgICAgQGlmIChjb2wudmlzaWJsZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgQGlmIChjb2wudHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIDx0ZCBjbGFzcz1cInRleHQtY2VudGVyIGJvb2xlYW4tY29sdW1uXCI+XG4gICAgICAgICAgQGlmIChlZGl0aW5nKCkgPT09IHJvd1snaWQnXSAmJiAhY29sLnJlYWRPbmx5KSB7XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtjaGVja2VkXT1cIiEhZWRpdFJvdygpPy5bY29sLmFjY2Vzc29yXVwiIChjaGFuZ2UpPVwib25FZGl0SW5wdXQoJGV2ZW50LCBjb2wuYWNjZXNzb3IsIGNvbClcIiBbYXR0ci5hcmlhLWxhYmVsXT1cImNvbC5sYWJlbFwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBlbHNlIHtcbiAgICAgICAgICBAaWYgKGdldENlbGxWYWx1ZShyb3csIGNvbC5hY2Nlc3NvcikgPT09IHRydWUpIHtcbiAgICAgICAgICA8YzgwLWljb24gaWNvbj1cImNoZWNrXCIgW3NpemVdPVwiLjdcIj48L2M4MC1pY29uPlxuICAgICAgICAgIDxiciAvPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAZWxzZSBpZiAoZ2V0Q2VsbFZhbHVlKHJvdywgY29sLmFjY2Vzc29yKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICA8YzgwLWljb24gaWNvbj1cImNhbmNlbFwiIFtzaXplXT1cIi43XCI+PC9jODAtaWNvbj5cbiAgICAgICAgICA8YnIgLz5cbiAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICA8L3RkPlxuICAgICAgICB9XG4gICAgICAgIEBlbHNlIGlmIChjb2wudHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1jZW50ZXIgbnVtYmVyLWNvbHVtblwiPlxuICAgICAgICAgIEBpZiAoZWRpdGluZygpID09PSByb3dbJ2lkJ10gJiYgIWNvbC5yZWFkT25seSkge1xuICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc21cIiB0eXBlPVwibnVtYmVyXCIgW3ZhbHVlXT1cImVkaXRSb3coKT8uW2NvbC5hY2Nlc3Nvcl0gPz8gJydcIiBbcGxhY2Vob2xkZXJdPVwiY29sLmxhYmVsXCIgKGlucHV0KT1cIm9uRWRpdElucHV0KCRldmVudCwgY29sLmFjY2Vzc29yLCBjb2wpXCIgLz5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGVsc2Uge1xuICAgICAgICAgIDxzcGFuIFtzdHlsZS5jb2xvcl09XCJnZXRDZWxsQ29sb3IoZ2V0Q2VsbFZhbHVlKHJvdywgY29sLmFjY2Vzc29yKSwgY29sKVwiPnt7IGdldERpc3BsYXlWYWx1ZShnZXRDZWxsVmFsdWUocm93LFxuICAgICAgICAgICAgY29sLmFjY2Vzc29yKSkgfX08L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICA8L3RkPlxuICAgICAgICB9XG4gICAgICAgIEBlbHNlIHtcbiAgICAgICAgPHRkPlxuICAgICAgICAgIEBpZiAoZWRpdGluZygpID09PSByb3dbJ2lkJ10gJiYgIWNvbC5yZWFkT25seSkge1xuICAgICAgICAgIEBpZiAoY29sLnR5cGUgPT09ICdlbnVtJykge1xuICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtXCIgW3ZhbHVlXT1cImVkaXRSb3coKT8uW2NvbC5hY2Nlc3Nvcl0gPz8gJydcIiAoY2hhbmdlKT1cIm9uRWRpdElucHV0KCRldmVudCwgY29sLmFjY2Vzc29yLCBjb2wpXCI+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+e3sgY29sLmxhYmVsIH19PC9vcHRpb24+XG4gICAgICAgICAgICBAZm9yIChvcHRpb24gb2YgZ2V0RW51bU9wdGlvbnMoY29sKTsgdHJhY2sgb3B0aW9uLnZhbHVlKSB7XG4gICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCJvcHRpb24udmFsdWVcIj57eyBvcHRpb24ubGFiZWwgfX08L29wdGlvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGVsc2Uge1xuICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc21cIiBbdHlwZV09XCJjb2wudHlwZSA9PT0gJ3Bhc3N3b3JkJyA/ICdwYXNzd29yZCcgOiAndGV4dCdcIiBbdmFsdWVdPVwiZWRpdFJvdygpPy5bY29sLmFjY2Vzc29yXSA/PyAnJ1wiIFtwbGFjZWhvbGRlcl09XCJjb2wubGFiZWxcIiAoaW5wdXQpPVwib25FZGl0SW5wdXQoJGV2ZW50LCBjb2wuYWNjZXNzb3IsIGNvbClcIiAvPlxuICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgQGVsc2Uge1xuICAgICAgICAgIEBpZiAoY29sLnR5cGUgPT09ICdwYXNzd29yZCcpIHtcbiAgICAgICAgICA8c3BhbiBbc3R5bGUuY29sb3JdPVwiZ2V0Q2VsbENvbG9yKGdldENlbGxWYWx1ZShyb3csIGNvbC5hY2Nlc3NvciksIGNvbClcIj4qKioqKio8L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBlbHNlIGlmIChjb2wudHlwZSA9PT0gJ2VudW0nKSB7XG4gICAgICAgICAgPHNwYW4gW3N0eWxlLmNvbG9yXT1cImdldENlbGxDb2xvcihnZXRDZWxsVmFsdWUocm93LCBjb2wuYWNjZXNzb3IpLCBjb2wpXCI+e3tcbiAgICAgICAgICAgIGdldEVudW1EaXNwbGF5VmFsdWUoZ2V0Q2VsbFZhbHVlKHJvdywgY29sLmFjY2Vzc29yKSwgY29sKVxuICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBlbHNlIGlmIChnZXRDZWxsVmFsdWUocm93LCBjb2wuYWNjZXNzb3IpID09PSB0cnVlKSB7XG4gICAgICAgICAgPGM4MC1pY29uIGljb249XCJjaGVja1wiIFtzaXplXT1cIi43XCI+PC9jODAtaWNvbj5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGVsc2UgaWYgKGdldENlbGxWYWx1ZShyb3csIGNvbC5hY2Nlc3NvcikgPT09IGZhbHNlKSB7XG4gICAgICAgICAgPGM4MC1pY29uIGljb249XCJjYW5jZWxcIiBbc2l6ZV09XCIuN1wiPjwvYzgwLWljb24+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBlbHNlIHtcbiAgICAgICAgICA8c3BhbiBbc3R5bGUuY29sb3JdPVwiZ2V0Q2VsbENvbG9yKGdldENlbGxWYWx1ZShyb3csIGNvbC5hY2Nlc3NvciksIGNvbClcIj57eyBnZXREaXNwbGF5VmFsdWUoZ2V0Q2VsbFZhbHVlKHJvdyxcbiAgICAgICAgICAgIGNvbC5hY2Nlc3NvcikpIH19PC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIEBpZiAoaGFzQ3JlYXRlQWN0aW9uTGlzdGVuZXIoKSB8fCBoYXNVcGRhdGVBY3Rpb25MaXN0ZW5lcigpIHx8IGhhc0RlbGV0ZUFjdGlvbkxpc3RlbmVyKCkgfHxcbiAgICAgICAgaGFzQ2FuY2VsQWN0aW9uTGlzdGVuZXIoKSB8fCBoYXNWaWV3QWN0aW9uTGlzdGVuZXIoKSB8fCBoYXNHZXRSb3dCdXR0b25MaXN0ZW5lcigpIHx8XG4gICAgICAgIGhhc01vdmVVcEFjdGlvbkxpc3RlbmVyKCkgfHwgaGFzTW92ZURvd25BY3Rpb25MaXN0ZW5lcigpKSB7XG4gICAgICAgIDx0ZCBjbGFzcz1cInRleHQtY2VudGVyIGFjdGlvbnMtY2VsbFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgQGlmIChlZGl0aW5nKCkgPT09IHJvd1snaWQnXSkge1xuICAgICAgICAgICAgPGM4MC1pY29uIGJ1dHRvbiBpY29uPVwiY2hlY2tcIiB0aXRsZT1cIkd1YXJkYXJcIiAoaWNvbkNsaWNrKT1cInNhdmVFZGl0KHJvdylcIiBbc2l6ZV09XCIuN1wiPjwvYzgwLWljb24+XG4gICAgICAgICAgICA8YzgwLWljb24gYnV0dG9uIGljb249XCJjYW5jZWxcIiBjb2xvcj1cIndhcm5cIiB0aXRsZT1cIkNhbmNlbGFyXCIgKGljb25DbGljayk9XCJjYW5jZWxFZGl0KClcIiBbc2l6ZV09XCIuN1wiPjwvYzgwLWljb24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAZWxzZSB7XG4gICAgICAgICAgICBAaWYgKGhhc1VwZGF0ZUFjdGlvbkxpc3RlbmVyKCkpIHtcbiAgICAgICAgICAgIDxjODAtaWNvbiBidXR0b24gaWNvbj1cImVkaXRcIiB0aXRsZT1cIkVkaXRhclwiIChpY29uQ2xpY2spPVwib25FZGl0KHJvdylcIiBbc2l6ZV09XCIuN1wiPjwvYzgwLWljb24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKGhhc0NhbmNlbEFjdGlvbkxpc3RlbmVyKCkpIHtcbiAgICAgICAgICAgIDxjODAtaWNvbiBidXR0b24gaWNvbj1cImNhbmNlbF9jaXJjbGVcIiBjb2xvcj1cInNlY29uZGFyeVwiIHRpdGxlPVwiQ2FuY2VsYXJcIiAoaWNvbkNsaWNrKT1cIm9uQ2FuY2VsKHJvdylcIiBbc2l6ZV09XCIuN1wiPjwvYzgwLWljb24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKGhhc1ZpZXdBY3Rpb25MaXN0ZW5lcigpKSB7XG4gICAgICAgICAgICA8YzgwLWljb24gYnV0dG9uIGljb249XCJ2aWV3XCIgY29sb3I9XCJwcmltYXJ5XCIgdGl0bGU9XCJWZXJcIiAoaWNvbkNsaWNrKT1cIm9uVmlldyhyb3cpXCIgW3NpemVdPVwiLjdcIj48L2M4MC1pY29uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmIChoYXNHZXRSb3dCdXR0b25MaXN0ZW5lcigpKSB7XG4gICAgICAgICAgICA8YzgwLWljb24gYnV0dG9uIGljb249XCJnZXRcIiBjb2xvcj1cInN1Y2Nlc3NcIiB0aXRsZT1cIlZpbmN1bGFyXCIgKGljb25DbGljayk9XCJvbkdldFJvd0J1dHRvbihyb3cpXCIgW3NpemVdPVwiLjdcIj48L2M4MC1pY29uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmIChoYXNNb3ZlVXBBY3Rpb25MaXN0ZW5lcigpKSB7XG4gICAgICAgICAgICA8YzgwLWljb24gYnV0dG9uIGljb249XCJhcnJvd191cFwiIGNvbG9yPVwic2Vjb25kYXJ5XCIgdGl0bGU9XCJNb3ZlciBhcnJpYmFcIiAoaWNvbkNsaWNrKT1cIm9uTW92ZVVwKHJvdylcIiBbc2l6ZV09XCIuN1wiPjwvYzgwLWljb24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKGhhc01vdmVEb3duQWN0aW9uTGlzdGVuZXIoKSkge1xuICAgICAgICAgICAgPGM4MC1pY29uIGJ1dHRvbiBpY29uPVwiYXJyb3dfZG93blwiIGNvbG9yPVwic2Vjb25kYXJ5XCIgdGl0bGU9XCJNb3ZlciBhYmFqb1wiIChpY29uQ2xpY2spPVwib25Nb3ZlRG93bihyb3cpXCIgW3NpemVdPVwiLjdcIj48L2M4MC1pY29uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmIChoYXNFbmFibGVBY3Rpb25MaXN0ZW5lcigpKSB7XG4gICAgICAgICAgICA8YzgwLWljb24gYnV0dG9uIFtpY29uXT1cImdldENlbGxWYWx1ZShyb3csICdlbmFibGVkJykgPyAndG9nZ2xlX29uJyA6ICd0b2dnbGVfb2ZmJ1wiIFtjb2xvcl09XCJnZXRDZWxsVmFsdWUocm93LCAnZW5hYmxlZCcpID8gJ3N1Y2Nlc3MnIDogJ3NlY29uZGFyeSdcIiBbdGl0bGVdPVwiZ2V0Q2VsbFZhbHVlKHJvdywgJ2VuYWJsZWQnKSA/ICdEZXNoYWJpbGl0YXInIDogJ0hhYmlsaXRhcidcIlxuICAgICAgICAgICAgICAoaWNvbkNsaWNrKT1cIm9uRW5hYmxlKHJvdylcIiBbc2l6ZV09XCIuN1wiPlxuICAgICAgICAgICAgPC9jODAtaWNvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAoaGFzRGVsZXRlQWN0aW9uTGlzdGVuZXIoKSkge1xuICAgICAgICAgICAgPGM4MC1pY29uIGJ1dHRvbiBpY29uPVwiZGVsZXRlXCIgY29sb3I9XCJ3YXJuXCIgdGl0bGU9XCJCb3JyYXJcIiAoaWNvbkNsaWNrKT1cIm9uRGVsZXRlKHJvdylcIiBbc2l6ZV09XCIuN1wiPjwvYzgwLWljb24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIH1cbiAgICAgIDwvdHI+XG4gICAgICB9XG4gICAgICBAaWYgKGNyZWF0aW5nKCkgJiYgaGFzQ3JlYXRlQWN0aW9uTGlzdGVuZXIoKSkge1xuICAgICAgPHRyPlxuICAgICAgICBAaWYgKGhhc1NlbGVjdGFibGVMaXN0ZW5lcigpICYmIGRhdGEoKS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1jZW50ZXIgc2VsZWN0aW9uLWNvbHVtblwiPlxuICAgICAgICAgIDwhLS0gRW1wdHkgY2VsbCBmb3IgYWxpZ25tZW50IC0tPlxuICAgICAgICA8L3RkPlxuICAgICAgICB9XG4gICAgICAgIEBmb3IgKGNvbCBvZiBjb2x1bW5zOyB0cmFjayBjb2wpIHtcbiAgICAgICAgQGlmIChjb2wudmlzaWJsZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgQGlmIChjb2wudHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIDx0ZCBjbGFzcz1cInRleHQtY2VudGVyXCI+XG4gICAgICAgICAgQGlmICghY29sLnJlYWRPbmx5KSB7XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtjaGVja2VkXT1cIiEhbmV3Um93KCk/Lltjb2wuYWNjZXNzb3JdXCIgKGNoYW5nZSk9XCJvbklucHV0KCRldmVudCwgY29sLmFjY2Vzc29yLCBjb2wpXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJjb2wubGFiZWxcIiAvPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAZWxzZSB7XG4gICAgICAgICAgPCEtLSBSZWFkT25seSBib29sZWFuIGNvbHVtbiBpbiBjcmVhdGUgbW9kZSBzaG93cyBlbXB0eSAtLT5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbXV0ZWRcIj4tPC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgPC90ZD5cbiAgICAgICAgfSBAZWxzZSBpZiAoY29sLnR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIDx0ZCBjbGFzcz1cInRleHQtY2VudGVyIG51bWJlci1jb2x1bW5cIj5cbiAgICAgICAgICBAaWYgKCFjb2wucmVhZE9ubHkpIHtcbiAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtXCIgdHlwZT1cIm51bWJlclwiIFt2YWx1ZV09XCJuZXdSb3coKT8uW2NvbC5hY2Nlc3Nvcl0gPz8gJydcIiBbcGxhY2Vob2xkZXJdPVwiY29sLmxhYmVsXCIgKGlucHV0KT1cIm9uSW5wdXQoJGV2ZW50LCBjb2wuYWNjZXNzb3IsIGNvbClcIiAvPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAZWxzZSB7XG4gICAgICAgICAgPCEtLSBSZWFkT25seSBudW1iZXIgY29sdW1uIGluIGNyZWF0ZSBtb2RlIHNob3dzIGVtcHR5IC0tPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1tdXRlZFwiPi08L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICA8L3RkPlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgPHRkPlxuICAgICAgICAgIEBpZiAoIWNvbC5yZWFkT25seSkge1xuICAgICAgICAgIEBpZiAoY29sLnR5cGUgPT09ICdlbnVtJykge1xuICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtXCIgW3ZhbHVlXT1cIm5ld1JvdygpPy5bY29sLmFjY2Vzc29yXSA/PyAnJ1wiIChjaGFuZ2UpPVwib25JbnB1dCgkZXZlbnQsIGNvbC5hY2Nlc3NvciwgY29sKVwiPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPnt7IGNvbC5sYWJlbCB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgQGZvciAob3B0aW9uIG9mIGdldEVudW1PcHRpb25zKGNvbCk7IHRyYWNrIG9wdGlvbi52YWx1ZSkge1xuICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwib3B0aW9uLnZhbHVlXCI+e3sgb3B0aW9uLmxhYmVsIH19PC9vcHRpb24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBlbHNlIHtcbiAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtXCIgdHlwZT1cInRleHRcIiBbdmFsdWVdPVwibmV3Um93KCk/Lltjb2wuYWNjZXNzb3JdID8/ICcnXCIgW3BsYWNlaG9sZGVyXT1cImNvbC5sYWJlbFwiIChpbnB1dCk9XCJvbklucHV0KCRldmVudCwgY29sLmFjY2Vzc29yLCBjb2wpXCIgLz5cbiAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIEBlbHNlIHtcbiAgICAgICAgICA8IS0tIFJlYWRPbmx5IGNvbHVtbiBpbiBjcmVhdGUgbW9kZSBzaG93cyBlbXB0eSAtLT5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbXV0ZWRcIj4tPC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgPC90ZD5cbiAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1jZW50ZXIgYWN0aW9ucy1jZWxsXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YzgwLWljb24gYnV0dG9uIGljb249XCJjaGVja1wiIHRpdGxlPVwiR3VhcmRhclwiIChpY29uQ2xpY2spPVwic2F2ZUNyZWF0ZSgpXCIgW3NpemVdPVwiLjdcIj48L2M4MC1pY29uPlxuICAgICAgICAgICAgPGM4MC1pY29uIGJ1dHRvbiBpY29uPVwiY2FuY2VsXCIgY29sb3I9XCJ3YXJuXCIgdGl0bGU9XCJDYW5jZWxhclwiIChpY29uQ2xpY2spPVwiY2FuY2VsQ3JlYXRlKClcIiBbc2l6ZV09XCIuN1wiPjwvYzgwLWljb24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L3RyPlxuICAgICAgfVxuICAgIDwvdGJvZHk+XG4gIDwvdGFibGU+XG4gIEBpZiAoZGF0YSgpLmxlbmd0aCA9PT0gMCkge1xuICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXIgdGV4dC1tdXRlZCBweS0zIHNtYWxsXCI+XG4gICAgTm8gaGF5IGRhdG9zIHBhcmEgbW9zdHJhci5cbiAgPC9kaXY+XG4gIH1cbjwvZGl2PlxuXG48YzgwLW1vZGFsPjwvYzgwLW1vZGFsPiJdfQ==
|
|
629
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy91aS9zcmMvbGliL3RhYmxlL3RhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL2xpYnMvdWkvc3JjL2xpYi90YWJsZS90YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sTUFBTSxFQUNOLFlBQVksRUFHWixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxNQUFNLFVBQVUsQ0FBQzs7QUF1QjNELE1BQU0sT0FBTyxpQkFBaUI7SUFDWCxZQUFZLEdBQWlCLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUMxRCxLQUFLLENBQW1CO0lBQ3hCLE9BQU8sR0FBcUIsRUFBRSxDQUFDO0lBQy9CLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyw2REFBNkQ7SUFDdkUsUUFBUSxHQUFHLElBQUksQ0FBQyxDQUFDLHlDQUF5QztJQUVuRSxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsZ0RBQWdEO0lBQ3pELFlBQVksR0FBRyxJQUFJLFlBQVksRUFBeUQsQ0FBQztJQUN6RixZQUFZLEdBQUcsSUFBSSxZQUFZLEVBQXFFLENBQUM7SUFDckcsWUFBWSxHQUFHLElBQUksWUFBWSxFQUFnRCxDQUFDO0lBQ2hGLFlBQVksR0FBRyxJQUFJLFlBQVksRUFBZ0QsQ0FBQztJQUNoRixVQUFVLEdBQUcsSUFBSSxZQUFZLEVBQUssQ0FBQztJQUNuQyxrQkFBa0IsR0FBRyxJQUFJLFlBQVksRUFBSyxDQUFDO0lBQzNDLFlBQVksR0FBRyxJQUFJLFlBQVksRUFBZ0QsQ0FBQztJQUNoRixjQUFjLEdBQUcsSUFB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QUFFO2dCQUUzRixZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csa0JBQWtCO3NCQUEzQixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBRUcsVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBzaWduYWwsXG4gIEV2ZW50RW1pdHRlcixcbiAgT25Jbml0LFxuICBPbkRlc3Ryb3ksXG4gIGluamVjdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEM4MEljb25Db21wb25lbnQgfSBmcm9tICcuLi9pY29uL2ljb24uY29tcG9uZW50JztcbmltcG9ydCB7IEM4ME1vZGFsQ29tcG9uZW50LCBNb2RhbFNlcnZpY2UgfSBmcm9tICcuLi9tb2RhbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQzgwVGFibGVDb2xEZWYge1xuICBhY2Nlc3Nvcjogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xuICB2aXNpYmxlPzogYm9vbGVhbjsgLy8gU2kgbm8gc2UgZXNwZWNpZmljYSwgc2UgYXN1bWUgdHJ1ZVxuICB0eXBlPzogJ3N0cmluZycgfCAnbnVtYmVyJyB8ICdib29sZWFuJyB8ICdwYXNzd29yZCcgfCAnZW51bSc7IC8vIFRpcG8gZGUgZGF0byBwYXJhIGxhIGNvbHVtbmFcbiAgb3JkZXI/OiAnQVNDJyB8ICdERVNDJzsgLy8gT3JkZW5hbWllbnRvIGRlIGxhIGNvbHVtbmFcbiAgcmVhZE9ubHk/OiBib29sZWFuOyAvLyBTaSBubyBzZSBlc3BlY2lmaWNhLCBzZSBhc3VtZSBmYWxzZVxuICBlbnVtPzogUmVjb3JkPHN0cmluZyB8IG51bWJlciwgc3RyaW5nPjsgLy8gT3BjaW9uZXMgZGVsIGVudW0gcGFyYSB0eXBlICdlbnVtJ1xuICBjb2xvcj86IFJlY29yZDxzdHJpbmcgfCBudW1iZXIsIHN0cmluZz47IC8vIENvbG9yZXMgQ1NTIGJhc2Fkb3MgZW4gZWwgdmFsb3IgZGUgbGEgY2VsZGFcbn1cblxuZXhwb3J0IHR5cGUgSUQgPSBudW1iZXIgfCBzdHJpbmc7XG5cbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2M4MC10YWJsZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDODBJY29uQ29tcG9uZW50LCBDODBNb2RhbENvbXBvbmVudF0sXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuc2NzcycsXG59KVxuZXhwb3J0IGNsYXNzIEM4MFRhYmxlQ29tcG9uZW50PFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbW9kYWxTZXJ2aWNlOiBNb2RhbFNlcnZpY2UgPSBpbmplY3QoTW9kYWxTZXJ2aWNlKTtcbiAgQElucHV0KCkgZGF0YSQhOiBPYnNlcnZhYmxlPFRbXT47XG4gIEBJbnB1dCgpIGNvbHVtbnM6IEM4MFRhYmxlQ29sRGVmW10gPSBbXTtcbiAgQElucHV0KCkgc2l6ZSA9IDA7IC8vIFRhbWHDsW8gZGUgbGEgdGFibGEgKDAgPSBzaW4gbMOtbWl0ZSwgPiAwIGFwbGljYSBtYXgtaGVpZ2h0KVxuICBASW5wdXQoKSBtdWx0aXBsZSA9IHRydWU7IC8vIFBlcm1pdGUgc2VsZWNjacOzbiBtw7psdGlwbGUgcG9yIGRlZmVjdG9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiAodmFsdWU6IGJvb2xlYW4gfCBzdHJpbmcpID0+IHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gJ3RydWUnIH0pXG4gIG5vQ29uZmlybSA9IGZhbHNlOyAvLyBTaSBlcyB0cnVlLCBubyBtdWVzdHJhIGNvbmZpcm1hY2lvbmVzIG1vZGFsZXNcbiAgQE91dHB1dCgpIGNyZWF0ZUFjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8eyByb3c6IFBhcnRpYWw8VD47IGRvbmU6IChyZXN1bHQ6IGJvb2xlYW4pID0+IHZvaWQ7IH0+KCk7XG4gIEBPdXRwdXQoKSB1cGRhdGVBY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPHsgaWQ6IElEOyBjaGFuZ2VzOiBQYXJ0aWFsPFQ+OyBkb25lOiAocmVzdWx0OiBib29sZWFuKSA9PiB2b2lkOyB9PigpO1xuICBAT3V0cHV0KCkgZGVsZXRlQWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjx7IGlkOiBJRDsgZG9uZTogKHJlc3VsdDogYm9vbGVhbikgPT4gdm9pZDsgfT4oKTtcbiAgQE91dHB1dCgpIGNhbmNlbEFjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8eyBpZDogSUQ7IGRvbmU6IChyZXN1bHQ6IGJvb2xlYW4pID0+IHZvaWQ7IH0+KCk7XG4gIEBPdXRwdXQoKSB2aWV3QWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxUPigpO1xuICBAT3V0cHV0KCkgZ2V0Um93QnV0dG9uQWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxUPigpO1xuICBAT3V0cHV0KCkgbW92ZVVwQWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjx7IGlkOiBJRDsgZG9uZTogKHJlc3VsdDogYm9vbGVhbikgPT4gdm9pZDsgfT4oKTtcbiAgQE91dHB1dCgpIG1vdmVEb3duQWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjx7IGlkOiBJRDsgZG9uZTogKHJlc3VsdDogYm9vbGVhbikgPT4gdm9pZDsgfT4oKTtcbiAgQE91dHB1dCgpIGVuYWJsZUFjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8eyBpZDogSUQ7IGVuYWJsZWQ6IGJvb2xlYW47IGRvbmU6IChyZXN1bHQ6IGJvb2xlYW4pID0+IHZvaWQ7IH0+KCk7XG4gIEBPdXRwdXQoKSBzZWFyY2hUZXJtID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgQE91dHB1dCgpIGVycm9yRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIHNlbGVjdGFibGUgPSBuZXcgRXZlbnRFbWl0dGVyPFRbXT4oKTtcblxuICByZWFkb25seSBkYXRhID0gc2lnbmFsPFRbXT4oW10pO1xuICByZWFkb25seSBrZXlzID0gc2lnbmFsPHN0cmluZ1tdPihbXSk7XG4gIGNyZWF0aW5nID0gc2lnbmFsKGZhbHNlKTtcbiAgbmV3Um93ID0gc2lnbmFsPFBhcnRpYWw8VD4gfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgZWRpdGluZyA9IHNpZ25hbDxJRCB8IG51bGw+KG51bGwpOyAvLyBpZCBvZiByb3cgYmVpbmcgZWRpdGVkXG4gIHJlYWRvbmx5IGVkaXRSb3cgPSBzaWduYWw8UGFydGlhbDxUPiB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSBzZWxlY3RlZEl0ZW1zID0gc2lnbmFsPFNldDxJRD4+KG5ldyBTZXQoKSk7XG4gIHJlYWRvbmx5IHNlbGVjdEFsbENoZWNrZWQgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBzZWxlY3RBbGxJbmRldGVybWluYXRlID0gc2lnbmFsKGZhbHNlKTtcbiAgcmVhZG9ubHkgc2VhcmNoVmFsdWUgPSBzaWduYWw8c3RyaW5nPignJyk7XG5cbiAgLy8gRmxhZ3MgdG8gY2hlY2sgaWYgZXZlbnRzIGhhdmUgbGlzdGVuZXJzXG4gIHJlYWRvbmx5IGhhc0NyZWF0ZUFjdGlvbkxpc3RlbmVyID0gc2lnbmFsKGZhbHNlKTtcbiAgcmVhZG9ubHkgaGFzVXBkYXRlQWN0aW9uTGlzdGVuZXIgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBoYXNEZWxldGVBY3Rpb25MaXN0ZW5lciA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IGhhc0NhbmNlbEFjdGlvbkxpc3RlbmVyID0gc2lnbmFsKGZhbHNlKTtcbiAgcmVhZG9ubHkgaGFzVmlld0FjdGlvbkxpc3RlbmVyID0gc2lnbmFsKGZhbHNlKTtcbiAgcmVhZG9ubHkgaGFzR2V0Um93QnV0dG9uTGlzdGVuZXIgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBoYXNNb3ZlVXBBY3Rpb25MaXN0ZW5lciA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IGhhc01vdmVEb3duQWN0aW9uTGlzdGVuZXIgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBoYXNFbmFibGVBY3Rpb25MaXN0ZW5lciA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IGhhc1NlYXJjaFRlcm1MaXN0ZW5lciA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IGhhc1NlbGVjdGFibGVMaXN0ZW5lciA9IHNpZ25hbChmYWxzZSk7XG5cbiAgcHJpdmF0ZSBkYXRhU3ViPzogU3Vic2NyaXB0aW9uO1xuXG4gIHByaXZhdGUgZ2V0RXJyb3JNZXNzYWdlKGVycjogdW5rbm93bik6IHN0cmluZyB7XG4gICAgcmV0dXJuIChlcnIgYXMgYW55KT8ubWVzc2FnZSB8fCAnRXJyb3IgYWwgY2FyZ2FyIGRhdG9zJztcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIC8vIENoZWNrIGlmIHRoZSBvdXRwdXRzIGhhdmUgbGlzdGVuZXJzXG4gICAgdGhpcy5oYXNDcmVhdGVBY3Rpb25MaXN0ZW5lci5zZXQodGhpcy5jcmVhdGVBY3Rpb24ub2JzZXJ2ZWQpO1xuICAgIHRoaXMuaGFzVXBkYXRlQWN0aW9uTGlzdGVuZXIuc2V0KHRoaXMudXBkYXRlQWN0aW9uLm9ic2VydmVkKTtcbiAgICB0aGlzLmhhc0RlbGV0ZUFjdGlvbkxpc3RlbmVyLnNldCh0aGlzLmRlbGV0ZUFjdGlvbi5vYnNlcnZlZCk7XG4gICAgdGhpcy5oYXNDYW5jZWxBY3Rpb25MaXN0ZW5lci5zZXQodGhpcy5jYW5jZWxBY3Rpb24ub2JzZXJ2ZWQpO1xuICAgIHRoaXMuaGFzVmlld0FjdGlvbkxpc3RlbmVyLnNldCh0aGlzLnZpZXdBY3Rpb24ub2JzZXJ2ZWQpO1xuICAgIHRoaXMuaGFzR2V0Um93QnV0dG9uTGlzdGVuZXIuc2V0KHRoaXMuZ2V0Um93QnV0dG9uQWN0aW9uLm9ic2VydmVkKTtcbiAgICB0aGlzLmhhc01vdmVVcEFjdGlvbkxpc3RlbmVyLnNldCh0aGlzLm1vdmVVcEFjdGlvbi5vYnNlcnZlZCk7XG4gICAgdGhpcy5oYXNNb3ZlRG93bkFjdGlvbkxpc3RlbmVyLnNldCh0aGlzLm1vdmVEb3duQWN0aW9uLm9ic2VydmVkKTtcbiAgICB0aGlzLmhhc0VuYWJsZUFjdGlvbkxpc3RlbmVyLnNldCh0aGlzLmVuYWJsZUFjdGlvbi5vYnNlcnZlZCk7XG4gICAgdGhpcy5oYXNTZWFyY2hUZXJtTGlzdGVuZXIuc2V0KHRoaXMuc2VhcmNoVGVybS5vYnNlcnZlZCk7XG4gICAgdGhpcy5oYXNTZWxlY3RhYmxlTGlzdGVuZXIuc2V0KHRoaXMuc2VsZWN0YWJsZS5vYnNlcnZlZCk7XG5cbiAgICBpZiAoIXRoaXMuZGF0YSQpIHJldHVybjtcbiAgICB0aGlzLmRhdGFTdWIgPSB0aGlzLmRhdGEkLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoaXRlbXMpID0+IHtcbiAgICAgICAgdGhpcy5hcHBseVNvcnRpbmcoaXRlbXMpO1xuICAgICAgICB0aGlzLmRhdGEuc2V0KGl0ZW1zKTtcbiAgICAgICAgLy8gU29sbyBtb3N0cmFyIGxhcyBjb2x1bW5hcyB2aXNpYmxlc1xuICAgICAgICBjb25zdCB2aXNpYmxlQ29sdW1ucyA9IHRoaXMuY29sdW1ucy5maWx0ZXIoXG4gICAgICAgICAgKGNvbCkgPT4gY29sPy52aXNpYmxlICE9PSBmYWxzZVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmtleXMuc2V0KHZpc2libGVDb2x1bW5zLm1hcCgoY29sKSA9PiBjb2wuYWNjZXNzb3IpKTtcbiAgICAgICAgLy8gTWFudGVuZXIgbGEgc2VsZWNjacOzbiBleGlzdGVudGUgZGVzcHXDqXMgZGUgYWN0dWFsaXphciBsb3MgZGF0b3NcbiAgICAgICAgdGhpcy5wcmVzZXJ2ZVNlbGVjdGlvbigpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+XG4gICAgICAgIHRoaXMuZXJyb3JFdmVudC5lbWl0KHRoaXMuZ2V0RXJyb3JNZXNzYWdlKGVycikpLFxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5kYXRhU3ViPy51bnN1YnNjcmliZSgpO1xuXG4gICAgLy8gQ2xvc2UgYW55IG9wZW4gbW9kYWwgd2hlbiBjb21wb25lbnQgaXMgZGVzdHJveWVkXG4gICAgdGhpcy5tb2RhbFNlcnZpY2UuY2xvc2VNb2RhbCgpO1xuICB9XG5cbiAgb25JbnB1dChldmVudDogRXZlbnQsIGtleTogc3RyaW5nLCBjb2w/OiBDODBUYWJsZUNvbERlZikge1xuICAgIGlmIChjb2w/LnR5cGUgPT09ICdib29sZWFuJykge1xuICAgICAgY29uc3QgY2hlY2tlZCA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkuY2hlY2tlZDtcbiAgICAgIHRoaXMudXBkYXRlTmV3Um93KGtleSwgY2hlY2tlZCk7XG4gICAgfSBlbHNlIGlmIChjb2w/LnR5cGUgPT09ICdlbnVtJykge1xuICAgICAgY29uc3QgdmFsdWUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxTZWxlY3RFbGVtZW50KS52YWx1ZTtcbiAgICAgIHRoaXMudXBkYXRlTmV3Um93KGtleSwgdmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICAgIGlmICh0YXJnZXQgJiYgdHlwZW9mIHRhcmdldC52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy51cGRhdGVOZXdSb3coa2V5LCB0YXJnZXQudmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG9uRGVsZXRlKHJvdzogVCkge1xuICAgIGNvbnN0IGlkID0gcm93WydpZCddIGFzIElEO1xuXG4gICAgbGV0IGNvbmZpcm1lZCA9IHRydWU7XG4gICAgaWYgKCF0aGlzLm5vQ29uZmlybSkge1xuICAgICAgY29uZmlybWVkID0gYXdhaXQgdGhpcy5tb2RhbFNlcnZpY2UuY29uZmlybShcbiAgICAgICAgJ0NvbmZpcm1hciBlbGltaW5hY2nDs24nLFxuICAgICAgICAnwr9Fc3TDoSBzZWd1cm8gZGUgcXVlIGRlc2VhIGVsaW1pbmFyIGVzdGUgZWxlbWVudG8/IEVzdGEgYWNjacOzbiBubyBzZSBwdWVkZSBkZXNoYWNlci4nLFxuICAgICAgICAnRWxpbWluYXInLFxuICAgICAgICAnQ2FuY2VsYXInXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChjb25maXJtZWQpIHtcbiAgICAgIHRoaXMuZGVsZXRlQWN0aW9uLmVtaXQoe1xuICAgICAgICBpZCxcbiAgICAgICAgZG9uZTogKHN1Y2Nlc3M6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICBpZiAoc3VjY2VzcykgdGhpcy5jYW5jZWxFZGl0KCk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBvbkNhbmNlbChyb3c6IFQpIHtcbiAgICBjb25zdCBpZCA9IHJvd1snaWQnXSBhcyBJRDtcblxuICAgIGxldCBjb25maXJtZWQgPSB0cnVlO1xuICAgIGlmICghdGhpcy5ub0NvbmZpcm0pIHtcbiAgICAgIGNvbmZpcm1lZCA9IGF3YWl0IHRoaXMubW9kYWxTZXJ2aWNlLmNvbmZpcm0oXG4gICAgICAgICdDb25maXJtYXIgY2FuY2VsYWNpw7NuJyxcbiAgICAgICAgJ8K/RXN0w6Egc2VndXJvIGRlIHF1ZSBkZXNlYSBjYW5jZWxhciBlc3RlIGVsZW1lbnRvPycsXG4gICAgICAgICdDYW5jZWxhciBlbGVtZW50bycsXG4gICAgICAgICdObyBjYW5jZWxhcidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpcm1lZCkge1xuICAgICAgdGhpcy5jYW5jZWxBY3Rpb24uZW1pdCh7XG4gICAgICAgIGlkLFxuICAgICAgICBkb25lOiAoc3VjY2VzczogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIGlmIChzdWNjZXNzKSB0aGlzLmNhbmNlbEVkaXQoKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHN0YXJ0Q3JlYXRlKCkge1xuICAgIHRoaXMuY3JlYXRpbmcuc2V0KHRydWUpO1xuICAgIC8vIEluaWNpYWxpemEgbmV3Um93IHNvbG8gY29uIGNvbHVtbmFzIHZpc2libGVzIHkgbm8gcmVhZE9ubHlcbiAgICBjb25zdCByb3c6IFBhcnRpYWw8VD4gPSB7fTtcbiAgICB0aGlzLmNvbHVtbnNcbiAgICAgIC5maWx0ZXIoKGNvbCkgPT4gY29sLnZpc2libGUgIT09IGZhbHNlICYmICFjb2wucmVhZE9ubHkpXG4gICAgICAuZm9yRWFjaCgoY29sKSA9PiB7XG4gICAgICAgIChyb3cgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2NvbC5hY2Nlc3Nvcl0gPSAnJztcbiAgICAgIH0pO1xuICAgIHRoaXMubmV3Um93LnNldChyb3cpO1xuICB9XG5cbiAgY2FuY2VsQ3JlYXRlKCkge1xuICAgIHRoaXMuY3JlYXRpbmcuc2V0KGZhbHNlKTtcbiAgICB0aGlzLm5ld1Jvdy5zZXQobnVsbCk7XG4gIH1cblxuICB1cGRhdGVOZXdSb3coa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMubmV3Um93KCk7XG4gICAgaWYgKCFjdXJyZW50KSByZXR1cm47XG4gICAgdGhpcy5uZXdSb3cuc2V0KHsgLi4uY3VycmVudCwgW2tleV06IHZhbHVlIH0pO1xuICB9XG5cbiAgc2F2ZUNyZWF0ZSgpIHtcbiAgICBjb25zdCByb3cgPSB0aGlzLm5ld1JvdygpO1xuICAgIGlmICghcm93KSByZXR1cm47XG5cbiAgICAvLyBWYWxpZGFyIGNhbXBvcyByZXF1ZXJpZG9zIGFudGVzIGRlIGNyZWFyIC0gc29sbyBjb2x1bW5hcyB2aXNpYmxlcyB5IG5vIHJlYWRPbmx5XG4gICAgY29uc3QgdmlzaWJsZUNvbHVtbnMgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKChjb2wpID0+IGNvbC52aXNpYmxlICE9PSBmYWxzZSAmJiAhY29sLnJlYWRPbmx5KTtcbiAgICBjb25zdCBjb252ZXJ0ZWQgPSB2aXNpYmxlQ29sdW1ucy5yZWR1Y2UoKGFjYywgY29sKSA9PiB7XG4gICAgICBhY2NbY29sLmFjY2Vzc29yXSA9IHRoaXMuY29udmVydENlbGxWYWx1ZShyb3dbY29sLmFjY2Vzc29yXSwgY29sKTtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIGFzIFBhcnRpYWw8VD47XG5cbiAgICB0aGlzLmNyZWF0ZUFjdGlvbi5lbWl0KHtcbiAgICAgIHJvdzogY29udmVydGVkLFxuICAgICAgZG9uZTogKHN1Y2Nlc3M6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgICB0aGlzLmNhbmNlbENyZWF0ZSgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgY2VsbCB2YWx1ZSBiYXNlZCBvbiBjb2x1bW4gdHlwZSBvciBzYW1wbGUgZGF0YS5cbiAgICogSGFuZGxlcyBzdHJpbmdpZmljYXRpb24gb2Ygb2JqZWN0cyBmb3Igc3RyaW5nIGNvbHVtbnMuXG4gICAqL1xuICAvKipcbiAgICogQ29udmVydHMgYSBjZWxsIHZhbHVlIGJhc2VkIG9uIGNvbHVtbiB0eXBlIG9yIHNhbXBsZSBkYXRhLlxuICAgKiBEZWxlZ2F0ZXMgdG8gdHlwZS1zcGVjaWZpYyBoZWxwZXJzIGZvciBjbGFyaXR5IGFuZCBtYWludGFpbmFiaWxpdHkuXG4gICAqL1xuICBwcml2YXRlIGNvbnZlcnRDZWxsVmFsdWUodmFsdWU6IHVua25vd24sIGNvbDogQzgwVGFibGVDb2xEZWYpOiB1bmtub3duIHtcbiAgICBpZiAoY29sLnR5cGUgPT09ICdib29sZWFuJykgcmV0dXJuIHRoaXMudG9Cb29sZWFuKHZhbHVlKTtcbiAgICBpZiAoY29sLnR5cGUgPT09ICdudW1iZXInKSByZXR1cm4gdGhpcy50b051bWJlcih2YWx1ZSk7XG4gICAgaWYgKGNvbC50eXBlID09PSAnc3RyaW5nJyB8fCBjb2wudHlwZSA9PT0gJ3Bhc3N3b3JkJylcbiAgICAgIHJldHVybiB0aGlzLnRvU3RyaW5nVmFsdWUodmFsdWUpO1xuXG4gICAgLy8gRmFsbGJhY2s6IHVzZSBzYW1wbGUgZGF0YSBpZiBhdmFpbGFibGVcbiAgICBjb25zdCBzYW1wbGUgPSB0aGlzLmRhdGEoKVswXTtcbiAgICBpZiAoc2FtcGxlKSB7XG4gICAgICBjb25zdCBzYW1wbGVWYWx1ZSA9IHRoaXMuZ2V0Q2VsbFZhbHVlKHNhbXBsZSwgY29sLmFjY2Vzc29yKTtcbiAgICAgIGlmICh0eXBlb2Ygc2FtcGxlVmFsdWUgPT09ICdib29sZWFuJykgcmV0dXJuIHRoaXMudG9Cb29sZWFuKHZhbHVlKTtcbiAgICAgIGlmICh0eXBlb2Ygc2FtcGxlVmFsdWUgPT09ICdudW1iZXInKSByZXR1cm4gdGhpcy50b051bWJlcih2YWx1ZSk7XG4gICAgICBpZiAodHlwZW9mIHNhbXBsZVZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIHRoaXMudG9TdHJpbmdWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKiBDb252ZXJ0cyB2YWx1ZSB0byBib29sZWFuIHVzaW5nIGJlc3QgcHJhY3RpY2VzLiAqL1xuICBwcml2YXRlIHRvQm9vbGVhbih2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykgcmV0dXJuIHZhbHVlO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKVxuICAgICAgcmV0dXJuIHZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZScgfHwgdmFsdWUudHJpbSgpID09PSAnMSc7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHJldHVybiB2YWx1ZSA9PT0gMTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKiogQ29udmVydHMgdmFsdWUgdG8gbnVtYmVyIHVzaW5nIGJlc3QgcHJhY3RpY2VzLiAqL1xuICBwcml2YXRlIHRvTnVtYmVyKHZhbHVlOiB1bmtub3duKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykgcmV0dXJuIHZhbHVlO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKVxuICAgICAgcmV0dXJuIHZhbHVlLnRyaW0oKSA9PT0gJycgPyB1bmRlZmluZWQgOiBOdW1iZXIodmFsdWUpO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykgcmV0dXJuIHZhbHVlID8gMSA6IDA7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBDb252ZXJ0cyB2YWx1ZSB0byBzdHJpbmcgdXNpbmcgYmVzdCBwcmFjdGljZXMsIGFsd2F5cyBzdHJpbmdpZmllcyBvYmplY3RzLiAqL1xuICBwcml2YXRlIHRvU3RyaW5nVmFsdWUodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gJyc7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiB2YWx1ZTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJylcbiAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiAnW29iamVjdCBPYmplY3RdJztcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gRm9yIGZ1bmN0aW9ucywgc3ltYm9scywgdW5kZWZpbmVkLCBldGMuLCByZXR1cm4gZW1wdHkgc3RyaW5nXG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgb25FZGl0KHJvdzogVCkge1xuICAgIHRoaXMuZWRpdGluZy5zZXQocm93WydpZCddIGFzIElEKTtcbiAgICBjb25zdCBlZGl0OiBQYXJ0aWFsPFQ+ID0ge307XG4gICAgdGhpcy5jb2x1bW5zXG4gICAgICAuZmlsdGVyKChjb2wpID0+IGNvbC52aXNpYmxlICE9PSBmYWxzZSAmJiAhY29sLnJlYWRPbmx5KVxuICAgICAgLmZvckVhY2goKGNvbCkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0Q2VsbFZhbHVlKHJvdywgY29sLmFjY2Vzc29yKTtcbiAgICAgICAgKGVkaXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2NvbC5hY2Nlc3Nvcl0gPSB2YWx1ZTtcbiAgICAgIH0pO1xuICAgIHRoaXMuZWRpdFJvdy5zZXQoZWRpdCk7XG4gIH1cblxuICBjYW5jZWxFZGl0KCkge1xuICAgIHRoaXMuZWRpdGluZy5zZXQobnVsbCk7XG4gICAgdGhpcy5lZGl0Um93LnNldChudWxsKTtcbiAgfVxuXG4gIG9uRWRpdElucHV0KGV2ZW50OiBFdmVudCwga2V5OiBzdHJpbmcsIGNvbD86IEM4MFRhYmxlQ29sRGVmKSB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuZWRpdFJvdygpO1xuICAgIGlmICghY3VycmVudCkgcmV0dXJuO1xuICAgIGlmIChjb2w/LnR5cGUgPT09ICdib29sZWFuJykge1xuICAgICAgY29uc3QgY2hlY2tlZCA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkuY2hlY2tlZDtcbiAgICAgIHRoaXMuZWRpdFJvdy5zZXQoeyAuLi5jdXJyZW50LCBba2V5XTogY2hlY2tlZCB9KTtcbiAgICB9IGVsc2UgaWYgKGNvbD8udHlwZSA9PT0gJ2VudW0nKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IChldmVudC50YXJnZXQgYXMgSFRNTFNlbGVjdEVsZW1lbnQpLnZhbHVlO1xuICAgICAgdGhpcy5lZGl0Um93LnNldCh7IC4uLmN1cnJlbnQsIFtrZXldOiB2YWx1ZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgICBpZiAodGFyZ2V0ICYmIHR5cGVvZiB0YXJnZXQudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMuZWRpdFJvdy5zZXQoeyAuLi5jdXJyZW50LCBba2V5XTogdGFyZ2V0LnZhbHVlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNhdmVFZGl0KHJvdzogVCkge1xuICAgIGNvbnN0IGlkID0gcm93WydpZCddO1xuICAgIGlmICgodHlwZW9mIGlkICE9PSAnc3RyaW5nJyAmJiB0eXBlb2YgaWQgIT09ICdudW1iZXInKSB8fCAhdGhpcy5lZGl0Um93KCkpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgdmlzaWJsZUNvbHVtbnMgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKFxuICAgICAgKGNvbCkgPT4gY29sLnZpc2libGUgIT09IGZhbHNlICYmICFjb2wucmVhZE9ubHlcbiAgICApO1xuICAgIGNvbnN0IGNvbnZlcnRlZCA9IHZpc2libGVDb2x1bW5zLnJlZHVjZSgoYWNjLCBjb2wpID0+IHtcbiAgICAgIGFjY1tjb2wuYWNjZXNzb3JdID0gdGhpcy5jb252ZXJ0Q2VsbFZhbHVlKFxuICAgICAgICB0aGlzLmVkaXRSb3coKSFbY29sLmFjY2Vzc29yXSxcbiAgICAgICAgY29sXG4gICAgICApO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgYXMgUGFydGlhbDxUPjtcblxuICAgIHRoaXMudXBkYXRlQWN0aW9uLmVtaXQoe1xuICAgICAgaWQsXG4gICAgICBjaGFuZ2VzOiBjb252ZXJ0ZWQsXG4gICAgICBkb25lOiAoc3VjY2VzczogYm9vbGVhbikgPT4ge1xuICAgICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICAgIHRoaXMuY2FuY2VsRWRpdCgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYWNrQnkgZnVuY3Rpb24gZm9yIG5nRm9yIHRvIGF2b2lkIERPTSByZS1jcmVhdGlvbiAoTkcwOTU2IHdhcm5pbmcpLlxuICAgKi9cbiAgdHJhY2tCeUlkKGluZGV4OiBudW1iZXIsIHJvdzogVCk6IG51bWJlciB8IHN0cmluZyB7XG4gICAgY29uc3QgaWQgPVxuICAgICAgcm93ICYmIHR5cGVvZiByb3cgPT09ICdvYmplY3QnICYmICdpZCcgaW4gcm93XG4gICAgICAgID8gKHJvdyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbJ2lkJ11cbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHR5cGVvZiBpZCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGlkID09PSAnbnVtYmVyJyA/IGlkIDogaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgdGhlIHZpZXcgZXZlbnQgd2l0aCB0aGUgZW50aXJlIHJvdyBkYXRhXG4gICAqL1xuICBvblZpZXcocm93OiBUKTogdm9pZCB7XG4gICAgdGhpcy52aWV3QWN0aW9uLmVtaXQocm93KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgZ2V0Um93QnV0dG9uQWN0aW9uIGV2ZW50IHdpdGggdGhlIGVudGlyZSByb3cgZGF0YVxuICAgKi9cbiAgb25HZXRSb3dCdXR0b24ocm93OiBUKTogdm9pZCB7XG4gICAgdGhpcy5nZXRSb3dCdXR0b25BY3Rpb24uZW1pdChyb3cpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBtb3ZlVXBBY3Rpb24gZXZlbnQgd2l0aCB0aGUgcm93IGlkXG4gICAqL1xuICBhc3luYyBvbk1vdmVVcChyb3c6IFQpIHtcbiAgICBjb25zdCBpZCA9IHJvd1snaWQnXSBhcyBJRDtcbiAgICB0aGlzLm1vdmVVcEFjdGlvbi5lbWl0KHtcbiAgICAgIGlkLFxuICAgICAgZG9uZTogKHN1Y2Nlc3M6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKHN1Y2Nlc3MpIHRoaXMuY2FuY2VsRWRpdCgpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgbW92ZURvd25BY3Rpb24gZXZlbnQgd2l0aCB0aGUgcm93IGlkXG4gICAqL1xuICBhc3luYyBvbk1vdmVEb3duKHJvdzogVCkge1xuICAgIGNvbnN0IGlkID0gcm93WydpZCddIGFzIElEO1xuICAgIHRoaXMubW92ZURvd25BY3Rpb24uZW1pdCh7XG4gICAgICBpZCxcbiAgICAgIGRvbmU6IChzdWNjZXNzOiBib29sZWFuKSA9PiB7XG4gICAgICAgIGlmIChzdWNjZXNzKSB0aGlzLmNhbmNlbEVkaXQoKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgdGhlIGVuYWJsZUFjdGlvbiBldmVudCB3aXRoIHRoZSByb3cgaWQgYW5kIGN1cnJlbnQgZW5hYmxlZCBzdGF0dXNcbiAgICovXG4gIGFzeW5jIG9uRW5hYmxlKHJvdzogVCkge1xuICAgIGNvbnN0IGlkID0gcm93WydpZCddIGFzIElEO1xuICAgIGNvbnN0IGN1cnJlbnRFbmFibGVkID0gcm93WydlbmFibGVkJ10gYXMgYm9vbGVhbjtcbiAgICB0aGlzLmVuYWJsZUFjdGlvbi5lbWl0KHtcbiAgICAgIGlkLFxuICAgICAgZW5hYmxlZDogIWN1cnJlbnRFbmFibGVkLCAvLyBUb2dnbGUgdGhlIGN1cnJlbnQgc3RhdGVcbiAgICAgIGRvbmU6IChzdWNjZXNzOiBib29sZWFuKSA9PiB7XG4gICAgICAgIGlmIChzdWNjZXNzKSB0aGlzLmNhbmNlbEVkaXQoKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBzZWFyY2ggaW5wdXQgY2hhbmdlcyB3aXRoIGRlYm91bmNpbmdcbiAgICovXG4gIG9uU2VhcmNoSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgY29uc3QgdmFsdWUgPSB0YXJnZXQudmFsdWU7XG4gICAgdGhpcy5zZWFyY2hWYWx1ZS5zZXQodmFsdWUpO1xuICAgIHRoaXMuc2VhcmNoVGVybS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIHNlYXJjaCBpbnB1dFxuICAgKi9cbiAgY2xlYXJTZWFyY2goKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hWYWx1ZS5zZXQoJycpO1xuICAgIHRoaXMuc2VhcmNoVGVybS5lbWl0KCcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2YWx1ZSBmcm9tIGFuIG9iamVjdCB1c2luZyBkb3Qgbm90YXRpb24gKGUuZy4sICd0YXNrLm5hbWUnKVxuICAgKi9cbiAgcHJpdmF0ZSBnZXROZXN0ZWRWYWx1ZShvYmo6IGFueSwgYWNjZXNzb3I6IHN0cmluZyk6IHVua25vd24ge1xuICAgIHJldHVybiBhY2Nlc3Nvci5zcGxpdCgnLicpLnJlZHVjZSgoY3VycmVudCwga2V5KSA9PiB7XG4gICAgICByZXR1cm4gY3VycmVudCAmJiB0eXBlb2YgY3VycmVudCA9PT0gJ29iamVjdCcgPyBjdXJyZW50W2tleV0gOiB1bmRlZmluZWQ7XG4gICAgfSwgb2JqKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2YWx1ZSBmb3IgYSBjZWxsIHVzaW5nIHRoZSBhY2Nlc3Nvciwgc3VwcG9ydGluZyBkb3Qgbm90YXRpb24gZm9yIG5lc3RlZCBwcm9wZXJ0aWVzXG4gICAqL1xuICBnZXRDZWxsVmFsdWUocm93OiBULCBhY2Nlc3Nvcjogc3RyaW5nKTogdW5rbm93biB7XG4gICAgaWYgKGFjY2Vzc29yLmluY2x1ZGVzKCcuJykpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldE5lc3RlZFZhbHVlKHJvdywgYWNjZXNzb3IpO1xuICAgIH1cbiAgICByZXR1cm4gKHJvdyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbYWNjZXNzb3JdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGRpc3BsYXkgdmFsdWUgZm9yIGEgY2VsbCwgc2hvd2luZyAnLScgZm9yIGZhbHN5IHZhbHVlcyBleGNlcHQgMCwgZmFsc2UsIGFuZCBlbXB0eSBvYmplY3RzL2FycmF5c1xuICAgKi9cbiAgZ2V0RGlzcGxheVZhbHVlKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgICAvLyBJZiB2YWx1ZSBpcyAwLCBzaG93IGl0XG4gICAgaWYgKHZhbHVlID09PSAwKSB7XG4gICAgICByZXR1cm4gJzAnO1xuICAgIH1cbiAgICAvLyBJZiB2YWx1ZSBpcyBmYWxzZSwgaXQgc2hvdWxkIGJlIGhhbmRsZWQgYnkgYm9vbGVhbiBsb2dpYyBpbiB0ZW1wbGF0ZSwgbm90IGhlcmVcbiAgICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gJ2ZhbHNlJztcbiAgICB9XG4gICAgLy8gSGFuZGxlIG9iamVjdHMgYW5kIGFycmF5cyAoaW5jbHVkaW5nIGVtcHR5IG9uZXMpXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuICdbb2JqZWN0IE9iamVjdF0nO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBJZiB2YWx1ZSBpcyBvdGhlciBmYWxzeSB2YWx1ZXMgKG51bGwsIHVuZGVmaW5lZCwgJycpLCBzaG93ICctJ1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybiAnLSc7XG4gICAgfVxuICAgIC8vIEhhbmRsZSBvdGhlciB0eXBlcyBleHBsaWNpdGx5XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fFxuICAgICAgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fFxuICAgICAgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbidcbiAgICApIHtcbiAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgIH1cbiAgICAvLyBGb3IgYW55IG90aGVyIHR5cGUgKGZ1bmN0aW9uLCBzeW1ib2wsIGV0Yy4pLCByZXR1cm4gYSBzYWZlIGZhbGxiYWNrXG4gICAgcmV0dXJuICctJztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBkaXNwbGF5IHRleHQgZm9yIGFuIGVudW0gdmFsdWVcbiAgICovXG4gIGdldEVudW1EaXNwbGF5VmFsdWUodmFsdWU6IHVua25vd24sIGNvbDogQzgwVGFibGVDb2xEZWYpOiBzdHJpbmcge1xuICAgIGlmICghY29sLmVudW0gfHwgKHZhbHVlICE9PSAwICYmICF2YWx1ZSkpIHtcbiAgICAgIHJldHVybiAnLSc7XG4gICAgfVxuICAgIGNvbnN0IGRpc3BsYXlWYWx1ZSA9IGNvbC5lbnVtW3ZhbHVlIGFzIHN0cmluZyB8IG51bWJlcl07XG4gICAgcmV0dXJuIChcbiAgICAgIGRpc3BsYXlWYWx1ZSB8fFxuICAgICAgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJ1xuICAgICAgICA/IFN0cmluZyh2YWx1ZSlcbiAgICAgICAgOiAnLScpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBlbnVtIG9wdGlvbnMgYXMgYW4gYXJyYXkgZm9yIHNlbGVjdCBkcm9wZG93bnNcbiAgICovXG4gIGdldEVudW1PcHRpb25zKFxuICAgIGNvbDogQzgwVGFibGVDb2xEZWZcbiAgKTogeyB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyOyBsYWJlbDogc3RyaW5nIH1bXSB7XG4gICAgaWYgKCFjb2wuZW51bSkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhjb2wuZW51bSkubWFwKChbdmFsdWUsIGxhYmVsXSkgPT4gKHtcbiAgICAgIHZhbHVlOiBpc05hTihOdW1iZXIodmFsdWUpKSA/IHZhbHVlIDogTnVtYmVyKHZhbHVlKSxcbiAgICAgIGxhYmVsLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBDU1MgY29sb3IgZm9yIGEgY2VsbCB2YWx1ZSBiYXNlZCBvbiB0aGUgY29sdW1uJ3MgY29sb3IgY29uZmlndXJhdGlvblxuICAgKi9cbiAgZ2V0Q2VsbENvbG9yKHZhbHVlOiB1bmtub3duLCBjb2w6IEM4MFRhYmxlQ29sRGVmKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWNvbC5jb2xvciB8fCAodmFsdWUgIT09IDAgJiYgIXZhbHVlKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGNvbC5jb2xvclt2YWx1ZSBhcyBzdHJpbmcgfCBudW1iZXJdO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGEgZWwgbWF4LWhlaWdodCBkZSBsYSB0YWJsYSBiYXNhZG8gZW4gZWwgdGFtYcOxb1xuICAgKiBTaSBzaXplIGVzIDAsIHJldG9ybmEgdW5kZWZpbmVkIChzaW4gbMOtbWl0ZSBkZSBhbHR1cmEpXG4gICAqL1xuICBnZXRUYWJsZU1heEhlaWdodCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnNpemUgPD0gMCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDsgLy8gU2luIGzDrW1pdGUgZGUgYWx0dXJhXG4gICAgfVxuICAgIC8vIEFsdHVyYSBiYXNlIGRlIDQwMHB4ICogc2l6ZVxuICAgIGNvbnN0IGJhc2VIZWlnaHQgPSA0MDA7XG4gICAgY29uc3QgbWF4SGVpZ2h0ID0gTWF0aC5yb3VuZChiYXNlSGVpZ2h0ICogdGhpcy5zaXplKTtcbiAgICByZXR1cm4gYCR7bWF4SGVpZ2h0fXB4YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3Rpb24gbWV0aG9kc1xuICAgKi9cbiAgY2xlYXJTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1zLnNldChuZXcgU2V0KCkpO1xuICAgIHRoaXMudXBkYXRlU2VsZWN0QWxsU3RhdGUoKTtcbiAgICB0aGlzLmVtaXRTZWxlY3Rpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYW50aWVuZSBsYSBzZWxlY2Npw7NuIGV4aXN0ZW50ZSBkZXNwdcOpcyBkZSBhY3R1YWxpemFyIGxvcyBkYXRvcyxcbiAgICogZWxpbWluYW5kbyBzb2xvIGxvcyBJRHMgcXVlIHlhIG5vIGV4aXN0ZW4gZW4gbG9zIG51ZXZvcyBkYXRvc1xuICAgKi9cbiAgcHJpdmF0ZSBwcmVzZXJ2ZVNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50U2VsZWN0aW9uID0gdGhpcy5zZWxlY3RlZEl0ZW1zKCk7XG4gICAgY29uc3QgY3VycmVudERhdGEgPSB0aGlzLmRhdGEoKTtcblxuICAgIGlmIChjdXJyZW50U2VsZWN0aW9uLnNpemUgPT09IDAgfHwgY3VycmVudERhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBTaSBubyBoYXkgc2VsZWNjacOzbiBvIG5vIGhheSBkYXRvcywgbGltcGlhciBsYSBzZWxlY2Npw7NuXG4gICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gT2J0ZW5lciBsb3MgSURzIGRpc3BvbmlibGVzIGVuIGxvcyBudWV2b3MgZGF0b3NcbiAgICBjb25zdCBhdmFpbGFibGVJZHMgPSBuZXcgU2V0KGN1cnJlbnREYXRhLm1hcChpdGVtID0+IGl0ZW1bJ2lkJ10gYXMgSUQpKTtcblxuICAgIC8vIEZpbHRyYXIgbGEgc2VsZWNjacOzbiBhY3R1YWwgcGFyYSBtYW50ZW5lciBzb2xvIGxvcyBJRHMgcXVlIGHDum4gZXhpc3RlblxuICAgIGNvbnN0IHByZXNlcnZlZFNlbGVjdGlvbiA9IG5ldyBTZXQoXG4gICAgICBBcnJheS5mcm9tKGN1cnJlbnRTZWxlY3Rpb24pLmZpbHRlcihpZCA9PiBhdmFpbGFibGVJZHMuaGFzKGlkKSlcbiAgICApO1xuXG4gICAgLy8gQWN0dWFsaXphciBsYSBzZWxlY2Npw7NuIGNvbiBsb3MgSURzIHByZXNlcnZhZG9zXG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1zLnNldChwcmVzZXJ2ZWRTZWxlY3Rpb24pO1xuICAgIHRoaXMudXBkYXRlU2VsZWN0QWxsU3RhdGUoKTtcbiAgICB0aGlzLmVtaXRTZWxlY3Rpb24oKTtcbiAgfVxuXG4gIHRvZ2dsZVNlbGVjdEFsbCgpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50U2VsZWN0aW9uID0gdGhpcy5zZWxlY3RlZEl0ZW1zKCk7XG4gICAgY29uc3QgYWxsSXRlbXMgPSB0aGlzLmRhdGEoKTtcblxuICAgIGlmIChjdXJyZW50U2VsZWN0aW9uLnNpemUgPT09IGFsbEl0ZW1zLmxlbmd0aCkge1xuICAgICAgLy8gRGVzZWxlY3QgYWxsXG4gICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNlbGVjdCBhbGxcbiAgICAgIGNvbnN0IGFsbElkcyA9IG5ldyBTZXQoYWxsSXRlbXMubWFwKGl0ZW0gPT4gaXRlbVsnaWQnXSBhcyBJRCkpO1xuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zLnNldChhbGxJZHMpO1xuICAgICAgdGhpcy51cGRhdGVTZWxlY3RBbGxTdGF0ZSgpO1xuICAgICAgdGhpcy5lbWl0U2VsZWN0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlSXRlbVNlbGVjdGlvbihpdGVtOiBUKTogdm9pZCB7XG4gICAgY29uc3QgaWQgPSBpdGVtWydpZCddIGFzIElEO1xuICAgIGNvbnN0IGN1cnJlbnRTZWxlY3Rpb24gPSBuZXcgU2V0KHRoaXMuc2VsZWN0ZWRJdGVtcygpKTtcblxuICAgIGlmICghdGhpcy5tdWx0aXBsZSkge1xuICAgICAgLy8gU2VsZWNjacOzbiBzaW1wbGU6IHNvbG8gcGVybWl0aXIgdW4gZWxlbWVudG8gc2VsZWNjaW9uYWRvXG4gICAgICBpZiAoY3VycmVudFNlbGVjdGlvbi5oYXMoaWQpKSB7XG4gICAgICAgIC8vIERlc2VsZWNjaW9uYXIgZWwgZWxlbWVudG8gYWN0dWFsXG4gICAgICAgIGN1cnJlbnRTZWxlY3Rpb24uY2xlYXIoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFNlbGVjY2lvbmFyIHNvbG8gZXN0ZSBlbGVtZW50b1xuICAgICAgICBjdXJyZW50U2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgICAgIGN1cnJlbnRTZWxlY3Rpb24uYWRkKGlkKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGN1cnJlbnRTZWxlY3Rpb24uaGFzKGlkKSkge1xuICAgICAgLy8gU2VsZWNjacOzbiBtw7psdGlwbGU6IGRlc2VsZWNjaW9uYXIgZWxlbWVudG8gZXhpc3RlbnRlXG4gICAgICBjdXJyZW50U2VsZWN0aW9uLmRlbGV0ZShpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNlbGVjY2nDs24gbcO6bHRpcGxlOiBhZ3JlZ2FyIG51ZXZvIGVsZW1lbnRvXG4gICAgICBjdXJyZW50U2VsZWN0aW9uLmFkZChpZCk7XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1zLnNldChjdXJyZW50U2VsZWN0aW9uKTtcbiAgICB0aGlzLnVwZGF0ZVNlbGVjdEFsbFN0YXRlKCk7XG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uKCk7XG4gIH0gaXNJdGVtU2VsZWN0ZWQoaXRlbTogVCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGlkID0gaXRlbVsnaWQnXSBhcyBJRDtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEl0ZW1zKCkuaGFzKGlkKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU2VsZWN0QWxsU3RhdGUoKTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZWN0ZWRDb3VudCA9IHRoaXMuc2VsZWN0ZWRJdGVtcygpLnNpemU7XG4gICAgY29uc3QgdG90YWxDb3VudCA9IHRoaXMuZGF0YSgpLmxlbmd0aDtcblxuICAgIGlmIChzZWxlY3RlZENvdW50ID09PSAwKSB7XG4gICAgICB0aGlzLnNlbGVjdEFsbENoZWNrZWQuc2V0KGZhbHNlKTtcbiAgICAgIHRoaXMuc2VsZWN0QWxsSW5kZXRlcm1pbmF0ZS5zZXQoZmFsc2UpO1xuICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRDb3VudCA9PT0gdG90YWxDb3VudCkge1xuICAgICAgdGhpcy5zZWxlY3RBbGxDaGVja2VkLnNldCh0cnVlKTtcbiAgICAgIHRoaXMuc2VsZWN0QWxsSW5kZXRlcm1pbmF0ZS5zZXQoZmFsc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdEFsbENoZWNrZWQuc2V0KGZhbHNlKTtcbiAgICAgIHRoaXMuc2VsZWN0QWxsSW5kZXRlcm1pbmF0ZS5zZXQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0U2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkSWRzID0gdGhpcy5zZWxlY3RlZEl0ZW1zKCk7XG4gICAgY29uc3Qgc2VsZWN0ZWRJdGVtcyA9IHRoaXMuZGF0YSgpLmZpbHRlcihpdGVtID0+XG4gICAgICBzZWxlY3RlZElkcy5oYXMoaXRlbVsnaWQnXSBhcyBJRClcbiAgICApO1xuICAgIHRoaXMuc2VsZWN0YWJsZS5lbWl0KHNlbGVjdGVkSXRlbXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVNvcnRpbmcoaXRlbXM6IFRbXSk6IHZvaWQge1xuICAgIGNvbnN0IG9yZGVyZWRDb2x1bW5zID0gdGhpcy5jb2x1bW5zLmZpbHRlcigoY29sKSA9PiBjb2wub3JkZXIpO1xuICAgIGlmIChvcmRlcmVkQ29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICBvcmRlcmVkQ29sdW1ucy5mb3JFYWNoKChjb2wpID0+IHtcbiAgICAgICAgaXRlbXMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhbHVlQSA9IHRoaXMuZ2V0Q2VsbFZhbHVlKGEsIGNvbC5hY2Nlc3NvcikgYXMgc3RyaW5nIHwgbnVtYmVyO1xuICAgICAgICAgIGNvbnN0IHZhbHVlQiA9IHRoaXMuZ2V0Q2VsbFZhbHVlKGIsIGNvbC5hY2Nlc3NvcikgYXMgc3RyaW5nIHwgbnVtYmVyO1xuXG4gICAgICAgICAgaWYgKGNvbC5vcmRlciA9PT0gJ0FTQycpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZUEgPiB2YWx1ZUIpIHJldHVybiAxO1xuICAgICAgICAgICAgaWYgKHZhbHVlQSA8IHZhbHVlQikgcmV0dXJuIC0xO1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZUEgPCB2YWx1ZUIpIHJldHVybiAxO1xuICAgICAgICAgICAgaWYgKHZhbHVlQSA+IHZhbHVlQikgcmV0dXJuIC0xO1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInRhYmxlLXJlc3BvbnNpdmVcIiBbc3R5bGUubWF4LWhlaWdodF09XCJnZXRUYWJsZU1heEhlaWdodCgpXCIgW3N0eWxlLm92ZXJmbG93LXldPVwic2l6ZSA+IDAgPyAnYXV0bycgOiAndmlzaWJsZSdcIj5cbiAgPCEtLSBTZWFyY2ggQmFyIC0tPlxuICBAaWYgKGhhc1NlYXJjaFRlcm1MaXN0ZW5lcigpKSB7XG4gIDxkaXYgY2xhc3M9XCJzZWFyY2gtY29udGFpbmVyXCI+XG4gICAgPGRpdiBjbGFzcz1cInNlYXJjaC1pbnB1dC13cmFwcGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnB1dC1ncm91cC10ZXh0XCI+XG4gICAgICAgICAgPGM4MC1pY29uIGljb249XCJzZWFyY2hcIiBbc2l6ZV09XCIuOFwiPjwvYzgwLWljb24+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgc2VhcmNoLWlucHV0XCIgcGxhY2Vob2xkZXI9XCJCdXNjYXIuLi5cIiBbdmFsdWVdPVwic2VhcmNoVmFsdWUoKVwiIChpbnB1dCk9XCJvblNlYXJjaElucHV0KCRldmVudClcIiBhcmlhLWxhYmVsPVwiQnVzY2FyIGVuIGxhIHRhYmxhXCIgLz5cbiAgICAgICAgQGlmIChzZWFyY2hWYWx1ZSgpKSB7XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5IGJ0bi1ib3JyYXJcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImNsZWFyU2VhcmNoKClcIiB0aXRsZT1cIkxpbXBpYXIgYsO6c3F1ZWRhXCI+XG4gICAgICAgICAgPGM4MC1pY29uIGljb249XCJjYW5jZWxcIiBbc2l6ZV09XCIuN1wiPjwvYzgwLWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIH1cblxuICA8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1ib3JkZXJlZCB0YWJsZS1ob3ZlciBhbGlnbi1taWRkbGVcIj5cbiAgICA8dGhlYWQgY2xhc3M9XCJ0aGVhZCB0YWJsZS1saWdodCBzdGlja3ktaGVhZGVyXCI+XG4gICAgICA8dHI+XG4gICAgICAgIEBpZiAoaGFzU2VsZWN0YWJsZUxpc3RlbmVyKCkgJiYgZGF0YSgpLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICA8dGggY2xhc3M9XCJ0ZXh0LWNlbnRlciBzZWxlY3Rpb24tY29sdW1uXCI+XG4gICAgICAgICAgQGlmIChtdWx0aXBsZSkge1xuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJzZWxlY3RBbGxDaGVja2VkKClcIiBbaW5kZXRlcm1pbmF0ZV09XCJzZWxlY3RBbGxJbmRldGVybWluYXRlKClcIiAoY2hhbmdlKT1cInRvZ2dsZVNlbGVjdEFsbCgpXCIgYXJpYS1sYWJlbD1cIlNlbGVjY2lvbmFyIHRvZG9cIiAvPlxuICAgICAgICAgIH1cbiAgICAgICAgPC90aD5cbiAgICAgICAgfVxuICAgICAgICBAZm9yIChjb2wgb2YgY29sdW1uczsgdHJhY2sgY29sKSB7XG4gICAgICAgIEBpZiAoY29sLnZpc2libGUgIT09IGZhbHNlKSB7XG4gICAgICAgIEBpZiAoY29sLnR5cGUgPT09ICdib29sZWFuJykge1xuICAgICAgICA8dGggY2xhc3M9XCJ0ZXh0LWNlbnRlciBib29sZWFuLWNvbHVtblwiPnt7IGNvbC5sYWJlbCB9fTwvdGg+XG4gICAgICAgIH1cbiAgICAgICAgQGVsc2UgaWYgKGNvbC50eXBlID09PSAnbnVtYmVyJykge1xuICAgICAgICA8dGggY2xhc3M9XCJ0ZXh0LWNlbnRlciBudW1iZXItY29sdW1uXCI+e3sgY29sLmxhYmVsIH19PC90aD5cbiAgICAgICAgfVxuICAgICAgICBAZWxzZSB7XG4gICAgICAgIDx0aD57eyBjb2wubGFiZWwgfX08L3RoPlxuICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBAaWYgKGhhc0NyZWF0ZUFjdGlvbkxpc3RlbmVyKCkgfHwgaGFzVXBkYXRlQWN0aW9uTGlzdGVuZXIoKSB8fCBoYXNEZWxldGVBY3Rpb25MaXN0ZW5lcigpIHx8XG4gICAgICAgIGhhc0NhbmNlbEFjdGlvbkxpc3RlbmVyKCkgfHwgaGFzVmlld0FjdGlvbkxpc3RlbmVyKCkgfHwgaGFzR2V0Um93QnV0dG9uTGlzdGVuZXIoKSB8fFxuICAgICAgICBoYXNNb3ZlVXBBY3Rpb25MaXN0ZW5lcigpIHx8IGhhc01vdmVEb3duQWN0aW9uTGlzdGVuZXIoKSkge1xuICAgICAgICA8dGggY2xhc3M9XCJ0YWJsZS1hY3Rpb25zLWhlYWRlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25zLXdyYXBwZXJcIj5cbiAgICAgICAgICAgIDxzcGFuPkFjdGlvbnM8L3NwYW4+XG4gICAgICAgICAgICBAaWYgKGhhc0NyZWF0ZUFjdGlvbkxpc3RlbmVyKCkpIHtcbiAgICAgICAgICAgIDxjODAtaWNvbiBidXR0b24gaWNvbj1cImFkZFwiIFtkaXNhYmxlZF09XCJjcmVhdGluZygpXCIgdGl0bGU9XCJBZ3JlZ2FyXCIgW3NpemVdPVwiLjZcIiAoaWNvbkNsaWNrKT1cInN0YXJ0Q3JlYXRlKClcIj48L2M4MC1pY29uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3RoPlxuICAgICAgICB9XG4gICAgICA8L3RyPlxuICAgIDwvdGhlYWQ+XG4gICAgPHRib2R5PlxuICAgICAgQGZvciAocm93IG9mIGRhdGEoKTsgdHJhY2sgdHJhY2tCeUlkKGksIHJvdyk7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICA8dHI+XG4gICAgICAgIEBpZiAoaGFzU2VsZWN0YWJsZUxpc3RlbmVyKCkgJiYgZGF0YSgpLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LWNlbnRlciBzZWxlY3Rpb24tY29sdW1uXCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtjaGVja2VkXT1cImlzSXRlbVNlbGVjdGVkKHJvdylcIiAoY2hhbmdlKT1cInRvZ2dsZUl0ZW1TZWxlY3Rpb24ocm93KVwiIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1NlbGVjY2lvbmFyIGZpbGEgJyArIChpICsgMSlcIiAvPlxuICAgICAgICA8L3RkPlxuICAgICAgICB9XG4gICAgICAgIEBmb3IgKGNvbCBvZiBjb2x1bW5zOyB0cmFjayBjb2wpIHtcbiAgICAgICAgQGlmIChjb2wudmlzaWJsZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgQGlmIChjb2wudHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIDx0ZCBjbGFzcz1cInRleHQtY2VudGVyIGJvb2xlYW4tY29sdW1uXCI+XG4gICAgICAgICAgQGlmIChlZGl0aW5nKCkgPT09IHJvd1snaWQnXSAmJiAhY29sLnJlYWRPbmx5KSB7XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtjaGVja2VkXT1cIiEhZWRpdFJvdygpPy5bY29sLmFjY2Vzc29yXVwiIChjaGFuZ2UpPVwib25FZGl0SW5wdXQoJGV2ZW50LCBjb2wuYWNjZXNzb3IsIGNvbClcIiBbYXR0ci5hcmlhLWxhYmVsXT1cImNvbC5sYWJlbFwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBlbHNlIHtcbiAgICAgICAgICBAaWYgKGdldENlbGxWYWx1ZShyb3csIGNvbC5hY2Nlc3NvcikgPT09IHRydWUpIHtcbiAgICAgICAgICA8YzgwLWljb24gaWNvbj1cImNoZWNrXCIgW3NpemVdPVwiLjdcIj48L2M4MC1pY29uPlxuICAgICAgICAgIDxiciAvPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAZWxzZSBpZiAoZ2V0Q2VsbFZhbHVlKHJvdywgY29sLmFjY2Vzc29yKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICA8YzgwLWljb24gaWNvbj1cImNhbmNlbFwiIFtzaXplXT1cIi43XCI+PC9jODAtaWNvbj5cbiAgICAgICAgICA8YnIgLz5cbiAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICA8L3RkPlxuICAgICAgICB9XG4gICAgICAgIEBlbHNlIGlmIChjb2wudHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1jZW50ZXIgbnVtYmVyLWNvbHVtblwiPlxuICAgICAgICAgIEBpZiAoZWRpdGluZygpID09PSByb3dbJ2lkJ10gJiYgIWNvbC5yZWFkT25seSkge1xuICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc21cIiB0eXBlPVwibnVtYmVyXCIgW3ZhbHVlXT1cImVkaXRSb3coKT8uW2NvbC5hY2Nlc3Nvcl0gPz8gJydcIiBbcGxhY2Vob2xkZXJdPVwiY29sLmxhYmVsXCIgKGlucHV0KT1cIm9uRWRpdElucHV0KCRldmVudCwgY29sLmFjY2Vzc29yLCBjb2wpXCIgLz5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGVsc2Uge1xuICAgICAgICAgIDxzcGFuIFtzdHlsZS5jb2xvcl09XCJnZXRDZWxsQ29sb3IoZ2V0Q2VsbFZhbHVlKHJvdywgY29sLmFjY2Vzc29yKSwgY29sKVwiPnt7IGdldERpc3BsYXlWYWx1ZShnZXRDZWxsVmFsdWUocm93LFxuICAgICAgICAgICAgY29sLmFjY2Vzc29yKSkgfX08L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICA8L3RkPlxuICAgICAgICB9XG4gICAgICAgIEBlbHNlIHtcbiAgICAgICAgPHRkPlxuICAgICAgICAgIEBpZiAoZWRpdGluZygpID09PSByb3dbJ2lkJ10gJiYgIWNvbC5yZWFkT25seSkge1xuICAgICAgICAgIEBpZiAoY29sLnR5cGUgPT09ICdlbnVtJykge1xuICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtXCIgW3ZhbHVlXT1cImVkaXRSb3coKT8uW2NvbC5hY2Nlc3Nvcl0gPz8gJydcIiAoY2hhbmdlKT1cIm9uRWRpdElucHV0KCRldmVudCwgY29sLmFjY2Vzc29yLCBjb2wpXCI+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+e3sgY29sLmxhYmVsIH19PC9vcHRpb24+XG4gICAgICAgICAgICBAZm9yIChvcHRpb24gb2YgZ2V0RW51bU9wdGlvbnMoY29sKTsgdHJhY2sgb3B0aW9uLnZhbHVlKSB7XG4gICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCJvcHRpb24udmFsdWVcIj57eyBvcHRpb24ubGFiZWwgfX08L29wdGlvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGVsc2Uge1xuICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc21cIiBbdHlwZV09XCJjb2wudHlwZSA9PT0gJ3Bhc3N3b3JkJyA/ICdwYXNzd29yZCcgOiAndGV4dCdcIiBbdmFsdWVdPVwiZWRpdFJvdygpPy5bY29sLmFjY2Vzc29yXSA/PyAnJ1wiIFtwbGFjZWhvbGRlcl09XCJjb2wubGFiZWxcIiAoaW5wdXQpPVwib25FZGl0SW5wdXQoJGV2ZW50LCBjb2wuYWNjZXNzb3IsIGNvbClcIiAvPlxuICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgQGVsc2Uge1xuICAgICAgICAgIEBpZiAoY29sLnR5cGUgPT09ICdwYXNzd29yZCcpIHtcbiAgICAgICAgICA8c3BhbiBbc3R5bGUuY29sb3JdPVwiZ2V0Q2VsbENvbG9yKGdldENlbGxWYWx1ZShyb3csIGNvbC5hY2Nlc3NvciksIGNvbClcIj4qKioqKio8L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBlbHNlIGlmIChjb2wudHlwZSA9PT0gJ2VudW0nKSB7XG4gICAgICAgICAgPHNwYW4gW3N0eWxlLmNvbG9yXT1cImdldENlbGxDb2xvcihnZXRDZWxsVmFsdWUocm93LCBjb2wuYWNjZXNzb3IpLCBjb2wpXCI+e3tcbiAgICAgICAgICAgIGdldEVudW1EaXNwbGF5VmFsdWUoZ2V0Q2VsbFZhbHVlKHJvdywgY29sLmFjY2Vzc29yKSwgY29sKVxuICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBlbHNlIGlmIChnZXRDZWxsVmFsdWUocm93LCBjb2wuYWNjZXNzb3IpID09PSB0cnVlKSB7XG4gICAgICAgICAgPGM4MC1pY29uIGljb249XCJjaGVja1wiIFtzaXplXT1cIi43XCI+PC9jODAtaWNvbj5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGVsc2UgaWYgKGdldENlbGxWYWx1ZShyb3csIGNvbC5hY2Nlc3NvcikgPT09IGZhbHNlKSB7XG4gICAgICAgICAgPGM4MC1pY29uIGljb249XCJjYW5jZWxcIiBbc2l6ZV09XCIuN1wiPjwvYzgwLWljb24+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBlbHNlIHtcbiAgICAgICAgICA8c3BhbiBbc3R5bGUuY29sb3JdPVwiZ2V0Q2VsbENvbG9yKGdldENlbGxWYWx1ZShyb3csIGNvbC5hY2Nlc3NvciksIGNvbClcIj57eyBnZXREaXNwbGF5VmFsdWUoZ2V0Q2VsbFZhbHVlKHJvdyxcbiAgICAgICAgICAgIGNvbC5hY2Nlc3NvcikpIH19PC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIEBpZiAoaGFzQ3JlYXRlQWN0aW9uTGlzdGVuZXIoKSB8fCBoYXNVcGRhdGVBY3Rpb25MaXN0ZW5lcigpIHx8IGhhc0RlbGV0ZUFjdGlvbkxpc3RlbmVyKCkgfHxcbiAgICAgICAgaGFzQ2FuY2VsQWN0aW9uTGlzdGVuZXIoKSB8fCBoYXNWaWV3QWN0aW9uTGlzdGVuZXIoKSB8fCBoYXNHZXRSb3dCdXR0b25MaXN0ZW5lcigpIHx8XG4gICAgICAgIGhhc01vdmVVcEFjdGlvbkxpc3RlbmVyKCkgfHwgaGFzTW92ZURvd25BY3Rpb25MaXN0ZW5lcigpKSB7XG4gICAgICAgIDx0ZCBjbGFzcz1cInRleHQtY2VudGVyIGFjdGlvbnMtY2VsbFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgQGlmIChlZGl0aW5nKCkgPT09IHJvd1snaWQnXSkge1xuICAgICAgICAgICAgPGM4MC1pY29uIGJ1dHRvbiBpY29uPVwiY2hlY2tcIiB0aXRsZT1cIkd1YXJkYXJcIiAoaWNvbkNsaWNrKT1cInNhdmVFZGl0KHJvdylcIiBbc2l6ZV09XCIuN1wiPjwvYzgwLWljb24+XG4gICAgICAgICAgICA8YzgwLWljb24gYnV0dG9uIGljb249XCJjYW5jZWxcIiBjb2xvcj1cIndhcm5cIiB0aXRsZT1cIkNhbmNlbGFyXCIgKGljb25DbGljayk9XCJjYW5jZWxFZGl0KClcIiBbc2l6ZV09XCIuN1wiPjwvYzgwLWljb24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAZWxzZSB7XG4gICAgICAgICAgICBAaWYgKGhhc1VwZGF0ZUFjdGlvbkxpc3RlbmVyKCkpIHtcbiAgICAgICAgICAgIDxjODAtaWNvbiBidXR0b24gaWNvbj1cImVkaXRcIiB0aXRsZT1cIkVkaXRhclwiIChpY29uQ2xpY2spPVwib25FZGl0KHJvdylcIiBbc2l6ZV09XCIuN1wiPjwvYzgwLWljb24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKGhhc0NhbmNlbEFjdGlvbkxpc3RlbmVyKCkpIHtcbiAgICAgICAgICAgIDxjODAtaWNvbiBidXR0b24gaWNvbj1cImNhbmNlbF9jaXJjbGVcIiBjb2xvcj1cInNlY29uZGFyeVwiIHRpdGxlPVwiQ2FuY2VsYXJcIiAoaWNvbkNsaWNrKT1cIm9uQ2FuY2VsKHJvdylcIiBbc2l6ZV09XCIuN1wiPjwvYzgwLWljb24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKGhhc1ZpZXdBY3Rpb25MaXN0ZW5lcigpKSB7XG4gICAgICAgICAgICA8YzgwLWljb24gYnV0dG9uIGljb249XCJ2aWV3XCIgY29sb3I9XCJwcmltYXJ5XCIgdGl0bGU9XCJWZXJcIiAoaWNvbkNsaWNrKT1cIm9uVmlldyhyb3cpXCIgW3NpemVdPVwiLjdcIj48L2M4MC1pY29uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmIChoYXNHZXRSb3dCdXR0b25MaXN0ZW5lcigpKSB7XG4gICAgICAgICAgICA8YzgwLWljb24gYnV0dG9uIGljb249XCJnZXRcIiBjb2xvcj1cInN1Y2Nlc3NcIiB0aXRsZT1cIlZpbmN1bGFyXCIgKGljb25DbGljayk9XCJvbkdldFJvd0J1dHRvbihyb3cpXCIgW3NpemVdPVwiLjdcIj48L2M4MC1pY29uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmIChoYXNNb3ZlVXBBY3Rpb25MaXN0ZW5lcigpKSB7XG4gICAgICAgICAgICA8YzgwLWljb24gYnV0dG9uIGljb249XCJhcnJvd191cFwiIGNvbG9yPVwic2Vjb25kYXJ5XCIgdGl0bGU9XCJNb3ZlciBhcnJpYmFcIiAoaWNvbkNsaWNrKT1cIm9uTW92ZVVwKHJvdylcIiBbc2l6ZV09XCIuN1wiPjwvYzgwLWljb24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKGhhc01vdmVEb3duQWN0aW9uTGlzdGVuZXIoKSkge1xuICAgICAgICAgICAgPGM4MC1pY29uIGJ1dHRvbiBpY29uPVwiYXJyb3dfZG93blwiIGNvbG9yPVwic2Vjb25kYXJ5XCIgdGl0bGU9XCJNb3ZlciBhYmFqb1wiIChpY29uQ2xpY2spPVwib25Nb3ZlRG93bihyb3cpXCIgW3NpemVdPVwiLjdcIj48L2M4MC1pY29uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmIChoYXNFbmFibGVBY3Rpb25MaXN0ZW5lcigpKSB7XG4gICAgICAgICAgICA8YzgwLWljb24gYnV0dG9uIFtpY29uXT1cImdldENlbGxWYWx1ZShyb3csICdlbmFibGVkJykgPyAndG9nZ2xlX29uJyA6ICd0b2dnbGVfb2ZmJ1wiIFtjb2xvcl09XCJnZXRDZWxsVmFsdWUocm93LCAnZW5hYmxlZCcpID8gJ3N1Y2Nlc3MnIDogJ3NlY29uZGFyeSdcIiBbdGl0bGVdPVwiZ2V0Q2VsbFZhbHVlKHJvdywgJ2VuYWJsZWQnKSA/ICdEZXNoYWJpbGl0YXInIDogJ0hhYmlsaXRhcidcIlxuICAgICAgICAgICAgICAoaWNvbkNsaWNrKT1cIm9uRW5hYmxlKHJvdylcIiBbc2l6ZV09XCIuN1wiPlxuICAgICAgICAgICAgPC9jODAtaWNvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAoaGFzRGVsZXRlQWN0aW9uTGlzdGVuZXIoKSkge1xuICAgICAgICAgICAgPGM4MC1pY29uIGJ1dHRvbiBpY29uPVwiZGVsZXRlXCIgY29sb3I9XCJ3YXJuXCIgdGl0bGU9XCJCb3JyYXJcIiAoaWNvbkNsaWNrKT1cIm9uRGVsZXRlKHJvdylcIiBbc2l6ZV09XCIuN1wiPjwvYzgwLWljb24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIH1cbiAgICAgIDwvdHI+XG4gICAgICB9XG4gICAgICBAaWYgKGNyZWF0aW5nKCkgJiYgaGFzQ3JlYXRlQWN0aW9uTGlzdGVuZXIoKSkge1xuICAgICAgPHRyPlxuICAgICAgICBAaWYgKGhhc1NlbGVjdGFibGVMaXN0ZW5lcigpICYmIGRhdGEoKS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1jZW50ZXIgc2VsZWN0aW9uLWNvbHVtblwiPlxuICAgICAgICAgIDwhLS0gRW1wdHkgY2VsbCBmb3IgYWxpZ25tZW50IC0tPlxuICAgICAgICA8L3RkPlxuICAgICAgICB9XG4gICAgICAgIEBmb3IgKGNvbCBvZiBjb2x1bW5zOyB0cmFjayBjb2wpIHtcbiAgICAgICAgQGlmIChjb2wudmlzaWJsZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgQGlmIChjb2wudHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIDx0ZCBjbGFzcz1cInRleHQtY2VudGVyXCI+XG4gICAgICAgICAgQGlmICghY29sLnJlYWRPbmx5KSB7XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtjaGVja2VkXT1cIiEhbmV3Um93KCk/Lltjb2wuYWNjZXNzb3JdXCIgKGNoYW5nZSk9XCJvbklucHV0KCRldmVudCwgY29sLmFjY2Vzc29yLCBjb2wpXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJjb2wubGFiZWxcIiAvPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAZWxzZSB7XG4gICAgICAgICAgPCEtLSBSZWFkT25seSBib29sZWFuIGNvbHVtbiBpbiBjcmVhdGUgbW9kZSBzaG93cyBlbXB0eSAtLT5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbXV0ZWRcIj4tPC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgPC90ZD5cbiAgICAgICAgfSBAZWxzZSBpZiAoY29sLnR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIDx0ZCBjbGFzcz1cInRleHQtY2VudGVyIG51bWJlci1jb2x1bW5cIj5cbiAgICAgICAgICBAaWYgKCFjb2wucmVhZE9ubHkpIHtcbiAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtXCIgdHlwZT1cIm51bWJlclwiIFt2YWx1ZV09XCJuZXdSb3coKT8uW2NvbC5hY2Nlc3Nvcl0gPz8gJydcIiBbcGxhY2Vob2xkZXJdPVwiY29sLmxhYmVsXCIgKGlucHV0KT1cIm9uSW5wdXQoJGV2ZW50LCBjb2wuYWNjZXNzb3IsIGNvbClcIiAvPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAZWxzZSB7XG4gICAgICAgICAgPCEtLSBSZWFkT25seSBudW1iZXIgY29sdW1uIGluIGNyZWF0ZSBtb2RlIHNob3dzIGVtcHR5IC0tPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1tdXRlZFwiPi08L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICA8L3RkPlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgPHRkPlxuICAgICAgICAgIEBpZiAoIWNvbC5yZWFkT25seSkge1xuICAgICAgICAgIEBpZiAoY29sLnR5cGUgPT09ICdlbnVtJykge1xuICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtXCIgW3ZhbHVlXT1cIm5ld1JvdygpPy5bY29sLmFjY2Vzc29yXSA/PyAnJ1wiIChjaGFuZ2UpPVwib25JbnB1dCgkZXZlbnQsIGNvbC5hY2Nlc3NvciwgY29sKVwiPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPnt7IGNvbC5sYWJlbCB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgQGZvciAob3B0aW9uIG9mIGdldEVudW1PcHRpb25zKGNvbCk7IHRyYWNrIG9wdGlvbi52YWx1ZSkge1xuICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwib3B0aW9uLnZhbHVlXCI+e3sgb3B0aW9uLmxhYmVsIH19PC9vcHRpb24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBlbHNlIHtcbiAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtXCIgdHlwZT1cInRleHRcIiBbdmFsdWVdPVwibmV3Um93KCk/Lltjb2wuYWNjZXNzb3JdID8/ICcnXCIgW3BsYWNlaG9sZGVyXT1cImNvbC5sYWJlbFwiIChpbnB1dCk9XCJvbklucHV0KCRldmVudCwgY29sLmFjY2Vzc29yLCBjb2wpXCIgLz5cbiAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIEBlbHNlIHtcbiAgICAgICAgICA8IS0tIFJlYWRPbmx5IGNvbHVtbiBpbiBjcmVhdGUgbW9kZSBzaG93cyBlbXB0eSAtLT5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbXV0ZWRcIj4tPC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgPC90ZD5cbiAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1jZW50ZXIgYWN0aW9ucy1jZWxsXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YzgwLWljb24gYnV0dG9uIGljb249XCJjaGVja1wiIHRpdGxlPVwiR3VhcmRhclwiIChpY29uQ2xpY2spPVwic2F2ZUNyZWF0ZSgpXCIgW3NpemVdPVwiLjdcIj48L2M4MC1pY29uPlxuICAgICAgICAgICAgPGM4MC1pY29uIGJ1dHRvbiBpY29uPVwiY2FuY2VsXCIgY29sb3I9XCJ3YXJuXCIgdGl0bGU9XCJDYW5jZWxhclwiIChpY29uQ2xpY2spPVwiY2FuY2VsQ3JlYXRlKClcIiBbc2l6ZV09XCIuN1wiPjwvYzgwLWljb24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L3RyPlxuICAgICAgfVxuICAgIDwvdGJvZHk+XG4gIDwvdGFibGU+XG4gIEBpZiAoZGF0YSgpLmxlbmd0aCA9PT0gMCkge1xuICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXIgdGV4dC1tdXRlZCBweS0zIHNtYWxsXCI+XG4gICAgTm8gaGF5IGRhdG9zIHBhcmEgbW9zdHJhci5cbiAgPC9kaXY+XG4gIH1cbjwvZGl2PlxuXG48YzgwLW1vZGFsPjwvYzgwLW1vZGFsPiJdfQ==
|