ng-kinintel 0.0.397 → 20.0.2
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/fesm2022/ng-kinintel.mjs +11874 -0
- package/fesm2022/ng-kinintel.mjs.map +1 -0
- package/index.d.ts +2818 -5
- package/package.json +6 -14
- package/esm2020/lib/components/alert-groups/alert-groups.component.mjs +0 -76
- package/esm2020/lib/components/alert-groups/edit-alert-group/edit-alert-group.component.mjs +0 -83
- package/esm2020/lib/components/dashboard-editor/configure-item/configure-item.component.mjs +0 -853
- package/esm2020/lib/components/dashboard-editor/configure-item/edit-dashboard-alert/edit-dashboard-alert.component.mjs +0 -56
- package/esm2020/lib/components/dashboard-editor/configure-item/html-documentation/html-documentation.component.mjs +0 -114
- package/esm2020/lib/components/dashboard-editor/configure-item/table-cell-formatter/table-cell-formatter.component.mjs +0 -163
- package/esm2020/lib/components/dashboard-editor/configure-item/vis-network-options.json +0 -135
- package/esm2020/lib/components/dashboard-editor/dashboard-editor.component.mjs +0 -580
- package/esm2020/lib/components/dashboard-editor/dashboard-parameter/dashboard-parameter.component.mjs +0 -15
- package/esm2020/lib/components/dashboard-editor/dashboard-settings/dashboard-settings.component.mjs +0 -50
- package/esm2020/lib/components/dashboard-editor/item-component/item-component.component.mjs +0 -1226
- package/esm2020/lib/components/dashboard-editor/source-selector-dialog/source-selector-dialog.component.mjs +0 -111
- package/esm2020/lib/components/dashboards/dashboards.component.mjs +0 -163
- package/esm2020/lib/components/dashboards/view-dashboard/view-dashboard.component.mjs +0 -429
- package/esm2020/lib/components/data-explorer/change-source-warning/change-source-warning.component.mjs +0 -20
- package/esm2020/lib/components/data-explorer/data-explorer.component.mjs +0 -243
- package/esm2020/lib/components/data-explorer/export-data/export-data.component.mjs +0 -62
- package/esm2020/lib/components/data-explorer/snapshot-api-access/snapshot-api-access.component.mjs +0 -70
- package/esm2020/lib/components/data-explorer/snapshot-profile-dialog/snapshot-profile-dialog.component.mjs +0 -190
- package/esm2020/lib/components/data-picker/data-picker.component.mjs +0 -79
- package/esm2020/lib/components/data-search/data-search.component.mjs +0 -11
- package/esm2020/lib/components/data-sharing-invite/data-sharing-invite.component.mjs +0 -52
- package/esm2020/lib/components/dataset/create-dataset/create-dataset.component.mjs +0 -47
- package/esm2020/lib/components/dataset/dataset-editor/available-columns/available-columns.component.mjs +0 -28
- package/esm2020/lib/components/dataset/dataset-editor/dataset-add-join/dataset-add-join.component.mjs +0 -344
- package/esm2020/lib/components/dataset/dataset-editor/dataset-column-settings/dataset-column-editor/dataset-column-editor.component.mjs +0 -80
- package/esm2020/lib/components/dataset/dataset-editor/dataset-column-settings/dataset-column-settings.component.mjs +0 -54
- package/esm2020/lib/components/dataset/dataset-editor/dataset-create-formula/dataset-create-formula.component.mjs +0 -67
- package/esm2020/lib/components/dataset/dataset-editor/dataset-editor.component.mjs +0 -1134
- package/esm2020/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter/dataset-filter.component.mjs +0 -201
- package/esm2020/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter-inclusion/dataset-filter-inclusion.component.mjs +0 -25
- package/esm2020/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter-junction/dataset-filter-junction.component.mjs +0 -72
- package/esm2020/lib/components/dataset/dataset-editor/dataset-filters/dataset-filters.component.mjs +0 -62
- package/esm2020/lib/components/dataset/dataset-editor/dataset-name-dialog/dataset-name-dialog.component.mjs +0 -41
- package/esm2020/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-add-parameter/dataset-add-parameter.component.mjs +0 -78
- package/esm2020/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-type/dataset-parameter-type.component.mjs +0 -39
- package/esm2020/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-values.component.mjs +0 -75
- package/esm2020/lib/components/dataset/dataset-editor/dataset-summarise/dataset-summarise.component.mjs +0 -107
- package/esm2020/lib/components/dataset/dataset-editor/move-transformation-confirmation/move-transformation-confirmation.component.mjs +0 -20
- package/esm2020/lib/components/dataset/dataset-editor/remove-transformation-warning/remove-transformation-warning.component.mjs +0 -20
- package/esm2020/lib/components/dataset/dataset-editor/save-as-query/save-as-query.component.mjs +0 -58
- package/esm2020/lib/components/dataset/dataset-editor/share-query/share-query.component.mjs +0 -110
- package/esm2020/lib/components/dataset/dataset-editor/upstream-changes-confirmation/upstream-changes-confirmation.component.mjs +0 -20
- package/esm2020/lib/components/dataset/dataset.component.mjs +0 -294
- package/esm2020/lib/components/datasource/create-datasource/advanced-settings/advanced-settings.component.mjs +0 -130
- package/esm2020/lib/components/datasource/create-datasource/api-access/api-access.component.mjs +0 -132
- package/esm2020/lib/components/datasource/create-datasource/create-datasource.component.mjs +0 -729
- package/esm2020/lib/components/datasource/create-datasource/import-data/import-data.component.mjs +0 -146
- package/esm2020/lib/components/datasource/create-datasource/import-data/import-wizard/import-wizard.component.mjs +0 -165
- package/esm2020/lib/components/datasource/create-datasource/tabular-datasource/tabular-datasource.component.mjs +0 -145
- package/esm2020/lib/components/datasource/datasource.component.mjs +0 -162
- package/esm2020/lib/components/datasource/document-datasource/document-datasource.component.mjs +0 -297
- package/esm2020/lib/components/export-project/export-project.component.mjs +0 -29
- package/esm2020/lib/components/feeds/feed/feed.component.mjs +0 -92
- package/esm2020/lib/components/feeds/feeds.component.mjs +0 -145
- package/esm2020/lib/components/job-tasks/job-tasks.component.mjs +0 -25
- package/esm2020/lib/components/marketplace/marketplace.component.mjs +0 -65
- package/esm2020/lib/components/metadata/metadata.component.mjs +0 -65
- package/esm2020/lib/components/notification-groups/edit-notification-group/edit-notification-group.component.mjs +0 -113
- package/esm2020/lib/components/notification-groups/notification-groups.component.mjs +0 -86
- package/esm2020/lib/components/project-picker/project-picker.component.mjs +0 -118
- package/esm2020/lib/components/project-settings/project-link-selection/project-link-selection.component.mjs +0 -104
- package/esm2020/lib/components/project-settings/project-settings.component.mjs +0 -155
- package/esm2020/lib/components/query-caching/edit-query-cache/edit-query-cache.component.mjs +0 -51
- package/esm2020/lib/components/query-caching/query-cache-view/query-cache-view.component.mjs +0 -121
- package/esm2020/lib/components/query-caching/query-caching.component.mjs +0 -162
- package/esm2020/lib/components/shared-with-me/feed-api-modal/feed-api-modal.component.mjs +0 -45
- package/esm2020/lib/components/shared-with-me/shared-with-me.component.mjs +0 -174
- package/esm2020/lib/components/snapshots/snapshots.component.mjs +0 -244
- package/esm2020/lib/components/tag-picker/tag-picker.component.mjs +0 -74
- package/esm2020/lib/components/task-time-periods/task-time-periods.component.mjs +0 -55
- package/esm2020/lib/components/whitelisted-sql-functions/whitelisted-sql-functions.component.mjs +0 -40
- package/esm2020/lib/guards/dashboard-changes.guard.mjs +0 -22
- package/esm2020/lib/kinintel-config.mjs +0 -3
- package/esm2020/lib/ng-kinintel.module.mjs +0 -437
- package/esm2020/lib/objects/action-event.mjs +0 -16
- package/esm2020/lib/services/alert.service.mjs +0 -52
- package/esm2020/lib/services/dashboard.service.mjs +0 -75
- package/esm2020/lib/services/data-processor.service.mjs +0 -56
- package/esm2020/lib/services/data-search.service.mjs +0 -36
- package/esm2020/lib/services/dataset.service.mjs +0 -187
- package/esm2020/lib/services/datasource.service.mjs +0 -93
- package/esm2020/lib/services/external.service.mjs +0 -33
- package/esm2020/lib/services/feed.service.mjs +0 -50
- package/esm2020/lib/services/notification.service.mjs +0 -41
- package/esm2020/lib/services/project.service.mjs +0 -130
- package/esm2020/lib/services/tag.service.mjs +0 -63
- package/esm2020/ng-kinintel.mjs +0 -5
- package/esm2020/public-api.mjs +0 -43
- package/fesm2015/ng-kinintel.mjs +0 -12182
- package/fesm2015/ng-kinintel.mjs.map +0 -1
- package/fesm2020/ng-kinintel.mjs +0 -11872
- package/fesm2020/ng-kinintel.mjs.map +0 -1
- package/lib/components/alert-groups/alert-groups.component.d.ts +0 -30
- package/lib/components/alert-groups/edit-alert-group/edit-alert-group.component.d.ts +0 -28
- package/lib/components/dashboard-editor/configure-item/configure-item.component.d.ts +0 -256
- package/lib/components/dashboard-editor/configure-item/edit-dashboard-alert/edit-dashboard-alert.component.d.ts +0 -16
- package/lib/components/dashboard-editor/configure-item/html-documentation/html-documentation.component.d.ts +0 -59
- package/lib/components/dashboard-editor/configure-item/table-cell-formatter/table-cell-formatter.component.d.ts +0 -26
- package/lib/components/dashboard-editor/dashboard-editor.component.d.ts +0 -85
- package/lib/components/dashboard-editor/dashboard-parameter/dashboard-parameter.component.d.ts +0 -8
- package/lib/components/dashboard-editor/dashboard-settings/dashboard-settings.component.d.ts +0 -22
- package/lib/components/dashboard-editor/item-component/item-component.component.d.ts +0 -264
- package/lib/components/dashboard-editor/source-selector-dialog/source-selector-dialog.component.d.ts +0 -30
- package/lib/components/dashboards/dashboards.component.d.ts +0 -56
- package/lib/components/dashboards/view-dashboard/view-dashboard.component.d.ts +0 -81
- package/lib/components/data-explorer/change-source-warning/change-source-warning.component.d.ts +0 -11
- package/lib/components/data-explorer/data-explorer.component.d.ts +0 -61
- package/lib/components/data-explorer/export-data/export-data.component.d.ts +0 -17
- package/lib/components/data-explorer/snapshot-api-access/snapshot-api-access.component.d.ts +0 -25
- package/lib/components/data-explorer/snapshot-profile-dialog/snapshot-profile-dialog.component.d.ts +0 -44
- package/lib/components/data-picker/data-picker.component.d.ts +0 -32
- package/lib/components/data-search/data-search.component.d.ts +0 -5
- package/lib/components/data-sharing-invite/data-sharing-invite.component.d.ts +0 -21
- package/lib/components/dataset/create-dataset/create-dataset.component.d.ts +0 -17
- package/lib/components/dataset/dataset-editor/available-columns/available-columns.component.d.ts +0 -12
- package/lib/components/dataset/dataset-editor/dataset-add-join/dataset-add-join.component.d.ts +0 -61
- package/lib/components/dataset/dataset-editor/dataset-column-settings/dataset-column-editor/dataset-column-editor.component.d.ts +0 -21
- package/lib/components/dataset/dataset-editor/dataset-column-settings/dataset-column-settings.component.d.ts +0 -20
- package/lib/components/dataset/dataset-editor/dataset-create-formula/dataset-create-formula.component.d.ts +0 -19
- package/lib/components/dataset/dataset-editor/dataset-editor.component.d.ts +0 -131
- package/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter/dataset-filter.component.d.ts +0 -63
- package/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter-inclusion/dataset-filter-inclusion.component.d.ts +0 -11
- package/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter-junction/dataset-filter-junction.component.d.ts +0 -20
- package/lib/components/dataset/dataset-editor/dataset-filters/dataset-filters.component.d.ts +0 -16
- package/lib/components/dataset/dataset-editor/dataset-name-dialog/dataset-name-dialog.component.d.ts +0 -18
- package/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-add-parameter/dataset-add-parameter.component.d.ts +0 -23
- package/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-type/dataset-parameter-type.component.d.ts +0 -13
- package/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-values.component.d.ts +0 -22
- package/lib/components/dataset/dataset-editor/dataset-summarise/dataset-summarise.component.d.ts +0 -27
- package/lib/components/dataset/dataset-editor/move-transformation-confirmation/move-transformation-confirmation.component.d.ts +0 -11
- package/lib/components/dataset/dataset-editor/remove-transformation-warning/remove-transformation-warning.component.d.ts +0 -11
- package/lib/components/dataset/dataset-editor/save-as-query/save-as-query.component.d.ts +0 -25
- package/lib/components/dataset/dataset-editor/share-query/share-query.component.d.ts +0 -41
- package/lib/components/dataset/dataset-editor/upstream-changes-confirmation/upstream-changes-confirmation.component.d.ts +0 -11
- package/lib/components/dataset/dataset.component.d.ts +0 -74
- package/lib/components/datasource/create-datasource/advanced-settings/advanced-settings.component.d.ts +0 -26
- package/lib/components/datasource/create-datasource/api-access/api-access.component.d.ts +0 -31
- package/lib/components/datasource/create-datasource/create-datasource.component.d.ts +0 -112
- package/lib/components/datasource/create-datasource/import-data/import-data.component.d.ts +0 -28
- package/lib/components/datasource/create-datasource/import-data/import-wizard/import-wizard.component.d.ts +0 -40
- package/lib/components/datasource/create-datasource/tabular-datasource/tabular-datasource.component.d.ts +0 -34
- package/lib/components/datasource/datasource.component.d.ts +0 -46
- package/lib/components/datasource/document-datasource/document-datasource.component.d.ts +0 -64
- package/lib/components/export-project/export-project.component.d.ts +0 -9
- package/lib/components/feeds/feed/feed.component.d.ts +0 -30
- package/lib/components/feeds/feeds.component.d.ts +0 -47
- package/lib/components/job-tasks/job-tasks.component.d.ts +0 -11
- package/lib/components/marketplace/marketplace.component.d.ts +0 -42
- package/lib/components/metadata/metadata.component.d.ts +0 -24
- package/lib/components/notification-groups/edit-notification-group/edit-notification-group.component.d.ts +0 -37
- package/lib/components/notification-groups/notification-groups.component.d.ts +0 -28
- package/lib/components/project-picker/project-picker.component.d.ts +0 -37
- package/lib/components/project-settings/project-link-selection/project-link-selection.component.d.ts +0 -32
- package/lib/components/project-settings/project-settings.component.d.ts +0 -40
- package/lib/components/query-caching/edit-query-cache/edit-query-cache.component.d.ts +0 -17
- package/lib/components/query-caching/query-cache-view/query-cache-view.component.d.ts +0 -35
- package/lib/components/query-caching/query-caching.component.d.ts +0 -38
- package/lib/components/shared-with-me/feed-api-modal/feed-api-modal.component.d.ts +0 -21
- package/lib/components/shared-with-me/shared-with-me.component.d.ts +0 -43
- package/lib/components/snapshots/snapshots.component.d.ts +0 -52
- package/lib/components/tag-picker/tag-picker.component.d.ts +0 -27
- package/lib/components/task-time-periods/task-time-periods.component.d.ts +0 -20
- package/lib/components/whitelisted-sql-functions/whitelisted-sql-functions.component.d.ts +0 -17
- package/lib/guards/dashboard-changes.guard.d.ts +0 -11
- package/lib/kinintel-config.d.ts +0 -10
- package/lib/ng-kinintel.module.d.ts +0 -116
- package/lib/objects/action-event.d.ts +0 -12
- package/lib/services/alert.service.d.ts +0 -17
- package/lib/services/dashboard.service.d.ts +0 -25
- package/lib/services/data-processor.service.d.ts +0 -18
- package/lib/services/data-search.service.d.ts +0 -14
- package/lib/services/dataset.service.d.ts +0 -56
- package/lib/services/datasource.service.d.ts +0 -34
- package/lib/services/external.service.d.ts +0 -12
- package/lib/services/feed.service.d.ts +0 -19
- package/lib/services/notification.service.d.ts +0 -16
- package/lib/services/project.service.d.ts +0 -27
- package/lib/services/tag.service.d.ts +0 -19
- package/public-api.d.ts +0 -38
|
@@ -1,294 +0,0 @@
|
|
|
1
|
-
import { Component, Inject, Input } from '@angular/core';
|
|
2
|
-
import { BehaviorSubject, merge, Subject } from 'rxjs';
|
|
3
|
-
import { debounceTime, map, switchMap } from 'rxjs/operators';
|
|
4
|
-
import { DataExplorerComponent } from '../data-explorer/data-explorer.component';
|
|
5
|
-
import { KININTEL_CONFIG } from '../../kinintel-config';
|
|
6
|
-
import * as lodash from 'lodash';
|
|
7
|
-
import { MetadataComponent } from '../metadata/metadata.component';
|
|
8
|
-
import { CreateDatasetComponent } from './create-dataset/create-dataset.component';
|
|
9
|
-
import * as i0 from "@angular/core";
|
|
10
|
-
import * as i1 from "@angular/material/legacy-dialog";
|
|
11
|
-
import * as i2 from "../../services/tag.service";
|
|
12
|
-
import * as i3 from "../../services/project.service";
|
|
13
|
-
import * as i4 from "../../services/dataset.service";
|
|
14
|
-
import * as i5 from "@angular/router";
|
|
15
|
-
import * as i6 from "@angular/common";
|
|
16
|
-
import * as i7 from "@angular/material/legacy-button";
|
|
17
|
-
import * as i8 from "@angular/material/icon";
|
|
18
|
-
import * as i9 from "@angular/material/legacy-menu";
|
|
19
|
-
import * as i10 from "@angular/forms";
|
|
20
|
-
import * as i11 from "@angular/material/button-toggle";
|
|
21
|
-
const _ = lodash.default;
|
|
22
|
-
export class DatasetComponent {
|
|
23
|
-
constructor(dialog, tagService, projectService, datasetService, router, route, config, location) {
|
|
24
|
-
this.dialog = dialog;
|
|
25
|
-
this.tagService = tagService;
|
|
26
|
-
this.projectService = projectService;
|
|
27
|
-
this.datasetService = datasetService;
|
|
28
|
-
this.router = router;
|
|
29
|
-
this.route = route;
|
|
30
|
-
this.config = config;
|
|
31
|
-
this.location = location;
|
|
32
|
-
this.listStyle = 'LIST';
|
|
33
|
-
this.datasets = [];
|
|
34
|
-
this.searchText = new BehaviorSubject('');
|
|
35
|
-
this.limit = 10;
|
|
36
|
-
this.offset = 0;
|
|
37
|
-
this.page = 1;
|
|
38
|
-
this.endOfResults = false;
|
|
39
|
-
this.categories = [];
|
|
40
|
-
this.filteredCategories = [];
|
|
41
|
-
this.Date = Date;
|
|
42
|
-
this.activeTagSub = new Subject();
|
|
43
|
-
this.projectSub = new Subject();
|
|
44
|
-
this.loading = true;
|
|
45
|
-
this.gridItems = {};
|
|
46
|
-
this.projectSettings = {};
|
|
47
|
-
this.Object = Object;
|
|
48
|
-
}
|
|
49
|
-
async ngOnInit() {
|
|
50
|
-
this.activeProject = this.projectService.activeProject.getValue();
|
|
51
|
-
this.activeProjectSub = this.projectService.activeProject.subscribe(activeProject => {
|
|
52
|
-
this.activeProject = activeProject;
|
|
53
|
-
this.projectSettings = (this.activeProject && this.activeProject.settings) ? (Array.isArray(this.activeProject.settings) ? {
|
|
54
|
-
hideExisting: false, shortcutPosition: 'after', homeDashboard: {}, shortcutsMenu: []
|
|
55
|
-
} : this.activeProject.settings) : {
|
|
56
|
-
hideExisting: false, shortcutPosition: 'after', homeDashboard: {}, shortcutsMenu: []
|
|
57
|
-
};
|
|
58
|
-
const listKey = this.getCurrentPathListKey();
|
|
59
|
-
if (this.projectSettings[listKey]) {
|
|
60
|
-
this.listStyle = this.projectSettings[listKey];
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
this.searchText.subscribe(() => {
|
|
64
|
-
this.page = 1;
|
|
65
|
-
this.offset = 0;
|
|
66
|
-
});
|
|
67
|
-
const pagingValues = this.projectService.getDataItemPagingValues();
|
|
68
|
-
this.limit = pagingValues.limit || 10;
|
|
69
|
-
this.offset = pagingValues.offset || 0;
|
|
70
|
-
this.page = pagingValues.page || 1;
|
|
71
|
-
this.route.params.subscribe(param => {
|
|
72
|
-
if (param.id) {
|
|
73
|
-
this.view(param.id);
|
|
74
|
-
}
|
|
75
|
-
});
|
|
76
|
-
if (!this.reload) {
|
|
77
|
-
this.reload = new Subject();
|
|
78
|
-
}
|
|
79
|
-
if (this.tagService) {
|
|
80
|
-
this.activeTagSub = this.tagService.activeTag;
|
|
81
|
-
this.tagSub = this.tagService.activeTag.subscribe(tag => this.activeTag = tag);
|
|
82
|
-
}
|
|
83
|
-
if (this.projectService) {
|
|
84
|
-
this.projectSub = this.projectService.activeProject;
|
|
85
|
-
}
|
|
86
|
-
this.getCategories();
|
|
87
|
-
merge(this.searchText, this.activeTagSub, this.projectSub, this.reload)
|
|
88
|
-
.pipe(debounceTime(300),
|
|
89
|
-
// distinctUntilChanged(),
|
|
90
|
-
switchMap(() => this.getDatasets())).subscribe((datasets) => {
|
|
91
|
-
this.datasets = datasets;
|
|
92
|
-
if (this.categories.length) {
|
|
93
|
-
this.gridItems = {};
|
|
94
|
-
this.categories.forEach(category => {
|
|
95
|
-
const items = _.filter(datasets, dataset => {
|
|
96
|
-
return !!_.find(dataset.categories, { key: category.key });
|
|
97
|
-
});
|
|
98
|
-
this.gridItems[category.key] = {
|
|
99
|
-
key: category.key,
|
|
100
|
-
title: category.category,
|
|
101
|
-
list: items
|
|
102
|
-
};
|
|
103
|
-
});
|
|
104
|
-
const otherItems = _.filter(datasets, dataset => {
|
|
105
|
-
return !dataset.categories || !dataset.categories.length;
|
|
106
|
-
});
|
|
107
|
-
this.gridItems.other = {
|
|
108
|
-
key: 'other',
|
|
109
|
-
title: 'Other',
|
|
110
|
-
list: otherItems
|
|
111
|
-
};
|
|
112
|
-
}
|
|
113
|
-
else {
|
|
114
|
-
this.listStyle = 'LIST';
|
|
115
|
-
}
|
|
116
|
-
this.loading = false;
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
ngOnDestroy() {
|
|
120
|
-
if (this.tagSub) {
|
|
121
|
-
this.tagSub.unsubscribe();
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
view(datasetId) {
|
|
125
|
-
this.datasetService.getDataset(datasetId).then(datasetInstanceSummary => {
|
|
126
|
-
this.viewDataset(datasetInstanceSummary);
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
extend(id) {
|
|
130
|
-
this.datasetService.getExtendedDataset(id).then(datasetInstanceSummary => {
|
|
131
|
-
this.viewDataset(datasetInstanceSummary);
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
removeActiveTag() {
|
|
135
|
-
this.tagService.resetActiveTag();
|
|
136
|
-
}
|
|
137
|
-
updateListStyle() {
|
|
138
|
-
if (!this.admin) {
|
|
139
|
-
this.datasets = [];
|
|
140
|
-
const listKey = this.getCurrentPathListKey();
|
|
141
|
-
this.projectSettings[listKey] = this.listStyle;
|
|
142
|
-
this.projectService.updateProjectSettings(this.activeProject.projectKey, this.projectSettings);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
toggleCategory(event, category) {
|
|
146
|
-
event.stopPropagation();
|
|
147
|
-
category.checked = !category.checked;
|
|
148
|
-
this.updateCategoryFilters();
|
|
149
|
-
}
|
|
150
|
-
updateCategoryFilters() {
|
|
151
|
-
this.offset = 0;
|
|
152
|
-
this.page = 1;
|
|
153
|
-
this.reload.next(Date.now());
|
|
154
|
-
}
|
|
155
|
-
delete(datasetId) {
|
|
156
|
-
const message = 'Are you sure you would like to remove this Dataset?';
|
|
157
|
-
if (window.confirm(message)) {
|
|
158
|
-
this.datasetService.removeDataset(datasetId).then(() => {
|
|
159
|
-
this.reload.next(Date.now());
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
increaseOffset() {
|
|
164
|
-
this.page = this.page + 1;
|
|
165
|
-
this.offset = (this.limit * this.page) - this.limit;
|
|
166
|
-
this.reload.next(Date.now());
|
|
167
|
-
}
|
|
168
|
-
decreaseOffset() {
|
|
169
|
-
this.page = this.page <= 1 ? 1 : this.page - 1;
|
|
170
|
-
this.offset = (this.limit * this.page) - this.limit;
|
|
171
|
-
this.reload.next(Date.now());
|
|
172
|
-
}
|
|
173
|
-
pageSizeChange(value) {
|
|
174
|
-
this.page = 1;
|
|
175
|
-
this.offset = 0;
|
|
176
|
-
this.limit = value;
|
|
177
|
-
this.reload.next(Date.now());
|
|
178
|
-
}
|
|
179
|
-
editMetadata(searchResult) {
|
|
180
|
-
const dialogRef = this.dialog.open(MetadataComponent, {
|
|
181
|
-
width: '700px',
|
|
182
|
-
height: '900px',
|
|
183
|
-
data: {
|
|
184
|
-
metadata: _.clone(searchResult),
|
|
185
|
-
service: this.datasetService
|
|
186
|
-
}
|
|
187
|
-
});
|
|
188
|
-
dialogRef.afterClosed().subscribe(res => {
|
|
189
|
-
if (res) {
|
|
190
|
-
this.reload.next(Date.now());
|
|
191
|
-
this.getCategories();
|
|
192
|
-
}
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
create() {
|
|
196
|
-
const dialogRef = this.dialog.open(CreateDatasetComponent, {
|
|
197
|
-
width: '1200px',
|
|
198
|
-
height: '800px',
|
|
199
|
-
data: {
|
|
200
|
-
admin: this.admin,
|
|
201
|
-
accountId: this.accountId
|
|
202
|
-
}
|
|
203
|
-
});
|
|
204
|
-
dialogRef.afterClosed().subscribe(res => {
|
|
205
|
-
if (res) {
|
|
206
|
-
this.viewDataset(res);
|
|
207
|
-
}
|
|
208
|
-
});
|
|
209
|
-
}
|
|
210
|
-
viewDataset(datasetInstanceSummary) {
|
|
211
|
-
this.router.navigate([this.url || '/dataset'], { fragment: _.kebabCase(datasetInstanceSummary.title) });
|
|
212
|
-
const dialogRef = this.dialog.open(DataExplorerComponent, {
|
|
213
|
-
width: '100vw',
|
|
214
|
-
height: '100vh',
|
|
215
|
-
maxWidth: '100vw',
|
|
216
|
-
maxHeight: '100vh',
|
|
217
|
-
hasBackdrop: false,
|
|
218
|
-
closeOnNavigation: true,
|
|
219
|
-
data: {
|
|
220
|
-
datasetInstanceSummary,
|
|
221
|
-
backendUrl: this.backendUrl,
|
|
222
|
-
showChart: false,
|
|
223
|
-
admin: this.admin,
|
|
224
|
-
newTitle: this.newTitle ? this.newTitle + ' Name' : null,
|
|
225
|
-
newDescription: this.newDescription || null,
|
|
226
|
-
accountId: this.accountId,
|
|
227
|
-
breadcrumb: this.headingLabel || 'Datasets',
|
|
228
|
-
url: this.url
|
|
229
|
-
}
|
|
230
|
-
});
|
|
231
|
-
dialogRef.afterClosed().subscribe(res => {
|
|
232
|
-
if (res) {
|
|
233
|
-
if (res.breadcrumb) {
|
|
234
|
-
return this.router.navigate([res.breadcrumb], { fragment: null });
|
|
235
|
-
}
|
|
236
|
-
this.router.navigate([this.url || '/dataset'], { fragment: null });
|
|
237
|
-
this.reload.next(Date.now());
|
|
238
|
-
}
|
|
239
|
-
});
|
|
240
|
-
}
|
|
241
|
-
getDatasets() {
|
|
242
|
-
this.projectService.setDataItemPagingValue(this.limit, this.offset, this.page);
|
|
243
|
-
const checkedCategories = _.filter(this.categories, 'checked');
|
|
244
|
-
return this.datasetService.getDatasets(this.searchText.getValue() || '', this.listStyle === 'GRID' ? '1000' : this.limit.toString(), this.listStyle === 'GRID' ? '0' : this.offset.toString(), this.shared ? null : (!_.isNil(this.accountId) ? this.accountId : ''), '', _.map(checkedCategories, 'key')).pipe(map((datasets) => {
|
|
245
|
-
this.endOfResults = datasets.length < this.limit;
|
|
246
|
-
return datasets;
|
|
247
|
-
}));
|
|
248
|
-
}
|
|
249
|
-
getCategories() {
|
|
250
|
-
return this.datasetService.getDatasetCategories(this.shared).then(categories => this.categories = categories);
|
|
251
|
-
}
|
|
252
|
-
getCurrentPathListKey() {
|
|
253
|
-
const currentPath = this.location.path().replace('/', '-');
|
|
254
|
-
return _.camelCase('listStyle' + currentPath);
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
DatasetComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DatasetComponent, deps: [{ token: i1.MatLegacyDialog }, { token: i2.TagService }, { token: i3.ProjectService }, { token: i4.DatasetService }, { token: i5.Router }, { token: i5.ActivatedRoute }, { token: KININTEL_CONFIG }, { token: i6.Location }], target: i0.ɵɵFactoryTarget.Component });
|
|
258
|
-
DatasetComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: DatasetComponent, selector: "ki-dataset", inputs: { headingLabel: "headingLabel", headingDescription: "headingDescription", backendUrl: "backendUrl", newTitle: "newTitle", newDescription: "newDescription", hideCreate: "hideCreate", shared: "shared", admin: "admin", reload: "reload", url: "url", accountId: "accountId", contactUs: "contactUs", tableHeading: "tableHeading", listStyle: "listStyle" }, ngImport: i0, template: "<div class=\"p-6 bg-white border-b border-gray-200\">\n <div class=\"md:flex md:items-center md:justify-between md:space-x-5\">\n <div class=\"flex items-start flex-1\">\n <div class=\"pt-1.5\">\n <h1 class=\"text-2xl font-bold text-gray-900\">\n <div>{{headingLabel || 'Datasets'}}</div>\n </h1>\n <p class=\"text-sm font-medium text-gray-500\">\n <span *ngIf=\"headingDescription\" [innerHTML]=\"headingDescription\"></span>\n <ng-template [ngIf]=\"!headingDescription\">\n A list of all the <span class=\"lowercase\">{{headingLabel || 'datasets'}}</span> currently\n available.\n </ng-template>\n </p>\n </div>\n </div>\n <div class=\"mt-6 flex flex-col-reverse justify-stretch\" *ngIf=\"!hideCreate\">\n <button type=\"button\" (click)=\"create()\"\n class=\"inline-flex items-center justify-center px-4 py-2 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-primary focus:outline-none\">\n Create {{newTitle || 'Dataset'}}\n </button>\n </div>\n </div>\n</div>\n\n<div class=\"px-4 sm:px-6 lg:px-8 mt-0\">\n <div class=\"flex flex-col\">\n <div class=\"-my-2 -mx-4 sm:-mx-6 lg:-mx-8\">\n <div class=\"inline-block min-w-full py-2 align-middle\">\n <div class=\"mt-3 sm:mt-0 flex-1\">\n <label for=\"mobile-search-candidate\" class=\"sr-only\">Search</label>\n <div class=\"flex\">\n <div class=\"relative bg-white flex items-center flex-grow focus-within:z-10\">\n <div class=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n <svg class=\"h-5 w-5 text-gray-400\" xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </div>\n <input type=\"text\" name=\"mobile-search-candidate\" id=\"mobile-search-candidate\"\n class=\"block w-full rounded-none pl-10 border-t-0 border-l-0 border-gray-300\"\n placeholder=\"Search {{shared ? 'data feeds' : 'stored queries'}}\"\n (keyup)=\"searchText.next($event.target.value)\">\n\n <div class=\"border-b h-full\">\n <mat-button-toggle-group [disabled]=\"!categories.length\"\n class=\"list-switcher h-full rounded-none border-none\"\n [(ngModel)]=\"listStyle\" (ngModelChange)=\"updateListStyle()\">\n <mat-button-toggle value=\"GRID\" [ngClass]=\"{'opacity-50': !categories.length}\"\n class=\"rounded-none h-full flex items-center\">\n <mat-icon>grid_view</mat-icon>\n </mat-button-toggle>\n <mat-button-toggle value=\"LIST\" [ngClass]=\"{'opacity-50': !categories.length}\"\n class=\"rounded-none h-full flex items-center\">\n <mat-icon>reorder</mat-icon>\n </mat-button-toggle>\n </mat-button-toggle-group>\n </div>\n\n\n </div>\n </div>\n </div>\n <table class=\"min-w-full border-separate\" *ngIf=\"datasets.length && listStyle === 'LIST'\"\n style=\"border-spacing: 0\">\n <tbody class=\"bg-white\">\n <ng-template [ngIf]=\"datasets.length\">\n <tr class=\"border-t border-gray-200\">\n <th scope=\"colgroup\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-100 pl-4 text-left text-xs font-semibold text-gray-900\">\n <div class=\"w-full flex items-center justify-between\">\n <div>{{tableHeading || 'Datasets'}}</div>\n </div>\n </th>\n <th scope=\"colgroup\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-100 pl-4 text-left text-xs font-semibold text-gray-900\">\n </th>\n <th scope=\"colgroup\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-100 pl-4 text-right text-xs font-semibold text-gray-900\">\n <button type=\"button\" [matMenuTriggerFor]=\"projectCategories\"\n [disabled]=\"!categories.length\"\n class=\"disabled:opacity-50 -ml-px relative inline-flex items-center py-3 px-4 border-l border-gray-300 text-sm font-medium text-gray-700 bg-gray-100 hover:bg-gray-200 focus:outline-none border-t-0 border-r-0\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"h-5 w-5 text-gray-400\"\n viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fill-rule=\"evenodd\"\n d=\"M3 3a1 1 0 011-1h12a1 1 0 011 1v3a1 1 0 01-.293.707L12 11.414V15a1 1 0 01-.293.707l-2 2A1 1 0 018 17v-5.586L3.293 6.707A1 1 0 013 6V3z\"\n clip-rule=\"evenodd\"/>\n </svg>\n <span class=\"ml-2\">Categories</span>\n <svg class=\"ml-2.5 -mr-1.5 h-5 w-5 text-gray-400\"\n xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\"\n aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </button>\n <mat-menu #projectCategories=\"matMenu\">\n <button (click)=\"toggleCategory($event, category)\"\n mat-menu-item *ngFor=\"let category of categories\">\n <div class=\"flex items-center\">\n <mat-icon color=\"primary\" *ngIf=\"category.checked\">check_box</mat-icon>\n <mat-icon *ngIf=\"!category.checked\">check_box_outline_blank</mat-icon>\n {{category.category}}\n </div>\n </button>\n </mat-menu>\n </th>\n </tr>\n <tr *ngFor=\"let element of datasets; let i = index\" class=\"hover:bg-gray-50\"\n [ngClass]=\"{}\">\n <td class=\"border-gray-200 py-2 px-4 text-sm w-1/2 text-gray-900\"\n [ngClass]=\"{'border-b-0': i === datasets.length - 1, 'border-b': i !== datasets.length - 1,'opacity-50': (element.enabled === undefined ? false : !element.enabled) && !admin}\">\n <div class=\"flex flex-col\">\n <div *ngIf=\"element.enabled || admin\"\n class=\"item-title-select flex items-center font-medium cursor-pointer hover:underline\"\n (click)=\"shared ? extend(element.id) : view(element.id)\">\n {{element.title}}\n </div>\n <div *ngIf=\"!element.enabled && !admin\"\n class=\"item-title-select flex items-center font-medium\">\n {{element.title}}\n </div>\n <div (click)=\"element.viewDescription = !element.viewDescription\"\n class=\"text-gray-400 font-thin cursor-pointer hover:underline\">\n {{element.summary}}\n </div>\n <div *ngIf=\"element.viewDescription && element.description\" class=\"mt-4\"\n [innerHTML]=\"element.description\"></div>\n </div>\n </td>\n <td class=\"border-gray-200 py-2 px-4 text-sm text-gray-900\"\n [ngClass]=\"{'border-b-0': i === datasets.length - 1, 'border-b': i !== datasets.length - 1,'opacity-50': (element.enabled === undefined ? false : !element.enabled) && !admin}\">\n\n <div class=\"inline-category\" *ngIf=\"element.categories.length\">\n <a *ngFor=\"let category of element.categories\">\n {{category.category}}\n </a>\n </div>\n\n </td>\n <td class=\"relative whitespace-nowrap border-gray-200 py-2 px-4 text-right text-sm font-medium\"\n [ngClass]=\"{'border-b-0': i === datasets.length - 1, 'border-b': i !== datasets.length - 1}\">\n <div *ngIf=\"(element.enabled === undefined ? true : element.enabled) || admin\"\n class=\"flex items-center justify-end\">\n <button *ngIf=\"!shared\" mat-button color=\"primary\" (click)=\"view(element.id)\">\n Edit\n </button>\n <button *ngIf=\"shared\" mat-button color=\"primary\" (click)=\"extend(element.id)\">\n Create {{newTitle || 'Dataset'}}\n </button>\n <ng-template [ngIf]=\"!shared\">\n <div class=\"divider\"></div>\n <button color=\"primary\" mat-icon-button [matMenuTriggerFor]=\"itemMenu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #itemMenu=\"matMenu\">\n <button mat-menu-item (click)=\"extend(element.id)\">Create\n Extended {{newTitle || 'Dataset'}}</button>\n <button mat-menu-item (click)=\"editMetadata(element)\">Edit Metadata</button>\n <button mat-menu-item (click)=\"delete(element.id)\">\n Delete {{newTitle || 'Dataset'}}</button>\n </mat-menu>\n </ng-template>\n </div>\n <a [href]=\"'mailto:' + contactUs\"\n *ngIf=\"(element.enabled === undefined ? false : !element.enabled) && !admin\"\n mat-button color=\"primary\">\n Contact Us\n </a>\n </td>\n </tr>\n <tr>\n <td colspan=\"3\"\n class=\"border-t bg-gray-50 whitespace-nowrap border-b border-gray-200 py-1 px-4 text-sm text-gray-900\">\n <div class=\"paging-toolbar flex align-center justify-end\">\n\n <div class=\"flex items-center justify-center\">\n <div class=\"text-xs text-gray-400 mr-10\">\n Showing {{offset + 1}}\n - {{(page * limit) - (limit - datasets.length)}}</div>\n <select [value]=\"limit\" (change)=\"pageSizeChange($event.target.value)\"\n class=\"p-1.5 mr-8\">\n <option [value]=\"1\">1</option>\n <option [value]=\"5\">5</option>\n <option [value]=\"10\">10</option>\n <option [value]=\"25\">25</option>\n <option [value]=\"50\">50</option>\n <option [value]=\"100\">100</option>\n <option [value]=\"250\">250</option>\n <option [value]=\"1000\">1000</option>\n </select>\n <button mat-icon-button class=\"mr-4\" (click)=\"decreaseOffset()\"\n [disabled]=\"page <= 1\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button mat-icon-button (click)=\"increaseOffset()\" [disabled]=\"endOfResults\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n\n </div>\n </td>\n </tr>\n </ng-template>\n </tbody>\n </table>\n\n <ng-template [ngIf]=\"datasets.length && listStyle === 'GRID'\">\n\n <div class=\"my-4\">\n <div class=\"px-3\">\n <div class=\"mt-2 grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-3\">\n <ng-template ngFor let-item [ngForOf]=\"Object.keys(gridItems)\">\n <div *ngIf=\"gridItems[item].list.length\" class=\"bg-white overflow-hidden shadow rounded-lg flex flex-col\">\n <div class=\"px-5 py-4 bg-gray-50 \">\n <div class=\"flex items-center\">\n <div class=\"ml-1 text-base font-medium text-gray-500 truncate\">\n {{gridItems[item].title}}\n </div>\n </div>\n </div>\n <div class=\"flex-1 grid-item-container overflow-y-scroll\">\n <table class=\"table-fixed\">\n <tbody>\n <tr *ngFor=\"let listItem of gridItems[item].list\"\n class=\"hover:bg-gray-50 cursor-pointer\">\n <td *ngIf=\"listItem.enabled || admin\"\n [ngClass]=\"{'opacity-50': (listItem.enabled === undefined ? false : !listItem.enabled) && !admin}\"\n (click)=\"shared ? extend(listItem.id) : view(listItem.id)\"\n class=\"w-2/3 py-2 pl-4 pr-3 text-sm text-gray-500 sm:pl-6 break-words\">\n {{listItem.title}}\n </td>\n <td *ngIf=\"!listItem.enabled && !admin\"\n [ngClass]=\"{'opacity-50': (listItem.enabled === undefined ? false : !listItem.enabled) && !admin}\"\n class=\"w-2/3 py-2 pl-4 pr-3 text-sm text-gray-500 sm:pl-6 break-words\">\n {{listItem.title}}\n </td>\n <td class=\"w-1/3\">\n <div class=\"flex justify-end\">\n <div *ngIf=\"(listItem.enabled === undefined ? true : listItem.enabled) || admin\"\n class=\"flex items-center justify-end\">\n <a *ngIf=\"!shared\" class=\"hover:underline flex items-center font-medium text-primary\" (click)=\"view(listItem.id)\">\n Edit\n </a>\n <a *ngIf=\"shared\" class=\"hover:underline flex items-center font-medium text-primary\" (click)=\"extend(listItem.id)\">\n Create {{newTitle || 'Dataset'}}\n </a>\n <ng-template [ngIf]=\"!shared\">\n <div class=\"ml-2 divider\"></div>\n <a class=\"hover:underline flex items-center font-medium text-primary\" [matMenuTriggerFor]=\"itemMenu\">\n <mat-icon>more_vert</mat-icon>\n </a>\n <mat-menu #itemMenu=\"matMenu\">\n <button mat-menu-item (click)=\"extend(listItem.id)\">Create\n Extended {{newTitle || 'Dataset'}}</button>\n <button mat-menu-item (click)=\"editMetadata(listItem)\">Edit Metadata</button>\n <button mat-menu-item (click)=\"delete(listItem.id)\">\n Delete {{newTitle || 'Dataset'}}</button>\n </mat-menu>\n </ng-template>\n </div>\n <a [href]=\"'mailto:' + contactUs\"\n class=\"hover:underline flex items-center font-medium text-primary\"\n *ngIf=\"(listItem.enabled === undefined ? false : !listItem.enabled) && !admin\">\n Contact Us\n </a>\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n<!-- <div class=\"bg-gray-50 px-5 py-3\">-->\n<!-- <div class=\"text-sm\">-->\n<!-- <a-->\n<!-- class=\"font-medium text-secondary capitalize flex items-center\">-->\n<!-- View all-->\n<!-- <mat-icon>chevron_right</mat-icon>-->\n<!-- </a>-->\n<!-- </div>-->\n<!-- </div>-->\n </div>\n\n </ng-template>\n\n </div>\n </div>\n\n </div>\n\n </ng-template>\n\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"p-4\" *ngIf=\"!datasets.length && !loading\">\n <button type=\"button\" (click)=\"create()\" *ngIf=\"!hideCreate\"\n class=\"relative block w-full border-2 border-gray-300 border-dashed rounded-lg p-12 text-center hover:border-gray-400 focus:outline-none\">\n\n <div class=\"relative inline-block\">\n <span class=\"material-symbols-outlined mx-auto text-6xl h-14 w-20 text-gray-300\">query_stats</span>\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n class=\"right-0 bottom-0 absolute h-8 w-8 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke=\"currentColor\" stroke-width=\"4\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 4v16m8-8H4\"/>\n </svg>\n </div>\n\n <span class=\"mt-2 block text-sm font-medium text-gray-900\">Create {{newTitle || 'Dataset'}}</span>\n </button>\n</div>\n", styles: [".divider{width:1px;height:17px;background-color:#cecece}.grid-item-container{min-height:200px;max-height:200px}.grid-item-container::-webkit-scrollbar{width:.75em;background:transparent}.grid-item-container::-webkit-scrollbar-thumb{background:#d2d2d2}.inline-category{display:flex;align-items:center;flex-wrap:wrap;width:100%;margin:.15rem 0 .25rem}.inline-category a{background-color:#f5f5f5;padding:0 .25rem;font-size:.7rem;margin-right:.5rem}.inline-category a:hover{text-decoration:underline}.search-listing{display:flex;align-items:center;flex-wrap:wrap;width:100%;background-color:#0000000d;border-bottom:1px solid #ddd;min-height:47px}.search-listing .list-title{text-transform:uppercase;font-size:.75rem;padding:0 1rem;border-right:2px solid #ddd;color:#4c4c4c;font-weight:500;letter-spacing:1px}.search-listing .badge-item{display:flex;align-items:center;margin-left:1rem;padding-left:1rem;border-radius:20px;background-color:#fff;border:1px solid #ddd;height:30px}.search-listing .badge-item.exclude{opacity:.8}.search-listing .badge-item:hover{background-color:#fcfcfc}.search-listing .badge-item span{margin-right:.5rem;color:#0000008a}.search-listing .badge-item button.mat-icon-button{width:33px;height:33px;line-height:33px}.search-listing .badge-item button.mat-icon-button mat-icon{font-size:20px;height:20px;width:20px;line-height:20px;color:#0000008a}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i7.MatLegacyButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i7.MatLegacyAnchor, selector: "a[mat-button], a[mat-raised-button], a[mat-icon-button], a[mat-fab], a[mat-mini-fab], a[mat-stroked-button], a[mat-flat-button]", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.MatLegacyMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i9.MatLegacyMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i9.MatLegacyMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i10.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i10.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i11.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i11.MatButtonToggle, selector: "mat-button-toggle", inputs: ["disableRipple", "aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "appearance", "checked", "disabled"], outputs: ["change"], exportAs: ["matButtonToggle"] }] });
|
|
259
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DatasetComponent, decorators: [{
|
|
260
|
-
type: Component,
|
|
261
|
-
args: [{ selector: 'ki-dataset', template: "<div class=\"p-6 bg-white border-b border-gray-200\">\n <div class=\"md:flex md:items-center md:justify-between md:space-x-5\">\n <div class=\"flex items-start flex-1\">\n <div class=\"pt-1.5\">\n <h1 class=\"text-2xl font-bold text-gray-900\">\n <div>{{headingLabel || 'Datasets'}}</div>\n </h1>\n <p class=\"text-sm font-medium text-gray-500\">\n <span *ngIf=\"headingDescription\" [innerHTML]=\"headingDescription\"></span>\n <ng-template [ngIf]=\"!headingDescription\">\n A list of all the <span class=\"lowercase\">{{headingLabel || 'datasets'}}</span> currently\n available.\n </ng-template>\n </p>\n </div>\n </div>\n <div class=\"mt-6 flex flex-col-reverse justify-stretch\" *ngIf=\"!hideCreate\">\n <button type=\"button\" (click)=\"create()\"\n class=\"inline-flex items-center justify-center px-4 py-2 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-primary focus:outline-none\">\n Create {{newTitle || 'Dataset'}}\n </button>\n </div>\n </div>\n</div>\n\n<div class=\"px-4 sm:px-6 lg:px-8 mt-0\">\n <div class=\"flex flex-col\">\n <div class=\"-my-2 -mx-4 sm:-mx-6 lg:-mx-8\">\n <div class=\"inline-block min-w-full py-2 align-middle\">\n <div class=\"mt-3 sm:mt-0 flex-1\">\n <label for=\"mobile-search-candidate\" class=\"sr-only\">Search</label>\n <div class=\"flex\">\n <div class=\"relative bg-white flex items-center flex-grow focus-within:z-10\">\n <div class=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n <svg class=\"h-5 w-5 text-gray-400\" xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </div>\n <input type=\"text\" name=\"mobile-search-candidate\" id=\"mobile-search-candidate\"\n class=\"block w-full rounded-none pl-10 border-t-0 border-l-0 border-gray-300\"\n placeholder=\"Search {{shared ? 'data feeds' : 'stored queries'}}\"\n (keyup)=\"searchText.next($event.target.value)\">\n\n <div class=\"border-b h-full\">\n <mat-button-toggle-group [disabled]=\"!categories.length\"\n class=\"list-switcher h-full rounded-none border-none\"\n [(ngModel)]=\"listStyle\" (ngModelChange)=\"updateListStyle()\">\n <mat-button-toggle value=\"GRID\" [ngClass]=\"{'opacity-50': !categories.length}\"\n class=\"rounded-none h-full flex items-center\">\n <mat-icon>grid_view</mat-icon>\n </mat-button-toggle>\n <mat-button-toggle value=\"LIST\" [ngClass]=\"{'opacity-50': !categories.length}\"\n class=\"rounded-none h-full flex items-center\">\n <mat-icon>reorder</mat-icon>\n </mat-button-toggle>\n </mat-button-toggle-group>\n </div>\n\n\n </div>\n </div>\n </div>\n <table class=\"min-w-full border-separate\" *ngIf=\"datasets.length && listStyle === 'LIST'\"\n style=\"border-spacing: 0\">\n <tbody class=\"bg-white\">\n <ng-template [ngIf]=\"datasets.length\">\n <tr class=\"border-t border-gray-200\">\n <th scope=\"colgroup\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-100 pl-4 text-left text-xs font-semibold text-gray-900\">\n <div class=\"w-full flex items-center justify-between\">\n <div>{{tableHeading || 'Datasets'}}</div>\n </div>\n </th>\n <th scope=\"colgroup\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-100 pl-4 text-left text-xs font-semibold text-gray-900\">\n </th>\n <th scope=\"colgroup\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-100 pl-4 text-right text-xs font-semibold text-gray-900\">\n <button type=\"button\" [matMenuTriggerFor]=\"projectCategories\"\n [disabled]=\"!categories.length\"\n class=\"disabled:opacity-50 -ml-px relative inline-flex items-center py-3 px-4 border-l border-gray-300 text-sm font-medium text-gray-700 bg-gray-100 hover:bg-gray-200 focus:outline-none border-t-0 border-r-0\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"h-5 w-5 text-gray-400\"\n viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fill-rule=\"evenodd\"\n d=\"M3 3a1 1 0 011-1h12a1 1 0 011 1v3a1 1 0 01-.293.707L12 11.414V15a1 1 0 01-.293.707l-2 2A1 1 0 018 17v-5.586L3.293 6.707A1 1 0 013 6V3z\"\n clip-rule=\"evenodd\"/>\n </svg>\n <span class=\"ml-2\">Categories</span>\n <svg class=\"ml-2.5 -mr-1.5 h-5 w-5 text-gray-400\"\n xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\"\n aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </button>\n <mat-menu #projectCategories=\"matMenu\">\n <button (click)=\"toggleCategory($event, category)\"\n mat-menu-item *ngFor=\"let category of categories\">\n <div class=\"flex items-center\">\n <mat-icon color=\"primary\" *ngIf=\"category.checked\">check_box</mat-icon>\n <mat-icon *ngIf=\"!category.checked\">check_box_outline_blank</mat-icon>\n {{category.category}}\n </div>\n </button>\n </mat-menu>\n </th>\n </tr>\n <tr *ngFor=\"let element of datasets; let i = index\" class=\"hover:bg-gray-50\"\n [ngClass]=\"{}\">\n <td class=\"border-gray-200 py-2 px-4 text-sm w-1/2 text-gray-900\"\n [ngClass]=\"{'border-b-0': i === datasets.length - 1, 'border-b': i !== datasets.length - 1,'opacity-50': (element.enabled === undefined ? false : !element.enabled) && !admin}\">\n <div class=\"flex flex-col\">\n <div *ngIf=\"element.enabled || admin\"\n class=\"item-title-select flex items-center font-medium cursor-pointer hover:underline\"\n (click)=\"shared ? extend(element.id) : view(element.id)\">\n {{element.title}}\n </div>\n <div *ngIf=\"!element.enabled && !admin\"\n class=\"item-title-select flex items-center font-medium\">\n {{element.title}}\n </div>\n <div (click)=\"element.viewDescription = !element.viewDescription\"\n class=\"text-gray-400 font-thin cursor-pointer hover:underline\">\n {{element.summary}}\n </div>\n <div *ngIf=\"element.viewDescription && element.description\" class=\"mt-4\"\n [innerHTML]=\"element.description\"></div>\n </div>\n </td>\n <td class=\"border-gray-200 py-2 px-4 text-sm text-gray-900\"\n [ngClass]=\"{'border-b-0': i === datasets.length - 1, 'border-b': i !== datasets.length - 1,'opacity-50': (element.enabled === undefined ? false : !element.enabled) && !admin}\">\n\n <div class=\"inline-category\" *ngIf=\"element.categories.length\">\n <a *ngFor=\"let category of element.categories\">\n {{category.category}}\n </a>\n </div>\n\n </td>\n <td class=\"relative whitespace-nowrap border-gray-200 py-2 px-4 text-right text-sm font-medium\"\n [ngClass]=\"{'border-b-0': i === datasets.length - 1, 'border-b': i !== datasets.length - 1}\">\n <div *ngIf=\"(element.enabled === undefined ? true : element.enabled) || admin\"\n class=\"flex items-center justify-end\">\n <button *ngIf=\"!shared\" mat-button color=\"primary\" (click)=\"view(element.id)\">\n Edit\n </button>\n <button *ngIf=\"shared\" mat-button color=\"primary\" (click)=\"extend(element.id)\">\n Create {{newTitle || 'Dataset'}}\n </button>\n <ng-template [ngIf]=\"!shared\">\n <div class=\"divider\"></div>\n <button color=\"primary\" mat-icon-button [matMenuTriggerFor]=\"itemMenu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #itemMenu=\"matMenu\">\n <button mat-menu-item (click)=\"extend(element.id)\">Create\n Extended {{newTitle || 'Dataset'}}</button>\n <button mat-menu-item (click)=\"editMetadata(element)\">Edit Metadata</button>\n <button mat-menu-item (click)=\"delete(element.id)\">\n Delete {{newTitle || 'Dataset'}}</button>\n </mat-menu>\n </ng-template>\n </div>\n <a [href]=\"'mailto:' + contactUs\"\n *ngIf=\"(element.enabled === undefined ? false : !element.enabled) && !admin\"\n mat-button color=\"primary\">\n Contact Us\n </a>\n </td>\n </tr>\n <tr>\n <td colspan=\"3\"\n class=\"border-t bg-gray-50 whitespace-nowrap border-b border-gray-200 py-1 px-4 text-sm text-gray-900\">\n <div class=\"paging-toolbar flex align-center justify-end\">\n\n <div class=\"flex items-center justify-center\">\n <div class=\"text-xs text-gray-400 mr-10\">\n Showing {{offset + 1}}\n - {{(page * limit) - (limit - datasets.length)}}</div>\n <select [value]=\"limit\" (change)=\"pageSizeChange($event.target.value)\"\n class=\"p-1.5 mr-8\">\n <option [value]=\"1\">1</option>\n <option [value]=\"5\">5</option>\n <option [value]=\"10\">10</option>\n <option [value]=\"25\">25</option>\n <option [value]=\"50\">50</option>\n <option [value]=\"100\">100</option>\n <option [value]=\"250\">250</option>\n <option [value]=\"1000\">1000</option>\n </select>\n <button mat-icon-button class=\"mr-4\" (click)=\"decreaseOffset()\"\n [disabled]=\"page <= 1\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button mat-icon-button (click)=\"increaseOffset()\" [disabled]=\"endOfResults\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n\n </div>\n </td>\n </tr>\n </ng-template>\n </tbody>\n </table>\n\n <ng-template [ngIf]=\"datasets.length && listStyle === 'GRID'\">\n\n <div class=\"my-4\">\n <div class=\"px-3\">\n <div class=\"mt-2 grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-3\">\n <ng-template ngFor let-item [ngForOf]=\"Object.keys(gridItems)\">\n <div *ngIf=\"gridItems[item].list.length\" class=\"bg-white overflow-hidden shadow rounded-lg flex flex-col\">\n <div class=\"px-5 py-4 bg-gray-50 \">\n <div class=\"flex items-center\">\n <div class=\"ml-1 text-base font-medium text-gray-500 truncate\">\n {{gridItems[item].title}}\n </div>\n </div>\n </div>\n <div class=\"flex-1 grid-item-container overflow-y-scroll\">\n <table class=\"table-fixed\">\n <tbody>\n <tr *ngFor=\"let listItem of gridItems[item].list\"\n class=\"hover:bg-gray-50 cursor-pointer\">\n <td *ngIf=\"listItem.enabled || admin\"\n [ngClass]=\"{'opacity-50': (listItem.enabled === undefined ? false : !listItem.enabled) && !admin}\"\n (click)=\"shared ? extend(listItem.id) : view(listItem.id)\"\n class=\"w-2/3 py-2 pl-4 pr-3 text-sm text-gray-500 sm:pl-6 break-words\">\n {{listItem.title}}\n </td>\n <td *ngIf=\"!listItem.enabled && !admin\"\n [ngClass]=\"{'opacity-50': (listItem.enabled === undefined ? false : !listItem.enabled) && !admin}\"\n class=\"w-2/3 py-2 pl-4 pr-3 text-sm text-gray-500 sm:pl-6 break-words\">\n {{listItem.title}}\n </td>\n <td class=\"w-1/3\">\n <div class=\"flex justify-end\">\n <div *ngIf=\"(listItem.enabled === undefined ? true : listItem.enabled) || admin\"\n class=\"flex items-center justify-end\">\n <a *ngIf=\"!shared\" class=\"hover:underline flex items-center font-medium text-primary\" (click)=\"view(listItem.id)\">\n Edit\n </a>\n <a *ngIf=\"shared\" class=\"hover:underline flex items-center font-medium text-primary\" (click)=\"extend(listItem.id)\">\n Create {{newTitle || 'Dataset'}}\n </a>\n <ng-template [ngIf]=\"!shared\">\n <div class=\"ml-2 divider\"></div>\n <a class=\"hover:underline flex items-center font-medium text-primary\" [matMenuTriggerFor]=\"itemMenu\">\n <mat-icon>more_vert</mat-icon>\n </a>\n <mat-menu #itemMenu=\"matMenu\">\n <button mat-menu-item (click)=\"extend(listItem.id)\">Create\n Extended {{newTitle || 'Dataset'}}</button>\n <button mat-menu-item (click)=\"editMetadata(listItem)\">Edit Metadata</button>\n <button mat-menu-item (click)=\"delete(listItem.id)\">\n Delete {{newTitle || 'Dataset'}}</button>\n </mat-menu>\n </ng-template>\n </div>\n <a [href]=\"'mailto:' + contactUs\"\n class=\"hover:underline flex items-center font-medium text-primary\"\n *ngIf=\"(listItem.enabled === undefined ? false : !listItem.enabled) && !admin\">\n Contact Us\n </a>\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n<!-- <div class=\"bg-gray-50 px-5 py-3\">-->\n<!-- <div class=\"text-sm\">-->\n<!-- <a-->\n<!-- class=\"font-medium text-secondary capitalize flex items-center\">-->\n<!-- View all-->\n<!-- <mat-icon>chevron_right</mat-icon>-->\n<!-- </a>-->\n<!-- </div>-->\n<!-- </div>-->\n </div>\n\n </ng-template>\n\n </div>\n </div>\n\n </div>\n\n </ng-template>\n\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"p-4\" *ngIf=\"!datasets.length && !loading\">\n <button type=\"button\" (click)=\"create()\" *ngIf=\"!hideCreate\"\n class=\"relative block w-full border-2 border-gray-300 border-dashed rounded-lg p-12 text-center hover:border-gray-400 focus:outline-none\">\n\n <div class=\"relative inline-block\">\n <span class=\"material-symbols-outlined mx-auto text-6xl h-14 w-20 text-gray-300\">query_stats</span>\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n class=\"right-0 bottom-0 absolute h-8 w-8 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke=\"currentColor\" stroke-width=\"4\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 4v16m8-8H4\"/>\n </svg>\n </div>\n\n <span class=\"mt-2 block text-sm font-medium text-gray-900\">Create {{newTitle || 'Dataset'}}</span>\n </button>\n</div>\n", styles: [".divider{width:1px;height:17px;background-color:#cecece}.grid-item-container{min-height:200px;max-height:200px}.grid-item-container::-webkit-scrollbar{width:.75em;background:transparent}.grid-item-container::-webkit-scrollbar-thumb{background:#d2d2d2}.inline-category{display:flex;align-items:center;flex-wrap:wrap;width:100%;margin:.15rem 0 .25rem}.inline-category a{background-color:#f5f5f5;padding:0 .25rem;font-size:.7rem;margin-right:.5rem}.inline-category a:hover{text-decoration:underline}.search-listing{display:flex;align-items:center;flex-wrap:wrap;width:100%;background-color:#0000000d;border-bottom:1px solid #ddd;min-height:47px}.search-listing .list-title{text-transform:uppercase;font-size:.75rem;padding:0 1rem;border-right:2px solid #ddd;color:#4c4c4c;font-weight:500;letter-spacing:1px}.search-listing .badge-item{display:flex;align-items:center;margin-left:1rem;padding-left:1rem;border-radius:20px;background-color:#fff;border:1px solid #ddd;height:30px}.search-listing .badge-item.exclude{opacity:.8}.search-listing .badge-item:hover{background-color:#fcfcfc}.search-listing .badge-item span{margin-right:.5rem;color:#0000008a}.search-listing .badge-item button.mat-icon-button{width:33px;height:33px;line-height:33px}.search-listing .badge-item button.mat-icon-button mat-icon{font-size:20px;height:20px;width:20px;line-height:20px;color:#0000008a}\n"] }]
|
|
262
|
-
}], ctorParameters: function () { return [{ type: i1.MatLegacyDialog }, { type: i2.TagService }, { type: i3.ProjectService }, { type: i4.DatasetService }, { type: i5.Router }, { type: i5.ActivatedRoute }, { type: undefined, decorators: [{
|
|
263
|
-
type: Inject,
|
|
264
|
-
args: [KININTEL_CONFIG]
|
|
265
|
-
}] }, { type: i6.Location }]; }, propDecorators: { headingLabel: [{
|
|
266
|
-
type: Input
|
|
267
|
-
}], headingDescription: [{
|
|
268
|
-
type: Input
|
|
269
|
-
}], backendUrl: [{
|
|
270
|
-
type: Input
|
|
271
|
-
}], newTitle: [{
|
|
272
|
-
type: Input
|
|
273
|
-
}], newDescription: [{
|
|
274
|
-
type: Input
|
|
275
|
-
}], hideCreate: [{
|
|
276
|
-
type: Input
|
|
277
|
-
}], shared: [{
|
|
278
|
-
type: Input
|
|
279
|
-
}], admin: [{
|
|
280
|
-
type: Input
|
|
281
|
-
}], reload: [{
|
|
282
|
-
type: Input
|
|
283
|
-
}], url: [{
|
|
284
|
-
type: Input
|
|
285
|
-
}], accountId: [{
|
|
286
|
-
type: Input
|
|
287
|
-
}], contactUs: [{
|
|
288
|
-
type: Input
|
|
289
|
-
}], tableHeading: [{
|
|
290
|
-
type: Input
|
|
291
|
-
}], listStyle: [{
|
|
292
|
-
type: Input
|
|
293
|
-
}] } });
|
|
294
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXNldC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1raW5pbnRlbC9zcmMvbGliL2NvbXBvbmVudHMvZGF0YXNldC9kYXRhc2V0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWtpbmludGVsL3NyYy9saWIvY29tcG9uZW50cy9kYXRhc2V0L2RhdGFzZXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFvQixNQUFNLGVBQWUsQ0FBQztBQUMxRSxPQUFPLEVBQUMsZUFBZSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQWUsTUFBTSxNQUFNLENBQUM7QUFDbkUsT0FBTyxFQUFDLFlBQVksRUFBd0IsR0FBRyxFQUFFLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ2xGLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLDBDQUEwQyxDQUFDO0FBSy9FLE9BQU8sRUFBQyxlQUFlLEVBQXVCLE1BQU0sdUJBQXVCLENBQUM7QUFDNUUsT0FBTyxLQUFLLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFFakMsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFFakUsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sMkNBQTJDLENBQUM7Ozs7Ozs7Ozs7Ozs7QUFIakYsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQVd6QixNQUFNLE9BQU8sZ0JBQWdCO0lBcUN6QixZQUFvQixNQUFpQixFQUNqQixVQUFzQixFQUN0QixjQUE4QixFQUM5QixjQUE4QixFQUM5QixNQUFjLEVBQ2QsS0FBcUIsRUFDRyxNQUE0QixFQUNwRCxRQUFrQjtRQVBsQixXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQ2pCLGVBQVUsR0FBVixVQUFVLENB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QWtCO3NCQUExQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgSW5qZWN0LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIG1lcmdlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAsIHN3aXRjaE1hcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtEYXRhRXhwbG9yZXJDb21wb25lbnR9IGZyb20gJy4uL2RhdGEtZXhwbG9yZXIvZGF0YS1leHBsb3Jlci5jb21wb25lbnQnO1xuaW1wb3J0IHtNYXRMZWdhY3lEaWFsb2cgYXMgTWF0RGlhbG9nfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktZGlhbG9nJztcbmltcG9ydCB7VGFnU2VydmljZX0gZnJvbSAnLi4vLi4vc2VydmljZXMvdGFnLnNlcnZpY2UnO1xuaW1wb3J0IHtQcm9qZWN0U2VydmljZX0gZnJvbSAnLi4vLi4vc2VydmljZXMvcHJvamVjdC5zZXJ2aWNlJztcbmltcG9ydCB7RGF0YXNldFNlcnZpY2V9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RhdGFzZXQuc2VydmljZSc7XG5pbXBvcnQge0tJTklOVEVMX0NPTkZJRywgS2luaW50ZWxNb2R1bGVDb25maWd9IGZyb20gJy4uLy4uL2tpbmludGVsLWNvbmZpZyc7XG5pbXBvcnQgKiBhcyBsb2Rhc2ggZnJvbSAnbG9kYXNoJztcbmNvbnN0IF8gPSBsb2Rhc2guZGVmYXVsdDtcbmltcG9ydCB7TWV0YWRhdGFDb21wb25lbnR9IGZyb20gJy4uL21ldGFkYXRhL21ldGFkYXRhLmNvbXBvbmVudCc7XG5pbXBvcnQge0FjdGl2YXRlZFJvdXRlLCBSb3V0ZXJ9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge0NyZWF0ZURhdGFzZXRDb21wb25lbnR9IGZyb20gJy4vY3JlYXRlLWRhdGFzZXQvY3JlYXRlLWRhdGFzZXQuY29tcG9uZW50JztcbmltcG9ydCB7TG9jYXRpb259IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAna2ktZGF0YXNldCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2RhdGFzZXQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2RhdGFzZXQuY29tcG9uZW50LnNhc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBEYXRhc2V0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gICAgQElucHV0KCkgaGVhZGluZ0xhYmVsOiBzdHJpbmc7XG4gICAgQElucHV0KCkgaGVhZGluZ0Rlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgQElucHV0KCkgYmFja2VuZFVybDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIG5ld1RpdGxlOiBzdHJpbmc7XG4gICAgQElucHV0KCkgbmV3RGVzY3JpcHRpb246IHN0cmluZztcbiAgICBASW5wdXQoKSBoaWRlQ3JlYXRlOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHNoYXJlZDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBhZG1pbjogYm9vbGVhbjtcbiAgICBASW5wdXQoKSByZWxvYWQ6IFN1YmplY3Q8YW55PjtcbiAgICBASW5wdXQoKSB1cmw6IHN0cmluZztcbiAgICBASW5wdXQoKSBhY2NvdW50SWQ6IGFueTtcbiAgICBASW5wdXQoKSBjb250YWN0VXM6IHN0cmluZztcbiAgICBASW5wdXQoKSB0YWJsZUhlYWRpbmc6IHN0cmluZztcbiAgICBASW5wdXQoKSBsaXN0U3R5bGUgPSAnTElTVCc7XG5cbiAgICBwdWJsaWMgZGF0YXNldHM6IGFueSA9IFtdO1xuICAgIHB1YmxpYyBzZWFyY2hUZXh0ID0gbmV3IEJlaGF2aW9yU3ViamVjdCgnJyk7XG4gICAgcHVibGljIGxpbWl0ID0gMTA7XG4gICAgcHVibGljIG9mZnNldCA9IDA7XG4gICAgcHVibGljIHBhZ2UgPSAxO1xuICAgIHB1YmxpYyBlbmRPZlJlc3VsdHMgPSBmYWxzZTtcbiAgICBwdWJsaWMgY2F0ZWdvcmllczogYW55ID0gW107XG4gICAgcHVibGljIGZpbHRlcmVkQ2F0ZWdvcmllczogYW55ID0gW107XG4gICAgcHVibGljIERhdGUgPSBEYXRlO1xuICAgIHB1YmxpYyBhY3RpdmVUYWdTdWIgPSBuZXcgU3ViamVjdCgpO1xuICAgIHB1YmxpYyBwcm9qZWN0U3ViID0gbmV3IFN1YmplY3QoKTtcbiAgICBwdWJsaWMgYWN0aXZlVGFnOiBhbnk7XG4gICAgcHVibGljIGxvYWRpbmcgPSB0cnVlO1xuICAgIHB1YmxpYyBncmlkSXRlbXM6IGFueSA9IHt9O1xuICAgIHB1YmxpYyBwcm9qZWN0U2V0dGluZ3M6IGFueSA9IHt9O1xuXG4gICAgcHJpdmF0ZSB0YWdTdWI6IFN1YnNjcmlwdGlvbjtcbiAgICBwcml2YXRlIGFjdGl2ZVByb2plY3Q6IGFueTtcbiAgICBwcml2YXRlIGFjdGl2ZVByb2plY3RTdWI6IFN1YnNjcmlwdGlvbjtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSB0YWdTZXJ2aWNlOiBUYWdTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgcHJvamVjdFNlcnZpY2U6IFByb2plY3RTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgZGF0YXNldFNlcnZpY2U6IERhdGFzZXRTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgICAgICAgICAgICAgQEluamVjdChLSU5JTlRFTF9DT05GSUcpIHB1YmxpYyBjb25maWc6IEtpbmludGVsTW9kdWxlQ29uZmlnLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgbG9jYXRpb246IExvY2F0aW9uKSB7XG4gICAgfVxuXG4gICAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlUHJvamVjdCA9IHRoaXMucHJvamVjdFNlcnZpY2UuYWN0aXZlUHJvamVjdC5nZXRWYWx1ZSgpO1xuXG4gICAgICAgIHRoaXMuYWN0aXZlUHJvamVjdFN1YiA9IHRoaXMucHJvamVjdFNlcnZpY2UuYWN0aXZlUHJvamVjdC5zdWJzY3JpYmUoYWN0aXZlUHJvamVjdCA9PiB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZVByb2plY3QgPSBhY3RpdmVQcm9qZWN0O1xuXG4gICAgICAgICAgICB0aGlzLnByb2plY3RTZXR0aW5ncyA9ICh0aGlzLmFjdGl2ZVByb2plY3QgJiYgdGhpcy5hY3RpdmVQcm9qZWN0LnNldHRpbmdzKSA/IChBcnJheS5pc0FycmF5KHRoaXMuYWN0aXZlUHJvamVjdC5zZXR0aW5ncykgPyB7XG4gICAgICAgICAgICAgICAgaGlkZUV4aXN0aW5nOiBmYWxzZSwgc2hvcnRjdXRQb3NpdGlvbjogJ2FmdGVyJywgaG9tZURhc2hib2FyZDoge30sIHNob3J0Y3V0c01lbnU6IFtdXG4gICAgICAgICAgICB9IDogdGhpcy5hY3RpdmVQcm9qZWN0LnNldHRpbmdzKSA6IHtcbiAgICAgICAgICAgICAgICBoaWRlRXhpc3Rpbmc6IGZhbHNlLCBzaG9ydGN1dFBvc2l0aW9uOiAnYWZ0ZXInLCBob21lRGFzaGJvYXJkOiB7fSwgc2hvcnRjdXRzTWVudTogW11cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IGxpc3RLZXkgPSB0aGlzLmdldEN1cnJlbnRQYXRoTGlzdEtleSgpO1xuICAgICAgICAgICAgaWYgKHRoaXMucHJvamVjdFNldHRpbmdzW2xpc3RLZXldKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5saXN0U3R5bGUgPSB0aGlzLnByb2plY3RTZXR0aW5nc1tsaXN0S2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5zZWFyY2hUZXh0LnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnBhZ2UgPSAxO1xuICAgICAgICAgICAgdGhpcy5vZmZzZXQgPSAwO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBwYWdpbmdWYWx1ZXMgPSB0aGlzLnByb2plY3RTZXJ2aWNlLmdldERhdGFJdGVtUGFnaW5nVmFsdWVzKCk7XG4gICAgICAgIHRoaXMubGltaXQgPSBwYWdpbmdWYWx1ZXMubGltaXQgfHwgMTA7XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gcGFnaW5nVmFsdWVzLm9mZnNldCB8fCAwO1xuICAgICAgICB0aGlzLnBhZ2UgPSBwYWdpbmdWYWx1ZXMucGFnZSB8fCAxO1xuXG4gICAgICAgIHRoaXMucm91dGUucGFyYW1zLnN1YnNjcmliZShwYXJhbSA9PiB7XG4gICAgICAgICAgICBpZiAocGFyYW0uaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXcocGFyYW0uaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIXRoaXMucmVsb2FkKSB7XG4gICAgICAgICAgICB0aGlzLnJlbG9hZCA9IG5ldyBTdWJqZWN0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy50YWdTZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZVRhZ1N1YiA9IHRoaXMudGFnU2VydmljZS5hY3RpdmVUYWc7XG4gICAgICAgICAgICB0aGlzLnRhZ1N1YiA9IHRoaXMudGFnU2VydmljZS5hY3RpdmVUYWcuc3Vic2NyaWJlKHRhZyA9PiB0aGlzLmFjdGl2ZVRhZyA9IHRhZyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wcm9qZWN0U2VydmljZSkge1xuICAgICAgICAgICAgdGhpcy5wcm9qZWN0U3ViID0gdGhpcy5wcm9qZWN0U2VydmljZS5hY3RpdmVQcm9qZWN0O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5nZXRDYXRlZ29yaWVzKCk7XG5cbiAgICAgICAgbWVyZ2UodGhpcy5zZWFyY2hUZXh0LCB0aGlzLmFjdGl2ZVRhZ1N1YiwgdGhpcy5wcm9qZWN0U3ViLCB0aGlzLnJlbG9hZClcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGRlYm91bmNlVGltZSgzMDApLFxuICAgICAgICAgICAgICAgIC8vIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0RGF0YXNldHMoKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkuc3Vic2NyaWJlKChkYXRhc2V0czogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRhdGFzZXRzID0gZGF0YXNldHM7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmNhdGVnb3JpZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkSXRlbXMgPSB7fTtcbiAgICAgICAgICAgICAgICB0aGlzLmNhdGVnb3JpZXMuZm9yRWFjaChjYXRlZ29yeSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gXy5maWx0ZXIoZGF0YXNldHMsIGRhdGFzZXQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhXy5maW5kKGRhdGFzZXQuY2F0ZWdvcmllcywge2tleTogY2F0ZWdvcnkua2V5fSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyaWRJdGVtc1tjYXRlZ29yeS5rZXldID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBjYXRlZ29yeS5rZXksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogY2F0ZWdvcnkuY2F0ZWdvcnksXG4gICAgICAgICAgICAgICAgICAgICAgICBsaXN0OiBpdGVtc1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgb3RoZXJJdGVtcyA9IF8uZmlsdGVyKGRhdGFzZXRzLCBkYXRhc2V0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFkYXRhc2V0LmNhdGVnb3JpZXMgfHwgIWRhdGFzZXQuY2F0ZWdvcmllcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkSXRlbXMub3RoZXIgPSB7XG4gICAgICAgICAgICAgICAgICAgIGtleTogJ290aGVyJyxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICdPdGhlcicsXG4gICAgICAgICAgICAgICAgICAgIGxpc3Q6IG90aGVySXRlbXNcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RTdHlsZSA9ICdMSVNUJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMudGFnU3ViKSB7XG4gICAgICAgICAgICB0aGlzLnRhZ1N1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHZpZXcoZGF0YXNldElkKSB7XG4gICAgICAgIHRoaXMuZGF0YXNldFNlcnZpY2UuZ2V0RGF0YXNldChkYXRhc2V0SWQpLnRoZW4oZGF0YXNldEluc3RhbmNlU3VtbWFyeSA9PiB7XG4gICAgICAgICAgICB0aGlzLnZpZXdEYXRhc2V0KGRhdGFzZXRJbnN0YW5jZVN1bW1hcnkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZXh0ZW5kKGlkKSB7XG4gICAgICAgIHRoaXMuZGF0YXNldFNlcnZpY2UuZ2V0RXh0ZW5kZWREYXRhc2V0KGlkKS50aGVuKGRhdGFzZXRJbnN0YW5jZVN1bW1hcnkgPT4ge1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0YXNldChkYXRhc2V0SW5zdGFuY2VTdW1tYXJ5KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbW92ZUFjdGl2ZVRhZygpIHtcbiAgICAgICAgdGhpcy50YWdTZXJ2aWNlLnJlc2V0QWN0aXZlVGFnKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHVwZGF0ZUxpc3RTdHlsZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmFkbWluKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGFzZXRzID0gW107XG4gICAgICAgICAgICBjb25zdCBsaXN0S2V5ID0gdGhpcy5nZXRDdXJyZW50UGF0aExpc3RLZXkoKTtcbiAgICAgICAgICAgIHRoaXMucHJvamVjdFNldHRpbmdzW2xpc3RLZXldID0gdGhpcy5saXN0U3R5bGU7XG4gICAgICAgICAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnVwZGF0ZVByb2plY3RTZXR0aW5ncyh0aGlzLmFjdGl2ZVByb2plY3QucHJvamVjdEtleSwgdGhpcy5wcm9qZWN0U2V0dGluZ3MpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHRvZ2dsZUNhdGVnb3J5KGV2ZW50LCBjYXRlZ29yeSkge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgY2F0ZWdvcnkuY2hlY2tlZCA9ICFjYXRlZ29yeS5jaGVja2VkO1xuICAgICAgICB0aGlzLnVwZGF0ZUNhdGVnb3J5RmlsdGVycygpO1xuICAgIH1cblxuICAgIHB1YmxpYyB1cGRhdGVDYXRlZ29yeUZpbHRlcnMoKSB7XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gMDtcbiAgICAgICAgdGhpcy5wYWdlID0gMTtcbiAgICAgICAgdGhpcy5yZWxvYWQubmV4dChEYXRlLm5vdygpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVsZXRlKGRhdGFzZXRJZCkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gJ0FyZSB5b3Ugc3VyZSB5b3Ugd291bGQgbGlrZSB0byByZW1vdmUgdGhpcyBEYXRhc2V0Pyc7XG4gICAgICAgIGlmICh3aW5kb3cuY29uZmlybShtZXNzYWdlKSkge1xuICAgICAgICAgICAgdGhpcy5kYXRhc2V0U2VydmljZS5yZW1vdmVEYXRhc2V0KGRhdGFzZXRJZCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWxvYWQubmV4dChEYXRlLm5vdygpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGluY3JlYXNlT2Zmc2V0KCkge1xuICAgICAgICB0aGlzLnBhZ2UgPSB0aGlzLnBhZ2UgKyAxO1xuICAgICAgICB0aGlzLm9mZnNldCA9ICh0aGlzLmxpbWl0ICogdGhpcy5wYWdlKSAtIHRoaXMubGltaXQ7XG4gICAgICAgIHRoaXMucmVsb2FkLm5leHQoRGF0ZS5ub3coKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGRlY3JlYXNlT2Zmc2V0KCkge1xuICAgICAgICB0aGlzLnBhZ2UgPSB0aGlzLnBhZ2UgPD0gMSA/IDEgOiB0aGlzLnBhZ2UgLSAxO1xuICAgICAgICB0aGlzLm9mZnNldCA9ICh0aGlzLmxpbWl0ICogdGhpcy5wYWdlKSAtIHRoaXMubGltaXQ7XG4gICAgICAgIHRoaXMucmVsb2FkLm5leHQoRGF0ZS5ub3coKSk7XG4gICAgfVxuXG4gICAgcHVibGljIHBhZ2VTaXplQ2hhbmdlKHZhbHVlKSB7XG4gICAgICAgIHRoaXMucGFnZSA9IDE7XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gMDtcbiAgICAgICAgdGhpcy5saW1pdCA9IHZhbHVlO1xuICAgICAgICB0aGlzLnJlbG9hZC5uZXh0KERhdGUubm93KCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBlZGl0TWV0YWRhdGEoc2VhcmNoUmVzdWx0KSB7XG4gICAgICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oTWV0YWRhdGFDb21wb25lbnQsIHtcbiAgICAgICAgICAgIHdpZHRoOiAnNzAwcHgnLFxuICAgICAgICAgICAgaGVpZ2h0OiAnOTAwcHgnLFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIG1ldGFkYXRhOiBfLmNsb25lKHNlYXJjaFJlc3VsdCksXG4gICAgICAgICAgICAgICAgc2VydmljZTogdGhpcy5kYXRhc2V0U2VydmljZVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWxvYWQubmV4dChEYXRlLm5vdygpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmdldENhdGVnb3JpZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZSgpIHtcbiAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihDcmVhdGVEYXRhc2V0Q29tcG9uZW50LCB7XG4gICAgICAgICAgICB3aWR0aDogJzEyMDBweCcsXG4gICAgICAgICAgICBoZWlnaHQ6ICc4MDBweCcsXG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgYWRtaW46IHRoaXMuYWRtaW4sXG4gICAgICAgICAgICAgICAgYWNjb3VudElkOiB0aGlzLmFjY291bnRJZFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3RGF0YXNldChyZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZpZXdEYXRhc2V0KGRhdGFzZXRJbnN0YW5jZVN1bW1hcnkpIHtcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3RoaXMudXJsIHx8ICcvZGF0YXNldCddLCB7ZnJhZ21lbnQ6IF8ua2ViYWJDYXNlKGRhdGFzZXRJbnN0YW5jZVN1bW1hcnkudGl0bGUpfSk7XG4gICAgICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oRGF0YUV4cGxvcmVyQ29tcG9uZW50LCB7XG4gICAgICAgICAgICB3aWR0aDogJzEwMHZ3JyxcbiAgICAgICAgICAgIGhlaWdodDogJzEwMHZoJyxcbiAgICAgICAgICAgIG1heFdpZHRoOiAnMTAwdncnLFxuICAgICAgICAgICAgbWF4SGVpZ2h0OiAnMTAwdmgnLFxuICAgICAgICAgICAgaGFzQmFja2Ryb3A6IGZhbHNlLFxuICAgICAgICAgICAgY2xvc2VPbk5hdmlnYXRpb246IHRydWUsXG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgZGF0YXNldEluc3RhbmNlU3VtbWFyeSxcbiAgICAgICAgICAgICAgICBiYWNrZW5kVXJsOiB0aGlzLmJhY2tlbmRVcmwsXG4gICAgICAgICAgICAgICAgc2hvd0NoYXJ0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBhZG1pbjogdGhpcy5hZG1pbixcbiAgICAgICAgICAgICAgICBuZXdUaXRsZTogdGhpcy5uZXdUaXRsZSA/IHRoaXMubmV3VGl0bGUgKyAnIE5hbWUnIDogbnVsbCxcbiAgICAgICAgICAgICAgICBuZXdEZXNjcmlwdGlvbjogdGhpcy5uZXdEZXNjcmlwdGlvbiB8fCBudWxsLFxuICAgICAgICAgICAgICAgIGFjY291bnRJZDogdGhpcy5hY2NvdW50SWQsXG4gICAgICAgICAgICAgICAgYnJlYWRjcnVtYjogdGhpcy5oZWFkaW5nTGFiZWwgfHwgJ0RhdGFzZXRzJyxcbiAgICAgICAgICAgICAgICB1cmw6IHRoaXMudXJsXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzLmJyZWFkY3J1bWIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucm91dGVyLm5hdmlnYXRlKFtyZXMuYnJlYWRjcnVtYl0sIHtmcmFnbWVudDogbnVsbH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdGhpcy51cmwgfHwgJy9kYXRhc2V0J10sIHtmcmFnbWVudDogbnVsbH0pO1xuICAgICAgICAgICAgICAgIHRoaXMucmVsb2FkLm5leHQoRGF0ZS5ub3coKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RGF0YXNldHMoKSB7XG4gICAgICAgIHRoaXMucHJvamVjdFNlcnZpY2Uuc2V0RGF0YUl0ZW1QYWdpbmdWYWx1ZSh0aGlzLmxpbWl0LCB0aGlzLm9mZnNldCwgdGhpcy5wYWdlKTtcblxuICAgICAgICBjb25zdCBjaGVja2VkQ2F0ZWdvcmllcyA9IF8uZmlsdGVyKHRoaXMuY2F0ZWdvcmllcywgJ2NoZWNrZWQnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YXNldFNlcnZpY2UuZ2V0RGF0YXNldHMoXG4gICAgICAgICAgICB0aGlzLnNlYXJjaFRleHQuZ2V0VmFsdWUoKSB8fCAnJyxcbiAgICAgICAgICAgIHRoaXMubGlzdFN0eWxlID09PSAnR1JJRCcgPyAnMTAwMCcgOiB0aGlzLmxpbWl0LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0aGlzLmxpc3RTdHlsZSA9PT0gJ0dSSUQnID8gJzAnIDogdGhpcy5vZmZzZXQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHRoaXMuc2hhcmVkID8gbnVsbCA6ICghXy5pc05pbCh0aGlzLmFjY291bnRJZCkgPyB0aGlzLmFjY291bnRJZCA6ICcnKSxcbiAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgXy5tYXAoY2hlY2tlZENhdGVnb3JpZXMsICdrZXknKVxuICAgICAgICApLnBpcGUobWFwKChkYXRhc2V0czogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmRPZlJlc3VsdHMgPSBkYXRhc2V0cy5sZW5ndGggPCB0aGlzLmxpbWl0O1xuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhc2V0cztcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRDYXRlZ29yaWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhc2V0U2VydmljZS5nZXREYXRhc2V0Q2F0ZWdvcmllcyh0aGlzLnNoYXJlZCkudGhlbihjYXRlZ29yaWVzID0+IHRoaXMuY2F0ZWdvcmllcyA9IGNhdGVnb3JpZXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Q3VycmVudFBhdGhMaXN0S2V5KCkge1xuICAgICAgICBjb25zdCBjdXJyZW50UGF0aCA9IHRoaXMubG9jYXRpb24ucGF0aCgpLnJlcGxhY2UoJy8nLCAnLScpO1xuICAgICAgICByZXR1cm4gXy5jYW1lbENhc2UoJ2xpc3RTdHlsZScgKyBjdXJyZW50UGF0aCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IE9iamVjdCA9IE9iamVjdDtcbn1cbiIsIjxkaXYgY2xhc3M9XCJwLTYgYmctd2hpdGUgYm9yZGVyLWIgYm9yZGVyLWdyYXktMjAwXCI+XG4gICAgPGRpdiBjbGFzcz1cIm1kOmZsZXggbWQ6aXRlbXMtY2VudGVyIG1kOmp1c3RpZnktYmV0d2VlbiBtZDpzcGFjZS14LTVcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtc3RhcnQgZmxleC0xXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHQtMS41XCI+XG4gICAgICAgICAgICAgICAgPGgxIGNsYXNzPVwidGV4dC0yeGwgZm9udC1ib2xkIHRleHQtZ3JheS05MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj57e2hlYWRpbmdMYWJlbCB8fCAnRGF0YXNldHMnfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2gxPlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXktNTAwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaGVhZGluZ0Rlc2NyaXB0aW9uXCIgW2lubmVySFRNTF09XCJoZWFkaW5nRGVzY3JpcHRpb25cIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCIhaGVhZGluZ0Rlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBBIGxpc3Qgb2YgYWxsIHRoZSA8c3BhbiBjbGFzcz1cImxvd2VyY2FzZVwiPnt7aGVhZGluZ0xhYmVsIHx8ICdkYXRhc2V0cyd9fTwvc3Bhbj4gY3VycmVudGx5XG4gICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUuXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNiBmbGV4IGZsZXgtY29sLXJldmVyc2UganVzdGlmeS1zdHJldGNoXCIgKm5nSWY9XCIhaGlkZUNyZWF0ZVwiPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImNyZWF0ZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcHgtNCBweS0yIGJvcmRlciBib3JkZXItdHJhbnNwYXJlbnQgdGV4dC1zbSBmb250LW1lZGl1bSByb3VuZGVkLW1kIHNoYWRvdy1zbSB0ZXh0LXdoaXRlIGJnLXByaW1hcnkgZm9jdXM6b3V0bGluZS1ub25lXCI+XG4gICAgICAgICAgICAgICAgQ3JlYXRlIHt7bmV3VGl0bGUgfHwgJ0RhdGFzZXQnfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwicHgtNCBzbTpweC02IGxnOnB4LTggbXQtMFwiPlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCItbXktMiAtbXgtNCBzbTotbXgtNiBsZzotbXgtOFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlubGluZS1ibG9jayBtaW4tdy1mdWxsIHB5LTIgYWxpZ24tbWlkZGxlXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTMgc206bXQtMCBmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cIm1vYmlsZS1zZWFyY2gtY2FuZGlkYXRlXCIgY2xhc3M9XCJzci1vbmx5XCI+U2VhcmNoPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSBiZy13aGl0ZSBmbGV4IGl0ZW1zLWNlbnRlciBmbGV4LWdyb3cgZm9jdXMtd2l0aGluOnotMTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWJzb2x1dGUgaW5zZXQteS0wIGxlZnQtMCBwbC0zIGZsZXggaXRlbXMtY2VudGVyIHBvaW50ZXItZXZlbnRzLW5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImgtNSB3LTUgdGV4dC1ncmF5LTQwMFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNOCA0YTQgNCAwIDEwMCA4IDQgNCAwIDAwMC04ek0yIDhhNiA2IDAgMTExMC44OSAzLjQ3Nmw0LjgxNyA0LjgxN2ExIDEgMCAwMS0xLjQxNCAxLjQxNGwtNC44MTYtNC44MTZBNiA2IDAgMDEyIDh6XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAtcnVsZT1cImV2ZW5vZGRcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJtb2JpbGUtc2VhcmNoLWNhbmRpZGF0ZVwiIGlkPVwibW9iaWxlLXNlYXJjaC1jYW5kaWRhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJsb2NrIHctZnVsbCByb3VuZGVkLW5vbmUgcGwtMTAgYm9yZGVyLXQtMCBib3JkZXItbC0wIGJvcmRlci1ncmF5LTMwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIHt7c2hhcmVkID8gJ2RhdGEgZmVlZHMnIDogJ3N0b3JlZCBxdWVyaWVzJ319XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleXVwKT1cInNlYXJjaFRleHQubmV4dCgkZXZlbnQudGFyZ2V0LnZhbHVlKVwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJvcmRlci1iIGgtZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAgW2Rpc2FibGVkXT1cIiFjYXRlZ29yaWVzLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxpc3Qtc3dpdGNoZXIgaC1mdWxsIHJvdW5kZWQtbm9uZSBib3JkZXItbm9uZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImxpc3RTdHlsZVwiIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZUxpc3RTdHlsZSgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGUgdmFsdWU9XCJHUklEXCIgW25nQ2xhc3NdPVwieydvcGFjaXR5LTUwJzogIWNhdGVnb3JpZXMubGVuZ3RofVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyb3VuZGVkLW5vbmUgaC1mdWxsIGZsZXggaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmdyaWRfdmlldzwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIHZhbHVlPVwiTElTVFwiIFtuZ0NsYXNzXT1cInsnb3BhY2l0eS01MCc6ICFjYXRlZ29yaWVzLmxlbmd0aH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicm91bmRlZC1ub25lIGgtZnVsbCBmbGV4IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5yZW9yZGVyPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cIm1pbi13LWZ1bGwgYm9yZGVyLXNlcGFyYXRlXCIgKm5nSWY9XCJkYXRhc2V0cy5sZW5ndGggJiYgbGlzdFN0eWxlID09PSAnTElTVCdcIlxuICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImJvcmRlci1zcGFjaW5nOiAwXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0Ym9keSBjbGFzcz1cImJnLXdoaXRlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJkYXRhc2V0cy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImJvcmRlci10IGJvcmRlci1ncmF5LTIwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbGdyb3VwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzdGlja3kgdG9wLTAgei0xMCBib3JkZXItYiBib3JkZXItZ3JheS0zMDAgYmctZ3JheS0xMDAgcGwtNCB0ZXh0LWxlZnQgdGV4dC14cyBmb250LXNlbWlib2xkIHRleHQtZ3JheS05MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3t0YWJsZUhlYWRpbmcgfHwgJ0RhdGFzZXRzJ319PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sZ3JvdXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInN0aWNreSB0b3AtMCB6LTEwIGJvcmRlci1iIGJvcmRlci1ncmF5LTMwMCBiZy1ncmF5LTEwMCBwbC00IHRleHQtbGVmdCB0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdGV4dC1ncmF5LTkwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sZ3JvdXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInN0aWNreSB0b3AtMCB6LTEwIGJvcmRlci1iIGJvcmRlci1ncmF5LTMwMCBiZy1ncmF5LTEwMCBwbC00IHRleHQtcmlnaHQgdGV4dC14cyBmb250LXNlbWlib2xkIHRleHQtZ3JheS05MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgW21hdE1lbnVUcmlnZ2VyRm9yXT1cInByb2plY3RDYXRlZ29yaWVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWNhdGVnb3JpZXMubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRpc2FibGVkOm9wYWNpdHktNTAgLW1sLXB4IHJlbGF0aXZlIGlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBweS0zIHB4LTQgYm9yZGVyLWwgYm9yZGVyLWdyYXktMzAwIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ncmF5LTcwMCBiZy1ncmF5LTEwMCBob3ZlcjpiZy1ncmF5LTIwMCBmb2N1czpvdXRsaW5lLW5vbmUgYm9yZGVyLXQtMCBib3JkZXItci0wXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBjbGFzcz1cImgtNSB3LTUgdGV4dC1ncmF5LTQwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwiY3VycmVudENvbG9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0zIDNhMSAxIDAgMDExLTFoMTJhMSAxIDAgMDExIDF2M2ExIDEgMCAwMS0uMjkzLjcwN0wxMiAxMS40MTRWMTVhMSAxIDAgMDEtLjI5My43MDdsLTIgMkExIDEgMCAwMTggMTd2LTUuNTg2TDMuMjkzIDYuNzA3QTEgMSAwIDAxMyA2VjN6XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwLXJ1bGU9XCJldmVub2RkXCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1sLTJcIj5DYXRlZ29yaWVzPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cIm1sLTIuNSAtbXItMS41IGgtNSB3LTUgdGV4dC1ncmF5LTQwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNS4yOTMgNy4yOTNhMSAxIDAgMDExLjQxNCAwTDEwIDEwLjU4NmwzLjI5My0zLjI5M2ExIDEgMCAxMTEuNDE0IDEuNDE0bC00IDRhMSAxIDAgMDEtMS40MTQgMGwtNC00YTEgMSAwIDAxMC0xLjQxNHpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAtcnVsZT1cImV2ZW5vZGRcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbWVudSAjcHJvamVjdENhdGVnb3JpZXM9XCJtYXRNZW51XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJ0b2dnbGVDYXRlZ29yeSgkZXZlbnQsIGNhdGVnb3J5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1tZW51LWl0ZW0gKm5nRm9yPVwibGV0IGNhdGVnb3J5IG9mIGNhdGVnb3JpZXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNvbG9yPVwicHJpbWFyeVwiICpuZ0lmPVwiY2F0ZWdvcnkuY2hlY2tlZFwiPmNoZWNrX2JveDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cIiFjYXRlZ29yeS5jaGVja2VkXCI+Y2hlY2tfYm94X291dGxpbmVfYmxhbms8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NhdGVnb3J5LmNhdGVnb3J5fX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1tZW51PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBlbGVtZW50IG9mIGRhdGFzZXRzOyBsZXQgaSA9IGluZGV4XCIgY2xhc3M9XCJob3ZlcjpiZy1ncmF5LTUwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImJvcmRlci1ncmF5LTIwMCBweS0yIHB4LTQgdGV4dC1zbSB3LTEvMiB0ZXh0LWdyYXktOTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydib3JkZXItYi0wJzogaSA9PT0gZGF0YXNldHMubGVuZ3RoIC0gMSwgJ2JvcmRlci1iJzogaSAhPT0gZGF0YXNldHMubGVuZ3RoIC0gMSwnb3BhY2l0eS01MCc6IChlbGVtZW50LmVuYWJsZWQgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogIWVsZW1lbnQuZW5hYmxlZCkgJiYgIWFkbWlufVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImVsZW1lbnQuZW5hYmxlZCB8fCBhZG1pblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaXRlbS10aXRsZS1zZWxlY3QgZmxleCBpdGVtcy1jZW50ZXIgZm9udC1tZWRpdW0gY3Vyc29yLXBvaW50ZXIgaG92ZXI6dW5kZXJsaW5lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNoYXJlZCA/IGV4dGVuZChlbGVtZW50LmlkKSA6IHZpZXcoZWxlbWVudC5pZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2VsZW1lbnQudGl0bGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWVsZW1lbnQuZW5hYmxlZCAmJiAhYWRtaW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIml0ZW0tdGl0bGUtc2VsZWN0IGZsZXggaXRlbXMtY2VudGVyIGZvbnQtbWVkaXVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tlbGVtZW50LnRpdGxlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwiZWxlbWVudC52aWV3RGVzY3JpcHRpb24gPSAhZWxlbWVudC52aWV3RGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtZ3JheS00MDAgZm9udC10aGluIGN1cnNvci1wb2ludGVyIGhvdmVyOnVuZGVybGluZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZWxlbWVudC5zdW1tYXJ5fX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImVsZW1lbnQudmlld0Rlc2NyaXB0aW9uICYmIGVsZW1lbnQuZGVzY3JpcHRpb25cIiBjbGFzcz1cIm10LTRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cImVsZW1lbnQuZGVzY3JpcHRpb25cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJib3JkZXItZ3JheS0yMDAgcHktMiBweC00IHRleHQtc20gIHRleHQtZ3JheS05MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2JvcmRlci1iLTAnOiBpID09PSBkYXRhc2V0cy5sZW5ndGggLSAxLCAnYm9yZGVyLWInOiBpICE9PSBkYXRhc2V0cy5sZW5ndGggLSAxLCdvcGFjaXR5LTUwJzogKGVsZW1lbnQuZW5hYmxlZCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiAhZWxlbWVudC5lbmFibGVkKSAmJiAhYWRtaW59XCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlubGluZS1jYXRlZ29yeVwiICpuZ0lmPVwiZWxlbWVudC5jYXRlZ29yaWVzLmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgKm5nRm9yPVwibGV0IGNhdGVnb3J5IG9mIGVsZW1lbnQuY2F0ZWdvcmllc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y2F0ZWdvcnkuY2F0ZWdvcnl9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwicmVsYXRpdmUgd2hpdGVzcGFjZS1ub3dyYXAgYm9yZGVyLWdyYXktMjAwIHB5LTIgcHgtNCB0ZXh0LXJpZ2h0IHRleHQtc20gZm9udC1tZWRpdW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2JvcmRlci1iLTAnOiBpID09PSBkYXRhc2V0cy5sZW5ndGggLSAxLCAnYm9yZGVyLWInOiBpICE9PSBkYXRhc2V0cy5sZW5ndGggLSAxfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiKGVsZW1lbnQuZW5hYmxlZCA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IGVsZW1lbnQuZW5hYmxlZCkgfHwgYWRtaW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1lbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhc2hhcmVkXCIgbWF0LWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwidmlldyhlbGVtZW50LmlkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVkaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInNoYXJlZFwiIG1hdC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cImV4dGVuZChlbGVtZW50LmlkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZSB7e25ld1RpdGxlIHx8ICdEYXRhc2V0J319XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCIhc2hhcmVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpdmlkZXJcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIG1hdC1pY29uLWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVwiaXRlbU1lbnVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPm1vcmVfdmVydDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1tZW51ICNpdGVtTWVudT1cIm1hdE1lbnVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJleHRlbmQoZWxlbWVudC5pZClcIj5DcmVhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuZGVkIHt7bmV3VGl0bGUgfHwgJ0RhdGFzZXQnfX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJlZGl0TWV0YWRhdGEoZWxlbWVudClcIj5FZGl0IE1ldGFkYXRhPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiZGVsZXRlKGVsZW1lbnQuaWQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWxldGUge3tuZXdUaXRsZSB8fCAnRGF0YXNldCd9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW1lbnU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgW2hyZWZdPVwiJ21haWx0bzonICsgY29udGFjdFVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZWxlbWVudC5lbmFibGVkID09PSB1bmRlZmluZWQgPyBmYWxzZSA6ICFlbGVtZW50LmVuYWJsZWQpICYmICFhZG1pblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250YWN0IFVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJvcmRlci10IGJnLWdyYXktNTAgd2hpdGVzcGFjZS1ub3dyYXAgYm9yZGVyLWIgYm9yZGVyLWdyYXktMjAwIHB5LTEgcHgtNCB0ZXh0LXNtIHRleHQtZ3JheS05MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhZ2luZy10b29sYmFyIGZsZXggYWxpZ24tY2VudGVyIGp1c3RpZnktZW5kXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzIHRleHQtZ3JheS00MDAgbXItMTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hvd2luZyB7e29mZnNldCArIDF9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHt7KHBhZ2UgKiBsaW1pdCkgLSAobGltaXQgLSBkYXRhc2V0cy5sZW5ndGgpfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IFt2YWx1ZV09XCJsaW1pdFwiIChjaGFuZ2UpPVwicGFnZVNpemVDaGFuZ2UoJGV2ZW50LnRhcmdldC52YWx1ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLTEuNSBtci04XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cIjFcIj4xPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cIjVcIj41PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cIjEwXCI+MTA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwiMjVcIj4yNTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCI1MFwiPjUwPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cIjEwMFwiPjEwMDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCIyNTBcIj4yNTA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwiMTAwMFwiPjEwMDA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBjbGFzcz1cIm1yLTRcIiAoY2xpY2spPVwiZGVjcmVhc2VPZmZzZXQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwicGFnZSA8PSAxXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jaGV2cm9uX2xlZnQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJpbmNyZWFzZU9mZnNldCgpXCIgW2Rpc2FibGVkXT1cImVuZE9mUmVzdWx0c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2hldnJvbl9yaWdodDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgICAgICA8L3RhYmxlPlxuXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cImRhdGFzZXRzLmxlbmd0aCAmJiBsaXN0U3R5bGUgPT09ICdHUklEJ1wiPlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteS00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0yIGdyaWQgZ3JpZC1jb2xzLTEgZ2FwLTUgc206Z3JpZC1jb2xzLTIgbGc6Z3JpZC1jb2xzLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG5nRm9yIGxldC1pdGVtIFtuZ0Zvck9mXT1cIk9iamVjdC5rZXlzKGdyaWRJdGVtcylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJncmlkSXRlbXNbaXRlbV0ubGlzdC5sZW5ndGhcIiBjbGFzcz1cImJnLXdoaXRlIG92ZXJmbG93LWhpZGRlbiBzaGFkb3cgcm91bmRlZC1sZyBmbGV4IGZsZXgtY29sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTUgcHktNCBiZy1ncmF5LTUwIFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtbC0xIHRleHQtYmFzZSBmb250LW1lZGl1bSB0ZXh0LWdyYXktNTAwIHRydW5jYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tncmlkSXRlbXNbaXRlbV0udGl0bGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTEgZ3JpZC1pdGVtLWNvbnRhaW5lciBvdmVyZmxvdy15LXNjcm9sbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZS1maXhlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBsaXN0SXRlbSBvZiBncmlkSXRlbXNbaXRlbV0ubGlzdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJob3ZlcjpiZy1ncmF5LTUwIGN1cnNvci1wb2ludGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwibGlzdEl0ZW0uZW5hYmxlZCB8fCBhZG1pblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnb3BhY2l0eS01MCc6IChsaXN0SXRlbS5lbmFibGVkID09PSB1bmRlZmluZWQgPyBmYWxzZSA6ICFsaXN0SXRlbS5lbmFibGVkKSAmJiAhYWRtaW59XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNoYXJlZCA/IGV4dGVuZChsaXN0SXRlbS5pZCkgOiB2aWV3KGxpc3RJdGVtLmlkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidy0yLzMgcHktMiBwbC00IHByLTMgdGV4dC1zbSB0ZXh0LWdyYXktNTAwIHNtOnBsLTYgYnJlYWstd29yZHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tsaXN0SXRlbS50aXRsZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCIhbGlzdEl0ZW0uZW5hYmxlZCAmJiAhYWRtaW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J29wYWNpdHktNTAnOiAobGlzdEl0ZW0uZW5hYmxlZCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiAhbGlzdEl0ZW0uZW5hYmxlZCkgJiYgIWFkbWlufVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidy0yLzMgcHktMiBwbC00IHByLTMgdGV4dC1zbSB0ZXh0LWdyYXktNTAwIHNtOnBsLTYgYnJlYWstd29yZHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tsaXN0SXRlbS50aXRsZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ3LTEvM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWVuZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIobGlzdEl0ZW0uZW5hYmxlZCA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IGxpc3RJdGVtLmVuYWJsZWQpIHx8IGFkbWluXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWVuZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhICpuZ0lmPVwiIXNoYXJlZFwiIGNsYXNzPVwiaG92ZXI6dW5kZXJsaW5lIGZsZXggaXRlbXMtY2VudGVyIGZvbnQtbWVkaXVtIHRleHQtcHJpbWFyeVwiIChjbGljayk9XCJ2aWV3KGxpc3RJdGVtLmlkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFZGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhICpuZ0lmPVwic2hhcmVkXCIgY2xhc3M9XCJob3Zlcjp1bmRlcmxpbmUgZmxleCBpdGVtcy1jZW50ZXIgZm9udC1tZWRpdW0gdGV4dC1wcmltYXJ5XCIgKGNsaWNrKT1cImV4dGVuZChsaXN0SXRlbS5pZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlIHt7bmV3VGl0bGUgfHwgJ0RhdGFzZXQnfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cIiFzaGFyZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1sLTIgZGl2aWRlclwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImhvdmVyOnVuZGVybGluZSBmbGV4IGl0ZW1zLWNlbnRlciBmb250LW1lZGl1bSB0ZXh0LXByaW1hcnlcIiBbbWF0TWVudVRyaWdnZXJGb3JdPVwiaXRlbU1lbnVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5tb3JlX3ZlcnQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbWVudSAjaXRlbU1lbnU9XCJtYXRNZW51XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImV4dGVuZChsaXN0SXRlbS5pZClcIj5DcmVhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbmRlZCB7e25ld1RpdGxlIHx8ICdEYXRhc2V0J319PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImVkaXRNZXRhZGF0YShsaXN0SXRlbSlcIj5FZGl0IE1ldGFkYXRhPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImRlbGV0ZShsaXN0SXRlbS5pZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWxldGUge3tuZXdUaXRsZSB8fCAnRGF0YXNldCd9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1tZW51PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIFtocmVmXT1cIidtYWlsdG86JyArIGNvbnRhY3RVc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImhvdmVyOnVuZGVybGluZSBmbGV4IGl0ZW1zLWNlbnRlciBmb250LW1lZGl1bSB0ZXh0LXByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIobGlzdEl0ZW0uZW5hYmxlZCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiAhbGlzdEl0ZW0uZW5hYmxlZCkgJiYgIWFkbWluXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGFjdCBVc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJnLWdyYXktNTAgcHgtNSBweS0zXCI+LS0+XG48IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zbVwiPi0tPlxuPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhLS0+XG48IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb250LW1lZGl1bSB0ZXh0LXNlY29uZGFyeSBjYXBpdGFsaXplIGZsZXggaXRlbXMtY2VudGVyXCI+LS0+XG48IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgYWxsLS0+XG48IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jaGV2cm9uX3JpZ2h0PC9tYXQtaWNvbj4tLT5cbjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+LS0+XG48IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4tLT5cbjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwicC00XCIgKm5nSWY9XCIhZGF0YXNldHMubGVuZ3RoICYmICFsb2FkaW5nXCI+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImNyZWF0ZSgpXCIgKm5nSWY9XCIhaGlkZUNyZWF0ZVwiXG4gICAgICAgICAgICBjbGFzcz1cInJlbGF0aXZlIGJsb2NrIHctZnVsbCBib3JkZXItMiBib3JkZXItZ3JheS0zMDAgYm9yZGVyLWRhc2hlZCByb3VuZGVkLWxnIHAtMTIgdGV4dC1jZW50ZXIgaG92ZXI6Ym9yZGVyLWdyYXktNDAwIGZvY3VzOm91dGxpbmUtbm9uZVwiPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSBpbmxpbmUtYmxvY2tcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBteC1hdXRvIHRleHQtNnhsIGgtMTQgdy0yMCB0ZXh0LWdyYXktMzAwXCI+cXVlcnlfc3RhdHM8L3NwYW4+XG4gICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgICAgICBjbGFzcz1cInJpZ2h0LTAgYm90dG9tLTAgYWJzb2x1dGUgaC04IHctOCB0ZXh0LWdyYXktNDAwXCIgZmlsbD1cIm5vbmVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiNFwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIGQ9XCJNMTIgNHYxNm04LThINFwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8c3BhbiBjbGFzcz1cIm10LTIgYmxvY2sgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXktOTAwXCI+Q3JlYXRlIHt7bmV3VGl0bGUgfHwgJ0RhdGFzZXQnfX08L3NwYW4+XG4gICAgPC9idXR0b24+XG48L2Rpdj5cbiJdfQ==
|