@posiwise/smart-crm 0.0.4 → 0.0.6
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.
- package/esm2022/lib/private/components/smart-crm-accounts/smart-crm-account-files/smart-crm-account-files.component.mjs +3 -3
- package/esm2022/lib/private/components/smart-crm-accounts/smart-crm-account-info/smart-crm-account-info.component.mjs +3 -3
- package/esm2022/lib/private/components/smart-crm-summary/smart-crm-summary-others/smart-crm-summary-others.component.mjs +3 -3
- package/fesm2022/posiwise-smart-crm.mjs +6 -6
- package/fesm2022/posiwise-smart-crm.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -139,10 +139,10 @@ export class SmartCrmSummaryOthersComponent extends AppBaseComponent {
|
|
|
139
139
|
super.ngOnDestroy();
|
|
140
140
|
}
|
|
141
141
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartCrmSummaryOthersComponent, deps: [{ token: i1.CrmService }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
142
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: SmartCrmSummaryOthersComponent, selector: "pw-smart-crm-summary-others", usesInheritance: true, ngImport: i0, template: "<div class=\"row\">\n <ng-container class=\"mt-5\"\n *rbacAllow=\"'Pages.Beta'\">\n <!-- Signed up last 30 days -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Signed up Last 30 Days</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!signUpLastThirtyDaysLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"signedUpLastThirtyDays?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"signedUpLastThirtyDays\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n [totalRecords]=\"signedUpLastThirtyDays.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Owner' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactName' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactEmail' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-signUp>\n <tr>\n <td data-head=\"Owner\">\n {{ signUp.owner?.first_name }} {{ signUp.owner?.last_name }}\n </td>\n <td data-head=\"Contact Name\">\n {{ signUp.contact_name }}\n </td>\n <td data-head=\"Contact Email\">\n {{ signUp.contact_email }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\">{{ 'Label.Total' | transloco }}: {{ signedUpLastThirtyDays.length }}</span>\n </div>\n <div *ngIf=\"signedUpLastThirtyDays?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n <!-- Active Opportunities -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Active Opportunities</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!activeOpportunitiesLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"activeOpportunities?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"activeOpportunities\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n\n [totalRecords]=\"activeOpportunities.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Title' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactName' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.Account' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.OneTimeAmount' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.WinChance' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.MonthlyAmount' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-opportunities>\n <tr>\n <td data-head=\"Title\">\n {{ opportunities.title }}\n </td>\n <td data-head=\"Contact Name\">\n {{ opportunities.crm_contact?.first_name }}\n {{ opportunities.crm_contact?.last_name }}\n </td>\n <td data-head=\"Account\">\n {{ opportunities.crm_account?.name }}\n </td>\n <td data-head=\"One Time Amount\">\n {{ opportunities.one_time_amount / 100 | currency }}\n </td>\n <td data-head=\"Monthly Amount\">\n {{ opportunities.monthly_amount / 100 | currency }}\n </td>\n <td data-head=\"Win Chance\">\n {{ opportunities.win_chances | percent }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\">{{ 'Label.Total' | transloco }}: {{ activeOpportunities.length }}</span>\n </div>\n <div *ngIf=\"activeOpportunities?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n <!-- Accounts at risk -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Accounts at Risk</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!accountAtRiskDetailsLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"accountAtRisk?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"accountAtRisk\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n\n [totalRecords]=\"accountAtRisk.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Owner' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactName' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.Organisation' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactEmail' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-account>\n <tr>\n <td data-head=\"Owner\">\n {{ account.owner?.first_name }} {{ account.owner?.last_name }}\n </td>\n <td data-head=\"Contact Name\">\n {{ account.contact_name }}\n </td>\n <td data-head=\"Organisation\">\n {{ account.name }}\n </td>\n <td data-head=\"Contact Email\">\n {{ account.contact_email }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\">{{ 'Label.Total' | transloco }}: {{ accountAtRisk.length }}</span>\n </div>\n <div *ngIf=\"accountAtRisk?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n <!-- Contract renewal -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Contract Renewal</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!contactRenewalLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"ContractRenewal?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"ContractRenewal\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n\n [totalRecords]=\"ContractRenewal.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Owner' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactName' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.Organisation' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactEmail' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-account>\n <tr>\n <td data-head=\"Owner\">\n {{ account.owner?.first_name }} {{ account.owner?.last_name }}\n </td>\n <td data-head=\"Contact Name\">\n {{ account.contact_name }}\n </td>\n <td data-head=\"Organisation\">\n {{ account.name }}\n </td>\n <td data-head=\"Contact Email\">\n {{ account.contact_email }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\">{{ 'Label.Total' | transloco }}: {{ ContractRenewal.length }}</span>\n </div>\n <div *ngIf=\"ContractRenewal?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n <!-- Credit Card Expiring -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Credit Card Expiring</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!creditCardExpiringDetailsLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"creditCardExpiring?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"creditCardExpiring\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n\n [totalRecords]=\"creditCardExpiring.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Owner' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactName' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.Organisation' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactEmail' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-account>\n <tr>\n <td data-head=\"Owner\">\n {{ account.owner?.first_name }} {{ account.owner?.last_name }}\n </td>\n <td data-head=\"Contact Name\">\n {{ account.contact_name }}\n </td>\n <td data-head=\"Organisation\">\n {{ account.name }}\n </td>\n <td data-head=\"Contact Email\">\n {{ account.contact_email }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\">{{ 'Label.Total' | transloco }}: {{ creditCardExpiring.length }}</span>\n </div>\n <div *ngIf=\"creditCardExpiring?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n <!-- Magic Moment -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Magic Moment</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!magicMomentLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"magicMoment?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"magicMoment\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n\n [totalRecords]=\"magicMoment.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Owner' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactName' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.Organisation' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactEmail' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-account>\n <tr>\n <td data-head=\"Owner\">\n {{ account.owner?.first_name }} {{ account.owner?.last_name }}\n </td>\n <td data-head=\"Contact Name\">\n {{ account.contact_name }}\n </td>\n <td data-head=\"Organisation\">\n {{ account.name }}\n </td>\n <td data-head=\"Contact Email\">\n {{ account.contact_email }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\">{{ 'Label.Total' | transloco }}: {{ magicMoment.length }}</span>\n </div>\n <div *ngIf=\"magicMoment?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n </ng-container>\n</div>\n", dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.RbacAllowDirective, selector: "[rbacAllow]", inputs: ["rbacAllow"] }, { kind: "directive", type: i4.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i5.ProgressSpinner, selector: "p-progressSpinner", inputs: ["styleClass", "style", "strokeWidth", "fill", "animationDuration", "ariaLabel"] }, { kind: "component", type: i6.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "component", type: i7.NoDataComponent, selector: "pw-no-data", inputs: ["message", "description", "withImage"] }, { kind: "pipe", type: i2.PercentPipe, name: "percent" }, { kind: "pipe", type: i2.CurrencyPipe, name: "currency" }, { kind: "pipe", type: i8.TranslocoPipe, name: "transloco" }] }); }
|
|
142
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: SmartCrmSummaryOthersComponent, selector: "pw-smart-crm-summary-others", usesInheritance: true, ngImport: i0, template: "<div class=\"row\">\n <ng-container class=\"mt-5\"\n *rbacAllow=\"'Pages.Beta'\">\n <!-- Signed up last 30 days -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Signed up Last 30 Days</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!signUpLastThirtyDaysLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"signedUpLastThirtyDays?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"signedUpLastThirtyDays\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n [totalRecords]=\"signedUpLastThirtyDays.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Owner' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactName' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactEmail' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-signUp>\n <tr>\n <td data-head=\"Owner\">\n {{ signUp.owner?.first_name }} {{ signUp.owner?.last_name }}\n </td>\n <td data-head=\"Contact Name\">\n {{ signUp.contact_name }}\n </td>\n <td data-head=\"Contact Email\">\n {{ signUp.contact_email }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\" *ngIf=\"signedUpLastThirtyDays.length!== 0\">{{ 'Label.Total' | transloco }}: {{ signedUpLastThirtyDays.length }}</span>\n </div>\n <div *ngIf=\"signedUpLastThirtyDays?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n <!-- Active Opportunities -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Active Opportunities</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!activeOpportunitiesLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"activeOpportunities?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"activeOpportunities\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n\n [totalRecords]=\"activeOpportunities.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Title' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactName' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.Account' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.OneTimeAmount' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.WinChance' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.MonthlyAmount' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-opportunities>\n <tr>\n <td data-head=\"Title\">\n {{ opportunities.title }}\n </td>\n <td data-head=\"Contact Name\">\n {{ opportunities.crm_contact?.first_name }}\n {{ opportunities.crm_contact?.last_name }}\n </td>\n <td data-head=\"Account\">\n {{ opportunities.crm_account?.name }}\n </td>\n <td data-head=\"One Time Amount\">\n {{ opportunities.one_time_amount / 100 | currency }}\n </td>\n <td data-head=\"Monthly Amount\">\n {{ opportunities.monthly_amount / 100 | currency }}\n </td>\n <td data-head=\"Win Chance\">\n {{ opportunities.win_chances | percent }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\" *ngIf=\"activeOpportunities.length !== 0\">{{ 'Label.Total' | transloco }}: {{ activeOpportunities.length }}</span>\n </div>\n <div *ngIf=\"activeOpportunities?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n <!-- Accounts at risk -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Accounts at Risk</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!accountAtRiskDetailsLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"accountAtRisk?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"accountAtRisk\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n\n [totalRecords]=\"accountAtRisk.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Owner' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactName' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.Organisation' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactEmail' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-account>\n <tr>\n <td data-head=\"Owner\">\n {{ account.owner?.first_name }} {{ account.owner?.last_name }}\n </td>\n <td data-head=\"Contact Name\">\n {{ account.contact_name }}\n </td>\n <td data-head=\"Organisation\">\n {{ account.name }}\n </td>\n <td data-head=\"Contact Email\">\n {{ account.contact_email }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\" *ngIf=\"accountAtRisk.length !== 0\">{{ 'Label.Total' | transloco }}: {{ accountAtRisk.length }}</span>\n </div>\n <div *ngIf=\"accountAtRisk?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n <!-- Contract renewal -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Contract Renewal</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!contactRenewalLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"ContractRenewal?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"ContractRenewal\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n\n [totalRecords]=\"ContractRenewal.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Owner' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactName' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.Organisation' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactEmail' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-account>\n <tr>\n <td data-head=\"Owner\">\n {{ account.owner?.first_name }} {{ account.owner?.last_name }}\n </td>\n <td data-head=\"Contact Name\">\n {{ account.contact_name }}\n </td>\n <td data-head=\"Organisation\">\n {{ account.name }}\n </td>\n <td data-head=\"Contact Email\">\n {{ account.contact_email }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\" *ngIf=\"ContractRenewal.length !== 0\">{{ 'Label.Total' | transloco }}: {{ ContractRenewal.length }}</span>\n </div>\n <div *ngIf=\"ContractRenewal?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n <!-- Credit Card Expiring -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Credit Card Expiring</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!creditCardExpiringDetailsLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"creditCardExpiring?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"creditCardExpiring\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n\n [totalRecords]=\"creditCardExpiring.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Owner' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactName' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.Organisation' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactEmail' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-account>\n <tr>\n <td data-head=\"Owner\">\n {{ account.owner?.first_name }} {{ account.owner?.last_name }}\n </td>\n <td data-head=\"Contact Name\">\n {{ account.contact_name }}\n </td>\n <td data-head=\"Organisation\">\n {{ account.name }}\n </td>\n <td data-head=\"Contact Email\">\n {{ account.contact_email }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\" *ngIf=\"creditCardExpiring.length !== 0\">{{ 'Label.Total' | transloco }}: {{ creditCardExpiring.length }}</span>\n </div>\n <div *ngIf=\"creditCardExpiring?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n <!-- Magic Moment -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Magic Moment</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!magicMomentLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"magicMoment?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"magicMoment\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n\n [totalRecords]=\"magicMoment.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Owner' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactName' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.Organisation' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactEmail' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-account>\n <tr>\n <td data-head=\"Owner\">\n {{ account.owner?.first_name }} {{ account.owner?.last_name }}\n </td>\n <td data-head=\"Contact Name\">\n {{ account.contact_name }}\n </td>\n <td data-head=\"Organisation\">\n {{ account.name }}\n </td>\n <td data-head=\"Contact Email\">\n {{ account.contact_email }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\" *ngIf=\"magicMoment.length !==0 \">{{ 'Label.Total' | transloco }}: {{ magicMoment.length }}</span>\n </div>\n <div *ngIf=\"magicMoment?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n </ng-container>\n</div>\n", dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.RbacAllowDirective, selector: "[rbacAllow]", inputs: ["rbacAllow"] }, { kind: "directive", type: i4.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i5.ProgressSpinner, selector: "p-progressSpinner", inputs: ["styleClass", "style", "strokeWidth", "fill", "animationDuration", "ariaLabel"] }, { kind: "component", type: i6.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "component", type: i7.NoDataComponent, selector: "pw-no-data", inputs: ["message", "description", "withImage"] }, { kind: "pipe", type: i2.PercentPipe, name: "percent" }, { kind: "pipe", type: i2.CurrencyPipe, name: "currency" }, { kind: "pipe", type: i8.TranslocoPipe, name: "transloco" }] }); }
|
|
143
143
|
}
|
|
144
144
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartCrmSummaryOthersComponent, decorators: [{
|
|
145
145
|
type: Component,
|
|
146
|
-
args: [{ selector: 'pw-smart-crm-summary-others', template: "<div class=\"row\">\n <ng-container class=\"mt-5\"\n *rbacAllow=\"'Pages.Beta'\">\n <!-- Signed up last 30 days -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Signed up Last 30 Days</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!signUpLastThirtyDaysLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"signedUpLastThirtyDays?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"signedUpLastThirtyDays\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n [totalRecords]=\"signedUpLastThirtyDays.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Owner' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactName' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactEmail' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-signUp>\n <tr>\n <td data-head=\"Owner\">\n {{ signUp.owner?.first_name }} {{ signUp.owner?.last_name }}\n </td>\n <td data-head=\"Contact Name\">\n {{ signUp.contact_name }}\n </td>\n <td data-head=\"Contact Email\">\n {{ signUp.contact_email }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\">{{ 'Label.Total' | transloco }}: {{ signedUpLastThirtyDays.length }}</span>\n </div>\n <div *ngIf=\"signedUpLastThirtyDays?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n <!-- Active Opportunities -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Active Opportunities</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!activeOpportunitiesLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"activeOpportunities?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"activeOpportunities\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n\n [totalRecords]=\"activeOpportunities.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Title' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactName' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.Account' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.OneTimeAmount' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.WinChance' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.MonthlyAmount' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-opportunities>\n <tr>\n <td data-head=\"Title\">\n {{ opportunities.title }}\n </td>\n <td data-head=\"Contact Name\">\n {{ opportunities.crm_contact?.first_name }}\n {{ opportunities.crm_contact?.last_name }}\n </td>\n <td data-head=\"Account\">\n {{ opportunities.crm_account?.name }}\n </td>\n <td data-head=\"One Time Amount\">\n {{ opportunities.one_time_amount / 100 | currency }}\n </td>\n <td data-head=\"Monthly Amount\">\n {{ opportunities.monthly_amount / 100 | currency }}\n </td>\n <td data-head=\"Win Chance\">\n {{ opportunities.win_chances | percent }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\">{{ 'Label.Total' | transloco }}: {{ activeOpportunities.length }}</span>\n </div>\n <div *ngIf=\"activeOpportunities?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n <!-- Accounts at risk -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Accounts at Risk</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!accountAtRiskDetailsLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"accountAtRisk?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"accountAtRisk\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n\n [totalRecords]=\"accountAtRisk.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Owner' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactName' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.Organisation' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactEmail' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-account>\n <tr>\n <td data-head=\"Owner\">\n {{ account.owner?.first_name }} {{ account.owner?.last_name }}\n </td>\n <td data-head=\"Contact Name\">\n {{ account.contact_name }}\n </td>\n <td data-head=\"Organisation\">\n {{ account.name }}\n </td>\n <td data-head=\"Contact Email\">\n {{ account.contact_email }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\">{{ 'Label.Total' | transloco }}: {{ accountAtRisk.length }}</span>\n </div>\n <div *ngIf=\"accountAtRisk?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n <!-- Contract renewal -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Contract Renewal</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!contactRenewalLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"ContractRenewal?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"ContractRenewal\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n\n [totalRecords]=\"ContractRenewal.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Owner' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactName' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.Organisation' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactEmail' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-account>\n <tr>\n <td data-head=\"Owner\">\n {{ account.owner?.first_name }} {{ account.owner?.last_name }}\n </td>\n <td data-head=\"Contact Name\">\n {{ account.contact_name }}\n </td>\n <td data-head=\"Organisation\">\n {{ account.name }}\n </td>\n <td data-head=\"Contact Email\">\n {{ account.contact_email }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\">{{ 'Label.Total' | transloco }}: {{ ContractRenewal.length }}</span>\n </div>\n <div *ngIf=\"ContractRenewal?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n <!-- Credit Card Expiring -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Credit Card Expiring</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!creditCardExpiringDetailsLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"creditCardExpiring?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"creditCardExpiring\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n\n [totalRecords]=\"creditCardExpiring.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Owner' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactName' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.Organisation' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactEmail' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-account>\n <tr>\n <td data-head=\"Owner\">\n {{ account.owner?.first_name }} {{ account.owner?.last_name }}\n </td>\n <td data-head=\"Contact Name\">\n {{ account.contact_name }}\n </td>\n <td data-head=\"Organisation\">\n {{ account.name }}\n </td>\n <td data-head=\"Contact Email\">\n {{ account.contact_email }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\">{{ 'Label.Total' | transloco }}: {{ creditCardExpiring.length }}</span>\n </div>\n <div *ngIf=\"creditCardExpiring?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n <!-- Magic Moment -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Magic Moment</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!magicMomentLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"magicMoment?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"magicMoment\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n\n [totalRecords]=\"magicMoment.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Owner' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactName' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.Organisation' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactEmail' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-account>\n <tr>\n <td data-head=\"Owner\">\n {{ account.owner?.first_name }} {{ account.owner?.last_name }}\n </td>\n <td data-head=\"Contact Name\">\n {{ account.contact_name }}\n </td>\n <td data-head=\"Organisation\">\n {{ account.name }}\n </td>\n <td data-head=\"Contact Email\">\n {{ account.contact_email }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\">{{ 'Label.Total' | transloco }}: {{ magicMoment.length }}</span>\n </div>\n <div *ngIf=\"magicMoment?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n </ng-container>\n</div>\n" }]
|
|
146
|
+
args: [{ selector: 'pw-smart-crm-summary-others', template: "<div class=\"row\">\n <ng-container class=\"mt-5\"\n *rbacAllow=\"'Pages.Beta'\">\n <!-- Signed up last 30 days -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Signed up Last 30 Days</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!signUpLastThirtyDaysLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"signedUpLastThirtyDays?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"signedUpLastThirtyDays\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n [totalRecords]=\"signedUpLastThirtyDays.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Owner' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactName' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactEmail' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-signUp>\n <tr>\n <td data-head=\"Owner\">\n {{ signUp.owner?.first_name }} {{ signUp.owner?.last_name }}\n </td>\n <td data-head=\"Contact Name\">\n {{ signUp.contact_name }}\n </td>\n <td data-head=\"Contact Email\">\n {{ signUp.contact_email }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\" *ngIf=\"signedUpLastThirtyDays.length!== 0\">{{ 'Label.Total' | transloco }}: {{ signedUpLastThirtyDays.length }}</span>\n </div>\n <div *ngIf=\"signedUpLastThirtyDays?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n <!-- Active Opportunities -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Active Opportunities</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!activeOpportunitiesLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"activeOpportunities?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"activeOpportunities\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n\n [totalRecords]=\"activeOpportunities.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Title' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactName' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.Account' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.OneTimeAmount' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.WinChance' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.MonthlyAmount' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-opportunities>\n <tr>\n <td data-head=\"Title\">\n {{ opportunities.title }}\n </td>\n <td data-head=\"Contact Name\">\n {{ opportunities.crm_contact?.first_name }}\n {{ opportunities.crm_contact?.last_name }}\n </td>\n <td data-head=\"Account\">\n {{ opportunities.crm_account?.name }}\n </td>\n <td data-head=\"One Time Amount\">\n {{ opportunities.one_time_amount / 100 | currency }}\n </td>\n <td data-head=\"Monthly Amount\">\n {{ opportunities.monthly_amount / 100 | currency }}\n </td>\n <td data-head=\"Win Chance\">\n {{ opportunities.win_chances | percent }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\" *ngIf=\"activeOpportunities.length !== 0\">{{ 'Label.Total' | transloco }}: {{ activeOpportunities.length }}</span>\n </div>\n <div *ngIf=\"activeOpportunities?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n <!-- Accounts at risk -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Accounts at Risk</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!accountAtRiskDetailsLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"accountAtRisk?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"accountAtRisk\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n\n [totalRecords]=\"accountAtRisk.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Owner' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactName' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.Organisation' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactEmail' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-account>\n <tr>\n <td data-head=\"Owner\">\n {{ account.owner?.first_name }} {{ account.owner?.last_name }}\n </td>\n <td data-head=\"Contact Name\">\n {{ account.contact_name }}\n </td>\n <td data-head=\"Organisation\">\n {{ account.name }}\n </td>\n <td data-head=\"Contact Email\">\n {{ account.contact_email }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\" *ngIf=\"accountAtRisk.length !== 0\">{{ 'Label.Total' | transloco }}: {{ accountAtRisk.length }}</span>\n </div>\n <div *ngIf=\"accountAtRisk?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n <!-- Contract renewal -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Contract Renewal</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!contactRenewalLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"ContractRenewal?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"ContractRenewal\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n\n [totalRecords]=\"ContractRenewal.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Owner' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactName' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.Organisation' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactEmail' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-account>\n <tr>\n <td data-head=\"Owner\">\n {{ account.owner?.first_name }} {{ account.owner?.last_name }}\n </td>\n <td data-head=\"Contact Name\">\n {{ account.contact_name }}\n </td>\n <td data-head=\"Organisation\">\n {{ account.name }}\n </td>\n <td data-head=\"Contact Email\">\n {{ account.contact_email }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\" *ngIf=\"ContractRenewal.length !== 0\">{{ 'Label.Total' | transloco }}: {{ ContractRenewal.length }}</span>\n </div>\n <div *ngIf=\"ContractRenewal?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n <!-- Credit Card Expiring -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Credit Card Expiring</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!creditCardExpiringDetailsLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"creditCardExpiring?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"creditCardExpiring\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n\n [totalRecords]=\"creditCardExpiring.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Owner' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactName' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.Organisation' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactEmail' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-account>\n <tr>\n <td data-head=\"Owner\">\n {{ account.owner?.first_name }} {{ account.owner?.last_name }}\n </td>\n <td data-head=\"Contact Name\">\n {{ account.contact_name }}\n </td>\n <td data-head=\"Organisation\">\n {{ account.name }}\n </td>\n <td data-head=\"Contact Email\">\n {{ account.contact_email }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\" *ngIf=\"creditCardExpiring.length !== 0\">{{ 'Label.Total' | transloco }}: {{ creditCardExpiring.length }}</span>\n </div>\n <div *ngIf=\"creditCardExpiring?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n <!-- Magic Moment -->\n <div class=\"col-12 col-md-6 mb-3 analytics\">\n <h5 class=\"accordion-heading\">Magic Moment</h5>\n <div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!magicMomentLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n </ng-template>\n </div>\n <div class=\"primeng-datatable-container table-responsive\"\n *ngIf=\"magicMoment?.length\">\n <p-table class=\"table\"\n #dt\n [value]=\"magicMoment\"\n [paginator]=\"true\"\n [rows]=\"PAGE_SIZE\"\n\n [totalRecords]=\"magicMoment.length\"\n [lazy]=\"true\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\">{{ 'Crm.Summary.Owner' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactName' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.Organisation' | transloco }}</th>\n <th scope=\"true\">{{ 'Crm.Summary.ContactEmail' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-account>\n <tr>\n <td data-head=\"Owner\">\n {{ account.owner?.first_name }} {{ account.owner?.last_name }}\n </td>\n <td data-head=\"Contact Name\">\n {{ account.contact_name }}\n </td>\n <td data-head=\"Organisation\">\n {{ account.name }}\n </td>\n <td data-head=\"Contact Email\">\n {{ account.contact_email }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n <span class=\"total-records-count\" *ngIf=\"magicMoment.length !==0 \">{{ 'Label.Total' | transloco }}: {{ magicMoment.length }}</span>\n </div>\n <div *ngIf=\"magicMoment?.length === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Crm.Summary.NoInsightMessage' | transloco\"> </pw-no-data>\n </div>\n </div>\n </ng-container>\n</div>\n" }]
|
|
147
147
|
}], ctorParameters: () => [{ type: i1.CrmService }, { type: i0.Injector }] });
|
|
148
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtY3JtLXN1bW1hcnktb3RoZXJzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc21hcnQtY3JtL3NyYy9saWIvcHJpdmF0ZS9jb21wb25lbnRzL3NtYXJ0LWNybS1zdW1tYXJ5L3NtYXJ0LWNybS1zdW1tYXJ5LW90aGVycy9zbWFydC1jcm0tc3VtbWFyeS1vdGhlcnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zbWFydC1jcm0vc3JjL2xpYi9wcml2YXRlL2NvbXBvbmVudHMvc21hcnQtY3JtLXN1bW1hcnkvc21hcnQtY3JtLXN1bW1hcnktb3RoZXJzL3NtYXJ0LWNybS1zdW1tYXJ5LW90aGVycy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDdkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXhELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7Ozs7Ozs7O0FBTWhFLE1BQU0sT0FBTyw4QkFBK0IsU0FBUSxnQkFBZ0I7SUE2QmhFLFlBQ1ksVUFBc0IsRUFDOUIsUUFBa0I7UUFFbEIsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBSFIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQWZsQywrQkFBMEIsR0FBRyxLQUFLLENBQUM7UUFFbkMsOEJBQXlCLEdBQUcsS0FBSyxDQUFDO1FBRWxDLCtCQUEwQixHQUFHLEtBQUssQ0FBQztRQUVuQyx5QkFBb0IsR0FBRyxLQUFLLENBQUM7UUFFN0Isb0NBQStCLEdBQUcsS0FBSyxDQUFDO1FBRXhDLHNCQUFpQixHQUFHLEtBQUssQ0FBQztJQVMxQixDQUFDO0lBRUQsUUFBUTtRQUNKLElBQUksQ0FBQyxtQkFBbUIsRUFB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Q0FBQyxDQUFDO2FBQ0QsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNOLElBQUksQ0FBQywrQkFBK0IsR0FBRyxJQUFJLENBQUM7UUFDaEQsQ0FBQyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBQ0Qsb0NBQW9DO0lBQzVCLGNBQWM7UUFDbEIsSUFBSSxDQUFDLFVBQVU7YUFDVixlQUFlLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLEVBQUUsY0FBYyxDQUFDO2FBQ3RELFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNsQixJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDckUsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7WUFDMUIsQ0FBQzs7Z0JBQU0sSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUM7UUFDdkMsQ0FBQyxDQUFDO2FBQ0QsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNOLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRVEsV0FBVztRQUNoQixLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDeEIsQ0FBQzsrR0F0SlEsOEJBQThCO21HQUE5Qiw4QkFBOEIsMEZDVDNDLDZzWkFxVEE7OzRGRDVTYSw4QkFBOEI7a0JBSjFDLFNBQVM7K0JBQ0ksNkJBQTZCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbmplY3RvciwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENybVNlcnZpY2UgfSBmcm9tICdAcG9zaXdpc2Uvc21hcnQtY3JtLXNoYXJlZCc7XG5cbmltcG9ydCB7IEFwcEJhc2VDb21wb25lbnQgfSBmcm9tICdAcG9zaXdpc2UvYXBwLWJhc2UtY29tcG9uZW50JztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgVXNlcixhY3RpdmVPcHBvcnR1bml0aWVzLHNpZ25lZFVwTGFzdFRoaXJ0eURheXN9IGZyb20gJ0Bwb3Npd2lzZS9jb21tb24tdXRpbGl0aWVzJztcbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAncHctc21hcnQtY3JtLXN1bW1hcnktb3RoZXJzJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc21hcnQtY3JtLXN1bW1hcnktb3RoZXJzLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBTbWFydENybVN1bW1hcnlPdGhlcnNDb21wb25lbnQgZXh0ZW5kcyBBcHBCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAgIHNpZ25lZFVwTGFzdFRoaXJ0eURheXM6c2lnbmVkVXBMYXN0VGhpcnR5RGF5c1tdO1xuXG4gICAgYWN0aXZlT3Bwb3J0dW5pdGllczphY3RpdmVPcHBvcnR1bml0aWVzW107XG5cbiAgICBhY2NvdW50QXRSaXNrOltdO1xuXG4gICAgQ29udHJhY3RSZW5ld2FsOltdO1xuXG4gICAgY3JlZGl0Q2FyZEV4cGlyaW5nOltdO1xuXG4gICAgbWFnaWNNb21lbnQ6W107XG5cbiAgICB1c2VyOiBVc2VyO1xuXG4gICAgc2lnblVwTGFzdFRoaXJ0eURheXNMb2FkZWQgPSBmYWxzZTtcblxuICAgIGFjdGl2ZU9wcG9ydHVuaXRpZXNMb2FkZWQgPSBmYWxzZTtcblxuICAgIGFjY291bnRBdFJpc2tEZXRhaWxzTG9hZGVkID0gZmFsc2U7XG5cbiAgICBjb250YWN0UmVuZXdhbExvYWRlZCA9IGZhbHNlO1xuXG4gICAgY3JlZGl0Q2FyZEV4cGlyaW5nRGV0YWlsc0xvYWRlZCA9IGZhbHNlO1xuXG4gICAgbWFnaWNNb21lbnRMb2FkZWQgPSBmYWxzZTtcblxuICAgIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgY3JtU2VydmljZTogQ3JtU2VydmljZSxcbiAgICAgICAgaW5qZWN0b3I6IEluamVjdG9yXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGluamVjdG9yKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5nZXRVc2VyU3Vic2NyaXB0aW9uKCkuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gcmVzcG9uc2U7XG4gICAgICAgICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24/LmlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRVc2VySW5mbygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFVzZXJJbmZvKCkge1xuICAgICAgICB0aGlzLnVzZXJTdG9yZSgpLnN1YnNjcmliZSh1c2VyID0+IHtcbiAgICAgICAgICAgIGlmICh1c2VyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51c2VyID0gdXNlcjtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGVybWlzc2lvblNlcnZpY2UuaXNHcmFudGVkKCdQYWdlcy5CZXRhJykgfHxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wZXJtaXNzaW9uU2VydmljZS5pc1N1cGVyQWRtaW4oKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFNpZ25lZFVwTGFzdFRoaXJ0eURheXMoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRBY3RpdmVPcHBvcnR1bml0aWVzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0QWNjb3VudEF0Umlza0RldGFpbHMoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRDb250YWN0UmVuZXdhbCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldENyZWRpdENhcmRFeHBpcmluZ0RldGFpbHMoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRNYWdpY01vbWVudCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEZ1bmN0aW9uIHRvIGNhbGwgc2lnbmVkIHVwIGxhc3QgMzAgZGF5cyBkZXRhaWxzICovXG4gICAgcHJpdmF0ZSBnZXRTaWduZWRVcExhc3RUaGlydHlEYXlzKCkge1xuICAgICAgICB0aGlzLmNybVNlcnZpY2VcbiAgICAgICAgICAgIC5nZXRDcm1BbmFseXRpY3ModGhpcy5zdWJzY3JpcHRpb24/LmlkLCAnYWNjb3VudHNfc2lnbmVkX3VwX2xhc3RfMzBfZGF5cycpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc3BvbnNlID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyhyZXNwb25zZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2lnbmVkVXBMYXN0VGhpcnR5RGF5cyA9IFtdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB0aGlzLnNpZ25lZFVwTGFzdFRoaXJ0eURheXMgPSByZXNwb25zZTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuYWRkKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNpZ25VcExhc3RUaGlydHlEYXlzTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBGdW5jdGlvbiB0byBjYWxsIEFjdGl2ZSBPcHBvcnR1bml0aWVzIGRldGFpbHMgKi9cbiAgICBwcml2YXRlIGdldEFjdGl2ZU9wcG9ydHVuaXRpZXMoKSB7XG4gICAgICAgIHRoaXMuY3JtU2VydmljZVxuICAgICAgICAgICAgLmdldENybUFuYWx5dGljcyh0aGlzLnN1YnNjcmlwdGlvbj8uaWQsICdhY2NvdW50c19hY3RpdmVfb3Bwb3J0dW5pdGllcycpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc3BvbnNlID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyhyZXNwb25zZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlT3Bwb3J0dW5pdGllcyA9IFtdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB0aGlzLmFjdGl2ZU9wcG9ydHVuaXRpZXMgPSByZXNwb25zZTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuYWRkKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZU9wcG9ydHVuaXRpZXNMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEZ1bmN0aW9uIHRvIGNhbGwgQWNjb3VudCBBdCBSaXNrIGRldGFpbHMgKi9cbiAgICBwcml2YXRlIGdldEFjY291bnRBdFJpc2tEZXRhaWxzKCkge1xuICAgICAgICB0aGlzLmNybVNlcnZpY2VcbiAgICAgICAgICAgIC5nZXRDcm1BbmFseXRpY3ModGhpcy5zdWJzY3JpcHRpb24/LmlkLCAnYWNjb3VudHNfYWNjb3VudHNfYXRfcmlzaycpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc3BvbnNlID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyhyZXNwb25zZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWNjb3VudEF0UmlzayA9IFtdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB0aGlzLmFjY291bnRBdFJpc2sgPSByZXNwb25zZTtcblxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5hZGQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYWNjb3VudEF0Umlza0RldGFpbHNMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEZ1bmN0aW9uIHRvIGNhbGwgQ29udHJhY3QgcmVuZXdhbCBkZXRhaWxzICovXG4gICAgcHJpdmF0ZSBnZXRDb250YWN0UmVuZXdhbCgpIHtcbiAgICAgICAgdGhpcy5jcm1TZXJ2aWNlXG4gICAgICAgICAgICAuZ2V0Q3JtQW5hbHl0aWNzKHRoaXMuc3Vic2NyaXB0aW9uPy5pZCwgJ2FjY291bnRzX2NvbnRyYWN0X3JlbmV3YWwnKVxuICAgICAgICAgICAgLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXNwb25zZSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMocmVzcG9uc2UpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkNvbnRyYWN0UmVuZXdhbCA9IFtdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB0aGlzLkNvbnRyYWN0UmVuZXdhbCA9IHJlc3BvbnNlO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5hZGQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGFjdFJlbmV3YWxMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEZ1bmN0aW9uIHRvIGNhbGwgQ3JlZGl0IENhcmQgRXhwaXJpbmcgZGV0YWlscyAqL1xuICAgIHByaXZhdGUgZ2V0Q3JlZGl0Q2FyZEV4cGlyaW5nRGV0YWlscygpIHtcbiAgICAgICAgdGhpcy5jcm1TZXJ2aWNlXG4gICAgICAgICAgICAuZ2V0Q3JtQW5hbHl0aWNzKHRoaXMuc3Vic2NyaXB0aW9uPy5pZCwgJ2NyZWRpdF9jYXJkX2V4cGlyaW5nJylcbiAgICAgICAgICAgIC5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzcG9uc2UgPT09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKHJlc3BvbnNlKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVkaXRDYXJkRXhwaXJpbmcgPSBbXTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgdGhpcy5jcmVkaXRDYXJkRXhwaXJpbmcgPSByZXNwb25zZTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuYWRkKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWRpdENhcmRFeHBpcmluZ0RldGFpbHNMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKiBGdW5jdGlvbiB0byBjYWxsIG1hZ2ljIG1vbWVudCAqL1xuICAgIHByaXZhdGUgZ2V0TWFnaWNNb21lbnQoKSB7XG4gICAgICAgIHRoaXMuY3JtU2VydmljZVxuICAgICAgICAgICAgLmdldENybUFuYWx5dGljcyh0aGlzLnN1YnNjcmlwdGlvbj8uaWQsICdtYWdpY19tb21lbnQnKVxuICAgICAgICAgICAgLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXNwb25zZSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMocmVzcG9uc2UpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hZ2ljTW9tZW50ID0gW107XG4gICAgICAgICAgICAgICAgfSBlbHNlIHRoaXMubWFnaWNNb21lbnQgPSByZXNwb25zZTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuYWRkKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm1hZ2ljTW9tZW50TG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIG92ZXJyaWRlIG5nT25EZXN0cm95KCkge1xuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgPG5nLWNvbnRhaW5lciBjbGFzcz1cIm10LTVcIlxuICAgICpyYmFjQWxsb3c9XCInUGFnZXMuQmV0YSdcIj5cbiAgICA8IS0tIFNpZ25lZCB1cCBsYXN0IDMwIGRheXMgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtNiBtYi0zIGFuYWx5dGljc1wiPlxuICAgICAgPGg1IGNsYXNzPVwiYWNjb3JkaW9uLWhlYWRpbmdcIj5TaWduZWQgdXAgTGFzdCAzMCBEYXlzPC9oNT5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3LTEwMCB0ZXh0LWNlbnRlciBtdC0zXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCIhc2lnblVwTGFzdFRoaXJ0eURheXNMb2FkZWRcIj5cbiAgICAgICAgICA8cC1wcm9ncmVzc1NwaW5uZXIgc3Ryb2tlV2lkdGg9XCIyXCI+IDwvcC1wcm9ncmVzc1NwaW5uZXI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwcmltZW5nLWRhdGF0YWJsZS1jb250YWluZXIgdGFibGUtcmVzcG9uc2l2ZVwiXG4gICAgICAgICpuZ0lmPVwic2lnbmVkVXBMYXN0VGhpcnR5RGF5cz8ubGVuZ3RoXCI+XG4gICAgICAgIDxwLXRhYmxlIGNsYXNzPVwidGFibGVcIlxuICAgICAgICAgICNkdFxuICAgICAgICAgIFt2YWx1ZV09XCJzaWduZWRVcExhc3RUaGlydHlEYXlzXCJcbiAgICAgICAgICBbcGFnaW5hdG9yXT1cInRydWVcIlxuICAgICAgICAgIFtyb3dzXT1cIlBBR0VfU0laRVwiXG4gICAgICAgICAgW3RvdGFsUmVjb3Jkc109XCJzaWduZWRVcExhc3RUaGlydHlEYXlzLmxlbmd0aFwiXG4gICAgICAgICAgW2xhenldPVwidHJ1ZVwiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cbiAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiPnt7ICdDcm0uU3VtbWFyeS5Pd25lcicgfCB0cmFuc2xvY28gfX08L3RoPlxuICAgICAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCI+e3sgJ0NybS5TdW1tYXJ5LkNvbnRhY3ROYW1lJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQ3JtLlN1bW1hcnkuQ29udGFjdEVtYWlsJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIlxuICAgICAgICAgICAgbGV0LXNpZ25VcD5cbiAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgPHRkIGRhdGEtaGVhZD1cIk93bmVyXCI+XG4gICAgICAgICAgICAgICAge3sgc2lnblVwLm93bmVyPy5maXJzdF9uYW1lIH19IHt7IHNpZ25VcC5vd25lcj8ubGFzdF9uYW1lIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJDb250YWN0IE5hbWVcIj5cbiAgICAgICAgICAgICAgICB7eyBzaWduVXAuY29udGFjdF9uYW1lIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJDb250YWN0IEVtYWlsXCI+XG4gICAgICAgICAgICAgICAge3sgc2lnblVwLmNvbnRhY3RfZW1haWwgfX1cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9wLXRhYmxlPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInRvdGFsLXJlY29yZHMtY291bnRcIj57eyAnTGFiZWwuVG90YWwnIHwgdHJhbnNsb2NvIH19OiB7eyBzaWduZWRVcExhc3RUaGlydHlEYXlzLmxlbmd0aCB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cInNpZ25lZFVwTGFzdFRoaXJ0eURheXM/Lmxlbmd0aCA9PT0gMFwiPlxuICAgICAgICA8cHctbm8tZGF0YSBbd2l0aEltYWdlXT1cInRydWVcIiBbbWVzc2FnZV09XCInQ3JtLlN1bW1hcnkuTm9JbnNpZ2h0TWVzc2FnZScgfCB0cmFuc2xvY29cIj4gPC9wdy1uby1kYXRhPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPCEtLSBBY3RpdmUgT3Bwb3J0dW5pdGllcyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1tZC02IG1iLTMgYW5hbHl0aWNzXCI+XG4gICAgICA8aDUgY2xhc3M9XCJhY2NvcmRpb24taGVhZGluZ1wiPkFjdGl2ZSBPcHBvcnR1bml0aWVzPC9oNT5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3LTEwMCB0ZXh0LWNlbnRlciBtdC0zXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCIhYWN0aXZlT3Bwb3J0dW5pdGllc0xvYWRlZFwiPlxuICAgICAgICAgIDxwLXByb2dyZXNzU3Bpbm5lciBzdHJva2VXaWR0aD1cIjJcIj4gPC9wLXByb2dyZXNzU3Bpbm5lcj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInByaW1lbmctZGF0YXRhYmxlLWNvbnRhaW5lciB0YWJsZS1yZXNwb25zaXZlXCJcbiAgICAgICAgKm5nSWY9XCJhY3RpdmVPcHBvcnR1bml0aWVzPy5sZW5ndGhcIj5cbiAgICAgICAgPHAtdGFibGUgY2xhc3M9XCJ0YWJsZVwiXG4gICAgICAgICAgI2R0XG4gICAgICAgICAgW3ZhbHVlXT1cImFjdGl2ZU9wcG9ydHVuaXRpZXNcIlxuICAgICAgICAgIFtwYWdpbmF0b3JdPVwidHJ1ZVwiXG4gICAgICAgICAgW3Jvd3NdPVwiUEFHRV9TSVpFXCJcblxuICAgICAgICAgIFt0b3RhbFJlY29yZHNdPVwiYWN0aXZlT3Bwb3J0dW5pdGllcy5sZW5ndGhcIlxuICAgICAgICAgIFtsYXp5XT1cInRydWVcIj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQ3JtLlN1bW1hcnkuVGl0bGUnIHwgdHJhbnNsb2NvIH19PC90aD5cbiAgICAgICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiPnt7ICdDcm0uU3VtbWFyeS5Db250YWN0TmFtZScgfCB0cmFuc2xvY28gfX08L3RoPlxuICAgICAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCI+e3sgJ0NybS5TdW1tYXJ5LkFjY291bnQnIHwgdHJhbnNsb2NvIH19PC90aD5cbiAgICAgICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiPnt7ICdDcm0uU3VtbWFyeS5PbmVUaW1lQW1vdW50JyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQ3JtLlN1bW1hcnkuV2luQ2hhbmNlJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQ3JtLlN1bW1hcnkuTW9udGhseUFtb3VudCcgfCB0cmFuc2xvY28gfX08L3RoPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCJcbiAgICAgICAgICAgIGxldC1vcHBvcnR1bml0aWVzPlxuICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiVGl0bGVcIj5cbiAgICAgICAgICAgICAgICB7eyBvcHBvcnR1bml0aWVzLnRpdGxlIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJDb250YWN0IE5hbWVcIj5cbiAgICAgICAgICAgICAgICB7eyBvcHBvcnR1bml0aWVzLmNybV9jb250YWN0Py5maXJzdF9uYW1lIH19XG4gICAgICAgICAgICAgICAge3sgb3Bwb3J0dW5pdGllcy5jcm1fY29udGFjdD8ubGFzdF9uYW1lIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJBY2NvdW50XCI+XG4gICAgICAgICAgICAgICAge3sgb3Bwb3J0dW5pdGllcy5jcm1fYWNjb3VudD8ubmFtZSB9fVxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiT25lIFRpbWUgQW1vdW50XCI+XG4gICAgICAgICAgICAgICAge3sgb3Bwb3J0dW5pdGllcy5vbmVfdGltZV9hbW91bnQgLyAxMDAgfCBjdXJyZW5jeSB9fVxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiTW9udGhseSBBbW91bnRcIj5cbiAgICAgICAgICAgICAgICB7eyBvcHBvcnR1bml0aWVzLm1vbnRobHlfYW1vdW50IC8gMTAwIHwgY3VycmVuY3kgfX1cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgPHRkIGRhdGEtaGVhZD1cIldpbiBDaGFuY2VcIj5cbiAgICAgICAgICAgICAgICB7eyBvcHBvcnR1bml0aWVzLndpbl9jaGFuY2VzIHwgcGVyY2VudCB9fVxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L3AtdGFibGU+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidG90YWwtcmVjb3Jkcy1jb3VudFwiPnt7ICdMYWJlbC5Ub3RhbCcgfCB0cmFuc2xvY28gfX06IHt7IGFjdGl2ZU9wcG9ydHVuaXRpZXMubGVuZ3RoIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwiYWN0aXZlT3Bwb3J0dW5pdGllcz8ubGVuZ3RoID09PSAwXCI+XG4gICAgICAgIDxwdy1uby1kYXRhIFt3aXRoSW1hZ2VdPVwidHJ1ZVwiIFttZXNzYWdlXT1cIidDcm0uU3VtbWFyeS5Ob0luc2lnaHRNZXNzYWdlJyB8IHRyYW5zbG9jb1wiPiA8L3B3LW5vLWRhdGE+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIEFjY291bnRzIGF0IHJpc2sgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtNiBtYi0zIGFuYWx5dGljc1wiPlxuICAgICAgPGg1IGNsYXNzPVwiYWNjb3JkaW9uLWhlYWRpbmdcIj5BY2NvdW50cyBhdCBSaXNrPC9oNT5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3LTEwMCB0ZXh0LWNlbnRlciBtdC0zXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCIhYWNjb3VudEF0Umlza0RldGFpbHNMb2FkZWRcIj5cbiAgICAgICAgICA8cC1wcm9ncmVzc1NwaW5uZXIgc3Ryb2tlV2lkdGg9XCIyXCI+IDwvcC1wcm9ncmVzc1NwaW5uZXI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwcmltZW5nLWRhdGF0YWJsZS1jb250YWluZXIgdGFibGUtcmVzcG9uc2l2ZVwiXG4gICAgICAgICpuZ0lmPVwiYWNjb3VudEF0Umlzaz8ubGVuZ3RoXCI+XG4gICAgICAgIDxwLXRhYmxlIGNsYXNzPVwidGFibGVcIlxuICAgICAgICAgICNkdFxuICAgICAgICAgIFt2YWx1ZV09XCJhY2NvdW50QXRSaXNrXCJcbiAgICAgICAgICBbcGFnaW5hdG9yXT1cInRydWVcIlxuICAgICAgICAgIFtyb3dzXT1cIlBBR0VfU0laRVwiXG5cbiAgICAgICAgICBbdG90YWxSZWNvcmRzXT1cImFjY291bnRBdFJpc2subGVuZ3RoXCJcbiAgICAgICAgICBbbGF6eV09XCJ0cnVlXCI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxuICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCI+e3sgJ0NybS5TdW1tYXJ5Lk93bmVyJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQ3JtLlN1bW1hcnkuQ29udGFjdE5hbWUnIHwgdHJhbnNsb2NvIH19PC90aD5cbiAgICAgICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiPnt7ICdDcm0uU3VtbWFyeS5PcmdhbmlzYXRpb24nIHwgdHJhbnNsb2NvIH19PC90aD5cbiAgICAgICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiPnt7ICdDcm0uU3VtbWFyeS5Db250YWN0RW1haWwnIHwgdHJhbnNsb2NvIH19PC90aD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiXG4gICAgICAgICAgICBsZXQtYWNjb3VudD5cbiAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgPHRkIGRhdGEtaGVhZD1cIk93bmVyXCI+XG4gICAgICAgICAgICAgICAge3sgYWNjb3VudC5vd25lcj8uZmlyc3RfbmFtZSB9fSB7eyBhY2NvdW50Lm93bmVyPy5sYXN0X25hbWUgfX1cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgPHRkIGRhdGEtaGVhZD1cIkNvbnRhY3QgTmFtZVwiPlxuICAgICAgICAgICAgICAgIHt7IGFjY291bnQuY29udGFjdF9uYW1lIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJPcmdhbmlzYXRpb25cIj5cbiAgICAgICAgICAgICAgICB7eyBhY2NvdW50Lm5hbWUgfX1cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgPHRkIGRhdGEtaGVhZD1cIkNvbnRhY3QgRW1haWxcIj5cbiAgICAgICAgICAgICAgICB7eyBhY2NvdW50LmNvbnRhY3RfZW1haWwgfX1cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9wLXRhYmxlPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInRvdGFsLXJlY29yZHMtY291bnRcIj57eyAnTGFiZWwuVG90YWwnIHwgdHJhbnNsb2NvIH19OiB7eyBhY2NvdW50QXRSaXNrLmxlbmd0aCB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cImFjY291bnRBdFJpc2s/Lmxlbmd0aCA9PT0gMFwiPlxuICAgICAgICA8cHctbm8tZGF0YSBbd2l0aEltYWdlXT1cInRydWVcIiBbbWVzc2FnZV09XCInQ3JtLlN1bW1hcnkuTm9JbnNpZ2h0TWVzc2FnZScgfCB0cmFuc2xvY29cIj4gPC9wdy1uby1kYXRhPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPCEtLSBDb250cmFjdCByZW5ld2FsIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTYgbWItMyBhbmFseXRpY3NcIj5cbiAgICAgIDxoNSBjbGFzcz1cImFjY29yZGlvbi1oZWFkaW5nXCI+Q29udHJhY3QgUmVuZXdhbDwvaDU+XG4gICAgICA8ZGl2IGNsYXNzPVwidy0xMDAgdGV4dC1jZW50ZXIgbXQtM1wiPlxuICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiIWNvbnRhY3RSZW5ld2FsTG9hZGVkXCI+XG4gICAgICAgICAgPHAtcHJvZ3Jlc3NTcGlubmVyIHN0cm9rZVdpZHRoPVwiMlwiPiA8L3AtcHJvZ3Jlc3NTcGlubmVyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicHJpbWVuZy1kYXRhdGFibGUtY29udGFpbmVyIHRhYmxlLXJlc3BvbnNpdmVcIlxuICAgICAgICAqbmdJZj1cIkNvbnRyYWN0UmVuZXdhbD8ubGVuZ3RoXCI+XG4gICAgICAgIDxwLXRhYmxlIGNsYXNzPVwidGFibGVcIlxuICAgICAgICAgICNkdFxuICAgICAgICAgIFt2YWx1ZV09XCJDb250cmFjdFJlbmV3YWxcIlxuICAgICAgICAgIFtwYWdpbmF0b3JdPVwidHJ1ZVwiXG4gICAgICAgICAgW3Jvd3NdPVwiUEFHRV9TSVpFXCJcblxuICAgICAgICAgIFt0b3RhbFJlY29yZHNdPVwiQ29udHJhY3RSZW5ld2FsLmxlbmd0aFwiXG4gICAgICAgICAgW2xhenldPVwidHJ1ZVwiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cbiAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiPnt7ICdDcm0uU3VtbWFyeS5Pd25lcicgfCB0cmFuc2xvY28gfX08L3RoPlxuICAgICAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCI+e3sgJ0NybS5TdW1tYXJ5LkNvbnRhY3ROYW1lJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQ3JtLlN1bW1hcnkuT3JnYW5pc2F0aW9uJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQ3JtLlN1bW1hcnkuQ29udGFjdEVtYWlsJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIlxuICAgICAgICAgICAgbGV0LWFjY291bnQ+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJPd25lclwiPlxuICAgICAgICAgICAgICAgIHt7IGFjY291bnQub3duZXI/LmZpcnN0X25hbWUgfX0ge3sgYWNjb3VudC5vd25lcj8ubGFzdF9uYW1lIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJDb250YWN0IE5hbWVcIj5cbiAgICAgICAgICAgICAgICB7eyBhY2NvdW50LmNvbnRhY3RfbmFtZSB9fVxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiT3JnYW5pc2F0aW9uXCI+XG4gICAgICAgICAgICAgICAge3sgYWNjb3VudC5uYW1lIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJDb250YWN0IEVtYWlsXCI+XG4gICAgICAgICAgICAgICAge3sgYWNjb3VudC5jb250YWN0X2VtYWlsIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvcC10YWJsZT5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b3RhbC1yZWNvcmRzLWNvdW50XCI+e3sgJ0xhYmVsLlRvdGFsJyB8IHRyYW5zbG9jbyB9fToge3sgQ29udHJhY3RSZW5ld2FsLmxlbmd0aCB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cIkNvbnRyYWN0UmVuZXdhbD8ubGVuZ3RoID09PSAwXCI+XG4gICAgICAgIDxwdy1uby1kYXRhIFt3aXRoSW1hZ2VdPVwidHJ1ZVwiIFttZXNzYWdlXT1cIidDcm0uU3VtbWFyeS5Ob0luc2lnaHRNZXNzYWdlJyB8IHRyYW5zbG9jb1wiPiA8L3B3LW5vLWRhdGE+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIENyZWRpdCBDYXJkIEV4cGlyaW5nIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTYgbWItMyBhbmFseXRpY3NcIj5cbiAgICAgIDxoNSBjbGFzcz1cImFjY29yZGlvbi1oZWFkaW5nXCI+Q3JlZGl0IENhcmQgRXhwaXJpbmc8L2g1PlxuICAgICAgPGRpdiBjbGFzcz1cInctMTAwIHRleHQtY2VudGVyIG10LTNcIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cIiFjcmVkaXRDYXJkRXhwaXJpbmdEZXRhaWxzTG9hZGVkXCI+XG4gICAgICAgICAgPHAtcHJvZ3Jlc3NTcGlubmVyIHN0cm9rZVdpZHRoPVwiMlwiPiA8L3AtcHJvZ3Jlc3NTcGlubmVyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicHJpbWVuZy1kYXRhdGFibGUtY29udGFpbmVyIHRhYmxlLXJlc3BvbnNpdmVcIlxuICAgICAgICAqbmdJZj1cImNyZWRpdENhcmRFeHBpcmluZz8ubGVuZ3RoXCI+XG4gICAgICAgIDxwLXRhYmxlIGNsYXNzPVwidGFibGVcIlxuICAgICAgICAgICNkdFxuICAgICAgICAgIFt2YWx1ZV09XCJjcmVkaXRDYXJkRXhwaXJpbmdcIlxuICAgICAgICAgIFtwYWdpbmF0b3JdPVwidHJ1ZVwiXG4gICAgICAgICAgW3Jvd3NdPVwiUEFHRV9TSVpFXCJcblxuICAgICAgICAgIFt0b3RhbFJlY29yZHNdPVwiY3JlZGl0Q2FyZEV4cGlyaW5nLmxlbmd0aFwiXG4gICAgICAgICAgW2xhenldPVwidHJ1ZVwiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cbiAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiPnt7ICdDcm0uU3VtbWFyeS5Pd25lcicgfCB0cmFuc2xvY28gfX08L3RoPlxuICAgICAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCI+e3sgJ0NybS5TdW1tYXJ5LkNvbnRhY3ROYW1lJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQ3JtLlN1bW1hcnkuT3JnYW5pc2F0aW9uJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQ3JtLlN1bW1hcnkuQ29udGFjdEVtYWlsJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIlxuICAgICAgICAgICAgbGV0LWFjY291bnQ+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJPd25lclwiPlxuICAgICAgICAgICAgICAgIHt7IGFjY291bnQub3duZXI/LmZpcnN0X25hbWUgfX0ge3sgYWNjb3VudC5vd25lcj8ubGFzdF9uYW1lIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJDb250YWN0IE5hbWVcIj5cbiAgICAgICAgICAgICAgICB7eyBhY2NvdW50LmNvbnRhY3RfbmFtZSB9fVxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiT3JnYW5pc2F0aW9uXCI+XG4gICAgICAgICAgICAgICAge3sgYWNjb3VudC5uYW1lIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJDb250YWN0IEVtYWlsXCI+XG4gICAgICAgICAgICAgICAge3sgYWNjb3VudC5jb250YWN0X2VtYWlsIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvcC10YWJsZT5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b3RhbC1yZWNvcmRzLWNvdW50XCI+e3sgJ0xhYmVsLlRvdGFsJyB8IHRyYW5zbG9jbyB9fToge3sgY3JlZGl0Q2FyZEV4cGlyaW5nLmxlbmd0aCB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cImNyZWRpdENhcmRFeHBpcmluZz8ubGVuZ3RoID09PSAwXCI+XG4gICAgICAgIDxwdy1uby1kYXRhIFt3aXRoSW1hZ2VdPVwidHJ1ZVwiIFttZXNzYWdlXT1cIidDcm0uU3VtbWFyeS5Ob0luc2lnaHRNZXNzYWdlJyB8IHRyYW5zbG9jb1wiPiA8L3B3LW5vLWRhdGE+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIE1hZ2ljIE1vbWVudCAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1tZC02IG1iLTMgYW5hbHl0aWNzXCI+XG4gICAgICA8aDUgY2xhc3M9XCJhY2NvcmRpb24taGVhZGluZ1wiPk1hZ2ljIE1vbWVudDwvaDU+XG4gICAgICA8ZGl2IGNsYXNzPVwidy0xMDAgdGV4dC1jZW50ZXIgbXQtM1wiPlxuICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiIW1hZ2ljTW9tZW50TG9hZGVkXCI+XG4gICAgICAgICAgPHAtcHJvZ3Jlc3NTcGlubmVyIHN0cm9rZVdpZHRoPVwiMlwiPiA8L3AtcHJvZ3Jlc3NTcGlubmVyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicHJpbWVuZy1kYXRhdGFibGUtY29udGFpbmVyIHRhYmxlLXJlc3BvbnNpdmVcIlxuICAgICAgICAqbmdJZj1cIm1hZ2ljTW9tZW50Py5sZW5ndGhcIj5cbiAgICAgICAgPHAtdGFibGUgY2xhc3M9XCJ0YWJsZVwiXG4gICAgICAgICAgI2R0XG4gICAgICAgICAgW3ZhbHVlXT1cIm1hZ2ljTW9tZW50XCJcbiAgICAgICAgICBbcGFnaW5hdG9yXT1cInRydWVcIlxuICAgICAgICAgIFtyb3dzXT1cIlBBR0VfU0laRVwiXG5cbiAgICAgICAgICBbdG90YWxSZWNvcmRzXT1cIm1hZ2ljTW9tZW50Lmxlbmd0aFwiXG4gICAgICAgICAgW2xhenldPVwidHJ1ZVwiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cbiAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiPnt7ICdDcm0uU3VtbWFyeS5Pd25lcicgfCB0cmFuc2xvY28gfX08L3RoPlxuICAgICAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCI+e3sgJ0NybS5TdW1tYXJ5LkNvbnRhY3ROYW1lJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQ3JtLlN1bW1hcnkuT3JnYW5pc2F0aW9uJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQ3JtLlN1bW1hcnkuQ29udGFjdEVtYWlsJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIlxuICAgICAgICAgICAgbGV0LWFjY291bnQ+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJPd25lclwiPlxuICAgICAgICAgICAgICAgIHt7IGFjY291bnQub3duZXI/LmZpcnN0X25hbWUgfX0ge3sgYWNjb3VudC5vd25lcj8ubGFzdF9uYW1lIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJDb250YWN0IE5hbWVcIj5cbiAgICAgICAgICAgICAgICB7eyBhY2NvdW50LmNvbnRhY3RfbmFtZSB9fVxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiT3JnYW5pc2F0aW9uXCI+XG4gICAgICAgICAgICAgICAge3sgYWNjb3VudC5uYW1lIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJDb250YWN0IEVtYWlsXCI+XG4gICAgICAgICAgICAgICAge3sgYWNjb3VudC5jb250YWN0X2VtYWlsIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvcC10YWJsZT5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b3RhbC1yZWNvcmRzLWNvdW50XCI+e3sgJ0xhYmVsLlRvdGFsJyB8IHRyYW5zbG9jbyB9fToge3sgbWFnaWNNb21lbnQubGVuZ3RoIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwibWFnaWNNb21lbnQ/Lmxlbmd0aCA9PT0gMFwiPlxuICAgICAgICA8cHctbm8tZGF0YSBbd2l0aEltYWdlXT1cInRydWVcIiBbbWVzc2FnZV09XCInQ3JtLlN1bW1hcnkuTm9JbnNpZ2h0TWVzc2FnZScgfCB0cmFuc2xvY29cIj4gPC9wdy1uby1kYXRhPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuPC9kaXY+XG4iXX0=
|
|
148
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtY3JtLXN1bW1hcnktb3RoZXJzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc21hcnQtY3JtL3NyYy9saWIvcHJpdmF0ZS9jb21wb25lbnRzL3NtYXJ0LWNybS1zdW1tYXJ5L3NtYXJ0LWNybS1zdW1tYXJ5LW90aGVycy9zbWFydC1jcm0tc3VtbWFyeS1vdGhlcnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zbWFydC1jcm0vc3JjL2xpYi9wcml2YXRlL2NvbXBvbmVudHMvc21hcnQtY3JtLXN1bW1hcnkvc21hcnQtY3JtLXN1bW1hcnktb3RoZXJzL3NtYXJ0LWNybS1zdW1tYXJ5LW90aGVycy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDdkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXhELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7Ozs7Ozs7O0FBTWhFLE1BQU0sT0FBTyw4QkFBK0IsU0FBUSxnQkFBZ0I7SUE2QmhFLFlBQ1ksVUFBc0IsRUFDOUIsUUFBa0I7UUFFbEIsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBSFIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQWZsQywrQkFBMEIsR0FBRyxLQUFLLENBQUM7UUFFbkMsOEJBQXlCLEdBQUcsS0FBSyxDQUFDO1FBRWxDLCtCQUEwQixHQUFHLEtBQUssQ0FBQztRQUVuQyx5QkFBb0IsR0FBRyxLQUFLLENBQUM7UUFFN0Isb0NBQStCLEdBQUcsS0FBSyxDQUFDO1FBRXhDLHNCQUFpQixHQUFHLEtBQUssQ0FBQztJQVMxQixDQUFDO0lBRUQsUUFBUTtRQUNKLElBQUksQ0FBQyxtQkFBbUIsRUFB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Q0FBQyxDQUFDO2FBQ0QsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNOLElBQUksQ0FBQywrQkFBK0IsR0FBRyxJQUFJLENBQUM7UUFDaEQsQ0FBQyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBQ0Qsb0NBQW9DO0lBQzVCLGNBQWM7UUFDbEIsSUFBSSxDQUFDLFVBQVU7YUFDVixlQUFlLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLEVBQUUsY0FBYyxDQUFDO2FBQ3RELFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNsQixJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDckUsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7WUFDMUIsQ0FBQzs7Z0JBQU0sSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUM7UUFDdkMsQ0FBQyxDQUFDO2FBQ0QsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNOLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRVEsV0FBVztRQUNoQixLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDeEIsQ0FBQzsrR0F0SlEsOEJBQThCO21HQUE5Qiw4QkFBOEIsMEZDVDNDLCs3WkFxVEE7OzRGRDVTYSw4QkFBOEI7a0JBSjFDLFNBQVM7K0JBQ0ksNkJBQTZCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbmplY3RvciwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENybVNlcnZpY2UgfSBmcm9tICdAcG9zaXdpc2Uvc21hcnQtY3JtLXNoYXJlZCc7XG5cbmltcG9ydCB7IEFwcEJhc2VDb21wb25lbnQgfSBmcm9tICdAcG9zaXdpc2UvYXBwLWJhc2UtY29tcG9uZW50JztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgVXNlcixhY3RpdmVPcHBvcnR1bml0aWVzLHNpZ25lZFVwTGFzdFRoaXJ0eURheXN9IGZyb20gJ0Bwb3Npd2lzZS9jb21tb24tdXRpbGl0aWVzJztcbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAncHctc21hcnQtY3JtLXN1bW1hcnktb3RoZXJzJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc21hcnQtY3JtLXN1bW1hcnktb3RoZXJzLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBTbWFydENybVN1bW1hcnlPdGhlcnNDb21wb25lbnQgZXh0ZW5kcyBBcHBCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAgIHNpZ25lZFVwTGFzdFRoaXJ0eURheXM6c2lnbmVkVXBMYXN0VGhpcnR5RGF5c1tdO1xuXG4gICAgYWN0aXZlT3Bwb3J0dW5pdGllczphY3RpdmVPcHBvcnR1bml0aWVzW107XG5cbiAgICBhY2NvdW50QXRSaXNrOltdO1xuXG4gICAgQ29udHJhY3RSZW5ld2FsOltdO1xuXG4gICAgY3JlZGl0Q2FyZEV4cGlyaW5nOltdO1xuXG4gICAgbWFnaWNNb21lbnQ6W107XG5cbiAgICB1c2VyOiBVc2VyO1xuXG4gICAgc2lnblVwTGFzdFRoaXJ0eURheXNMb2FkZWQgPSBmYWxzZTtcblxuICAgIGFjdGl2ZU9wcG9ydHVuaXRpZXNMb2FkZWQgPSBmYWxzZTtcblxuICAgIGFjY291bnRBdFJpc2tEZXRhaWxzTG9hZGVkID0gZmFsc2U7XG5cbiAgICBjb250YWN0UmVuZXdhbExvYWRlZCA9IGZhbHNlO1xuXG4gICAgY3JlZGl0Q2FyZEV4cGlyaW5nRGV0YWlsc0xvYWRlZCA9IGZhbHNlO1xuXG4gICAgbWFnaWNNb21lbnRMb2FkZWQgPSBmYWxzZTtcblxuICAgIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgY3JtU2VydmljZTogQ3JtU2VydmljZSxcbiAgICAgICAgaW5qZWN0b3I6IEluamVjdG9yXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGluamVjdG9yKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5nZXRVc2VyU3Vic2NyaXB0aW9uKCkuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gcmVzcG9uc2U7XG4gICAgICAgICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24/LmlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRVc2VySW5mbygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFVzZXJJbmZvKCkge1xuICAgICAgICB0aGlzLnVzZXJTdG9yZSgpLnN1YnNjcmliZSh1c2VyID0+IHtcbiAgICAgICAgICAgIGlmICh1c2VyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51c2VyID0gdXNlcjtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGVybWlzc2lvblNlcnZpY2UuaXNHcmFudGVkKCdQYWdlcy5CZXRhJykgfHxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wZXJtaXNzaW9uU2VydmljZS5pc1N1cGVyQWRtaW4oKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFNpZ25lZFVwTGFzdFRoaXJ0eURheXMoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRBY3RpdmVPcHBvcnR1bml0aWVzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0QWNjb3VudEF0Umlza0RldGFpbHMoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRDb250YWN0UmVuZXdhbCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldENyZWRpdENhcmRFeHBpcmluZ0RldGFpbHMoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRNYWdpY01vbWVudCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEZ1bmN0aW9uIHRvIGNhbGwgc2lnbmVkIHVwIGxhc3QgMzAgZGF5cyBkZXRhaWxzICovXG4gICAgcHJpdmF0ZSBnZXRTaWduZWRVcExhc3RUaGlydHlEYXlzKCkge1xuICAgICAgICB0aGlzLmNybVNlcnZpY2VcbiAgICAgICAgICAgIC5nZXRDcm1BbmFseXRpY3ModGhpcy5zdWJzY3JpcHRpb24/LmlkLCAnYWNjb3VudHNfc2lnbmVkX3VwX2xhc3RfMzBfZGF5cycpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc3BvbnNlID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyhyZXNwb25zZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2lnbmVkVXBMYXN0VGhpcnR5RGF5cyA9IFtdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB0aGlzLnNpZ25lZFVwTGFzdFRoaXJ0eURheXMgPSByZXNwb25zZTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuYWRkKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNpZ25VcExhc3RUaGlydHlEYXlzTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBGdW5jdGlvbiB0byBjYWxsIEFjdGl2ZSBPcHBvcnR1bml0aWVzIGRldGFpbHMgKi9cbiAgICBwcml2YXRlIGdldEFjdGl2ZU9wcG9ydHVuaXRpZXMoKSB7XG4gICAgICAgIHRoaXMuY3JtU2VydmljZVxuICAgICAgICAgICAgLmdldENybUFuYWx5dGljcyh0aGlzLnN1YnNjcmlwdGlvbj8uaWQsICdhY2NvdW50c19hY3RpdmVfb3Bwb3J0dW5pdGllcycpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc3BvbnNlID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyhyZXNwb25zZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlT3Bwb3J0dW5pdGllcyA9IFtdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB0aGlzLmFjdGl2ZU9wcG9ydHVuaXRpZXMgPSByZXNwb25zZTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuYWRkKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZU9wcG9ydHVuaXRpZXNMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEZ1bmN0aW9uIHRvIGNhbGwgQWNjb3VudCBBdCBSaXNrIGRldGFpbHMgKi9cbiAgICBwcml2YXRlIGdldEFjY291bnRBdFJpc2tEZXRhaWxzKCkge1xuICAgICAgICB0aGlzLmNybVNlcnZpY2VcbiAgICAgICAgICAgIC5nZXRDcm1BbmFseXRpY3ModGhpcy5zdWJzY3JpcHRpb24/LmlkLCAnYWNjb3VudHNfYWNjb3VudHNfYXRfcmlzaycpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc3BvbnNlID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyhyZXNwb25zZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWNjb3VudEF0UmlzayA9IFtdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB0aGlzLmFjY291bnRBdFJpc2sgPSByZXNwb25zZTtcblxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5hZGQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYWNjb3VudEF0Umlza0RldGFpbHNMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEZ1bmN0aW9uIHRvIGNhbGwgQ29udHJhY3QgcmVuZXdhbCBkZXRhaWxzICovXG4gICAgcHJpdmF0ZSBnZXRDb250YWN0UmVuZXdhbCgpIHtcbiAgICAgICAgdGhpcy5jcm1TZXJ2aWNlXG4gICAgICAgICAgICAuZ2V0Q3JtQW5hbHl0aWNzKHRoaXMuc3Vic2NyaXB0aW9uPy5pZCwgJ2FjY291bnRzX2NvbnRyYWN0X3JlbmV3YWwnKVxuICAgICAgICAgICAgLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXNwb25zZSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMocmVzcG9uc2UpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkNvbnRyYWN0UmVuZXdhbCA9IFtdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB0aGlzLkNvbnRyYWN0UmVuZXdhbCA9IHJlc3BvbnNlO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5hZGQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGFjdFJlbmV3YWxMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEZ1bmN0aW9uIHRvIGNhbGwgQ3JlZGl0IENhcmQgRXhwaXJpbmcgZGV0YWlscyAqL1xuICAgIHByaXZhdGUgZ2V0Q3JlZGl0Q2FyZEV4cGlyaW5nRGV0YWlscygpIHtcbiAgICAgICAgdGhpcy5jcm1TZXJ2aWNlXG4gICAgICAgICAgICAuZ2V0Q3JtQW5hbHl0aWNzKHRoaXMuc3Vic2NyaXB0aW9uPy5pZCwgJ2NyZWRpdF9jYXJkX2V4cGlyaW5nJylcbiAgICAgICAgICAgIC5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzcG9uc2UgPT09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKHJlc3BvbnNlKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVkaXRDYXJkRXhwaXJpbmcgPSBbXTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgdGhpcy5jcmVkaXRDYXJkRXhwaXJpbmcgPSByZXNwb25zZTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuYWRkKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWRpdENhcmRFeHBpcmluZ0RldGFpbHNMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKiBGdW5jdGlvbiB0byBjYWxsIG1hZ2ljIG1vbWVudCAqL1xuICAgIHByaXZhdGUgZ2V0TWFnaWNNb21lbnQoKSB7XG4gICAgICAgIHRoaXMuY3JtU2VydmljZVxuICAgICAgICAgICAgLmdldENybUFuYWx5dGljcyh0aGlzLnN1YnNjcmlwdGlvbj8uaWQsICdtYWdpY19tb21lbnQnKVxuICAgICAgICAgICAgLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXNwb25zZSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMocmVzcG9uc2UpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hZ2ljTW9tZW50ID0gW107XG4gICAgICAgICAgICAgICAgfSBlbHNlIHRoaXMubWFnaWNNb21lbnQgPSByZXNwb25zZTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuYWRkKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm1hZ2ljTW9tZW50TG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIG92ZXJyaWRlIG5nT25EZXN0cm95KCkge1xuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgPG5nLWNvbnRhaW5lciBjbGFzcz1cIm10LTVcIlxuICAgICpyYmFjQWxsb3c9XCInUGFnZXMuQmV0YSdcIj5cbiAgICA8IS0tIFNpZ25lZCB1cCBsYXN0IDMwIGRheXMgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtNiBtYi0zIGFuYWx5dGljc1wiPlxuICAgICAgPGg1IGNsYXNzPVwiYWNjb3JkaW9uLWhlYWRpbmdcIj5TaWduZWQgdXAgTGFzdCAzMCBEYXlzPC9oNT5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3LTEwMCB0ZXh0LWNlbnRlciBtdC0zXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCIhc2lnblVwTGFzdFRoaXJ0eURheXNMb2FkZWRcIj5cbiAgICAgICAgICA8cC1wcm9ncmVzc1NwaW5uZXIgc3Ryb2tlV2lkdGg9XCIyXCI+IDwvcC1wcm9ncmVzc1NwaW5uZXI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwcmltZW5nLWRhdGF0YWJsZS1jb250YWluZXIgdGFibGUtcmVzcG9uc2l2ZVwiXG4gICAgICAgICpuZ0lmPVwic2lnbmVkVXBMYXN0VGhpcnR5RGF5cz8ubGVuZ3RoXCI+XG4gICAgICAgIDxwLXRhYmxlIGNsYXNzPVwidGFibGVcIlxuICAgICAgICAgICNkdFxuICAgICAgICAgIFt2YWx1ZV09XCJzaWduZWRVcExhc3RUaGlydHlEYXlzXCJcbiAgICAgICAgICBbcGFnaW5hdG9yXT1cInRydWVcIlxuICAgICAgICAgIFtyb3dzXT1cIlBBR0VfU0laRVwiXG4gICAgICAgICAgW3RvdGFsUmVjb3Jkc109XCJzaWduZWRVcExhc3RUaGlydHlEYXlzLmxlbmd0aFwiXG4gICAgICAgICAgW2xhenldPVwidHJ1ZVwiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cbiAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiPnt7ICdDcm0uU3VtbWFyeS5Pd25lcicgfCB0cmFuc2xvY28gfX08L3RoPlxuICAgICAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCI+e3sgJ0NybS5TdW1tYXJ5LkNvbnRhY3ROYW1lJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQ3JtLlN1bW1hcnkuQ29udGFjdEVtYWlsJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIlxuICAgICAgICAgICAgbGV0LXNpZ25VcD5cbiAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgPHRkIGRhdGEtaGVhZD1cIk93bmVyXCI+XG4gICAgICAgICAgICAgICAge3sgc2lnblVwLm93bmVyPy5maXJzdF9uYW1lIH19IHt7IHNpZ25VcC5vd25lcj8ubGFzdF9uYW1lIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJDb250YWN0IE5hbWVcIj5cbiAgICAgICAgICAgICAgICB7eyBzaWduVXAuY29udGFjdF9uYW1lIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJDb250YWN0IEVtYWlsXCI+XG4gICAgICAgICAgICAgICAge3sgc2lnblVwLmNvbnRhY3RfZW1haWwgfX1cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9wLXRhYmxlPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInRvdGFsLXJlY29yZHMtY291bnRcIiAqbmdJZj1cInNpZ25lZFVwTGFzdFRoaXJ0eURheXMubGVuZ3RoIT09IDBcIj57eyAnTGFiZWwuVG90YWwnIHwgdHJhbnNsb2NvIH19OiB7eyBzaWduZWRVcExhc3RUaGlydHlEYXlzLmxlbmd0aCB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cInNpZ25lZFVwTGFzdFRoaXJ0eURheXM/Lmxlbmd0aCA9PT0gMFwiPlxuICAgICAgICA8cHctbm8tZGF0YSBbd2l0aEltYWdlXT1cInRydWVcIiBbbWVzc2FnZV09XCInQ3JtLlN1bW1hcnkuTm9JbnNpZ2h0TWVzc2FnZScgfCB0cmFuc2xvY29cIj4gPC9wdy1uby1kYXRhPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPCEtLSBBY3RpdmUgT3Bwb3J0dW5pdGllcyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1tZC02IG1iLTMgYW5hbHl0aWNzXCI+XG4gICAgICA8aDUgY2xhc3M9XCJhY2NvcmRpb24taGVhZGluZ1wiPkFjdGl2ZSBPcHBvcnR1bml0aWVzPC9oNT5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3LTEwMCB0ZXh0LWNlbnRlciBtdC0zXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCIhYWN0aXZlT3Bwb3J0dW5pdGllc0xvYWRlZFwiPlxuICAgICAgICAgIDxwLXByb2dyZXNzU3Bpbm5lciBzdHJva2VXaWR0aD1cIjJcIj4gPC9wLXByb2dyZXNzU3Bpbm5lcj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInByaW1lbmctZGF0YXRhYmxlLWNvbnRhaW5lciB0YWJsZS1yZXNwb25zaXZlXCJcbiAgICAgICAgKm5nSWY9XCJhY3RpdmVPcHBvcnR1bml0aWVzPy5sZW5ndGhcIj5cbiAgICAgICAgPHAtdGFibGUgY2xhc3M9XCJ0YWJsZVwiXG4gICAgICAgICAgI2R0XG4gICAgICAgICAgW3ZhbHVlXT1cImFjdGl2ZU9wcG9ydHVuaXRpZXNcIlxuICAgICAgICAgIFtwYWdpbmF0b3JdPVwidHJ1ZVwiXG4gICAgICAgICAgW3Jvd3NdPVwiUEFHRV9TSVpFXCJcblxuICAgICAgICAgIFt0b3RhbFJlY29yZHNdPVwiYWN0aXZlT3Bwb3J0dW5pdGllcy5sZW5ndGhcIlxuICAgICAgICAgIFtsYXp5XT1cInRydWVcIj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQ3JtLlN1bW1hcnkuVGl0bGUnIHwgdHJhbnNsb2NvIH19PC90aD5cbiAgICAgICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiPnt7ICdDcm0uU3VtbWFyeS5Db250YWN0TmFtZScgfCB0cmFuc2xvY28gfX08L3RoPlxuICAgICAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCI+e3sgJ0NybS5TdW1tYXJ5LkFjY291bnQnIHwgdHJhbnNsb2NvIH19PC90aD5cbiAgICAgICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiPnt7ICdDcm0uU3VtbWFyeS5PbmVUaW1lQW1vdW50JyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQ3JtLlN1bW1hcnkuV2luQ2hhbmNlJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQ3JtLlN1bW1hcnkuTW9udGhseUFtb3VudCcgfCB0cmFuc2xvY28gfX08L3RoPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCJcbiAgICAgICAgICAgIGxldC1vcHBvcnR1bml0aWVzPlxuICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiVGl0bGVcIj5cbiAgICAgICAgICAgICAgICB7eyBvcHBvcnR1bml0aWVzLnRpdGxlIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJDb250YWN0IE5hbWVcIj5cbiAgICAgICAgICAgICAgICB7eyBvcHBvcnR1bml0aWVzLmNybV9jb250YWN0Py5maXJzdF9uYW1lIH19XG4gICAgICAgICAgICAgICAge3sgb3Bwb3J0dW5pdGllcy5jcm1fY29udGFjdD8ubGFzdF9uYW1lIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJBY2NvdW50XCI+XG4gICAgICAgICAgICAgICAge3sgb3Bwb3J0dW5pdGllcy5jcm1fYWNjb3VudD8ubmFtZSB9fVxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiT25lIFRpbWUgQW1vdW50XCI+XG4gICAgICAgICAgICAgICAge3sgb3Bwb3J0dW5pdGllcy5vbmVfdGltZV9hbW91bnQgLyAxMDAgfCBjdXJyZW5jeSB9fVxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiTW9udGhseSBBbW91bnRcIj5cbiAgICAgICAgICAgICAgICB7eyBvcHBvcnR1bml0aWVzLm1vbnRobHlfYW1vdW50IC8gMTAwIHwgY3VycmVuY3kgfX1cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgPHRkIGRhdGEtaGVhZD1cIldpbiBDaGFuY2VcIj5cbiAgICAgICAgICAgICAgICB7eyBvcHBvcnR1bml0aWVzLndpbl9jaGFuY2VzIHwgcGVyY2VudCB9fVxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L3AtdGFibGU+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidG90YWwtcmVjb3Jkcy1jb3VudFwiICpuZ0lmPVwiYWN0aXZlT3Bwb3J0dW5pdGllcy5sZW5ndGggIT09IDBcIj57eyAnTGFiZWwuVG90YWwnIHwgdHJhbnNsb2NvIH19OiB7eyBhY3RpdmVPcHBvcnR1bml0aWVzLmxlbmd0aCB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cImFjdGl2ZU9wcG9ydHVuaXRpZXM/Lmxlbmd0aCA9PT0gMFwiPlxuICAgICAgICA8cHctbm8tZGF0YSBbd2l0aEltYWdlXT1cInRydWVcIiBbbWVzc2FnZV09XCInQ3JtLlN1bW1hcnkuTm9JbnNpZ2h0TWVzc2FnZScgfCB0cmFuc2xvY29cIj4gPC9wdy1uby1kYXRhPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPCEtLSBBY2NvdW50cyBhdCByaXNrIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTYgbWItMyBhbmFseXRpY3NcIj5cbiAgICAgIDxoNSBjbGFzcz1cImFjY29yZGlvbi1oZWFkaW5nXCI+QWNjb3VudHMgYXQgUmlzazwvaDU+XG4gICAgICA8ZGl2IGNsYXNzPVwidy0xMDAgdGV4dC1jZW50ZXIgbXQtM1wiPlxuICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiIWFjY291bnRBdFJpc2tEZXRhaWxzTG9hZGVkXCI+XG4gICAgICAgICAgPHAtcHJvZ3Jlc3NTcGlubmVyIHN0cm9rZVdpZHRoPVwiMlwiPiA8L3AtcHJvZ3Jlc3NTcGlubmVyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicHJpbWVuZy1kYXRhdGFibGUtY29udGFpbmVyIHRhYmxlLXJlc3BvbnNpdmVcIlxuICAgICAgICAqbmdJZj1cImFjY291bnRBdFJpc2s/Lmxlbmd0aFwiPlxuICAgICAgICA8cC10YWJsZSBjbGFzcz1cInRhYmxlXCJcbiAgICAgICAgICAjZHRcbiAgICAgICAgICBbdmFsdWVdPVwiYWNjb3VudEF0Umlza1wiXG4gICAgICAgICAgW3BhZ2luYXRvcl09XCJ0cnVlXCJcbiAgICAgICAgICBbcm93c109XCJQQUdFX1NJWkVcIlxuXG4gICAgICAgICAgW3RvdGFsUmVjb3Jkc109XCJhY2NvdW50QXRSaXNrLmxlbmd0aFwiXG4gICAgICAgICAgW2xhenldPVwidHJ1ZVwiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cbiAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiPnt7ICdDcm0uU3VtbWFyeS5Pd25lcicgfCB0cmFuc2xvY28gfX08L3RoPlxuICAgICAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCI+e3sgJ0NybS5TdW1tYXJ5LkNvbnRhY3ROYW1lJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQ3JtLlN1bW1hcnkuT3JnYW5pc2F0aW9uJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQ3JtLlN1bW1hcnkuQ29udGFjdEVtYWlsJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIlxuICAgICAgICAgICAgbGV0LWFjY291bnQ+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJPd25lclwiPlxuICAgICAgICAgICAgICAgIHt7IGFjY291bnQub3duZXI/LmZpcnN0X25hbWUgfX0ge3sgYWNjb3VudC5vd25lcj8ubGFzdF9uYW1lIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJDb250YWN0IE5hbWVcIj5cbiAgICAgICAgICAgICAgICB7eyBhY2NvdW50LmNvbnRhY3RfbmFtZSB9fVxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiT3JnYW5pc2F0aW9uXCI+XG4gICAgICAgICAgICAgICAge3sgYWNjb3VudC5uYW1lIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJDb250YWN0IEVtYWlsXCI+XG4gICAgICAgICAgICAgICAge3sgYWNjb3VudC5jb250YWN0X2VtYWlsIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvcC10YWJsZT5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b3RhbC1yZWNvcmRzLWNvdW50XCIgICpuZ0lmPVwiYWNjb3VudEF0Umlzay5sZW5ndGggIT09IDBcIj57eyAnTGFiZWwuVG90YWwnIHwgdHJhbnNsb2NvIH19OiB7eyBhY2NvdW50QXRSaXNrLmxlbmd0aCB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cImFjY291bnRBdFJpc2s/Lmxlbmd0aCA9PT0gMFwiPlxuICAgICAgICA8cHctbm8tZGF0YSBbd2l0aEltYWdlXT1cInRydWVcIiBbbWVzc2FnZV09XCInQ3JtLlN1bW1hcnkuTm9JbnNpZ2h0TWVzc2FnZScgfCB0cmFuc2xvY29cIj4gPC9wdy1uby1kYXRhPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPCEtLSBDb250cmFjdCByZW5ld2FsIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTYgbWItMyBhbmFseXRpY3NcIj5cbiAgICAgIDxoNSBjbGFzcz1cImFjY29yZGlvbi1oZWFkaW5nXCI+Q29udHJhY3QgUmVuZXdhbDwvaDU+XG4gICAgICA8ZGl2IGNsYXNzPVwidy0xMDAgdGV4dC1jZW50ZXIgbXQtM1wiPlxuICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiIWNvbnRhY3RSZW5ld2FsTG9hZGVkXCI+XG4gICAgICAgICAgPHAtcHJvZ3Jlc3NTcGlubmVyIHN0cm9rZVdpZHRoPVwiMlwiPiA8L3AtcHJvZ3Jlc3NTcGlubmVyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicHJpbWVuZy1kYXRhdGFibGUtY29udGFpbmVyIHRhYmxlLXJlc3BvbnNpdmVcIlxuICAgICAgICAqbmdJZj1cIkNvbnRyYWN0UmVuZXdhbD8ubGVuZ3RoXCI+XG4gICAgICAgIDxwLXRhYmxlIGNsYXNzPVwidGFibGVcIlxuICAgICAgICAgICNkdFxuICAgICAgICAgIFt2YWx1ZV09XCJDb250cmFjdFJlbmV3YWxcIlxuICAgICAgICAgIFtwYWdpbmF0b3JdPVwidHJ1ZVwiXG4gICAgICAgICAgW3Jvd3NdPVwiUEFHRV9TSVpFXCJcblxuICAgICAgICAgIFt0b3RhbFJlY29yZHNdPVwiQ29udHJhY3RSZW5ld2FsLmxlbmd0aFwiXG4gICAgICAgICAgW2xhenldPVwidHJ1ZVwiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cbiAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiPnt7ICdDcm0uU3VtbWFyeS5Pd25lcicgfCB0cmFuc2xvY28gfX08L3RoPlxuICAgICAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCI+e3sgJ0NybS5TdW1tYXJ5LkNvbnRhY3ROYW1lJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQ3JtLlN1bW1hcnkuT3JnYW5pc2F0aW9uJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQ3JtLlN1bW1hcnkuQ29udGFjdEVtYWlsJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIlxuICAgICAgICAgICAgbGV0LWFjY291bnQ+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJPd25lclwiPlxuICAgICAgICAgICAgICAgIHt7IGFjY291bnQub3duZXI/LmZpcnN0X25hbWUgfX0ge3sgYWNjb3VudC5vd25lcj8ubGFzdF9uYW1lIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJDb250YWN0IE5hbWVcIj5cbiAgICAgICAgICAgICAgICB7eyBhY2NvdW50LmNvbnRhY3RfbmFtZSB9fVxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiT3JnYW5pc2F0aW9uXCI+XG4gICAgICAgICAgICAgICAge3sgYWNjb3VudC5uYW1lIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJDb250YWN0IEVtYWlsXCI+XG4gICAgICAgICAgICAgICAge3sgYWNjb3VudC5jb250YWN0X2VtYWlsIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvcC10YWJsZT5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b3RhbC1yZWNvcmRzLWNvdW50XCIgKm5nSWY9XCJDb250cmFjdFJlbmV3YWwubGVuZ3RoICE9PSAwXCI+e3sgJ0xhYmVsLlRvdGFsJyB8IHRyYW5zbG9jbyB9fToge3sgQ29udHJhY3RSZW5ld2FsLmxlbmd0aCB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cIkNvbnRyYWN0UmVuZXdhbD8ubGVuZ3RoID09PSAwXCI+XG4gICAgICAgIDxwdy1uby1kYXRhIFt3aXRoSW1hZ2VdPVwidHJ1ZVwiIFttZXNzYWdlXT1cIidDcm0uU3VtbWFyeS5Ob0luc2lnaHRNZXNzYWdlJyB8IHRyYW5zbG9jb1wiPiA8L3B3LW5vLWRhdGE+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIENyZWRpdCBDYXJkIEV4cGlyaW5nIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLW1kLTYgbWItMyBhbmFseXRpY3NcIj5cbiAgICAgIDxoNSBjbGFzcz1cImFjY29yZGlvbi1oZWFkaW5nXCI+Q3JlZGl0IENhcmQgRXhwaXJpbmc8L2g1PlxuICAgICAgPGRpdiBjbGFzcz1cInctMTAwIHRleHQtY2VudGVyIG10LTNcIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cIiFjcmVkaXRDYXJkRXhwaXJpbmdEZXRhaWxzTG9hZGVkXCI+XG4gICAgICAgICAgPHAtcHJvZ3Jlc3NTcGlubmVyIHN0cm9rZVdpZHRoPVwiMlwiPiA8L3AtcHJvZ3Jlc3NTcGlubmVyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicHJpbWVuZy1kYXRhdGFibGUtY29udGFpbmVyIHRhYmxlLXJlc3BvbnNpdmVcIlxuICAgICAgICAqbmdJZj1cImNyZWRpdENhcmRFeHBpcmluZz8ubGVuZ3RoXCI+XG4gICAgICAgIDxwLXRhYmxlIGNsYXNzPVwidGFibGVcIlxuICAgICAgICAgICNkdFxuICAgICAgICAgIFt2YWx1ZV09XCJjcmVkaXRDYXJkRXhwaXJpbmdcIlxuICAgICAgICAgIFtwYWdpbmF0b3JdPVwidHJ1ZVwiXG4gICAgICAgICAgW3Jvd3NdPVwiUEFHRV9TSVpFXCJcblxuICAgICAgICAgIFt0b3RhbFJlY29yZHNdPVwiY3JlZGl0Q2FyZEV4cGlyaW5nLmxlbmd0aFwiXG4gICAgICAgICAgW2xhenldPVwidHJ1ZVwiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cbiAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiPnt7ICdDcm0uU3VtbWFyeS5Pd25lcicgfCB0cmFuc2xvY28gfX08L3RoPlxuICAgICAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCI+e3sgJ0NybS5TdW1tYXJ5LkNvbnRhY3ROYW1lJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQ3JtLlN1bW1hcnkuT3JnYW5pc2F0aW9uJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQ3JtLlN1bW1hcnkuQ29udGFjdEVtYWlsJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIlxuICAgICAgICAgICAgbGV0LWFjY291bnQ+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJPd25lclwiPlxuICAgICAgICAgICAgICAgIHt7IGFjY291bnQub3duZXI/LmZpcnN0X25hbWUgfX0ge3sgYWNjb3VudC5vd25lcj8ubGFzdF9uYW1lIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJDb250YWN0IE5hbWVcIj5cbiAgICAgICAgICAgICAgICB7eyBhY2NvdW50LmNvbnRhY3RfbmFtZSB9fVxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiT3JnYW5pc2F0aW9uXCI+XG4gICAgICAgICAgICAgICAge3sgYWNjb3VudC5uYW1lIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJDb250YWN0IEVtYWlsXCI+XG4gICAgICAgICAgICAgICAge3sgYWNjb3VudC5jb250YWN0X2VtYWlsIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvcC10YWJsZT5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b3RhbC1yZWNvcmRzLWNvdW50XCIgKm5nSWY9XCJjcmVkaXRDYXJkRXhwaXJpbmcubGVuZ3RoICE9PSAwXCI+e3sgJ0xhYmVsLlRvdGFsJyB8IHRyYW5zbG9jbyB9fToge3sgY3JlZGl0Q2FyZEV4cGlyaW5nLmxlbmd0aCB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cImNyZWRpdENhcmRFeHBpcmluZz8ubGVuZ3RoID09PSAwXCI+XG4gICAgICAgIDxwdy1uby1kYXRhIFt3aXRoSW1hZ2VdPVwidHJ1ZVwiIFttZXNzYWdlXT1cIidDcm0uU3VtbWFyeS5Ob0luc2lnaHRNZXNzYWdlJyB8IHRyYW5zbG9jb1wiPiA8L3B3LW5vLWRhdGE+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIE1hZ2ljIE1vbWVudCAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1tZC02IG1iLTMgYW5hbHl0aWNzXCI+XG4gICAgICA8aDUgY2xhc3M9XCJhY2NvcmRpb24taGVhZGluZ1wiPk1hZ2ljIE1vbWVudDwvaDU+XG4gICAgICA8ZGl2IGNsYXNzPVwidy0xMDAgdGV4dC1jZW50ZXIgbXQtM1wiPlxuICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiIW1hZ2ljTW9tZW50TG9hZGVkXCI+XG4gICAgICAgICAgPHAtcHJvZ3Jlc3NTcGlubmVyIHN0cm9rZVdpZHRoPVwiMlwiPiA8L3AtcHJvZ3Jlc3NTcGlubmVyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicHJpbWVuZy1kYXRhdGFibGUtY29udGFpbmVyIHRhYmxlLXJlc3BvbnNpdmVcIlxuICAgICAgICAqbmdJZj1cIm1hZ2ljTW9tZW50Py5sZW5ndGhcIj5cbiAgICAgICAgPHAtdGFibGUgY2xhc3M9XCJ0YWJsZVwiXG4gICAgICAgICAgI2R0XG4gICAgICAgICAgW3ZhbHVlXT1cIm1hZ2ljTW9tZW50XCJcbiAgICAgICAgICBbcGFnaW5hdG9yXT1cInRydWVcIlxuICAgICAgICAgIFtyb3dzXT1cIlBBR0VfU0laRVwiXG5cbiAgICAgICAgICBbdG90YWxSZWNvcmRzXT1cIm1hZ2ljTW9tZW50Lmxlbmd0aFwiXG4gICAgICAgICAgW2xhenldPVwidHJ1ZVwiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cbiAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiPnt7ICdDcm0uU3VtbWFyeS5Pd25lcicgfCB0cmFuc2xvY28gfX08L3RoPlxuICAgICAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCI+e3sgJ0NybS5TdW1tYXJ5LkNvbnRhY3ROYW1lJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQ3JtLlN1bW1hcnkuT3JnYW5pc2F0aW9uJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQ3JtLlN1bW1hcnkuQ29udGFjdEVtYWlsJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIlxuICAgICAgICAgICAgbGV0LWFjY291bnQ+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJPd25lclwiPlxuICAgICAgICAgICAgICAgIHt7IGFjY291bnQub3duZXI/LmZpcnN0X25hbWUgfX0ge3sgYWNjb3VudC5vd25lcj8ubGFzdF9uYW1lIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJDb250YWN0IE5hbWVcIj5cbiAgICAgICAgICAgICAgICB7eyBhY2NvdW50LmNvbnRhY3RfbmFtZSB9fVxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiT3JnYW5pc2F0aW9uXCI+XG4gICAgICAgICAgICAgICAge3sgYWNjb3VudC5uYW1lIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJDb250YWN0IEVtYWlsXCI+XG4gICAgICAgICAgICAgICAge3sgYWNjb3VudC5jb250YWN0X2VtYWlsIH19XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvcC10YWJsZT5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b3RhbC1yZWNvcmRzLWNvdW50XCIgKm5nSWY9XCJtYWdpY01vbWVudC5sZW5ndGggIT09MCBcIj57eyAnTGFiZWwuVG90YWwnIHwgdHJhbnNsb2NvIH19OiB7eyBtYWdpY01vbWVudC5sZW5ndGggfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgKm5nSWY9XCJtYWdpY01vbWVudD8ubGVuZ3RoID09PSAwXCI+XG4gICAgICAgIDxwdy1uby1kYXRhIFt3aXRoSW1hZ2VdPVwidHJ1ZVwiIFttZXNzYWdlXT1cIidDcm0uU3VtbWFyeS5Ob0luc2lnaHRNZXNzYWdlJyB8IHRyYW5zbG9jb1wiPiA8L3B3LW5vLWRhdGE+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG48L2Rpdj5cbiJdfQ==
|