@po-ui/ng-sync 15.15.0 → 16.0.0-next.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 (127) hide show
  1. package/README.md +3 -3
  2. package/{esm2020 → esm2022}/lib/index.mjs +14 -14
  3. package/{esm2020 → esm2022}/lib/models/index.mjs +5 -5
  4. package/{esm2020 → esm2022}/lib/models/po-data-message.model.mjs +56 -56
  5. package/esm2022/lib/models/po-data-transform.model.mjs +23 -0
  6. package/esm2022/lib/models/po-entity/po-entity.model.mjs +217 -0
  7. package/esm2022/lib/models/po-event-sourcing-error-response.model.mjs +21 -0
  8. package/esm2022/lib/models/po-network-status.model.mjs +45 -0
  9. package/{esm2020 → esm2022}/lib/models/po-network-type.enum.mjs +29 -29
  10. package/esm2022/lib/models/po-query-builder/po-query-builder.model.mjs +246 -0
  11. package/{esm2020 → esm2022}/lib/models/po-request-type.enum.mjs +15 -15
  12. package/{esm2020 → esm2022}/lib/po-sync.module.mjs +40 -40
  13. package/{esm2020 → esm2022}/lib/services/po-event-sourcing/enums/po-event-sourcing-operation.enum.mjs +16 -16
  14. package/{esm2020 → esm2022}/lib/services/po-event-sourcing/index.mjs +3 -3
  15. package/{esm2020 → esm2022}/lib/services/po-event-sourcing/interfaces/po-event-sourcing-item.interface.mjs +1 -1
  16. package/{esm2020 → esm2022}/lib/services/po-event-sourcing/interfaces/po-event-sourcing-summary-item.interface.mjs +1 -1
  17. package/esm2022/lib/services/po-event-sourcing/po-event-sourcing.service.mjs +379 -0
  18. package/{esm2020 → esm2022}/lib/services/po-http-client/interfaces/po-http-header-option.interface.mjs +10 -10
  19. package/{esm2020 → esm2022}/lib/services/po-http-client/interfaces/po-http-request-data.interface.mjs +1 -1
  20. package/{esm2020 → esm2022}/lib/services/po-http-client/interfaces/po-response-api.interface.mjs +1 -1
  21. package/esm2022/lib/services/po-http-client/po-http-client.service.mjs +149 -0
  22. package/{esm2020 → esm2022}/lib/services/po-http-client/po-http-request-type.enum.mjs +24 -24
  23. package/esm2022/lib/services/po-network/po-network.service.mjs +59 -0
  24. package/{esm2020 → esm2022}/lib/services/po-schema/index.mjs +3 -3
  25. package/esm2022/lib/services/po-schema/po-schema-definition/po-schema-definition.service.mjs +78 -0
  26. package/esm2022/lib/services/po-schema/po-schema-util/po-schema-util.model.mjs +124 -0
  27. package/esm2022/lib/services/po-schema/po-schema.service.mjs +176 -0
  28. package/{esm2020 → esm2022}/lib/services/po-sync/interfaces/po-sync-config.interface.mjs +1 -1
  29. package/{esm2020 → esm2022}/lib/services/po-sync/interfaces/po-sync-field-options.interface.mjs +1 -1
  30. package/{esm2020 → esm2022}/lib/services/po-sync/interfaces/po-sync-response.interface.mjs +1 -1
  31. package/{esm2020 → esm2022}/lib/services/po-sync/interfaces/po-sync-schema.interface.mjs +1 -1
  32. package/esm2022/lib/services/po-sync/po-sync.service.mjs +336 -0
  33. package/{esm2020 → esm2022}/lib/utils/utils.mjs +62 -62
  34. package/{esm2020 → esm2022}/po-ui-ng-sync.mjs +4 -4
  35. package/{esm2020 → esm2022}/public-api.mjs +1 -1
  36. package/{fesm2020 → fesm2022}/po-ui-ng-sync.mjs +2004 -1962
  37. package/{fesm2020 → fesm2022}/po-ui-ng-sync.mjs.map +1 -1
  38. package/index.d.ts +5 -5
  39. package/lib/index.d.ts +14 -14
  40. package/lib/models/index.d.ts +5 -5
  41. package/lib/models/po-data-message.model.d.ts +46 -46
  42. package/lib/models/po-data-transform.model.d.ts +52 -52
  43. package/lib/models/po-entity/po-entity.model.d.ts +122 -122
  44. package/lib/models/po-event-sourcing-error-response.model.d.ts +20 -20
  45. package/lib/models/po-network-status.model.d.ts +25 -25
  46. package/lib/models/po-network-type.enum.d.ts +28 -28
  47. package/lib/models/po-query-builder/po-query-builder.model.d.ts +126 -126
  48. package/lib/models/po-request-type.enum.d.ts +14 -14
  49. package/lib/po-sync.module.d.ts +11 -11
  50. package/lib/services/po-event-sourcing/enums/po-event-sourcing-operation.enum.d.ts +11 -11
  51. package/lib/services/po-event-sourcing/index.d.ts +3 -3
  52. package/lib/services/po-event-sourcing/interfaces/po-event-sourcing-item.interface.d.ts +26 -26
  53. package/lib/services/po-event-sourcing/interfaces/po-event-sourcing-summary-item.interface.d.ts +16 -16
  54. package/lib/services/po-event-sourcing/po-event-sourcing.service.d.ts +74 -74
  55. package/lib/services/po-http-client/interfaces/po-http-header-option.interface.d.ts +15 -15
  56. package/lib/services/po-http-client/interfaces/po-http-request-data.interface.d.ts +24 -24
  57. package/lib/services/po-http-client/interfaces/po-response-api.interface.d.ts +14 -14
  58. package/lib/services/po-http-client/po-http-client.service.d.ts +78 -78
  59. package/lib/services/po-http-client/po-http-request-type.enum.d.ts +23 -23
  60. package/lib/services/po-network/po-network.service.d.ts +35 -35
  61. package/lib/services/po-schema/index.d.ts +3 -3
  62. package/lib/services/po-schema/po-schema-definition/po-schema-definition.service.d.ts +51 -51
  63. package/lib/services/po-schema/po-schema-util/po-schema-util.model.d.ts +79 -79
  64. package/lib/services/po-schema/po-schema.service.d.ts +98 -98
  65. package/lib/services/po-sync/interfaces/po-sync-config.interface.d.ts +24 -24
  66. package/lib/services/po-sync/interfaces/po-sync-field-options.interface.d.ts +15 -15
  67. package/lib/services/po-sync/interfaces/po-sync-response.interface.d.ts +20 -20
  68. package/lib/services/po-sync/interfaces/po-sync-schema.interface.d.ts +37 -37
  69. package/lib/services/po-sync/po-sync.service.d.ts +162 -162
  70. package/lib/utils/utils.d.ts +36 -36
  71. package/package.json +10 -16
  72. package/po-ui-ng-sync-16.0.0-next.2.tgz +0 -0
  73. package/public-api.d.ts +1 -1
  74. package/schematics/migrations.json +1 -1
  75. package/schematics/ng-add/index.d.ts +7 -7
  76. package/schematics/ng-add/index.js +31 -31
  77. package/schematics/ng-add/index.spec.d.ts +1 -1
  78. package/schematics/ng-add/index.spec.js +60 -60
  79. package/schematics/ng-generate/schema/index.d.ts +4 -4
  80. package/schematics/ng-generate/schema/index.js +12 -12
  81. package/schematics/ng-generate/schema/index.spec.d.ts +1 -1
  82. package/schematics/ng-generate/schema/index.spec.js +44 -44
  83. package/schematics/ng-generate/schema/schema.d.ts +3 -3
  84. package/schematics/ng-generate/schema/schema.js +2 -2
  85. package/schematics/ng-update/v14/changes.d.ts +2 -2
  86. package/schematics/ng-update/v14/changes.js +13 -13
  87. package/schematics/ng-update/v14/index.d.ts +1 -1
  88. package/schematics/ng-update/v14/index.js +15 -15
  89. package/schematics/ng-update/v15/changes.d.ts +4 -4
  90. package/schematics/ng-update/v15/changes.js +15 -15
  91. package/schematics/ng-update/v15/index.d.ts +1 -1
  92. package/schematics/ng-update/v15/index.js +36 -36
  93. package/schematics/ng-update/v2/changes.d.ts +8 -8
  94. package/schematics/ng-update/v2/changes.js +20 -20
  95. package/schematics/ng-update/v2/index.d.ts +5 -5
  96. package/schematics/ng-update/v2/index.js +101 -101
  97. package/schematics/ng-update/v3/changes.d.ts +2 -2
  98. package/schematics/ng-update/v3/changes.js +14 -14
  99. package/schematics/ng-update/v3/index.d.ts +1 -1
  100. package/schematics/ng-update/v3/index.js +16 -16
  101. package/schematics/ng-update/v4/changes.d.ts +2 -2
  102. package/schematics/ng-update/v4/changes.js +14 -14
  103. package/schematics/ng-update/v4/index.d.ts +1 -1
  104. package/schematics/ng-update/v4/index.js +15 -15
  105. package/schematics/ng-update/v5/changes.d.ts +2 -2
  106. package/schematics/ng-update/v5/changes.js +13 -13
  107. package/schematics/ng-update/v5/index.d.ts +1 -1
  108. package/schematics/ng-update/v5/index.js +15 -15
  109. package/schematics/ng-update/v6/changes.d.ts +2 -2
  110. package/schematics/ng-update/v6/changes.js +13 -13
  111. package/schematics/ng-update/v6/index.d.ts +1 -1
  112. package/schematics/ng-update/v6/index.js +15 -15
  113. package/esm2020/lib/models/po-data-transform.model.mjs +0 -22
  114. package/esm2020/lib/models/po-entity/po-entity.model.mjs +0 -214
  115. package/esm2020/lib/models/po-event-sourcing-error-response.model.mjs +0 -17
  116. package/esm2020/lib/models/po-network-status.model.mjs +0 -44
  117. package/esm2020/lib/models/po-query-builder/po-query-builder.model.mjs +0 -238
  118. package/esm2020/lib/services/po-event-sourcing/po-event-sourcing.service.mjs +0 -372
  119. package/esm2020/lib/services/po-http-client/po-http-client.service.mjs +0 -148
  120. package/esm2020/lib/services/po-network/po-network.service.mjs +0 -56
  121. package/esm2020/lib/services/po-schema/po-schema-definition/po-schema-definition.service.mjs +0 -77
  122. package/esm2020/lib/services/po-schema/po-schema-util/po-schema-util.model.mjs +0 -124
  123. package/esm2020/lib/services/po-schema/po-schema.service.mjs +0 -174
  124. package/esm2020/lib/services/po-sync/po-sync.service.mjs +0 -325
  125. package/fesm2015/po-ui-ng-sync.mjs +0 -2113
  126. package/fesm2015/po-ui-ng-sync.mjs.map +0 -1
  127. package/po-ui-ng-sync-15.15.0.tgz +0 -0
@@ -0,0 +1,176 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { PoSchemaUtil } from './po-schema-util/po-schema-util.model';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "./po-schema-definition/po-schema-definition.service";
5
+ import * as i2 from "@po-ui/ng-storage";
6
+ /**
7
+ * @docsPrivate
8
+ *
9
+ * @description
10
+ *
11
+ * Serviço que realiza as operações nos `schemas`.
12
+ */
13
+ export class PoSchemaService {
14
+ poSchemaDefinitionService;
15
+ poStorage;
16
+ constructor(poSchemaDefinitionService, poStorage) {
17
+ this.poSchemaDefinitionService = poSchemaDefinitionService;
18
+ this.poStorage = poStorage;
19
+ }
20
+ /**
21
+ * Retorna o id a partir de uma chave de um *schema*.
22
+ *
23
+ * @param {string} schemaKey Chave do *schema* em que será realizada a busca do id.
24
+ */
25
+ static getIdByRecordKey(schemaKey) {
26
+ return schemaKey.split(':')[1];
27
+ }
28
+ /**
29
+ * Retorna a chave do *schema* informado.
30
+ *
31
+ * @param {string} schemaName Nome do *schema*.
32
+ * @param {any} recordId Id do registro.
33
+ * @param {boolean} isLocalKey Indica se é uma chave local.
34
+ */
35
+ static getRecordKey(schemaName, recordId, isLocalKey = false) {
36
+ return isLocalKey ? `${schemaName}_local:${recordId}` : `${schemaName}:${recordId}`;
37
+ }
38
+ /**
39
+ * Verifica se o dado informado é uma chave de um *schema*.
40
+ *
41
+ * @param {string} data Dado que será verificado se é uma chave de um *schema*.
42
+ * @param {string} schemaName Nome do *schema*.
43
+ */
44
+ static isSchemaKey(data, schemaName) {
45
+ return data ? data.startsWith(`${schemaName}:`) : false;
46
+ }
47
+ /**
48
+ * Cria um novo registro para o *schema* informado.
49
+ *
50
+ * @param {PoSyncSchema} schema **Schema* em que será criado o registro.
51
+ * @param {object} newRecord Registro que será criado.
52
+ */
53
+ async create(schema, newRecord) {
54
+ const id = PoSchemaUtil.getRecordId(newRecord, schema);
55
+ return this.save(schema, newRecord, id);
56
+ }
57
+ /**
58
+ * Destrói as chaves do *storage* que contém os registros dos *schemas*.
59
+ *
60
+ * @returns {Promise<void>} Promessa que é resolvida quando as chaves referentes aos *schemas* forem destruídas.
61
+ */
62
+ async destroySchemasRecords() {
63
+ const schemas = await this.poSchemaDefinitionService.getAll();
64
+ const storageKeys = await this.poStorage.keys();
65
+ for (const key of storageKeys) {
66
+ const schemaKey = schemas.find(schema => PoSchemaService.isSchemaKey(key, schema.name));
67
+ if (schemaKey) {
68
+ const id = PoSchemaService.getIdByRecordKey(key);
69
+ await this.remove(schemaKey.name, id);
70
+ }
71
+ }
72
+ }
73
+ /**
74
+ * Retorna o registro referente ao *schema* informado.
75
+ *
76
+ * @param {string} schemaName Nome do *schema*.
77
+ * @param {any} recordId Id do registro.
78
+ */
79
+ async get(schemaName, recordId) {
80
+ const isLocalRecord = true;
81
+ const localRecord = await this.getRecord(schemaName, recordId, isLocalRecord);
82
+ const record = await this.getRecord(schemaName, recordId);
83
+ return Object.assign(record, localRecord);
84
+ }
85
+ /**
86
+ * Retorna todos os registros referente ao *schema* informado.
87
+ *
88
+ * @param {string} schemaName Nome do *schema*.
89
+ */
90
+ async getAll(schemaName) {
91
+ const storageKeys = await this.poStorage.keys();
92
+ const schemaRecords = [];
93
+ for (const key of storageKeys) {
94
+ if (PoSchemaService.isSchemaKey(key, schemaName)) {
95
+ const id = PoSchemaService.getIdByRecordKey(key);
96
+ schemaRecords.push(await this.get(schemaName, id));
97
+ }
98
+ }
99
+ return schemaRecords;
100
+ }
101
+ /**
102
+ * Aguarda a liberação do recurso limitado, posteriormente o envolve em um comportamento
103
+ * de bloqueio e desbloqueio.
104
+ *
105
+ * @param {Function} limitedResource Função que será envolvida no comportamento de bloqueio e desbloqueio.
106
+ */
107
+ limitedCallWrap(limitedResource) {
108
+ return this.poStorage.limitedCallWrap(limitedResource);
109
+ }
110
+ /**
111
+ * Remove um registro de um *schema* informado.
112
+ *
113
+ * @param {string} schemaName Nome do *schema*.
114
+ * @param {any} recordId Id do registro.
115
+ */
116
+ async remove(schemaName, recordId) {
117
+ const recordKey = PoSchemaService.getRecordKey(schemaName, recordId);
118
+ const localRecordKey = PoSchemaService.getRecordKey(schemaName, recordId, true);
119
+ await this.poStorage.remove(recordKey);
120
+ await this.poStorage.remove(localRecordKey);
121
+ }
122
+ /**
123
+ * Atualiza um registro de um *schema* informado.
124
+ *
125
+ * @param {PoSyncSchema} schema **Schema* referente ao registro que será alterado.
126
+ * @param {object} record Registro que será atualizado.
127
+ * @param {any} recordId Id do registro que deseja ser alterado. Deve ser utilizado em casos em que o id foi alterado.
128
+ */
129
+ async update(schema, record, recordId) {
130
+ const id = PoSchemaUtil.getRecordId(record, schema);
131
+ if (recordId) {
132
+ record = await this.updateRecordId(schema.name, record, recordId);
133
+ }
134
+ return this.save(schema, record, id);
135
+ }
136
+ /**
137
+ * Atualiza todos os registros de um *schema*.
138
+ *
139
+ * @param {PoSyncSchema} schema **Schema* referente aos registros que serão alterados.
140
+ * @param {Array<object>} records Lista de registros que serão alterados.
141
+ */
142
+ async updateAll(schema, records) {
143
+ for (const record of records) {
144
+ await this.update(schema, record);
145
+ }
146
+ }
147
+ async getRecord(schemaName, recordId, isLocalRecord = false) {
148
+ return (await this.poStorage.get(PoSchemaService.getRecordKey(schemaName, recordId, isLocalRecord))) || {};
149
+ }
150
+ async save(schema, record, recordId) {
151
+ const { serverRecord, localRecord } = PoSchemaUtil.separateSchemaFields(schema, record);
152
+ const recordKey = PoSchemaService.getRecordKey(schema.name, recordId);
153
+ await this.poStorage.set(recordKey, serverRecord);
154
+ await this.saveLocalFields(schema.name, localRecord, recordId);
155
+ return record;
156
+ }
157
+ async saveLocalFields(schemaName, localFields, recordId) {
158
+ const containsLocalFields = Object.keys(localFields).length;
159
+ if (containsLocalFields) {
160
+ const localRecordKey = PoSchemaService.getRecordKey(schemaName, recordId, true);
161
+ await this.poStorage.set(localRecordKey, localFields);
162
+ }
163
+ }
164
+ async updateRecordId(schemaName, record, recordId) {
165
+ const isLocalRecord = true;
166
+ const localRecord = await this.getRecord(schemaName, recordId, isLocalRecord);
167
+ await this.remove(schemaName, recordId);
168
+ return Object.assign(record, localRecord);
169
+ }
170
+ static ɵfac = function PoSchemaService_Factory(t) { return new (t || PoSchemaService)(i0.ɵɵinject(i1.PoSchemaDefinitionService), i0.ɵɵinject(i2.PoStorageService)); };
171
+ static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: PoSchemaService, factory: PoSchemaService.ɵfac });
172
+ }
173
+ (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PoSchemaService, [{
174
+ type: Injectable
175
+ }], function () { return [{ type: i1.PoSchemaDefinitionService }, { type: i2.PoStorageService }]; }, null); })();
176
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tc2NoZW1hLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zeW5jL3NyYy9saWIvc2VydmljZXMvcG8tc2NoZW1hL3BvLXNjaGVtYS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFLM0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVDQUF1QyxDQUFDOzs7O0FBR3JFOzs7Ozs7R0FNRztBQUVILE1BQU0sT0FBTyxlQUFlO0lBQ047SUFBOEQ7SUFBbEYsWUFBb0IseUJBQW9ELEVBQVUsU0FBMkI7UUFBekYsOEJBQXlCLEdBQXpCLHlCQUF5QixDQUEyQjtRQUFVLGNBQVMsR0FBVCxTQUFTLENBQWtCO0lBQUcsQ0FBQztJQUVqSDs7OztPQUlHO0lBQ0ssTUFBTSxDQUFDLGdCQUFnQixDQUFDLFNBQWlCO1FBQy9DLE9BQU8sU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssTUFBTSxDQUFDLFlBQVksQ0FBQyxVQUFrQixFQUFFLFFBQWEsRUFBRSxhQUFzQixLQUFLO1FBQ3hGLE9BQU8sVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsVUFBVSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLElBQUksUUFBUSxFQUFFLENBQUM7SUFDdEYsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFZLEVBQUUsVUFBa0I7UUFDekQsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDMUQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFvQixFQUFFLFNBQWlCO1FBQ2xELE1BQU0sRUFBRSxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLHFCQUFxQjtRQUN6QixNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM5RCxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFaEQsS0FBSyxNQUFNLEdBQUcsSUFBSSxXQUFXLEVBQUU7WUFDN0IsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBRXhGLElBQUksU0FBUyxFQUFFO2dCQUNiLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDakQsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7YUFDdkM7U0FDRjtJQUNILENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxHQUFHLENBQUMsVUFBa0IsRUFBRSxRQUFhO1FBQ3pDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQztRQUMzQixNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUM5RSxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRTFELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQWtCO1FBQzdCLE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNoRCxNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFFekIsS0FBSyxNQUFNLEdBQUcsSUFBSSxXQUFXLEVBQUU7WUFDN0IsSUFBSSxlQUFlLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsRUFBRTtnQkFDaEQsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNqRCxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUNwRDtTQUNGO1FBRUQsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsZUFBZSxDQUFDLGVBQXlCO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFrQixFQUFFLFFBQWE7UUFDNUMsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDckUsTUFBTSxjQUFjLEdBQUcsZUFBZSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRWhGLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdkMsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFvQixFQUFFLE1BQWMsRUFBRSxRQUFjO1FBQy9ELE1BQU0sRUFBRSxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRXBELElBQUksUUFBUSxFQUFFO1lBQ1osTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztTQUNuRTtRQUVELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBb0IsRUFBRSxPQUFzQjtRQUMxRCxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRTtZQUM1QixNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQ25DO0lBQ0gsQ0FBQztJQUVPLEtBQUssQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxhQUFhLEdBQUcsS0FBSztRQUNqRSxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM3RyxDQUFDO0lBRU8sS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFvQixFQUFFLE1BQWMsRUFBRSxRQUFhO1FBQ3BFLE1BQU0sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLEdBQUcsWUFBWSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN4RixNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFdEUsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDbEQsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRS9ELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFTyxLQUFLLENBQUMsZUFBZSxDQUFDLFVBQWtCLEVBQUUsV0FBbUIsRUFBRSxRQUFRO1FBQzdFLE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFFNUQsSUFBSSxtQkFBbUIsRUFBRTtZQUN2QixNQUFNLGNBQWMsR0FBRyxlQUFlLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDaEYsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsV0FBVyxDQUFDLENBQUM7U0FDdkQ7SUFDSCxDQUFDO0lBRU8sS0FBSyxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLFFBQVE7UUFDdkQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBRTNCLE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQzlFLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFeEMsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztJQUM1QyxDQUFDO3lFQW5MVSxlQUFlO2dFQUFmLGVBQWUsV0FBZixlQUFlOzt1RkFBZixlQUFlO2NBRDNCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5pbXBvcnQgeyBQb1N0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnQHBvLXVpL25nLXN0b3JhZ2UnO1xyXG5cclxuaW1wb3J0IHsgUG9TY2hlbWFEZWZpbml0aW9uU2VydmljZSB9IGZyb20gJy4vcG8tc2NoZW1hLWRlZmluaXRpb24vcG8tc2NoZW1hLWRlZmluaXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IFBvU2NoZW1hVXRpbCB9IGZyb20gJy4vcG8tc2NoZW1hLXV0aWwvcG8tc2NoZW1hLXV0aWwubW9kZWwnO1xyXG5pbXBvcnQgeyBQb1N5bmNTY2hlbWEgfSBmcm9tICcuLi9wby1zeW5jL2ludGVyZmFjZXMvcG8tc3luYy1zY2hlbWEuaW50ZXJmYWNlJztcclxuXHJcbi8qKlxyXG4gKiBAZG9jc1ByaXZhdGVcclxuICpcclxuICogQGRlc2NyaXB0aW9uXHJcbiAqXHJcbiAqIFNlcnZpw6dvIHF1ZSByZWFsaXphIGFzIG9wZXJhw6fDtWVzIG5vcyBgc2NoZW1hc2AuXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBQb1NjaGVtYVNlcnZpY2Uge1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcG9TY2hlbWFEZWZpbml0aW9uU2VydmljZTogUG9TY2hlbWFEZWZpbml0aW9uU2VydmljZSwgcHJpdmF0ZSBwb1N0b3JhZ2U6IFBvU3RvcmFnZVNlcnZpY2UpIHt9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldG9ybmEgbyBpZCBhIHBhcnRpciBkZSB1bWEgY2hhdmUgZGUgdW0gKnNjaGVtYSouXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2NoZW1hS2V5IENoYXZlIGRvICpzY2hlbWEqIGVtIHF1ZSBzZXLDoSByZWFsaXphZGEgYSBidXNjYSBkbyBpZC5cclxuICAgKi9cclxuICBwcml2YXRlIHN0YXRpYyBnZXRJZEJ5UmVjb3JkS2V5KHNjaGVtYUtleTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBzY2hlbWFLZXkuc3BsaXQoJzonKVsxXTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldG9ybmEgYSBjaGF2ZSBkbyAqc2NoZW1hKiBpbmZvcm1hZG8uXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2NoZW1hTmFtZSBOb21lIGRvICpzY2hlbWEqLlxyXG4gICAqIEBwYXJhbSB7YW55fSByZWNvcmRJZCBJZCBkbyByZWdpc3Ryby5cclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzTG9jYWxLZXkgSW5kaWNhIHNlIMOpIHVtYSBjaGF2ZSBsb2NhbC5cclxuICAgKi9cclxuICBwcml2YXRlIHN0YXRpYyBnZXRSZWNvcmRLZXkoc2NoZW1hTmFtZTogc3RyaW5nLCByZWNvcmRJZDogYW55LCBpc0xvY2FsS2V5OiBib29sZWFuID0gZmFsc2UpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGlzTG9jYWxLZXkgPyBgJHtzY2hlbWFOYW1lfV9sb2NhbDoke3JlY29yZElkfWAgOiBgJHtzY2hlbWFOYW1lfToke3JlY29yZElkfWA7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBWZXJpZmljYSBzZSBvIGRhZG8gaW5mb3JtYWRvIMOpIHVtYSBjaGF2ZSBkZSB1bSAqc2NoZW1hKi5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhIERhZG8gcXVlIHNlcsOhIHZlcmlmaWNhZG8gc2Ugw6kgdW1hIGNoYXZlIGRlIHVtICpzY2hlbWEqLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzY2hlbWFOYW1lIE5vbWUgZG8gKnNjaGVtYSouXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzdGF0aWMgaXNTY2hlbWFLZXkoZGF0YTogc3RyaW5nLCBzY2hlbWFOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBkYXRhID8gZGF0YS5zdGFydHNXaXRoKGAke3NjaGVtYU5hbWV9OmApIDogZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmlhIHVtIG5vdm8gcmVnaXN0cm8gcGFyYSBvICpzY2hlbWEqIGluZm9ybWFkby5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7UG9TeW5jU2NoZW1hfSBzY2hlbWEgKipTY2hlbWEqIGVtIHF1ZSBzZXLDoSBjcmlhZG8gbyByZWdpc3Ryby5cclxuICAgKiBAcGFyYW0ge29iamVjdH0gbmV3UmVjb3JkIFJlZ2lzdHJvIHF1ZSBzZXLDoSBjcmlhZG8uXHJcbiAgICovXHJcbiAgYXN5bmMgY3JlYXRlKHNjaGVtYTogUG9TeW5jU2NoZW1hLCBuZXdSZWNvcmQ6IG9iamVjdCk6IFByb21pc2U8b2JqZWN0PiB7XHJcbiAgICBjb25zdCBpZCA9IFBvU2NoZW1hVXRpbC5nZXRSZWNvcmRJZChuZXdSZWNvcmQsIHNjaGVtYSk7XHJcbiAgICByZXR1cm4gdGhpcy5zYXZlKHNjaGVtYSwgbmV3UmVjb3JkLCBpZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZXN0csOzaSBhcyBjaGF2ZXMgZG8gKnN0b3JhZ2UqIHF1ZSBjb250w6ltIG9zIHJlZ2lzdHJvcyBkb3MgKnNjaGVtYXMqLlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IFByb21lc3NhIHF1ZSDDqSByZXNvbHZpZGEgcXVhbmRvIGFzIGNoYXZlcyByZWZlcmVudGVzIGFvcyAqc2NoZW1hcyogZm9yZW0gZGVzdHJ1w61kYXMuXHJcbiAgICovXHJcbiAgYXN5bmMgZGVzdHJveVNjaGVtYXNSZWNvcmRzKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgc2NoZW1hcyA9IGF3YWl0IHRoaXMucG9TY2hlbWFEZWZpbml0aW9uU2VydmljZS5nZXRBbGwoKTtcclxuICAgIGNvbnN0IHN0b3JhZ2VLZXlzID0gYXdhaXQgdGhpcy5wb1N0b3JhZ2Uua2V5cygpO1xyXG5cclxuICAgIGZvciAoY29uc3Qga2V5IG9mIHN0b3JhZ2VLZXlzKSB7XHJcbiAgICAgIGNvbnN0IHNjaGVtYUtleSA9IHNjaGVtYXMuZmluZChzY2hlbWEgPT4gUG9TY2hlbWFTZXJ2aWNlLmlzU2NoZW1hS2V5KGtleSwgc2NoZW1hLm5hbWUpKTtcclxuXHJcbiAgICAgIGlmIChzY2hlbWFLZXkpIHtcclxuICAgICAgICBjb25zdCBpZCA9IFBvU2NoZW1hU2VydmljZS5nZXRJZEJ5UmVjb3JkS2V5KGtleSk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5yZW1vdmUoc2NoZW1hS2V5Lm5hbWUsIGlkKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0b3JuYSBvIHJlZ2lzdHJvIHJlZmVyZW50ZSBhbyAqc2NoZW1hKiBpbmZvcm1hZG8uXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2NoZW1hTmFtZSBOb21lIGRvICpzY2hlbWEqLlxyXG4gICAqIEBwYXJhbSB7YW55fSByZWNvcmRJZCBJZCBkbyByZWdpc3Ryby5cclxuICAgKi9cclxuICBhc3luYyBnZXQoc2NoZW1hTmFtZTogc3RyaW5nLCByZWNvcmRJZDogYW55KTogUHJvbWlzZTxvYmplY3Q+IHtcclxuICAgIGNvbnN0IGlzTG9jYWxSZWNvcmQgPSB0cnVlO1xyXG4gICAgY29uc3QgbG9jYWxSZWNvcmQgPSBhd2FpdCB0aGlzLmdldFJlY29yZChzY2hlbWFOYW1lLCByZWNvcmRJZCwgaXNMb2NhbFJlY29yZCk7XHJcbiAgICBjb25zdCByZWNvcmQgPSBhd2FpdCB0aGlzLmdldFJlY29yZChzY2hlbWFOYW1lLCByZWNvcmRJZCk7XHJcblxyXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24ocmVjb3JkLCBsb2NhbFJlY29yZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXRvcm5hIHRvZG9zIG9zIHJlZ2lzdHJvcyByZWZlcmVudGUgYW8gKnNjaGVtYSogaW5mb3JtYWRvLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNjaGVtYU5hbWUgTm9tZSBkbyAqc2NoZW1hKi5cclxuICAgKi9cclxuICBhc3luYyBnZXRBbGwoc2NoZW1hTmFtZTogc3RyaW5nKTogUHJvbWlzZTxBcnJheTxvYmplY3Q+PiB7XHJcbiAgICBjb25zdCBzdG9yYWdlS2V5cyA9IGF3YWl0IHRoaXMucG9TdG9yYWdlLmtleXMoKTtcclxuICAgIGNvbnN0IHNjaGVtYVJlY29yZHMgPSBbXTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBzdG9yYWdlS2V5cykge1xyXG4gICAgICBpZiAoUG9TY2hlbWFTZXJ2aWNlLmlzU2NoZW1hS2V5KGtleSwgc2NoZW1hTmFtZSkpIHtcclxuICAgICAgICBjb25zdCBpZCA9IFBvU2NoZW1hU2VydmljZS5nZXRJZEJ5UmVjb3JkS2V5KGtleSk7XHJcbiAgICAgICAgc2NoZW1hUmVjb3Jkcy5wdXNoKGF3YWl0IHRoaXMuZ2V0KHNjaGVtYU5hbWUsIGlkKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc2NoZW1hUmVjb3JkcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFndWFyZGEgYSBsaWJlcmHDp8OjbyBkbyByZWN1cnNvIGxpbWl0YWRvLCBwb3N0ZXJpb3JtZW50ZSBvIGVudm9sdmUgZW0gdW0gY29tcG9ydGFtZW50b1xyXG4gICAqIGRlIGJsb3F1ZWlvIGUgZGVzYmxvcXVlaW8uXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaW1pdGVkUmVzb3VyY2UgRnVuw6fDo28gcXVlIHNlcsOhIGVudm9sdmlkYSBubyBjb21wb3J0YW1lbnRvIGRlIGJsb3F1ZWlvIGUgZGVzYmxvcXVlaW8uXHJcbiAgICovXHJcbiAgbGltaXRlZENhbGxXcmFwKGxpbWl0ZWRSZXNvdXJjZTogRnVuY3Rpb24pOiBQcm9taXNlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMucG9TdG9yYWdlLmxpbWl0ZWRDYWxsV3JhcChsaW1pdGVkUmVzb3VyY2UpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlIHVtIHJlZ2lzdHJvIGRlIHVtICpzY2hlbWEqIGluZm9ybWFkby5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzY2hlbWFOYW1lIE5vbWUgZG8gKnNjaGVtYSouXHJcbiAgICogQHBhcmFtIHthbnl9IHJlY29yZElkIElkIGRvIHJlZ2lzdHJvLlxyXG4gICAqL1xyXG4gIGFzeW5jIHJlbW92ZShzY2hlbWFOYW1lOiBzdHJpbmcsIHJlY29yZElkOiBhbnkpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgY29uc3QgcmVjb3JkS2V5ID0gUG9TY2hlbWFTZXJ2aWNlLmdldFJlY29yZEtleShzY2hlbWFOYW1lLCByZWNvcmRJZCk7XHJcbiAgICBjb25zdCBsb2NhbFJlY29yZEtleSA9IFBvU2NoZW1hU2VydmljZS5nZXRSZWNvcmRLZXkoc2NoZW1hTmFtZSwgcmVjb3JkSWQsIHRydWUpO1xyXG5cclxuICAgIGF3YWl0IHRoaXMucG9TdG9yYWdlLnJlbW92ZShyZWNvcmRLZXkpO1xyXG4gICAgYXdhaXQgdGhpcy5wb1N0b3JhZ2UucmVtb3ZlKGxvY2FsUmVjb3JkS2V5KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEF0dWFsaXphIHVtIHJlZ2lzdHJvIGRlIHVtICpzY2hlbWEqIGluZm9ybWFkby5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7UG9TeW5jU2NoZW1hfSBzY2hlbWEgKipTY2hlbWEqIHJlZmVyZW50ZSBhbyByZWdpc3RybyBxdWUgc2Vyw6EgYWx0ZXJhZG8uXHJcbiAgICogQHBhcmFtIHtvYmplY3R9IHJlY29yZCBSZWdpc3RybyBxdWUgc2Vyw6EgYXR1YWxpemFkby5cclxuICAgKiBAcGFyYW0ge2FueX0gcmVjb3JkSWQgSWQgZG8gcmVnaXN0cm8gcXVlIGRlc2VqYSBzZXIgYWx0ZXJhZG8uIERldmUgc2VyIHV0aWxpemFkbyBlbSBjYXNvcyBlbSBxdWUgbyBpZCBmb2kgYWx0ZXJhZG8uXHJcbiAgICovXHJcbiAgYXN5bmMgdXBkYXRlKHNjaGVtYTogUG9TeW5jU2NoZW1hLCByZWNvcmQ6IG9iamVjdCwgcmVjb3JkSWQ/OiBhbnkpOiBQcm9taXNlPG9iamVjdD4ge1xyXG4gICAgY29uc3QgaWQgPSBQb1NjaGVtYVV0aWwuZ2V0UmVjb3JkSWQocmVjb3JkLCBzY2hlbWEpO1xyXG5cclxuICAgIGlmIChyZWNvcmRJZCkge1xyXG4gICAgICByZWNvcmQgPSBhd2FpdCB0aGlzLnVwZGF0ZVJlY29yZElkKHNjaGVtYS5uYW1lLCByZWNvcmQsIHJlY29yZElkKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5zYXZlKHNjaGVtYSwgcmVjb3JkLCBpZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBdHVhbGl6YSB0b2RvcyBvcyByZWdpc3Ryb3MgZGUgdW0gKnNjaGVtYSouXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1BvU3luY1NjaGVtYX0gc2NoZW1hICoqU2NoZW1hKiByZWZlcmVudGUgYW9zIHJlZ2lzdHJvcyBxdWUgc2Vyw6NvIGFsdGVyYWRvcy5cclxuICAgKiBAcGFyYW0ge0FycmF5PG9iamVjdD59IHJlY29yZHMgTGlzdGEgZGUgcmVnaXN0cm9zIHF1ZSBzZXLDo28gYWx0ZXJhZG9zLlxyXG4gICAqL1xyXG4gIGFzeW5jIHVwZGF0ZUFsbChzY2hlbWE6IFBvU3luY1NjaGVtYSwgcmVjb3JkczogQXJyYXk8b2JqZWN0Pik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgZm9yIChjb25zdCByZWNvcmQgb2YgcmVjb3Jkcykge1xyXG4gICAgICBhd2FpdCB0aGlzLnVwZGF0ZShzY2hlbWEsIHJlY29yZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGdldFJlY29yZChzY2hlbWFOYW1lLCByZWNvcmRJZCwgaXNMb2NhbFJlY29yZCA9IGZhbHNlKTogUHJvbWlzZTxvYmplY3Q+IHtcclxuICAgIHJldHVybiAoYXdhaXQgdGhpcy5wb1N0b3JhZ2UuZ2V0KFBvU2NoZW1hU2VydmljZS5nZXRSZWNvcmRLZXkoc2NoZW1hTmFtZSwgcmVjb3JkSWQsIGlzTG9jYWxSZWNvcmQpKSkgfHwge307XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHNhdmUoc2NoZW1hOiBQb1N5bmNTY2hlbWEsIHJlY29yZDogb2JqZWN0LCByZWNvcmRJZDogYW55KSB7XHJcbiAgICBjb25zdCB7IHNlcnZlclJlY29yZCwgbG9jYWxSZWNvcmQgfSA9IFBvU2NoZW1hVXRpbC5zZXBhcmF0ZVNjaGVtYUZpZWxkcyhzY2hlbWEsIHJlY29yZCk7XHJcbiAgICBjb25zdCByZWNvcmRLZXkgPSBQb1NjaGVtYVNlcnZpY2UuZ2V0UmVjb3JkS2V5KHNjaGVtYS5uYW1lLCByZWNvcmRJZCk7XHJcblxyXG4gICAgYXdhaXQgdGhpcy5wb1N0b3JhZ2Uuc2V0KHJlY29yZEtleSwgc2VydmVyUmVjb3JkKTtcclxuICAgIGF3YWl0IHRoaXMuc2F2ZUxvY2FsRmllbGRzKHNjaGVtYS5uYW1lLCBsb2NhbFJlY29yZCwgcmVjb3JkSWQpO1xyXG5cclxuICAgIHJldHVybiByZWNvcmQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHNhdmVMb2NhbEZpZWxkcyhzY2hlbWFOYW1lOiBzdHJpbmcsIGxvY2FsRmllbGRzOiBvYmplY3QsIHJlY29yZElkKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBjb250YWluc0xvY2FsRmllbGRzID0gT2JqZWN0LmtleXMobG9jYWxGaWVsZHMpLmxlbmd0aDtcclxuXHJcbiAgICBpZiAoY29udGFpbnNMb2NhbEZpZWxkcykge1xyXG4gICAgICBjb25zdCBsb2NhbFJlY29yZEtleSA9IFBvU2NoZW1hU2VydmljZS5nZXRSZWNvcmRLZXkoc2NoZW1hTmFtZSwgcmVjb3JkSWQsIHRydWUpO1xyXG4gICAgICBhd2FpdCB0aGlzLnBvU3RvcmFnZS5zZXQobG9jYWxSZWNvcmRLZXksIGxvY2FsRmllbGRzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlUmVjb3JkSWQoc2NoZW1hTmFtZSwgcmVjb3JkLCByZWNvcmRJZCkge1xyXG4gICAgY29uc3QgaXNMb2NhbFJlY29yZCA9IHRydWU7XHJcblxyXG4gICAgY29uc3QgbG9jYWxSZWNvcmQgPSBhd2FpdCB0aGlzLmdldFJlY29yZChzY2hlbWFOYW1lLCByZWNvcmRJZCwgaXNMb2NhbFJlY29yZCk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbW92ZShzY2hlbWFOYW1lLCByZWNvcmRJZCk7XHJcblxyXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24ocmVjb3JkLCBsb2NhbFJlY29yZCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
@@ -1,2 +1,2 @@
1
- export {};
1
+ export {};
2
2
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tc3luYy1jb25maWcuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3luYy9zcmMvbGliL3NlcnZpY2VzL3BvLXN5bmMvaW50ZXJmYWNlcy9wby1zeW5jLWNvbmZpZy5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBvRGF0YVRyYW5zZm9ybSB9IGZyb20gJy4vLi4vLi4vLi4vbW9kZWxzL3BvLWRhdGEtdHJhbnNmb3JtLm1vZGVsJztcclxuaW1wb3J0IHsgUG9OZXR3b3JrVHlwZSB9IGZyb20gJy4vLi4vLi4vLi4vbW9kZWxzL3BvLW5ldHdvcmstdHlwZS5lbnVtJztcclxuXHJcbi8qKlxyXG4gKiBAdXNlZEJ5IFBvU3luY1NlcnZpY2VcclxuICpcclxuICogQGRlc2NyaXB0aW9uXHJcbiAqXHJcbiAqIEludGVyZmFjZSBwYXJhIGEgZGVmaW5pw6fDo28gZGFzIGNvbmZpZ3VyYcOnw7VlcyBkbyBzaW5jcm9uaXNtby5cclxuICovXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFBvU3luY0NvbmZpZyB7XHJcbiAgLyoqXHJcbiAgICogQ2xhc3NlIHVzYWRhIHBhcmEgYSB0cmFzZm9ybWHDp8OjbyBkb3MgZGFkb3MgbmFzIHJlcXVpc2nDp8O1ZXMuXHJcbiAgICpcclxuICAgKiA+IFZlamEgbWFpcyBkZXRhbGhlcyBlbSBbRnVuZGFtZW50b3MgZG8gUE8gU3luYyAtIEFkYXB0YW5kbyBhIHJlc3Bvc3RhIGRhIEFQSSBwYXJhIG8gcGFkcsOjbyBkbyBQTyBVSV0oL2d1aWRlcy9zeW5jLWZ1bmRhbWVudGFscykuXHJcbiAgICovXHJcbiAgZGF0YVRyYW5zZm9ybT86IFBvRGF0YVRyYW5zZm9ybTtcclxuXHJcbiAgLyoqXHJcbiAgICogVGVtcG8gZW0gc2VndW5kb3MgZG8gc2ljcm9uaXNtbyBwZXJpw7NkaWNvLlxyXG4gICAqIENhc28gbsOjbyBzZWphIGRlZmluaWRvLCBvIHNpbmNyb25pc21vIHBlcmnDs2RpY28gZXN0YXLDoSBkZXNhYmlsaXRhZG8uXHJcbiAgICovXHJcbiAgcGVyaW9kPzogbnVtYmVyO1xyXG5cclxuICAvKiogVGlwb3MgZGUgY29uZXjDtWVzIHBlcm1pdGlkYXMgcGFyYSBvIHNpbmNyb25pc21vLiAqL1xyXG4gIHR5cGU6IFBvTmV0d29ya1R5cGUgfCBBcnJheTxQb05ldHdvcmtUeXBlPjtcclxufVxyXG4iXX0=
@@ -1,2 +1,2 @@
1
- export {};
1
+ export {};
2
2
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tc3luYy1maWVsZC1vcHRpb25zLmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N5bmMvc3JjL2xpYi9zZXJ2aWNlcy9wby1zeW5jL2ludGVyZmFjZXMvcG8tc3luYy1maWVsZC1vcHRpb25zLmludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIEB1c2VkQnkgUG9TeW5jU2VydmljZVxyXG4gKlxyXG4gKiBAZGVzY3JpcHRpb25cclxuICpcclxuICogSW50ZXJmYWNlIHF1ZSBpcsOhIG1hcGVhciBhcyBjb25maWd1cmHDp8O1ZXMgZG9zIGNhbXBvcyBkbyBgUG9TeW5jU2NoZW1hYC5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUG9TeW5jRmllbGRPcHRpb25zIHtcclxuICAvKiogUHJvcHJpZWRhZGUgcXVlIGluZm9ybWEgbyBub21lIGRvIGNhbXBvLiAqL1xyXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcclxuXHJcbiAgLyoqIFByb3ByaWVkYWRlIHF1ZSBpbmZvcm1hIHNlIG8gY2FtcG8gc2Vyw6EgYXBlbmFzIHBhcmEgYXJtYXplbmFtZW50byBsb2NhbFxyXG4gICAqIG91IHNlIGRldmUgc2VyIGVudmlhZG8gcGFyYSBvIHNlcnZpZG9yLlxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IGxvY2FsPzogYm9vbGVhbjtcclxufVxyXG4iXX0=
@@ -1,2 +1,2 @@
1
- export {};
1
+ export {};
2
2
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tc3luYy1yZXNwb25zZS5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zeW5jL3NyYy9saWIvc2VydmljZXMvcG8tc3luYy9pbnRlcmZhY2VzL3BvLXN5bmMtcmVzcG9uc2UuaW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwRXJyb3JSZXNwb25zZSwgSHR0cFJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5cclxuaW1wb3J0IHsgUG9FdmVudFNvdXJjaW5nRXJyb3JSZXNwb25zZSB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9wby1ldmVudC1zb3VyY2luZy1lcnJvci1yZXNwb25zZS5tb2RlbCc7XHJcbmltcG9ydCB7IFBvSHR0cFJlcXVlc3REYXRhIH0gZnJvbSAnLi4vLi4vcG8taHR0cC1jbGllbnQvaW50ZXJmYWNlcy9wby1odHRwLXJlcXVlc3QtZGF0YS5pbnRlcmZhY2UnO1xyXG5cclxuLyoqXHJcbiAqIEB1c2VkQnkgUG9TeW5jU2VydmljZVxyXG4gKlxyXG4gKiBAZGVzY3JpcHRpb25cclxuICpcclxuICogRGVmaW5lIGEgcmVzcG9zdGEgZG9zIGV2ZW50b3MgZW52aWFkb3MgYW8gc2Vydmlkb3IuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFBvU3luY1Jlc3BvbnNlIHtcclxuICAvKiogSWRlbnRpZmljYWRvciBkbyBldmVudG8gbmEgZmlsYS4gKi9cclxuICBpZDogbnVtYmVyO1xyXG5cclxuICAvKiogSWRlbnRpZmljYWRvciBjdXN0b21pemFkbyBkbyByZWdpc3Ryby4gKi9cclxuICBjdXN0b21SZXF1ZXN0SWQ/OiBzdHJpbmc7XHJcblxyXG4gIC8qKiBEYWRvcyBkYSByZXF1aXNpw6fDo28uICovXHJcbiAgcmVxdWVzdDogUG9IdHRwUmVxdWVzdERhdGE7XHJcblxyXG4gIC8qKiBSZXNwb3N0YSByZXRvcm5hZGEgYXDDs3MgYSB0ZW50YXRpdmEgZGUgZW52aW8gcGFyYSBvIHNlcnZpZG9yLiAqL1xyXG4gIHJlc3BvbnNlOiBIdHRwUmVzcG9uc2U8T2JqZWN0PiB8IEh0dHBFcnJvclJlc3BvbnNlIHwgUG9FdmVudFNvdXJjaW5nRXJyb3JSZXNwb25zZTtcclxufVxyXG4iXX0=
@@ -1,2 +1,2 @@
1
- export {};
1
+ export {};
2
2
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tc3luYy1zY2hlbWEuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3luYy9zcmMvbGliL3NlcnZpY2VzL3BvLXN5bmMvaW50ZXJmYWNlcy9wby1zeW5jLXNjaGVtYS5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBvU3luY0ZpZWxkT3B0aW9ucyB9IGZyb20gJy4vcG8tc3luYy1maWVsZC1vcHRpb25zLmludGVyZmFjZSc7XHJcblxyXG4vKipcclxuICogQHVzZWRCeSBQb1N5bmNTZXJ2aWNlXHJcbiAqXHJcbiAqIEBkZXNjcmlwdGlvblxyXG4gKlxyXG4gKiBJbnRlcmZhY2UgcXVlIGlyw6EgbWFwZWFyIGFzIGluZm9ybWHDp8O1ZXMgZG9zIHJlY3Vyc29zLCBwcmluY2lwYWxtZW50ZSBzdWEgb3JpZ2VtIGUgYXMgaW5mb3JtYcOnw7VlcyBxdWUgc2Vyw6NvIHJldG9ybmFkYXMuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFBvU3luY1NjaGVtYSB7XHJcbiAgLyoqIE5vbWUgZGEgcHJvcHJpZWRhZGUgcXVlIGluZm9ybWEgYSBkYXRhIGRlIGNyaWHDp8OjbyBkbyByZWdpc3Ryby4gKi9cclxuICByZWFkb25seSBjcmVhdGVkQXRGaWVsZD86IHN0cmluZztcclxuXHJcbiAgLyoqIE5vbWUgZGEgcHJvcHJpZWRhZGUgcXVlIGluZm9ybWEgYSBkYXRhIGRlIGRlbGXDp8Ojby4gKi9cclxuICByZWFkb25seSBkZWxldGVkQXRGaWVsZD86IHN0cmluZztcclxuXHJcbiAgLyoqIE5vbWUgZGEgcHJvcHJpZWRhZGUgcXVlIGluZm9ybWEgc2UgbyByZWdpc3RybyBmb2kgZXhjbHXDrWRvLiAqL1xyXG4gIHJlYWRvbmx5IGRlbGV0ZWRGaWVsZDogc3RyaW5nO1xyXG5cclxuICAvKiogRW5kZXJlw6dvIGRvIGVuZHBvaW50IHBhcmEgZXhjbHVpciByZWdpc3Ryb3MuICovXHJcbiAgcmVhZG9ubHkgZGVsZXRlVXJsQXBpPzogc3RyaW5nO1xyXG5cclxuICAvKiogRW5kZXJlw6dvIGRvIGVuZHBvaW50IHF1ZSBwcm92ZXLDoSBhcGVuYXMgZGFkb3MgYWx0ZXJhZG9zIG5vIHNlcnZpZG9yLiAqL1xyXG4gIHJlYWRvbmx5IGRpZmZVcmxBcGk6IHN0cmluZztcclxuXHJcbiAgLyoqIENhbXBvcyBxdWUgc2Vyw6NvIHJldG9ybmFkb3MgcGVsYSBBUEkuICovXHJcbiAgcmVhZG9ubHkgZmllbGRzOiBBcnJheTxzdHJpbmcgfCBQb1N5bmNGaWVsZE9wdGlvbnM+O1xyXG5cclxuICAvKiogRW5kZXJlw6dvIGRvIGVuZHBvaW50IHF1ZSB1dGlsaXphIG8gbcOpdG9kbyBHRVQgcXVlIHByb3ZlcsOhIG9zIGRhZG9zLiAqL1xyXG4gIHJlYWRvbmx5IGdldFVybEFwaTogc3RyaW5nO1xyXG5cclxuICAvKiogTm9tZSBkYSBwcm9wcmllZGFkZSByZWZlcmVudGUgYW8gaWRlbnRpZmljYWRvciDDum5pY28gcGFyYSBvcyBpdGVucyBkbyAqc2NoZW1hKi4gKi9cclxuICByZWFkb25seSBpZEZpZWxkOiBzdHJpbmc7XHJcblxyXG4gIC8qKiBJZGVudGlmacOnw6NvIHBhcmEgcmVwcmVzZW50YXIgbyAqc2NoZW1hKi4gKi9cclxuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XHJcblxyXG4gIC8qKiBRdWFudGlkYWRlIGRlIGl0ZW5zIHBvciBww6FnaW5hIHF1ZSBzZXLDoSBlbnZpYWRvIHBlbGEgQVBJLiAqL1xyXG4gIHJlYWRvbmx5IHBhZ2VTaXplOiBudW1iZXI7XHJcblxyXG4gIC8qKiBFbmRlcmXDp28gZG8gZW5kcG9pbnQgcXVlIHV0aWxpemEgbyBtw6l0b2RvIFBVVCBwYXJhIGF0dWFsaXphciByZWdpc3Ryb3MuICovXHJcbiAgcmVhZG9ubHkgcGF0Y2hVcmxBcGk/OiBzdHJpbmc7XHJcblxyXG4gIC8qKiBFbmRlcmXDp28gZG8gZW5kcG9pbnQgcXVlIHV0aWxpemEgbyBtw6l0b2RvIFBPU1QgcGFyYSBpbmNsdWlyIG9zIHJlZ2lzdHJvcy4gKi9cclxuICByZWFkb25seSBwb3N0VXJsQXBpPzogc3RyaW5nO1xyXG5cclxuICAvKiogTm9tZSBkYSBwcm9wcmllZGFkZSBxdWUgaW5mb3JtYSBhIGRhdGEgZGUgYXR1YWxpemHDp8OjbyBkbyByZWdpc3Ryby4gKi9cclxuICByZWFkb25seSB1cGRhdGVkQXRGaWVsZD86IHN0cmluZztcclxuXHJcbiAgLy8gRGF0YS9Ib3JhIGRhIMO6bHRpbWEgdmV6IHF1ZSBhIHNpbmNyb25pYSBhY29udGVjZXUgcGFyYSBlc3NlICpzY2hlbWEqLlxyXG4gIGxhc3RTeW5jPzogc3RyaW5nO1xyXG59XHJcbiJdfQ==
@@ -0,0 +1,336 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { forkJoin, Observable, of, Subject, timer } from 'rxjs';
3
+ import { expand, map, mergeMap, reduce } from 'rxjs/operators';
4
+ import { validateParameter, validateArray } from '../../utils/utils';
5
+ import { PoDataMessage, PoEntity } from '../../models';
6
+ import { PoRequestType } from '../../models/po-request-type.enum';
7
+ import { PoSchemaUtil } from './../po-schema/po-schema-util/po-schema-util.model';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "../po-event-sourcing/po-event-sourcing.service";
10
+ import * as i2 from "../po-http-client/po-http-client.service";
11
+ import * as i3 from "../po-network/po-network.service";
12
+ import * as i4 from "./../po-schema/po-schema-definition/po-schema-definition.service";
13
+ import * as i5 from "./../po-schema/po-schema.service";
14
+ /**
15
+ * @description
16
+ *
17
+ * O `PoSyncService` é utilizado para configurar toda a base de dados que receberá as informações que serão
18
+ * armazenadas *offline* vindas do servidor. Nele ocorre toda a preparação dos modelos de dados retornados por
19
+ * cada consulta.
20
+ */
21
+ export class PoSyncService {
22
+ poEventSourcingService;
23
+ poHttpClient;
24
+ poNetworkService;
25
+ poSchemaDefinitionService;
26
+ poSchemaService;
27
+ models = [];
28
+ config;
29
+ emitter;
30
+ eventSub;
31
+ finishSyncSubject = new Subject();
32
+ isSyncEnabled = true;
33
+ schemas;
34
+ subscription;
35
+ syncing = false;
36
+ timer;
37
+ constructor(poEventSourcingService, poHttpClient, poNetworkService, poSchemaDefinitionService, poSchemaService) {
38
+ this.poEventSourcingService = poEventSourcingService;
39
+ this.poHttpClient = poHttpClient;
40
+ this.poNetworkService = poNetworkService;
41
+ this.poSchemaDefinitionService = poSchemaDefinitionService;
42
+ this.poSchemaService = poSchemaService;
43
+ }
44
+ /**
45
+ * Destrói todas as chaves do *storage* referentes ao `po-sync`, ou seja,
46
+ * as definições dos *schemas*, os registros de cada *schema* e a fila
47
+ * de eventos que estão para ser enviados ao servidor *(EventSourcing)*.
48
+ *
49
+ * > Para que não venham ocorrer erros em ações que dependam das definições dos *schemas*,
50
+ * recomenda-se utilizar o método `prepare()` em seguida.
51
+ *
52
+ * > Veja mais detalhes em [Fundamentos do PO Sync - Alterando as definições dos schemas](/guides/sync-fundamentals).
53
+ *
54
+ * @returns {Promise<any>} Promessa que é resolvida quando as chaves referentes ao `po-sync` forem destruídas.
55
+ */
56
+ async destroy() {
57
+ const destroyFunction = async () => {
58
+ await this.poSchemaService.destroySchemasRecords();
59
+ await this.poSchemaDefinitionService.destroy();
60
+ await this.poEventSourcingService.destroyEventSourcingQueue();
61
+ };
62
+ return this.poSchemaService.limitedCallWrap(destroyFunction);
63
+ }
64
+ /**
65
+ * Desabilita todos os tipos de sincronização de dados (periódica, reativa e manual).
66
+ *
67
+ * > Para habilitar novamente a sincronização utilize o método [`PoSyncService.enableSync()`](documentation/po-sync#enable-sync).
68
+ */
69
+ disableSync() {
70
+ this.isSyncEnabled = false;
71
+ if (this.timer && this.subscription) {
72
+ this.subscription.unsubscribe();
73
+ }
74
+ }
75
+ /**
76
+ * <a id="enable-sync"></a>
77
+ * Habilita todos os tipos de sincronização de dados (periódica, reativa e manual).
78
+ *
79
+ * Por padrão, sempre que se inicializa uma aplicação com PO Sync as sincronizações já estão habilitadas.
80
+ */
81
+ enableSync() {
82
+ this.isSyncEnabled = true;
83
+ this.createSubscribe();
84
+ }
85
+ /**
86
+ * Método que disponibiliza a partir de sua inscrição o evento de retorno das operações da fila de eventos que
87
+ * foram enviadas ao servidor. A cada operação enviada para o servidor, será disparado um evento para a inscrição
88
+ * deste método.
89
+ *
90
+ * > Veja mais detalhes em [Fundamentos do PO Sync - Capturando respostas da sincronização](/guides/sync-fundamentals).
91
+ *
92
+ * @returns {Observable<PoSyncResponse>} Observable com um objeto do tipo `PoSyncResponse`.
93
+ */
94
+ getResponses() {
95
+ return this.poEventSourcingService.responsesSubject();
96
+ }
97
+ /**
98
+ * Retorna uma instância de `PoEntity` para um determinado *schema*.
99
+ *
100
+ * > Veja mais detalhes em [Fundamentos do PO Sync - Manipulando os registros de um schema](/guides/sync-fundamentals).
101
+ *
102
+ * @param {string} schemaName Nome do *schema*.
103
+ * @returns {PoEntity} Objeto para efetuar consultas e alterações nos dados.
104
+ */
105
+ getModel(schemaName) {
106
+ const model = this.models[schemaName];
107
+ if (!model) {
108
+ throw new Error('Model not found: ' + schemaName);
109
+ }
110
+ return model;
111
+ }
112
+ /**
113
+ * Insere uma requisição HTTP na fila de eventos do `po-sync`.
114
+ *
115
+ * > Veja mais detalhes em [Fundamentos do PO Sync - Inserindo requisições HTTP na fila de eventos](/guides/sync-fundamentals).
116
+ *
117
+ * @param {PoHttpRequestData} poHttpRequestData Dados da requisição HTTP.
118
+ * @param {string} customRequestId Identificador customizado da requisição HTTP.
119
+ * @returns {Promise<number>} Promessa com o identificador da requisição HTTP criada.
120
+ */
121
+ insertHttpCommand(requestData, customRequestId) {
122
+ validateParameter({ requestData });
123
+ return this.poEventSourcingService.httpCommand(requestData, customRequestId);
124
+ }
125
+ /**
126
+ * Efetua uma chamada na API do servidor para realizar a carga inicial dos dados. Deve ser chamado apenas uma vez
127
+ * na aplicação, após a preparação dos *schemas* realizada através do método `PoSyncService.prepare()`.
128
+ *
129
+ * > Veja mais detalhes em [Fundamentos do PO Sync - Carga inicial dos dados](/guides/sync-fundamentals).
130
+ *
131
+ * @returns {Observable<Array<{ entity: string, data: Array<any> }>>} Observable que notificará quando a
132
+ * carga inicial for concluída.
133
+ */
134
+ loadData() {
135
+ const loads = [];
136
+ this.schemas.forEach(el => loads.push(this.loadEntityData(el)));
137
+ return forkJoin(loads);
138
+ }
139
+ /**
140
+ * Responsável por notificar sempre que houver sincronismo.
141
+ *
142
+ * > Veja mais detalhes em [Fundamentos do PO Sync - Notificação pós-sincronização](/guides/sync-fundamentals).
143
+ *
144
+ * @returns {Observable<any>} Observable que é disparado a cada sincronismo realizado.
145
+ */
146
+ onSync() {
147
+ if (!this.eventSub) {
148
+ this.eventSub = Observable.create(e => {
149
+ this.emitter = e;
150
+ });
151
+ }
152
+ return this.eventSub;
153
+ }
154
+ /**
155
+ * Prepara a aplicação criando os schemas e aplica as configurações.
156
+ *
157
+ * > Veja mais detalhes em [Fundamentos do PO Sync - Preparando a aplicação](/guides/sync-fundamentals).
158
+ *
159
+ * @param {Array<PoSyncSchema>} schemas Lista de *schemas* a serem preparados.
160
+ * @param {PoSyncConfig} config Configurações adicionais.
161
+ * @returns {Promise<any>} Promessa que é resolvida quando a aplicação estiver preparada para a utilização do `po-sync`.
162
+ */
163
+ prepare(schemas, config) {
164
+ validateArray({ schemas });
165
+ const defaultSyncConfig = {
166
+ type: this.poNetworkService.getConnectionStatus().type,
167
+ period: 60,
168
+ dataTransform: new PoDataMessage()
169
+ };
170
+ this.schemas = schemas;
171
+ this.config = config || defaultSyncConfig;
172
+ this.config.dataTransform = this.config.dataTransform || new PoDataMessage();
173
+ this.poEventSourcingService.config = this.config;
174
+ this.startTimer(this.config.period);
175
+ this.reactiveSync();
176
+ this.poEventSourcingService.onSaveData().subscribe(() => this.sync());
177
+ return this.saveSchemas().then(() => {
178
+ this.schemas.forEach(schema => {
179
+ this.models[schema.name] = new PoEntity(this.poEventSourcingService, schema, this.poSchemaService);
180
+ });
181
+ return Promise.resolve();
182
+ });
183
+ }
184
+ /**
185
+ * Remove um item da fila de eventos que espera a sincronização.
186
+ *
187
+ * > Veja mais detalhes em [Fundamentos do PO Sync - Capturando respostas da sincronização](/guides/sync-fundamentals).
188
+ *
189
+ * @param {any} idEventSourcing Identificador do item da fila de eventos.
190
+ * @returns {Promise<any>} Promessa que é resolvida quando o item da fila de eventos é removido.
191
+ */
192
+ removeItemOfSync(idEventSourcing) {
193
+ return this.poEventSourcingService.removeEventSourcingItem(idEventSourcing);
194
+ }
195
+ /**
196
+ * Reenvia os comandos pendentes na fila (inclusão, alteração e exclusão) e busca novos dados do servidor.
197
+ *
198
+ * > Veja mais detalhes em [Fundamentos do PO Sync - Capturando respostas da sincronização](/guides/sync-fundamentals).
199
+ *
200
+ * @returns {Promise<any>} Promessa que resolve o sincronismo disparado.
201
+ */
202
+ resumeSync() {
203
+ if (!this.canSync()) {
204
+ const finishSyncSubscription = this.finishSyncSubject.asObservable().subscribe(() => {
205
+ finishSyncSubscription.unsubscribe();
206
+ return this.sync();
207
+ });
208
+ return Promise.resolve();
209
+ }
210
+ return this.sync();
211
+ }
212
+ /**
213
+ * Dispara o sincronismo enviando os eventos pendentes (inclusão, alteração e exclusão) e buscando novos dados do servidor.
214
+ *
215
+ * O sincronismo somente será executado depois que o acesso a base de dados local do dispositivo for liberada.
216
+ *
217
+ * > Veja mais detalhes em [Fundamentos do PO Sync - Sincronização manual](/guides/sync-fundamentals).
218
+ *
219
+ * @returns {Promise<any>} Promessa que é resolvida quando o sincronismo for finalizado.
220
+ */
221
+ async sync() {
222
+ if (this.canSync()) {
223
+ this.startSync();
224
+ try {
225
+ await this.poEventSourcingService.syncSend();
226
+ await this.poEventSourcingService.syncGet();
227
+ if (this.emitter) {
228
+ this.emitter.next();
229
+ }
230
+ this.finishSync();
231
+ }
232
+ catch (error) {
233
+ this.syncError();
234
+ }
235
+ }
236
+ }
237
+ canSync() {
238
+ if (this.syncing || !this.isSyncEnabled) {
239
+ return false;
240
+ }
241
+ else {
242
+ const currentConnection = this.poNetworkService.getConnectionStatus();
243
+ const isConfiguredConnection = this.config && currentConnection.type === this.config.type;
244
+ const isConfigIncludesType = this.config && this.config.type instanceof Array && this.config.type.includes(currentConnection.type);
245
+ return currentConnection.status && (!this.config || isConfiguredConnection || isConfigIncludesType);
246
+ }
247
+ }
248
+ createSubscribe() {
249
+ if (this.timer) {
250
+ this.subscription = this.timer.subscribe(() => {
251
+ this.sync().then(() => {
252
+ this.subscription.unsubscribe();
253
+ this.subscription = null;
254
+ this.timer = null;
255
+ this.startTimer(this.config.period);
256
+ });
257
+ });
258
+ }
259
+ }
260
+ finishSync() {
261
+ this.syncing = false;
262
+ this.finishSyncSubject.next(null);
263
+ }
264
+ getOnePage(schema, page = 1) {
265
+ const params = [];
266
+ params.push(`${this.config.dataTransform.getPageSizeParamName()}=${schema.pageSize}`);
267
+ params.push(`${this.config.dataTransform.getPageParamName()}=${page}`);
268
+ const url = `${PoSchemaUtil.getUrl(schema, PoRequestType.GET)}?${params.join('&')}`;
269
+ return this.poHttpClient.get(url).pipe(map(response => response.body), mergeMap(responseBody => {
270
+ const now = new Date().getTime();
271
+ responseBody[this.config.dataTransform.getItemsFieldName()].map(item => {
272
+ item.SyncInsertedDateTime = now;
273
+ item.SyncUpdatedDateTime = null;
274
+ item.SyncExclusionDateTime = null;
275
+ item.SyncDeleted = false;
276
+ item.SyncStatus = 2;
277
+ });
278
+ return this.poSchemaService
279
+ .updateAll(schema, responseBody[this.config.dataTransform.getItemsFieldName()])
280
+ .then(() => responseBody);
281
+ }));
282
+ }
283
+ loadEntityData(schema) {
284
+ let page = 1;
285
+ return this.getOnePage(schema, page).pipe(expand(data => {
286
+ this.config.dataTransform.transform(data);
287
+ const hasNext = this.config.dataTransform.hasNext();
288
+ if (hasNext) {
289
+ return this.getOnePage(schema, ++page);
290
+ }
291
+ else {
292
+ return of();
293
+ }
294
+ }), reduce((acc, obj) => {
295
+ acc.data = acc.data.concat(obj[this.config.dataTransform.getItemsFieldName()]);
296
+ return acc;
297
+ }, {
298
+ entity: schema.name,
299
+ data: []
300
+ }));
301
+ }
302
+ reactiveSync() {
303
+ this.poNetworkService.onChange().subscribe(networkStatus => {
304
+ if (networkStatus.status) {
305
+ this.startTimer(this.config.period);
306
+ return this.sync();
307
+ }
308
+ if (this.subscription) {
309
+ this.subscription.unsubscribe();
310
+ }
311
+ });
312
+ }
313
+ async saveSchemas() {
314
+ const storageSchemas = await this.poSchemaDefinitionService.getAll();
315
+ this.schemas.forEach(schema => (schema.lastSync = PoSchemaUtil.getLastSync(storageSchemas, schema.name)));
316
+ return this.poSchemaDefinitionService.saveAll(this.schemas);
317
+ }
318
+ startSync() {
319
+ this.syncing = true;
320
+ }
321
+ startTimer(period) {
322
+ if (period && this.isSyncEnabled) {
323
+ this.timer = timer(period * 1000);
324
+ this.createSubscribe();
325
+ }
326
+ }
327
+ syncError() {
328
+ this.finishSync();
329
+ }
330
+ static ɵfac = function PoSyncService_Factory(t) { return new (t || PoSyncService)(i0.ɵɵinject(i1.PoEventSourcingService), i0.ɵɵinject(i2.PoHttpClientService), i0.ɵɵinject(i3.PoNetworkService), i0.ɵɵinject(i4.PoSchemaDefinitionService), i0.ɵɵinject(i5.PoSchemaService)); };
331
+ static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: PoSyncService, factory: PoSyncService.ɵfac });
332
+ }
333
+ (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PoSyncService, [{
334
+ type: Injectable
335
+ }], function () { return [{ type: i1.PoEventSourcingService }, { type: i2.PoHttpClientService }, { type: i3.PoNetworkService }, { type: i4.PoSchemaDefinitionService }, { type: i5.PoSchemaService }]; }, null); })();
336
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tc3luYy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3luYy9zcmMvbGliL3NlcnZpY2VzL3BvLXN5bmMvcG8tc3luYy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBZ0IsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzlFLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFckUsT0FBTyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFLdkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBR2xFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvREFBb0QsQ0FBQzs7Ozs7OztBQUtsRjs7Ozs7O0dBTUc7QUFFSCxNQUFNLE9BQU8sYUFBYTtJQWNkO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFqQlYsTUFBTSxHQUFvQixFQUFFLENBQUM7SUFFckIsTUFBTSxDQUFlO0lBQ3JCLE9BQU8sQ0FBTTtJQUNiLFFBQVEsQ0FBa0I7SUFDMUIsaUJBQWlCLEdBQWtCLElBQUksT0FBTyxFQUFRLENBQUM7SUFDdkQsYUFBYSxHQUFZLElBQUksQ0FBQztJQUM5QixPQUFPLENBQXNCO0lBQzdCLFlBQVksQ0FBZTtJQUMzQixPQUFPLEdBQVksS0FBSyxDQUFDO0lBQ3pCLEtBQUssQ0FBcUI7SUFFbEMsWUFDVSxzQkFBOEMsRUFDOUMsWUFBaUMsRUFDakMsZ0JBQWtDLEVBQ2xDLHlCQUFvRCxFQUNw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YSxXQUFiLGFBQWE7O3VGQUFiLGFBQWE7Y0FEekIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCB7IGZvcmtKb2luLCBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCB0aW1lciB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBleHBhbmQsIG1hcCwgbWVyZ2VNYXAsIHJlZHVjZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgdmFsaWRhdGVQYXJhbWV0ZXIsIHZhbGlkYXRlQXJyYXkgfSBmcm9tICcuLi8uLi91dGlscy91dGlscyc7XHJcblxyXG5pbXBvcnQgeyBQb0RhdGFNZXNzYWdlLCBQb0VudGl0eSB9IGZyb20gJy4uLy4uL21vZGVscyc7XHJcbmltcG9ydCB7IFBvRXZlbnRTb3VyY2luZ1NlcnZpY2UgfSBmcm9tICcuLi9wby1ldmVudC1zb3VyY2luZy9wby1ldmVudC1zb3VyY2luZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUG9IdHRwQ2xpZW50U2VydmljZSB9IGZyb20gJy4uL3BvLWh0dHAtY2xpZW50L3BvLWh0dHAtY2xpZW50LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQb0h0dHBSZXF1ZXN0RGF0YSB9IGZyb20gJy4uL3BvLWh0dHAtY2xpZW50L2ludGVyZmFjZXMvcG8taHR0cC1yZXF1ZXN0LWRhdGEuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgUG9OZXR3b3JrU2VydmljZSB9IGZyb20gJy4uL3BvLW5ldHdvcmsvcG8tbmV0d29yay5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUG9SZXF1ZXN0VHlwZSB9IGZyb20gJy4uLy4uL21vZGVscy9wby1yZXF1ZXN0LXR5cGUuZW51bSc7XHJcbmltcG9ydCB7IFBvU2NoZW1hRGVmaW5pdGlvblNlcnZpY2UgfSBmcm9tICcuLy4uL3BvLXNjaGVtYS9wby1zY2hlbWEtZGVmaW5pdGlvbi9wby1zY2hlbWEtZGVmaW5pdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUG9TY2hlbWFTZXJ2aWNlIH0gZnJvbSAnLi8uLi9wby1zY2hlbWEvcG8tc2NoZW1hLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQb1NjaGVtYVV0aWwgfSBmcm9tICcuLy4uL3BvLXNjaGVtYS9wby1zY2hlbWEtdXRpbC9wby1zY2hlbWEtdXRpbC5tb2RlbCc7XHJcbmltcG9ydCB7IFBvU3luY0NvbmZpZyB9IGZyb20gJy4vaW50ZXJmYWNlcy9wby1zeW5jLWNvbmZpZy5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBQb1N5bmNSZXNwb25zZSB9IGZyb20gJy4uL3BvLXN5bmMvaW50ZXJmYWNlcy9wby1zeW5jLXJlc3BvbnNlLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IFBvU3luY1NjaGVtYSB9IGZyb20gJy4vaW50ZXJmYWNlcy9wby1zeW5jLXNjaGVtYS5pbnRlcmZhY2UnO1xyXG5cclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvblxyXG4gKlxyXG4gKiBPIGBQb1N5bmNTZXJ2aWNlYCDDqSB1dGlsaXphZG8gcGFyYSBjb25maWd1cmFyIHRvZGEgYSBiYXNlIGRlIGRhZG9zIHF1ZSByZWNlYmVyw6EgYXMgaW5mb3JtYcOnw7VlcyBxdWUgc2Vyw6NvXHJcbiAqIGFybWF6ZW5hZGFzICpvZmZsaW5lKiB2aW5kYXMgZG8gc2Vydmlkb3IuIE5lbGUgb2NvcnJlIHRvZGEgYSBwcmVwYXJhw6fDo28gZG9zIG1vZGVsb3MgZGUgZGFkb3MgcmV0b3JuYWRvcyBwb3JcclxuICogY2FkYSBjb25zdWx0YS5cclxuICovXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFBvU3luY1NlcnZpY2Uge1xyXG4gIG1vZGVsczogQXJyYXk8UG9FbnRpdHk+ID0gW107XHJcblxyXG4gIHByaXZhdGUgY29uZmlnOiBQb1N5bmNDb25maWc7XHJcbiAgcHJpdmF0ZSBlbWl0dGVyOiBhbnk7XHJcbiAgcHJpdmF0ZSBldmVudFN1YjogT2JzZXJ2YWJsZTxhbnk+O1xyXG4gIHByaXZhdGUgZmluaXNoU3luY1N1YmplY3Q6IFN1YmplY3Q8bnVsbD4gPSBuZXcgU3ViamVjdDxudWxsPigpO1xyXG4gIHByaXZhdGUgaXNTeW5jRW5hYmxlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHJpdmF0ZSBzY2hlbWFzOiBBcnJheTxQb1N5bmNTY2hlbWE+O1xyXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcbiAgcHJpdmF0ZSBzeW5jaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSB0aW1lcjogT2JzZXJ2YWJsZTxudW1iZXI+O1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcG9FdmVudFNvdXJjaW5nU2VydmljZTogUG9FdmVudFNvdXJjaW5nU2VydmljZSxcclxuICAgIHByaXZhdGUgcG9IdHRwQ2xpZW50OiBQb0h0dHBDbGllbnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBwb05ldHdvcmtTZXJ2aWNlOiBQb05ldHdvcmtTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBwb1NjaGVtYURlZmluaXRpb25TZXJ2aWNlOiBQb1NjaGVtYURlZmluaXRpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBwb1NjaGVtYVNlcnZpY2U6IFBvU2NoZW1hU2VydmljZVxyXG4gICkge31cclxuXHJcbiAgLyoqXHJcbiAgICogRGVzdHLDs2kgdG9kYXMgYXMgY2hhdmVzIGRvICpzdG9yYWdlKiByZWZlcmVudGVzIGFvIGBwby1zeW5jYCwgb3Ugc2VqYSxcclxuICAgKiBhcyBkZWZpbmnDp8O1ZXMgZG9zICpzY2hlbWFzKiwgb3MgcmVnaXN0cm9zIGRlIGNhZGEgKnNjaGVtYSogZSBhIGZpbGFcclxuICAgKiBkZSBldmVudG9zIHF1ZSBlc3TDo28gcGFyYSBzZXIgZW52aWFkb3MgYW8gc2Vydmlkb3IgKihFdmVudFNvdXJjaW5nKSouXHJcbiAgICpcclxuICAgKiA+IFBhcmEgcXVlIG7Do28gdmVuaGFtIG9jb3JyZXIgZXJyb3MgZW0gYcOnw7VlcyBxdWUgZGVwZW5kYW0gZGFzIGRlZmluacOnw7VlcyBkb3MgKnNjaGVtYXMqLFxyXG4gICAqIHJlY29tZW5kYS1zZSB1dGlsaXphciBvIG3DqXRvZG8gYHByZXBhcmUoKWAgZW0gc2VndWlkYS5cclxuICAgKlxyXG4gICAqID4gVmVqYSBtYWlzIGRldGFsaGVzIGVtIFtGdW5kYW1lbnRvcyBkbyBQTyBTeW5jIC0gQWx0ZXJhbmRvIGFzIGRlZmluacOnw7VlcyBkb3Mgc2NoZW1hc10oL2d1aWRlcy9zeW5jLWZ1bmRhbWVudGFscykuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBQcm9tZXNzYSBxdWUgw6kgcmVzb2x2aWRhIHF1YW5kbyBhcyBjaGF2ZXMgcmVmZXJlbnRlcyBhbyBgcG8tc3luY2AgZm9yZW0gZGVzdHJ1w61kYXMuXHJcbiAgICovXHJcbiAgYXN5bmMgZGVzdHJveSgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgY29uc3QgZGVzdHJveUZ1bmN0aW9uID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgICBhd2FpdCB0aGlzLnBvU2NoZW1hU2VydmljZS5kZXN0cm95U2NoZW1hc1JlY29yZHMoKTtcclxuICAgICAgYXdhaXQgdGhpcy5wb1NjaGVtYURlZmluaXRpb25TZXJ2aWNlLmRlc3Ryb3koKTtcclxuICAgICAgYXdhaXQgdGhpcy5wb0V2ZW50U291cmNpbmdTZXJ2aWNlLmRlc3Ryb3lFdmVudFNvdXJjaW5nUXVldWUoKTtcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHRoaXMucG9TY2hlbWFTZXJ2aWNlLmxpbWl0ZWRDYWxsV3JhcChkZXN0cm95RnVuY3Rpb24pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVzYWJpbGl0YSB0b2RvcyBvcyB0aXBvcyBkZSBzaW5jcm9uaXphw6fDo28gZGUgZGFkb3MgKHBlcmnDs2RpY2EsIHJlYXRpdmEgZSBtYW51YWwpLlxyXG4gICAqXHJcbiAgICogPiBQYXJhIGhhYmlsaXRhciBub3ZhbWVudGUgYSBzaW5jcm9uaXphw6fDo28gdXRpbGl6ZSBvIG3DqXRvZG8gW2BQb1N5bmNTZXJ2aWNlLmVuYWJsZVN5bmMoKWBdKGRvY3VtZW50YXRpb24vcG8tc3luYyNlbmFibGUtc3luYykuXHJcbiAgICovXHJcbiAgZGlzYWJsZVN5bmMoKSB7XHJcbiAgICB0aGlzLmlzU3luY0VuYWJsZWQgPSBmYWxzZTtcclxuXHJcbiAgICBpZiAodGhpcy50aW1lciAmJiB0aGlzLnN1YnNjcmlwdGlvbikge1xyXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogPGEgaWQ9XCJlbmFibGUtc3luY1wiPjwvYT5cclxuICAgKiBIYWJpbGl0YSB0b2RvcyBvcyB0aXBvcyBkZSBzaW5jcm9uaXphw6fDo28gZGUgZGFkb3MgKHBlcmnDs2RpY2EsIHJlYXRpdmEgZSBtYW51YWwpLlxyXG4gICAqXHJcbiAgICogUG9yIHBhZHLDo28sIHNlbXByZSBxdWUgc2UgaW5pY2lhbGl6YSB1bWEgYXBsaWNhw6fDo28gY29tIFBPIFN5bmMgYXMgc2luY3Jvbml6YcOnw7VlcyBqw6EgZXN0w6NvIGhhYmlsaXRhZGFzLlxyXG4gICAqL1xyXG4gIGVuYWJsZVN5bmMoKSB7XHJcbiAgICB0aGlzLmlzU3luY0VuYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5jcmVhdGVTdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE3DqXRvZG8gcXVlIGRpc3BvbmliaWxpemEgYSBwYXJ0aXIgZGUgc3VhIGluc2NyacOnw6NvIG8gZXZlbnRvIGRlIHJldG9ybm8gZGFzIG9wZXJhw6fDtWVzIGRhIGZpbGEgZGUgZXZlbnRvcyBxdWVcclxuICAgKiBmb3JhbSBlbnZpYWRhcyBhbyBzZXJ2aWRvci4gQSBjYWRhIG9wZXJhw6fDo28gZW52aWFkYSBwYXJhIG8gc2Vydmlkb3IsIHNlcsOhIGRpc3BhcmFkbyB1bSBldmVudG8gcGFyYSBhIGluc2NyacOnw6NvXHJcbiAgICogZGVzdGUgbcOpdG9kby5cclxuICAgKlxyXG4gICAqID4gVmVqYSBtYWlzIGRldGFsaGVzIGVtIFtGdW5kYW1lbnRvcyBkbyBQTyBTeW5jIC0gQ2FwdHVyYW5kbyByZXNwb3N0YXMgZGEgc2luY3Jvbml6YcOnw6NvXSgvZ3VpZGVzL3N5bmMtZnVuZGFtZW50YWxzKS5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPFBvU3luY1Jlc3BvbnNlPn0gT2JzZXJ2YWJsZSBjb20gdW0gb2JqZXRvIGRvIHRpcG8gYFBvU3luY1Jlc3BvbnNlYC5cclxuICAgKi9cclxuICBnZXRSZXNwb25zZXMoKTogT2JzZXJ2YWJsZTxQb1N5bmNSZXNwb25zZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMucG9FdmVudFNvdXJjaW5nU2VydmljZS5yZXNwb25zZXNTdWJqZWN0KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXRvcm5hIHVtYSBpbnN0w6JuY2lhIGRlIGBQb0VudGl0eWAgcGFyYSB1bSBkZXRlcm1pbmFkbyAqc2NoZW1hKi5cclxuICAgKlxyXG4gICAqID4gVmVqYSBtYWlzIGRldGFsaGVzIGVtIFtGdW5kYW1lbnRvcyBkbyBQTyBTeW5jIC0gTWFuaXB1bGFuZG8gb3MgcmVnaXN0cm9zIGRlIHVtIHNjaGVtYV0oL2d1aWRlcy9zeW5jLWZ1bmRhbWVudGFscykuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2NoZW1hTmFtZSBOb21lIGRvICpzY2hlbWEqLlxyXG4gICAqIEByZXR1cm5zIHtQb0VudGl0eX0gT2JqZXRvIHBhcmEgZWZldHVhciBjb25zdWx0YXMgZSBhbHRlcmHDp8O1ZXMgbm9zIGRhZG9zLlxyXG4gICAqL1xyXG4gIGdldE1vZGVsKHNjaGVtYU5hbWU6IHN0cmluZyk6IFBvRW50aXR5IHtcclxuICAgIGNvbnN0IG1vZGVsID0gdGhpcy5tb2RlbHNbc2NoZW1hTmFtZV07XHJcbiAgICBpZiAoIW1vZGVsKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignTW9kZWwgbm90IGZvdW5kOiAnICsgc2NoZW1hTmFtZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbW9kZWw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbnNlcmUgdW1hIHJlcXVpc2nDp8OjbyBIVFRQIG5hIGZpbGEgZGUgZXZlbnRvcyBkbyBgcG8tc3luY2AuXHJcbiAgICpcclxuICAgKiA+IFZlamEgbWFpcyBkZXRhbGhlcyBlbSBbRnVuZGFtZW50b3MgZG8gUE8gU3luYyAtIEluc2VyaW5kbyByZXF1aXNpw6fDtWVzIEhUVFAgbmEgZmlsYSBkZSBldmVudG9zXSgvZ3VpZGVzL3N5bmMtZnVuZGFtZW50YWxzKS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7UG9IdHRwUmVxdWVzdERhdGF9IHBvSHR0cFJlcXVlc3REYXRhIERhZG9zIGRhIHJlcXVpc2nDp8OjbyBIVFRQLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjdXN0b21SZXF1ZXN0SWQgSWRlbnRpZmljYWRvciBjdXN0b21pemFkbyBkYSByZXF1aXNpw6fDo28gSFRUUC5cclxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSBQcm9tZXNzYSBjb20gbyBpZGVudGlmaWNhZG9yIGRhIHJlcXVpc2nDp8OjbyBIVFRQIGNyaWFkYS5cclxuICAgKi9cclxuICBpbnNlcnRIdHRwQ29tbWFuZChyZXF1ZXN0RGF0YTogUG9IdHRwUmVxdWVzdERhdGEsIGN1c3RvbVJlcXVlc3RJZD86IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XHJcbiAgICB2YWxpZGF0ZVBhcmFtZXRlcih7IHJlcXVlc3REYXRhIH0pO1xyXG5cclxuICAgIHJldHVybiB0aGlzLnBvRXZlbnRTb3VyY2luZ1NlcnZpY2UuaHR0cENvbW1hbmQocmVxdWVzdERhdGEsIGN1c3RvbVJlcXVlc3RJZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFZmV0dWEgdW1hIGNoYW1hZGEgbmEgQVBJIGRvIHNlcnZpZG9yIHBhcmEgcmVhbGl6YXIgYSBjYXJnYSBpbmljaWFsIGRvcyBkYWRvcy4gRGV2ZSBzZXIgY2hhbWFkbyBhcGVuYXMgdW1hIHZlelxyXG4gICAqIG5hIGFwbGljYcOnw6NvLCBhcMOzcyBhIHByZXBhcmHDp8OjbyBkb3MgKnNjaGVtYXMqIHJlYWxpemFkYSBhdHJhdsOpcyBkbyBtw6l0b2RvIGBQb1N5bmNTZXJ2aWNlLnByZXBhcmUoKWAuXHJcbiAgICpcclxuICAgKiA+IFZlamEgbWFpcyBkZXRhbGhlcyBlbSBbRnVuZGFtZW50b3MgZG8gUE8gU3luYyAtIENhcmdhIGluaWNpYWwgZG9zIGRhZG9zXSgvZ3VpZGVzL3N5bmMtZnVuZGFtZW50YWxzKS5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPEFycmF5PHsgZW50aXR5OiBzdHJpbmcsIGRhdGE6IEFycmF5PGFueT4gfT4+fSBPYnNlcnZhYmxlIHF1ZSBub3RpZmljYXLDoSBxdWFuZG8gYVxyXG4gICAqIGNhcmdhIGluaWNpYWwgZm9yIGNvbmNsdcOtZGEuXHJcbiAgICovXHJcbiAgbG9hZERhdGEoKTogT2JzZXJ2YWJsZTxBcnJheTx7IGVudGl0eTogc3RyaW5nOyBkYXRhOiBBcnJheTxhbnk+IH0+PiB7XHJcbiAgICBjb25zdCBsb2FkczogQXJyYXk8T2JzZXJ2YWJsZTx7IGVudGl0eTogc3RyaW5nOyBkYXRhOiBBcnJheTxhbnk+IH0+PiA9IFtdO1xyXG4gICAgdGhpcy5zY2hlbWFzLmZvckVhY2goZWwgPT4gbG9hZHMucHVzaCh0aGlzLmxvYWRFbnRpdHlEYXRhKGVsKSkpO1xyXG4gICAgcmV0dXJuIGZvcmtKb2luKGxvYWRzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc3BvbnPDoXZlbCBwb3Igbm90aWZpY2FyIHNlbXByZSBxdWUgaG91dmVyIHNpbmNyb25pc21vLlxyXG4gICAqXHJcbiAgICogPiBWZWphIG1haXMgZGV0YWxoZXMgZW0gW0Z1bmRhbWVudG9zIGRvIFBPIFN5bmMgLSBOb3RpZmljYcOnw6NvIHDDs3Mtc2luY3Jvbml6YcOnw6NvXSgvZ3VpZGVzL3N5bmMtZnVuZGFtZW50YWxzKS5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPGFueT59IE9ic2VydmFibGUgcXVlIMOpIGRpc3BhcmFkbyBhIGNhZGEgc2luY3JvbmlzbW8gcmVhbGl6YWRvLlxyXG4gICAqL1xyXG4gIG9uU3luYygpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKCF0aGlzLmV2ZW50U3ViKSB7XHJcbiAgICAgIHRoaXMuZXZlbnRTdWIgPSBPYnNlcnZhYmxlLmNyZWF0ZShlID0+IHtcclxuICAgICAgICB0aGlzLmVtaXR0ZXIgPSBlO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmV2ZW50U3ViO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUHJlcGFyYSBhIGFwbGljYcOnw6NvIGNyaWFuZG8gb3Mgc2NoZW1hcyBlIGFwbGljYSBhcyBjb25maWd1cmHDp8O1ZXMuXHJcbiAgICpcclxuICAgKiA+IFZlamEgbWFpcyBkZXRhbGhlcyBlbSBbRnVuZGFtZW50b3MgZG8gUE8gU3luYyAtIFByZXBhcmFuZG8gYSBhcGxpY2HDp8Ojb10oL2d1aWRlcy9zeW5jLWZ1bmRhbWVudGFscykuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0FycmF5PFBvU3luY1NjaGVtYT59IHNjaGVtYXMgTGlzdGEgZGUgKnNjaGVtYXMqIGEgc2VyZW0gcHJlcGFyYWRvcy5cclxuICAgKiBAcGFyYW0ge1BvU3luY0NvbmZpZ30gY29uZmlnIENvbmZpZ3VyYcOnw7VlcyBhZGljaW9uYWlzLlxyXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IFByb21lc3NhIHF1ZSDDqSByZXNvbHZpZGEgcXVhbmRvIGEgYXBsaWNhw6fDo28gZXN0aXZlciBwcmVwYXJhZGEgcGFyYSBhIHV0aWxpemHDp8OjbyBkbyBgcG8tc3luY2AuXHJcbiAgICovXHJcbiAgcHJlcGFyZShzY2hlbWFzOiBBcnJheTxQb1N5bmNTY2hlbWE+LCBjb25maWc/OiBQb1N5bmNDb25maWcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdmFsaWRhdGVBcnJheSh7IHNjaGVtYXMgfSk7XHJcblxyXG4gICAgY29uc3QgZGVmYXVsdFN5bmNDb25maWc6IFBvU3luY0NvbmZpZyA9IHtcclxuICAgICAgdHlwZTogdGhpcy5wb05ldHdvcmtTZXJ2aWNlLmdldENvbm5lY3Rpb25TdGF0dXMoKS50eXBlLFxyXG4gICAgICBwZXJpb2Q6IDYwLFxyXG4gICAgICBkYXRhVHJhbnNmb3JtOiBuZXcgUG9EYXRhTWVzc2FnZSgpXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuc2NoZW1hcyA9IHNjaGVtYXM7XHJcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZyB8fCBkZWZhdWx0U3luY0NvbmZpZztcclxuICAgIHRoaXMuY29uZmlnLmRhdGFUcmFuc2Zvcm0gPSB0aGlzLmNvbmZpZy5kYXRhVHJhbnNmb3JtIHx8IG5ldyBQb0RhdGFNZXNzYWdlKCk7XHJcbiAgICB0aGlzLnBvRXZlbnRTb3VyY2luZ1NlcnZpY2UuY29uZmlnID0gdGhpcy5jb25maWc7XHJcbiAgICB0aGlzLnN0YXJ0VGltZXIodGhpcy5jb25maWcucGVyaW9kKTtcclxuICAgIHRoaXMucmVhY3RpdmVTeW5jKCk7XHJcbiAgICB0aGlzLnBvRXZlbnRTb3VyY2luZ1NlcnZpY2Uub25TYXZlRGF0YSgpLnN1YnNjcmliZSgoKSA9PiB0aGlzLnN5bmMoKSk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuc2F2ZVNjaGVtYXMoKS50aGVuKCgpID0+IHtcclxuICAgICAgdGhpcy5zY2hlbWFzLmZvckVhY2goc2NoZW1hID0+IHtcclxuICAgICAgICB0aGlzLm1vZGVsc1tzY2hlbWEubmFtZV0gPSBuZXcgUG9FbnRpdHkodGhpcy5wb0V2ZW50U291cmNpbmdTZXJ2aWNlLCBzY2hlbWEsIHRoaXMucG9TY2hlbWFTZXJ2aWNlKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlIHVtIGl0ZW0gZGEgZmlsYSBkZSBldmVudG9zIHF1ZSBlc3BlcmEgYSBzaW5jcm9uaXphw6fDo28uXHJcbiAgICpcclxuICAgKiA+IFZlamEgbWFpcyBkZXRhbGhlcyBlbSBbRnVuZGFtZW50b3MgZG8gUE8gU3luYyAtIENhcHR1cmFuZG8gcmVzcG9zdGFzIGRhIHNpbmNyb25pemHDp8Ojb10oL2d1aWRlcy9zeW5jLWZ1bmRhbWVudGFscykuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge2FueX0gaWRFdmVudFNvdXJjaW5nIElkZW50aWZpY2Fkb3IgZG8gaXRlbSBkYSBmaWxhIGRlIGV2ZW50b3MuXHJcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gUHJvbWVzc2EgcXVlIMOpIHJlc29sdmlkYSBxdWFuZG8gbyBpdGVtIGRhIGZpbGEgZGUgZXZlbnRvcyDDqSByZW1vdmlkby5cclxuICAgKi9cclxuICByZW1vdmVJdGVtT2ZTeW5jKGlkRXZlbnRTb3VyY2luZzogYW55KTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLnBvRXZlbnRTb3VyY2luZ1NlcnZpY2UucmVtb3ZlRXZlbnRTb3VyY2luZ0l0ZW0oaWRFdmVudFNvdXJjaW5nKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlZW52aWEgb3MgY29tYW5kb3MgcGVuZGVudGVzIG5hIGZpbGEgKGluY2x1c8OjbywgYWx0ZXJhw6fDo28gZSBleGNsdXPDo28pIGUgYnVzY2Egbm92b3MgZGFkb3MgZG8gc2Vydmlkb3IuXHJcbiAgICpcclxuICAgKiA+IFZlamEgbWFpcyBkZXRhbGhlcyBlbSBbRnVuZGFtZW50b3MgZG8gUE8gU3luYyAtIENhcHR1cmFuZG8gcmVzcG9zdGFzIGRhIHNpbmNyb25pemHDp8Ojb10oL2d1aWRlcy9zeW5jLWZ1bmRhbWVudGFscykuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBQcm9tZXNzYSBxdWUgcmVzb2x2ZSBvIHNpbmNyb25pc21vIGRpc3BhcmFkby5cclxuICAgKi9cclxuICByZXN1bWVTeW5jKCk6IFByb21pc2U8YW55PiB7XHJcbiAgICBpZiAoIXRoaXMuY2FuU3luYygpKSB7XHJcbiAgICAgIGNvbnN0IGZpbmlzaFN5bmNTdWJzY3JpcHRpb24gPSB0aGlzLmZpbmlzaFN5bmNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgZmluaXNoU3luY1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnN5bmMoKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5zeW5jKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEaXNwYXJhIG8gc2luY3JvbmlzbW8gZW52aWFuZG8gb3MgZXZlbnRvcyBwZW5kZW50ZXMgKGluY2x1c8OjbywgYWx0ZXJhw6fDo28gZSBleGNsdXPDo28pIGUgYnVzY2FuZG8gbm92b3MgZGFkb3MgZG8gc2Vydmlkb3IuXHJcbiAgICpcclxuICAgKiBPIHNpbmNyb25pc21vIHNvbWVudGUgc2Vyw6EgZXhlY3V0YWRvIGRlcG9pcyBxdWUgbyBhY2Vzc28gYSBiYXNlIGRlIGRhZG9zIGxvY2FsIGRvIGRpc3Bvc2l0aXZvIGZvciBsaWJlcmFkYS5cclxuICAgKlxyXG4gICAqID4gVmVqYSBtYWlzIGRldGFsaGVzIGVtIFtGdW5kYW1lbnRvcyBkbyBQTyBTeW5jIC0gU2luY3Jvbml6YcOnw6NvIG1hbnVhbF0oL2d1aWRlcy9zeW5jLWZ1bmRhbWVudGFscykuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBQcm9tZXNzYSBxdWUgw6kgcmVzb2x2aWRhIHF1YW5kbyBvIHNpbmNyb25pc21vIGZvciBmaW5hbGl6YWRvLlxyXG4gICAqL1xyXG4gIGFzeW5jIHN5bmMoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGlmICh0aGlzLmNhblN5bmMoKSkge1xyXG4gICAgICB0aGlzLnN0YXJ0U3luYygpO1xyXG5cclxuICAgICAgdHJ5IHtcclxuICAgICAgICBhd2FpdCB0aGlzLnBvRXZlbnRTb3VyY2luZ1NlcnZpY2Uuc3luY1NlbmQoKTtcclxuICAgICAgICBhd2FpdCB0aGlzLnBvRXZlbnRTb3VyY2luZ1NlcnZpY2Uuc3luY0dldCgpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5lbWl0dGVyKSB7XHJcbiAgICAgICAgICB0aGlzLmVtaXR0ZXIubmV4dCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5maW5pc2hTeW5jKCk7XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgdGhpcy5zeW5jRXJyb3IoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjYW5TeW5jKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuc3luY2luZyB8fCAhdGhpcy5pc1N5bmNFbmFibGVkKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGN1cnJlbnRDb25uZWN0aW9uID0gdGhpcy5wb05ldHdvcmtTZXJ2aWNlLmdldENvbm5lY3Rpb25TdGF0dXMoKTtcclxuICAgICAgY29uc3QgaXNDb25maWd1cmVkQ29ubmVjdGlvbiA9IHRoaXMuY29uZmlnICYmIGN1cnJlbnRDb25uZWN0aW9uLnR5cGUgPT09IHRoaXMuY29uZmlnLnR5cGU7XHJcbiAgICAgIGNvbnN0IGlzQ29uZmlnSW5jbHVkZXNUeXBlID1cclxuICAgICAgICB0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy50eXBlIGluc3RhbmNlb2YgQXJyYXkgJiYgdGhpcy5jb25maWcudHlwZS5pbmNsdWRlcyhjdXJyZW50Q29ubmVjdGlvbi50eXBlKTtcclxuXHJcbiAgICAgIHJldHVybiBjdXJyZW50Q29ubmVjdGlvbi5zdGF0dXMgJiYgKCF0aGlzLmNvbmZpZyB8fCBpc0NvbmZpZ3VyZWRDb25uZWN0aW9uIHx8IGlzQ29uZmlnSW5jbHVkZXNUeXBlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlU3Vic2NyaWJlKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMudGltZXIpIHtcclxuICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLnRpbWVyLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zeW5jKCkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSBudWxsO1xyXG4gICAgICAgICAgdGhpcy50aW1lciA9IG51bGw7XHJcbiAgICAgICAgICB0aGlzLnN0YXJ0VGltZXIodGhpcy5jb25maWcucGVyaW9kKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZpbmlzaFN5bmMoKTogdm9pZCB7XHJcbiAgICB0aGlzLnN5bmNpbmcgPSBmYWxzZTtcclxuICAgIHRoaXMuZmluaXNoU3luY1N1YmplY3QubmV4dChudWxsKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0T25lUGFnZShzY2hlbWE6IFBvU3luY1NjaGVtYSwgcGFnZTogbnVtYmVyID0gMSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBjb25zdCBwYXJhbXMgPSBbXTtcclxuICAgIHBhcmFtcy5wdXNoKGAke3RoaXMuY29uZmlnLmRhdGFUcmFuc2Zvcm0uZ2V0UGFnZVNpemVQYXJhbU5hbWUoKX09JHtzY2hlbWEucGFnZVNpemV9YCk7XHJcbiAgICBwYXJhbXMucHVzaChgJHt0aGlzLmNvbmZpZy5kYXRhVHJhbnNmb3JtLmdldFBhZ2VQYXJhbU5hbWUoKX09JHtwYWdlfWApO1xyXG5cclxuICAgIGNvbnN0IHVybCA9IGAke1BvU2NoZW1hVXRpbC5nZXRVcmwoc2NoZW1hLCBQb1JlcXVlc3RUeXBlLkdFVCl9PyR7cGFyYW1zLmpvaW4oJyYnKX1gO1xyXG5cclxuICAgIHJldHVybiB0aGlzLnBvSHR0cENsaWVudC5nZXQodXJsKS5waXBlKFxyXG4gICAgICBtYXAocmVzcG9uc2UgPT4gcmVzcG9uc2UuYm9keSksXHJcbiAgICAgIG1lcmdlTWFwKHJlc3BvbnNlQm9keSA9PiB7XHJcbiAgICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbiAgICAgICAgcmVzcG9uc2VCb2R5W3RoaXMuY29uZmlnLmRhdGFUcmFuc2Zvcm0uZ2V0SXRlbXNGaWVsZE5hbWUoKV0ubWFwKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgaXRlbS5TeW5jSW5zZXJ0ZWREYXRlVGltZSA9IG5vdztcclxuICAgICAgICAgIGl0ZW0uU3luY1VwZGF0ZWREYXRlVGltZSA9IG51bGw7XHJcbiAgICAgICAgICBpdGVtLlN5bmNFeGNsdXNpb25EYXRlVGltZSA9IG51bGw7XHJcbiAgICAgICAgICBpdGVtLlN5bmNEZWxldGVkID0gZmFsc2U7XHJcbiAgICAgICAgICBpdGVtLlN5bmNTdGF0dXMgPSAyO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBvU2NoZW1hU2VydmljZVxyXG4gICAgICAgICAgLnVwZGF0ZUFsbChzY2hlbWEsIHJlc3BvbnNlQm9keVt0aGlzLmNvbmZpZy5kYXRhVHJhbnNmb3JtLmdldEl0ZW1zRmllbGROYW1lKCldKVxyXG4gICAgICAgICAgLnRoZW4oKCkgPT4gcmVzcG9uc2VCb2R5KTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxvYWRFbnRpdHlEYXRhKHNjaGVtYTogUG9TeW5jU2NoZW1hKTogT2JzZXJ2YWJsZTx7IGVudGl0eTogc3RyaW5nOyBkYXRhOiBBcnJheTxhbnk+IH0+IHtcclxuICAgIGxldCBwYWdlID0gMTtcclxuICAgIHJldHVybiB0aGlzLmdldE9uZVBhZ2Uoc2NoZW1hLCBwYWdlKS5waXBlKFxyXG4gICAgICBleHBhbmQoZGF0YSA9PiB7XHJcbiAgICAgICAgdGhpcy5jb25maWcuZGF0YVRyYW5zZm9ybS50cmFuc2Zvcm0oZGF0YSk7XHJcbiAgICAgICAgY29uc3QgaGFzTmV4dCA9IHRoaXMuY29uZmlnLmRhdGFUcmFuc2Zvcm0uaGFzTmV4dCgpO1xyXG4gICAgICAgIGlmIChoYXNOZXh0KSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXRPbmVQYWdlKHNjaGVtYSwgKytwYWdlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIG9mKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSxcclxuICAgICAgcmVkdWNlKFxyXG4gICAgICAgIChhY2MsIG9iaikgPT4ge1xyXG4gICAgICAgICAgYWNjLmRhdGEgPSBhY2MuZGF0YS5jb25jYXQob2JqW3RoaXMuY29uZmlnLmRhdGFUcmFuc2Zvcm0uZ2V0SXRlbXNGaWVsZE5hbWUoKV0pO1xyXG4gICAgICAgICAgcmV0dXJuIGFjYztcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGVudGl0eTogc2NoZW1hLm5hbWUsXHJcbiAgICAgICAgICBkYXRhOiBbXVxyXG4gICAgICAgIH1cclxuICAgICAgKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVhY3RpdmVTeW5jKCk6IHZvaWQge1xyXG4gICAgdGhpcy5wb05ldHdvcmtTZXJ2aWNlLm9uQ2hhbmdlKCkuc3Vic2NyaWJlKG5ldHdvcmtTdGF0dXMgPT4ge1xyXG4gICAgICBpZiAobmV0d29ya1N0YXR1cy5zdGF0dXMpIHtcclxuICAgICAgICB0aGlzLnN0YXJ0VGltZXIodGhpcy5jb25maWcucGVyaW9kKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5zeW5jKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbikge1xyXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBzYXZlU2NoZW1hcygpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgY29uc3Qgc3RvcmFnZVNjaGVtYXM6IEFycmF5PFBvU3luY1NjaGVtYT4gPSBhd2FpdCB0aGlzLnBvU2NoZW1hRGVmaW5pdGlvblNlcnZpY2UuZ2V0QWxsKCk7XHJcbiAgICB0aGlzLnNjaGVtYXMuZm9yRWFjaChzY2hlbWEgPT4gKHNjaGVtYS5sYXN0U3luYyA9IFBvU2NoZW1hVXRpbC5nZXRMYXN0U3luYyhzdG9yYWdlU2NoZW1hcywgc2NoZW1hLm5hbWUpKSk7XHJcbiAgICByZXR1cm4gdGhpcy5wb1NjaGVtYURlZmluaXRpb25TZXJ2aWNlLnNhdmVBbGwodGhpcy5zY2hlbWFzKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhcnRTeW5jKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zeW5jaW5nID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhcnRUaW1lcihwZXJpb2QpOiB2b2lkIHtcclxuICAgIGlmIChwZXJpb2QgJiYgdGhpcy5pc1N5bmNFbmFibGVkKSB7XHJcbiAgICAgIHRoaXMudGltZXIgPSB0aW1lcihwZXJpb2QgKiAxMDAwKTtcclxuICAgICAgdGhpcy5jcmVhdGVTdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3luY0Vycm9yKCk6IHZvaWQge1xyXG4gICAgdGhpcy5maW5pc2hTeW5jKCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==