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.
Files changed (184) hide show
  1. package/fesm2022/ng-kinintel.mjs +11874 -0
  2. package/fesm2022/ng-kinintel.mjs.map +1 -0
  3. package/index.d.ts +2818 -5
  4. package/package.json +6 -14
  5. package/esm2020/lib/components/alert-groups/alert-groups.component.mjs +0 -76
  6. package/esm2020/lib/components/alert-groups/edit-alert-group/edit-alert-group.component.mjs +0 -83
  7. package/esm2020/lib/components/dashboard-editor/configure-item/configure-item.component.mjs +0 -853
  8. package/esm2020/lib/components/dashboard-editor/configure-item/edit-dashboard-alert/edit-dashboard-alert.component.mjs +0 -56
  9. package/esm2020/lib/components/dashboard-editor/configure-item/html-documentation/html-documentation.component.mjs +0 -114
  10. package/esm2020/lib/components/dashboard-editor/configure-item/table-cell-formatter/table-cell-formatter.component.mjs +0 -163
  11. package/esm2020/lib/components/dashboard-editor/configure-item/vis-network-options.json +0 -135
  12. package/esm2020/lib/components/dashboard-editor/dashboard-editor.component.mjs +0 -580
  13. package/esm2020/lib/components/dashboard-editor/dashboard-parameter/dashboard-parameter.component.mjs +0 -15
  14. package/esm2020/lib/components/dashboard-editor/dashboard-settings/dashboard-settings.component.mjs +0 -50
  15. package/esm2020/lib/components/dashboard-editor/item-component/item-component.component.mjs +0 -1226
  16. package/esm2020/lib/components/dashboard-editor/source-selector-dialog/source-selector-dialog.component.mjs +0 -111
  17. package/esm2020/lib/components/dashboards/dashboards.component.mjs +0 -163
  18. package/esm2020/lib/components/dashboards/view-dashboard/view-dashboard.component.mjs +0 -429
  19. package/esm2020/lib/components/data-explorer/change-source-warning/change-source-warning.component.mjs +0 -20
  20. package/esm2020/lib/components/data-explorer/data-explorer.component.mjs +0 -243
  21. package/esm2020/lib/components/data-explorer/export-data/export-data.component.mjs +0 -62
  22. package/esm2020/lib/components/data-explorer/snapshot-api-access/snapshot-api-access.component.mjs +0 -70
  23. package/esm2020/lib/components/data-explorer/snapshot-profile-dialog/snapshot-profile-dialog.component.mjs +0 -190
  24. package/esm2020/lib/components/data-picker/data-picker.component.mjs +0 -79
  25. package/esm2020/lib/components/data-search/data-search.component.mjs +0 -11
  26. package/esm2020/lib/components/data-sharing-invite/data-sharing-invite.component.mjs +0 -52
  27. package/esm2020/lib/components/dataset/create-dataset/create-dataset.component.mjs +0 -47
  28. package/esm2020/lib/components/dataset/dataset-editor/available-columns/available-columns.component.mjs +0 -28
  29. package/esm2020/lib/components/dataset/dataset-editor/dataset-add-join/dataset-add-join.component.mjs +0 -344
  30. package/esm2020/lib/components/dataset/dataset-editor/dataset-column-settings/dataset-column-editor/dataset-column-editor.component.mjs +0 -80
  31. package/esm2020/lib/components/dataset/dataset-editor/dataset-column-settings/dataset-column-settings.component.mjs +0 -54
  32. package/esm2020/lib/components/dataset/dataset-editor/dataset-create-formula/dataset-create-formula.component.mjs +0 -67
  33. package/esm2020/lib/components/dataset/dataset-editor/dataset-editor.component.mjs +0 -1134
  34. package/esm2020/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter/dataset-filter.component.mjs +0 -201
  35. package/esm2020/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter-inclusion/dataset-filter-inclusion.component.mjs +0 -25
  36. package/esm2020/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter-junction/dataset-filter-junction.component.mjs +0 -72
  37. package/esm2020/lib/components/dataset/dataset-editor/dataset-filters/dataset-filters.component.mjs +0 -62
  38. package/esm2020/lib/components/dataset/dataset-editor/dataset-name-dialog/dataset-name-dialog.component.mjs +0 -41
  39. package/esm2020/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-add-parameter/dataset-add-parameter.component.mjs +0 -78
  40. package/esm2020/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-type/dataset-parameter-type.component.mjs +0 -39
  41. package/esm2020/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-values.component.mjs +0 -75
  42. package/esm2020/lib/components/dataset/dataset-editor/dataset-summarise/dataset-summarise.component.mjs +0 -107
  43. package/esm2020/lib/components/dataset/dataset-editor/move-transformation-confirmation/move-transformation-confirmation.component.mjs +0 -20
  44. package/esm2020/lib/components/dataset/dataset-editor/remove-transformation-warning/remove-transformation-warning.component.mjs +0 -20
  45. package/esm2020/lib/components/dataset/dataset-editor/save-as-query/save-as-query.component.mjs +0 -58
  46. package/esm2020/lib/components/dataset/dataset-editor/share-query/share-query.component.mjs +0 -110
  47. package/esm2020/lib/components/dataset/dataset-editor/upstream-changes-confirmation/upstream-changes-confirmation.component.mjs +0 -20
  48. package/esm2020/lib/components/dataset/dataset.component.mjs +0 -294
  49. package/esm2020/lib/components/datasource/create-datasource/advanced-settings/advanced-settings.component.mjs +0 -130
  50. package/esm2020/lib/components/datasource/create-datasource/api-access/api-access.component.mjs +0 -132
  51. package/esm2020/lib/components/datasource/create-datasource/create-datasource.component.mjs +0 -729
  52. package/esm2020/lib/components/datasource/create-datasource/import-data/import-data.component.mjs +0 -146
  53. package/esm2020/lib/components/datasource/create-datasource/import-data/import-wizard/import-wizard.component.mjs +0 -165
  54. package/esm2020/lib/components/datasource/create-datasource/tabular-datasource/tabular-datasource.component.mjs +0 -145
  55. package/esm2020/lib/components/datasource/datasource.component.mjs +0 -162
  56. package/esm2020/lib/components/datasource/document-datasource/document-datasource.component.mjs +0 -297
  57. package/esm2020/lib/components/export-project/export-project.component.mjs +0 -29
  58. package/esm2020/lib/components/feeds/feed/feed.component.mjs +0 -92
  59. package/esm2020/lib/components/feeds/feeds.component.mjs +0 -145
  60. package/esm2020/lib/components/job-tasks/job-tasks.component.mjs +0 -25
  61. package/esm2020/lib/components/marketplace/marketplace.component.mjs +0 -65
  62. package/esm2020/lib/components/metadata/metadata.component.mjs +0 -65
  63. package/esm2020/lib/components/notification-groups/edit-notification-group/edit-notification-group.component.mjs +0 -113
  64. package/esm2020/lib/components/notification-groups/notification-groups.component.mjs +0 -86
  65. package/esm2020/lib/components/project-picker/project-picker.component.mjs +0 -118
  66. package/esm2020/lib/components/project-settings/project-link-selection/project-link-selection.component.mjs +0 -104
  67. package/esm2020/lib/components/project-settings/project-settings.component.mjs +0 -155
  68. package/esm2020/lib/components/query-caching/edit-query-cache/edit-query-cache.component.mjs +0 -51
  69. package/esm2020/lib/components/query-caching/query-cache-view/query-cache-view.component.mjs +0 -121
  70. package/esm2020/lib/components/query-caching/query-caching.component.mjs +0 -162
  71. package/esm2020/lib/components/shared-with-me/feed-api-modal/feed-api-modal.component.mjs +0 -45
  72. package/esm2020/lib/components/shared-with-me/shared-with-me.component.mjs +0 -174
  73. package/esm2020/lib/components/snapshots/snapshots.component.mjs +0 -244
  74. package/esm2020/lib/components/tag-picker/tag-picker.component.mjs +0 -74
  75. package/esm2020/lib/components/task-time-periods/task-time-periods.component.mjs +0 -55
  76. package/esm2020/lib/components/whitelisted-sql-functions/whitelisted-sql-functions.component.mjs +0 -40
  77. package/esm2020/lib/guards/dashboard-changes.guard.mjs +0 -22
  78. package/esm2020/lib/kinintel-config.mjs +0 -3
  79. package/esm2020/lib/ng-kinintel.module.mjs +0 -437
  80. package/esm2020/lib/objects/action-event.mjs +0 -16
  81. package/esm2020/lib/services/alert.service.mjs +0 -52
  82. package/esm2020/lib/services/dashboard.service.mjs +0 -75
  83. package/esm2020/lib/services/data-processor.service.mjs +0 -56
  84. package/esm2020/lib/services/data-search.service.mjs +0 -36
  85. package/esm2020/lib/services/dataset.service.mjs +0 -187
  86. package/esm2020/lib/services/datasource.service.mjs +0 -93
  87. package/esm2020/lib/services/external.service.mjs +0 -33
  88. package/esm2020/lib/services/feed.service.mjs +0 -50
  89. package/esm2020/lib/services/notification.service.mjs +0 -41
  90. package/esm2020/lib/services/project.service.mjs +0 -130
  91. package/esm2020/lib/services/tag.service.mjs +0 -63
  92. package/esm2020/ng-kinintel.mjs +0 -5
  93. package/esm2020/public-api.mjs +0 -43
  94. package/fesm2015/ng-kinintel.mjs +0 -12182
  95. package/fesm2015/ng-kinintel.mjs.map +0 -1
  96. package/fesm2020/ng-kinintel.mjs +0 -11872
  97. package/fesm2020/ng-kinintel.mjs.map +0 -1
  98. package/lib/components/alert-groups/alert-groups.component.d.ts +0 -30
  99. package/lib/components/alert-groups/edit-alert-group/edit-alert-group.component.d.ts +0 -28
  100. package/lib/components/dashboard-editor/configure-item/configure-item.component.d.ts +0 -256
  101. package/lib/components/dashboard-editor/configure-item/edit-dashboard-alert/edit-dashboard-alert.component.d.ts +0 -16
  102. package/lib/components/dashboard-editor/configure-item/html-documentation/html-documentation.component.d.ts +0 -59
  103. package/lib/components/dashboard-editor/configure-item/table-cell-formatter/table-cell-formatter.component.d.ts +0 -26
  104. package/lib/components/dashboard-editor/dashboard-editor.component.d.ts +0 -85
  105. package/lib/components/dashboard-editor/dashboard-parameter/dashboard-parameter.component.d.ts +0 -8
  106. package/lib/components/dashboard-editor/dashboard-settings/dashboard-settings.component.d.ts +0 -22
  107. package/lib/components/dashboard-editor/item-component/item-component.component.d.ts +0 -264
  108. package/lib/components/dashboard-editor/source-selector-dialog/source-selector-dialog.component.d.ts +0 -30
  109. package/lib/components/dashboards/dashboards.component.d.ts +0 -56
  110. package/lib/components/dashboards/view-dashboard/view-dashboard.component.d.ts +0 -81
  111. package/lib/components/data-explorer/change-source-warning/change-source-warning.component.d.ts +0 -11
  112. package/lib/components/data-explorer/data-explorer.component.d.ts +0 -61
  113. package/lib/components/data-explorer/export-data/export-data.component.d.ts +0 -17
  114. package/lib/components/data-explorer/snapshot-api-access/snapshot-api-access.component.d.ts +0 -25
  115. package/lib/components/data-explorer/snapshot-profile-dialog/snapshot-profile-dialog.component.d.ts +0 -44
  116. package/lib/components/data-picker/data-picker.component.d.ts +0 -32
  117. package/lib/components/data-search/data-search.component.d.ts +0 -5
  118. package/lib/components/data-sharing-invite/data-sharing-invite.component.d.ts +0 -21
  119. package/lib/components/dataset/create-dataset/create-dataset.component.d.ts +0 -17
  120. package/lib/components/dataset/dataset-editor/available-columns/available-columns.component.d.ts +0 -12
  121. package/lib/components/dataset/dataset-editor/dataset-add-join/dataset-add-join.component.d.ts +0 -61
  122. package/lib/components/dataset/dataset-editor/dataset-column-settings/dataset-column-editor/dataset-column-editor.component.d.ts +0 -21
  123. package/lib/components/dataset/dataset-editor/dataset-column-settings/dataset-column-settings.component.d.ts +0 -20
  124. package/lib/components/dataset/dataset-editor/dataset-create-formula/dataset-create-formula.component.d.ts +0 -19
  125. package/lib/components/dataset/dataset-editor/dataset-editor.component.d.ts +0 -131
  126. package/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter/dataset-filter.component.d.ts +0 -63
  127. package/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter-inclusion/dataset-filter-inclusion.component.d.ts +0 -11
  128. package/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter-junction/dataset-filter-junction.component.d.ts +0 -20
  129. package/lib/components/dataset/dataset-editor/dataset-filters/dataset-filters.component.d.ts +0 -16
  130. package/lib/components/dataset/dataset-editor/dataset-name-dialog/dataset-name-dialog.component.d.ts +0 -18
  131. package/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-add-parameter/dataset-add-parameter.component.d.ts +0 -23
  132. package/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-type/dataset-parameter-type.component.d.ts +0 -13
  133. package/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-values.component.d.ts +0 -22
  134. package/lib/components/dataset/dataset-editor/dataset-summarise/dataset-summarise.component.d.ts +0 -27
  135. package/lib/components/dataset/dataset-editor/move-transformation-confirmation/move-transformation-confirmation.component.d.ts +0 -11
  136. package/lib/components/dataset/dataset-editor/remove-transformation-warning/remove-transformation-warning.component.d.ts +0 -11
  137. package/lib/components/dataset/dataset-editor/save-as-query/save-as-query.component.d.ts +0 -25
  138. package/lib/components/dataset/dataset-editor/share-query/share-query.component.d.ts +0 -41
  139. package/lib/components/dataset/dataset-editor/upstream-changes-confirmation/upstream-changes-confirmation.component.d.ts +0 -11
  140. package/lib/components/dataset/dataset.component.d.ts +0 -74
  141. package/lib/components/datasource/create-datasource/advanced-settings/advanced-settings.component.d.ts +0 -26
  142. package/lib/components/datasource/create-datasource/api-access/api-access.component.d.ts +0 -31
  143. package/lib/components/datasource/create-datasource/create-datasource.component.d.ts +0 -112
  144. package/lib/components/datasource/create-datasource/import-data/import-data.component.d.ts +0 -28
  145. package/lib/components/datasource/create-datasource/import-data/import-wizard/import-wizard.component.d.ts +0 -40
  146. package/lib/components/datasource/create-datasource/tabular-datasource/tabular-datasource.component.d.ts +0 -34
  147. package/lib/components/datasource/datasource.component.d.ts +0 -46
  148. package/lib/components/datasource/document-datasource/document-datasource.component.d.ts +0 -64
  149. package/lib/components/export-project/export-project.component.d.ts +0 -9
  150. package/lib/components/feeds/feed/feed.component.d.ts +0 -30
  151. package/lib/components/feeds/feeds.component.d.ts +0 -47
  152. package/lib/components/job-tasks/job-tasks.component.d.ts +0 -11
  153. package/lib/components/marketplace/marketplace.component.d.ts +0 -42
  154. package/lib/components/metadata/metadata.component.d.ts +0 -24
  155. package/lib/components/notification-groups/edit-notification-group/edit-notification-group.component.d.ts +0 -37
  156. package/lib/components/notification-groups/notification-groups.component.d.ts +0 -28
  157. package/lib/components/project-picker/project-picker.component.d.ts +0 -37
  158. package/lib/components/project-settings/project-link-selection/project-link-selection.component.d.ts +0 -32
  159. package/lib/components/project-settings/project-settings.component.d.ts +0 -40
  160. package/lib/components/query-caching/edit-query-cache/edit-query-cache.component.d.ts +0 -17
  161. package/lib/components/query-caching/query-cache-view/query-cache-view.component.d.ts +0 -35
  162. package/lib/components/query-caching/query-caching.component.d.ts +0 -38
  163. package/lib/components/shared-with-me/feed-api-modal/feed-api-modal.component.d.ts +0 -21
  164. package/lib/components/shared-with-me/shared-with-me.component.d.ts +0 -43
  165. package/lib/components/snapshots/snapshots.component.d.ts +0 -52
  166. package/lib/components/tag-picker/tag-picker.component.d.ts +0 -27
  167. package/lib/components/task-time-periods/task-time-periods.component.d.ts +0 -20
  168. package/lib/components/whitelisted-sql-functions/whitelisted-sql-functions.component.d.ts +0 -17
  169. package/lib/guards/dashboard-changes.guard.d.ts +0 -11
  170. package/lib/kinintel-config.d.ts +0 -10
  171. package/lib/ng-kinintel.module.d.ts +0 -116
  172. package/lib/objects/action-event.d.ts +0 -12
  173. package/lib/services/alert.service.d.ts +0 -17
  174. package/lib/services/dashboard.service.d.ts +0 -25
  175. package/lib/services/data-processor.service.d.ts +0 -18
  176. package/lib/services/data-search.service.d.ts +0 -14
  177. package/lib/services/dataset.service.d.ts +0 -56
  178. package/lib/services/datasource.service.d.ts +0 -34
  179. package/lib/services/external.service.d.ts +0 -12
  180. package/lib/services/feed.service.d.ts +0 -19
  181. package/lib/services/notification.service.d.ts +0 -16
  182. package/lib/services/project.service.d.ts +0 -27
  183. package/lib/services/tag.service.d.ts +0 -19
  184. package/public-api.d.ts +0 -38
@@ -1,146 +0,0 @@
1
- import { Component, Inject } from '@angular/core';
2
- import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog';
3
- import * as lodash from 'lodash';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@angular/material/legacy-dialog";
6
- import * as i2 from "ngx-papaparse";
7
- import * as i3 from "../../../../services/datasource.service";
8
- import * as i4 from "@angular/common";
9
- import * as i5 from "@angular/material/legacy-button";
10
- import * as i6 from "@angular/material/icon";
11
- import * as i7 from "@angular/cdk/drag-drop";
12
- import * as i8 from "@angular/forms";
13
- import * as i9 from "@angular/material/legacy-checkbox";
14
- import * as i10 from "@angular/material/legacy-radio";
15
- const _ = lodash.default;
16
- export class ImportDataComponent {
17
- constructor(dialogRef, data, papa, datasourceService) {
18
- this.dialogRef = dialogRef;
19
- this.data = data;
20
- this.papa = papa;
21
- this.datasourceService = datasourceService;
22
- this.import = { headerRow: false, delimiter: ',' };
23
- this.columns = [];
24
- this.importType = 1;
25
- this.importingData = false;
26
- this.rows = [];
27
- this.importErrors = [];
28
- this._ = _;
29
- this.Object = Object;
30
- }
31
- ngOnInit() {
32
- this.columns = this.data.columns;
33
- this.datasourceUpdate = this.data.datasourceUpdate || null;
34
- this.rows = this.data.rows || [];
35
- this.datasourceInstanceKey = this.data.datasourceInstanceKey || null;
36
- this.reloadURL = this.data.reloadURL;
37
- this.importType = !this.rows.length ? 1 : 3;
38
- if (!this.columns.length) {
39
- this.import.headerRow = true;
40
- this.import.replaceColumns = true;
41
- }
42
- if (this.columns.length) {
43
- this.import.columns = _.filter(this.columns, col => {
44
- return col.type !== 'id';
45
- });
46
- }
47
- }
48
- fileUpload(event) {
49
- const fileList = event.target.files;
50
- if (fileList.length > 0) {
51
- const file = fileList[0];
52
- const reader = new FileReader();
53
- reader.onload = () => {
54
- const text = reader.result;
55
- this.import.fileName = file.name;
56
- this.import.data = this.papa.parse(text, {
57
- delimiter: this.import.delimiter,
58
- quoteChar: '"',
59
- escapeChar: '\\'
60
- }).data;
61
- const preview = _.clone(this.import.data);
62
- const rows = preview.slice(0, 3);
63
- this.import.preview = rows.map(row => {
64
- return row.slice(0, 3);
65
- });
66
- };
67
- reader.readAsText(file);
68
- }
69
- }
70
- async importData() {
71
- this.importingData = true;
72
- this.importErrors = [];
73
- if (!this.datasourceUpdate.title) {
74
- this.datasourceUpdate.title = this.import.fileName;
75
- }
76
- if (!this.columns.length || this.import.replaceColumns) {
77
- this.datasourceUpdate.fields = [
78
- { title: 'ID', name: 'id', type: 'id' }
79
- ];
80
- }
81
- if (this.import.headerRow) {
82
- if (!this.columns.length || this.import.replaceColumns) {
83
- this.columns = [];
84
- this.import.data[0].forEach((header, index) => {
85
- this.columns.push({
86
- title: header,
87
- name: _.snakeCase(header),
88
- type: 'string'
89
- });
90
- });
91
- this.import.columns = this.columns;
92
- this.columns.forEach(column => {
93
- this.datasourceUpdate.fields.push(column);
94
- });
95
- }
96
- this.import.data.shift();
97
- }
98
- const csvData = [];
99
- _.filter(this.import.data, item => {
100
- return _.some(item);
101
- }).forEach(row => {
102
- const rowData = {};
103
- this.import.columns.forEach((column, index) => {
104
- rowData[column.name] = (!_.isUndefined(row[index]) && row[index] !== '') ? row[index] : null;
105
- });
106
- csvData.push(rowData);
107
- });
108
- let result = null;
109
- if (this.importType === 1) {
110
- if (this.rows.length && this.datasourceInstanceKey) {
111
- await this.datasourceService.deleteFromDatasource(this.datasourceInstanceKey, []);
112
- }
113
- this.datasourceUpdate.adds = csvData;
114
- if (!this.datasourceInstanceKey) {
115
- result = this.datasourceInstanceKey = await this.datasourceService.createCustomDatasource(this.datasourceUpdate);
116
- }
117
- else {
118
- result = await this.datasourceService.updateCustomDatasource(this.datasourceInstanceKey, this.datasourceUpdate);
119
- }
120
- }
121
- else if (this.importType === 2) {
122
- this.datasourceUpdate.replaces = csvData;
123
- result = await this.datasourceService.updateCustomDatasource(this.datasourceInstanceKey, this.datasourceUpdate);
124
- }
125
- else if (this.importType === 3) {
126
- this.datasourceUpdate.adds = csvData;
127
- result = await this.datasourceService.updateCustomDatasource(this.datasourceInstanceKey, this.datasourceUpdate);
128
- }
129
- if (result && result.rejected > 0) {
130
- this.importErrors = Object.values(result.validationErrors)[0];
131
- }
132
- else {
133
- window.location.href = this.reloadURL + '/' + this.datasourceInstanceKey;
134
- }
135
- }
136
- }
137
- ImportDataComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ImportDataComponent, deps: [{ token: i1.MatLegacyDialogRef }, { token: MAT_DIALOG_DATA }, { token: i2.Papa }, { token: i3.DatasourceService }], target: i0.ɵɵFactoryTarget.Component });
138
- ImportDataComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ImportDataComponent, selector: "ki-import-data", host: { classAttribute: "dialog-wrapper" }, ngImport: i0, template: "<div class=\"dialog\" cdkDrag cdkDragRootElement=\".cdk-overlay-pane\">\n\n <div class=\"dialog-title bg-gray-100\" cdkDragHandle>\n <h2 mat-dialog-title>Import Data</h2>\n\n <button mat-icon-button mat-dialog-close>\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n\n <div class=\"dialog-content\">\n\n <div class=\"mb-2 text-sm font-thin\">Select how you would like to import your data.</div>\n\n <mat-radio-group class=\"mb-4 block\" [(ngModel)]=\"importType\">\n <mat-radio-button class=\"block mb-2\" [value]=\"1\">\n Replace whole dataset\n </mat-radio-button>\n <mat-radio-button *ngIf=\"!_.some(columns, {type: 'id'})\" class=\"block mb-2\" [value]=\"2\" [disabled]=\"!rows.length\">\n Overwrite duplicates (with same unique key)\n </mat-radio-button>\n <mat-radio-button class=\"block\" [value]=\"3\" [disabled]=\"!rows.length\">\n Add (will fail if duplicates exist with same key)\n </mat-radio-button>\n </mat-radio-group>\n\n <label class=\"mb-4\">\n Delimiting character\n <input class=\"w-12\" type=\"text\" [(ngModel)]=\"import.delimiter\" placeholder=\"Enter delimiting character\">\n </label>\n\n <label class=\"mb-4\">\n <input id=\"csvUpload\" type=\"file\" (change)=\"fileUpload($event)\">\n </label>\n\n <mat-checkbox class=\"mb-4\" [(ngModel)]=\"import.headerRow\" [disabled]=\"!columns.length\">\n File contains header row\n </mat-checkbox>\n <div class=\"text-xs text-gray-500\" *ngIf=\"!columns.length\">\n File header row required as no columns have been defined.\n </div>\n\n <mat-checkbox class=\"block mb-4\" *ngIf=\"import.headerRow && columns.length\" [(ngModel)]=\"import.replaceColumns\">\n Replace Columns with Header Row\n </mat-checkbox>\n\n <hr class=\"my-4\">\n\n <div class=\"rounded-md bg-red-50 p-4 mb-4\" *ngIf=\"importErrors.length\">\n <div class=\"flex\">\n <div class=\"shrink-0\">\n <svg class=\"h-5 w-5 text-red-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\" data-slot=\"icon\">\n <path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 1 0 0-16 8 8 0 0 0 0 16ZM8.28 7.22a.75.75 0 0 0-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 1 0 1.06 1.06L10 11.06l1.72 1.72a.75.75 0 1 0 1.06-1.06L11.06 10l1.72-1.72a.75.75 0 0 0-1.06-1.06L10 8.94 8.28 7.22Z\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n <div class=\"ml-3\">\n <h3 class=\"text-sm font-medium text-red-800\">There were {{importErrors.length}} lines with errors in your upload</h3>\n <div class=\"mt-2 text-sm text-red-700\">\n <ul role=\"list\" class=\"list-disc space-y-1 pl-5\">\n <li *ngFor=\"let item of importErrors.slice(0, 10)\">\n <span class=\"text-red-800\">Line {{item.itemNumber + 1}}: {{Object.values(item.validationErrors).join (', ')}}</span>\n </li>\n </ul>\n <div *ngIf=\"importErrors.length > 10\" class=\"mt-4\">* Showing first 10 invalid lines only</div>\n </div>\n </div>\n </div>\n </div>\n\n <ng-template [ngIf]=\"import.preview\">\n <div class=\"uppercase font-medium tracking-wider mb-4 text-xs text-gray-600\">\n Preview\n </div>\n\n <table class=\"preview-table w-full\">\n <ng-template [ngIf]=\"import.headerRow && import.replaceColumns\">\n <thead>\n <tr>\n <th *ngFor=\"let header of import.preview[0]\">{{header}}</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td *ngFor=\"let col of import.preview[1]\">{{col}}</td>\n </tr>\n <tr>\n <td *ngFor=\"let col of import.preview[2]\">{{col}}</td>\n </tr>\n </tbody>\n </ng-template>\n <ng-template [ngIf]=\"!import.headerRow || !import.replaceColumns\">\n <thead>\n <tr>\n <th *ngFor=\"let col of import.columns\">{{col.title}}</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let row of (!import.headerRow ? import.preview : import.preview.slice(1, 3))\">\n <td *ngFor=\"let col of import.columns; let i = index\">{{row[i]}}</td>\n </tr>\n </tbody>\n </ng-template>\n\n\n </table>\n\n </ng-template>\n\n\n </div>\n\n <div class=\"dialog-footer\">\n <button mat-button mat-dialog-close mat-stroked-button type=\"button\">Close</button>\n <button mat-button mat-flat-button color=\"primary\" type=\"button\" (click)=\"importData()\">Import Data</button>\n </div>\n\n</div>\n\n\n", styles: ["table.preview-table td,table.preview-table th{border:1px solid #ddd;vertical-align:middle;padding:.5rem}table.preview-table th{font-weight:500;background-color:#f5f5f5}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.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: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1.MatLegacyDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatLegacyDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i7.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i7.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "directive", type: i8.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i9.MatLegacyCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i10.MatLegacyRadioGroup, selector: "mat-radio-group", exportAs: ["matRadioGroup"] }, { kind: "component", type: i10.MatLegacyRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }] });
139
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ImportDataComponent, decorators: [{
140
- type: Component,
141
- args: [{ selector: 'ki-import-data', host: { class: 'dialog-wrapper' }, template: "<div class=\"dialog\" cdkDrag cdkDragRootElement=\".cdk-overlay-pane\">\n\n <div class=\"dialog-title bg-gray-100\" cdkDragHandle>\n <h2 mat-dialog-title>Import Data</h2>\n\n <button mat-icon-button mat-dialog-close>\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n\n <div class=\"dialog-content\">\n\n <div class=\"mb-2 text-sm font-thin\">Select how you would like to import your data.</div>\n\n <mat-radio-group class=\"mb-4 block\" [(ngModel)]=\"importType\">\n <mat-radio-button class=\"block mb-2\" [value]=\"1\">\n Replace whole dataset\n </mat-radio-button>\n <mat-radio-button *ngIf=\"!_.some(columns, {type: 'id'})\" class=\"block mb-2\" [value]=\"2\" [disabled]=\"!rows.length\">\n Overwrite duplicates (with same unique key)\n </mat-radio-button>\n <mat-radio-button class=\"block\" [value]=\"3\" [disabled]=\"!rows.length\">\n Add (will fail if duplicates exist with same key)\n </mat-radio-button>\n </mat-radio-group>\n\n <label class=\"mb-4\">\n Delimiting character\n <input class=\"w-12\" type=\"text\" [(ngModel)]=\"import.delimiter\" placeholder=\"Enter delimiting character\">\n </label>\n\n <label class=\"mb-4\">\n <input id=\"csvUpload\" type=\"file\" (change)=\"fileUpload($event)\">\n </label>\n\n <mat-checkbox class=\"mb-4\" [(ngModel)]=\"import.headerRow\" [disabled]=\"!columns.length\">\n File contains header row\n </mat-checkbox>\n <div class=\"text-xs text-gray-500\" *ngIf=\"!columns.length\">\n File header row required as no columns have been defined.\n </div>\n\n <mat-checkbox class=\"block mb-4\" *ngIf=\"import.headerRow && columns.length\" [(ngModel)]=\"import.replaceColumns\">\n Replace Columns with Header Row\n </mat-checkbox>\n\n <hr class=\"my-4\">\n\n <div class=\"rounded-md bg-red-50 p-4 mb-4\" *ngIf=\"importErrors.length\">\n <div class=\"flex\">\n <div class=\"shrink-0\">\n <svg class=\"h-5 w-5 text-red-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\" data-slot=\"icon\">\n <path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 1 0 0-16 8 8 0 0 0 0 16ZM8.28 7.22a.75.75 0 0 0-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 1 0 1.06 1.06L10 11.06l1.72 1.72a.75.75 0 1 0 1.06-1.06L11.06 10l1.72-1.72a.75.75 0 0 0-1.06-1.06L10 8.94 8.28 7.22Z\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n <div class=\"ml-3\">\n <h3 class=\"text-sm font-medium text-red-800\">There were {{importErrors.length}} lines with errors in your upload</h3>\n <div class=\"mt-2 text-sm text-red-700\">\n <ul role=\"list\" class=\"list-disc space-y-1 pl-5\">\n <li *ngFor=\"let item of importErrors.slice(0, 10)\">\n <span class=\"text-red-800\">Line {{item.itemNumber + 1}}: {{Object.values(item.validationErrors).join (', ')}}</span>\n </li>\n </ul>\n <div *ngIf=\"importErrors.length > 10\" class=\"mt-4\">* Showing first 10 invalid lines only</div>\n </div>\n </div>\n </div>\n </div>\n\n <ng-template [ngIf]=\"import.preview\">\n <div class=\"uppercase font-medium tracking-wider mb-4 text-xs text-gray-600\">\n Preview\n </div>\n\n <table class=\"preview-table w-full\">\n <ng-template [ngIf]=\"import.headerRow && import.replaceColumns\">\n <thead>\n <tr>\n <th *ngFor=\"let header of import.preview[0]\">{{header}}</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td *ngFor=\"let col of import.preview[1]\">{{col}}</td>\n </tr>\n <tr>\n <td *ngFor=\"let col of import.preview[2]\">{{col}}</td>\n </tr>\n </tbody>\n </ng-template>\n <ng-template [ngIf]=\"!import.headerRow || !import.replaceColumns\">\n <thead>\n <tr>\n <th *ngFor=\"let col of import.columns\">{{col.title}}</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let row of (!import.headerRow ? import.preview : import.preview.slice(1, 3))\">\n <td *ngFor=\"let col of import.columns; let i = index\">{{row[i]}}</td>\n </tr>\n </tbody>\n </ng-template>\n\n\n </table>\n\n </ng-template>\n\n\n </div>\n\n <div class=\"dialog-footer\">\n <button mat-button mat-dialog-close mat-stroked-button type=\"button\">Close</button>\n <button mat-button mat-flat-button color=\"primary\" type=\"button\" (click)=\"importData()\">Import Data</button>\n </div>\n\n</div>\n\n\n", styles: ["table.preview-table td,table.preview-table th{border:1px solid #ddd;vertical-align:middle;padding:.5rem}table.preview-table th{font-weight:500;background-color:#f5f5f5}\n"] }]
142
- }], ctorParameters: function () { return [{ type: i1.MatLegacyDialogRef }, { type: undefined, decorators: [{
143
- type: Inject,
144
- args: [MAT_DIALOG_DATA]
145
- }] }, { type: i2.Papa }, { type: i3.DatasourceService }]; } });
146
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0LWRhdGEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmcta2luaW50ZWwvc3JjL2xpYi9jb21wb25lbnRzL2RhdGFzb3VyY2UvY3JlYXRlLWRhdGFzb3VyY2UvaW1wb3J0LWRhdGEvaW1wb3J0LWRhdGEuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmcta2luaW50ZWwvc3JjL2xpYi9jb21wb25lbnRzL2RhdGFzb3VyY2UvY3JlYXRlLWRhdGFzb3VyY2UvaW1wb3J0LWRhdGEvaW1wb3J0LWRhdGEuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxNQUFNLEVBQVMsTUFBTSxlQUFlLENBQUM7QUFDeEQsT0FBTyxFQUNILHNCQUFzQixJQUFJLGVBQWUsRUFFNUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUd6QyxPQUFPLEtBQUssTUFBTSxNQUFNLFFBQVEsQ0FBQzs7Ozs7Ozs7Ozs7O0FBRWpDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFRekIsTUFBTSxPQUFPLG1CQUFtQjtJQWM1QixZQUFtQixTQUE0QyxFQUNuQixJQUFTLEVBQ2pDLElBQVUsRUFDVixpQkFBb0M7UUFIckMsY0FBUyxHQUFULFNBQVMsQ0FBbUM7UUFDbkIsU0FBSSxHQUFKLElBQUksQ0FBSztRQUNqQyxTQUFJLEdBQUosSUFBSSxDQUFNO1FBQ1Ysc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQWZqRCxXQUFNLEdBQVEsRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUMsQ0FBQztRQUNqRCxZQUFPLEdBQVEsRUFBRSxDQUFDO1FBQ2xCLGVBQVUsR0FBRyxDQUFDLENBQUM7UUFDZixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUV0QixTQUFJLEdB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O1NBQ2hFO2FBQU07WUFDSixNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUM7U0FDM0U7SUFFTCxDQUFDOztpSEE3SVEsbUJBQW1CLG9EQWVSLGVBQWU7cUdBZjFCLG1CQUFtQixrR0NqQmhDLGd2S0F1SEE7NEZEdEdhLG1CQUFtQjtrQkFOL0IsU0FBUzsrQkFDSSxnQkFBZ0IsUUFHcEIsRUFBQyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUM7OzBCQWlCbEIsTUFBTTsyQkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEluamVjdCwgT25Jbml0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgTUFUX0xFR0FDWV9ESUFMT0dfREFUQSBhcyBNQVRfRElBTE9HX0RBVEEsXG4gICAgTWF0TGVnYWN5RGlhbG9nUmVmIGFzIE1hdERpYWxvZ1JlZlxufSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktZGlhbG9nJztcbmltcG9ydCB7UGFwYX0gZnJvbSAnbmd4LXBhcGFwYXJzZSc7XG5pbXBvcnQge0RhdGFzb3VyY2VTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi8uLi9zZXJ2aWNlcy9kYXRhc291cmNlLnNlcnZpY2UnO1xuaW1wb3J0ICogYXMgbG9kYXNoIGZyb20gJ2xvZGFzaCc7XG5cbmNvbnN0IF8gPSBsb2Rhc2guZGVmYXVsdDtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdraS1pbXBvcnQtZGF0YScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2ltcG9ydC1kYXRhLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9pbXBvcnQtZGF0YS5jb21wb25lbnQuc2FzcyddLFxuICAgIGhvc3Q6IHtjbGFzczogJ2RpYWxvZy13cmFwcGVyJ31cbn0pXG5leHBvcnQgY2xhc3MgSW1wb3J0RGF0YUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgICBwdWJsaWMgaW1wb3J0OiBhbnkgPSB7aGVhZGVyUm93OiBmYWxzZSwgZGVsaW1pdGVyOiAnLCd9O1xuICAgIHB1YmxpYyBjb2x1bW5zOiBhbnkgPSBbXTtcbiAgICBwdWJsaWMgaW1wb3J0VHlwZSA9IDE7XG4gICAgcHVibGljIGltcG9ydGluZ0RhdGEgPSBmYWxzZTtcbiAgICBwdWJsaWMgZGF0YXNvdXJjZVVwZGF0ZTogYW55O1xuICAgIHB1YmxpYyByb3dzOiBhbnkgPSBbXTtcbiAgICBwdWJsaWMgZGF0YXNvdXJjZUluc3RhbmNlS2V5OiBzdHJpbmc7XG4gICAgcHVibGljIHJlbG9hZFVSTDogc3RyaW5nO1xuICAgIHB1YmxpYyBpbXBvcnRFcnJvcnM6IGFueSA9IFtdO1xuICAgIHB1YmxpYyBfID0gXztcbiAgICBwdWJsaWMgT2JqZWN0ID0gT2JqZWN0O1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPEltcG9ydERhdGFDb21wb25lbnQ+LFxuICAgICAgICAgICAgICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwdWJsaWMgZGF0YTogYW55LFxuICAgICAgICAgICAgICAgIHByaXZhdGUgcGFwYTogUGFwYSxcbiAgICAgICAgICAgICAgICBwcml2YXRlIGRhdGFzb3VyY2VTZXJ2aWNlOiBEYXRhc291cmNlU2VydmljZSkge1xuICAgIH1cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmRhdGEuY29sdW1ucztcbiAgICAgICAgdGhpcy5kYXRhc291cmNlVXBkYXRlID0gdGhpcy5kYXRhLmRhdGFzb3VyY2VVcGRhdGUgfHwgbnVsbDtcbiAgICAgICAgdGhpcy5yb3dzID0gdGhpcy5kYXRhLnJvd3MgfHwgW107XG4gICAgICAgIHRoaXMuZGF0YXNvdXJjZUluc3RhbmNlS2V5ID0gdGhpcy5kYXRhLmRhdGFzb3VyY2VJbnN0YW5jZUtleSB8fCBudWxsO1xuICAgICAgICB0aGlzLnJlbG9hZFVSTCA9IHRoaXMuZGF0YS5yZWxvYWRVUkw7XG4gICAgICAgIHRoaXMuaW1wb3J0VHlwZSA9ICF0aGlzLnJvd3MubGVuZ3RoID8gMSA6IDM7XG5cbiAgICAgICAgaWYgKCF0aGlzLmNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmltcG9ydC5oZWFkZXJSb3cgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5pbXBvcnQucmVwbGFjZUNvbHVtbnMgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuaW1wb3J0LmNvbHVtbnMgPSBfLmZpbHRlcih0aGlzLmNvbHVtbnMsIGNvbCA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbC50eXBlICE9PSAnaWQnO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZmlsZVVwbG9hZChldmVudCkge1xuICAgICAgICBjb25zdCBmaWxlTGlzdDogRmlsZUxpc3QgPSBldmVudC50YXJnZXQuZmlsZXM7XG4gICAgICAgIGlmIChmaWxlTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlOiBGaWxlID0gZmlsZUxpc3RbMF07XG5cbiAgICAgICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgICAgICByZWFkZXIub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRleHQ6IGFueSA9IHJlYWRlci5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgdGhpcy5pbXBvcnQuZmlsZU5hbWUgPSBmaWxlLm5hbWU7XG4gICAgICAgICAgICAgICAgdGhpcy5pbXBvcnQuZGF0YSA9IHRoaXMucGFwYS5wYXJzZSh0ZXh0LCB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGltaXRlcjogdGhpcy5pbXBvcnQuZGVsaW1pdGVyLFxuICAgICAgICAgICAgICAgICAgICBxdW90ZUNoYXI6ICdcIicsXG4gICAgICAgICAgICAgICAgICAgIGVzY2FwZUNoYXI6ICdcXFxcJ1xuICAgICAgICAgICAgICAgIH0pLmRhdGE7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2aWV3ID0gXy5jbG9uZSh0aGlzLmltcG9ydC5kYXRhKTtcbiAgICAgICAgICAgICAgICBjb25zdCByb3dzID0gcHJldmlldy5zbGljZSgwLCAzKTtcbiAgICAgICAgICAgICAgICB0aGlzLmltcG9ydC5wcmV2aWV3ID0gcm93cy5tYXAocm93ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvdy5zbGljZSgwLCAzKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZWFkZXIucmVhZEFzVGV4dChmaWxlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBpbXBvcnREYXRhKCkge1xuICAgICAgICB0aGlzLmltcG9ydGluZ0RhdGEgPSB0cnVlO1xuICAgICAgICB0aGlzLmltcG9ydEVycm9ycyA9IFtdO1xuXG4gICAgICAgIGlmICghdGhpcy5kYXRhc291cmNlVXBkYXRlLnRpdGxlKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGFzb3VyY2VVcGRhdGUudGl0bGUgPSB0aGlzLmltcG9ydC5maWxlTmFtZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5jb2x1bW5zLmxlbmd0aCB8fCB0aGlzLmltcG9ydC5yZXBsYWNlQ29sdW1ucykge1xuICAgICAgICAgICAgdGhpcy5kYXRhc291cmNlVXBkYXRlLmZpZWxkcyA9IFtcbiAgICAgICAgICAgICAgICB7dGl0bGU6ICdJRCcsIG5hbWU6ICdpZCcsIHR5cGU6ICdpZCd9XG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG5cblxuICAgICAgICBpZiAodGhpcy5pbXBvcnQuaGVhZGVyUm93KSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY29sdW1ucy5sZW5ndGggfHwgdGhpcy5pbXBvcnQucmVwbGFjZUNvbHVtbnMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbHVtbnMgPSBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLmltcG9ydC5kYXRhWzBdLmZvckVhY2goKGhlYWRlcjogc3RyaW5nLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29sdW1ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBoZWFkZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBfLnNuYWtlQ2FzZShoZWFkZXIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZydcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmltcG9ydC5jb2x1bW5zID0gdGhpcy5jb2x1bW5zO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goY29sdW1uID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhc291cmNlVXBkYXRlLmZpZWxkcy5wdXNoKGNvbHVtbik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaW1wb3J0LmRhdGEuc2hpZnQoKTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgY29uc3QgY3N2RGF0YSA9IFtdO1xuICAgICAgICBfLmZpbHRlcih0aGlzLmltcG9ydC5kYXRhLCBpdGVtID0+IHtcbiAgICAgICAgICAgIHJldHVybiBfLnNvbWUoaXRlbSk7XG4gICAgICAgIH0pLmZvckVhY2gocm93ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJvd0RhdGEgPSB7fTtcbiAgICAgICAgICAgIHRoaXMuaW1wb3J0LmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uOiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICByb3dEYXRhW2NvbHVtbi5uYW1lXSA9ICghXy5pc1VuZGVmaW5lZChyb3dbaW5kZXhdKSAmJiByb3dbaW5kZXhdICE9PSAnJykgPyByb3dbaW5kZXhdIDogbnVsbDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY3N2RGF0YS5wdXNoKHJvd0RhdGEpO1xuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgcmVzdWx0ID0gbnVsbDtcblxuICAgICAgICBpZiAodGhpcy5pbXBvcnRUeXBlID09PSAxKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5yb3dzLmxlbmd0aCAmJiB0aGlzLmRhdGFzb3VyY2VJbnN0YW5jZUtleSkge1xuICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kYXRhc291cmNlU2VydmljZS5kZWxldGVGcm9tRGF0YXNvdXJjZSh0aGlzLmRhdGFzb3VyY2VJbnN0YW5jZUtleSwgW10pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmRhdGFzb3VyY2VVcGRhdGUuYWRkcyA9IGNzdkRhdGE7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5kYXRhc291cmNlSW5zdGFuY2VLZXkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLmRhdGFzb3VyY2VJbnN0YW5jZUtleSA9IGF3YWl0IHRoaXMuZGF0YXNvdXJjZVNlcnZpY2UuY3JlYXRlQ3VzdG9tRGF0YXNvdXJjZSh0aGlzLmRhdGFzb3VyY2VVcGRhdGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLmRhdGFzb3VyY2VTZXJ2aWNlLnVwZGF0ZUN1c3RvbURhdGFzb3VyY2UodGhpcy5kYXRhc291cmNlSW5zdGFuY2VLZXksIHRoaXMuZGF0YXNvdXJjZVVwZGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pbXBvcnRUeXBlID09PSAyKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGFzb3VyY2VVcGRhdGUucmVwbGFjZXMgPSBjc3ZEYXRhO1xuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5kYXRhc291cmNlU2VydmljZS51cGRhdGVDdXN0b21EYXRhc291cmNlKHRoaXMuZGF0YXNvdXJjZUluc3RhbmNlS2V5LCB0aGlzLmRhdGFzb3VyY2VVcGRhdGUpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaW1wb3J0VHlwZSA9PT0gMykge1xuICAgICAgICAgICAgdGhpcy5kYXRhc291cmNlVXBkYXRlLmFkZHMgPSBjc3ZEYXRhO1xuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5kYXRhc291cmNlU2VydmljZS51cGRhdGVDdXN0b21EYXRhc291cmNlKHRoaXMuZGF0YXNvdXJjZUluc3RhbmNlS2V5LCB0aGlzLmRhdGFzb3VyY2VVcGRhdGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQucmVqZWN0ZWQgPiAwKSB7XG4gICAgICAgICAgIHRoaXMuaW1wb3J0RXJyb3JzID0gT2JqZWN0LnZhbHVlcyhyZXN1bHQudmFsaWRhdGlvbkVycm9ycylbMF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdGhpcy5yZWxvYWRVUkwgKyAnLycgKyB0aGlzLmRhdGFzb3VyY2VJbnN0YW5jZUtleTtcbiAgICAgICAgfVxuXG4gICAgfVxuXG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJkaWFsb2dcIiBjZGtEcmFnIGNka0RyYWdSb290RWxlbWVudD1cIi5jZGstb3ZlcmxheS1wYW5lXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLXRpdGxlIGJnLWdyYXktMTAwXCIgY2RrRHJhZ0hhbmRsZT5cbiAgICAgICAgPGgyIG1hdC1kaWFsb2ctdGl0bGU+SW1wb3J0IERhdGE8L2gyPlxuXG4gICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIG1hdC1kaWFsb2ctY2xvc2U+XG4gICAgICAgICAgICA8bWF0LWljb24+Y2xlYXI8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctY29udGVudFwiPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yIHRleHQtc20gZm9udC10aGluXCI+U2VsZWN0IGhvdyB5b3Ugd291bGQgbGlrZSB0byBpbXBvcnQgeW91ciBkYXRhLjwvZGl2PlxuXG4gICAgICAgIDxtYXQtcmFkaW8tZ3JvdXAgY2xhc3M9XCJtYi00IGJsb2NrXCIgWyhuZ01vZGVsKV09XCJpbXBvcnRUeXBlXCI+XG4gICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiBjbGFzcz1cImJsb2NrIG1iLTJcIiBbdmFsdWVdPVwiMVwiPlxuICAgICAgICAgICAgICAgIFJlcGxhY2Ugd2hvbGUgZGF0YXNldFxuICAgICAgICAgICAgPC9tYXQtcmFkaW8tYnV0dG9uPlxuICAgICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gKm5nSWY9XCIhXy5zb21lKGNvbHVtbnMsIHt0eXBlOiAnaWQnfSlcIiBjbGFzcz1cImJsb2NrIG1iLTJcIiBbdmFsdWVdPVwiMlwiIFtkaXNhYmxlZF09XCIhcm93cy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICBPdmVyd3JpdGUgZHVwbGljYXRlcyAod2l0aCBzYW1lIHVuaXF1ZSBrZXkpXG4gICAgICAgICAgICA8L21hdC1yYWRpby1idXR0b24+XG4gICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiBjbGFzcz1cImJsb2NrXCIgW3ZhbHVlXT1cIjNcIiBbZGlzYWJsZWRdPVwiIXJvd3MubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgQWRkICh3aWxsIGZhaWwgaWYgZHVwbGljYXRlcyBleGlzdCB3aXRoIHNhbWUga2V5KVxuICAgICAgICAgICAgPC9tYXQtcmFkaW8tYnV0dG9uPlxuICAgICAgICA8L21hdC1yYWRpby1ncm91cD5cblxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJtYi00XCI+XG4gICAgICAgICAgICBEZWxpbWl0aW5nIGNoYXJhY3RlclxuICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwidy0xMlwiIHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJpbXBvcnQuZGVsaW1pdGVyXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBkZWxpbWl0aW5nIGNoYXJhY3RlclwiPlxuICAgICAgICA8L2xhYmVsPlxuXG4gICAgICAgIDxsYWJlbCBjbGFzcz1cIm1iLTRcIj5cbiAgICAgICAgICAgIDxpbnB1dCBpZD1cImNzdlVwbG9hZFwiIHR5cGU9XCJmaWxlXCIgKGNoYW5nZSk9XCJmaWxlVXBsb2FkKCRldmVudClcIj5cbiAgICAgICAgPC9sYWJlbD5cblxuICAgICAgICA8bWF0LWNoZWNrYm94IGNsYXNzPVwibWItNFwiIFsobmdNb2RlbCldPVwiaW1wb3J0LmhlYWRlclJvd1wiIFtkaXNhYmxlZF09XCIhY29sdW1ucy5sZW5ndGhcIj5cbiAgICAgICAgICAgIEZpbGUgY29udGFpbnMgaGVhZGVyIHJvd1xuICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRleHQteHMgdGV4dC1ncmF5LTUwMFwiICpuZ0lmPVwiIWNvbHVtbnMubGVuZ3RoXCI+XG4gICAgICAgICAgICBGaWxlIGhlYWRlciByb3cgcmVxdWlyZWQgYXMgbm8gY29sdW1ucyBoYXZlIGJlZW4gZGVmaW5lZC5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPG1hdC1jaGVja2JveCBjbGFzcz1cImJsb2NrIG1iLTRcIiAqbmdJZj1cImltcG9ydC5oZWFkZXJSb3cgJiYgY29sdW1ucy5sZW5ndGhcIiBbKG5nTW9kZWwpXT1cImltcG9ydC5yZXBsYWNlQ29sdW1uc1wiPlxuICAgICAgICAgICAgUmVwbGFjZSBDb2x1bW5zIHdpdGggSGVhZGVyIFJvd1xuICAgICAgICA8L21hdC1jaGVja2JveD5cblxuICAgICAgICA8aHIgY2xhc3M9XCJteS00XCI+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJvdW5kZWQtbWQgYmctcmVkLTUwIHAtNCBtYi00XCIgKm5nSWY9XCJpbXBvcnRFcnJvcnMubGVuZ3RoXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaHJpbmstMFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiaC01IHctNSB0ZXh0LXJlZC00MDBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGRhdGEtc2xvdD1cImljb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTEwIDE4YTggOCAwIDEgMCAwLTE2IDggOCAwIDAgMCAwIDE2Wk04LjI4IDcuMjJhLjc1Ljc1IDAgMCAwLTEuMDYgMS4wNkw4Ljk0IDEwbC0xLjcyIDEuNzJhLjc1Ljc1IDAgMSAwIDEuMDYgMS4wNkwxMCAxMS4wNmwxLjcyIDEuNzJhLjc1Ljc1IDAgMSAwIDEuMDYtMS4wNkwxMS4wNiAxMGwxLjcyLTEuNzJhLjc1Ljc1IDAgMCAwLTEuMDYtMS4wNkwxMCA4Ljk0IDguMjggNy4yMlpcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1sLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwidGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LXJlZC04MDBcIj5UaGVyZSB3ZXJlIHt7aW1wb3J0RXJyb3JzLmxlbmd0aH19IGxpbmVzIHdpdGggZXJyb3JzIGluIHlvdXIgdXBsb2FkPC9oMz5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTIgdGV4dC1zbSB0ZXh0LXJlZC03MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx1bCByb2xlPVwibGlzdFwiIGNsYXNzPVwibGlzdC1kaXNjIHNwYWNlLXktMSBwbC01XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBpdGVtIG9mIGltcG9ydEVycm9ycy5zbGljZSgwLCAxMClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXJlZC04MDBcIj5MaW5lIHt7aXRlbS5pdGVtTnVtYmVyICsgMX19OiB7e09iamVjdC52YWx1ZXMoaXRlbS52YWxpZGF0aW9uRXJyb3JzKS5qb2luICgnLCAnKX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImltcG9ydEVycm9ycy5sZW5ndGggPiAxMFwiIGNsYXNzPVwibXQtNFwiPiogU2hvd2luZyBmaXJzdCAxMCBpbnZhbGlkIGxpbmVzIG9ubHk8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cImltcG9ydC5wcmV2aWV3XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidXBwZXJjYXNlIGZvbnQtbWVkaXVtIHRyYWNraW5nLXdpZGVyIG1iLTQgdGV4dC14cyB0ZXh0LWdyYXktNjAwXCI+XG4gICAgICAgICAgICAgICAgUHJldmlld1xuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInByZXZpZXctdGFibGUgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cImltcG9ydC5oZWFkZXJSb3cgJiYgaW1wb3J0LnJlcGxhY2VDb2x1bW5zXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0Zvcj1cImxldCBoZWFkZXIgb2YgaW1wb3J0LnByZXZpZXdbMF1cIj57e2hlYWRlcn19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nRm9yPVwibGV0IGNvbCBvZiBpbXBvcnQucHJldmlld1sxXVwiPnt7Y29sfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nRm9yPVwibGV0IGNvbCBvZiBpbXBvcnQucHJldmlld1syXVwiPnt7Y29sfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cIiFpbXBvcnQuaGVhZGVyUm93IHx8ICFpbXBvcnQucmVwbGFjZUNvbHVtbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggKm5nRm9yPVwibGV0IGNvbCBvZiBpbXBvcnQuY29sdW1uc1wiPnt7Y29sLnRpdGxlfX08L3RoPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcm93IG9mICghaW1wb3J0LmhlYWRlclJvdyA/IGltcG9ydC5wcmV2aWV3IDogaW1wb3J0LnByZXZpZXcuc2xpY2UoMSwgMykpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nRm9yPVwibGV0IGNvbCBvZiBpbXBvcnQuY29sdW1uczsgbGV0IGkgPSBpbmRleFwiPnt7cm93W2ldfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cblxuICAgICAgICAgICAgPC90YWJsZT5cblxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctZm9vdGVyXCI+XG4gICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBtYXQtZGlhbG9nLWNsb3NlIG1hdC1zdHJva2VkLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCI+Q2xvc2U8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIG1hdC1mbGF0LWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImltcG9ydERhdGEoKVwiPkltcG9ydCBEYXRhPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbjwvZGl2PlxuXG5cbiJdfQ==
@@ -1,165 +0,0 @@
1
- import { Component, Inject } from '@angular/core';
2
- import { COMMA, ENTER } from '@angular/cdk/keycodes';
3
- import { ImportDataComponent } from '../import-data.component';
4
- import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog';
5
- import * as lodash from 'lodash';
6
- import { KININTEL_CONFIG } from '../../../../../kinintel-config';
7
- import shortHash from 'short-hash';
8
- import * as i0 from "@angular/core";
9
- import * as i1 from "@angular/material/legacy-dialog";
10
- import * as i2 from "../../../../../services/datasource.service";
11
- import * as i3 from "@angular/material/legacy-snack-bar";
12
- import * as i4 from "@angular/common";
13
- import * as i5 from "@angular/material/legacy-button";
14
- import * as i6 from "@angular/material/icon";
15
- import * as i7 from "@angular/material/legacy-form-field";
16
- import * as i8 from "@angular/material/chips";
17
- import * as i9 from "@angular/cdk/drag-drop";
18
- import * as i10 from "@angular/forms";
19
- import * as i11 from "@angular/material/legacy-checkbox";
20
- import * as i12 from "@angular/cdk/clipboard";
21
- const _ = lodash.default;
22
- export class ImportWizardComponent {
23
- constructor(dialog, dialogRef, data, datasourceService, snackBar, config) {
24
- this.dialog = dialog;
25
- this.dialogRef = dialogRef;
26
- this.data = data;
27
- this.datasourceService = datasourceService;
28
- this.snackBar = snackBar;
29
- this.config = config;
30
- this.columns = [];
31
- this.addOnBlur = true;
32
- this.importChoice = null;
33
- this.importKey = null;
34
- this.backendURL = null;
35
- this._ = _;
36
- this.Object = Object;
37
- this.datasourceTypes = {
38
- string: 'Text (up to 255 chars)',
39
- mediumstring: 'Medium Text (up to 2000 chars)',
40
- longstring: 'Long Text (more than 2000 chars)',
41
- integer: 'Number (whole number)',
42
- float: 'Decimal number',
43
- date: 'Date',
44
- datetime: 'Date and Time',
45
- pickfromsource: 'Pick From List (using another source)'
46
- };
47
- this.separatorKeysCodes = [ENTER, COMMA];
48
- }
49
- async ngOnInit() {
50
- this.reloadURL = this.data.reloadURL;
51
- this.datasourceUpdate = this.data.datasourceUpdate;
52
- this.backendURL = this.config.backendURL;
53
- this.namePrefix = this.data.namePrefix || '';
54
- }
55
- copied() {
56
- this.snackBar.open('Copied to Clipboard', null, {
57
- duration: 2000,
58
- verticalPosition: 'top'
59
- });
60
- }
61
- createExample() {
62
- const example = ['[{'];
63
- this.columns.forEach((column, index) => {
64
- if (column.type !== 'id') {
65
- example.push('<span class="text-secondary">"' + column.name + '":</span> "' + column.type + '"');
66
- if (index !== this.columns.length - 1) {
67
- example.push(', ');
68
- }
69
- }
70
- });
71
- example.push('}]');
72
- return example.join('');
73
- }
74
- addColumn(event) {
75
- const value = (event.value || '').trim();
76
- // Add our fruit
77
- if (value) {
78
- this.columns.push({
79
- title: value,
80
- name: _.snakeCase(value),
81
- type: 'string'
82
- });
83
- }
84
- // Clear the input value
85
- // tslint:disable-next-line:no-non-null-assertion
86
- event.chipInput.clear();
87
- }
88
- editColumn(column, event) {
89
- const value = event.value.trim();
90
- // Remove fruit if it no longer has a name
91
- if (!value) {
92
- this.removeColumn(column);
93
- return;
94
- }
95
- // Edit existing fruit
96
- const index = this.columns.indexOf(column);
97
- if (index >= 0) {
98
- this.columns[index].name = value;
99
- }
100
- }
101
- removeColumn(column) {
102
- _.remove(this.columns, { name: column.name });
103
- }
104
- importData() {
105
- const dialogRef = this.dialog.open(ImportDataComponent, {
106
- width: '800px',
107
- height: '900px',
108
- hasBackdrop: false,
109
- data: {
110
- columns: this.columns,
111
- datasourceUpdate: {
112
- title: this.name ? (this.namePrefix || '') + this.name : '',
113
- instanceImportKey: '',
114
- fields: [],
115
- adds: [],
116
- updates: [],
117
- deletes: []
118
- },
119
- rows: [],
120
- datasourceInstanceKey: null,
121
- reloadURL: this.reloadURL
122
- }
123
- });
124
- }
125
- async createStructure() {
126
- this.datasourceUpdate.title = this.namePrefix + this.name;
127
- // If no primary key fields have been set then add the ID field.
128
- if (!_.filter(this.columns, 'keyField').length) {
129
- this.datasourceUpdate.fields = [
130
- { title: 'ID', name: 'id', type: 'id' }
131
- ];
132
- }
133
- this.columns.forEach(column => {
134
- this.datasourceUpdate.fields.push(column);
135
- });
136
- if (this.data.automaticImportKey)
137
- this.datasourceUpdate.importKey = shortHash(Date.now().toString());
138
- const key = await this.datasourceService.createCustomDatasource(this.datasourceUpdate);
139
- if (this.importKey) {
140
- await this.datasourceService.updateCustomDatasource(key, {
141
- title: this.datasourceUpdate.title,
142
- importKey: this.importKey,
143
- fields: this.datasourceUpdate.fields,
144
- adds: [],
145
- updates: [],
146
- deletes: [],
147
- replaces: []
148
- });
149
- }
150
- window.location.href = this.reloadURL + '/' + key;
151
- }
152
- }
153
- ImportWizardComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ImportWizardComponent, deps: [{ token: i1.MatLegacyDialog }, { token: i1.MatLegacyDialogRef }, { token: MAT_DIALOG_DATA }, { token: i2.DatasourceService }, { token: i3.MatLegacySnackBar }, { token: KININTEL_CONFIG }], target: i0.ɵɵFactoryTarget.Component });
154
- ImportWizardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ImportWizardComponent, selector: "ki-import-wizard", host: { classAttribute: "dialog-wrapper" }, ngImport: i0, template: "<div class=\"dialog\" cdkDrag cdkDragRootElement=\".cdk-overlay-pane\">\n\n <div class=\"dialog-title bg-gray-100\" cdkDragHandle>\n <h2 mat-dialog-title>Import Data</h2>\n\n <button mat-icon-button mat-dialog-close=\"closed\">\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n\n <div class=\"dialog-content p-0 \">\n\n <div class=\"bg-blue-50 p-4\">\n <div class=\"flex\">\n <div class=\"shrink-0\">\n <svg class=\"h-5 w-5 text-blue-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\" data-slot=\"icon\">\n <path fill-rule=\"evenodd\" d=\"M18 10a8 8 0 1 1-16 0 8 8 0 0 1 16 0Zm-7-4a1 1 0 1 1-2 0 1 1 0 0 1 2 0ZM9 9a.75.75 0 0 0 0 1.5h.253a.25.25 0 0 1 .244.304l-.459 2.066A1.75 1.75 0 0 0 10.747 15H11a.75.75 0 0 0 0-1.5h-.253a.25.25 0 0 1-.244-.304l.459-2.066A1.75 1.75 0 0 0 9.253 9H9Z\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n <div class=\"ml-3 flex-1 md:flex md:justify-between\">\n <p class=\"text-sm text-blue-700 mb-0\">\n Use this form to decide how you would like to add data to your account. For <b>Manual</b> and\n <b>API</b> methods, you will need to decide up-front the structure of your data by supplying\n the relevant column names below. For <b>CSV</b> upload you can use the existing header row in\n the data to determine the structure.\n </p>\n </div>\n </div>\n </div>\n\n <div class=\"px-6 py-4\">\n <label class=\"mb-4\">\n Name\n <input class=\"w-full\" type=\"text\" [(ngModel)]=\"name\" placeholder=\"Enter data set name\"\n [ngClass]=\"{'border-red-500': !name}\">\n <div class=\"m-0.5 text-xs text-gray-500 font-normal\">Please enter a friendly name to identify this data set.</div>\n </label>\n\n <div class=\"my-4 font-medium\">Select method of data import</div>\n\n <div class=\"flex items-center mb-4\">\n <button type=\"button\" (click)=\"importChoice = 'MANUAL'\"\n [ngClass]=\"{'bg-gray-50 border-gray-400': importChoice === 'MANUAL'}\"\n class=\"relative block w-full border-2 border-gray-300 border-dashed rounded-lg p-8 text-center hover:border-gray-400 focus:outline-none\">\n\n <div class=\"relative inline-block\">\n <span\n class=\"material-symbols-outlined mx-auto text-6xl h-14 w-20 text-gray-300\">edit_note\n </span>\n </div>\n\n <span class=\"mt-2 block text-sm font-medium text-gray-900\">Manual Data Entry</span>\n </button>\n <button type=\"button\" (click)=\"importData()\"\n class=\"mx-2 relative block w-full border-2 border-gray-300 border-dashed rounded-lg p-8 text-center hover:border-gray-400 focus:outline-none\">\n\n <div class=\"relative inline-block\">\n <span\n class=\"material-symbols-outlined mx-auto text-6xl h-14 w-20 text-gray-300\">upload_file\n </span>\n </div>\n\n <span class=\"mt-2 block text-sm font-medium text-gray-900\">Upload CSV Data</span>\n </button>\n <button type=\"button\" (click)=\"importChoice = 'API'\"\n [ngClass]=\"{'bg-gray-50 border-gray-400': importChoice === 'API'}\"\n class=\"relative block w-full border-2 border-gray-300 border-dashed rounded-lg p-8 text-center hover:border-gray-400 focus:outline-none\">\n\n <div class=\"relative inline-block\">\n <span\n class=\"material-symbols-outlined mx-auto text-6xl h-14 w-20 text-gray-300\">database_upload\n </span>\n </div>\n\n <span class=\"mt-2 block text-sm font-medium text-gray-900\">Connect to API</span>\n </button>\n </div>\n\n <ng-template [ngIf]=\"importChoice === 'MANUAL' || importChoice === 'API'\">\n\n <div class=\"mt-6 font-medium\">Enter the columns for this data set.</div>\n\n <mat-form-field class=\"w-full\" appearance=\"fill\">\n <mat-label>Dataset Columns</mat-label>\n <mat-chip-grid #chipGrid aria-label=\"Enter column name\">\n <mat-chip-row class=\"bg-white\" *ngFor=\"let column of columns\"\n (removed)=\"removeColumn(column)\">\n {{column.title}}\n <button matChipRemove [attr.aria-label]=\"'remove ' + column.title\">\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip-row>\n <input placeholder=\"Enter column name and press enter...\"\n [matChipInputFor]=\"chipGrid\"\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n [matChipInputAddOnBlur]=\"addOnBlur\"\n (matChipInputTokenEnd)=\"addColumn($event)\"/>\n </mat-chip-grid>\n </mat-form-field>\n <div class=\"text-xs -mt-4 ml-0.5 text-gray-500\">Start typing in the box above to enter the column names.</div>\n\n <div *ngIf=\"!columns.length\" class=\"rounded-md bg-yellow-50 p-3 mt-4\">\n <div class=\"flex\">\n <div class=\"shrink-0\">\n <svg class=\"h-5 w-5 text-yellow-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\" data-slot=\"icon\">\n <path fill-rule=\"evenodd\" d=\"M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 2.495ZM10 5a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 10 5Zm0 9a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n <div class=\"ml-3\">\n <h3 class=\"text-sm text-yellow-800 mb-0\">Please enter at least 1 column</h3>\n </div>\n </div>\n </div>\n\n <ng-template [ngIf]=\"columns.length\">\n <div class=\"font-medium text-sm mt-4\">Structure Preview and Field Types</div>\n <div class=\"text-xs mb-4 ml-0.5 text-gray-500\">\n Preview each column created and set which data type the column should be\n </div>\n\n <div *ngIf=\"_.filter(columns, 'keyField').length\" class=\"rounded-md bg-yellow-50 p-3 mt-4\">\n <div class=\"flex\">\n <div class=\"shrink-0\">\n <svg class=\"h-5 w-5 text-yellow-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\" data-slot=\"icon\">\n <path fill-rule=\"evenodd\" d=\"M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 2.495ZM10 5a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 10 5Zm0 9a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n <div class=\"ml-3\">\n <h3 class=\"text-sm text-yellow-800 mb-0\">No auto increment ID column will be generated\n due to primary keys being defined.\n </h3>\n </div>\n </div>\n </div>\n\n <table>\n <tr>\n <td class=\"border py-2 px-3 bg-gray-100 font-medium\">Column Name</td>\n <td class=\"border py-2 px-3 bg-gray-100 font-medium\">Column Type</td>\n <td class=\"border py-2 px-3 bg-gray-100 font-medium text-center\">Primary Key</td>\n <td class=\"border py-2 px-3 bg-gray-100 font-medium\"></td>\n </tr>\n <tr *ngFor=\"let column of columns; let i = index\">\n <td class=\"border-l border-t border-b border-r py-2 px-3 font-medium\">\n {{column.title}}\n </td>\n <td class=\"border-t border-b border-r p-0\">\n <select class=\"border-none p-2\" [(ngModel)]=\"columns[i].type\">\n <option [value]=\"type\" *ngFor=\"let type of Object.keys(datasourceTypes)\">\n {{datasourceTypes[type]}}\n </option>\n </select>\n </td>\n <td class=\"border-t border-b border-r p-0 text-center\">\n <mat-checkbox color=\"primary\" [(ngModel)]=\"columns[i].keyField\"></mat-checkbox>\n </td>\n <td class=\"border-t border-b border-r p-0 text-center\">\n <button color=\"warn\" mat-icon-button (click)=\"removeColumn(column)\">\n <span class=\"material-symbols-outlined\">delete</span>\n </button>\n </td>\n </tr>\n </table>\n\n<!-- <table>-->\n<!-- <tr>-->\n<!-- <td class=\"w-20 border-l border-t border-b border-r bg-gray-100 py-2 px-3\"></td>-->\n<!-- <td class=\"border-t border-b border-r py-2 px-3 bg-gray-100 font-medium\" [colSpan]=\"columns.length\">Columns</td>-->\n<!-- </tr>-->\n<!-- <tr>-->\n<!-- <td class=\"w-20 border-l border-t border-b border-r bg-gray-100 py-2 px-3 font-medium\">Name</td>-->\n<!-- <td class=\"border-t border-b border-r py-2 px-3\" *ngFor=\"let column of columns\">-->\n<!-- -->\n<!-- </td>-->\n<!-- </tr>-->\n<!-- <tr>-->\n<!-- <td class=\"w-20 border-l border-t border-b border-r bg-gray-100 py-2 px-3 font-medium\">Type</td>-->\n<!-- <td class=\"border-t border-b border-r p-0\" *ngFor=\"let column of columns; let i = index\">-->\n<!-- <select class=\"border-none p-2\" [(ngModel)]=\"columns[i].type\">-->\n<!-- <option [value]=\"type\" *ngFor=\"let type of Object.keys(datasourceTypes)\">-->\n<!-- {{datasourceTypes[type]}}-->\n<!-- </option>-->\n<!-- </select>-->\n<!-- </td>-->\n<!-- </tr>-->\n<!-- </table>-->\n </ng-template>\n\n\n\n </ng-template>\n\n <ng-template [ngIf]=\"importChoice === 'API'\">\n <label class=\"mt-2 mb-4\">\n API Import Key\n <input class=\"w-full\" type=\"text\" [(ngModel)]=\"importKey\" placeholder=\"Enter import key\">\n <div class=\"font-normal text-gray-500 text-xs\">\n This will be used as part of the API request when\n </div>\n </label>\n\n <ng-template [ngIf]=\"importKey\">\n <div class=\"relative w-full\">\n <div class=\"text-base font-semibold\">Example</div>\n <div class=\"text-sm mb-2\">\n Insert a set of new rows to the data source identified by the passed import key\n </div>\n <div #create class=\"text-xs bg-gray-800 border-2 border-gray-900 text-white rounded-md p-3\">\n <pre class=\"whitespace-normal\">curl -H <span class=\"text-secondary\">\"API-KEY:<b>[[apiKey]]</b>\"</span> -H <span class=\"text-secondary\">\"API-SECRET:<b>[[apiSecret]]</b>\"</span></pre><pre class=\"whitespace-normal\"> -X <b>POST</b> <span class=\"text-secondary\">{{backendURL}}/api/tabularData/{{importKey}}</span></pre>\n </div>\n <button mat-icon-button [cdkCopyToClipboard]=\"create.textContent\" (cdkCopyToClipboardCopied)=\"copied()\"\n class=\"text-white absolute bottom-0 right-0\">\n <mat-icon>content_copy</mat-icon>\n </button>\n </div>\n\n <div class=\"font-semibold text-sm my-1\">Example Payload</div>\n <div class=\"text-xs relative bg-gray-800 border-2 border-gray-900 text-white rounded-md p-3\">\n <pre class=\"whitespace-normal\" [innerHTML]=\"createExample()\"></pre>\n </div>\n </ng-template>\n\n </ng-template>\n\n </div>\n\n\n\n </div>\n\n <div class=\"dialog-footer\">\n <button mat-button mat-dialog-close=\"closed\" mat-stroked-button type=\"button\">Close</button>\n <button mat-button mat-flat-button color=\"primary\" type=\"button\" [disabled]=\"!name || !columns.length\"\n (click)=\"createStructure()\">Save Changes</button>\n </div>\n\n</div>\n\n\n", styles: [""], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.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: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1.MatLegacyDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatLegacyDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "component", type: i7.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7.MatLegacyLabel, selector: "mat-label" }, { kind: "component", type: i8.MatChipGrid, selector: "mat-chip-grid", inputs: ["tabIndex", "disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "directive", type: i8.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "directive", type: i8.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i8.MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["color", "disabled", "disableRipple", "tabIndex", "editable"], outputs: ["edited"] }, { kind: "directive", type: i9.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i9.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "directive", type: i10.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i10.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i10.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i10.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { 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: "component", type: i11.MatLegacyCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i12.CdkCopyToClipboard, selector: "[cdkCopyToClipboard]", inputs: ["cdkCopyToClipboard", "cdkCopyToClipboardAttempts"], outputs: ["cdkCopyToClipboardCopied"] }] });
155
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ImportWizardComponent, decorators: [{
156
- type: Component,
157
- args: [{ selector: 'ki-import-wizard', host: { class: 'dialog-wrapper' }, template: "<div class=\"dialog\" cdkDrag cdkDragRootElement=\".cdk-overlay-pane\">\n\n <div class=\"dialog-title bg-gray-100\" cdkDragHandle>\n <h2 mat-dialog-title>Import Data</h2>\n\n <button mat-icon-button mat-dialog-close=\"closed\">\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n\n <div class=\"dialog-content p-0 \">\n\n <div class=\"bg-blue-50 p-4\">\n <div class=\"flex\">\n <div class=\"shrink-0\">\n <svg class=\"h-5 w-5 text-blue-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\" data-slot=\"icon\">\n <path fill-rule=\"evenodd\" d=\"M18 10a8 8 0 1 1-16 0 8 8 0 0 1 16 0Zm-7-4a1 1 0 1 1-2 0 1 1 0 0 1 2 0ZM9 9a.75.75 0 0 0 0 1.5h.253a.25.25 0 0 1 .244.304l-.459 2.066A1.75 1.75 0 0 0 10.747 15H11a.75.75 0 0 0 0-1.5h-.253a.25.25 0 0 1-.244-.304l.459-2.066A1.75 1.75 0 0 0 9.253 9H9Z\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n <div class=\"ml-3 flex-1 md:flex md:justify-between\">\n <p class=\"text-sm text-blue-700 mb-0\">\n Use this form to decide how you would like to add data to your account. For <b>Manual</b> and\n <b>API</b> methods, you will need to decide up-front the structure of your data by supplying\n the relevant column names below. For <b>CSV</b> upload you can use the existing header row in\n the data to determine the structure.\n </p>\n </div>\n </div>\n </div>\n\n <div class=\"px-6 py-4\">\n <label class=\"mb-4\">\n Name\n <input class=\"w-full\" type=\"text\" [(ngModel)]=\"name\" placeholder=\"Enter data set name\"\n [ngClass]=\"{'border-red-500': !name}\">\n <div class=\"m-0.5 text-xs text-gray-500 font-normal\">Please enter a friendly name to identify this data set.</div>\n </label>\n\n <div class=\"my-4 font-medium\">Select method of data import</div>\n\n <div class=\"flex items-center mb-4\">\n <button type=\"button\" (click)=\"importChoice = 'MANUAL'\"\n [ngClass]=\"{'bg-gray-50 border-gray-400': importChoice === 'MANUAL'}\"\n class=\"relative block w-full border-2 border-gray-300 border-dashed rounded-lg p-8 text-center hover:border-gray-400 focus:outline-none\">\n\n <div class=\"relative inline-block\">\n <span\n class=\"material-symbols-outlined mx-auto text-6xl h-14 w-20 text-gray-300\">edit_note\n </span>\n </div>\n\n <span class=\"mt-2 block text-sm font-medium text-gray-900\">Manual Data Entry</span>\n </button>\n <button type=\"button\" (click)=\"importData()\"\n class=\"mx-2 relative block w-full border-2 border-gray-300 border-dashed rounded-lg p-8 text-center hover:border-gray-400 focus:outline-none\">\n\n <div class=\"relative inline-block\">\n <span\n class=\"material-symbols-outlined mx-auto text-6xl h-14 w-20 text-gray-300\">upload_file\n </span>\n </div>\n\n <span class=\"mt-2 block text-sm font-medium text-gray-900\">Upload CSV Data</span>\n </button>\n <button type=\"button\" (click)=\"importChoice = 'API'\"\n [ngClass]=\"{'bg-gray-50 border-gray-400': importChoice === 'API'}\"\n class=\"relative block w-full border-2 border-gray-300 border-dashed rounded-lg p-8 text-center hover:border-gray-400 focus:outline-none\">\n\n <div class=\"relative inline-block\">\n <span\n class=\"material-symbols-outlined mx-auto text-6xl h-14 w-20 text-gray-300\">database_upload\n </span>\n </div>\n\n <span class=\"mt-2 block text-sm font-medium text-gray-900\">Connect to API</span>\n </button>\n </div>\n\n <ng-template [ngIf]=\"importChoice === 'MANUAL' || importChoice === 'API'\">\n\n <div class=\"mt-6 font-medium\">Enter the columns for this data set.</div>\n\n <mat-form-field class=\"w-full\" appearance=\"fill\">\n <mat-label>Dataset Columns</mat-label>\n <mat-chip-grid #chipGrid aria-label=\"Enter column name\">\n <mat-chip-row class=\"bg-white\" *ngFor=\"let column of columns\"\n (removed)=\"removeColumn(column)\">\n {{column.title}}\n <button matChipRemove [attr.aria-label]=\"'remove ' + column.title\">\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip-row>\n <input placeholder=\"Enter column name and press enter...\"\n [matChipInputFor]=\"chipGrid\"\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n [matChipInputAddOnBlur]=\"addOnBlur\"\n (matChipInputTokenEnd)=\"addColumn($event)\"/>\n </mat-chip-grid>\n </mat-form-field>\n <div class=\"text-xs -mt-4 ml-0.5 text-gray-500\">Start typing in the box above to enter the column names.</div>\n\n <div *ngIf=\"!columns.length\" class=\"rounded-md bg-yellow-50 p-3 mt-4\">\n <div class=\"flex\">\n <div class=\"shrink-0\">\n <svg class=\"h-5 w-5 text-yellow-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\" data-slot=\"icon\">\n <path fill-rule=\"evenodd\" d=\"M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 2.495ZM10 5a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 10 5Zm0 9a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n <div class=\"ml-3\">\n <h3 class=\"text-sm text-yellow-800 mb-0\">Please enter at least 1 column</h3>\n </div>\n </div>\n </div>\n\n <ng-template [ngIf]=\"columns.length\">\n <div class=\"font-medium text-sm mt-4\">Structure Preview and Field Types</div>\n <div class=\"text-xs mb-4 ml-0.5 text-gray-500\">\n Preview each column created and set which data type the column should be\n </div>\n\n <div *ngIf=\"_.filter(columns, 'keyField').length\" class=\"rounded-md bg-yellow-50 p-3 mt-4\">\n <div class=\"flex\">\n <div class=\"shrink-0\">\n <svg class=\"h-5 w-5 text-yellow-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\" data-slot=\"icon\">\n <path fill-rule=\"evenodd\" d=\"M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 2.495ZM10 5a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 10 5Zm0 9a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n <div class=\"ml-3\">\n <h3 class=\"text-sm text-yellow-800 mb-0\">No auto increment ID column will be generated\n due to primary keys being defined.\n </h3>\n </div>\n </div>\n </div>\n\n <table>\n <tr>\n <td class=\"border py-2 px-3 bg-gray-100 font-medium\">Column Name</td>\n <td class=\"border py-2 px-3 bg-gray-100 font-medium\">Column Type</td>\n <td class=\"border py-2 px-3 bg-gray-100 font-medium text-center\">Primary Key</td>\n <td class=\"border py-2 px-3 bg-gray-100 font-medium\"></td>\n </tr>\n <tr *ngFor=\"let column of columns; let i = index\">\n <td class=\"border-l border-t border-b border-r py-2 px-3 font-medium\">\n {{column.title}}\n </td>\n <td class=\"border-t border-b border-r p-0\">\n <select class=\"border-none p-2\" [(ngModel)]=\"columns[i].type\">\n <option [value]=\"type\" *ngFor=\"let type of Object.keys(datasourceTypes)\">\n {{datasourceTypes[type]}}\n </option>\n </select>\n </td>\n <td class=\"border-t border-b border-r p-0 text-center\">\n <mat-checkbox color=\"primary\" [(ngModel)]=\"columns[i].keyField\"></mat-checkbox>\n </td>\n <td class=\"border-t border-b border-r p-0 text-center\">\n <button color=\"warn\" mat-icon-button (click)=\"removeColumn(column)\">\n <span class=\"material-symbols-outlined\">delete</span>\n </button>\n </td>\n </tr>\n </table>\n\n<!-- <table>-->\n<!-- <tr>-->\n<!-- <td class=\"w-20 border-l border-t border-b border-r bg-gray-100 py-2 px-3\"></td>-->\n<!-- <td class=\"border-t border-b border-r py-2 px-3 bg-gray-100 font-medium\" [colSpan]=\"columns.length\">Columns</td>-->\n<!-- </tr>-->\n<!-- <tr>-->\n<!-- <td class=\"w-20 border-l border-t border-b border-r bg-gray-100 py-2 px-3 font-medium\">Name</td>-->\n<!-- <td class=\"border-t border-b border-r py-2 px-3\" *ngFor=\"let column of columns\">-->\n<!-- -->\n<!-- </td>-->\n<!-- </tr>-->\n<!-- <tr>-->\n<!-- <td class=\"w-20 border-l border-t border-b border-r bg-gray-100 py-2 px-3 font-medium\">Type</td>-->\n<!-- <td class=\"border-t border-b border-r p-0\" *ngFor=\"let column of columns; let i = index\">-->\n<!-- <select class=\"border-none p-2\" [(ngModel)]=\"columns[i].type\">-->\n<!-- <option [value]=\"type\" *ngFor=\"let type of Object.keys(datasourceTypes)\">-->\n<!-- {{datasourceTypes[type]}}-->\n<!-- </option>-->\n<!-- </select>-->\n<!-- </td>-->\n<!-- </tr>-->\n<!-- </table>-->\n </ng-template>\n\n\n\n </ng-template>\n\n <ng-template [ngIf]=\"importChoice === 'API'\">\n <label class=\"mt-2 mb-4\">\n API Import Key\n <input class=\"w-full\" type=\"text\" [(ngModel)]=\"importKey\" placeholder=\"Enter import key\">\n <div class=\"font-normal text-gray-500 text-xs\">\n This will be used as part of the API request when\n </div>\n </label>\n\n <ng-template [ngIf]=\"importKey\">\n <div class=\"relative w-full\">\n <div class=\"text-base font-semibold\">Example</div>\n <div class=\"text-sm mb-2\">\n Insert a set of new rows to the data source identified by the passed import key\n </div>\n <div #create class=\"text-xs bg-gray-800 border-2 border-gray-900 text-white rounded-md p-3\">\n <pre class=\"whitespace-normal\">curl -H <span class=\"text-secondary\">\"API-KEY:<b>[[apiKey]]</b>\"</span> -H <span class=\"text-secondary\">\"API-SECRET:<b>[[apiSecret]]</b>\"</span></pre><pre class=\"whitespace-normal\"> -X <b>POST</b> <span class=\"text-secondary\">{{backendURL}}/api/tabularData/{{importKey}}</span></pre>\n </div>\n <button mat-icon-button [cdkCopyToClipboard]=\"create.textContent\" (cdkCopyToClipboardCopied)=\"copied()\"\n class=\"text-white absolute bottom-0 right-0\">\n <mat-icon>content_copy</mat-icon>\n </button>\n </div>\n\n <div class=\"font-semibold text-sm my-1\">Example Payload</div>\n <div class=\"text-xs relative bg-gray-800 border-2 border-gray-900 text-white rounded-md p-3\">\n <pre class=\"whitespace-normal\" [innerHTML]=\"createExample()\"></pre>\n </div>\n </ng-template>\n\n </ng-template>\n\n </div>\n\n\n\n </div>\n\n <div class=\"dialog-footer\">\n <button mat-button mat-dialog-close=\"closed\" mat-stroked-button type=\"button\">Close</button>\n <button mat-button mat-flat-button color=\"primary\" type=\"button\" [disabled]=\"!name || !columns.length\"\n (click)=\"createStructure()\">Save Changes</button>\n </div>\n\n</div>\n\n\n" }]
158
- }], ctorParameters: function () { return [{ type: i1.MatLegacyDialog }, { type: i1.MatLegacyDialogRef }, { type: undefined, decorators: [{
159
- type: Inject,
160
- args: [MAT_DIALOG_DATA]
161
- }] }, { type: i2.DatasourceService }, { type: i3.MatLegacySnackBar }, { type: undefined, decorators: [{
162
- type: Inject,
163
- args: [KININTEL_CONFIG]
164
- }] }]; } });
165
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0LXdpemFyZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1raW5pbnRlbC9zcmMvbGliL2NvbXBvbmVudHMvZGF0YXNvdXJjZS9jcmVhdGUtZGF0YXNvdXJjZS9pbXBvcnQtZGF0YS9pbXBvcnQtd2l6YXJkL2ltcG9ydC13aXphcmQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmcta2luaW50ZWwvc3JjL2xpYi9jb21wb25lbnRzL2RhdGFzb3VyY2UvY3JlYXRlLWRhdGFzb3VyY2UvaW1wb3J0LWRhdGEvaW1wb3J0LXdpemFyZC9pbXBvcnQtd2l6YXJkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsTUFBTSxFQUFTLE1BQU0sZUFBZSxDQUFDO0FBRXhELE9BQU8sRUFBQyxLQUFLLEVBQUUsS0FBSyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFFN0QsT0FBTyxFQUNILHNCQUFzQixJQUFJLGVBQWUsRUFFNUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLEtBQUssTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUlqQyxPQUFPLEVBQUMsZUFBZSxFQUF1QixNQUFNLGdDQUFnQyxDQUFDO0FBQ3JGLE9BQU8sU0FBUyxNQUFNLFlBQVksQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUFFbkMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQVF6QixNQUFNLE9BQU8scUJBQXFCO0lBNEI5QixZQUFvQixNQUFpQixFQUNsQixTQUE4QyxFQUNyQixJQUFTLEVBQ2pDLGlCQUFvQyxFQUNwQyxRQUFxQixFQUNJLE1BQTRCO1FBTHJELFdBQU0sR0FBTixNQUFNLENBQVc7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LHNCQUFzQixDQUFDLEdBQUcsRUFBRTtnQkFDckQsS0FBSyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLO2dCQUNsQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7Z0JBQ3pCLE1BQU0sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTTtnQkFDcEMsSUFBSSxFQUFFLEVBQUU7Z0JBQ1IsT0FBTyxFQUFFLEVBQUU7Z0JBQ1gsT0FBTyxFQUFFLEVBQUU7Z0JBQ1gsUUFBUSxFQUFFLEVBQUU7YUFDZixDQUFDLENBQUM7U0FDTjtRQUVELE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztJQUN0RCxDQUFDOzttSEE5SlEscUJBQXFCLG1GQThCVixlQUFlLCtFQUdmLGVBQWU7dUdBakMxQixxQkFBcUIsb0dDeEJsQyx1Z2NBK09BOzRGRHZOYSxxQkFBcUI7a0JBTmpDLFNBQVM7K0JBQ0ksa0JBQWtCLFFBR3RCLEVBQUMsS0FBSyxFQUFFLGdCQUFnQixFQUFDOzswQkFnQ2xCLE1BQU07MkJBQUMsZUFBZTs7MEJBR3RCLE1BQU07MkJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBJbmplY3QsIE9uSW5pdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge01hdENoaXBFZGl0ZWRFdmVudCwgTWF0Q2hpcElucHV0RXZlbnR9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoaXBzJztcbmltcG9ydCB7Q09NTUEsIEVOVEVSfSBmcm9tICdAYW5ndWxhci9jZGsva2V5Y29kZXMnO1xuaW1wb3J0IHtJbXBvcnREYXRhQ29tcG9uZW50fSBmcm9tICcuLi9pbXBvcnQtZGF0YS5jb21wb25lbnQnO1xuaW1wb3J0IHtNYXRMZWdhY3lEaWFsb2cgYXMgTWF0RGlhbG9nfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktZGlhbG9nJztcbmltcG9ydCB7XG4gICAgTUFUX0xFR0FDWV9ESUFMT0dfREFUQSBhcyBNQVRfRElBTE9HX0RBVEEsXG4gICAgTWF0TGVnYWN5RGlhbG9nUmVmIGFzIE1hdERpYWxvZ1JlZlxufSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktZGlhbG9nJztcbmltcG9ydCAqIGFzIGxvZGFzaCBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtEYXRhc291cmNlU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vc2VydmljZXMvZGF0YXNvdXJjZS5zZXJ2aWNlJztcbmltcG9ydCB7SHR0cENsaWVudH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtNYXRMZWdhY3lTbmFja0JhciBhcyBNYXRTbmFja0Jhcn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbGVnYWN5LXNuYWNrLWJhcic7XG5pbXBvcnQge0tJTklOVEVMX0NPTkZJRywgS2luaW50ZWxNb2R1bGVDb25maWd9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2tpbmludGVsLWNvbmZpZyc7XG5pbXBvcnQgc2hvcnRIYXNoIGZyb20gJ3Nob3J0LWhhc2gnO1xuXG5jb25zdCBfID0gbG9kYXNoLmRlZmF1bHQ7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAna2ktaW1wb3J0LXdpemFyZCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2ltcG9ydC13aXphcmQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2ltcG9ydC13aXphcmQuY29tcG9uZW50LnNhc3MnXSxcbiAgICBob3N0OiB7Y2xhc3M6ICdkaWFsb2ctd3JhcHBlcid9XG59KVxuZXhwb3J0IGNsYXNzIEltcG9ydFdpemFyZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgICBwdWJsaWMgY29sdW1uczogYW55ID0gW107XG4gICAgcHVibGljIGFkZE9uQmx1ciA9IHRydWU7XG4gICAgcHVibGljIG5hbWU6IHN0cmluZztcbiAgICBwdWJsaWMgcmVsb2FkVVJMOiBzdHJpbmc7XG4gICAgcHVibGljIGRhdGFzb3VyY2VVcGRhdGU6IGFueTtcbiAgICBwdWJsaWMgaW1wb3J0Q2hvaWNlOiBzdHJpbmcgPSBudWxsO1xuICAgIHB1YmxpYyBpbXBvcnRLZXk6IHN0cmluZyA9IG51bGw7XG4gICAgcHVibGljIGJhY2tlbmRVUkw6IHN0cmluZyA9IG51bGw7XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgXyA9IF87XG4gICAgcHVibGljIHJlYWRvbmx5IE9iamVjdCA9IE9iamVjdDtcbiAgICBwdWJsaWMgcmVhZG9ubHkgZGF0YXNvdXJjZVR5cGVzOiBhbnkgPSB7XG4gICAgICAgIHN0cmluZzogJ1RleHQgKHVwIHRvIDI1NSBjaGFycyknLFxuICAgICAgICBtZWRpdW1zdHJpbmc6ICdNZWRpdW0gVGV4dCAodXAgdG8gMjAwMCBjaGFycyknLFxuICAgICAgICBsb25nc3RyaW5nOiAnTG9uZyBUZXh0IChtb3JlIHRoYW4gMjAwMCBjaGFycyknLFxuICAgICAgICBpbnRlZ2VyOiAnTnVtYmVyICh3aG9sZSBudW1iZXIpJyxcbiAgICAgICAgZmxvYXQ6ICdEZWNpbWFsIG51bWJlcicsXG4gICAgICAgIGRhdGU6ICdEYXRlJyxcbiAgICAgICAgZGF0ZXRpbWU6ICdEYXRlIGFuZCBUaW1lJyxcbiAgICAgICAgcGlja2Zyb21zb3VyY2U6ICdQaWNrIEZyb20gTGlzdCAodXNpbmcgYW5vdGhlciBzb3VyY2UpJ1xuICAgIH07XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgc2VwYXJhdG9yS2V5c0NvZGVzID0gW0VOVEVSLCBDT01NQV0gYXMgY29uc3Q7XG5cbiAgICBwcml2YXRlIG5hbWVQcmVmaXg6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csXG4gICAgICAgICAgICAgICAgcHVibGljIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPEltcG9ydFdpemFyZENvbXBvbmVudD4sXG4gICAgICAgICAgICAgICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHB1YmxpYyBkYXRhOiBhbnksXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBkYXRhc291cmNlU2VydmljZTogRGF0YXNvdXJjZVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBzbmFja0JhcjogTWF0U25hY2tCYXIsXG4gICAgICAgICAgICAgICAgQEluamVjdChLSU5JTlRFTF9DT05GSUcpIHByaXZhdGUgY29uZmlnOiBLaW5pbnRlbE1vZHVsZUNvbmZpZykge1xuICAgIH1cblxuICAgIGFzeW5jIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnJlbG9hZFVSTCA9IHRoaXMuZGF0YS5yZWxvYWRVUkw7XG4gICAgICAgIHRoaXMuZGF0YXNvdXJjZVVwZGF0ZSA9IHRoaXMuZGF0YS5kYXRhc291cmNlVXBkYXRlO1xuICAgICAgICB0aGlzLmJhY2tlbmRVUkwgPSB0aGlzLmNvbmZpZy5iYWNrZW5kVVJMO1xuICAgICAgICB0aGlzLm5hbWVQcmVmaXggPSB0aGlzLmRhdGEubmFtZVByZWZpeCB8fCAnJztcbiAgICB9XG5cbiAgICBwdWJsaWMgY29waWVkKCkge1xuICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ0NvcGllZCB0byBDbGlwYm9hcmQnLCBudWxsLCB7XG4gICAgICAgICAgICBkdXJhdGlvbjogMjAwMCxcbiAgICAgICAgICAgIHZlcnRpY2FsUG9zaXRpb246ICd0b3AnXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBjcmVhdGVFeGFtcGxlKCkge1xuICAgICAgICBjb25zdCBleGFtcGxlID0gWydbeyddO1xuXG4gICAgICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKChjb2x1bW4sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAoY29sdW1uLnR5cGUgIT09ICdpZCcpIHtcbiAgICAgICAgICAgICAgICBleGFtcGxlLnB1c2goJzxzcGFuIGNsYXNzPVwidGV4dC1zZWNvbmRhcnlcIj5cIicgKyBjb2x1bW4ubmFtZSArICdcIjo8L3NwYW4+IFwiJyArIGNvbHVtbi50eXBlICsgJ1wiJyk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSB0aGlzLmNvbHVtbnMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBleGFtcGxlLnB1c2goJywgJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgZXhhbXBsZS5wdXNoKCd9XScpO1xuICAgICAgICByZXR1cm4gZXhhbXBsZS5qb2luKCcnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkQ29sdW1uKGV2ZW50OiBNYXRDaGlwSW5wdXRFdmVudCkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IChldmVudC52YWx1ZSB8fCAnJykudHJpbSgpO1xuXG4gICAgICAgIC8vIEFkZCBvdXIgZnJ1aXRcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmNvbHVtbnMucHVzaChcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXy5zbmFrZUNhc2UodmFsdWUpLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciB0aGUgaW5wdXQgdmFsdWVcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgICBldmVudC5jaGlwSW5wdXQhLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGVkaXRDb2x1bW4oY29sdW1uOiBzdHJpbmcsIGV2ZW50OiBNYXRDaGlwRWRpdGVkRXZlbnQpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBldmVudC52YWx1ZS50cmltKCk7XG5cbiAgICAgICAgLy8gUmVtb3ZlIGZydWl0IGlmIGl0IG5vIGxvbmdlciBoYXMgYSBuYW1lXG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlQ29sdW1uKGNvbHVtbik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFZGl0IGV4aXN0aW5nIGZydWl0XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5jb2x1bW5zLmluZGV4T2YoY29sdW1uKTtcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICAgIHRoaXMuY29sdW1uc1tpbmRleF0ubmFtZSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHJlbW92ZUNvbHVtbihjb2x1bW46IGFueSkge1xuICAgICAgICBfLnJlbW92ZSh0aGlzLmNvbHVtbnMsIHtuYW1lOiBjb2x1bW4ubmFtZX0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBpbXBvcnREYXRhKCkge1xuICAgICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKEltcG9ydERhdGFDb21wb25lbnQsIHtcbiAgICAgICAgICAgIHdpZHRoOiAnODAwcHgnLFxuICAgICAgICAgICAgaGVpZ2h0OiAnOTAwcHgnLFxuICAgICAgICAgICAgaGFzQmFja2Ryb3A6IGZhbHNlLFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIGNvbHVtbnM6IHRoaXMuY29sdW1ucyxcbiAgICAgICAgICAgICAgICBkYXRhc291cmNlVXBkYXRlOiB7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aGlzLm5hbWUgPyAodGhpcy5uYW1lUHJlZml4IHx8ICcnKSArIHRoaXMubmFtZSA6ICcnLFxuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUltcG9ydEtleTogJycsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkczogW10sXG4gICAgICAgICAgICAgICAgICAgIGFkZHM6IFtdLFxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlczogW11cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHJvd3M6IFtdLFxuICAgICAgICAgICAgICAgIGRhdGFzb3VyY2VJbnN0YW5jZUtleTogbnVsbCxcbiAgICAgICAgICAgICAgICByZWxvYWRVUkw6IHRoaXMucmVsb2FkVVJMXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBjcmVhdGVTdHJ1Y3R1cmUoKSB7XG4gICAgICAgIHRoaXMuZGF0YXNvdXJjZVVwZGF0ZS50aXRsZSA9IHRoaXMubmFtZVByZWZpeCArIHRoaXMubmFtZTtcblxuICAgICAgICAvLyBJZiBubyBwcmltYXJ5IGtleSBmaWVsZHMgaGF2ZSBiZWVuIHNldCB0aGVuIGFkZCB0aGUgSUQgZmllbGQuXG4gICAgICAgIGlmICghXy5maWx0ZXIodGhpcy5jb2x1bW5zLCAna2V5RmllbGQnKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YXNvdXJjZVVwZGF0ZS5maWVsZHMgPSBbXG4gICAgICAgICAgICAgICAge3RpdGxlOiAnSUQnLCBuYW1lOiAnaWQnLCB0eXBlOiAnaWQnfVxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKGNvbHVtbiA9PiB7XG4gICAgICAgICAgICB0aGlzLmRhdGFzb3VyY2VVcGRhdGUuZmllbGRzLnB1c2goY29sdW1uKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMuZGF0YS5hdXRvbWF0aWNJbXBvcnRLZXkpXG4gICAgICAgICAgICB0aGlzLmRhdGFzb3VyY2VVcGRhdGUuaW1wb3J0S2V5ID0gc2hvcnRIYXNoKERhdGUubm93KCkudG9TdHJpbmcoKSk7XG5cbiAgICAgICAgY29uc3Qga2V5ID0gYXdhaXQgdGhpcy5kYXRhc291cmNlU2VydmljZS5jcmVhdGVDdXN0b21EYXRhc291cmNlKHRoaXMuZGF0YXNvdXJjZVVwZGF0ZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuaW1wb3J0S2V5KSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmRhdGFzb3VyY2VTZXJ2aWNlLnVwZGF0ZUN1c3RvbURhdGFzb3VyY2Uoa2V5LCB7XG4gICAgICAgICAgICAgICAgdGl0bGU6IHRoaXMuZGF0YXNvdXJjZVVwZGF0ZS50aXRsZSxcbiAgICAgICAgICAgICAgICBpbXBvcnRLZXk6IHRoaXMuaW1wb3J0S2V5LFxuICAgICAgICAgICAgICAgIGZpZWxkczogdGhpcy5kYXRhc291cmNlVXBkYXRlLmZpZWxkcyxcbiAgICAgICAgICAgICAgICBhZGRzOiBbXSxcbiAgICAgICAgICAgICAgICB1cGRhdGVzOiBbXSxcbiAgICAgICAgICAgICAgICBkZWxldGVzOiBbXSxcbiAgICAgICAgICAgICAgICByZXBsYWNlczogW11cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB0aGlzLnJlbG9hZFVSTCArICcvJyArIGtleTtcbiAgICB9XG5cblxufVxuIiwiPGRpdiBjbGFzcz1cImRpYWxvZ1wiIGNka0RyYWcgY2RrRHJhZ1Jvb3RFbGVtZW50PVwiLmNkay1vdmVybGF5LXBhbmVcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctdGl0bGUgYmctZ3JheS0xMDBcIiBjZGtEcmFnSGFuZGxlPlxuICAgICAgICA8aDIgbWF0LWRpYWxvZy10aXRsZT5JbXBvcnQgRGF0YTwvaDI+XG5cbiAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gbWF0LWRpYWxvZy1jbG9zZT1cImNsb3NlZFwiPlxuICAgICAgICAgICAgPG1hdC1pY29uPmNsZWFyPC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLWNvbnRlbnQgcC0wIFwiPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJiZy1ibHVlLTUwIHAtNFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXhcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2hyaW5rLTBcIj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImgtNSB3LTUgdGV4dC1ibHVlLTQwMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgZGF0YS1zbG90PVwiaWNvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNMTggMTBhOCA4IDAgMSAxLTE2IDAgOCA4IDAgMCAxIDE2IDBabS03LTRhMSAxIDAgMSAxLTIgMCAxIDEgMCAwIDEgMiAwWk05IDlhLjc1Ljc1IDAgMCAwIDAgMS41aC4yNTNhLjI1LjI1IDAgMCAxIC4yNDQuMzA0bC0uNDU5IDIuMDY2QTEuNzUgMS43NSAwIDAgMCAxMC43NDcgMTVIMTFhLjc1Ljc1IDAgMCAwIDAtMS41aC0uMjUzYS4yNS4yNSAwIDAgMS0uMjQ0LS4zMDRsLjQ1OS0yLjA2NkExLjc1IDEuNzUgMCAwIDAgOS4yNTMgOUg5WlwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWwtMyBmbGV4LTEgbWQ6ZmxleCBtZDpqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LXNtIHRleHQtYmx1ZS03MDAgbWItMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgVXNlIHRoaXMgZm9ybSB0byBkZWNpZGUgaG93IHlvdSB3b3VsZCBsaWtlIHRvIGFkZCBkYXRhIHRvIHlvdXIgYWNjb3VudC4gRm9yIDxiPk1hbnVhbDwvYj4gYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICA8Yj5BUEk8L2I+IG1ldGhvZHMsIHlvdSB3aWxsIG5lZWQgdG8gZGVjaWRlIHVwLWZyb250IHRoZSBzdHJ1Y3R1cmUgb2YgeW91ciBkYXRhIGJ5IHN1cHBseWluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJlbGV2YW50IGNvbHVtbiBuYW1lcyBiZWxvdy4gRm9yIDxiPkNTVjwvYj4gdXBsb2FkIHlvdSBjYW4gdXNlIHRoZSBleGlzdGluZyBoZWFkZXIgcm93IGluXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGUgZGF0YSB0byBkZXRlcm1pbmUgdGhlIHN0cnVjdHVyZS5cbiAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJweC02IHB5LTRcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cIm1iLTRcIj5cbiAgICAgICAgICAgICAgICBOYW1lXG4gICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwidy1mdWxsXCIgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cIm5hbWVcIiBwbGFjZWhvbGRlcj1cIkVudGVyIGRhdGEgc2V0IG5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2JvcmRlci1yZWQtNTAwJzogIW5hbWV9XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tMC41IHRleHQteHMgdGV4dC1ncmF5LTUwMCBmb250LW5vcm1hbFwiPlBsZWFzZSBlbnRlciBhIGZyaWVuZGx5IG5hbWUgdG8gaWRlbnRpZnkgdGhpcyBkYXRhIHNldC48L2Rpdj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteS00IGZvbnQtbWVkaXVtXCI+U2VsZWN0IG1ldGhvZCBvZiBkYXRhIGltcG9ydDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgbWItNFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJpbXBvcnRDaG9pY2UgPSAnTUFOVUFMJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2JnLWdyYXktNTAgYm9yZGVyLWdyYXktNDAwJzogaW1wb3J0Q2hvaWNlID09PSAnTUFOVUFMJ31cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyZWxhdGl2ZSBibG9jayB3LWZ1bGwgYm9yZGVyLTIgYm9yZGVyLWdyYXktMzAwIGJvcmRlci1kYXNoZWQgcm91bmRlZC1sZyBwLTggdGV4dC1jZW50ZXIgaG92ZXI6Ym9yZGVyLWdyYXktNDAwIGZvY3VzOm91dGxpbmUtbm9uZVwiPlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSBpbmxpbmUtYmxvY2tcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBteC1hdXRvIHRleHQtNnhsIGgtMTQgdy0yMCB0ZXh0LWdyYXktMzAwXCI+ZWRpdF9ub3RlXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtdC0yIGJsb2NrIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ncmF5LTkwMFwiPk1hbnVhbCBEYXRhIEVudHJ5PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJpbXBvcnREYXRhKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJteC0yIHJlbGF0aXZlIGJsb2NrIHctZnVsbCBib3JkZXItMiBib3JkZXItZ3JheS0zMDAgYm9yZGVyLWRhc2hlZCByb3VuZGVkLWxnIHAtOCB0ZXh0LWNlbnRlciBob3Zlcjpib3JkZXItZ3JheS00MDAgZm9jdXM6b3V0bGluZS1ub25lXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIGlubGluZS1ibG9ja1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIG14LWF1dG8gdGV4dC02eGwgaC0xNCB3LTIwIHRleHQtZ3JheS0zMDBcIj51cGxvYWRfZmlsZVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXQtMiBibG9jayB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheS05MDBcIj5VcGxvYWQgQ1NWIERhdGE8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImltcG9ydENob2ljZSA9ICdBUEknXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnYmctZ3JheS01MCBib3JkZXItZ3JheS00MDAnOiBpbXBvcnRDaG9pY2UgPT09ICdBUEknfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJlbGF0aXZlIGJsb2NrIHctZnVsbCBib3JkZXItMiBib3JkZXItZ3JheS0zMDAgYm9yZGVyLWRhc2hlZCByb3VuZGVkLWxnIHAtOCB0ZXh0LWNlbnRlciBob3Zlcjpib3JkZXItZ3JheS00MDAgZm9jdXM6b3V0bGluZS1ub25lXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIGlubGluZS1ibG9ja1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIG14LWF1dG8gdGV4dC02eGwgaC0xNCB3LTIwIHRleHQtZ3JheS0zMDBcIj5kYXRhYmFzZV91cGxvYWRcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm10LTIgYmxvY2sgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXktOTAwXCI+Q29ubmVjdCB0byBBUEk8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cImltcG9ydENob2ljZSA9PT0gJ01BTlVBTCcgfHwgaW1wb3J0Q2hvaWNlID09PSAnQVBJJ1wiPlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTYgZm9udC1tZWRpdW1cIj5FbnRlciB0aGUgY29sdW1ucyBmb3IgdGhpcyBkYXRhIHNldC48L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cInctZnVsbFwiIGFwcGVhcmFuY2U9XCJmaWxsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+RGF0YXNldCBDb2x1bW5zPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtY2hpcC1ncmlkICNjaGlwR3JpZCBhcmlhLWxhYmVsPVwiRW50ZXIgY29sdW1uIG5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2hpcC1yb3cgY2xhc3M9XCJiZy13aGl0ZVwiICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZW1vdmVkKT1cInJlbW92ZUNvbHVtbihjb2x1bW4pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjb2x1bW4udGl0bGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0Q2hpcFJlbW92ZSBbYXR0ci5hcmlhLWxhYmVsXT1cIidyZW1vdmUgJyArIGNvbHVtbi50aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2FuY2VsPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNoaXAtcm93PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBsYWNlaG9sZGVyPVwiRW50ZXIgY29sdW1uIG5hbWUgYW5kIHByZXNzIGVudGVyLi4uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0Q2hpcElucHV0Rm9yXT1cImNoaXBHcmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0Q2hpcElucHV0U2VwYXJhdG9yS2V5Q29kZXNdPVwic2VwYXJhdG9yS2V5c0NvZGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0Q2hpcElucHV0QWRkT25CbHVyXT1cImFkZE9uQmx1clwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdENoaXBJbnB1dFRva2VuRW5kKT1cImFkZENvbHVtbigkZXZlbnQpXCIvPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1jaGlwLWdyaWQ+XG4gICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC14cyAtbXQtNCBtbC0wLjUgdGV4dC1ncmF5LTUwMFwiPlN0YXJ0IHR5cGluZyBpbiB0aGUgYm94IGFib3ZlIHRvIGVudGVyIHRoZSBjb2x1bW4gbmFtZXMuPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2ICAqbmdJZj1cIiFjb2x1bW5zLmxlbmd0aFwiIGNsYXNzPVwicm91bmRlZC1tZCBiZy15ZWxsb3ctNTAgcC0zIG10LTRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaHJpbmstMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJoLTUgdy01IHRleHQteWVsbG93LTQwMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgZGF0YS1zbG90PVwiaWNvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgZD1cIk04LjQ4NSAyLjQ5NWMuNjczLTEuMTY3IDIuMzU3LTEuMTY3IDMuMDMgMGw2LjI4IDEwLjg3NWMuNjczIDEuMTY3LS4xNyAyLjYyNS0xLjUxNiAyLjYyNUgzLjcyYy0xLjM0NyAwLTIuMTg5LTEuNDU4LTEuNTE1LTIuNjI1TDguNDg1IDIuNDk1Wk0xMCA1YS43NS43NSAwIDAgMSAuNzUuNzV2My41YS43NS43NSAwIDAgMS0xLjUgMHYtMy41QS43NS43NSAwIDAgMSAxMCA1Wm0wIDlhMSAxIDAgMSAwIDAtMiAxIDEgMCAwIDAgMCAyWlwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWwtM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cInRleHQtc20gdGV4dC15ZWxsb3ctODAwIG1iLTBcIj5QbGVhc2UgZW50ZXIgYXQgbGVhc3QgMSBjb2x1bW48L2gzPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cImNvbHVtbnMubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb250LW1lZGl1bSB0ZXh0LXNtIG10LTRcIj5TdHJ1Y3R1cmUgUHJldmlldyBhbmQgRmllbGQgVHlwZXM8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQteHMgbWItNCBtbC0wLjUgdGV4dC1ncmF5LTUwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgUHJldmlldyBlYWNoIGNvbHVtbiBjcmVhdGVkIGFuZCBzZXQgd2hpY2ggZGF0YSB0eXBlIHRoZSBjb2x1bW4gc2hvdWxkIGJlXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJfLmZpbHRlcihjb2x1bW5zLCAna2V5RmllbGQnKS5sZW5ndGhcIiBjbGFzcz1cInJvdW5kZWQtbWQgYmcteWVsbG93LTUwIHAtMyBtdC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaHJpbmstMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiaC01IHctNSB0ZXh0LXllbGxvdy00MDBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGRhdGEtc2xvdD1cImljb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTguNDg1IDIuNDk1Yy42NzMtMS4xNjcgMi4zNTctMS4xNjcgMy4wMyAwbDYuMjggMTAuODc1Yy42NzMgMS4xNjctLjE3IDIuNjI1LTEuNTE2IDIuNjI1SDMuNzJjLTEuMzQ3IDAtMi4xODktMS40NTgtMS41MTUtMi42MjVMOC40ODUgMi40OTVaTTEwIDVhLjc1Ljc1IDAgMCAxIC43NS43NXYzLjVhLjc1Ljc1IDAgMCAxLTEuNSAwdi0zLjVBLjc1Ljc1IDAgMCAxIDEwIDVabTAgOWExIDEgMCAxIDAgMC0yIDEgMSAwIDAgMCAwIDJaXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtbC0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cInRleHQtc20gdGV4dC15ZWxsb3ctODAwIG1iLTBcIj5ObyBhdXRvIGluY3JlbWVudCBJRCBjb2x1bW4gd2lsbCBiZSBnZW5lcmF0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1ZSB0byBwcmltYXJ5IGtleXMgYmVpbmcgZGVmaW5lZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9oMz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8dGFibGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiYm9yZGVyIHB5LTIgcHgtMyBiZy1ncmF5LTEwMCBmb250LW1lZGl1bVwiPkNvbHVtbiBOYW1lPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJib3JkZXIgcHktMiBweC0zIGJnLWdyYXktMTAwIGZvbnQtbWVkaXVtXCI+Q29sdW1uIFR5cGU8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImJvcmRlciBweS0yIHB4LTMgYmctZ3JheS0xMDAgZm9udC1tZWRpdW0gdGV4dC1jZW50ZXJcIj5QcmltYXJ5IEtleTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiYm9yZGVyIHB5LTIgcHgtMyBiZy1ncmF5LTEwMCBmb250LW1lZGl1bVwiPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1uczsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImJvcmRlci1sIGJvcmRlci10IGJvcmRlci1iIGJvcmRlci1yIHB5LTIgcHgtMyBmb250LW1lZGl1bVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NvbHVtbi50aXRsZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJib3JkZXItdCBib3JkZXItYiBib3JkZXItciBwLTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImJvcmRlci1ub25lIHAtMlwiIFsobmdNb2RlbCldPVwiY29sdW1uc1tpXS50eXBlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCJ0eXBlXCIgKm5nRm9yPVwibGV0IHR5cGUgb2YgT2JqZWN0LmtleXMoZGF0YXNvdXJjZVR5cGVzKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZGF0YXNvdXJjZVR5cGVzW3R5cGVdfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImJvcmRlci10IGJvcmRlci1iIGJvcmRlci1yIHAtMCB0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IGNvbG9yPVwicHJpbWFyeVwiIFsobmdNb2RlbCldPVwiY29sdW1uc1tpXS5rZXlGaWVsZFwiPjwvbWF0LWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiYm9yZGVyLXQgYm9yZGVyLWIgYm9yZGVyLXIgcC0wIHRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY29sb3I9XCJ3YXJuXCIgbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJyZW1vdmVDb2x1bW4oY29sdW1uKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+ZGVsZXRlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cblxuPCEtLSAgICAgICAgICAgICAgICAgICAgPHRhYmxlPi0tPlxuPCEtLSAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4tLT5cbjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidy0yMCBib3JkZXItbCBib3JkZXItdCBib3JkZXItYiBib3JkZXItciBiZy1ncmF5LTEwMCBweS0yIHB4LTNcIj48L3RkPi0tPlxuPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJib3JkZXItdCBib3JkZXItYiBib3JkZXItciBweS0yIHB4LTMgYmctZ3JheS0xMDAgZm9udC1tZWRpdW1cIiBbY29sU3Bhbl09XCJjb2x1bW5zLmxlbmd0aFwiPkNvbHVtbnM8L3RkPi0tPlxuPCEtLSAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+LS0+XG48IS0tICAgICAgICAgICAgICAgICAgICAgICAgPHRyPi0tPlxuPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ3LTIwIGJvcmRlci1sIGJvcmRlci10IGJvcmRlci1iIGJvcmRlci1yIGJnLWdyYXktMTAwIHB5LTIgcHgtMyBmb250LW1lZGl1bVwiPk5hbWU8L3RkPi0tPlxuPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJib3JkZXItdCBib3JkZXItYiBib3JkZXItciBweS0yIHB4LTNcIiAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGNvbHVtbnNcIj4tLT5cbjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPlxuPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPi0tPlxuPCEtLSAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+LS0+XG48IS0tICAgICAgICAgICAgICAgICAgICAgICAgPHRyPi0tPlxuPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ3LTIwIGJvcmRlci1sIGJvcmRlci10IGJvcmRlci1iIGJvcmRlci1yIGJnLWdyYXktMTAwIHB5LTIgcHgtMyBmb250LW1lZGl1bVwiPlR5cGU8L3RkPi0tPlxuPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJib3JkZXItdCBib3JkZXItYiBib3JkZXItciBwLTBcIiAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGNvbHVtbnM7IGxldCBpID0gaW5kZXhcIj4tLT5cbjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJib3JkZXItbm9uZSBwLTJcIiBbKG5nTW9kZWwpXT1cImNvbHVtbnNbaV0udHlwZVwiPi0tPlxuPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cInR5cGVcIiAqbmdGb3I9XCJsZXQgdHlwZSBvZiBPYmplY3Qua2V5cyhkYXRhc291cmNlVHlwZXMpXCI+LS0+XG48IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZGF0YXNvdXJjZVR5cGVzW3R5cGVdfX0tLT5cbjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj4tLT5cbjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0Pi0tPlxuPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPi0tPlxuPCEtLSAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+LS0+XG48IS0tICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPi0tPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cblxuXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiaW1wb3J0Q2hvaWNlID09PSAnQVBJJ1wiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cIm10LTIgbWItNFwiPlxuICAgICAgICAgICAgICAgICAgICBBUEkgSW1wb3J0IEtleVxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJ3LWZ1bGxcIiB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiaW1wb3J0S2V5XCIgcGxhY2Vob2xkZXI9XCJFbnRlciBpbXBvcnQga2V5XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb250LW5vcm1hbCB0ZXh0LWdyYXktNTAwIHRleHQteHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgd2lsbCBiZSB1c2VkIGFzIHBhcnQgb2YgdGhlIEFQSSByZXF1ZXN0IHdoZW5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cblxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJpbXBvcnRLZXlcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtYmFzZSBmb250LXNlbWlib2xkXCI+RXhhbXBsZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtc20gbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc2VydCBhIHNldCBvZiBuZXcgcm93cyB0byB0aGUgZGF0YSBzb3VyY2UgaWRlbnRpZmllZCBieSB0aGUgcGFzc2VkIGltcG9ydCBrZXlcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAjY3JlYXRlIGNsYXNzPVwidGV4dC14cyBiZy1ncmF5LTgwMCBib3JkZXItMiBib3JkZXItZ3JheS05MDAgdGV4dC13aGl0ZSByb3VuZGVkLW1kIHAtM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9XCJ3aGl0ZXNwYWNlLW5vcm1hbFwiPmN1cmwgLUggPHNwYW4gY2xhc3M9XCJ0ZXh0LXNlY29uZGFyeVwiPlwiQVBJLUtFWTo8Yj5bW2FwaUtleV1dPC9iPlwiPC9zcGFuPiAtSCA8c3BhbiBjbGFzcz1cInRleHQtc2Vjb25kYXJ5XCI+XCJBUEktU0VDUkVUOjxiPltbYXBpU2VjcmV0XV08L2I+XCI8L3NwYW4+PC9wcmU+PHByZSBjbGFzcz1cIndoaXRlc3BhY2Utbm9ybWFsXCI+IC1YIDxiPlBPU1Q8L2I+IDxzcGFuIGNsYXNzPVwidGV4dC1zZWNvbmRhcnlcIj57e2JhY2tlbmRVUkx9fS9hcGkvdGFidWxhckRhdGEve3tpbXBvcnRLZXl9fTwvc3Bhbj48L3ByZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gW2Nka0NvcHlUb0NsaXBib2FyZF09XCJjcmVhdGUudGV4dENvbnRlbnRcIiAoY2RrQ29weVRvQ2xpcGJvYXJkQ29waWVkKT1cImNvcGllZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXdoaXRlIGFic29sdXRlIGJvdHRvbS0wIHJpZ2h0LTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+Y29udGVudF9jb3B5PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1zZW1pYm9sZCB0ZXh0LXNtIG15LTFcIj5FeGFtcGxlIFBheWxvYWQ8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQteHMgcmVsYXRpdmUgYmctZ3JheS04MDAgYm9yZGVyLTIgYm9yZGVyLWdyYXktOTAwIHRleHQtd2hpdGUgcm91bmRlZC1tZCBwLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9XCJ3aGl0ZXNwYWNlLW5vcm1hbFwiIFtpbm5lckhUTUxdPVwiY3JlYXRlRXhhbXBsZSgpXCI+PC9wcmU+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgPC9kaXY+XG5cblxuXG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLWZvb3RlclwiPlxuICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gbWF0LWRpYWxvZy1jbG9zZT1cImNsb3NlZFwiIG1hdC1zdHJva2VkLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCI+Q2xvc2U8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIG1hdC1mbGF0LWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiB0eXBlPVwiYnV0dG9uXCIgW2Rpc2FibGVkXT1cIiFuYW1lIHx8ICFjb2x1bW5zLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNyZWF0ZVN0cnVjdHVyZSgpXCI+U2F2ZSBDaGFuZ2VzPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbjwvZGl2PlxuXG5cbiJdfQ==