velocious 1.0.644 → 1.0.646
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -9
- package/build/authorization/ability.js +36 -13
- package/build/background-jobs/adapter.js +9 -0
- package/build/background-jobs/main.js +35 -10
- package/build/background-jobs/store.js +217 -38
- package/build/background-jobs/types.js +15 -0
- package/build/configuration-types.js +1 -1
- package/build/configuration.js +45 -9
- package/build/database/drivers/base-column.js +8 -0
- package/build/database/drivers/mssql/sql/update.js +1 -3
- package/build/database/drivers/mysql/sql/update.js +1 -3
- package/build/database/drivers/pgsql/column.js +22 -0
- package/build/database/drivers/pgsql/sql/update.js +1 -3
- package/build/database/drivers/sqlite/sql/alter-table.js +11 -1
- package/build/database/drivers/sqlite/sql/update.js +1 -3
- package/build/database/query/index.js +2 -2
- package/build/database/query/model-class-query.js +26 -10
- package/build/database/query/preloader/has-many.js +4 -1
- package/build/database/query/query-data.js +2 -1
- package/build/database/query/update-base.js +14 -0
- package/build/database/query/with-count.js +3 -1
- package/build/database/record/acts-as-list.js +37 -13
- package/build/database/record/attachments/store.js +336 -26
- package/build/database/record/auditing.js +6 -3
- package/build/database/record/index.js +197 -42
- package/build/database/record/instance-relationships/belongs-to.js +2 -1
- package/build/database/record/validators/uniqueness.js +8 -5
- package/build/environment-handlers/node/cli/commands/generate/frontend-models.js +24 -8
- package/build/frontend-model-controller.js +136 -53
- package/build/frontend-model-resource/base-resource.js +87 -37
- package/build/frontend-model-resource/velocious-attachment-resource.js +98 -31
- package/build/frontend-models/base.js +307 -59
- package/build/frontend-models/preloader.js +6 -3
- package/build/frontend-models/query.js +15 -6
- package/build/frontend-models/resource-definition.js +21 -2
- package/build/frontend-models/use-destroyed-event.js +1 -1
- package/build/frontend-models/use-model-class-event.js +2 -2
- package/build/frontend-models/use-updated-event.js +1 -1
- package/build/frontend-models/websocket-channel.js +256 -93
- package/build/frontend-models/websocket-publishers.js +218 -18
- package/build/http-server/client/websocket-session.js +13 -1
- package/build/http-server/websocket-channel.js +15 -2
- package/build/src/authorization/ability.d.ts +9 -3
- package/build/src/authorization/ability.d.ts.map +1 -1
- package/build/src/authorization/ability.js +33 -14
- package/build/src/background-jobs/adapter.d.ts +6 -0
- package/build/src/background-jobs/adapter.d.ts.map +1 -1
- package/build/src/background-jobs/adapter.js +9 -1
- package/build/src/background-jobs/main.d.ts +6 -0
- package/build/src/background-jobs/main.d.ts.map +1 -1
- package/build/src/background-jobs/main.js +34 -11
- package/build/src/background-jobs/store.d.ts +66 -12
- package/build/src/background-jobs/store.d.ts.map +1 -1
- package/build/src/background-jobs/store.js +191 -35
- package/build/src/background-jobs/types.d.ts +55 -0
- package/build/src/background-jobs/types.d.ts.map +1 -1
- package/build/src/background-jobs/types.js +16 -1
- package/build/src/configuration-types.d.ts +3 -3
- package/build/src/configuration-types.d.ts.map +1 -1
- package/build/src/configuration-types.js +2 -2
- package/build/src/configuration.d.ts +18 -8
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +38 -7
- package/build/src/database/drivers/base-column.d.ts +5 -0
- package/build/src/database/drivers/base-column.d.ts.map +1 -1
- package/build/src/database/drivers/base-column.js +8 -1
- package/build/src/database/drivers/mssql/sql/update.d.ts.map +1 -1
- package/build/src/database/drivers/mssql/sql/update.js +2 -4
- package/build/src/database/drivers/mysql/sql/update.d.ts.map +1 -1
- package/build/src/database/drivers/mysql/sql/update.js +2 -4
- package/build/src/database/drivers/pgsql/column.d.ts +5 -0
- package/build/src/database/drivers/pgsql/column.d.ts.map +1 -1
- package/build/src/database/drivers/pgsql/column.js +19 -1
- package/build/src/database/drivers/pgsql/sql/update.d.ts.map +1 -1
- package/build/src/database/drivers/pgsql/sql/update.js +2 -4
- package/build/src/database/drivers/sqlite/sql/alter-table.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/sql/alter-table.js +6 -2
- package/build/src/database/drivers/sqlite/sql/update.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/sql/update.js +2 -4
- package/build/src/database/query/index.d.ts +4 -4
- package/build/src/database/query/index.d.ts.map +1 -1
- package/build/src/database/query/index.js +3 -3
- package/build/src/database/query/model-class-query.d.ts +8 -2
- package/build/src/database/query/model-class-query.d.ts.map +1 -1
- package/build/src/database/query/model-class-query.js +25 -11
- package/build/src/database/query/preloader/has-many.d.ts.map +1 -1
- package/build/src/database/query/preloader/has-many.js +4 -2
- package/build/src/database/query/query-data.d.ts.map +1 -1
- package/build/src/database/query/query-data.js +3 -2
- package/build/src/database/query/update-base.d.ts +7 -0
- package/build/src/database/query/update-base.d.ts.map +1 -1
- package/build/src/database/query/update-base.js +13 -1
- package/build/src/database/query/with-count.d.ts.map +1 -1
- package/build/src/database/query/with-count.js +3 -2
- package/build/src/database/record/acts-as-list.d.ts.map +1 -1
- package/build/src/database/record/acts-as-list.js +35 -14
- package/build/src/database/record/attachments/store.d.ts +67 -0
- package/build/src/database/record/attachments/store.d.ts.map +1 -1
- package/build/src/database/record/attachments/store.js +301 -25
- package/build/src/database/record/auditing.d.ts.map +1 -1
- package/build/src/database/record/auditing.js +7 -4
- package/build/src/database/record/index.d.ts +78 -26
- package/build/src/database/record/index.d.ts.map +1 -1
- package/build/src/database/record/index.js +171 -42
- package/build/src/database/record/instance-relationships/belongs-to.d.ts.map +1 -1
- package/build/src/database/record/instance-relationships/belongs-to.js +3 -2
- package/build/src/database/record/validators/uniqueness.d.ts.map +1 -1
- package/build/src/database/record/validators/uniqueness.js +8 -6
- package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts +4 -4
- package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.js +24 -12
- package/build/src/frontend-model-controller.d.ts +29 -8
- package/build/src/frontend-model-controller.d.ts.map +1 -1
- package/build/src/frontend-model-controller.js +122 -51
- package/build/src/frontend-model-resource/base-resource.d.ts +51 -24
- package/build/src/frontend-model-resource/base-resource.d.ts.map +1 -1
- package/build/src/frontend-model-resource/base-resource.js +83 -37
- package/build/src/frontend-model-resource/velocious-attachment-resource.d.ts +45 -26
- package/build/src/frontend-model-resource/velocious-attachment-resource.d.ts.map +1 -1
- package/build/src/frontend-model-resource/velocious-attachment-resource.js +89 -31
- package/build/src/frontend-models/base.d.ts +53 -20
- package/build/src/frontend-models/base.d.ts.map +1 -1
- package/build/src/frontend-models/base.js +275 -59
- package/build/src/frontend-models/preloader.d.ts.map +1 -1
- package/build/src/frontend-models/preloader.js +6 -4
- package/build/src/frontend-models/query.d.ts +2 -2
- package/build/src/frontend-models/query.d.ts.map +1 -1
- package/build/src/frontend-models/query.js +14 -7
- package/build/src/frontend-models/resource-definition.d.ts.map +1 -1
- package/build/src/frontend-models/resource-definition.js +20 -3
- package/build/src/frontend-models/use-destroyed-event.d.ts +1 -1
- package/build/src/frontend-models/use-destroyed-event.d.ts.map +1 -1
- package/build/src/frontend-models/use-destroyed-event.js +2 -2
- package/build/src/frontend-models/use-model-class-event.d.ts +2 -2
- package/build/src/frontend-models/use-model-class-event.d.ts.map +1 -1
- package/build/src/frontend-models/use-model-class-event.js +3 -3
- package/build/src/frontend-models/use-updated-event.d.ts +1 -1
- package/build/src/frontend-models/use-updated-event.d.ts.map +1 -1
- package/build/src/frontend-models/use-updated-event.js +2 -2
- package/build/src/frontend-models/websocket-channel.d.ts +60 -41
- package/build/src/frontend-models/websocket-channel.d.ts.map +1 -1
- package/build/src/frontend-models/websocket-channel.js +225 -85
- package/build/src/frontend-models/websocket-publishers.d.ts +9 -0
- package/build/src/frontend-models/websocket-publishers.d.ts.map +1 -1
- package/build/src/frontend-models/websocket-publishers.js +190 -19
- package/build/src/http-server/client/websocket-session.d.ts.map +1 -1
- package/build/src/http-server/client/websocket-session.js +11 -2
- package/build/src/http-server/websocket-channel.d.ts +20 -8
- package/build/src/http-server/websocket-channel.d.ts.map +1 -1
- package/build/src/http-server/websocket-channel.js +15 -3
- package/build/src/sync/sync-api-client.d.ts.map +1 -1
- package/build/src/sync/sync-api-client.js +4 -3
- package/build/src/sync/sync-client.d.ts.map +1 -1
- package/build/src/sync/sync-client.js +3 -2
- package/build/src/sync/sync-envelope-replay-service.d.ts.map +1 -1
- package/build/src/sync/sync-envelope-replay-service.js +6 -5
- package/build/src/sync/sync-publisher.d.ts.map +1 -1
- package/build/src/sync/sync-publisher.js +4 -3
- package/build/src/testing/browser-frontend-model-event-hook-scenarios.d.ts +2 -2
- package/build/src/testing/browser-frontend-model-event-hook-scenarios.d.ts.map +1 -1
- package/build/src/testing/browser-frontend-model-event-hook-scenarios.js +3 -3
- package/build/src/testing/test-profiler.d.ts +4 -4
- package/build/src/testing/test-profiler.d.ts.map +1 -1
- package/build/src/testing/test-profiler.js +3 -3
- package/build/src/testing/test-runner.d.ts +271 -117
- package/build/src/testing/test-runner.d.ts.map +1 -1
- package/build/src/testing/test-runner.js +496 -427
- package/build/src/testing/test.d.ts +11 -72
- package/build/src/testing/test.d.ts.map +1 -1
- package/build/src/testing/test.js +131 -284
- package/build/src/testing/velocious-attempt-executor.d.ts +14 -29
- package/build/src/testing/velocious-attempt-executor.d.ts.map +1 -1
- package/build/src/testing/velocious-attempt-executor.js +52 -46
- package/build/src/testing/velocious-runner-reporter.d.ts +29 -34
- package/build/src/testing/velocious-runner-reporter.d.ts.map +1 -1
- package/build/src/testing/velocious-runner-reporter.js +145 -57
- package/build/src/testing/velocious-suite-hook-executor.d.ts +5 -23
- package/build/src/testing/velocious-suite-hook-executor.d.ts.map +1 -1
- package/build/src/testing/velocious-suite-hook-executor.js +22 -47
- package/build/src/testing/velocious-test-arguments.d.ts +11 -6
- package/build/src/testing/velocious-test-arguments.d.ts.map +1 -1
- package/build/src/testing/velocious-test-arguments.js +18 -10
- package/build/src/utils/model-primary-key.d.ts +73 -0
- package/build/src/utils/model-primary-key.d.ts.map +1 -0
- package/build/src/utils/model-primary-key.js +144 -0
- package/build/sync/sync-api-client.js +3 -2
- package/build/sync/sync-client.js +2 -1
- package/build/sync/sync-envelope-replay-service.js +5 -4
- package/build/sync/sync-publisher.js +3 -2
- package/build/testing/browser-frontend-model-event-hook-scenarios.js +2 -2
- package/build/testing/test-profiler.js +2 -2
- package/build/testing/test-runner.js +493 -449
- package/build/testing/test.js +164 -306
- package/build/testing/velocious-attempt-executor.js +55 -45
- package/build/testing/velocious-runner-reporter.js +156 -58
- package/build/testing/velocious-suite-hook-executor.js +22 -50
- package/build/testing/velocious-test-arguments.js +19 -10
- package/build/utils/model-primary-key.js +171 -0
- package/package.json +6 -5
- package/src/authorization/ability.js +36 -13
- package/src/background-jobs/adapter.js +9 -0
- package/src/background-jobs/main.js +35 -10
- package/src/background-jobs/store.js +217 -38
- package/src/background-jobs/types.js +15 -0
- package/src/configuration-types.js +1 -1
- package/src/configuration.js +45 -9
- package/src/database/drivers/base-column.js +8 -0
- package/src/database/drivers/mssql/sql/update.js +1 -3
- package/src/database/drivers/mysql/sql/update.js +1 -3
- package/src/database/drivers/pgsql/column.js +22 -0
- package/src/database/drivers/pgsql/sql/update.js +1 -3
- package/src/database/drivers/sqlite/sql/alter-table.js +11 -1
- package/src/database/drivers/sqlite/sql/update.js +1 -3
- package/src/database/query/index.js +2 -2
- package/src/database/query/model-class-query.js +26 -10
- package/src/database/query/preloader/has-many.js +4 -1
- package/src/database/query/query-data.js +2 -1
- package/src/database/query/update-base.js +14 -0
- package/src/database/query/with-count.js +3 -1
- package/src/database/record/acts-as-list.js +37 -13
- package/src/database/record/attachments/store.js +336 -26
- package/src/database/record/auditing.js +6 -3
- package/src/database/record/index.js +197 -42
- package/src/database/record/instance-relationships/belongs-to.js +2 -1
- package/src/database/record/validators/uniqueness.js +8 -5
- package/src/environment-handlers/node/cli/commands/generate/frontend-models.js +24 -8
- package/src/frontend-model-controller.js +136 -53
- package/src/frontend-model-resource/base-resource.js +87 -37
- package/src/frontend-model-resource/velocious-attachment-resource.js +98 -31
- package/src/frontend-models/base.js +307 -59
- package/src/frontend-models/preloader.js +6 -3
- package/src/frontend-models/query.js +15 -6
- package/src/frontend-models/resource-definition.js +21 -2
- package/src/frontend-models/use-destroyed-event.js +1 -1
- package/src/frontend-models/use-model-class-event.js +2 -2
- package/src/frontend-models/use-updated-event.js +1 -1
- package/src/frontend-models/websocket-channel.js +256 -93
- package/src/frontend-models/websocket-publishers.js +218 -18
- package/src/http-server/client/websocket-session.js +13 -1
- package/src/http-server/websocket-channel.js +15 -2
- package/src/sync/sync-api-client.js +3 -2
- package/src/sync/sync-client.js +2 -1
- package/src/sync/sync-envelope-replay-service.js +5 -4
- package/src/sync/sync-publisher.js +3 -2
- package/src/testing/browser-frontend-model-event-hook-scenarios.js +2 -2
- package/src/testing/test-profiler.js +2 -2
- package/src/testing/test-runner.js +493 -449
- package/src/testing/test.js +164 -306
- package/src/testing/velocious-attempt-executor.js +55 -45
- package/src/testing/velocious-runner-reporter.js +156 -58
- package/src/testing/velocious-suite-hook-executor.js +22 -50
- package/src/testing/velocious-test-arguments.js +19 -10
- package/src/utils/model-primary-key.js +171 -0
- package/build/src/testing/testing-package-adapter.d.ts +0 -9
- package/build/src/testing/testing-package-adapter.d.ts.map +0 -1
- package/build/src/testing/testing-package-adapter.js +0 -69
- package/build/testing/testing-package-adapter.js +0 -76
- package/build/tsconfig.tsbuildinfo +0 -1
- package/src/testing/testing-package-adapter.js +0 -76
|
@@ -10,6 +10,7 @@ import sha256Hex from "../utils/sha256-hex.js";
|
|
|
10
10
|
import { decodeReplayPersistedData, serializeReplayPersistedData } from "./sync-replay-persisted-data.js";
|
|
11
11
|
import { ValidationError } from "../database/record/index.js";
|
|
12
12
|
import VelociousError from "../velocious-error.js";
|
|
13
|
+
import { scalarModelPrimaryKey, scalarModelPrimaryKeyValue } from "../utils/model-primary-key.js";
|
|
13
14
|
/**
|
|
14
15
|
* Resolved routed-resource registration for one replay resource type.
|
|
15
16
|
* @typedef {object} SyncReplayResourceRegistration
|
|
@@ -704,7 +705,7 @@ export default class SyncEnvelopeReplayService {
|
|
|
704
705
|
if (mutation.baseVersion === undefined || mutation.baseVersion === null)
|
|
705
706
|
return null;
|
|
706
707
|
const ModelClass = resource.modelClass();
|
|
707
|
-
const primaryKey = ModelClass.primaryKey();
|
|
708
|
+
const primaryKey = scalarModelPrimaryKey(ModelClass.primaryKey(), `Offline sync conflict handling for ${ModelClass.name}`);
|
|
708
709
|
const primaryKeyAttribute = ModelClass.resolveAttributeName(primaryKey);
|
|
709
710
|
const versionAttribute = this.conflictStrategy.versionAttribute;
|
|
710
711
|
const versionAttributeName = ModelClass.resolveAttributeName(versionAttribute);
|
|
@@ -826,7 +827,7 @@ export default class SyncEnvelopeReplayService {
|
|
|
826
827
|
if (columnName)
|
|
827
828
|
allowedKeys.add(columnName);
|
|
828
829
|
}
|
|
829
|
-
const primaryKey = ModelClass.primaryKey();
|
|
830
|
+
const primaryKey = scalarModelPrimaryKey(ModelClass.primaryKey(), `Offline sync attribute filtering for ${ModelClass.name}`);
|
|
830
831
|
const primaryKeyAttribute = ModelClass.getColumnNameToAttributeNameMap()[primaryKey];
|
|
831
832
|
/** @type {Record<string, ReturnType<typeof JSON.parse>>} */
|
|
832
833
|
const attributes = {};
|
|
@@ -858,7 +859,7 @@ export default class SyncEnvelopeReplayService {
|
|
|
858
859
|
*/
|
|
859
860
|
async createRoutedReplayRecord({ attributes, mutation, resource }) {
|
|
860
861
|
const ModelClass = resource.modelClass();
|
|
861
|
-
const primaryKey = ModelClass.primaryKey();
|
|
862
|
+
const primaryKey = scalarModelPrimaryKey(ModelClass.primaryKey(), `Offline sync create for ${ModelClass.name}`);
|
|
862
863
|
const conflictingIds = await ModelClass.where({ [primaryKey]: mutation.resourceId }).pluck(primaryKey);
|
|
863
864
|
if (conflictingIds.length > 0) {
|
|
864
865
|
throw VelociousError.safe(`Sync update denied for: ${mutation.resourceType}.`, {
|
|
@@ -879,7 +880,7 @@ export default class SyncEnvelopeReplayService {
|
|
|
879
880
|
if (ability) {
|
|
880
881
|
const memberIds = await ModelClass
|
|
881
882
|
.accessibleFor(resource.syncAbilityAction("create"), ability)
|
|
882
|
-
.where({ [primaryKey]: record.id() })
|
|
883
|
+
.where({ [primaryKey]: scalarModelPrimaryKeyValue(record.id(), `Offline sync create authorization for ${ModelClass.name}`) })
|
|
883
884
|
.pluck(primaryKey);
|
|
884
885
|
if (memberIds.length === 0) {
|
|
885
886
|
await record.destroy();
|
|
@@ -1040,4 +1041,4 @@ function normalizeConflictValue(value) {
|
|
|
1040
1041
|
return value.toISOString();
|
|
1041
1042
|
return value;
|
|
1042
1043
|
}
|
|
1043
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zeW5jL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyx5QkFBeUIsRUFBRSxhQUFhLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQTtBQUNoRixPQUFPLEVBQUMsd0NBQXdDLEVBQUMsTUFBTSw2Q0FBNkMsQ0FBQTtBQUNwRyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sK0JBQStCLENBQUE7QUFDN0QsT0FBTyxFQUFDLGlDQUFpQyxFQUFDLE1BQU0sMkNBQTJDLENBQUE7QUFDM0YsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sd0JBQXdCLENBQUE7QUFDMUQsT0FBTyx1QkFBdUIsTUFBTSxpQ0FBaUMsQ0FBQTtBQUNyRSxPQUFPLG1CQUFtQixNQUFNLGtCQUFrQixDQUFBO0FBQ2xELE9BQU8sU0FBUyxNQUFNLHdCQUF3QixDQUFBO0FBQzlDLE9BQU8sRUFBQyx5QkFBeUIsRUFBRSw0QkFBNEIsRUFBQyxNQUFNLGlDQUFpQyxDQUFBO0FBQ3ZHLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQTtBQUMzRCxPQUFPLGNBQWMsTUFBTSx1QkFBdUIsQ0FBQTtBQUVsRDs7Ozs7O0dBTUc7QUFDSDs7Ozs7Ozs7Ozs7R0FXRztBQUNIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8seUJBQXlCO0lBQzVDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0EyQkc7SUFDSCxZQUFZLElBQUksR0FBRyxFQUFFO1FBQ25CLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUE7UUFDcEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQTtRQUN2QyxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixJQUFJLHlCQUF5QixDQUFBO1FBQ3BGLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUMsd0JBQXdCLElBQUksSUFBSSxDQUFBO1FBQ3JFLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxJQUFJLENBQUMseUJBQXlCLElBQUksT0FBTyxDQUFBO1FBQzFFLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUMsd0JBQXdCLElBQUkscUJBQXFCLENBQUE7UUFDdEYsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsSUFBSSxJQUFJLENBQUE7UUFDakUsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxxQkFBcUIsSUFBSSxJQUFJLENBQUE7UUFDL0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQTtRQUMzQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFBO1FBQ3pDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO1FBQzVGLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUE7UUFDL0MsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUE7UUFDckQsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxxQkFBcUIsSUFBSSxJQUFJLENBQUE7UUFDL0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQTtRQUNuQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFBO1FBQ2pELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUE7UUFDakMsaUVBQWlFO1FBQ2pFLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO1FBRTdDLElBQUksSUFBSSxDQUFDLHFCQUFxQixLQUFLLFNBQVMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDMUksTUFBTSxJQUFJLEtBQUssQ0FBQywwREFBMEQsTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUNqSCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sSUFBSSxLQUFLLENBQUMsbUZBQW1GLENBQUMsQ0FBQTtRQUN0RyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUMxQixNQUFNLDJCQUEyQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsbUJBQW1CLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQTtZQUVoRixJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixJQUFJLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUMxRyxNQUFNLElBQUksS0FBSyxDQUFDLGtGQUFrRixDQUFDLENBQUE7WUFDckcsQ0FBQztZQUNELElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsS0FBSyxTQUFTLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JILE1BQU0sSUFBSSxLQUFLLENBQUMsMERBQTBELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLHdEQUF3RCxDQUFDLENBQUE7WUFDbkssQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGtCQUFrQixDQUFDLGFBQWE7UUFDOUIsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRTtZQUN0RixJQUFJLE9BQU8sT0FBTyxLQUFLLFVBQVU7Z0JBQUUsT0FBTyxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQTtZQUVqRSxNQUFNLE9BQU8sR0FBRyxJQUFJLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBRXBELE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQyw0REFBNEQsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDNUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNMLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFlBQVksR0FBRyxFQUFFO1FBQ3BDLE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQTtRQUV2RSxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQy9CLE9BQU87Z0JBQ0wsS0FBSyxFQUFFLEVBQUU7Z0JBQ1QsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsU0FBUyxFQUFFLFdBQVcsQ0FBQyxTQUFTO2dCQUNoQyxZQUFZLEVBQUUsV0FBVyxDQUFDLFlBQVk7YUFDdkMsQ0FBQTtRQUNILENBQUM7UUFFRCxNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUE7UUFDeEIsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFDLENBQUMsQ0FBQTtRQUUvRixLQUFLLE1BQU0sT0FBTyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDN0QsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUE7WUFFMUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUN6QixhQUFhLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFBO2dCQUM3QyxTQUFRO1lBQ1YsQ0FBQztZQUVELE1BQU0sUUFBUSxHQUFHLGdCQUFnQixDQUFDLFFBQVEsQ0FBQTtZQUMxQyxNQUFNLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxFQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUMsQ0FBQyxDQUFBO1lBRXRHLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQzFCLGFBQWEsQ0FBQyxJQUFJLENBQUM7b0JBQ2pCLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRTtvQkFDZixTQUFTLEVBQUUsUUFBUTtvQkFDbkIsTUFBTSxFQUFFLFlBQVksQ0FBQyxNQUFNLElBQUksZUFBZTtpQkFDL0MsQ0FBQyxDQUFBO2dCQUNGLFNBQVE7WUFDVixDQUFDO1lBRUQsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsRUFBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFDLENBQUMsQ0FBQTtZQUNyRyxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxFQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFDLENBQUMsQ0FBQTtZQUNySCxNQUFNLFNBQVMsR0FBRyxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMseUJBQXlCLENBQUMsRUFBQyxZQUFZLEVBQUUsUUFBUSxFQUFDLENBQUMsQ0FBQTtZQUUxRiw0Q0FBNEM7WUFDNUMsSUFBSSxXQUFXLENBQUE7WUFFZixJQUFJLENBQUM7Z0JBQ0gsV0FBVyxHQUFHLFdBQVc7b0JBQ3ZCLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxFQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFDLENBQUM7b0JBQzdGLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxFQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFDLENBQUMsQ0FBQTtZQUNuRyxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixtRUFBbUU7Z0JBQ25FLG9FQUFvRTtnQkFDcEUsNERBQTREO2dCQUM1RCxJQUFJLEtBQUssWUFBWSxjQUFjLElBQUksS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO29CQUMxRCxhQUFhLENBQUMsSUFBSSxDQUFDO3dCQUNqQixFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUU7d0JBQ2YsU0FBUyxFQUFFLFFBQVE7d0JBQ25CLE1BQU0sRUFBRSxLQUFLLENBQUMsSUFBSSxJQUFJLGNBQWM7d0JBQ3BDLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztxQkFDdkIsQ0FBQyxDQUFBO29CQUNGLFNBQVE7Z0JBQ1YsQ0FBQztnQkFFRCxNQUFNLEtBQUssQ0FBQTtZQUNiLENBQUM7WUFFRCxJQUFJLFdBQVcsSUFBSSxXQUFXLENBQUMsTUFBTSxLQUFLLFVBQVUsRUFBRSxDQUFDO2dCQUNyRCxhQUFhLENBQUMsSUFBSSxDQUFDO29CQUNqQixRQUFRLEVBQUUsV0FBVyxDQUFDLFFBQVE7b0JBQzlCLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRTtvQkFDZixTQUFTLEVBQUUsVUFBVTtpQkFDdEIsQ0FBQyxDQUFBO2dCQUNGLFNBQVE7WUFDVixDQUFDO1lBRUQsTUFBTSxJQUFJLENBQUMscUJBQXFCLENBQUMsRUFBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFDLENBQUMsQ0FBQTtZQUN2SCxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxFQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUMsQ0FBQyxDQUFBO1lBRXJILDREQUE0RDtZQUM1RCxNQUFNLGtCQUFrQixHQUFHLEVBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUMsQ0FBQTtZQUUvRixNQUFNLHVCQUF1QixHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7WUFFN0YsSUFBSSx1QkFBdUIsRUFBRSxDQUFDO2dCQUM1QixrQkFBa0IsQ0FBQyxhQUFhLEdBQUcsdUJBQXVCLENBQUMsc0JBQXNCLENBQUE7WUFDbkYsQ0FBQztpQkFBTSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxRQUFRLENBQUMsV0FBVyxLQUFLLFNBQVMsSUFBSSxXQUFXLEVBQUUsTUFBTSxFQUFFLENBQUM7Z0JBQzlGLGtCQUFrQixDQUFDLGFBQWEsR0FBRyxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFBO1lBQ3JJLENBQUM7WUFFRCxhQUFhLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUE7UUFDeEMsQ0FBQztRQUVELE9BQU8sRUFBQyxLQUFLLEVBQUUsYUFBYSxFQUFDLENBQUE7SUFDL0IsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsS0FBSyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxhQUFhO1FBQzVDLElBQUksQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztZQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLDBHQUEwRyxDQUFDLENBQUE7UUFDN0gsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQTtRQUVuRCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxPQUFPLEVBQUMsYUFBYSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsOEJBQThCLEVBQUUsWUFBWSxFQUFFLDhCQUE4QixFQUFDLENBQUE7UUFDeEgsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxFQUFDLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQTtRQUVuRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxPQUFPLEVBQUMsYUFBYSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsOEJBQThCLEVBQUUsWUFBWSxFQUFFLDhCQUE4QixFQUFDLENBQUE7UUFDeEgsQ0FBQztRQUVELE9BQU8sRUFBQyxLQUFLLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBQyxDQUFBO0lBQ3JDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLGtCQUFrQixDQUFDLEtBQUs7UUFDNUIsT0FBTyxFQUFFLENBQUE7SUFDWCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxXQUFXLENBQUMsTUFBTSxFQUFFLGFBQWE7UUFDL0IsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO0lBQ3hELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsbUJBQW1CLENBQUMsT0FBTztRQUN6QixJQUFJLENBQUMsT0FBTyxJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDdEUsT0FBTyxFQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUMsRUFBQyxDQUFBO1FBQzVGLENBQUM7UUFFRCxNQUFNLElBQUksR0FBRyw0REFBNEQsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ25GLE1BQU0sRUFBQyxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBQyxHQUFHLElBQUksQ0FBQTtRQUU5RixJQUFJLE9BQU8sWUFBWSxLQUFLLFFBQVEsSUFBSSxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxVQUFVLEtBQUssU0FBUyxJQUFJLFVBQVUsS0FBSyxJQUFJLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDMUssT0FBTyxFQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLHFCQUFxQixFQUFDLEVBQUMsQ0FBQTtRQUN4RixDQUFDO1FBRUQsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDM0MsSUFBSSxtQkFBbUIsR0FBRyxPQUFPLGVBQWUsS0FBSyxRQUFRLElBQUksZUFBZSxZQUFZLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUE7UUFFekksSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQUUsbUJBQW1CLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQTtRQUVqRixNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxFQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLFlBQVksRUFBQyxDQUFDLENBQUE7UUFFakgsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEVBQUU7WUFBRSxPQUFPLG9CQUFvQixDQUFBO1FBRXpELE9BQU87WUFDTCxFQUFFLEVBQUUsSUFBSTtZQUNSLFFBQVEsRUFBRTtnQkFDUixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7Z0JBQzdCLGdCQUFnQjtnQkFDaEIsZUFBZSxFQUFFLG1CQUFtQjtnQkFDcEMsSUFBSSxFQUFFLG9CQUFvQixDQUFDLElBQUk7Z0JBQy9CLEVBQUU7Z0JBQ0YsVUFBVSxFQUFFLGdCQUFnQjtnQkFDNUIsWUFBWTtnQkFDWixjQUFjLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUM7Z0JBQ3pELFFBQVE7YUFDVDtTQUNGLENBQUE7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILHVCQUF1QixDQUFDLEVBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFDO1FBQzFELElBQUksSUFBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLEtBQUssSUFBSTtZQUFFLE9BQU8sRUFBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUMsQ0FBQTtRQUVwRSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQztnQkFDSCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFBO2dCQUVuQyxJQUFJLENBQUMsVUFBVSxJQUFJLE9BQU8sVUFBVSxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztvQkFBRSxPQUFPLEVBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFDLENBQUE7Z0JBRTNHLE9BQU8sRUFBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSw0REFBNEQsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUE7WUFDcEcsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyx3QkFBd0IsRUFBRSxFQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBQyxDQUFDLENBQUE7Z0JBQ25GLE9BQU8sRUFBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUMsRUFBQyxDQUFBO1lBQ2pGLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7WUFBRSxPQUFPLEVBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFDLENBQUE7UUFFaEYsT0FBTyxFQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFDLENBQUE7SUFDM0QsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsdUJBQXVCLENBQUMsS0FBSztRQUNqQyxPQUFPLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBQyxDQUFBO0lBQ3hCLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsS0FBSyxDQUFDLHNCQUFzQixDQUFDLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBQztRQUM1QyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPLElBQUksQ0FBQTtRQUVoQyxPQUFPLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7WUFDakMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQztZQUN2RCxXQUFXLEVBQUUsUUFBUSxDQUFDLFVBQVU7WUFDaEMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxZQUFZO1NBQ3JDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsYUFBYSxDQUFDLEtBQUs7UUFDakIsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksT0FBTyxLQUFLLENBQUMsRUFBRSxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQzFFLE1BQU0sSUFBSSxLQUFLLENBQUMsOEdBQThHLENBQUMsQ0FBQTtRQUNqSSxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUE7SUFDbkIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMseUJBQXlCLENBQUMsRUFBQyxZQUFZLEVBQUUsUUFBUSxFQUFDO1FBQ3RELE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxDQUFDLGlDQUFpQyxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBRXBGLE9BQU8sQ0FBQyx1QkFBdUIsSUFBSSxRQUFRLENBQUMsZUFBZSxHQUFHLHVCQUF1QixDQUFBO0lBQ3ZGLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsaUNBQWlDLENBQUMsWUFBWTtRQUM1QyxJQUFJLENBQUMsWUFBWSxJQUFJLE9BQU8sWUFBWSxLQUFLLFFBQVE7WUFBRSxPQUFPLElBQUksQ0FBQTtRQUVsRSxNQUFNLFVBQVUsR0FBRyw0REFBNEQsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBQzlGLE1BQU0sS0FBSyxHQUFHLE9BQU8sVUFBVSxDQUFDLGVBQWUsS0FBSyxVQUFVO1lBQzVELENBQUMsQ0FBQyxVQUFVLENBQUMsZUFBZSxFQUFFO1lBQzlCLENBQUMsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFBO1FBRTlCLElBQUksS0FBSyxZQUFZLElBQUk7WUFBRSxPQUFPLEtBQUssQ0FBQTtRQUV2QyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7WUFBRSxPQUFPLElBQUksQ0FBQTtRQUUxQyxNQUFNLFdBQVcsR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUVuQyxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFBO0lBQ2pFLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILHlCQUF5QixDQUFDLEVBQUMsWUFBWSxFQUFFLFFBQVEsRUFBQztRQUNoRCxJQUFJLENBQUMsWUFBWTtZQUFFLE9BQU8sS0FBSyxDQUFBO1FBRS9CLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUUzRCxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2IsT0FBTyxRQUFRLENBQUMsZ0JBQWdCLEtBQUssTUFBTSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsSUFBSSxRQUFRLENBQUMsRUFBRSxDQUFDO21CQUNoRixRQUFRLENBQUMsa0JBQWtCLEtBQUssU0FBUyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQTtRQUN6RSxDQUFDO1FBRUQsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLENBQUMsaUNBQWlDLENBQUMsWUFBWSxDQUFDLENBQUE7UUFDcEYsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQTtRQUNyRSxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFDLENBQUE7UUFDN0UsTUFBTSxzQkFBc0IsR0FBRyxPQUFPLFlBQVksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUU3RyxPQUFPLHVCQUF1QixFQUFFLE9BQU8sRUFBRSxLQUFLLFFBQVEsQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFO2VBQzNFLHNCQUFzQixLQUFLLFFBQVEsQ0FBQyxjQUFjO2VBQ2xELGdCQUFnQixLQUFLLFFBQVEsQ0FBQyxRQUFRLENBQUE7SUFDN0MsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gscUJBQXFCLENBQUMsVUFBVSxFQUFFLGFBQWE7UUFDN0MsTUFBTSxNQUFNLEdBQUcsNERBQTRELENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUN4RixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUE7UUFFbkMsT0FBTyxPQUFPLEtBQUssS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQTtJQUNyRSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILHVCQUF1QixDQUFDLFVBQVU7UUFDaEMsSUFBSSxDQUFDLFVBQVU7WUFBRSxPQUFPLElBQUksQ0FBQTtRQUU1QixPQUFPLHlCQUF5QixDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUE7SUFDM0YsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJO1FBQzVCLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQTtZQUVuRSxJQUFJLFlBQVk7Z0JBQUUsT0FBTyxNQUFNLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUNqRCxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFO2dCQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQTtRQUN2SCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFBRSxPQUFPLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxDQUFBO1FBRS9FLE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQztJQUVEOzs7T0FHRztJQUNILGlCQUFpQjtRQUNmLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUE7SUFDbEUsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILDBCQUEwQixDQUFDLFlBQVk7UUFDckMsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsNEJBQTRCLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBRWhGLElBQUksb0JBQW9CLEtBQUssU0FBUztZQUFFLE9BQU8sb0JBQW9CLENBQUE7UUFFbkUsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGlDQUFpQyxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBRXpFLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFBO1FBRWpFLE9BQU8sWUFBWSxDQUFBO0lBQ3JCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsaUNBQWlDLENBQUMsWUFBWTtRQUM1QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUUzRCxJQUFJLFFBQVEsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM3QyxPQUFPLEVBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLHFCQUFxQixFQUFFLElBQUksRUFBQyxDQUFBO1FBQ3hGLENBQUM7UUFFRCxNQUFNLG9CQUFvQixHQUFHLE9BQU8sUUFBUSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUE7UUFFbkYsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhO1lBQUUsT0FBTyxJQUFJLENBQUE7UUFFcEMsTUFBTSxvQkFBb0IsR0FBRyxpQ0FBaUMsQ0FBQyxFQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBQyxDQUFDLENBQUE7UUFFdkksSUFBSSxDQUFDLG9CQUFvQjtZQUFFLE9BQU8sSUFBSSxDQUFBO1FBRXRDLE9BQU87WUFDTCxTQUFTLEVBQUUsb0JBQW9CLENBQUMsU0FBUztZQUN6QyxhQUFhLEVBQUUsb0JBQW9CLENBQUMsYUFBYTtZQUNqRCxxQkFBcUIsRUFBRSxvQkFBb0IsQ0FBQyxxQkFBcUI7U0FDbEUsQ0FBQTtJQUNILENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEtBQUs7UUFDMUIsT0FBTyxFQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxJQUFJLFNBQVMsRUFBRSxjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWMsSUFBSSxFQUFFLEVBQUMsQ0FBQTtJQUN4RixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxLQUFLLENBQUMsbUJBQW1CLENBQUMsRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUM7UUFDaEUsTUFBTSxhQUFhLEdBQUcsd0NBQXdDLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBQzFGLE1BQU0sRUFBQyxPQUFPLEVBQUUsY0FBYyxFQUFDLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQTtRQUUvRSxPQUFPLElBQUksYUFBYSxDQUFDO1lBQ3ZCLE9BQU87WUFDUCxPQUFPLEVBQUUsY0FBYztZQUN2QixNQUFNLEVBQUUsRUFBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBQztZQUNwRyxTQUFTLEVBQUUsWUFBWSxDQUFDLFNBQVM7WUFDakMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxJQUFJO1lBQ3JCLEdBQUcsQ0FBQyxZQUFZLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLEVBQUMscUJBQXFCLEVBQUUsWUFBWSxDQUFDLHFCQUFxQixFQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUMzRyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxLQUFLLENBQUMseUJBQXlCLENBQUMsRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUM7UUFDdEUsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUUzRSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDbEIsTUFBTSxjQUFjLENBQUMsSUFBSSxDQUFDLCtCQUErQixRQUFRLENBQUMsWUFBWSxHQUFHLEVBQUUsRUFBQyxJQUFJLEVBQUUsdUJBQXVCLEVBQUMsQ0FBQyxDQUFBO1FBQ3JILENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBQyxDQUFDLENBQUE7UUFDekYsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUE7UUFFckYsSUFBSSxpQkFBaUIsS0FBSyxJQUFJO1lBQUUsT0FBTyxpQkFBaUIsQ0FBQTtRQUV4RCxNQUFNLGFBQWEsR0FBRyxNQUFNLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUMsQ0FBQyxDQUFBO1FBRS9FLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDM0IsTUFBTSxjQUFjLENBQUMsSUFBSSxDQUFDLDZCQUE2QixRQUFRLENBQUMsWUFBWSxHQUFHLEVBQUUsRUFBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLE1BQU0sSUFBSSxlQUFlLEVBQUMsQ0FBQyxDQUFBO1FBQ25JLENBQUM7UUFFRCxJQUFJLFFBQVEsQ0FBQyxRQUFRLEtBQUssUUFBUTtZQUFFLE9BQU8sTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQUMsRUFBQyxRQUFRLEVBQUUsUUFBUSxFQUFDLENBQUMsQ0FBQTtRQUVuRyxNQUFNLGtCQUFrQixHQUFHLE1BQU0sSUFBSSxDQUFDLHdCQUF3QixDQUFDLEVBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUMsQ0FBQyxDQUFBO1FBRTdGLElBQUksa0JBQWtCLEtBQUssSUFBSTtZQUFFLE9BQU8sa0JBQWtCLENBQUE7UUFFMUQsT0FBTyxNQUFNLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxFQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFDLENBQUMsQ0FBQTtJQUMxRSxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLHdCQUF3QixDQUFDLEVBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUM7UUFDMUQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzFELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixDQUFDLEVBQUMsYUFBYSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUSxFQUFDLENBQUMsQ0FBQTtRQUV6RyxJQUFJLENBQUMsaUJBQWlCO1lBQUUsT0FBTyxJQUFJLENBQUE7UUFFbkMsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO1FBRWhFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNuQixNQUFNLGNBQWMsQ0FBQyxJQUFJLENBQUMscUNBQXFDLFFBQVEsQ0FBQyxZQUFZLElBQUksUUFBUSxDQUFDLFFBQVEsR0FBRyxFQUFFLEVBQUMsSUFBSSxFQUFFLDhCQUE4QixFQUFDLENBQUMsQ0FBQTtRQUN2SixDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEVBQUMsYUFBYSxFQUFFLGlCQUFpQixFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUE7UUFDdEYsTUFBTSxNQUFNLEdBQUcsTUFBTSxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFBO1FBRTVFLE1BQU0sV0FBVyxHQUFHLE1BQU0sUUFBUSxDQUFDLGNBQWMsQ0FBQyxFQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQTtRQUNwRyxNQUFNLFlBQVksR0FBRyxNQUFNLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7UUFFakcsT0FBTyxFQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxZQUFZLEVBQUUsR0FBRyxXQUFXLEVBQUMsQ0FBQTtJQUMvRyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILHFCQUFxQixDQUFDLFFBQVE7UUFDNUIsTUFBTSxNQUFNLEdBQUcsNERBQTRELENBQUMsQ0FBQyxRQUFRLENBQUMsMEJBQTBCLElBQUksRUFBRSxDQUFDLENBQUE7UUFFdkgsT0FBTztZQUNMLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxrQkFBa0IsSUFBSSxFQUFFO1lBQ25ELGNBQWMsRUFBRSxNQUFNLENBQUMsY0FBYyxJQUFJLEVBQUU7U0FDNUMsQ0FBQTtJQUNILENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILDRCQUE0QixDQUFDLEVBQUMsYUFBYSxFQUFFLFFBQVEsRUFBQztRQUNwRCxJQUFJLGFBQWEsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDO1lBQUUsT0FBTyxRQUFRLENBQUE7UUFDM0QsSUFBSSxhQUFhLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDO1lBQUUsT0FBTyxRQUFRLENBQUE7UUFFL0QsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILHNCQUFzQixDQUFDLEVBQUMsYUFBYSxFQUFFLGlCQUFpQixFQUFFLFFBQVEsRUFBQztRQUNqRSxNQUFNLFFBQVEsR0FBRyxhQUFhLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLEtBQUssU0FBUyxDQUFBO1FBRTlFLElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixPQUFPLEVBQUMsR0FBRyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsVUFBVSxFQUFDLENBQUE7UUFDcEQsQ0FBQztRQUVELE9BQU8sRUFBQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUMsQ0FBQTtJQUMzQixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNILEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxFQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUM7UUFDaEQsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFBO1FBQ3hDLE1BQU0sU0FBUyxHQUFHLEtBQUssSUFBSSxFQUFFO1lBQzNCLE1BQU0sTUFBTSxHQUFHLE1BQU0sUUFBUSxDQUFDLGNBQWMsQ0FBQyxFQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFDLENBQUMsQ0FBQTtZQUV6RSxJQUFJLENBQUMsTUFBTTtnQkFBRSxPQUFPLEVBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUMsQ0FBQTtZQUVsRSxNQUFNLGNBQWMsR0FBRyxNQUFNLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxFQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFDLENBQUMsQ0FBQTtZQUUxSCxJQUFJLGNBQWM7Z0JBQUUsT0FBTyxjQUFjLENBQUE7WUFFekMsTUFBTSxrQkFBa0IsR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUE7WUFFbEQsSUFBSSxDQUFDO2dCQUNILE1BQU0sTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFBO1lBQ3hCLENBQUM7b0JBQVMsQ0FBQztnQkFDVCxrQkFBa0IsRUFBRSxDQUFBO1lBQ3RCLENBQUM7WUFFRCxPQUFPLEVBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBQyxDQUFBO1FBQ2hELENBQUMsQ0FBQTtRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCO1lBQUUsT0FBTyxNQUFNLFNBQVMsRUFBRSxDQUFBO1FBRXBELE9BQU8sTUFBTSxVQUFVLENBQUMsZ0JBQWdCLENBQUMsMEJBQTBCLENBQUMsRUFBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLFlBQVksRUFBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLEVBQUMsbUJBQW1CLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQTtJQUN0TCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7T0FnQkc7SUFDSCxLQUFLLENBQUMsdUJBQXVCLENBQUMsRUFBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBQztRQUN6RCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsRUFBQyxRQUFRLEVBQUUsUUFBUSxFQUFDLENBQUMsQ0FBQTtRQUN2RSxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUE7UUFDeEMsTUFBTSxTQUFTLEdBQUcsS0FBSyxJQUFJLEVBQUU7WUFDM0IsTUFBTSxjQUFjLEdBQUcsTUFBTSxRQUFRLENBQUMsY0FBYyxDQUFDLEVBQUMsUUFBUSxFQUFDLENBQUMsQ0FBQTtZQUNoRSxNQUFNLGNBQWMsR0FBRyxNQUFNLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxFQUFDLFVBQVUsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUE7WUFFOUcsSUFBSSxjQUFjO2dCQUFFLE9BQU8sY0FBYyxDQUFBO1lBRXpDLG1FQUFtRTtZQUNuRSxJQUFJLE1BQU0sR0FBRyxjQUFjLENBQUE7WUFDM0IsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFBO1lBRW5CLElBQUksY0FBYyxFQUFFLENBQUM7Z0JBQ25CLE1BQU0sa0JBQWtCLEdBQUcsZUFBZSxDQUFDLGNBQWMsQ0FBQyxDQUFBO2dCQUUxRCxJQUFJLENBQUM7b0JBQ0gsY0FBYyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQTtvQkFDakMsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsY0FBYyxDQUFDLENBQUE7Z0JBQ25ELENBQUM7d0JBQVMsQ0FBQztvQkFDVCxrQkFBa0IsRUFBRSxDQUFBO2dCQUN0QixDQUFDO1lBQ0gsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxFQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFDLENBQUMsQ0FBQTtnQkFDOUUsT0FBTyxHQUFHLElBQUksQ0FBQTtZQUNoQixDQUFDO1lBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsY0FBYyxDQUFDLEVBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQTtZQUVsRixPQUFPLEVBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxFQUFDLENBQUE7UUFDckQsQ0FBQyxDQUFBO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0I7WUFBRSxPQUFPLE1BQU0sU0FBUyxFQUFFLENBQUE7UUFFcEQsT0FBTyxNQUFNLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQywwQkFBMEIsQ0FBQyxFQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxRQUFRLENBQUMsWUFBWSxFQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsRUFBQyxtQkFBbUIsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO0lBQ3RMLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7T0FXRztJQUNILEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxFQUFDLFVBQVUsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBQztRQUMvRSxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQjtZQUFFLE9BQU8sSUFBSSxDQUFBO1FBQ3ZDLElBQUksQ0FBQyxjQUFjLElBQUksUUFBUSxDQUFDLFFBQVEsS0FBSyxRQUFRO1lBQUUsT0FBTyxJQUFJLENBQUE7UUFDbEUsSUFBSSxRQUFRLENBQUMsV0FBVyxLQUFLLFNBQVMsSUFBSSxRQUFRLENBQUMsV0FBVyxLQUFLLElBQUk7WUFBRSxPQUFPLElBQUksQ0FBQTtRQUVwRixNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUE7UUFDeEMsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFBO1FBQzFDLE1BQU0sbUJBQW1CLEdBQUcsVUFBVSxDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQ3ZFLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFBO1FBQy9ELE1BQU0sb0JBQW9CLEdBQUcsVUFBVSxDQUFDLG9CQUFvQixDQUFDLGdCQUFnQixDQUFDLENBQUE7UUFFOUUsSUFBSSxDQUFDLG1CQUFtQjtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLFVBQVUsRUFBRSxDQUFDLENBQUE7UUFDbEcsSUFBSSxDQUFDLG9CQUFvQjtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLGdCQUFnQixFQUFFLENBQUMsQ0FBQTtRQUVyRyxNQUFNLGFBQWEsR0FBRyxzQkFBc0IsQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQTtRQUVoRyxJQUFJLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxLQUFLLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQTtRQUVqRyxNQUFNLDRCQUE0QixHQUFHLE1BQU0sSUFBSSxDQUFDLGtDQUFrQyxDQUFDLEVBQUMsVUFBVSxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUMsQ0FBQyxDQUFBO1FBQzFILE1BQU0sZ0JBQWdCLEdBQUc7WUFDdkIsR0FBRyw0QkFBNEI7WUFDL0IsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxhQUFhLENBQUMsbUJBQW1CLENBQUM7WUFDeEUsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLGFBQWE7U0FDdEMsQ0FBQTtRQUVELE1BQU0sWUFBWSxHQUFHO1lBQ25CLFVBQVUsRUFBRSxnQkFBZ0I7WUFDNUIsT0FBTyxFQUFFLGFBQWE7U0FDdkIsQ0FBQTtRQUNELE1BQU0sZ0JBQWdCLEdBQUcsMERBQTBELENBQUMsRUFBQyxzQkFBdUIsQ0FBQztZQUMzRyxVQUFVO1lBQ1YsV0FBVyxFQUFFLFFBQVEsQ0FBQyxXQUFXO1lBQ2pDLGdCQUFnQixFQUFFLFFBQVEsQ0FBQyxnQkFBZ0IsSUFBSSxRQUFRLENBQUMsRUFBRTtZQUMxRCxLQUFLLEVBQUUsUUFBUSxDQUFDLFlBQVk7WUFDNUIsU0FBUyxFQUFFLFFBQVEsQ0FBQyxRQUFRO1lBQzVCLE9BQU8sRUFBRSxFQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsVUFBVSxFQUFDO1NBQ25DLENBQUMsQ0FBQyxDQUFBO1FBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQztZQUN2QyxVQUFVLEVBQUUsSUFBSTtZQUNoQixRQUFRLEVBQUUsZ0JBQWdCO1lBQzFCLFlBQVk7WUFDWixRQUFRLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsSUFBSSxtQkFBbUI7WUFDL0QsZ0JBQWdCO1NBQ2pCLENBQUMsQ0FBQTtRQUVGLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxVQUFVO1lBQUUsT0FBTyxJQUFJLENBQUE7UUFFN0MsT0FBTyxFQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUMsQ0FBQTtJQUNoSCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7T0FhRztJQUNILEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxFQUFDLFVBQVUsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFDO1FBQzdFLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQTtRQUN4QyxNQUFNLGFBQWEsR0FBRyxpRkFBaUYsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUM5SCxNQUFNLGtCQUFrQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7UUFDcEMsTUFBTSxvQkFBb0IsR0FBRyxhQUFhLENBQUMsY0FBYyxFQUFFLENBQUMsVUFBVSxDQUFBO1FBQ3RFLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO1FBRXhILElBQUksaUJBQWlCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ25DLE1BQU0seUJBQXlCLEdBQUcsVUFBVSxDQUFDLCtCQUErQixFQUFFLENBQUE7WUFFOUUsS0FBSyxNQUFNLGFBQWEsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEVBQUUsQ0FBQztnQkFDbkUsa0JBQWtCLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFBO1lBQ3ZDLENBQUM7UUFDSCxDQUFDO1FBRUQsS0FBSyxNQUFNLG1CQUFtQixJQUFJLGlCQUFpQixFQUFFLENBQUM7WUFDcEQsTUFBTSxjQUFjLEdBQUcsT0FBTyxtQkFBbUIsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUE7WUFFL0csSUFBSSxDQUFDLGNBQWM7Z0JBQUUsU0FBUTtZQUU3QixNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsb0JBQW9CLENBQUMsY0FBYyxDQUFDLENBQUE7WUFFckUsa0JBQWtCLENBQUMsR0FBRyxDQUFDLGFBQWEsSUFBSSxjQUFjLENBQUMsQ0FBQTtRQUN6RCxDQUFDO1FBRUQsNERBQTREO1FBQzVELE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxDQUFBO1FBRS9CLEtBQUssTUFBTSxhQUFhLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQ3BELE1BQU0sYUFBYSxHQUFHLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsQ0FBQTtZQUVwRSxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQztnQkFBRSxTQUFRO1lBRXRFLE1BQU0saUJBQWlCLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxHQUFHLGFBQWEsV0FBVyxDQUFDLENBQUE7WUFFOUUsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO2dCQUN0QixvQkFBb0IsQ0FBQyxhQUFhLENBQUMsR0FBRyxNQUFNLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxDQUFBO2dCQUNySCxTQUFRO1lBQ1YsQ0FBQztZQUVELE1BQU0sYUFBYSxHQUFHLDREQUE0RCxDQUFDLEVBQUMsc0JBQXVCLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQTtZQUM1SCxNQUFNLGVBQWUsR0FBRyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUE7WUFFcEQsSUFBSSxPQUFPLGVBQWUsS0FBSyxVQUFVLEVBQUUsQ0FBQztnQkFDMUMsb0JBQW9CLENBQUMsYUFBYSxDQUFDLEdBQUcsTUFBTSxlQUFlLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFBO1lBQ2xGLENBQUM7aUJBQU0sQ0FBQztnQkFDTixvQkFBb0IsQ0FBQyxhQUFhLENBQUMsR0FBRyxjQUFjLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFBO1lBQ25GLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxvQkFBb0IsQ0FBQTtJQUM3QixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSCx5QkFBeUIsQ0FBQyxFQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUM7UUFDNUMsTUFBTSxtQkFBbUIsR0FBRyxRQUFRLENBQUMsMEJBQTBCLEVBQUUsQ0FBQTtRQUVqRSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLCtFQUErRSxRQUFRLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQTtRQUNySixDQUFDO1FBRUQsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFBO1FBQ3hDLE1BQU0seUJBQXlCLEdBQUcsVUFBVSxDQUFDLCtCQUErQixFQUFFLENBQUE7UUFFOUUsMEJBQTBCO1FBQzFCLE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7UUFFN0IsS0FBSyxNQUFNLGFBQWEsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1lBQ2hELFdBQVcsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUE7WUFFOUIsTUFBTSxVQUFVLEdBQUcseUJBQXlCLENBQUMsYUFBYSxDQUFDLENBQUE7WUFFM0QsSUFBSSxVQUFVO2dCQUFFLFdBQVcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDN0MsQ0FBQztRQUVELE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQTtRQUMxQyxNQUFNLG1CQUFtQixHQUFHLFVBQVUsQ0FBQywrQkFBK0IsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBRXBGLDREQUE0RDtRQUM1RCxNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUE7UUFFckIsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDekQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDMUIsTUFBTSxRQUFRLENBQUMsc0JBQXNCLENBQUMsc0JBQXNCLEdBQUcsR0FBRyxFQUFFLEVBQUMsSUFBSSxFQUFFLHdCQUF3QixFQUFDLENBQUMsQ0FBQTtZQUN2RyxDQUFDO1lBRUQsSUFBSSxHQUFHLEtBQUssVUFBVSxJQUFJLEdBQUcsS0FBSyxtQkFBbUI7Z0JBQUUsU0FBUTtZQUUvRCxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFBO1FBQ3pCLENBQUM7UUFFRCxPQUFPLFVBQVUsQ0FBQTtJQUNuQixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7OztPQWVHO0lBQ0gsS0FBSyxDQUFDLHdCQUF3QixDQUFDLEVBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUM7UUFDN0QsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFBO1FBQ3hDLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQTtRQUMxQyxNQUFNLGNBQWMsR0FBRyxNQUFNLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxVQUFVLEVBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUVwRyxJQUFJLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDOUIsTUFBTSxjQUFjLENBQUMsSUFBSSxDQUFDLDJCQUEyQixRQUFRLENBQUMsWUFBWSxHQUFHLEVBQUU7Z0JBQzdFLElBQUksRUFBRSxRQUFRLENBQUMsOEJBQThCLENBQUMsRUFBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBQyxDQUFDLElBQUksZUFBZTthQUMvRixDQUFDLENBQUE7UUFDSixDQUFDO1FBRUQsTUFBTSxVQUFVLENBQUMsaUJBQWlCLEVBQUUsQ0FBQTtRQUVwQyxNQUFNLE1BQU0sR0FBRyxJQUFJLFVBQVUsQ0FBQyxFQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsUUFBUSxDQUFDLFVBQVUsRUFBRSxHQUFHLFVBQVUsRUFBQyxDQUFDLENBQUE7UUFDakYsTUFBTSxrQkFBa0IsR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUE7UUFFbEQsSUFBSSxDQUFDO1lBQ0gsSUFBSSxDQUFDO2dCQUNILE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxDQUFBO1lBQ3JCLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ3pDLENBQUM7WUFFRCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFBO1lBRWhDLElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQ1osTUFBTSxTQUFTLEdBQUcsTUFBTSxVQUFVO3FCQUMvQixhQUFhLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxFQUFFLE9BQU8sQ0FBQztxQkFDNUQsS0FBSyxDQUFDLEVBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztxQkFDbEMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFBO2dCQUVwQixJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQzNCLE1BQU0sTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFBO29CQUV0QixNQUFNLGNBQWMsQ0FBQyxJQUFJLENBQUMsMkJBQTJCLFFBQVEsQ0FBQyxZQUFZLEdBQUcsRUFBRTt3QkFDN0UsSUFBSSxFQUFFLFFBQVEsQ0FBQyw4QkFBOEIsQ0FBQyxFQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFDLENBQUMsSUFBSSxlQUFlO3FCQUMvRixDQUFDLENBQUE7Z0JBQ0osQ0FBQztZQUNILENBQUM7WUFFRCxPQUFPLE1BQU0sQ0FBQTtRQUNmLENBQUM7Z0JBQVMsQ0FBQztZQUNULGtCQUFrQixFQUFFLENBQUE7UUFDdEIsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNO1FBQ2pDLElBQUksQ0FBQztZQUNILE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxDQUFBO1FBQ3JCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDekMsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxxQkFBcUIsQ0FBQyxLQUFLO1FBQ3pCLElBQUksS0FBSyxZQUFZLGVBQWUsRUFBRSxDQUFDO1lBQ3JDLE9BQU8sY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUMsQ0FBQyxDQUFBO1FBQ3JGLENBQUM7UUFFRCxPQUFPLG9CQUFvQixDQUFDLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDckMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBQztRQUNsRSxJQUFJLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEVBQUMsWUFBWSxFQUFFLFFBQVEsRUFBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFBRSxPQUFPLElBQUksQ0FBQTtRQUV2RyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBRTNFLElBQUksQ0FBQyxZQUFZO1lBQUUsT0FBTyxJQUFJLENBQUE7UUFFOUIsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUMsQ0FBQyxDQUFBO1FBQ3pGLE1BQU0sTUFBTSxHQUFHLE1BQU0sUUFBUSxDQUFDLGNBQWMsQ0FBQyxFQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsUUFBUSxLQUFLLFFBQVEsRUFBRSxRQUFRLEVBQUMsQ0FBQyxDQUFBO1FBRW5HLE9BQU8sRUFBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUMsQ0FBQTtJQUNsRSxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxFQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFDO1FBQzVGLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUztZQUFFLE9BQU07UUFFM0IsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUE7UUFFbEUsNEVBQTRFO1FBQzVFLDhEQUE4RDtRQUM5RCxJQUFJLElBQUksQ0FBQyxzQkFBc0IsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUMvQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsRUFBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBQyxDQUFDLENBQUMsQ0FBQTtRQUM1SCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMscUJBQXFCLElBQUksV0FBVyxFQUFFLENBQUM7WUFDOUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEVBQUMsV0FBVyxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUE7WUFFMUUsSUFBSSxjQUFjLEtBQUssU0FBUyxJQUFJLGNBQWMsS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDNUQsVUFBVSxDQUFDLElBQUksR0FBRyxPQUFPLGNBQWMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQTtZQUN4RyxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLGdCQUFnQixJQUFJLFdBQVcsSUFBSSxRQUFRLENBQUMsV0FBVyxLQUFLLFNBQVMsSUFBSSxXQUFXLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDdEcsTUFBTSxhQUFhLEdBQUcseUJBQXlCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQTtZQUN4RSxNQUFNLHNCQUFzQixHQUFHLHNCQUFzQixDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUE7WUFFL0gsVUFBVSxDQUFDLElBQUksR0FBRyw0QkFBNEIsQ0FBQztnQkFDN0Msc0JBQXNCO2dCQUN0QixnQkFBZ0IsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLGdCQUFnQixJQUFJLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQ2xFLE9BQU8sRUFBRSxhQUFhO2dCQUN0QixrQkFBa0IsRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQzthQUN2RCxDQUFDLENBQUE7UUFDSixDQUFDO1FBRUQsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNqQixNQUFNLHVCQUF1QixHQUFHLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxZQUFZLENBQUMsQ0FBQTtZQUVwRixJQUFJLHVCQUF1QixJQUFJLFFBQVEsQ0FBQyxlQUFlLElBQUksdUJBQXVCO2dCQUFFLE9BQU07UUFDNUYsQ0FBQztRQUVELE1BQU0sYUFBYSxDQUFDLEVBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBQyxDQUFDLENBQUE7SUFDNUUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCx1QkFBdUIsQ0FBQyxFQUFDLEtBQUssRUFBRSxRQUFRLEVBQUM7UUFDdkMsT0FBTztZQUNMLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7WUFDdkQsaUJBQWlCLEVBQUUsUUFBUSxDQUFDLGVBQWU7WUFDM0MsSUFBSSxFQUFFLFFBQVEsQ0FBQyxjQUFjO1lBQzdCLFdBQVcsRUFBRSxRQUFRLENBQUMsVUFBVTtZQUNoQyxhQUFhLEVBQUUsUUFBUSxDQUFDLFlBQVk7WUFDcEMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxRQUFRO1NBQzdCLENBQUE7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJO1FBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVc7WUFBRSxPQUFNO1FBQ2pELDRFQUE0RTtRQUM1RSwrRUFBK0U7UUFDL0UsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTTtRQUU3QixNQUFNLHlCQUF5QixDQUFDLEVBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFDLENBQUMsQ0FBQTtJQUNyRyxDQUFDO0NBQ0Y7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxVQUFVLDBCQUEwQixDQUFDLEVBQUMsVUFBVSxFQUFFLFlBQVksRUFBQztJQUNuRSxNQUFNLFFBQVEsR0FBRyxtQkFBbUIsQ0FBQyxFQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUMsQ0FBQyxDQUFBO0lBQ2hFLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBRTdDLE9BQU8sT0FBTyxJQUFJLEVBQUUsQ0FBQTtBQUN0QixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQVMsc0JBQXNCLENBQUMsS0FBSztJQUNuQyxJQUFJLEtBQUssWUFBWSxJQUFJO1FBQUUsT0FBTyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUE7SUFFckQsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7ZGVsaXZlckRlY2xhcmVkQnJvYWRjYXN0cywgdXBzZXJ0U3luY1Jvd30gZnJvbSBcIi4vc3luYy1jaGFuZ2UtZmFub3V0LmpzXCJcbmltcG9ydCB7ZnJvbnRlbmRNb2RlbFJlc291cmNlSW50ZXJuYWxDb25zdHJ1Y3Rvcn0gZnJvbSBcIi4uL2Zyb250ZW5kLW1vZGVsLXJlc291cmNlL2Jhc2UtcmVzb3VyY2UuanNcIlxuaW1wb3J0IHttYXJrU2VydmVyQXBwbHl9IGZyb20gXCIuL3N5bmMtcHVibGlzaC1zdXBwcmVzc2lvbi5qc1wiXG5pbXBvcnQge3Jlc29sdmVGcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc30gZnJvbSBcIi4uL2Zyb250ZW5kLW1vZGVscy9yZXNvdXJjZS1kZWZpbml0aW9uLmpzXCJcbmltcG9ydCB7cmVzb2x2ZVN5bmNDb25mbGljdH0gZnJvbSBcIi4vY29uZmxpY3Qtc3RyYXRlZ3kuanNcIlxuaW1wb3J0IFN5bmNSZXBsYXlVcHNlcnRBcHBsaWVyIGZyb20gXCIuL3N5bmMtcmVwbGF5LXVwc2VydC1hcHBsaWVyLmpzXCJcbmltcG9ydCBzdGFibGVKc29uU3RyaW5naWZ5IGZyb20gXCIuL3N0YWJsZS1qc29uLmpzXCJcbmltcG9ydCBzaGEyNTZIZXggZnJvbSBcIi4uL3V0aWxzL3NoYTI1Ni1oZXguanNcIlxuaW1wb3J0IHtkZWNvZGVSZXBsYXlQZXJzaXN0ZWREYXRhLCBzZXJpYWxpemVSZXBsYXlQZXJzaXN0ZWREYXRhfSBmcm9tIFwiLi9zeW5jLXJlcGxheS1wZXJzaXN0ZWQtZGF0YS5qc1wiXG5pbXBvcnQge1ZhbGlkYXRpb25FcnJvcn0gZnJvbSBcIi4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiXG5pbXBvcnQgVmVsb2Npb3VzRXJyb3IgZnJvbSBcIi4uL3ZlbG9jaW91cy1lcnJvci5qc1wiXG5cbi8qKlxuICogUmVzb2x2ZWQgcm91dGVkLXJlc291cmNlIHJlZ2lzdHJhdGlvbiBmb3Igb25lIHJlcGxheSByZXNvdXJjZSB0eXBlLlxuICogQHR5cGVkZWYge29iamVjdH0gU3luY1JlcGxheVJlc291cmNlUmVnaXN0cmF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbW9kZWxOYW1lIC0gRWZmZWN0aXZlIGZyb250ZW5kIG1vZGVsIG5hbWUuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlfSByZXNvdXJjZUNsYXNzIC0gUm91dGVkIHJlc291cmNlIGNsYXNzLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLk5vcm1hbGl6ZWRGcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9uIHwgbnVsbH0gcmVzb3VyY2VDb25maWd1cmF0aW9uIC0gTm9ybWFsaXplZCByZXNvdXJjZSBjb25maWd1cmF0aW9uIHdoZW4gcmVnaXN0cnktcmVzb2x2ZWQuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3luY1JlcGxheU11dGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bWJlciB8IG51bGx9IFtiYXNlVmVyc2lvbl0gLSBCYXNlIHNlcnZlci9jbGllbnQgdmVyc2lvbiBvYnNlcnZlZCBieSB0aGUgY2xpZW50LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjbGllbnRNdXRhdGlvbklkXSAtIE9yaWdpbmFsIGNsaWVudCBtdXRhdGlvbiBpZCBmcm9tIHRoZSBzaWduZWQgZW52ZWxvcGUuXG4gKiBAcHJvcGVydHkge0RhdGV9IGNsaWVudFVwZGF0ZWRBdCAtIENsaWVudC1zaWRlIG11dGF0aW9uIHRpbWVzdGFtcC5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBkYXRhIC0gUGFyc2VkIG11dGF0aW9uIHBheWxvYWQuXG4gKiBAcHJvcGVydHkge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBpZCAtIENsaWVudCBzeW5jIHJvdyBpZCBmb3IgcGVyLXN5bmMgcmVzcG9uc2VzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHJlc291cmNlSWQgLSBSZXNvdXJjZSBpZCBhcyBhIHN0cmluZy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByZXNvdXJjZVR5cGUgLSBSZXNvdXJjZS9tb2RlbCBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNlcmlhbGl6ZWREYXRhIC0gSlNPTiBzZXJpYWxpemVkIG11dGF0aW9uIHBheWxvYWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3luY1R5cGUgLSBTeW5jIG9wZXJhdGlvbiB0eXBlLlxuICovXG4vKipcbiAqIE9uZSBkZWNsYXJhdGl2ZSBicm9hZGNhc3QgZmFubmVkIG91dCBhZnRlciBhIG11dGF0aW9uIGFwcGxpZXMuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTeW5jUmVwbGF5QnJvYWRjYXN0XG4gKiBAcHJvcGVydHkge3N0cmluZyB8ICgoYXJnczogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+KSA9PiBzdHJpbmcpfSBjaGFubmVsIC0gQ2hhbm5lbCBuYW1lIG9yIHJlc29sdmVyLlxuICogQHByb3BlcnR5IHsoYXJnczogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+KSA9PiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IGJyb2FkY2FzdFBhcmFtcyAtIENoYW5uZWwgcm91dGluZyBwYXJhbXMuXG4gKiBAcHJvcGVydHkgeyhhcmdzOiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4pID0+IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBib2R5IC0gQnJvYWRjYXN0IGJvZHkuXG4gKiBAcHJvcGVydHkgeyhhcmdzOiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4pID0+IGJvb2xlYW59IFt3aGVuXSAtIE9wdGlvbmFsIGdhdGU7IHNraXBwZWQgd2hlbiBpdCByZXR1cm5zIGZhbHNlLlxuICovXG5cbi8qKlxuICogUmVwbGF5cyBjbGllbnQgc3luYyBlbnZlbG9wZXMgdGhyb3VnaCBwcm9qZWN0IHN1cHBsaWVkIGF1dGhlbnRpY2F0aW9uLFxuICogYXV0aG9yaXphdGlvbiwgYXBwbGljYXRpb24sIGFuZCBwZXJzaXN0ZW5jZSBob29rcy5cbiAqXG4gKiBUaGlzIGlzIGludGVudGlvbmFsbHkgdHJhbnNwb3J0L21vZGVsIGFnbm9zdGljOiBWZWxvY2lvdXMgb3ducyB0aGUgZ2VuZXJpY1xuICogcmVwbGF5IGxvb3AsIG5vcm1hbGl6YXRpb24sIHN0YWxlLWNsaWVudCBjb21wYXJpc29uLCBhbmQgcGVyLXN5bmMgcmVzdWx0XG4gKiBzaGFwZSB3aGlsZSBlYWNoIGFwcCBvd25zIGl0cyB0b2tlbiBsb29rdXAsIG1vZGVsIGhhbmRsZXJzLCBhbmRcbiAqIGRvbWFpbiBhdXRob3JpemF0aW9uIHJ1bGVzLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTeW5jRW52ZWxvcGVSZXBsYXlTZXJ2aWNlIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBzeW5jIGVudmVsb3BlIHJlcGxheSBzZXJ2aWNlLlxuICAgKlxuICAgKiBXaGVuIGEgc3luYyBtb2RlbCBpcyBnaXZlbiwgYGZpbmRFeGlzdGluZ1JlcGxheVN5bmNgIGFuZFxuICAgKiBgcGVyc2lzdFJlcGxheU11dGF0aW9uYCBnZXQgbW9kZWwtYmFja2VkIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zLiBUaGUgc3luY1xuICAgKiBtb2RlbCBtdXN0IGV4cG9zZSBgZmluZEJ5YC9gY3JlYXRlYCBzdGF0aWNzIHBsdXMgaW5zdGFuY2VcbiAgICogYGFzc2lnbmAvYHNhdmVgL2BjbGllbnRVcGRhdGVkQXRgIGFuZCBgYWR2YW5jZVNlcnZlclNlcXVlbmNlYCAodGhlXG4gICAqIGNoYW5nZS1mZWVkIHNlcXVlbmNlIGNvbnRyYWN0KSwgYW5kIHRoZSBhY3RvciByZXR1cm5lZCBmcm9tXG4gICAqIGBhdXRoZW50aWNhdGVSZXBsYXlgIG11c3QgZXhwb3NlIGFuIGBpZCgpYCBtZXRob2QuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbYXJnc10gLSBDb25zdHJ1Y3RvciBhcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7e2RlYnVnPzogKC4uLmFyZ3M6IEFycmF5PHVua25vd24+KSA9PiB2b2lkLCB3YXJuPzogKC4uLmFyZ3M6IEFycmF5PHVua25vd24+KSA9PiB2b2lkfX0gW2FyZ3MubG9nZ2VyXSAtIExvZ2dlciB1c2VkIGZvciBub3JtYWxpemF0aW9uIHdhcm5pbmdzLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBbYXJncy5zeW5jTW9kZWxdIC0gU3luYy9jaGFuZ2UgbW9kZWwgZW5hYmxpbmcgbW9kZWwtYmFja2VkIGRlZmF1bHQgaG9va3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5hY3RvckZvcmVpZ25LZXlDb2x1bW5dIC0gU3luYyBtb2RlbCBjb2x1bW4gbGlua2luZyByb3dzIHRvIHRoZSByZXBsYXkgYWN0b3IuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IFthcmdzLmF1dGhlbnRpY2F0aW9uVG9rZW5Nb2RlbF0gLSBUb2tlbiBtb2RlbCBlbmFibGluZyB0aGUgZGVmYXVsdCB0b2tlbi1sb29rdXAgYXV0aGVudGljYXRlUmVwbGF5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuYXV0aGVudGljYXRpb25Ub2tlbkNvbHVtbl0gLSBUb2tlbiBtb2RlbCBjb2x1bW4gaG9sZGluZyB0aGUgdG9rZW4uIERlZmF1bHRzIHRvIFwidG9rZW5cIi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmF1dGhlbnRpY2F0aW9uVG9rZW5QYXJhbV0gLSBSZXF1ZXN0IHBhcmFtIGNhcnJ5aW5nIHRoZSB0b2tlbi4gRGVmYXVsdHMgdG8gXCJhdXRoZW50aWNhdGlvblRva2VuXCIuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgKChhcmdzOiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4pID0+IFByb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+KSB8IENvbnN0cnVjdG9yUGFyYW1ldGVyczx0eXBlb2YgU3luY1JlcGxheVVwc2VydEFwcGxpZXI+WzBdPn0gW2FyZ3MuYXBwbHlIYW5kbGVyc10gLSBQZXItcmVzb3VyY2VUeXBlIGFwcGx5IGhhbmRsZXJzIChmdW5jdGlvbnMgb3IgZGVjbGFyYXRpdmUgdXBzZXJ0LWFwcGxpZXIgc3BlY3MpIGVuYWJsaW5nIHRoZSBkZWZhdWx0IGFwcGx5UmVwbGF5TXV0YXRpb24gZGlzcGF0Y2guIERlcHJlY2F0ZWQ6IHByZWZlciByZXNvdXJjZSByb3V0aW5nIHZpYSBgY29uZmlndXJhdGlvbmAvYHJlc291cmNlVHlwZU92ZXJyaWRlc2A7IGFwcGx5SGFuZGxlcnMgcmVtYWluIGZvciByZWxlYXNlZCBhZG9wdGVycyBhbmQgd2lsbCBiZSByZW1vdmVkIGFmdGVyIHRoZWlyIG1pZ3JhdGlvbi5cbiAgICogQHBhcmFtIHsoYXJnczogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+KSA9PiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IFthcmdzLnBlcnNpc3RFeHRyYUF0dHJpYnV0ZXNdIC0gRXh0cmEgYXR0cmlidXRlcyBtZXJnZWQgaW50byB0aGUgbW9kZWwtYmFja2VkIHBlcnNpc3RlZCByb3cgKGUuZy4gYW4gZXZlbnQgc2NvcGUgY29sdW1uKS5cbiAgICogQHBhcmFtIHsoYXJnczoge211dGF0aW9uOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgYXBwbHlSZXN1bHQ6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSkgPT4gUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IFthcmdzLnBlcnNpc3RTZXJpYWxpemVkRGF0YV0gLSBPdmVycmlkZXMgdGhlIHBlcnNpc3RlZCBkYXRhIHBheWxvYWQgKG9iamVjdCByZXN1bHRzIGFyZSBKU09OIHN0cmluZ2lmaWVkKS5cbiAgICogQHBhcmFtIHsoYnJvYWRjYXN0OiB7Y2hhbm5lbDogc3RyaW5nLCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PiwgYm9keTogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59KSA9PiBQcm9taXNlPHZvaWQ+fSBbYXJncy5icm9hZGNhc3Rlcl0gLSBEZWxpdmVycyBkZWNsYXJhdGl2ZSBicm9hZGNhc3RzLiBSZXF1aXJlZCB3aGVuIGJyb2FkY2FzdHMgYXJlIGNvbmZpZ3VyZWQuXG4gICAqIEBwYXJhbSB7U3luY1JlcGxheUJyb2FkY2FzdFtdfSBbYXJncy5icm9hZGNhc3RzXSAtIEJyb2FkY2FzdHMgZmFubmVkIG91dCBieSB0aGUgZGVmYXVsdCBhZnRlclJlcGxheU11dGF0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gW2FyZ3MuY29uZmlndXJhdGlvbl0gLSBDb25maWd1cmF0aW9uIHdob3NlIGZyb250ZW5kLW1vZGVsIHJlZ2lzdHJ5IHJvdXRlcyBtdXRhdGlvbnMgdG8gcmVzb3VyY2UgY2xhc3Nlcy5cbiAgICogQHBhcmFtIHt7c3RyYXRlZ3k/OiBcIm9wdGltaXN0aWNWZXJzaW9uXCIgfCBcInNlcnZlcldpbnNcIiwgdmVyc2lvbkF0dHJpYnV0ZTogc3RyaW5nfSB8IG51bGx9IFthcmdzLmNvbmZsaWN0U3RyYXRlZ3ldIC0gT3B0aW9uYWwgYmFzZS12ZXJzaW9uIGNvbmZsaWN0IGRldGVjdGlvbiBmb3Igcm91dGVkIHVwc2VydHMuIE9ubHkgYG9wdGltaXN0aWNWZXJzaW9uYCBhbmQgYHNlcnZlcldpbnNgIGFyZSBzdXBwb3J0ZWQgZm9yIGJhY2tlbmQgcmVwbGF5IGJlY2F1c2UgdGhlIHNlcnZlciBkb2VzIG5vdCBoYXZlIHRoZSBjbGllbnQncyBiYXNlIHNuYXBzaG90LiBXaGVuIGBzdHJhdGVneWAgaXMgb21pdHRlZCBpdCBkZWZhdWx0cyB0byBgb3B0aW1pc3RpY1ZlcnNpb25gLCBtYXRjaGluZyBgcmVzb2x2ZVN5bmNDb25mbGljdGAgYW5kIG5vcm1hbGl6ZWQgcmVzb3VyY2UgY29uZmlnLiBXaGVuIGNvbmZpZ3VyZWQsIGEgbXV0YXRpb24gd2hvc2UgYmFzZVZlcnNpb24gZG9lcyBub3QgbWF0Y2ggdGhlIGN1cnJlbnQgc2VydmVyIHZlcnNpb25BdHRyaWJ1dGUgaXMgcmVqZWN0ZWQgd2l0aCBhIHN0cnVjdHVyZWQgY29uZmxpY3QgcmVzdWx0IGluc3RlYWQgb2YgYmVpbmcgYXBwbGllZC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZSB8IHN0cmluZz59IFthcmdzLnJlc291cmNlVHlwZU92ZXJyaWRlc10gLSBQZXItcmVzb3VyY2VUeXBlIHJvdXRpbmcgb3ZlcnJpZGVzOiBhIHJlc291cmNlIGNsYXNzLCBvciBhIHN0cmluZyBhbGlhcyByZXNvbHZlZCB0aHJvdWdoIHRoZSByZWdpc3RyeS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9hdXRob3JpemF0aW9uL2FiaWxpdHkuanNcIikuZGVmYXVsdH0gW2FyZ3MuYWJpbGl0eV0gLSBBYmlsaXR5IHNjb3Bpbmcgcm91dGVkIHJlY29yZCBsb29rdXBzIGFuZCBjcmVhdGUgbWVtYmVyc2hpcCBjaGVja3MuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBbYXJncy5hYmlsaXR5Q29udGV4dF0gLSBBYmlsaXR5IGNvbnRleHQgcGFzc2VkIHRvIHJvdXRlZCByZXNvdXJjZXMuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBbYXJncy5sb2NhbHNdIC0gTG9jYWxzIHBhc3NlZCB0byByb3V0ZWQgcmVzb3VyY2VzLlxuICAgKi9cbiAgY29uc3RydWN0b3IoYXJncyA9IHt9KSB7XG4gICAgdGhpcy5sb2dnZXIgPSBhcmdzLmxvZ2dlciB8fCBjb25zb2xlXG4gICAgdGhpcy5zeW5jTW9kZWwgPSBhcmdzLnN5bmNNb2RlbCB8fCBudWxsXG4gICAgdGhpcy5hY3RvckZvcmVpZ25LZXlDb2x1bW4gPSBhcmdzLmFjdG9yRm9yZWlnbktleUNvbHVtbiB8fCBcImF1dGhlbnRpY2F0aW9uX3Rva2VuX2lkXCJcbiAgICB0aGlzLmF1dGhlbnRpY2F0aW9uVG9rZW5Nb2RlbCA9IGFyZ3MuYXV0aGVudGljYXRpb25Ub2tlbk1vZGVsIHx8IG51bGxcbiAgICB0aGlzLmF1dGhlbnRpY2F0aW9uVG9rZW5Db2x1bW4gPSBhcmdzLmF1dGhlbnRpY2F0aW9uVG9rZW5Db2x1bW4gfHwgXCJ0b2tlblwiXG4gICAgdGhpcy5hdXRoZW50aWNhdGlvblRva2VuUGFyYW0gPSBhcmdzLmF1dGhlbnRpY2F0aW9uVG9rZW5QYXJhbSB8fCBcImF1dGhlbnRpY2F0aW9uVG9rZW5cIlxuICAgIHRoaXMucGVyc2lzdEV4dHJhQXR0cmlidXRlcyA9IGFyZ3MucGVyc2lzdEV4dHJhQXR0cmlidXRlcyB8fCBudWxsXG4gICAgdGhpcy5wZXJzaXN0U2VyaWFsaXplZERhdGEgPSBhcmdzLnBlcnNpc3RTZXJpYWxpemVkRGF0YSB8fCBudWxsXG4gICAgdGhpcy5icm9hZGNhc3RlciA9IGFyZ3MuYnJvYWRjYXN0ZXIgfHwgbnVsbFxuICAgIHRoaXMuYnJvYWRjYXN0cyA9IGFyZ3MuYnJvYWRjYXN0cyB8fCBudWxsXG4gICAgdGhpcy5hcHBseUhhbmRsZXJzID0gYXJncy5hcHBseUhhbmRsZXJzID8gdGhpcy5idWlsdEFwcGx5SGFuZGxlcnMoYXJncy5hcHBseUhhbmRsZXJzKSA6IG51bGxcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBhcmdzLmNvbmZpZ3VyYXRpb24gfHwgbnVsbFxuICAgIHRoaXMuY29uZmxpY3RTdHJhdGVneSA9IGFyZ3MuY29uZmxpY3RTdHJhdGVneSB8fCBudWxsXG4gICAgdGhpcy5yZXNvdXJjZVR5cGVPdmVycmlkZXMgPSBhcmdzLnJlc291cmNlVHlwZU92ZXJyaWRlcyB8fCBudWxsXG4gICAgdGhpcy5hYmlsaXR5ID0gYXJncy5hYmlsaXR5IHx8IG51bGxcbiAgICB0aGlzLmFiaWxpdHlDb250ZXh0ID0gYXJncy5hYmlsaXR5Q29udGV4dCB8fCBudWxsXG4gICAgdGhpcy5sb2NhbHMgPSBhcmdzLmxvY2FscyB8fCBudWxsXG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBTeW5jUmVwbGF5UmVzb3VyY2VSZWdpc3RyYXRpb24gfCBudWxsPn0gKi9cbiAgICB0aGlzLl9yZXBsYXlSZXNvdXJjZVJlZ2lzdHJhdGlvbnMgPSBuZXcgTWFwKClcblxuICAgIGlmIChhcmdzLmFjdG9yRm9yZWlnbktleUNvbHVtbiAhPT0gdW5kZWZpbmVkICYmICh0eXBlb2YgYXJncy5hY3RvckZvcmVpZ25LZXlDb2x1bW4gIT09IFwic3RyaW5nXCIgfHwgYXJncy5hY3RvckZvcmVpZ25LZXlDb2x1bW4ubGVuZ3RoIDwgMSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgYWN0b3JGb3JlaWduS2V5Q29sdW1uIG11c3QgYmUgYSBub24tYmxhbmsgc3RyaW5nLCBnb3Q6ICR7U3RyaW5nKGFyZ3MuYWN0b3JGb3JlaWduS2V5Q29sdW1uKX1gKVxuICAgIH1cbiAgICBpZiAodGhpcy5icm9hZGNhc3RzICYmICF0aGlzLmJyb2FkY2FzdGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jRW52ZWxvcGVSZXBsYXlTZXJ2aWNlIGJyb2FkY2FzdHMgcmVxdWlyZSBhIGJyb2FkY2FzdGVyIG9wdGlvbiBkZWxpdmVyaW5nIHRoZW1cIilcbiAgICB9XG4gICAgaWYgKHRoaXMuY29uZmxpY3RTdHJhdGVneSkge1xuICAgICAgY29uc3Qgc3VwcG9ydGVkQ29uZmxpY3RTdHJhdGVnaWVzID0gbmV3IFNldChbXCJvcHRpbWlzdGljVmVyc2lvblwiLCBcInNlcnZlcldpbnNcIl0pXG5cbiAgICAgIGlmICghdGhpcy5jb25mbGljdFN0cmF0ZWd5LnZlcnNpb25BdHRyaWJ1dGUgfHwgdHlwZW9mIHRoaXMuY29uZmxpY3RTdHJhdGVneS52ZXJzaW9uQXR0cmlidXRlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlN5bmNFbnZlbG9wZVJlcGxheVNlcnZpY2UgY29uZmxpY3RTdHJhdGVneSByZXF1aXJlcyBhIG5vbi1ibGFuayB2ZXJzaW9uQXR0cmlidXRlXCIpXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb25mbGljdFN0cmF0ZWd5LnN0cmF0ZWd5ICE9PSB1bmRlZmluZWQgJiYgIXN1cHBvcnRlZENvbmZsaWN0U3RyYXRlZ2llcy5oYXModGhpcy5jb25mbGljdFN0cmF0ZWd5LnN0cmF0ZWd5KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHN5bmMgY29uZmxpY3Qgc3RyYXRlZ3kgZm9yIGJhY2tlbmQgcmVwbGF5OiAke3RoaXMuY29uZmxpY3RTdHJhdGVneS5zdHJhdGVneX0uIE9ubHkgb3B0aW1pc3RpY1ZlcnNpb24gYW5kIHNlcnZlcldpbnMgYXJlIHN1cHBvcnRlZC5gKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXcmFwcyBkZWNsYXJhdGl2ZSBhcHBseS1oYW5kbGVyIHNwZWNzIGluIHVwc2VydCBhcHBsaWVycy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IGFwcGx5SGFuZGxlcnMgLSBSYXcgYXBwbHkgaGFuZGxlcnMuXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCAoYXJnczogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+KSA9PiBQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pj59IENhbGxhYmxlIGhhbmRsZXJzIGJ5IHJlc291cmNlIHR5cGUuXG4gICAqL1xuICBidWlsdEFwcGx5SGFuZGxlcnMoYXBwbHlIYW5kbGVycykge1xuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXBwbHlIYW5kbGVycykubWFwKChbcmVzb3VyY2VUeXBlLCBoYW5kbGVyXSkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBbcmVzb3VyY2VUeXBlLCBoYW5kbGVyXVxuXG4gICAgICBjb25zdCBhcHBsaWVyID0gbmV3IFN5bmNSZXBsYXlVcHNlcnRBcHBsaWVyKGhhbmRsZXIpXG5cbiAgICAgIHJldHVybiBbcmVzb3VyY2VUeXBlLCAoLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovIGFwcGx5QXJncykgPT4gYXBwbGllci5hcHBseSgvKiogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSAqLyAoYXBwbHlBcmdzKSldXG4gICAgfSkpXG4gIH1cblxuICAvKipcbiAgICogUmVwbGF5cyBhIHN5bmMgYmF0Y2guXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBwYXJhbXMgLSBSZXF1ZXN0IHBhcmFtcyBjYXJyeWluZyBhdXRoZW50aWNhdGlvbiBhbmQgc3luY3MuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBbcmVxdWVzdFN0YXRlXSAtIFJlcXVlc3QtbG9jYWwgc3RhdGUgcGFzc2VkIHRvIGF1dGhlbnRpY2F0aW9uL3N5bmMgZXh0cmFjdGlvbiBob29rczsgc3ViY2xhc3NlcyBtYXkgdXNlIHRoaXMgdG8gc2hhcmUgcHJlLWNvbXB1dGVkIHBlci1yZXF1ZXN0IGRhdGEgd2l0aG91dCBpbnN0YW5jZSBtdXRhdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8e3N5bmNzOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4+LCBzdGF0dXM/OiBzdHJpbmcsIGVycm9yQ29kZT86IHN0cmluZywgZXJyb3JNZXNzYWdlPzogc3RyaW5nfT59IFJlcGxheSByZXNwb25zZS5cbiAgICovXG4gIGFzeW5jIHJlcGxheShwYXJhbXMsIHJlcXVlc3RTdGF0ZSA9IHt9KSB7XG4gICAgY29uc3QgYWN0b3JSZXN1bHQgPSBhd2FpdCB0aGlzLmF1dGhlbnRpY2F0ZVJlcGxheShwYXJhbXMsIHJlcXVlc3RTdGF0ZSlcblxuICAgIGlmICghYWN0b3JSZXN1bHQuYXV0aGVudGljYXRlZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3luY3M6IFtdLFxuICAgICAgICBzdGF0dXM6IFwiZXJyb3JcIixcbiAgICAgICAgZXJyb3JDb2RlOiBhY3RvclJlc3VsdC5lcnJvckNvZGUsXG4gICAgICAgIGVycm9yTWVzc2FnZTogYWN0b3JSZXN1bHQuZXJyb3JNZXNzYWdlXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc3luY1Jlc3BvbnNlcyA9IFtdXG4gICAgY29uc3QgY29udGV4dCA9IGF3YWl0IHRoaXMuYnVpbGRSZXBsYXlDb250ZXh0KHthY3RvcjogYWN0b3JSZXN1bHQuYWN0b3IsIHBhcmFtcywgcmVxdWVzdFN0YXRlfSlcblxuICAgIGZvciAoY29uc3QgcmF3U3luYyBvZiB0aGlzLnJlcGxheVN5bmNzKHBhcmFtcywgcmVxdWVzdFN0YXRlKSkge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFJlc3VsdCA9IHRoaXMubm9ybWFsaXplUmVwbGF5U3luYyhyYXdTeW5jKVxuXG4gICAgICBpZiAoIW5vcm1hbGl6ZWRSZXN1bHQub2spIHtcbiAgICAgICAgc3luY1Jlc3BvbnNlcy5wdXNoKG5vcm1hbGl6ZWRSZXN1bHQucmVzcG9uc2UpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG11dGF0aW9uID0gbm9ybWFsaXplZFJlc3VsdC5tdXRhdGlvblxuICAgICAgY29uc3QgYWNjZXNzUmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRob3JpemVSZXBsYXlNdXRhdGlvbih7YWN0b3I6IGFjdG9yUmVzdWx0LmFjdG9yLCBjb250ZXh0LCBtdXRhdGlvbn0pXG5cbiAgICAgIGlmICghYWNjZXNzUmVzdWx0LmFsbG93ZWQpIHtcbiAgICAgICAgc3luY1Jlc3BvbnNlcy5wdXNoKHtcbiAgICAgICAgICBpZDogbXV0YXRpb24uaWQsXG4gICAgICAgICAgc3luY1N0YXRlOiBcImZhaWxlZFwiLFxuICAgICAgICAgIHJlYXNvbjogYWNjZXNzUmVzdWx0LnJlYXNvbiB8fCBcImFjY2Vzcy1kZW5pZWRcIlxuICAgICAgICB9KVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBleGlzdGluZ1N5bmMgPSBhd2FpdCB0aGlzLmZpbmRFeGlzdGluZ1JlcGxheVN5bmMoe2FjdG9yOiBhY3RvclJlc3VsdC5hY3RvciwgY29udGV4dCwgbXV0YXRpb259KVxuICAgICAgY29uc3Qgc2hvdWxkQXBwbHkgPSBhd2FpdCB0aGlzLnNob3VsZEFwcGx5UmVwbGF5TXV0YXRpb24oe2FjdG9yOiBhY3RvclJlc3VsdC5hY3RvciwgY29udGV4dCwgZXhpc3RpbmdTeW5jLCBtdXRhdGlvbn0pXG4gICAgICBjb25zdCBkdXBsaWNhdGUgPSAhc2hvdWxkQXBwbHkgJiYgdGhpcy5pc0R1cGxpY2F0ZVJlcGxheU11dGF0aW9uKHtleGlzdGluZ1N5bmMsIG11dGF0aW9ufSlcblxuICAgICAgLyoqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gKi9cbiAgICAgIGxldCBhcHBseVJlc3VsdFxuXG4gICAgICB0cnkge1xuICAgICAgICBhcHBseVJlc3VsdCA9IHNob3VsZEFwcGx5XG4gICAgICAgICAgPyBhd2FpdCB0aGlzLmFwcGx5UmVwbGF5TXV0YXRpb24oe2FjdG9yOiBhY3RvclJlc3VsdC5hY3RvciwgY29udGV4dCwgZXhpc3RpbmdTeW5jLCBtdXRhdGlvbn0pXG4gICAgICAgICAgOiBhd2FpdCB0aGlzLnNraXBwZWRSZXBsYXlNdXRhdGlvbih7YWN0b3I6IGFjdG9yUmVzdWx0LmFjdG9yLCBjb250ZXh0LCBleGlzdGluZ1N5bmMsIG11dGF0aW9ufSlcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIENsaWVudC1zYWZlIGFwcGx5IGZhaWx1cmVzIChzY2hlbWEgdmFsaWRhdGlvbiwgbW9kZWwgdmFsaWRhdGlvbixcbiAgICAgICAgLy8gYXV0aG9yaXphdGlvbiBkZW5pYWxzLCB1bmtub3duIHJlc291cmNlIHR5cGVzKSBmYWlsIHRoaXMgc3luYyBhbmRcbiAgICAgICAgLy8ga2VlcCB0aGUgYmF0Y2ggZ29pbmc7IHVuZXhwZWN0ZWQgZXJyb3JzIGtlZXAgcHJvcGFnYXRpbmcuXG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFZlbG9jaW91c0Vycm9yICYmIGVycm9yLnNhZmVUb0V4cG9zZSkge1xuICAgICAgICAgIHN5bmNSZXNwb25zZXMucHVzaCh7XG4gICAgICAgICAgICBpZDogbXV0YXRpb24uaWQsXG4gICAgICAgICAgICBzeW5jU3RhdGU6IFwiZmFpbGVkXCIsXG4gICAgICAgICAgICByZWFzb246IGVycm9yLmNvZGUgfHwgXCJhcHBseS1mYWlsZWRcIixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2VcbiAgICAgICAgICB9KVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfVxuXG4gICAgICBpZiAoYXBwbHlSZXN1bHQgJiYgYXBwbHlSZXN1bHQuc3RhdHVzID09PSBcImNvbmZsaWN0XCIpIHtcbiAgICAgICAgc3luY1Jlc3BvbnNlcy5wdXNoKHtcbiAgICAgICAgICBjb25mbGljdDogYXBwbHlSZXN1bHQuY29uZmxpY3QsXG4gICAgICAgICAgaWQ6IG11dGF0aW9uLmlkLFxuICAgICAgICAgIHN5bmNTdGF0ZTogXCJjb25mbGljdFwiXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMucGVyc2lzdFJlcGxheU11dGF0aW9uKHthY3RvcjogYWN0b3JSZXN1bHQuYWN0b3IsIGNvbnRleHQsIGV4aXN0aW5nU3luYywgYXBwbHlSZXN1bHQsIG11dGF0aW9uLCBzaG91bGRBcHBseX0pXG4gICAgICBhd2FpdCB0aGlzLmFmdGVyUmVwbGF5TXV0YXRpb24oe2FjdG9yOiBhY3RvclJlc3VsdC5hY3RvciwgY29udGV4dCwgZXhpc3RpbmdTeW5jLCBhcHBseVJlc3VsdCwgbXV0YXRpb24sIHNob3VsZEFwcGx5fSlcblxuICAgICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovXG4gICAgICBjb25zdCBzdWNjZXNzZnVsUmVzcG9uc2UgPSB7aWQ6IG11dGF0aW9uLmlkLCBzeW5jU3RhdGU6IGR1cGxpY2F0ZSA/IFwiZHVwbGljYXRlXCIgOiBcInN1Y2Nlc3NmdWxcIn1cblxuICAgICAgY29uc3QgcGVyc2lzdGVkUmVwbGF5TWV0YWRhdGEgPSBkdXBsaWNhdGUgPyB0aGlzLnJlcGxheVBlcnNpc3RlZE1ldGFkYXRhKGV4aXN0aW5nU3luYykgOiBudWxsXG5cbiAgICAgIGlmIChwZXJzaXN0ZWRSZXBsYXlNZXRhZGF0YSkge1xuICAgICAgICBzdWNjZXNzZnVsUmVzcG9uc2Uuc2VydmVyVmVyc2lvbiA9IHBlcnNpc3RlZFJlcGxheU1ldGFkYXRhLmFja25vd2xlZGdlbWVudFZlcnNpb25cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25mbGljdFN0cmF0ZWd5ICYmIG11dGF0aW9uLmJhc2VWZXJzaW9uICE9PSB1bmRlZmluZWQgJiYgYXBwbHlSZXN1bHQ/LnJlY29yZCkge1xuICAgICAgICBzdWNjZXNzZnVsUmVzcG9uc2Uuc2VydmVyVmVyc2lvbiA9IG5vcm1hbGl6ZUNvbmZsaWN0VmFsdWUoYXBwbHlSZXN1bHQucmVjb3JkLnJlYWRBdHRyaWJ1dGUodGhpcy5jb25mbGljdFN0cmF0ZWd5LnZlcnNpb25BdHRyaWJ1dGUpKVxuICAgICAgfVxuXG4gICAgICBzeW5jUmVzcG9uc2VzLnB1c2goc3VjY2Vzc2Z1bFJlc3BvbnNlKVxuICAgIH1cblxuICAgIHJldHVybiB7c3luY3M6IHN5bmNSZXNwb25zZXN9XG4gIH1cblxuICAvKipcbiAgICogQXV0aGVudGljYXRlcyB0aGUgc3luYyBiYXRjaCBhY3Rvci5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gYSB0b2tlbi1tb2RlbCBsb29rdXAgd2hlbiBgYXV0aGVudGljYXRpb25Ub2tlbk1vZGVsYCBpc1xuICAgKiBjb25maWd1cmVkOyBvdGhlcndpc2UgYXBwcyBvdmVycmlkZSB0aGlzIGhvb2suXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBwYXJhbXMgLSBSZXF1ZXN0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IFtfcmVxdWVzdFN0YXRlXSAtIFJlcXVlc3QtbG9jYWwgc3RhdGUgcG9wdWxhdGVkIGJ5IHN1YmNsYXNzZXMgYmVmb3JlIHRoZSBiYXNlIHJlcGxheSBsb29wIHJ1bnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHthdXRoZW50aWNhdGVkOiB0cnVlLCBhY3RvcjogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHwge2F1dGhlbnRpY2F0ZWQ6IGZhbHNlLCBlcnJvckNvZGU6IHN0cmluZywgZXJyb3JNZXNzYWdlOiBzdHJpbmd9Pn0gQXV0aCByZXN1bHQuXG4gICAqL1xuICBhc3luYyBhdXRoZW50aWNhdGVSZXBsYXkocGFyYW1zLCBfcmVxdWVzdFN0YXRlKSB7XG4gICAgaWYgKCF0aGlzLmF1dGhlbnRpY2F0aW9uVG9rZW5Nb2RlbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3luY0VudmVsb3BlUmVwbGF5U2VydmljZS5hdXRoZW50aWNhdGVSZXBsYXkgbXVzdCBiZSBpbXBsZW1lbnRlZCAob3IgY29uZmlndXJlIGF1dGhlbnRpY2F0aW9uVG9rZW5Nb2RlbClcIilcbiAgICB9XG5cbiAgICBjb25zdCB0b2tlbiA9IHBhcmFtc1t0aGlzLmF1dGhlbnRpY2F0aW9uVG9rZW5QYXJhbV1cblxuICAgIGlmICghdG9rZW4pIHtcbiAgICAgIHJldHVybiB7YXV0aGVudGljYXRlZDogZmFsc2UsIGVycm9yQ29kZTogXCJtaXNzaW5nLWF1dGhlbnRpY2F0aW9uLXRva2VuXCIsIGVycm9yTWVzc2FnZTogXCJNaXNzaW5nIGF1dGhlbnRpY2F0aW9uIHRva2VuXCJ9XG4gICAgfVxuXG4gICAgY29uc3QgYWN0b3IgPSBhd2FpdCB0aGlzLmF1dGhlbnRpY2F0aW9uVG9rZW5Nb2RlbC5maW5kQnkoe1t0aGlzLmF1dGhlbnRpY2F0aW9uVG9rZW5Db2x1bW5dOiB0b2tlbn0pXG5cbiAgICBpZiAoIWFjdG9yKSB7XG4gICAgICByZXR1cm4ge2F1dGhlbnRpY2F0ZWQ6IGZhbHNlLCBlcnJvckNvZGU6IFwiaW52YWxpZC1hdXRoZW50aWNhdGlvbi10b2tlblwiLCBlcnJvck1lc3NhZ2U6IFwiSW52YWxpZCBhdXRoZW50aWNhdGlvbiB0b2tlblwifVxuICAgIH1cblxuICAgIHJldHVybiB7YWN0b3IsIGF1dGhlbnRpY2F0ZWQ6IHRydWV9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHBlci1iYXRjaCBtdXRhYmxlIGNvbnRleHQgZm9yIGNhY2hlcyBzaGFyZWQgYWNyb3NzIHN5bmMgaXRlbXMuXG4gICAqIEBwYXJhbSB7e2FjdG9yOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4sIHJlcXVlc3RTdGF0ZTogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fX0gX2FyZ3MgLSBBY3RvciwgcmVxdWVzdCBwYXJhbXMsIGFuZCByZXF1ZXN0LWxvY2FsIHN0YXRlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4+fSBSZXBsYXkgY29udGV4dC5cbiAgICovXG4gIGFzeW5jIGJ1aWxkUmVwbGF5Q29udGV4dChfYXJncykge1xuICAgIHJldHVybiB7fVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgcmF3IHN5bmMgZW50cmllcyBmcm9tIHJlcXVlc3QgcGFyYW1zLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gcGFyYW1zIC0gUmVxdWVzdCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBbX3JlcXVlc3RTdGF0ZV0gLSBSZXF1ZXN0LWxvY2FsIHN0YXRlIHBvcHVsYXRlZCBieSBzdWJjbGFzc2VzIGJlZm9yZSB0aGUgYmFzZSByZXBsYXkgbG9vcCBydW5zLlxuICAgKiBAcmV0dXJucyB7QXJyYXk8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBSYXcgc3luYyBlbnRyaWVzLlxuICAgKi9cbiAgcmVwbGF5U3luY3MocGFyYW1zLCBfcmVxdWVzdFN0YXRlKSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkocGFyYW1zLnN5bmNzKSA/IHBhcmFtcy5zeW5jcyA6IFtdXG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplcyBvbmUgc3luYyBlbnRyeS5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gcmF3U3luYyAtIFJhdyBzeW5jIGVudHJ5LlxuICAgKiBAcmV0dXJucyB7e29rOiB0cnVlLCBtdXRhdGlvbjogaW1wb3J0KFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCIpLlN5bmNSZXBsYXlNdXRhdGlvbn0gfCB7b2s6IGZhbHNlLCByZXNwb25zZTogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fX0gTm9ybWFsaXplZCBtdXRhdGlvbiBvciBmYWlsZWQgcmVzcG9uc2UuXG4gICAqL1xuICBub3JtYWxpemVSZXBsYXlTeW5jKHJhd1N5bmMpIHtcbiAgICBpZiAoIXJhd1N5bmMgfHwgdHlwZW9mIHJhd1N5bmMgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShyYXdTeW5jKSkge1xuICAgICAgcmV0dXJuIHtvazogZmFsc2UsIHJlc3BvbnNlOiB7aWQ6IHVuZGVmaW5lZCwgc3luY1N0YXRlOiBcImZhaWxlZFwiLCByZWFzb246IFwiaW52YWxpZC1zeW5jXCJ9fVxuICAgIH1cblxuICAgIGNvbnN0IHN5bmMgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi8gKHJhd1N5bmMpXG4gICAgY29uc3Qge2NsaWVudE11dGF0aW9uSWQsIGNsaWVudFVwZGF0ZWRBdCwgZGF0YSwgaWQsIHJlc291cmNlSWQsIHJlc291cmNlVHlwZSwgc3luY1R5cGV9ID0gc3luY1xuXG4gICAgaWYgKHR5cGVvZiByZXNvdXJjZVR5cGUgIT09IFwic3RyaW5nXCIgfHwgcmVzb3VyY2VUeXBlLmxlbmd0aCA8IDEgfHwgcmVzb3VyY2VJZCA9PT0gdW5kZWZpbmVkIHx8IHJlc291cmNlSWQgPT09IG51bGwgfHwgdHlwZW9mIHN5bmNUeXBlICE9PSBcInN0cmluZ1wiIHx8IHN5bmNUeXBlLmxlbmd0aCA8IDEpIHtcbiAgICAgIHJldHVybiB7b2s6IGZhbHNlLCByZXNwb25zZToge2lkLCBzeW5jU3RhdGU6IFwiZmFpbGVkXCIsIHJlYXNvbjogXCJpbnZhbGlkLXJlc291cmNlLWlkXCJ9fVxuICAgIH1cblxuICAgIGNvbnN0IHJlc291cmNlSWRTdHJpbmcgPSBTdHJpbmcocmVzb3VyY2VJZClcbiAgICBsZXQgY2xpZW50VXBkYXRlZEF0RGF0ZSA9IHR5cGVvZiBjbGllbnRVcGRhdGVkQXQgPT09IFwic3RyaW5nXCIgfHwgY2xpZW50VXBkYXRlZEF0IGluc3RhbmNlb2YgRGF0ZSA/IG5ldyBEYXRlKGNsaWVudFVwZGF0ZWRBdCkgOiBuZXcgRGF0ZSgpXG5cbiAgICBpZiAoTnVtYmVyLmlzTmFOKGNsaWVudFVwZGF0ZWRBdERhdGUuZ2V0VGltZSgpKSkgY2xpZW50VXBkYXRlZEF0RGF0ZSA9IG5ldyBEYXRlKClcblxuICAgIGNvbnN0IG5vcm1hbGl6ZWREYXRhUmVzdWx0ID0gdGhpcy5ub3JtYWxpemVSZXBsYXlTeW5jRGF0YSh7ZGF0YSwgaWQsIHJlc291cmNlSWQ6IHJlc291cmNlSWRTdHJpbmcsIHJlc291cmNlVHlwZX0pXG5cbiAgICBpZiAoIW5vcm1hbGl6ZWREYXRhUmVzdWx0Lm9rKSByZXR1cm4gbm9ybWFsaXplZERhdGFSZXN1bHRcblxuICAgIHJldHVybiB7XG4gICAgICBvazogdHJ1ZSxcbiAgICAgIG11dGF0aW9uOiB7XG4gICAgICAgIGJhc2VWZXJzaW9uOiBzeW5jLmJhc2VWZXJzaW9uLFxuICAgICAgICBjbGllbnRNdXRhdGlvbklkLFxuICAgICAgICBjbGllbnRVcGRhdGVkQXQ6IGNsaWVudFVwZGF0ZWRBdERhdGUsXG4gICAgICAgIGRhdGE6IG5vcm1hbGl6ZWREYXRhUmVzdWx0LmRhdGEsXG4gICAgICAgIGlkLFxuICAgICAgICByZXNvdXJjZUlkOiByZXNvdXJjZUlkU3RyaW5nLFxuICAgICAgICByZXNvdXJjZVR5cGUsXG4gICAgICAgIHNlcmlhbGl6ZWREYXRhOiBKU09OLnN0cmluZ2lmeShub3JtYWxpemVkRGF0YVJlc3VsdC5kYXRhKSxcbiAgICAgICAgc3luY1R5cGVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplcyBvbmUgc3luYyBkYXRhIHBheWxvYWQuXG4gICAqIEBwYXJhbSB7e2RhdGE6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCBpZDogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4sIHJlc291cmNlSWQ6IHN0cmluZywgcmVzb3VyY2VUeXBlOiBzdHJpbmd9fSBhcmdzIC0gU3luYyBwYXlsb2FkIG5vcm1hbGl6YXRpb24gYXJndW1lbnRzLlxuICAgKiBAcmV0dXJucyB7e29rOiB0cnVlLCBkYXRhOiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IHwge29rOiBmYWxzZSwgcmVzcG9uc2U6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn19IE5vcm1hbGl6ZWQgcGF5bG9hZCBvciBmYWlsZWQgcmVzcG9uc2UuXG4gICAqL1xuICBub3JtYWxpemVSZXBsYXlTeW5jRGF0YSh7ZGF0YSwgaWQsIHJlc291cmNlSWQsIHJlc291cmNlVHlwZX0pIHtcbiAgICBpZiAoZGF0YSA9PT0gdW5kZWZpbmVkIHx8IGRhdGEgPT09IG51bGwpIHJldHVybiB7b2s6IHRydWUsIGRhdGE6IHt9fVxuXG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXJzZWREYXRhID0gSlNPTi5wYXJzZShkYXRhKVxuXG4gICAgICAgIGlmICghcGFyc2VkRGF0YSB8fCB0eXBlb2YgcGFyc2VkRGF0YSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHBhcnNlZERhdGEpKSByZXR1cm4ge29rOiB0cnVlLCBkYXRhOiB7fX1cblxuICAgICAgICByZXR1cm4ge29rOiB0cnVlLCBkYXRhOiAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi8gKHBhcnNlZERhdGEpfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2Fybj8uKFwiSW52YWxpZCBzeW5jIGRhdGEgSlNPTlwiLCB7ZXJyb3IsIGlkLCByZXNvdXJjZUlkLCByZXNvdXJjZVR5cGV9KVxuICAgICAgICByZXR1cm4ge29rOiBmYWxzZSwgcmVzcG9uc2U6IHtpZCwgc3luY1N0YXRlOiBcImZhaWxlZFwiLCByZWFzb246IFwiaW52YWxpZC1kYXRhXCJ9fVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGRhdGEpKSByZXR1cm4ge29rOiB0cnVlLCBkYXRhOiB7fX1cblxuICAgIHJldHVybiB7b2s6IHRydWUsIGRhdGE6IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZGF0YSkpfVxuICB9XG5cbiAgLyoqXG4gICAqIEF1dGhvcml6ZXMgb25lIG5vcm1hbGl6ZWQgbXV0YXRpb24uXG4gICAqIEBwYXJhbSB7e2FjdG9yOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgY29udGV4dDogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+LCBtdXRhdGlvbjogaW1wb3J0KFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCIpLlN5bmNSZXBsYXlNdXRhdGlvbn19IF9hcmdzIC0gQWN0b3IsIGJhdGNoIGNvbnRleHQsIGFuZCBtdXRhdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8e2FsbG93ZWQ6IGJvb2xlYW4sIHJlYXNvbj86IHN0cmluZ30+fSBBY2Nlc3MgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgYXV0aG9yaXplUmVwbGF5TXV0YXRpb24oX2FyZ3MpIHtcbiAgICByZXR1cm4ge2FsbG93ZWQ6IHRydWV9XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgdGhlIHByZXZpb3VzbHkgc3RvcmVkIHN5bmMvY2hhbmdlIHJvdyBmb3Igc3RhbGUtY2xpZW50IGNvbXBhcmlzb24uXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIGEgc3luYy1tb2RlbCBsb29rdXAgYnkgYWN0b3IgYW5kIHJlc291cmNlIGlkZW50aXR5IHdoZW4gYSBzeW5jXG4gICAqIG1vZGVsIGlzIGNvbmZpZ3VyZWQ7IG90aGVyd2lzZSBhcHBzIG92ZXJyaWRlIHRoaXMgaG9vay5cbiAgICogQHBhcmFtIHt7YWN0b3I6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4sIG11dGF0aW9uOiBpbXBvcnQoXCIuL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanNcIikuU3luY1JlcGxheU11dGF0aW9ufX0gYXJncyAtIEFjdG9yLCBiYXRjaCBjb250ZXh0LCBhbmQgbXV0YXRpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gRXhpc3Rpbmcgc3luYyByb3cuXG4gICAqL1xuICBhc3luYyBmaW5kRXhpc3RpbmdSZXBsYXlTeW5jKHthY3RvciwgbXV0YXRpb259KSB7XG4gICAgaWYgKCF0aGlzLnN5bmNNb2RlbCkgcmV0dXJuIG51bGxcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLnN5bmNNb2RlbC5maW5kQnkoe1xuICAgICAgW3RoaXMuYWN0b3JGb3JlaWduS2V5Q29sdW1uXTogdGhpcy5yZXBsYXlBY3RvcklkKGFjdG9yKSxcbiAgICAgIHJlc291cmNlX2lkOiBtdXRhdGlvbi5yZXNvdXJjZUlkLFxuICAgICAgcmVzb3VyY2VfdHlwZTogbXV0YXRpb24ucmVzb3VyY2VUeXBlXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgcGVyc2lzdGVkIGFjdG9yIGlkIHVzZWQgYnkgbW9kZWwtYmFja2VkIGRlZmF1bHQgaG9va3MuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IGFjdG9yIC0gQWN0b3IgcmV0dXJuZWQgZnJvbSBhdXRoZW50aWNhdGVSZXBsYXkuXG4gICAqIEByZXR1cm5zIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gQWN0b3IgaWQuXG4gICAqL1xuICByZXBsYXlBY3RvcklkKGFjdG9yKSB7XG4gICAgaWYgKCFhY3RvciB8fCB0eXBlb2YgYWN0b3IgIT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGFjdG9yLmlkICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlN5bmNFbnZlbG9wZVJlcGxheVNlcnZpY2UgbW9kZWwtYmFja2VkIGRlZmF1bHRzIHJlcXVpcmUgYW4gYWN0b3Igd2l0aCBhbiBpZCgpIG1ldGhvZCBmcm9tIGF1dGhlbnRpY2F0ZVJlcGxheVwiKVxuICAgIH1cblxuICAgIHJldHVybiBhY3Rvci5pZCgpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIGEgbm9ybWFsaXplZCBtdXRhdGlvbiBzaG91bGQgYmUgYXBwbGllZCB0byBkb21haW4gbW9kZWxzLlxuICAgKiBAcGFyYW0ge3thY3RvcjogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4sIGNvbnRleHQ6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PiwgZXhpc3RpbmdTeW5jOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgbXV0YXRpb246IGltcG9ydChcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiKS5TeW5jUmVwbGF5TXV0YXRpb259fSBhcmdzIC0gQWN0b3IsIGJhdGNoIGNvbnRleHQsIGV4aXN0aW5nIHN5bmMgcm93LCBhbmQgbXV0YXRpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBXaGV0aGVyIHRvIGFwcGx5IHRoZSBtdXRhdGlvbi5cbiAgICovXG4gIGFzeW5jIHNob3VsZEFwcGx5UmVwbGF5TXV0YXRpb24oe2V4aXN0aW5nU3luYywgbXV0YXRpb259KSB7XG4gICAgY29uc3QgZXhpc3RpbmdDbGllbnRVcGRhdGVkQXQgPSB0aGlzLmV4aXN0aW5nUmVwbGF5U3luY0NsaWVudFVwZGF0ZWRBdChleGlzdGluZ1N5bmMpXG5cbiAgICByZXR1cm4gIWV4aXN0aW5nQ2xpZW50VXBkYXRlZEF0IHx8IG11dGF0aW9uLmNsaWVudFVwZGF0ZWRBdCA+IGV4aXN0aW5nQ2xpZW50VXBkYXRlZEF0XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIGNsaWVudCB0aW1lc3RhbXAgZnJvbSBhbiBleGlzdGluZyBzeW5jIHJvdy5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gZXhpc3RpbmdTeW5jIC0gRXhpc3Rpbmcgc3luYyByb3cuXG4gICAqIEByZXR1cm5zIHtEYXRlIHwgbnVsbH0gRXhpc3RpbmcgY2xpZW50IHRpbWVzdGFtcC5cbiAgICovXG4gIGV4aXN0aW5nUmVwbGF5U3luY0NsaWVudFVwZGF0ZWRBdChleGlzdGluZ1N5bmMpIHtcbiAgICBpZiAoIWV4aXN0aW5nU3luYyB8fCB0eXBlb2YgZXhpc3RpbmdTeW5jICE9PSBcIm9iamVjdFwiKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3Qgc3luY1JlY29yZCA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAqLyAoZXhpc3RpbmdTeW5jKVxuICAgIGNvbnN0IHZhbHVlID0gdHlwZW9mIHN5bmNSZWNvcmQuY2xpZW50VXBkYXRlZEF0ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gc3luY1JlY29yZC5jbGllbnRVcGRhdGVkQXQoKVxuICAgICAgOiBzeW5jUmVjb3JkLmNsaWVudFVwZGF0ZWRBdFxuXG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIHZhbHVlXG5cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgcGFyc2VkVmFsdWUgPSBuZXcgRGF0ZSh2YWx1ZSlcblxuICAgIHJldHVybiBOdW1iZXIuaXNOYU4ocGFyc2VkVmFsdWUuZ2V0VGltZSgpKSA/IG51bGwgOiBwYXJzZWRWYWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIGEgc2tpcHBlZCBtdXRhdGlvbiBleGFjdGx5IG1hdGNoZXMgdGhlIHBlcnNpc3RlZCByZXBsYXkgcm93LlxuICAgKiBPbGRlciBkaXN0aW5jdCBtdXRhdGlvbnMgcmV0YWluIHRoZSBlc3RhYmxpc2hlZCBzdWNjZXNzZnVsIHN0YWxlLXNraXAgcmVzcG9uc2UuXG4gICAqIEBwYXJhbSB7e2V4aXN0aW5nU3luYzogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4sIG11dGF0aW9uOiBpbXBvcnQoXCIuL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanNcIikuU3luY1JlcGxheU11dGF0aW9ufX0gYXJncyAtIEV4aXN0aW5nIHJvdyBhbmQgaW5jb21pbmcgbXV0YXRpb24uXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoaXMgaXMgYSBkdXBsaWNhdGUgcmVwbGF5LlxuICAgKi9cbiAgaXNEdXBsaWNhdGVSZXBsYXlNdXRhdGlvbih7ZXhpc3RpbmdTeW5jLCBtdXRhdGlvbn0pIHtcbiAgICBpZiAoIWV4aXN0aW5nU3luYykgcmV0dXJuIGZhbHNlXG5cbiAgICBjb25zdCBtZXRhZGF0YSA9IHRoaXMucmVwbGF5UGVyc2lzdGVkTWV0YWRhdGEoZXhpc3RpbmdTeW5jKVxuXG4gICAgaWYgKG1ldGFkYXRhKSB7XG4gICAgICByZXR1cm4gbWV0YWRhdGEuY2xpZW50TXV0YXRpb25JZCA9PT0gU3RyaW5nKG11dGF0aW9uLmNsaWVudE11dGF0aW9uSWQgfHwgbXV0YXRpb24uaWQpXG4gICAgICAgICYmIG1ldGFkYXRhLnBheWxvYWRGaW5nZXJwcmludCA9PT0gc2hhMjU2SGV4KG11dGF0aW9uLnNlcmlhbGl6ZWREYXRhKVxuICAgIH1cblxuICAgIGNvbnN0IGV4aXN0aW5nQ2xpZW50VXBkYXRlZEF0ID0gdGhpcy5leGlzdGluZ1JlcGxheVN5bmNDbGllbnRVcGRhdGVkQXQoZXhpc3RpbmdTeW5jKVxuICAgIGNvbnN0IGV4aXN0aW5nRGF0YSA9IHRoaXMucmVwbGF5U3luY1JlY29yZFZhbHVlKGV4aXN0aW5nU3luYywgXCJkYXRhXCIpXG4gICAgY29uc3QgZXhpc3RpbmdTeW5jVHlwZSA9IHRoaXMucmVwbGF5U3luY1JlY29yZFZhbHVlKGV4aXN0aW5nU3luYywgXCJzeW5jVHlwZVwiKVxuICAgIGNvbnN0IHNlcmlhbGl6ZWRFeGlzdGluZ0RhdGEgPSB0eXBlb2YgZXhpc3RpbmdEYXRhID09PSBcInN0cmluZ1wiID8gZXhpc3RpbmdEYXRhIDogSlNPTi5zdHJpbmdpZnkoZXhpc3RpbmdEYXRhKVxuXG4gICAgcmV0dXJuIGV4aXN0aW5nQ2xpZW50VXBkYXRlZEF0Py5nZXRUaW1lKCkgPT09IG11dGF0aW9uLmNsaWVudFVwZGF0ZWRBdC5nZXRUaW1lKClcbiAgICAgICYmIHNlcmlhbGl6ZWRFeGlzdGluZ0RhdGEgPT09IG11dGF0aW9uLnNlcmlhbGl6ZWREYXRhXG4gICAgICAmJiBleGlzdGluZ1N5bmNUeXBlID09PSBtdXRhdGlvbi5zeW5jVHlwZVxuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIGEgbW9kZWwtYmFja2VkIHN5bmMtcm93IHZhbHVlIHRocm91Z2ggaXRzIGFjY2Vzc29yIG9yIHBsYWluIHByb3BlcnR5LlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBzeW5jUmVjb3JkIC0gRXhpc3Rpbmcgc3luYyByb3cuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lIC0gQXR0cmlidXRlIG5hbWUuXG4gICAqIEByZXR1cm5zIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gU3RvcmVkIHZhbHVlLlxuICAgKi9cbiAgcmVwbGF5U3luY1JlY29yZFZhbHVlKHN5bmNSZWNvcmQsIGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBjb25zdCByZWNvcmQgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi8gKHN5bmNSZWNvcmQpXG4gICAgY29uc3QgdmFsdWUgPSByZWNvcmRbYXR0cmlidXRlTmFtZV1cblxuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IHZhbHVlLmNhbGwoc3luY1JlY29yZCkgOiB2YWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIGR1cmFibGUgcmVwbGF5IGFja25vd2xlZGdlbWVudCBtZXRhZGF0YSBmcm9tIGEgbW9kZWwtYmFja2VkIHN5bmMgcm93LlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBzeW5jUmVjb3JkIC0gRXhpc3Rpbmcgc3luYyByb3cuXG4gICAqIEByZXR1cm5zIHt7YWNrbm93bGVkZ2VtZW50VmVyc2lvbjogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCwgY2xpZW50TXV0YXRpb25JZDogc3RyaW5nLCBwYXlsb2FkRmluZ2VycHJpbnQ6IHN0cmluZ30gfCBudWxsfSBQZXJzaXN0ZWQgbWV0YWRhdGEuXG4gICAqL1xuICByZXBsYXlQZXJzaXN0ZWRNZXRhZGF0YShzeW5jUmVjb3JkKSB7XG4gICAgaWYgKCFzeW5jUmVjb3JkKSByZXR1cm4gbnVsbFxuXG4gICAgcmV0dXJuIGRlY29kZVJlcGxheVBlcnNpc3RlZERhdGEodGhpcy5yZXBsYXlTeW5jUmVjb3JkVmFsdWUoc3luY1JlY29yZCwgXCJkYXRhXCIpKS5tZXRhZGF0YVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgb25lIG5vcm1hbGl6ZWQgbXV0YXRpb24gdG8gZG9tYWluIG1vZGVscy5cbiAgICpcbiAgICogRGlzcGF0Y2hlcyB0aHJvdWdoIHRoZSBjb25maWd1cmVkIGFwcGx5LWhhbmRsZXIgcmVnaXN0cnkgZmlyc3QgKGNvbXBhdFxuICAgKiBwcmVjZWRlbmNlKTsgbXV0YXRpb25zIHdpdGhvdXQgYSBtYXRjaGluZyBoYW5kbGVyIGZhbGwgdGhyb3VnaCB0b1xuICAgKiByZXNvdXJjZSByb3V0aW5nIHdoZW4gYSBjb25maWd1cmF0aW9uIG9yIHJlc291cmNlVHlwZU92ZXJyaWRlcyBhcmVcbiAgICogY29uZmlndXJlZCwgYW5kIG90aGVyd2lzZSBmYWlsIGxvdWRseS5cbiAgICogQHBhcmFtIHt7YWN0b3I6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4sIGV4aXN0aW5nU3luYzogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4sIG11dGF0aW9uOiBpbXBvcnQoXCIuL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanNcIikuU3luY1JlcGxheU11dGF0aW9ufX0gYXJncyAtIEFjdG9yLCBiYXRjaCBjb250ZXh0LCBleGlzdGluZyBzeW5jIHJvdywgYW5kIG11dGF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IFByb2plY3Qtc3BlY2lmaWMgYXBwbHkgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgYXBwbHlSZXBsYXlNdXRhdGlvbihhcmdzKSB7XG4gICAgaWYgKHRoaXMuYXBwbHlIYW5kbGVycykge1xuICAgICAgY29uc3QgYXBwbHlIYW5kbGVyID0gdGhpcy5hcHBseUhhbmRsZXJzW2FyZ3MubXV0YXRpb24ucmVzb3VyY2VUeXBlXVxuXG4gICAgICBpZiAoYXBwbHlIYW5kbGVyKSByZXR1cm4gYXdhaXQgYXBwbHlIYW5kbGVyKGFyZ3MpXG4gICAgICBpZiAoIXRoaXMucm91dGluZ0NvbmZpZ3VyZWQoKSkgdGhyb3cgbmV3IEVycm9yKGBObyBzeW5jIGFwcGx5IGhhbmRsZXIgcmVnaXN0ZXJlZCBmb3I6ICR7YXJncy5tdXRhdGlvbi5yZXNvdXJjZVR5cGV9YClcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yb3V0aW5nQ29uZmlndXJlZCgpKSByZXR1cm4gYXdhaXQgdGhpcy5hcHBseVJvdXRlZFJlcGxheU11dGF0aW9uKGFyZ3MpXG5cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciByZXNvdXJjZSByb3V0aW5nIGlzIGNvbmZpZ3VyZWQgb24gdGhpcyBzZXJ2aWNlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBtdXRhdGlvbnMgcm91dGUgdG8gZnJvbnRlbmQtbW9kZWwgcmVzb3VyY2VzLlxuICAgKi9cbiAgcm91dGluZ0NvbmZpZ3VyZWQoKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odGhpcy5jb25maWd1cmF0aW9uIHx8IHRoaXMucmVzb3VyY2VUeXBlT3ZlcnJpZGVzKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSByb3V0ZWQgcmVzb3VyY2UgcmVnaXN0cmF0aW9uIGZvciBhIHJlc291cmNlIHR5cGUsIG1lbW9pemVkXG4gICAqIHBlciByZXBsYXkgc2VydmljZS4gT3ZlcnJpZGVzIHdpbiBvdmVyIHRoZSBjb25maWd1cmF0aW9uIHJlZ2lzdHJ5OyBzdHJpbmdcbiAgICogb3ZlcnJpZGVzIGFyZSBhbGlhc2VzIHJlc29sdmVkIHRocm91Z2ggdGhlIHJlZ2lzdHJ5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzb3VyY2VUeXBlIC0gTXV0YXRpb24gcmVzb3VyY2UgdHlwZS5cbiAgICogQHJldHVybnMge1N5bmNSZXBsYXlSZXNvdXJjZVJlZ2lzdHJhdGlvbiB8IG51bGx9IFJlc29sdmVkIHJlZ2lzdHJhdGlvbiBvciBudWxsIHdoZW4gdW5yb3V0YWJsZS5cbiAgICovXG4gIHJlcGxheVJlc291cmNlUmVnaXN0cmF0aW9uKHJlc291cmNlVHlwZSkge1xuICAgIGNvbnN0IG1lbW9pemVkUmVnaXN0cmF0aW9uID0gdGhpcy5fcmVwbGF5UmVzb3VyY2VSZWdpc3RyYXRpb25zLmdldChyZXNvdXJjZVR5cGUpXG5cbiAgICBpZiAobWVtb2l6ZWRSZWdpc3RyYXRpb24gIT09IHVuZGVmaW5lZCkgcmV0dXJuIG1lbW9pemVkUmVnaXN0cmF0aW9uXG5cbiAgICBjb25zdCByZWdpc3RyYXRpb24gPSB0aGlzLnJlc29sdmVSZXBsYXlSZXNvdXJjZVJlZ2lzdHJhdGlvbihyZXNvdXJjZVR5cGUpXG5cbiAgICB0aGlzLl9yZXBsYXlSZXNvdXJjZVJlZ2lzdHJhdGlvbnMuc2V0KHJlc291cmNlVHlwZSwgcmVnaXN0cmF0aW9uKVxuXG4gICAgcmV0dXJuIHJlZ2lzdHJhdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIFVuY2FjaGVkIHJvdXRlZC1yZXNvdXJjZSByZXNvbHV0aW9uIGJlaGluZCB7QGxpbmsgU3luY0VudmVsb3BlUmVwbGF5U2VydmljZSNyZXBsYXlSZXNvdXJjZVJlZ2lzdHJhdGlvbn0uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXNvdXJjZVR5cGUgLSBNdXRhdGlvbiByZXNvdXJjZSB0eXBlLlxuICAgKiBAcmV0dXJucyB7U3luY1JlcGxheVJlc291cmNlUmVnaXN0cmF0aW9uIHwgbnVsbH0gUmVzb2x2ZWQgcmVnaXN0cmF0aW9uIG9yIG51bGwgd2hlbiB1bnJvdXRhYmxlLlxuICAgKi9cbiAgcmVzb2x2ZVJlcGxheVJlc291cmNlUmVnaXN0cmF0aW9uKHJlc291cmNlVHlwZSkge1xuICAgIGNvbnN0IG92ZXJyaWRlID0gdGhpcy5yZXNvdXJjZVR5cGVPdmVycmlkZXM/LltyZXNvdXJjZVR5cGVdXG5cbiAgICBpZiAob3ZlcnJpZGUgJiYgdHlwZW9mIG92ZXJyaWRlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4ge21vZGVsTmFtZTogcmVzb3VyY2VUeXBlLCByZXNvdXJjZUNsYXNzOiBvdmVycmlkZSwgcmVzb3VyY2VDb25maWd1cmF0aW9uOiBudWxsfVxuICAgIH1cblxuICAgIGNvbnN0IHJlZ2lzdHJ5UmVzb3VyY2VUeXBlID0gdHlwZW9mIG92ZXJyaWRlID09PSBcInN0cmluZ1wiID8gb3ZlcnJpZGUgOiByZXNvdXJjZVR5cGVcblxuICAgIGlmICghdGhpcy5jb25maWd1cmF0aW9uKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgcmVzb2x2ZWRSZWdpc3RyYXRpb24gPSByZXNvbHZlRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3Moe2NvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbiwgcmVzb3VyY2VUeXBlOiByZWdpc3RyeVJlc291cmNlVHlwZX0pXG5cbiAgICBpZiAoIXJlc29sdmVkUmVnaXN0cmF0aW9uKSByZXR1cm4gbnVsbFxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZGVsTmFtZTogcmVzb2x2ZWRSZWdpc3RyYXRpb24ubW9kZWxOYW1lLFxuICAgICAgcmVzb3VyY2VDbGFzczogcmVzb2x2ZWRSZWdpc3RyYXRpb24ucmVzb3VyY2VDbGFzcyxcbiAgICAgIHJlc291cmNlQ29uZmlndXJhdGlvbjogcmVzb2x2ZWRSZWdpc3RyYXRpb24ucmVzb3VyY2VDb25maWd1cmF0aW9uXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBhYmlsaXR5IGFuZCByZXNvdXJjZSBjb250ZXh0IHVzZWQgdG8gYXV0aG9yaXplIHJvdXRlZFxuICAgKiByZXNvdXJjZXMuIERlZmF1bHRzIHRvIHRoZSBjb25zdHJ1Y3Rvci13aWRlIGFiaWxpdHkvYWJpbGl0eUNvbnRleHQ7XG4gICAqIHN1YmNsYXNzZXMgKHNpZ25lZCByZXBsYXkpIG92ZXJyaWRlIHRoaXMgdG8gZGVyaXZlIGF1dGhvcml6YXRpb24gZnJvbSBhXG4gICAqIHZlcmlmaWVkIGFjdG9yL2dyYW50IGluc3RlYWQgb2YgdXBsb2FkZXItZ2xvYmFsIHN0YXRlLlxuICAgKiBAcGFyYW0ge3thY3RvcjogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4sIGNvbnRleHQ6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn19IF9hcmdzIC0gUmVwbGF5IGFjdG9yIGFuZCBiYXRjaCBjb250ZXh0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7YWJpbGl0eTogaW1wb3J0KFwiLi4vYXV0aG9yaXphdGlvbi9hYmlsaXR5LmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWQsIGFiaWxpdHlDb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59Pn0gQWJpbGl0eSBhbmQgcmVzb3VyY2UgY29udGV4dC5cbiAgICovXG4gIGFzeW5jIHJlcGxheUFiaWxpdHlGb3IoX2FyZ3MpIHtcbiAgICByZXR1cm4ge2FiaWxpdHk6IHRoaXMuYWJpbGl0eSB8fCB1bmRlZmluZWQsIGFiaWxpdHlDb250ZXh0OiB0aGlzLmFiaWxpdHlDb250ZXh0IHx8IHt9fVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgcm91dGVkIHJlc291cmNlIGluc3RhbmNlIGhhbmRsaW5nIG9uZSBtdXRhdGlvbi5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBhcmdzLmFjdG9yIC0gUmVwbGF5IGFjdG9yLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gYXJncy5jb250ZXh0IC0gUmVwbGF5IGNvbnRleHQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCIpLlN5bmNSZXBsYXlNdXRhdGlvbn0gYXJncy5tdXRhdGlvbiAtIE5vcm1hbGl6ZWQgcmVwbGF5IG11dGF0aW9uLlxuICAgKiBAcGFyYW0ge1N5bmNSZXBsYXlSZXNvdXJjZVJlZ2lzdHJhdGlvbn0gYXJncy5yZWdpc3RyYXRpb24gLSBSZXNvbHZlZCByZXNvdXJjZSByZWdpc3RyYXRpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVsLXJlc291cmNlL2Jhc2UtcmVzb3VyY2UuanNcIikuZGVmYXVsdD59IFJvdXRlZCByZXNvdXJjZSBpbnN0YW5jZS5cbiAgICovXG4gIGFzeW5jIGJ1aWxkUmVwbGF5UmVzb3VyY2Uoe2FjdG9yLCBjb250ZXh0LCBtdXRhdGlvbiwgcmVnaXN0cmF0aW9ufSkge1xuICAgIGNvbnN0IFJlc291cmNlQ2xhc3MgPSBmcm9udGVuZE1vZGVsUmVzb3VyY2VJbnRlcm5hbENvbnN0cnVjdG9yKHJlZ2lzdHJhdGlvbi5yZXNvdXJjZUNsYXNzKVxuICAgIGNvbnN0IHthYmlsaXR5LCBhYmlsaXR5Q29udGV4dH0gPSBhd2FpdCB0aGlzLnJlcGxheUFiaWxpdHlGb3Ioe2FjdG9yLCBjb250ZXh0fSlcblxuICAgIHJldHVybiBuZXcgUmVzb3VyY2VDbGFzcyh7XG4gICAgICBhYmlsaXR5LFxuICAgICAgY29udGV4dDogYWJpbGl0eUNvbnRleHQsXG4gICAgICBsb2NhbHM6IHsuLi4odGhpcy5sb2NhbHMgfHwge30pLCAuLi4odGhpcy5jb25maWd1cmF0aW9uID8ge2NvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbn0gOiB7fSl9LFxuICAgICAgbW9kZWxOYW1lOiByZWdpc3RyYXRpb24ubW9kZWxOYW1lLFxuICAgICAgcGFyYW1zOiBtdXRhdGlvbi5kYXRhLFxuICAgICAgLi4uKHJlZ2lzdHJhdGlvbi5yZXNvdXJjZUNvbmZpZ3VyYXRpb24gPyB7cmVzb3VyY2VDb25maWd1cmF0aW9uOiByZWdpc3RyYXRpb24ucmVzb3VyY2VDb25maWd1cmF0aW9ufSA6IHt9KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyBvbmUgbXV0YXRpb24gdGhyb3VnaCBpdHMgcm91dGVkIGZyb250ZW5kLW1vZGVsIHJlc291cmNlOlxuICAgKiBhdXRob3JpemF0aW9uLCBhYmlsaXR5LXNjb3BlZCByZWNvcmQgbG9va3VwLCBzY2hlbWEgbm9ybWFsaXphdGlvbiBhbmRcbiAgICogYXNzaWduL3NhdmUgZm9yIHVwZGF0ZXMsIHNhdmUtdGhlbi1jaGVjayBtZW1iZXJzaGlwIGNyZWF0ZXMsIGRlc3Ryb3lzIGZvclxuICAgKiBkZWxldGVzLCBhbmQgdGhlIHJlc291cmNlJ3MgYWZ0ZXJTeW5jQXBwbHkgdGFpbC4gQ2xpZW50LXNhZmUgZmFpbHVyZXNcbiAgICogdGhyb3cgc2FmZSBlcnJvcnMgdGhhdCBmYWlsIHRoZSBzaW5nbGUgc3luYy5cbiAgICogQHBhcmFtIHt7YWN0b3I6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4sIGV4aXN0aW5nU3luYzogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4sIG11dGF0aW9uOiBpbXBvcnQoXCIuL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanNcIikuU3luY1JlcGxheU11dGF0aW9ufX0gYXJncyAtIEFjdG9yLCBiYXRjaCBjb250ZXh0LCBleGlzdGluZyBzeW5jIHJvdywgYW5kIG11dGF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4+fSBBcHBseSByZXN1bHQgd2l0aCByZWNvcmQsIGNyZWF0ZWQvZGVsZXRlZCBmbGFncywgYW5kIGFmdGVyU3luY0FwcGx5IGV4dHJhcy5cbiAgICovXG4gIGFzeW5jIGFwcGx5Um91dGVkUmVwbGF5TXV0YXRpb24oe2FjdG9yLCBjb250ZXh0LCBleGlzdGluZ1N5bmMsIG11dGF0aW9ufSkge1xuICAgIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IHRoaXMucmVwbGF5UmVzb3VyY2VSZWdpc3RyYXRpb24obXV0YXRpb24ucmVzb3VyY2VUeXBlKVxuXG4gICAgaWYgKCFyZWdpc3RyYXRpb24pIHtcbiAgICAgIHRocm93IFZlbG9jaW91c0Vycm9yLnNhZmUoYFVua25vd24gc3luYyByZXNvdXJjZSB0eXBlOiAke211dGF0aW9uLnJlc291cmNlVHlwZX0uYCwge2NvZGU6IFwidW5rbm93bi1yZXNvdXJjZS10eXBlXCJ9KVxuICAgIH1cblxuICAgIGNvbnN0IHJlc291cmNlID0gYXdhaXQgdGhpcy5idWlsZFJlcGxheVJlc291cmNlKHthY3RvciwgY29udGV4dCwgbXV0YXRpb24sIHJlZ2lzdHJhdGlvbn0pXG4gICAgY29uc3QgY3VzdG9tQXBwbHlSZXN1bHQgPSBhd2FpdCByZXNvdXJjZS5hcHBseVN5bmMoe2NvbnRleHQsIGV4aXN0aW5nU3luYywgbXV0YXRpb259KVxuXG4gICAgaWYgKGN1c3RvbUFwcGx5UmVzdWx0ICE9PSBudWxsKSByZXR1cm4gY3VzdG9tQXBwbHlSZXN1bHRcblxuICAgIGNvbnN0IGF1dGhvcml6YXRpb24gPSBhd2FpdCByZXNvdXJjZS5hdXRob3JpemVTeW5jTXV0YXRpb24oe2NvbnRleHQsIG11dGF0aW9ufSlcblxuICAgIGlmICghYXV0aG9yaXphdGlvbi5hbGxvd2VkKSB7XG4gICAgICB0aHJvdyBWZWxvY2lvdXNFcnJvci5zYWZlKGBTeW5jIG11dGF0aW9uIGRlbmllZCBmb3I6ICR7bXV0YXRpb24ucmVzb3VyY2VUeXBlfS5gLCB7Y29kZTogYXV0aG9yaXphdGlvbi5yZWFzb24gfHwgXCJhY2Nlc3MtZGVuaWVkXCJ9KVxuICAgIH1cblxuICAgIGlmIChtdXRhdGlvbi5zeW5jVHlwZSA9PT0gXCJkZWxldGVcIikgcmV0dXJuIGF3YWl0IHRoaXMuYXBwbHlSb3V0ZWRSZXBsYXlEZWxldGUoe211dGF0aW9uLCByZXNvdXJjZX0pXG5cbiAgICBjb25zdCBjb21tYW5kQXBwbHlSZXN1bHQgPSBhd2FpdCB0aGlzLmFwcGx5Um91dGVkUmVwbGF5Q29tbWFuZCh7Y29udGV4dCwgbXV0YXRpb24sIHJlc291cmNlfSlcblxuICAgIGlmIChjb21tYW5kQXBwbHlSZXN1bHQgIT09IG51bGwpIHJldHVybiBjb21tYW5kQXBwbHlSZXN1bHRcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmFwcGx5Um91dGVkUmVwbGF5VXBzZXJ0KHtjb250ZXh0LCBtdXRhdGlvbiwgcmVzb3VyY2V9KVxuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoZXMgYSByb3V0ZWQgc3luYyBtdXRhdGlvbiB3aG9zZSBzeW5jVHlwZSBtYXRjaGVzIGEgcmVzb3VyY2UtZGVjbGFyZWRcbiAgICogY3VzdG9tIGNvbW1hbmQuIFJldHVybnMgbnVsbCB3aGVuIHRoZSBtdXRhdGlvbiBpcyBub3QgYSBjb21tYW5kIHNvIHRoZVxuICAgKiBjYWxsZXIgY2FuIGZhbGwgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCB1cHNlcnQgcGF0aC5cbiAgICogQHBhcmFtIHt7Y29udGV4dDogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+LCBtdXRhdGlvbjogaW1wb3J0KFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCIpLlN5bmNSZXBsYXlNdXRhdGlvbiwgcmVzb3VyY2U6IGltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVsLXJlc291cmNlL2Jhc2UtcmVzb3VyY2UuanNcIikuZGVmYXVsdH19IGFyZ3MgLSBDb21tYW5kIGRpc3BhdGNoIGFyZ3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PiB8IG51bGw+fSBDb21tYW5kIGFwcGx5IHJlc3VsdCBvciBudWxsLlxuICAgKi9cbiAgYXN5bmMgYXBwbHlSb3V0ZWRSZXBsYXlDb21tYW5kKHtjb250ZXh0LCBtdXRhdGlvbiwgcmVzb3VyY2V9KSB7XG4gICAgY29uc3QgY29tbWFuZENvbmZpZyA9IHRoaXMucmVzb3VyY2VDb21tYW5kQ29uZmlnKHJlc291cmNlKVxuICAgIGNvbnN0IGNvbW1hbmRNZXRob2ROYW1lID0gdGhpcy5jb21tYW5kTWV0aG9kTmFtZUZvclN5bmNUeXBlKHtjb21tYW5kQ29uZmlnLCBzeW5jVHlwZTogbXV0YXRpb24uc3luY1R5cGV9KVxuXG4gICAgaWYgKCFjb21tYW5kTWV0aG9kTmFtZSkgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IGNvbW1hbmRNZXRob2QgPSByZXNvdXJjZS5yZXNvdXJjZU1ldGhvZChjb21tYW5kTWV0aG9kTmFtZSlcblxuICAgIGlmICghY29tbWFuZE1ldGhvZCkge1xuICAgICAgdGhyb3cgVmVsb2Npb3VzRXJyb3Iuc2FmZShgU3luYyBjb21tYW5kIGhhbmRsZXIgbWlzc2luZyBmb3I6ICR7bXV0YXRpb24ucmVzb3VyY2VUeXBlfS4ke211dGF0aW9uLnN5bmNUeXBlfS5gLCB7Y29kZTogXCJzeW5jLWNvbW1hbmQtaGFuZGxlci1taXNzaW5nXCJ9KVxuICAgIH1cblxuICAgIGNvbnN0IGFyZ3MgPSB0aGlzLmNvbW1hbmRBcmdzRm9yTXV0YXRpb24oe2NvbW1hbmRDb25maWcsIGNvbW1hbmRNZXRob2ROYW1lLCBtdXRhdGlvbn0pXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29tbWFuZE1ldGhvZC5tZXRob2QuY2FsbChjb21tYW5kTWV0aG9kLnJlc291cmNlLCBhcmdzKVxuXG4gICAgY29uc3QgYWZ0ZXJFeHRyYXMgPSBhd2FpdCByZXNvdXJjZS5hZnRlclN5bmNBcHBseSh7Y29udGV4dCwgY3JlYXRlZDogZmFsc2UsIG11dGF0aW9uLCByZWNvcmQ6IG51bGx9KVxuICAgIGNvbnN0IHJlc3VsdE9iamVjdCA9IHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0ID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KHJlc3VsdCkgPyByZXN1bHQgOiB7fVxuXG4gICAgcmV0dXJuIHtjb21tYW5kUmVzdWx0OiByZXN1bHQsIGNyZWF0ZWQ6IGZhbHNlLCBkZWxldGVkOiBmYWxzZSwgcmVjb3JkOiBudWxsLCAuLi5yZXN1bHRPYmplY3QsIC4uLmFmdGVyRXh0cmFzfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBjdXN0b20tY29tbWFuZCBjb25maWd1cmF0aW9uIGRlY2xhcmVkIG9uIGEgcm91dGVkIHJlc291cmNlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVsLXJlc291cmNlL2Jhc2UtcmVzb3VyY2UuanNcIikuZGVmYXVsdH0gcmVzb3VyY2UgLSBSb3V0ZWQgcmVzb3VyY2UgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHt7Y29sbGVjdGlvbkNvbW1hbmRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBtZW1iZXJDb21tYW5kczogUmVjb3JkPHN0cmluZywgc3RyaW5nPn19IENvbW1hbmQgY29uZmlnLlxuICAgKi9cbiAgcmVzb3VyY2VDb21tYW5kQ29uZmlnKHJlc291cmNlKSB7XG4gICAgY29uc3QgY29uZmlnID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovIChyZXNvdXJjZS5yZXNvdXJjZUNvbmZpZ3VyYXRpb25WYWx1ZSB8fCB7fSlcblxuICAgIHJldHVybiB7XG4gICAgICBjb2xsZWN0aW9uQ29tbWFuZHM6IGNvbmZpZy5jb2xsZWN0aW9uQ29tbWFuZHMgfHwge30sXG4gICAgICBtZW1iZXJDb21tYW5kczogY29uZmlnLm1lbWJlckNvbW1hbmRzIHx8IHt9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSByZXNvdXJjZSBtZXRob2QgbmFtZSBmb3IgYSBzeW5jVHlwZSB3aGVuIGl0IG5hbWVzIGEgZGVjbGFyZWRcbiAgICogY3VzdG9tIGNvbW1hbmQuXG4gICAqIEBwYXJhbSB7e2NvbW1hbmRDb25maWc6IHtjb2xsZWN0aW9uQ29tbWFuZHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sIG1lbWJlckNvbW1hbmRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSwgc3luY1R5cGU6IHN0cmluZ319IGFyZ3MgLSBMb29rdXAgYXJncy5cbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9IE1ldGhvZCBuYW1lIG9yIG51bGwuXG4gICAqL1xuICBjb21tYW5kTWV0aG9kTmFtZUZvclN5bmNUeXBlKHtjb21tYW5kQ29uZmlnLCBzeW5jVHlwZX0pIHtcbiAgICBpZiAoY29tbWFuZENvbmZpZy5tZW1iZXJDb21tYW5kc1tzeW5jVHlwZV0pIHJldHVybiBzeW5jVHlwZVxuICAgIGlmIChjb21tYW5kQ29uZmlnLmNvbGxlY3Rpb25Db21tYW5kc1tzeW5jVHlwZV0pIHJldHVybiBzeW5jVHlwZVxuXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGFyZ3VtZW50cyBvYmplY3QgcGFzc2VkIHRvIGEgcmVzb3VyY2UgY29tbWFuZCBtZXRob2QuIE1lbWJlclxuICAgKiBjb21tYW5kcyByZWNlaXZlIHRoZSBlbnZlbG9wZSdzIHJlc291cmNlSWQgYXMgYGlkYDsgdGhlIGVudmVsb3BlIGlkZW50aXR5XG4gICAqIGlzIGFzc2lnbmVkIGFmdGVyIHRoZSBwYXlsb2FkIHNvIGEgcGF5bG9hZCBgaWRgIGNhbiBuZXZlciByZXRhcmdldCB0aGVcbiAgICogY29tbWFuZCBhd2F5IGZyb20gdGhlIHJlc291cmNlIHRoZSBhdXRob3JpemF0aW9uIGhvb2tzIGFwcHJvdmVkLlxuICAgKiBAcGFyYW0ge3tjb21tYW5kQ29uZmlnOiB7Y29sbGVjdGlvbkNvbW1hbmRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBtZW1iZXJDb21tYW5kczogUmVjb3JkPHN0cmluZywgc3RyaW5nPn0sIGNvbW1hbmRNZXRob2ROYW1lOiBzdHJpbmcsIG11dGF0aW9uOiBpbXBvcnQoXCIuL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanNcIikuU3luY1JlcGxheU11dGF0aW9ufX0gYXJncyAtIEFyZ3MgYnVpbGRlciBhcmdzLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBDb21tYW5kIG1ldGhvZCBhcmd1bWVudHMuXG4gICAqL1xuICBjb21tYW5kQXJnc0Zvck11dGF0aW9uKHtjb21tYW5kQ29uZmlnLCBjb21tYW5kTWV0aG9kTmFtZSwgbXV0YXRpb259KSB7XG4gICAgY29uc3QgaXNNZW1iZXIgPSBjb21tYW5kQ29uZmlnLm1lbWJlckNvbW1hbmRzW2NvbW1hbmRNZXRob2ROYW1lXSAhPT0gdW5kZWZpbmVkXG5cbiAgICBpZiAoaXNNZW1iZXIpIHtcbiAgICAgIHJldHVybiB7Li4ubXV0YXRpb24uZGF0YSwgaWQ6IG11dGF0aW9uLnJlc291cmNlSWR9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsuLi5tdXRhdGlvbi5kYXRhfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgYSByb3V0ZWQgZGVsZXRlIG11dGF0aW9uLiBUaGUgcmVjb3JkIGlzIG1hcmtlZCBhcyBhIHNlcnZlciBhcHBseVxuICAgKiBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSByZXBsYXktb3duZWQgZGVzdHJveSAtIGFuIGFjdGl2ZSBTeW5jUHVibGlzaGVyXG4gICAqIG5ldmVyIHB1Ymxpc2hlcyB0aGUgcmVwbGF5ZWQgZGVsZXRlIGEgc2Vjb25kIHRpbWUgKHRoZSByZXBsYXkgb3ducyBpdHNcbiAgICogb3duIHBlcnNpc3QgYW5kIGJyb2FkY2FzdHMpLCB3aGlsZSBsYXRlciBzZXJ2ZXItc2lkZSB3cml0ZXMgdG8gdGhlIHNhbWVcbiAgICogaW5zdGFuY2UgcHVibGlzaCBub3JtYWxseSBhZ2Fpbi5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiKS5TeW5jUmVwbGF5TXV0YXRpb259IGFyZ3MubXV0YXRpb24gLSBOb3JtYWxpemVkIHJlcGxheSBtdXRhdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCIpLmRlZmF1bHR9IGFyZ3MucmVzb3VyY2UgLSBSb3V0ZWQgcmVzb3VyY2UgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pj59IEFwcGx5IHJlc3VsdCB3aXRoIHRoZSBkZWxldGVkIGZsYWcuXG4gICAqL1xuICBhc3luYyBhcHBseVJvdXRlZFJlcGxheURlbGV0ZSh7bXV0YXRpb24sIHJlc291cmNlfSkge1xuICAgIGNvbnN0IE1vZGVsQ2xhc3MgPSByZXNvdXJjZS5tb2RlbENsYXNzKClcbiAgICBjb25zdCBydW5EZWxldGUgPSBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZWNvcmQgPSBhd2FpdCByZXNvdXJjZS5maW5kU3luY1JlY29yZCh7Zm9yRGVsZXRlOiB0cnVlLCBtdXRhdGlvbn0pXG5cbiAgICAgIGlmICghcmVjb3JkKSByZXR1cm4ge2NyZWF0ZWQ6IGZhbHNlLCBkZWxldGVkOiBmYWxzZSwgcmVjb3JkOiBudWxsfVxuXG4gICAgICBjb25zdCBjb25mbGljdFJlc3VsdCA9IGF3YWl0IHRoaXMucm91dGVkUmVwbGF5Q29uZmxpY3RSZXN1bHQoe2F0dHJpYnV0ZXM6IHt9LCBleGlzdGluZ1JlY29yZDogcmVjb3JkLCBtdXRhdGlvbiwgcmVzb3VyY2V9KVxuXG4gICAgICBpZiAoY29uZmxpY3RSZXN1bHQpIHJldHVybiBjb25mbGljdFJlc3VsdFxuXG4gICAgICBjb25zdCByZWxlYXNlU2VydmVyQXBwbHkgPSBtYXJrU2VydmVyQXBwbHkocmVjb3JkKVxuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCByZWNvcmQuZGVzdHJveSgpXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICByZWxlYXNlU2VydmVyQXBwbHkoKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge2NyZWF0ZWQ6IGZhbHNlLCBkZWxldGVkOiB0cnVlLCByZWNvcmR9XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNvbmZsaWN0U3RyYXRlZ3kpIHJldHVybiBhd2FpdCBydW5EZWxldGUoKVxuXG4gICAgcmV0dXJuIGF3YWl0IE1vZGVsQ2xhc3Mud2l0aEFkdmlzb3J5TG9jayhzeW5jUmVwbGF5Q29uZmxpY3RMb2NrTmFtZSh7cmVzb3VyY2VJZDogbXV0YXRpb24ucmVzb3VyY2VJZCwgcmVzb3VyY2VUeXBlOiBtdXRhdGlvbi5yZXNvdXJjZVR5cGV9KSwgcnVuRGVsZXRlLCB7ZGVkaWNhdGVkQ29ubmVjdGlvbjogdHJ1ZX0pXG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyBhIHJvdXRlZCB1cHNlcnQgbXV0YXRpb246IHBlcm1pdHRlZCBwYXlsb2FkIGF0dHJpYnV0ZXMgYXJlXG4gICAqIGFzc2lnbmVkIGFuZCBzYXZlZCBvbnRvIHRoZSBmb3VuZCByZWNvcmQgKHRoZSByZWNvcmQgbGF5ZXIgb3ducyB2YWx1ZVxuICAgKiBjYXN0aW5nIGFuZCB2YWxpZGF0aW9uKSwgYW5kIG1pc3NpbmcgcmVjb3JkcyBhcmUgY3JlYXRlZCB3aXRoIHRoZVxuICAgKiBjbGllbnQtZ2VuZXJhdGVkIHByaW1hcnkga2V5IHBsdXMgYSBzYXZlLXRoZW4tY2hlY2sgbWVtYmVyc2hpcCBjaGVjay5cbiAgICogV3JpdHRlbiByZWNvcmRzIGFyZSBtYXJrZWQgYXMgc2VydmVyIGFwcGxpZXMgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGVcbiAgICogcmVwbGF5LW93bmVkIHdyaXRlIC0gYW4gYWN0aXZlIFN5bmNQdWJsaXNoZXIgbmV2ZXIgcHVibGlzaGVzIHRoZSByZXBsYXllZFxuICAgKiBtdXRhdGlvbiBhIHNlY29uZCB0aW1lICh0aGUgcmVwbGF5IG93bnMgaXRzIG93biBwZXJzaXN0IGFuZCBicm9hZGNhc3RzKSxcbiAgICogd2hpbGUgbGF0ZXIgc2VydmVyLXNpZGUgd3JpdGVzIHRvIHRoZSBzYW1lIGluc3RhbmNlIHB1Ymxpc2ggbm9ybWFsbHlcbiAgICogYWdhaW4uIE1vZGVsIHZhbGlkYXRpb24gZmFpbHVyZXMgYmVjb21lIGNsaWVudC1zYWZlIHBlci1zeW5jIGZhaWx1cmVzXG4gICAqIGNhcnJ5aW5nIHRoZSB0cmFuc2xhdGVkIHZhbGlkYXRpb24gbWVzc2FnZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gYXJncy5jb250ZXh0IC0gUmVwbGF5IGNvbnRleHQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCIpLlN5bmNSZXBsYXlNdXRhdGlvbn0gYXJncy5tdXRhdGlvbiAtIE5vcm1hbGl6ZWQgcmVwbGF5IG11dGF0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVsLXJlc291cmNlL2Jhc2UtcmVzb3VyY2UuanNcIikuZGVmYXVsdH0gYXJncy5yZXNvdXJjZSAtIFJvdXRlZCByZXNvdXJjZSBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+Pn0gQXBwbHkgcmVzdWx0IHdpdGggcmVjb3JkLCBjcmVhdGVkIGZsYWcsIGFuZCBhZnRlclN5bmNBcHBseSBleHRyYXMuXG4gICAqL1xuICBhc3luYyBhcHBseVJvdXRlZFJlcGxheVVwc2VydCh7Y29udGV4dCwgbXV0YXRpb24sIHJlc291cmNlfSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB0aGlzLnBlcm1pdHRlZFJvdXRlZEF0dHJpYnV0ZXMoe211dGF0aW9uLCByZXNvdXJjZX0pXG4gICAgY29uc3QgTW9kZWxDbGFzcyA9IHJlc291cmNlLm1vZGVsQ2xhc3MoKVxuICAgIGNvbnN0IHJ1blVwc2VydCA9IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nUmVjb3JkID0gYXdhaXQgcmVzb3VyY2UuZmluZFN5bmNSZWNvcmQoe211dGF0aW9ufSlcbiAgICAgIGNvbnN0IGNvbmZsaWN0UmVzdWx0ID0gYXdhaXQgdGhpcy5yb3V0ZWRSZXBsYXlDb25mbGljdFJlc3VsdCh7YXR0cmlidXRlcywgZXhpc3RpbmdSZWNvcmQsIG11dGF0aW9uLCByZXNvdXJjZX0pXG5cbiAgICAgIGlmIChjb25mbGljdFJlc3VsdCkgcmV0dXJuIGNvbmZsaWN0UmVzdWx0XG5cbiAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQgfCBudWxsfSAqL1xuICAgICAgbGV0IHJlY29yZCA9IGV4aXN0aW5nUmVjb3JkXG4gICAgICBsZXQgY3JlYXRlZCA9IGZhbHNlXG5cbiAgICAgIGlmIChleGlzdGluZ1JlY29yZCkge1xuICAgICAgICBjb25zdCByZWxlYXNlU2VydmVyQXBwbHkgPSBtYXJrU2VydmVyQXBwbHkoZXhpc3RpbmdSZWNvcmQpXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBleGlzdGluZ1JlY29yZC5hc3NpZ24oYXR0cmlidXRlcylcbiAgICAgICAgICBhd2FpdCB0aGlzLnNhdmVSb3V0ZWRSZXBsYXlSZWNvcmQoZXhpc3RpbmdSZWNvcmQpXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgcmVsZWFzZVNlcnZlckFwcGx5KClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVjb3JkID0gYXdhaXQgdGhpcy5jcmVhdGVSb3V0ZWRSZXBsYXlSZWNvcmQoe2F0dHJpYnV0ZXMsIG11dGF0aW9uLCByZXNvdXJjZX0pXG4gICAgICAgIGNyZWF0ZWQgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4dHJhcyA9IGF3YWl0IHJlc291cmNlLmFmdGVyU3luY0FwcGx5KHtjb250ZXh0LCBjcmVhdGVkLCBtdXRhdGlvbiwgcmVjb3JkfSlcblxuICAgICAgcmV0dXJuIHtjcmVhdGVkLCBkZWxldGVkOiBmYWxzZSwgcmVjb3JkLCAuLi5leHRyYXN9XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNvbmZsaWN0U3RyYXRlZ3kpIHJldHVybiBhd2FpdCBydW5VcHNlcnQoKVxuXG4gICAgcmV0dXJuIGF3YWl0IE1vZGVsQ2xhc3Mud2l0aEFkdmlzb3J5TG9jayhzeW5jUmVwbGF5Q29uZmxpY3RMb2NrTmFtZSh7cmVzb3VyY2VJZDogbXV0YXRpb24ucmVzb3VyY2VJZCwgcmVzb3VyY2VUeXBlOiBtdXRhdGlvbi5yZXNvdXJjZVR5cGV9KSwgcnVuVXBzZXJ0LCB7ZGVkaWNhdGVkQ29ubmVjdGlvbjogdHJ1ZX0pXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgYSByb3V0ZWQgdXBzZXJ0IG11dGF0aW9uIGNvbmZsaWN0cyB3aXRoIHRoZSBjdXJyZW50IHNlcnZlclxuICAgKiBzdGF0ZSB3aGVuIHRoZSBzZXJ2aWNlIGlzIGNvbmZpZ3VyZWQgd2l0aCBhIGNvbmZsaWN0IHN0cmF0ZWd5LiBBIG11dGF0aW9uXG4gICAqIHdob3NlIGJhc2VWZXJzaW9uIGRvZXMgbm90IG1hdGNoIHRoZSBzZXJ2ZXIncyBjdXJyZW50IHZlcnNpb25BdHRyaWJ1dGUgaXNcbiAgICogcmVqZWN0ZWQgd2l0aCBhIHN0cnVjdHVyZWQgY29uZmxpY3QgcGF5bG9hZCBpbnN0ZWFkIG9mIGJlaW5nIGFwcGxpZWQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQ29uZmxpY3QtY2hlY2sgYXJncy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IGFyZ3MuYXR0cmlidXRlcyAtIFBlcm1pdHRlZCBtdXRhdGlvbiBhdHRyaWJ1dGVzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgbnVsbH0gYXJncy5leGlzdGluZ1JlY29yZCAtIEV4aXN0aW5nIHNlcnZlciByZWNvcmQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCIpLlN5bmNSZXBsYXlNdXRhdGlvbn0gYXJncy5tdXRhdGlvbiAtIE5vcm1hbGl6ZWQgcmVwbGF5IG11dGF0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVsLXJlc291cmNlL2Jhc2UtcmVzb3VyY2UuanNcIikuZGVmYXVsdH0gYXJncy5yZXNvdXJjZSAtIFJvdXRlZCByZXNvdXJjZSBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+IHwgbnVsbD59IC0gQ29uZmxpY3QgYXBwbHkgcmVzdWx0LCBvciBudWxsIHdoZW4gbm8gY29uZmxpY3QuXG4gICAqL1xuICBhc3luYyByb3V0ZWRSZXBsYXlDb25mbGljdFJlc3VsdCh7YXR0cmlidXRlcywgZXhpc3RpbmdSZWNvcmQsIG11dGF0aW9uLCByZXNvdXJjZX0pIHtcbiAgICBpZiAoIXRoaXMuY29uZmxpY3RTdHJhdGVneSkgcmV0dXJuIG51bGxcbiAgICBpZiAoIWV4aXN0aW5nUmVjb3JkIHx8IG11dGF0aW9uLnN5bmNUeXBlID09PSBcImNyZWF0ZVwiKSByZXR1cm4gbnVsbFxuICAgIGlmIChtdXRhdGlvbi5iYXNlVmVyc2lvbiA9PT0gdW5kZWZpbmVkIHx8IG11dGF0aW9uLmJhc2VWZXJzaW9uID09PSBudWxsKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgTW9kZWxDbGFzcyA9IHJlc291cmNlLm1vZGVsQ2xhc3MoKVxuICAgIGNvbnN0IHByaW1hcnlLZXkgPSBNb2RlbENsYXNzLnByaW1hcnlLZXkoKVxuICAgIGNvbnN0IHByaW1hcnlLZXlBdHRyaWJ1dGUgPSBNb2RlbENsYXNzLnJlc29sdmVBdHRyaWJ1dGVOYW1lKHByaW1hcnlLZXkpXG4gICAgY29uc3QgdmVyc2lvbkF0dHJpYnV0ZSA9IHRoaXMuY29uZmxpY3RTdHJhdGVneS52ZXJzaW9uQXR0cmlidXRlXG4gICAgY29uc3QgdmVyc2lvbkF0dHJpYnV0ZU5hbWUgPSBNb2RlbENsYXNzLnJlc29sdmVBdHRyaWJ1dGVOYW1lKHZlcnNpb25BdHRyaWJ1dGUpXG5cbiAgICBpZiAoIXByaW1hcnlLZXlBdHRyaWJ1dGUpIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgcmVzb2x2ZSBwcmltYXJ5IGtleSBhdHRyaWJ1dGU6ICR7cHJpbWFyeUtleX1gKVxuICAgIGlmICghdmVyc2lvbkF0dHJpYnV0ZU5hbWUpIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgcmVzb2x2ZSB2ZXJzaW9uIGF0dHJpYnV0ZTogJHt2ZXJzaW9uQXR0cmlidXRlfWApXG5cbiAgICBjb25zdCBzZXJ2ZXJWZXJzaW9uID0gbm9ybWFsaXplQ29uZmxpY3RWYWx1ZShleGlzdGluZ1JlY29yZC5yZWFkQXR0cmlidXRlKHZlcnNpb25BdHRyaWJ1dGVOYW1lKSlcblxuICAgIGlmIChzdGFibGVKc29uU3RyaW5naWZ5KHNlcnZlclZlcnNpb24pID09PSBzdGFibGVKc29uU3RyaW5naWZ5KG11dGF0aW9uLmJhc2VWZXJzaW9uKSkgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IHNlcmlhbGl6ZWRBZmZlY3RlZEF0dHJpYnV0ZXMgPSBhd2FpdCB0aGlzLnNlcmlhbGl6ZWRSb3V0ZWRDb25mbGljdEF0dHJpYnV0ZXMoe2F0dHJpYnV0ZXMsIGV4aXN0aW5nUmVjb3JkLCByZXNvdXJjZX0pXG4gICAgY29uc3Qgc2VydmVyQXR0cmlidXRlcyA9IHtcbiAgICAgIC4uLnNlcmlhbGl6ZWRBZmZlY3RlZEF0dHJpYnV0ZXMsXG4gICAgICBbcHJpbWFyeUtleUF0dHJpYnV0ZV06IGV4aXN0aW5nUmVjb3JkLnJlYWRBdHRyaWJ1dGUocHJpbWFyeUtleUF0dHJpYnV0ZSksXG4gICAgICBbdmVyc2lvbkF0dHJpYnV0ZU5hbWVdOiBzZXJ2ZXJWZXJzaW9uXG4gICAgfVxuXG4gICAgY29uc3Qgc2VydmVyUmVjb3JkID0ge1xuICAgICAgYXR0cmlidXRlczogc2VydmVyQXR0cmlidXRlcyxcbiAgICAgIHZlcnNpb246IHNlcnZlclZlcnNpb25cbiAgICB9XG4gICAgY29uc3QgY29uZmxpY3RNdXRhdGlvbiA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9kZXZpY2UtaWRlbnRpdHkuanNcIikuU3luY011dGF0aW9ufSAqLyAoLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoe1xuICAgICAgYXR0cmlidXRlcyxcbiAgICAgIGJhc2VWZXJzaW9uOiBtdXRhdGlvbi5iYXNlVmVyc2lvbixcbiAgICAgIGNsaWVudE11dGF0aW9uSWQ6IG11dGF0aW9uLmNsaWVudE11dGF0aW9uSWQgfHwgbXV0YXRpb24uaWQsXG4gICAgICBtb2RlbDogbXV0YXRpb24ucmVzb3VyY2VUeXBlLFxuICAgICAgb3BlcmF0aW9uOiBtdXRhdGlvbi5zeW5jVHlwZSxcbiAgICAgIHBheWxvYWQ6IHtpZDogbXV0YXRpb24ucmVzb3VyY2VJZH1cbiAgICB9KSlcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNvbHZlU3luY0NvbmZsaWN0KHtcbiAgICAgIGJhc2VSZWNvcmQ6IG51bGwsXG4gICAgICBtdXRhdGlvbjogY29uZmxpY3RNdXRhdGlvbixcbiAgICAgIHNlcnZlclJlY29yZCxcbiAgICAgIHN0cmF0ZWd5OiB0aGlzLmNvbmZsaWN0U3RyYXRlZ3kuc3RyYXRlZ3kgfHwgXCJvcHRpbWlzdGljVmVyc2lvblwiLFxuICAgICAgdmVyc2lvbkF0dHJpYnV0ZVxuICAgIH0pXG5cbiAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gXCJjb25mbGljdFwiKSByZXR1cm4gbnVsbFxuXG4gICAgcmV0dXJuIHtjb25mbGljdDogcmVzdWx0LmNvbmZsaWN0LCBjcmVhdGVkOiBmYWxzZSwgZGVsZXRlZDogZmFsc2UsIHJlY29yZDogZXhpc3RpbmdSZWNvcmQsIHN0YXR1czogXCJjb25mbGljdFwifVxuICB9XG5cbiAgLyoqXG4gICAqIFByb2plY3RzIGFmZmVjdGVkIG11dGF0aW9uIGZpZWxkcyB0aHJvdWdoIHRoZSByZXNvdXJjZSdzIHJlYWRhYmxlXG4gICAqIGF0dHJpYnV0ZSBjb250cmFjdC4gV3JpdGFibGUtYnV0LWhpZGRlbiBmaWVsZHMgYXJlIG9taXR0ZWQsIHdoaWxlIGN1c3RvbVxuICAgKiBgPGF0dHJpYnV0ZT5BdHRyaWJ1dGUobW9kZWwpYCBzZXJpYWxpemVycyBhbmQgbW9kZWwgYWNjZXNzb3JzIHJlbWFpbiB0aGVcbiAgICogc291cmNlIG9mIGZyb250ZW5kLXZpc2libGUgdmFsdWVzIChEYXRlIHZhbHVlcyBhcmUga2VwdCByYXcgc28gdGhlIG5vcm1hbFxuICAgKiBmcm9udGVuZC1tb2RlbCB0cmFuc3BvcnQgc2VyaWFsaXplciBjYW4gZW1pdCBpdHMgZGF0ZSBtYXJrZXIpLiBQcm9qZWN0ZWRcbiAgICoga2V5cyB1c2UgY2Fub25pY2FsIG1vZGVsIGF0dHJpYnV0ZSBuYW1lcyBldmVuIHdoZW4gdGhlIG11dGF0aW9uIHVzZWQgYVxuICAgKiBkYXRhYmFzZS1jb2x1bW4gYWxpYXMuIFRoZSBmdWxsIG1vZGVsIGF0dHJpYnV0ZSBoYXNoIGlzIG5ldmVyIGV4cG9zZWQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gUHJvamVjdGlvbiBhcmdzLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gYXJncy5hdHRyaWJ1dGVzIC0gUGVybWl0dGVkIGFmZmVjdGVkIG11dGF0aW9uIGF0dHJpYnV0ZXMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IGFyZ3MuZXhpc3RpbmdSZWNvcmQgLSBBdXRob3JpemVkIHNlcnZlciByZWNvcmQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZnJvbnRlbmQtbW9kZWwtcmVzb3VyY2UvYmFzZS1yZXNvdXJjZS5qc1wiKS5kZWZhdWx0fSBhcmdzLnJlc291cmNlIC0gUm91dGVkIHJlc291cmNlIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4+fSBTZXJpYWxpemVkIHJlYWRhYmxlIGFmZmVjdGVkIGF0dHJpYnV0ZXMuXG4gICAqL1xuICBhc3luYyBzZXJpYWxpemVkUm91dGVkQ29uZmxpY3RBdHRyaWJ1dGVzKHthdHRyaWJ1dGVzLCBleGlzdGluZ1JlY29yZCwgcmVzb3VyY2V9KSB7XG4gICAgY29uc3QgTW9kZWxDbGFzcyA9IHJlc291cmNlLm1vZGVsQ2xhc3MoKVxuICAgIGNvbnN0IFJlc291cmNlQ2xhc3MgPSAvKiogQHR5cGUge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlfSAqLyAocmVzb3VyY2UuY29uc3RydWN0b3IpXG4gICAgY29uc3QgcmVhZGFibGVBdHRyaWJ1dGVzID0gbmV3IFNldCgpXG4gICAgY29uc3QgY29uZmlndXJlZEF0dHJpYnV0ZXMgPSBSZXNvdXJjZUNsYXNzLnJlc291cmNlQ29uZmlnKCkuYXR0cmlidXRlc1xuICAgIGNvbnN0IGNvbmZpZ3VyZWRFbnRyaWVzID0gQXJyYXkuaXNBcnJheShjb25maWd1cmVkQXR0cmlidXRlcykgPyBjb25maWd1cmVkQXR0cmlidXRlcyA6IE9iamVjdC5rZXlzKGNvbmZpZ3VyZWRBdHRyaWJ1dGVzKVxuXG4gICAgaWYgKGNvbmZpZ3VyZWRFbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3QgYXR0cmlidXRlTmFtZVRvQ29sdW1uTmFtZSA9IE1vZGVsQ2xhc3MuZ2V0QXR0cmlidXRlTmFtZVRvQ29sdW1uTmFtZU1hcCgpXG5cbiAgICAgIGZvciAoY29uc3QgYXR0cmlidXRlTmFtZSBvZiBPYmplY3Qua2V5cyhhdHRyaWJ1dGVOYW1lVG9Db2x1bW5OYW1lKSkge1xuICAgICAgICByZWFkYWJsZUF0dHJpYnV0ZXMuYWRkKGF0dHJpYnV0ZU5hbWUpXG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjb25maWd1cmVkQXR0cmlidXRlIG9mIGNvbmZpZ3VyZWRFbnRyaWVzKSB7XG4gICAgICBjb25zdCBjb25maWd1cmVkTmFtZSA9IHR5cGVvZiBjb25maWd1cmVkQXR0cmlidXRlID09PSBcInN0cmluZ1wiID8gY29uZmlndXJlZEF0dHJpYnV0ZSA6IGNvbmZpZ3VyZWRBdHRyaWJ1dGUubmFtZVxuXG4gICAgICBpZiAoIWNvbmZpZ3VyZWROYW1lKSBjb250aW51ZVxuXG4gICAgICBjb25zdCBjYW5vbmljYWxOYW1lID0gTW9kZWxDbGFzcy5yZXNvbHZlQXR0cmlidXRlTmFtZShjb25maWd1cmVkTmFtZSlcblxuICAgICAgcmVhZGFibGVBdHRyaWJ1dGVzLmFkZChjYW5vbmljYWxOYW1lIHx8IGNvbmZpZ3VyZWROYW1lKVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAqL1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRBdHRyaWJ1dGVzID0ge31cblxuICAgIGZvciAoY29uc3QgYWZmZWN0ZWRGaWVsZCBvZiBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKSkge1xuICAgICAgY29uc3QgYXR0cmlidXRlTmFtZSA9IE1vZGVsQ2xhc3MucmVzb2x2ZUF0dHJpYnV0ZU5hbWUoYWZmZWN0ZWRGaWVsZClcblxuICAgICAgaWYgKCFhdHRyaWJ1dGVOYW1lIHx8ICFyZWFkYWJsZUF0dHJpYnV0ZXMuaGFzKGF0dHJpYnV0ZU5hbWUpKSBjb250aW51ZVxuXG4gICAgICBjb25zdCByZXNvdXJjZUF0dHJpYnV0ZSA9IHJlc291cmNlLnJlc291cmNlTWV0aG9kKGAke2F0dHJpYnV0ZU5hbWV9QXR0cmlidXRlYClcblxuICAgICAgaWYgKHJlc291cmNlQXR0cmlidXRlKSB7XG4gICAgICAgIHNlcmlhbGl6ZWRBdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdID0gYXdhaXQgcmVzb3VyY2VBdHRyaWJ1dGUubWV0aG9kLmNhbGwocmVzb3VyY2VBdHRyaWJ1dGUucmVzb3VyY2UsIGV4aXN0aW5nUmVjb3JkKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZWNvcmRNZXRob2RzID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovICgvKiogQHR5cGUge3Vua25vd259ICovIChleGlzdGluZ1JlY29yZCkpXG4gICAgICBjb25zdCBhdHRyaWJ1dGVNZXRob2QgPSByZWNvcmRNZXRob2RzW2F0dHJpYnV0ZU5hbWVdXG5cbiAgICAgIGlmICh0eXBlb2YgYXR0cmlidXRlTWV0aG9kID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgc2VyaWFsaXplZEF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0gPSBhd2FpdCBhdHRyaWJ1dGVNZXRob2QuY2FsbChleGlzdGluZ1JlY29yZClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlcmlhbGl6ZWRBdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdID0gZXhpc3RpbmdSZWNvcmQucmVhZEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzZXJpYWxpemVkQXR0cmlidXRlc1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYSByb3V0ZWQgbXV0YXRpb24gcGF5bG9hZCBkb3duIHRvIHRoZSByZXNvdXJjZSdzIGRlY2xhcmVkXG4gICAqIHdyaXRhYmxlLWF0dHJpYnV0ZSBwZXJtaXQgbGlzdC4gQWNjZXB0ZWQga2V5cyBwZXIgcGVybWl0dGVkIGF0dHJpYnV0ZSBhcmVcbiAgICogdGhlIGNhbWVsQ2FzZSBhdHRyaWJ1dGUgbmFtZSBwbHVzIHRoZSBtb2RlbCdzIGFjdHVhbCBjb2x1bW4gbmFtZTsgdW5rbm93blxuICAgKiBrZXlzIGZhaWwgdGhlIHN5bmMgbG91ZGx5LiBUaGUgcHJpbWFyeSBrZXkgaXMgZHJvcHBlZCB3aGVuIHBlcm1pdHRlZFxuICAgKiAoc25hcHNob3QgcGF5bG9hZHMpIOKAlCB0aGUgZW52ZWxvcGUncyByZXNvdXJjZUlkIGlzIHRoZSBhdXRob3JpdGF0aXZlXG4gICAqIHJlY29yZCBpZGVudGl0eSwgc28gYSBwYXlsb2FkIGlkIGNhbiBuZXZlciByZXRhcmdldCB0aGUgcm93LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCIpLlN5bmNSZXBsYXlNdXRhdGlvbn0gYXJncy5tdXRhdGlvbiAtIE5vcm1hbGl6ZWQgcmVwbGF5IG11dGF0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVsLXJlc291cmNlL2Jhc2UtcmVzb3VyY2UuanNcIikuZGVmYXVsdH0gYXJncy5yZXNvdXJjZSAtIFJvdXRlZCByZXNvdXJjZSBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gUGVybWl0dGVkIGF0dHJpYnV0ZXMgZm9yIHJlY29yZC5hc3NpZ24uXG4gICAqL1xuICBwZXJtaXR0ZWRSb3V0ZWRBdHRyaWJ1dGVzKHttdXRhdGlvbiwgcmVzb3VyY2V9KSB7XG4gICAgY29uc3QgcGVybWl0dGVkQXR0cmlidXRlcyA9IHJlc291cmNlLmRlY2xhcmVkV3JpdGFibGVBdHRyaWJ1dGVzKClcblxuICAgIGlmICghcGVybWl0dGVkQXR0cmlidXRlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3Jlc291cmNlLmNvbnN0cnVjdG9yLm5hbWV9IG11c3QgZGVjbGFyZSBzdGF0aWMgd3JpdGFibGVBdHRyaWJ1dGVzIHRvIGFwcGx5IHJvdXRlZCBzeW5jIG11dGF0aW9ucyBmb3I6ICR7bXV0YXRpb24ucmVzb3VyY2VUeXBlfWApXG4gICAgfVxuXG4gICAgY29uc3QgTW9kZWxDbGFzcyA9IHJlc291cmNlLm1vZGVsQ2xhc3MoKVxuICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWVUb0NvbHVtbk5hbWUgPSBNb2RlbENsYXNzLmdldEF0dHJpYnV0ZU5hbWVUb0NvbHVtbk5hbWVNYXAoKVxuXG4gICAgLyoqIEB0eXBlIHtTZXQ8c3RyaW5nPn0gKi9cbiAgICBjb25zdCBhbGxvd2VkS2V5cyA9IG5ldyBTZXQoKVxuXG4gICAgZm9yIChjb25zdCBhdHRyaWJ1dGVOYW1lIG9mIHBlcm1pdHRlZEF0dHJpYnV0ZXMpIHtcbiAgICAgIGFsbG93ZWRLZXlzLmFkZChhdHRyaWJ1dGVOYW1lKVxuXG4gICAgICBjb25zdCBjb2x1bW5OYW1lID0gYXR0cmlidXRlTmFtZVRvQ29sdW1uTmFtZVthdHRyaWJ1dGVOYW1lXVxuXG4gICAgICBpZiAoY29sdW1uTmFtZSkgYWxsb3dlZEtleXMuYWRkKGNvbHVtbk5hbWUpXG4gICAgfVxuXG4gICAgY29uc3QgcHJpbWFyeUtleSA9IE1vZGVsQ2xhc3MucHJpbWFyeUtleSgpXG4gICAgY29uc3QgcHJpbWFyeUtleUF0dHJpYnV0ZSA9IE1vZGVsQ2xhc3MuZ2V0Q29sdW1uTmFtZVRvQXR0cmlidXRlTmFtZU1hcCgpW3ByaW1hcnlLZXldXG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi9cbiAgICBjb25zdCBhdHRyaWJ1dGVzID0ge31cblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG11dGF0aW9uLmRhdGEpKSB7XG4gICAgICBpZiAoIWFsbG93ZWRLZXlzLmhhcyhrZXkpKSB7XG4gICAgICAgIHRocm93IHJlc291cmNlLndyaXRhYmxlQXR0cmlidXRlRXJyb3IoYFVua25vd24gYXR0cmlidXRlOiAke2tleX0uYCwge2NvZGU6IFwic3luYy11bmtub3duLWF0dHJpYnV0ZVwifSlcbiAgICAgIH1cblxuICAgICAgaWYgKGtleSA9PT0gcHJpbWFyeUtleSB8fCBrZXkgPT09IHByaW1hcnlLZXlBdHRyaWJ1dGUpIGNvbnRpbnVlXG5cbiAgICAgIGF0dHJpYnV0ZXNba2V5XSA9IHZhbHVlXG4gICAgfVxuXG4gICAgcmV0dXJuIGF0dHJpYnV0ZXNcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSByb3V0ZWQgcmVjb3JkIHdpdGggdGhlIGNsaWVudC1nZW5lcmF0ZWQgcHJpbWFyeSBrZXkgKG1hcmtlZFxuICAgKiBhcyBhIHNlcnZlciBhcHBseSBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBjcmVhdGUgLSBpbmNsdWRpbmcgdGhlXG4gICAqIG1lbWJlcnNoaXAtY2hlY2sgY29tcGVuc2F0aW9uIGRlc3Ryb3kgLSBzbyBhbiBhY3RpdmUgU3luY1B1Ymxpc2hlciBuZXZlclxuICAgKiBwdWJsaXNoZXMgdGhlIHJlcGxheWVkIGNyZWF0ZSBhIHNlY29uZCB0aW1lKSwgdGhlblxuICAgKiB2ZXJpZmllcyBjcmVhdGUtc2NvcGUgbWVtYmVyc2hpcCB3aGVuIGFuIGFiaWxpdHkgaXMgY29uZmlndXJlZDogcmVjb3Jkc1xuICAgKiBvdXRzaWRlIHRoZSBhYmlsaXR5J3MgY3JlYXRlIHNjb3BlIGFyZSBkZXN0cm95ZWQgYWdhaW4gYW5kIGZhaWwgdGhlIHN5bmNcbiAgICogd2l0aCB0aGUgcmVzb3VyY2UtZGVjbGFyZWQgcmVhc29uLiBBIHJlY29yZCB0aGF0IGFscmVhZHkgZXhpc3RzIG91dHNpZGVcbiAgICogdGhlIHJlc291cmNlJ3MgbG9va3VwIHNjb3BlIGZhaWxzIHRoZSBzeW5jIGFzIGFuIGF1dGhvcml6YXRpb24gZGVuaWFsXG4gICAqIGluc3RlYWQgb2YgY29sbGlkaW5nIG9uIHRoZSBwcmltYXJ5IGtleS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gYXJncy5hdHRyaWJ1dGVzIC0gUGVybWl0dGVkIHBheWxvYWQgYXR0cmlidXRlcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanNcIikuU3luY1JlcGxheU11dGF0aW9ufSBhcmdzLm11dGF0aW9uIC0gTm9ybWFsaXplZCByZXBsYXkgbXV0YXRpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZnJvbnRlbmQtbW9kZWwtcmVzb3VyY2UvYmFzZS1yZXNvdXJjZS5qc1wiKS5kZWZhdWx0fSBhcmdzLnJlc291cmNlIC0gUm91dGVkIHJlc291cmNlIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdD59IENyZWF0ZWQgcmVjb3JkLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlUm91dGVkUmVwbGF5UmVjb3JkKHthdHRyaWJ1dGVzLCBtdXRhdGlvbiwgcmVzb3VyY2V9KSB7XG4gICAgY29uc3QgTW9kZWxDbGFzcyA9IHJlc291cmNlLm1vZGVsQ2xhc3MoKVxuICAgIGNvbnN0IHByaW1hcnlLZXkgPSBNb2RlbENsYXNzLnByaW1hcnlLZXkoKVxuICAgIGNvbnN0IGNvbmZsaWN0aW5nSWRzID0gYXdhaXQgTW9kZWxDbGFzcy53aGVyZSh7W3ByaW1hcnlLZXldOiBtdXRhdGlvbi5yZXNvdXJjZUlkfSkucGx1Y2socHJpbWFyeUtleSlcblxuICAgIGlmIChjb25mbGljdGluZ0lkcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBWZWxvY2lvdXNFcnJvci5zYWZlKGBTeW5jIHVwZGF0ZSBkZW5pZWQgZm9yOiAke211dGF0aW9uLnJlc291cmNlVHlwZX0uYCwge1xuICAgICAgICBjb2RlOiByZXNvdXJjZS5zeW5jQXV0aG9yaXphdGlvbkZhaWx1cmVSZWFzb24oe2FjdGlvbjogXCJ1cGRhdGVcIiwgbXV0YXRpb259KSB8fCBcImFjY2Vzcy1kZW5pZWRcIlxuICAgICAgfSlcbiAgICB9XG5cbiAgICBhd2FpdCBNb2RlbENsYXNzLmVuc3VyZUluaXRpYWxpemVkKClcblxuICAgIGNvbnN0IHJlY29yZCA9IG5ldyBNb2RlbENsYXNzKHtbcHJpbWFyeUtleV06IG11dGF0aW9uLnJlc291cmNlSWQsIC4uLmF0dHJpYnV0ZXN9KVxuICAgIGNvbnN0IHJlbGVhc2VTZXJ2ZXJBcHBseSA9IG1hcmtTZXJ2ZXJBcHBseShyZWNvcmQpXG5cbiAgICB0cnkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgcmVjb3JkLnNhdmUoKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgdGhpcy5yb3V0ZWRSZXBsYXlTYXZlRXJyb3IoZXJyb3IpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFiaWxpdHkgPSByZXNvdXJjZS5hYmlsaXR5XG5cbiAgICAgIGlmIChhYmlsaXR5KSB7XG4gICAgICAgIGNvbnN0IG1lbWJlcklkcyA9IGF3YWl0IE1vZGVsQ2xhc3NcbiAgICAgICAgICAuYWNjZXNzaWJsZUZvcihyZXNvdXJjZS5zeW5jQWJpbGl0eUFjdGlvbihcImNyZWF0ZVwiKSwgYWJpbGl0eSlcbiAgICAgICAgICAud2hlcmUoe1twcmltYXJ5S2V5XTogcmVjb3JkLmlkKCl9KVxuICAgICAgICAgIC5wbHVjayhwcmltYXJ5S2V5KVxuXG4gICAgICAgIGlmIChtZW1iZXJJZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgYXdhaXQgcmVjb3JkLmRlc3Ryb3koKVxuXG4gICAgICAgICAgdGhyb3cgVmVsb2Npb3VzRXJyb3Iuc2FmZShgU3luYyBjcmVhdGUgZGVuaWVkIGZvcjogJHttdXRhdGlvbi5yZXNvdXJjZVR5cGV9LmAsIHtcbiAgICAgICAgICAgIGNvZGU6IHJlc291cmNlLnN5bmNBdXRob3JpemF0aW9uRmFpbHVyZVJlYXNvbih7YWN0aW9uOiBcImNyZWF0ZVwiLCBtdXRhdGlvbn0pIHx8IFwiYWNjZXNzLWRlbmllZFwiXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVjb3JkXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHJlbGVhc2VTZXJ2ZXJBcHBseSgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVzIGEgcm91dGVkIHJlY29yZCwgY29udmVydGluZyBtb2RlbCB2YWxpZGF0aW9uIGZhaWx1cmVzIGludG9cbiAgICogY2xpZW50LXNhZmUgcGVyLXN5bmMgZXJyb3JzIGNhcnJ5aW5nIHRoZSB0cmFuc2xhdGVkIHZhbGlkYXRpb24gbWVzc2FnZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gcmVjb3JkIC0gUmVjb3JkIHRvIHNhdmUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyB3aGVuIHNhdmVkLlxuICAgKi9cbiAgYXN5bmMgc2F2ZVJvdXRlZFJlcGxheVJlY29yZChyZWNvcmQpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgcmVjb3JkLnNhdmUoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyB0aGlzLnJvdXRlZFJlcGxheVNhdmVFcnJvcihlcnJvcilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWFwcyBhIHJvdXRlZCBzYXZlL2NyZWF0ZSBmYWlsdXJlOiBtb2RlbCB2YWxpZGF0aW9uIGVycm9ycyBiZWNvbWVcbiAgICogY2xpZW50LXNhZmUgZXJyb3JzIHdpdGggdGhlaXIgdHJhbnNsYXRlZCBtZXNzYWdlcywgZXZlcnl0aGluZyBlbHNlXG4gICAqIHByb3BhZ2F0ZXMgdW5jaGFuZ2VkLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBlcnJvciAtIFRocm93biBzYXZlL2NyZWF0ZSBlcnJvci5cbiAgICogQHJldHVybnMge0Vycm9yfSBFcnJvciB0byByZXRocm93LlxuICAgKi9cbiAgcm91dGVkUmVwbGF5U2F2ZUVycm9yKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVmFsaWRhdGlvbkVycm9yKSB7XG4gICAgICByZXR1cm4gVmVsb2Npb3VzRXJyb3Iuc2FmZShlcnJvci5tZXNzYWdlLCB7Y2F1c2U6IGVycm9yLCBjb2RlOiBcInZhbGlkYXRpb24tZXJyb3JcIn0pXG4gICAgfVxuXG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7RXJyb3J9ICovIChlcnJvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhbiBhcHBseSByZXN1bHQgZm9yIHN0YWxlIG11dGF0aW9ucyB0aGF0IHNob3VsZCBub3QgdG91Y2ggZG9tYWluIG1vZGVscy5cbiAgICogRXhhY3QgZHVwbGljYXRlcyByZXNvbHZlIHRoZSBjdXJyZW50IHJvdXRlZCByZWNvcmQgc28gdGhlIGFja25vd2xlZGdlbWVudFxuICAgKiBjYW4gaW5jbHVkZSBpdHMgYXV0aG9yaXRhdGl2ZSB2ZXJzaW9uIHdpdGhvdXQgYXBwbHlpbmcgdGhlIG11dGF0aW9uIGFnYWluLlxuICAgKiBAcGFyYW0ge3thY3RvcjogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4sIGNvbnRleHQ6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PiwgZXhpc3RpbmdTeW5jOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgbXV0YXRpb246IGltcG9ydChcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiKS5TeW5jUmVwbGF5TXV0YXRpb259fSBhcmdzIC0gQWN0b3IsIGJhdGNoIGNvbnRleHQsIGV4aXN0aW5nIHN5bmMgcm93LCBhbmQgbXV0YXRpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gUHJvamVjdC1zcGVjaWZpYyBhcHBseSByZXN1bHQuXG4gICAqL1xuICBhc3luYyBza2lwcGVkUmVwbGF5TXV0YXRpb24oe2FjdG9yLCBjb250ZXh0LCBleGlzdGluZ1N5bmMsIG11dGF0aW9ufSkge1xuICAgIGlmICghdGhpcy5pc0R1cGxpY2F0ZVJlcGxheU11dGF0aW9uKHtleGlzdGluZ1N5bmMsIG11dGF0aW9ufSkgfHwgIXRoaXMucm91dGluZ0NvbmZpZ3VyZWQoKSkgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IHRoaXMucmVwbGF5UmVzb3VyY2VSZWdpc3RyYXRpb24obXV0YXRpb24ucmVzb3VyY2VUeXBlKVxuXG4gICAgaWYgKCFyZWdpc3RyYXRpb24pIHJldHVybiBudWxsXG5cbiAgICBjb25zdCByZXNvdXJjZSA9IGF3YWl0IHRoaXMuYnVpbGRSZXBsYXlSZXNvdXJjZSh7YWN0b3IsIGNvbnRleHQsIG11dGF0aW9uLCByZWdpc3RyYXRpb259KVxuICAgIGNvbnN0IHJlY29yZCA9IGF3YWl0IHJlc291cmNlLmZpbmRTeW5jUmVjb3JkKHtmb3JEZWxldGU6IG11dGF0aW9uLnN5bmNUeXBlID09PSBcImRlbGV0ZVwiLCBtdXRhdGlvbn0pXG5cbiAgICByZXR1cm4ge2NyZWF0ZWQ6IGZhbHNlLCBkZWxldGVkOiBmYWxzZSwgZHVwbGljYXRlOiB0cnVlLCByZWNvcmR9XG4gIH1cblxuICAvKipcbiAgICogUGVyc2lzdHMgb25lIG5vcm1hbGl6ZWQgbXV0YXRpb24gaW50byB0aGUgYXBwIHN5bmMvY2hhbmdlIHN0b3JlLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBhIHN0YWxlLWd1YXJkZWQgc3luYy1tb2RlbCB1cHNlcnQgKHdpdGggc2VydmVyIHJlLXNlcXVlbmNpbmcgb25cbiAgICogdXBkYXRlcykgd2hlbiBhIHN5bmMgbW9kZWwgaXMgY29uZmlndXJlZDsgb3RoZXJ3aXNlIGFwcHMgb3ZlcnJpZGUgdGhpcyBob29rLlxuICAgKiBAcGFyYW0ge3thY3RvcjogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4sIGNvbnRleHQ6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PiwgZXhpc3RpbmdTeW5jOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgYXBwbHlSZXN1bHQ6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCBtdXRhdGlvbjogaW1wb3J0KFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCIpLlN5bmNSZXBsYXlNdXRhdGlvbiwgc2hvdWxkQXBwbHk6IGJvb2xlYW59fSBhcmdzIC0gUmVwbGF5IHBlcnNpc3RlbmNlIGFyZ3VtZW50cy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBwZXJzaXN0UmVwbGF5TXV0YXRpb24oe2FjdG9yLCBhcHBseVJlc3VsdCwgY29udGV4dCwgZXhpc3RpbmdTeW5jLCBtdXRhdGlvbiwgc2hvdWxkQXBwbHl9KSB7XG4gICAgaWYgKCF0aGlzLnN5bmNNb2RlbCkgcmV0dXJuXG5cbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gdGhpcy5yZXBsYXlQZXJzaXN0QXR0cmlidXRlcyh7YWN0b3IsIG11dGF0aW9ufSlcblxuICAgIC8vIFN0YWxlIHJlcGxheXMgbmV2ZXIgYXBwbGllZCBhbnl0aGluZywgc28gdGhlIGFwcGx5UmVzdWx0LWRyaXZlbiBleHRlbnNpb25cbiAgICAvLyBob29rcyBtdXN0IG5vdCBydW4gYWdhaW5zdCB0aGUgZGVmYXVsdCBudWxsIHNraXBwZWQgcmVzdWx0LlxuICAgIGlmICh0aGlzLnBlcnNpc3RFeHRyYUF0dHJpYnV0ZXMgJiYgc2hvdWxkQXBwbHkpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oYXR0cmlidXRlcywgdGhpcy5wZXJzaXN0RXh0cmFBdHRyaWJ1dGVzKHthY3RvciwgYXBwbHlSZXN1bHQsIGNvbnRleHQsIGV4aXN0aW5nU3luYywgbXV0YXRpb24sIHNob3VsZEFwcGx5fSkpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGVyc2lzdFNlcmlhbGl6ZWREYXRhICYmIHNob3VsZEFwcGx5KSB7XG4gICAgICBjb25zdCBzZXJpYWxpemVkRGF0YSA9IHRoaXMucGVyc2lzdFNlcmlhbGl6ZWREYXRhKHthcHBseVJlc3VsdCwgbXV0YXRpb259KVxuXG4gICAgICBpZiAoc2VyaWFsaXplZERhdGEgIT09IHVuZGVmaW5lZCAmJiBzZXJpYWxpemVkRGF0YSAhPT0gbnVsbCkge1xuICAgICAgICBhdHRyaWJ1dGVzLmRhdGEgPSB0eXBlb2Ygc2VyaWFsaXplZERhdGEgPT09IFwic3RyaW5nXCIgPyBzZXJpYWxpemVkRGF0YSA6IEpTT04uc3RyaW5naWZ5KHNlcmlhbGl6ZWREYXRhKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZsaWN0U3RyYXRlZ3kgJiYgc2hvdWxkQXBwbHkgJiYgbXV0YXRpb24uYmFzZVZlcnNpb24gIT09IHVuZGVmaW5lZCAmJiBhcHBseVJlc3VsdD8ucmVjb3JkKSB7XG4gICAgICBjb25zdCBwdWJsaWNQYXlsb2FkID0gZGVjb2RlUmVwbGF5UGVyc2lzdGVkRGF0YShhdHRyaWJ1dGVzLmRhdGEpLnBheWxvYWRcbiAgICAgIGNvbnN0IGFja25vd2xlZGdlbWVudFZlcnNpb24gPSBub3JtYWxpemVDb25mbGljdFZhbHVlKGFwcGx5UmVzdWx0LnJlY29yZC5yZWFkQXR0cmlidXRlKHRoaXMuY29uZmxpY3RTdHJhdGVneS52ZXJzaW9uQXR0cmlidXRlKSlcblxuICAgICAgYXR0cmlidXRlcy5kYXRhID0gc2VyaWFsaXplUmVwbGF5UGVyc2lzdGVkRGF0YSh7XG4gICAgICAgIGFja25vd2xlZGdlbWVudFZlcnNpb24sXG4gICAgICAgIGNsaWVudE11dGF0aW9uSWQ6IFN0cmluZyhtdXRhdGlvbi5jbGllbnRNdXRhdGlvbklkIHx8IG11dGF0aW9uLmlkKSxcbiAgICAgICAgcGF5bG9hZDogcHVibGljUGF5bG9hZCxcbiAgICAgICAgcGF5bG9hZEZpbmdlcnByaW50OiBzaGEyNTZIZXgobXV0YXRpb24uc2VyaWFsaXplZERhdGEpXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmIChleGlzdGluZ1N5bmMpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQ2xpZW50VXBkYXRlZEF0ID0gdGhpcy5leGlzdGluZ1JlcGxheVN5bmNDbGllbnRVcGRhdGVkQXQoZXhpc3RpbmdTeW5jKVxuXG4gICAgICBpZiAoZXhpc3RpbmdDbGllbnRVcGRhdGVkQXQgJiYgbXV0YXRpb24uY2xpZW50VXBkYXRlZEF0IDw9IGV4aXN0aW5nQ2xpZW50VXBkYXRlZEF0KSByZXR1cm5cbiAgICB9XG5cbiAgICBhd2FpdCB1cHNlcnRTeW5jUm93KHthdHRyaWJ1dGVzLCBleGlzdGluZ1N5bmMsIHN5bmNNb2RlbDogdGhpcy5zeW5jTW9kZWx9KVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgc3luYy1tb2RlbCBhdHRyaWJ1dGVzIHBlcnNpc3RlZCBieSB0aGUgbW9kZWwtYmFja2VkIGRlZmF1bHQuXG4gICAqIEBwYXJhbSB7e2FjdG9yOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgbXV0YXRpb246IGltcG9ydChcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiKS5TeW5jUmVwbGF5TXV0YXRpb259fSBhcmdzIC0gQWN0b3IgYW5kIG11dGF0aW9uLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBTeW5jIHJvdyBhdHRyaWJ1dGVzLlxuICAgKi9cbiAgcmVwbGF5UGVyc2lzdEF0dHJpYnV0ZXMoe2FjdG9yLCBtdXRhdGlvbn0pIHtcbiAgICByZXR1cm4ge1xuICAgICAgW3RoaXMuYWN0b3JGb3JlaWduS2V5Q29sdW1uXTogdGhpcy5yZXBsYXlBY3RvcklkKGFjdG9yKSxcbiAgICAgIGNsaWVudF91cGRhdGVkX2F0OiBtdXRhdGlvbi5jbGllbnRVcGRhdGVkQXQsXG4gICAgICBkYXRhOiBtdXRhdGlvbi5zZXJpYWxpemVkRGF0YSxcbiAgICAgIHJlc291cmNlX2lkOiBtdXRhdGlvbi5yZXNvdXJjZUlkLFxuICAgICAgcmVzb3VyY2VfdHlwZTogbXV0YXRpb24ucmVzb3VyY2VUeXBlLFxuICAgICAgc3luY190eXBlOiBtdXRhdGlvbi5zeW5jVHlwZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNpZGUgZWZmZWN0cyBhZnRlciBhIHN1Y2Nlc3NmdWwgbXV0YXRpb24gcmVwbGF5IGFuZCBwZXJzaXN0ZW5jZS5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gZmFubmluZyB0aGUgYXBwbGllZCByZXN1bHQgb3V0IHRocm91Z2ggdGhlIGNvbmZpZ3VyZWRcbiAgICogZGVjbGFyYXRpdmUgYnJvYWRjYXN0cy5cbiAgICogQHBhcmFtIHt7YWN0b3I6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4sIGV4aXN0aW5nU3luYzogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4sIGFwcGx5UmVzdWx0OiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgbXV0YXRpb246IGltcG9ydChcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiKS5TeW5jUmVwbGF5TXV0YXRpb24sIHNob3VsZEFwcGx5OiBib29sZWFufX0gYXJncyAtIFJlcGxheSBzaWRlLWVmZmVjdCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgYWZ0ZXJSZXBsYXlNdXRhdGlvbihhcmdzKSB7XG4gICAgaWYgKCF0aGlzLmJyb2FkY2FzdHMgfHwgIXRoaXMuYnJvYWRjYXN0ZXIpIHJldHVyblxuICAgIC8vIFN0YWxlIHJlcGxheXMgbmV2ZXIgYXBwbGllZCBhbnl0aGluZyAtIGJyb2FkY2FzdGluZyB0aGVpciBza2lwcGVkIHJlc3VsdHNcbiAgICAvLyB3b3VsZCBmYW4gb3V0IHN0YWxlIHNpZGUgZWZmZWN0cyAob3IgY3Jhc2ggb24gdGhlIGRlZmF1bHQgbnVsbCBhcHBseVJlc3VsdCkuXG4gICAgaWYgKCFhcmdzLnNob3VsZEFwcGx5KSByZXR1cm5cblxuICAgIGF3YWl0IGRlbGl2ZXJEZWNsYXJlZEJyb2FkY2FzdHMoe2FyZ3MsIGJyb2FkY2FzdGVyOiB0aGlzLmJyb2FkY2FzdGVyLCBicm9hZGNhc3RzOiB0aGlzLmJyb2FkY2FzdHN9KVxuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGRldGVybWluaXN0aWMsIE15U1FMLXNhZmUgYWR2aXNvcnktbG9jayBuYW1lIGZvciBhIHJvdXRlZCByZXBsYXlcbiAqIHJlc291cmNlIGlkZW50aXR5LiBUaGUgZnVsbCBge3Jlc291cmNlVHlwZSwgcmVzb3VyY2VJZH1gIGlkZW50aXR5IGlzIGhhc2hlZFxuICogd2l0aCBTSEEtMjU2IGFuZCB0cnVuY2F0ZWQgdG8gMzIgaGV4IGNoYXJhY3RlcnMgc28gdGhlIGZpbmFsIG5hbWUgc3RheXMgd2VsbFxuICogdW5kZXIgTXlTUUwvTWFyaWFEQidzIDY0LWNoYXJhY3RlciBgR0VUX0xPQ0tgIGxpbWl0IHdoaWxlIHJlbWFpbmluZ1xuICogY29sbGlzaW9uLXJlc2lzdGFudC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gTG9jayBpZGVudGl0eSBhcmdzLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MucmVzb3VyY2VJZCAtIFJlc291cmNlIGlkLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MucmVzb3VyY2VUeXBlIC0gUmVzb3VyY2UgdHlwZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gQWR2aXNvcnkgbG9jayBuYW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3luY1JlcGxheUNvbmZsaWN0TG9ja05hbWUoe3Jlc291cmNlSWQsIHJlc291cmNlVHlwZX0pIHtcbiAgY29uc3QgaWRlbnRpdHkgPSBzdGFibGVKc29uU3RyaW5naWZ5KHtyZXNvdXJjZUlkLCByZXNvdXJjZVR5cGV9KVxuICBjb25zdCBoYXNoID0gc2hhMjU2SGV4KGlkZW50aXR5KS5zbGljZSgwLCAzMilcblxuICByZXR1cm4gYHZzcjoke2hhc2h9YFxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSB2ZXJzaW9uIHZhbHVlIGZvciBkZXRlcm1pbmlzdGljIGNvbXBhcmlzb24gYW5kIHRyYW5zcG9ydC5cbiAqIE9ubHkgdmVyc2lvbiB2YWx1ZXMgcGFydGljaXBhdGUgaW4gc3RhYmxlLUpTT04gY29tcGFyaXNvbiBhZ2FpbnN0IGNsaWVudFxuICogYGJhc2VWZXJzaW9uYCBzdHJpbmdzOyByZXNvdXJjZSBzZXJpYWxpemVyL2FjY2Vzc29yIHJlc3VsdHMgbXVzdCBzdGF5IHJhdyBzb1xuICogdGhlIGZyb250ZW5kLW1vZGVsIHRyYW5zcG9ydCBzZXJpYWxpemVyIGNhbiByZXRhaW4gRGF0ZSBtYXJrZXJzLlxuICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gdmFsdWUgLSBSYXcgdmVyc2lvbiB2YWx1ZSBmcm9tIGEgZGF0YWJhc2UgcmVjb3JkLlxuICogQHJldHVybnMge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSAtIE5vcm1hbGl6ZWQgdmFsdWUgKERhdGUgdmFsdWVzIGJlY29tZSBJU08gc3RyaW5ncykuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNvbmZsaWN0VmFsdWUodmFsdWUpIHtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIHZhbHVlLnRvSVNPU3RyaW5nKClcblxuICByZXR1cm4gdmFsdWVcbn1cbiJdfQ==
|
|
1044
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zeW5jL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyx5QkFBeUIsRUFBRSxhQUFhLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQTtBQUNoRixPQUFPLEVBQUMsd0NBQXdDLEVBQUMsTUFBTSw2Q0FBNkMsQ0FBQTtBQUNwRyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sK0JBQStCLENBQUE7QUFDN0QsT0FBTyxFQUFDLGlDQUFpQyxFQUFDLE1BQU0sMkNBQTJDLENBQUE7QUFDM0YsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sd0JBQXdCLENBQUE7QUFDMUQsT0FBTyx1QkFBdUIsTUFBTSxpQ0FBaUMsQ0FBQTtBQUNyRSxPQUFPLG1CQUFtQixNQUFNLGtCQUFrQixDQUFBO0FBQ2xELE9BQU8sU0FBUyxNQUFNLHdCQUF3QixDQUFBO0FBQzlDLE9BQU8sRUFBQyx5QkFBeUIsRUFBRSw0QkFBNEIsRUFBQyxNQUFNLGlDQUFpQyxDQUFBO0FBQ3ZHLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQTtBQUMzRCxPQUFPLGNBQWMsTUFBTSx1QkFBdUIsQ0FBQTtBQUNsRCxPQUFPLEVBQUMscUJBQXFCLEVBQUUsMEJBQTBCLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQTtBQUUvRjs7Ozs7O0dBTUc7QUFDSDs7Ozs7Ozs7Ozs7R0FXRztBQUNIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8seUJBQXlCO0lBQzVDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0EyQkc7SUFDSCxZQUFZLElBQUksR0FBRyxFQUFFO1FBQ25CLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFB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QUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBQyxDQUFDLENBQUE7SUFDckcsQ0FBQztDQUNGO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sVUFBVSwwQkFBMEIsQ0FBQyxFQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUM7SUFDbkUsTUFBTSxRQUFRLEdBQUcsbUJBQW1CLENBQUMsRUFBQyxVQUFVLEVBQUUsWUFBWSxFQUFDLENBQUMsQ0FBQTtJQUNoRSxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUU3QyxPQUFPLE9BQU8sSUFBSSxFQUFFLENBQUE7QUFDdEIsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLHNCQUFzQixDQUFDLEtBQUs7SUFDbkMsSUFBSSxLQUFLLFlBQVksSUFBSTtRQUFFLE9BQU8sS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFBO0lBRXJELE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge2RlbGl2ZXJEZWNsYXJlZEJyb2FkY2FzdHMsIHVwc2VydFN5bmNSb3d9IGZyb20gXCIuL3N5bmMtY2hhbmdlLWZhbm91dC5qc1wiXG5pbXBvcnQge2Zyb250ZW5kTW9kZWxSZXNvdXJjZUludGVybmFsQ29uc3RydWN0b3J9IGZyb20gXCIuLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCJcbmltcG9ydCB7bWFya1NlcnZlckFwcGx5fSBmcm9tIFwiLi9zeW5jLXB1Ymxpc2gtc3VwcHJlc3Npb24uanNcIlxuaW1wb3J0IHtyZXNvbHZlRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3N9IGZyb20gXCIuLi9mcm9udGVuZC1tb2RlbHMvcmVzb3VyY2UtZGVmaW5pdGlvbi5qc1wiXG5pbXBvcnQge3Jlc29sdmVTeW5jQ29uZmxpY3R9IGZyb20gXCIuL2NvbmZsaWN0LXN0cmF0ZWd5LmpzXCJcbmltcG9ydCBTeW5jUmVwbGF5VXBzZXJ0QXBwbGllciBmcm9tIFwiLi9zeW5jLXJlcGxheS11cHNlcnQtYXBwbGllci5qc1wiXG5pbXBvcnQgc3RhYmxlSnNvblN0cmluZ2lmeSBmcm9tIFwiLi9zdGFibGUtanNvbi5qc1wiXG5pbXBvcnQgc2hhMjU2SGV4IGZyb20gXCIuLi91dGlscy9zaGEyNTYtaGV4LmpzXCJcbmltcG9ydCB7ZGVjb2RlUmVwbGF5UGVyc2lzdGVkRGF0YSwgc2VyaWFsaXplUmVwbGF5UGVyc2lzdGVkRGF0YX0gZnJvbSBcIi4vc3luYy1yZXBsYXktcGVyc2lzdGVkLWRhdGEuanNcIlxuaW1wb3J0IHtWYWxpZGF0aW9uRXJyb3J9IGZyb20gXCIuLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIlxuaW1wb3J0IFZlbG9jaW91c0Vycm9yIGZyb20gXCIuLi92ZWxvY2lvdXMtZXJyb3IuanNcIlxuaW1wb3J0IHtzY2FsYXJNb2RlbFByaW1hcnlLZXksIHNjYWxhck1vZGVsUHJpbWFyeUtleVZhbHVlfSBmcm9tIFwiLi4vdXRpbHMvbW9kZWwtcHJpbWFyeS1rZXkuanNcIlxuXG4vKipcbiAqIFJlc29sdmVkIHJvdXRlZC1yZXNvdXJjZSByZWdpc3RyYXRpb24gZm9yIG9uZSByZXBsYXkgcmVzb3VyY2UgdHlwZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN5bmNSZXBsYXlSZXNvdXJjZVJlZ2lzdHJhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1vZGVsTmFtZSAtIEVmZmVjdGl2ZSBmcm9udGVuZCBtb2RlbCBuYW1lLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZX0gcmVzb3VyY2VDbGFzcyAtIFJvdXRlZCByZXNvdXJjZSBjbGFzcy5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Ob3JtYWxpemVkRnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbiB8IG51bGx9IHJlc291cmNlQ29uZmlndXJhdGlvbiAtIE5vcm1hbGl6ZWQgcmVzb3VyY2UgY29uZmlndXJhdGlvbiB3aGVuIHJlZ2lzdHJ5LXJlc29sdmVkLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN5bmNSZXBsYXlNdXRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudW1iZXIgfCBudWxsfSBbYmFzZVZlcnNpb25dIC0gQmFzZSBzZXJ2ZXIvY2xpZW50IHZlcnNpb24gb2JzZXJ2ZWQgYnkgdGhlIGNsaWVudC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY2xpZW50TXV0YXRpb25JZF0gLSBPcmlnaW5hbCBjbGllbnQgbXV0YXRpb24gaWQgZnJvbSB0aGUgc2lnbmVkIGVudmVsb3BlLlxuICogQHByb3BlcnR5IHtEYXRlfSBjbGllbnRVcGRhdGVkQXQgLSBDbGllbnQtc2lkZSBtdXRhdGlvbiB0aW1lc3RhbXAuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gZGF0YSAtIFBhcnNlZCBtdXRhdGlvbiBwYXlsb2FkLlxuICogQHByb3BlcnR5IHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gaWQgLSBDbGllbnQgc3luYyByb3cgaWQgZm9yIHBlci1zeW5jIHJlc3BvbnNlcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByZXNvdXJjZUlkIC0gUmVzb3VyY2UgaWQgYXMgYSBzdHJpbmcuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmVzb3VyY2VUeXBlIC0gUmVzb3VyY2UvbW9kZWwgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzZXJpYWxpemVkRGF0YSAtIEpTT04gc2VyaWFsaXplZCBtdXRhdGlvbiBwYXlsb2FkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN5bmNUeXBlIC0gU3luYyBvcGVyYXRpb24gdHlwZS5cbiAqL1xuLyoqXG4gKiBPbmUgZGVjbGFyYXRpdmUgYnJvYWRjYXN0IGZhbm5lZCBvdXQgYWZ0ZXIgYSBtdXRhdGlvbiBhcHBsaWVzLlxuICogQHR5cGVkZWYge29iamVjdH0gU3luY1JlcGxheUJyb2FkY2FzdFxuICogQHByb3BlcnR5IHtzdHJpbmcgfCAoKGFyZ3M6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PikgPT4gc3RyaW5nKX0gY2hhbm5lbCAtIENoYW5uZWwgbmFtZSBvciByZXNvbHZlci5cbiAqIEBwcm9wZXJ0eSB7KGFyZ3M6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PikgPT4gUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBicm9hZGNhc3RQYXJhbXMgLSBDaGFubmVsIHJvdXRpbmcgcGFyYW1zLlxuICogQHByb3BlcnR5IHsoYXJnczogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+KSA9PiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gYm9keSAtIEJyb2FkY2FzdCBib2R5LlxuICogQHByb3BlcnR5IHsoYXJnczogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+KSA9PiBib29sZWFufSBbd2hlbl0gLSBPcHRpb25hbCBnYXRlOyBza2lwcGVkIHdoZW4gaXQgcmV0dXJucyBmYWxzZS5cbiAqL1xuXG4vKipcbiAqIFJlcGxheXMgY2xpZW50IHN5bmMgZW52ZWxvcGVzIHRocm91Z2ggcHJvamVjdCBzdXBwbGllZCBhdXRoZW50aWNhdGlvbixcbiAqIGF1dGhvcml6YXRpb24sIGFwcGxpY2F0aW9uLCBhbmQgcGVyc2lzdGVuY2UgaG9va3MuXG4gKlxuICogVGhpcyBpcyBpbnRlbnRpb25hbGx5IHRyYW5zcG9ydC9tb2RlbCBhZ25vc3RpYzogVmVsb2Npb3VzIG93bnMgdGhlIGdlbmVyaWNcbiAqIHJlcGxheSBsb29wLCBub3JtYWxpemF0aW9uLCBzdGFsZS1jbGllbnQgY29tcGFyaXNvbiwgYW5kIHBlci1zeW5jIHJlc3VsdFxuICogc2hhcGUgd2hpbGUgZWFjaCBhcHAgb3ducyBpdHMgdG9rZW4gbG9va3VwLCBtb2RlbCBoYW5kbGVycywgYW5kXG4gKiBkb21haW4gYXV0aG9yaXphdGlvbiBydWxlcy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3luY0VudmVsb3BlUmVwbGF5U2VydmljZSB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgc3luYyBlbnZlbG9wZSByZXBsYXkgc2VydmljZS5cbiAgICpcbiAgICogV2hlbiBhIHN5bmMgbW9kZWwgaXMgZ2l2ZW4sIGBmaW5kRXhpc3RpbmdSZXBsYXlTeW5jYCBhbmRcbiAgICogYHBlcnNpc3RSZXBsYXlNdXRhdGlvbmAgZ2V0IG1vZGVsLWJhY2tlZCBkZWZhdWx0IGltcGxlbWVudGF0aW9ucy4gVGhlIHN5bmNcbiAgICogbW9kZWwgbXVzdCBleHBvc2UgYGZpbmRCeWAvYGNyZWF0ZWAgc3RhdGljcyBwbHVzIGluc3RhbmNlXG4gICAqIGBhc3NpZ25gL2BzYXZlYC9gY2xpZW50VXBkYXRlZEF0YCBhbmQgYGFkdmFuY2VTZXJ2ZXJTZXF1ZW5jZWAgKHRoZVxuICAgKiBjaGFuZ2UtZmVlZCBzZXF1ZW5jZSBjb250cmFjdCksIGFuZCB0aGUgYWN0b3IgcmV0dXJuZWQgZnJvbVxuICAgKiBgYXV0aGVudGljYXRlUmVwbGF5YCBtdXN0IGV4cG9zZSBhbiBgaWQoKWAgbWV0aG9kLlxuICAgKiBAcGFyYW0ge29iamVjdH0gW2FyZ3NdIC0gQ29uc3RydWN0b3IgYXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge3tkZWJ1Zz86ICguLi5hcmdzOiBBcnJheTx1bmtub3duPikgPT4gdm9pZCwgd2Fybj86ICguLi5hcmdzOiBBcnJheTx1bmtub3duPikgPT4gdm9pZH19IFthcmdzLmxvZ2dlcl0gLSBMb2dnZXIgdXNlZCBmb3Igbm9ybWFsaXphdGlvbiB3YXJuaW5ncy5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gW2FyZ3Muc3luY01vZGVsXSAtIFN5bmMvY2hhbmdlIG1vZGVsIGVuYWJsaW5nIG1vZGVsLWJhY2tlZCBkZWZhdWx0IGhvb2tzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuYWN0b3JGb3JlaWduS2V5Q29sdW1uXSAtIFN5bmMgbW9kZWwgY29sdW1uIGxpbmtpbmcgcm93cyB0byB0aGUgcmVwbGF5IGFjdG9yLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBbYXJncy5hdXRoZW50aWNhdGlvblRva2VuTW9kZWxdIC0gVG9rZW4gbW9kZWwgZW5hYmxpbmcgdGhlIGRlZmF1bHQgdG9rZW4tbG9va3VwIGF1dGhlbnRpY2F0ZVJlcGxheS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmF1dGhlbnRpY2F0aW9uVG9rZW5Db2x1bW5dIC0gVG9rZW4gbW9kZWwgY29sdW1uIGhvbGRpbmcgdGhlIHRva2VuLiBEZWZhdWx0cyB0byBcInRva2VuXCIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5hdXRoZW50aWNhdGlvblRva2VuUGFyYW1dIC0gUmVxdWVzdCBwYXJhbSBjYXJyeWluZyB0aGUgdG9rZW4uIERlZmF1bHRzIHRvIFwiYXV0aGVudGljYXRpb25Ub2tlblwiLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsICgoYXJnczogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+KSA9PiBQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PikgfCBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8dHlwZW9mIFN5bmNSZXBsYXlVcHNlcnRBcHBsaWVyPlswXT59IFthcmdzLmFwcGx5SGFuZGxlcnNdIC0gUGVyLXJlc291cmNlVHlwZSBhcHBseSBoYW5kbGVycyAoZnVuY3Rpb25zIG9yIGRlY2xhcmF0aXZlIHVwc2VydC1hcHBsaWVyIHNwZWNzKSBlbmFibGluZyB0aGUgZGVmYXVsdCBhcHBseVJlcGxheU11dGF0aW9uIGRpc3BhdGNoLiBEZXByZWNhdGVkOiBwcmVmZXIgcmVzb3VyY2Ugcm91dGluZyB2aWEgYGNvbmZpZ3VyYXRpb25gL2ByZXNvdXJjZVR5cGVPdmVycmlkZXNgOyBhcHBseUhhbmRsZXJzIHJlbWFpbiBmb3IgcmVsZWFzZWQgYWRvcHRlcnMgYW5kIHdpbGwgYmUgcmVtb3ZlZCBhZnRlciB0aGVpciBtaWdyYXRpb24uXG4gICAqIEBwYXJhbSB7KGFyZ3M6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PikgPT4gUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBbYXJncy5wZXJzaXN0RXh0cmFBdHRyaWJ1dGVzXSAtIEV4dHJhIGF0dHJpYnV0ZXMgbWVyZ2VkIGludG8gdGhlIG1vZGVsLWJhY2tlZCBwZXJzaXN0ZWQgcm93IChlLmcuIGFuIGV2ZW50IHNjb3BlIGNvbHVtbikuXG4gICAqIEBwYXJhbSB7KGFyZ3M6IHttdXRhdGlvbjogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4sIGFwcGx5UmVzdWx0OiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0pID0+IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBbYXJncy5wZXJzaXN0U2VyaWFsaXplZERhdGFdIC0gT3ZlcnJpZGVzIHRoZSBwZXJzaXN0ZWQgZGF0YSBwYXlsb2FkIChvYmplY3QgcmVzdWx0cyBhcmUgSlNPTiBzdHJpbmdpZmllZCkuXG4gICAqIEBwYXJhbSB7KGJyb2FkY2FzdDoge2NoYW5uZWw6IHN0cmluZywgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4sIGJvZHk6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSkgPT4gUHJvbWlzZTx2b2lkPn0gW2FyZ3MuYnJvYWRjYXN0ZXJdIC0gRGVsaXZlcnMgZGVjbGFyYXRpdmUgYnJvYWRjYXN0cy4gUmVxdWlyZWQgd2hlbiBicm9hZGNhc3RzIGFyZSBjb25maWd1cmVkLlxuICAgKiBAcGFyYW0ge1N5bmNSZXBsYXlCcm9hZGNhc3RbXX0gW2FyZ3MuYnJvYWRjYXN0c10gLSBCcm9hZGNhc3RzIGZhbm5lZCBvdXQgYnkgdGhlIGRlZmF1bHQgYWZ0ZXJSZXBsYXlNdXRhdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IFthcmdzLmNvbmZpZ3VyYXRpb25dIC0gQ29uZmlndXJhdGlvbiB3aG9zZSBmcm9udGVuZC1tb2RlbCByZWdpc3RyeSByb3V0ZXMgbXV0YXRpb25zIHRvIHJlc291cmNlIGNsYXNzZXMuXG4gICAqIEBwYXJhbSB7e3N0cmF0ZWd5PzogXCJvcHRpbWlzdGljVmVyc2lvblwiIHwgXCJzZXJ2ZXJXaW5zXCIsIHZlcnNpb25BdHRyaWJ1dGU6IHN0cmluZ30gfCBudWxsfSBbYXJncy5jb25mbGljdFN0cmF0ZWd5XSAtIE9wdGlvbmFsIGJhc2UtdmVyc2lvbiBjb25mbGljdCBkZXRlY3Rpb24gZm9yIHJvdXRlZCB1cHNlcnRzLiBPbmx5IGBvcHRpbWlzdGljVmVyc2lvbmAgYW5kIGBzZXJ2ZXJXaW5zYCBhcmUgc3VwcG9ydGVkIGZvciBiYWNrZW5kIHJlcGxheSBiZWNhdXNlIHRoZSBzZXJ2ZXIgZG9lcyBub3QgaGF2ZSB0aGUgY2xpZW50J3MgYmFzZSBzbmFwc2hvdC4gV2hlbiBgc3RyYXRlZ3lgIGlzIG9taXR0ZWQgaXQgZGVmYXVsdHMgdG8gYG9wdGltaXN0aWNWZXJzaW9uYCwgbWF0Y2hpbmcgYHJlc29sdmVTeW5jQ29uZmxpY3RgIGFuZCBub3JtYWxpemVkIHJlc291cmNlIGNvbmZpZy4gV2hlbiBjb25maWd1cmVkLCBhIG11dGF0aW9uIHdob3NlIGJhc2VWZXJzaW9uIGRvZXMgbm90IG1hdGNoIHRoZSBjdXJyZW50IHNlcnZlciB2ZXJzaW9uQXR0cmlidXRlIGlzIHJlamVjdGVkIHdpdGggYSBzdHJ1Y3R1cmVkIGNvbmZsaWN0IHJlc3VsdCBpbnN0ZWFkIG9mIGJlaW5nIGFwcGxpZWQuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGUgfCBzdHJpbmc+fSBbYXJncy5yZXNvdXJjZVR5cGVPdmVycmlkZXNdIC0gUGVyLXJlc291cmNlVHlwZSByb3V0aW5nIG92ZXJyaWRlczogYSByZXNvdXJjZSBjbGFzcywgb3IgYSBzdHJpbmcgYWxpYXMgcmVzb2x2ZWQgdGhyb3VnaCB0aGUgcmVnaXN0cnkuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vYXV0aG9yaXphdGlvbi9hYmlsaXR5LmpzXCIpLmRlZmF1bHR9IFthcmdzLmFiaWxpdHldIC0gQWJpbGl0eSBzY29waW5nIHJvdXRlZCByZWNvcmQgbG9va3VwcyBhbmQgY3JlYXRlIG1lbWJlcnNoaXAgY2hlY2tzLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gW2FyZ3MuYWJpbGl0eUNvbnRleHRdIC0gQWJpbGl0eSBjb250ZXh0IHBhc3NlZCB0byByb3V0ZWQgcmVzb3VyY2VzLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gW2FyZ3MubG9jYWxzXSAtIExvY2FscyBwYXNzZWQgdG8gcm91dGVkIHJlc291cmNlcy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGFyZ3MgPSB7fSkge1xuICAgIHRoaXMubG9nZ2VyID0gYXJncy5sb2dnZXIgfHwgY29uc29sZVxuICAgIHRoaXMuc3luY01vZGVsID0gYXJncy5zeW5jTW9kZWwgfHwgbnVsbFxuICAgIHRoaXMuYWN0b3JGb3JlaWduS2V5Q29sdW1uID0gYXJncy5hY3RvckZvcmVpZ25LZXlDb2x1bW4gfHwgXCJhdXRoZW50aWNhdGlvbl90b2tlbl9pZFwiXG4gICAgdGhpcy5hdXRoZW50aWNhdGlvblRva2VuTW9kZWwgPSBhcmdzLmF1dGhlbnRpY2F0aW9uVG9rZW5Nb2RlbCB8fCBudWxsXG4gICAgdGhpcy5hdXRoZW50aWNhdGlvblRva2VuQ29sdW1uID0gYXJncy5hdXRoZW50aWNhdGlvblRva2VuQ29sdW1uIHx8IFwidG9rZW5cIlxuICAgIHRoaXMuYXV0aGVudGljYXRpb25Ub2tlblBhcmFtID0gYXJncy5hdXRoZW50aWNhdGlvblRva2VuUGFyYW0gfHwgXCJhdXRoZW50aWNhdGlvblRva2VuXCJcbiAgICB0aGlzLnBlcnNpc3RFeHRyYUF0dHJpYnV0ZXMgPSBhcmdzLnBlcnNpc3RFeHRyYUF0dHJpYnV0ZXMgfHwgbnVsbFxuICAgIHRoaXMucGVyc2lzdFNlcmlhbGl6ZWREYXRhID0gYXJncy5wZXJzaXN0U2VyaWFsaXplZERhdGEgfHwgbnVsbFxuICAgIHRoaXMuYnJvYWRjYXN0ZXIgPSBhcmdzLmJyb2FkY2FzdGVyIHx8IG51bGxcbiAgICB0aGlzLmJyb2FkY2FzdHMgPSBhcmdzLmJyb2FkY2FzdHMgfHwgbnVsbFxuICAgIHRoaXMuYXBwbHlIYW5kbGVycyA9IGFyZ3MuYXBwbHlIYW5kbGVycyA/IHRoaXMuYnVpbHRBcHBseUhhbmRsZXJzKGFyZ3MuYXBwbHlIYW5kbGVycykgOiBudWxsXG4gICAgdGhpcy5jb25maWd1cmF0aW9uID0gYXJncy5jb25maWd1cmF0aW9uIHx8IG51bGxcbiAgICB0aGlzLmNvbmZsaWN0U3RyYXRlZ3kgPSBhcmdzLmNvbmZsaWN0U3RyYXRlZ3kgfHwgbnVsbFxuICAgIHRoaXMucmVzb3VyY2VUeXBlT3ZlcnJpZGVzID0gYXJncy5yZXNvdXJjZVR5cGVPdmVycmlkZXMgfHwgbnVsbFxuICAgIHRoaXMuYWJpbGl0eSA9IGFyZ3MuYWJpbGl0eSB8fCBudWxsXG4gICAgdGhpcy5hYmlsaXR5Q29udGV4dCA9IGFyZ3MuYWJpbGl0eUNvbnRleHQgfHwgbnVsbFxuICAgIHRoaXMubG9jYWxzID0gYXJncy5sb2NhbHMgfHwgbnVsbFxuICAgIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgU3luY1JlcGxheVJlc291cmNlUmVnaXN0cmF0aW9uIHwgbnVsbD59ICovXG4gICAgdGhpcy5fcmVwbGF5UmVzb3VyY2VSZWdpc3RyYXRpb25zID0gbmV3IE1hcCgpXG5cbiAgICBpZiAoYXJncy5hY3RvckZvcmVpZ25LZXlDb2x1bW4gIT09IHVuZGVmaW5lZCAmJiAodHlwZW9mIGFyZ3MuYWN0b3JGb3JlaWduS2V5Q29sdW1uICE9PSBcInN0cmluZ1wiIHx8IGFyZ3MuYWN0b3JGb3JlaWduS2V5Q29sdW1uLmxlbmd0aCA8IDEpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGFjdG9yRm9yZWlnbktleUNvbHVtbiBtdXN0IGJlIGEgbm9uLWJsYW5rIHN0cmluZywgZ290OiAke1N0cmluZyhhcmdzLmFjdG9yRm9yZWlnbktleUNvbHVtbil9YClcbiAgICB9XG4gICAgaWYgKHRoaXMuYnJvYWRjYXN0cyAmJiAhdGhpcy5icm9hZGNhc3Rlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3luY0VudmVsb3BlUmVwbGF5U2VydmljZSBicm9hZGNhc3RzIHJlcXVpcmUgYSBicm9hZGNhc3RlciBvcHRpb24gZGVsaXZlcmluZyB0aGVtXCIpXG4gICAgfVxuICAgIGlmICh0aGlzLmNvbmZsaWN0U3RyYXRlZ3kpIHtcbiAgICAgIGNvbnN0IHN1cHBvcnRlZENvbmZsaWN0U3RyYXRlZ2llcyA9IG5ldyBTZXQoW1wib3B0aW1pc3RpY1ZlcnNpb25cIiwgXCJzZXJ2ZXJXaW5zXCJdKVxuXG4gICAgICBpZiAoIXRoaXMuY29uZmxpY3RTdHJhdGVneS52ZXJzaW9uQXR0cmlidXRlIHx8IHR5cGVvZiB0aGlzLmNvbmZsaWN0U3RyYXRlZ3kudmVyc2lvbkF0dHJpYnV0ZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jRW52ZWxvcGVSZXBsYXlTZXJ2aWNlIGNvbmZsaWN0U3RyYXRlZ3kgcmVxdWlyZXMgYSBub24tYmxhbmsgdmVyc2lvbkF0dHJpYnV0ZVwiKVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29uZmxpY3RTdHJhdGVneS5zdHJhdGVneSAhPT0gdW5kZWZpbmVkICYmICFzdXBwb3J0ZWRDb25mbGljdFN0cmF0ZWdpZXMuaGFzKHRoaXMuY29uZmxpY3RTdHJhdGVneS5zdHJhdGVneSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBzeW5jIGNvbmZsaWN0IHN0cmF0ZWd5IGZvciBiYWNrZW5kIHJlcGxheTogJHt0aGlzLmNvbmZsaWN0U3RyYXRlZ3kuc3RyYXRlZ3l9LiBPbmx5IG9wdGltaXN0aWNWZXJzaW9uIGFuZCBzZXJ2ZXJXaW5zIGFyZSBzdXBwb3J0ZWQuYClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV3JhcHMgZGVjbGFyYXRpdmUgYXBwbHktaGFuZGxlciBzcGVjcyBpbiB1cHNlcnQgYXBwbGllcnMuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBhcHBseUhhbmRsZXJzIC0gUmF3IGFwcGx5IGhhbmRsZXJzLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgKGFyZ3M6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PikgPT4gUHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4+fSBDYWxsYWJsZSBoYW5kbGVycyBieSByZXNvdXJjZSB0eXBlLlxuICAgKi9cbiAgYnVpbHRBcHBseUhhbmRsZXJzKGFwcGx5SGFuZGxlcnMpIHtcbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGFwcGx5SGFuZGxlcnMpLm1hcCgoW3Jlc291cmNlVHlwZSwgaGFuZGxlcl0pID0+IHtcbiAgICAgIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gW3Jlc291cmNlVHlwZSwgaGFuZGxlcl1cblxuICAgICAgY29uc3QgYXBwbGllciA9IG5ldyBTeW5jUmVwbGF5VXBzZXJ0QXBwbGllcihoYW5kbGVyKVxuXG4gICAgICByZXR1cm4gW3Jlc291cmNlVHlwZSwgKC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAqLyBhcHBseUFyZ3MpID0+IGFwcGxpZXIuYXBwbHkoLyoqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gKi8gKGFwcGx5QXJncykpXVxuICAgIH0pKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxheXMgYSBzeW5jIGJhdGNoLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gcGFyYW1zIC0gUmVxdWVzdCBwYXJhbXMgY2FycnlpbmcgYXV0aGVudGljYXRpb24gYW5kIHN5bmNzLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gW3JlcXVlc3RTdGF0ZV0gLSBSZXF1ZXN0LWxvY2FsIHN0YXRlIHBhc3NlZCB0byBhdXRoZW50aWNhdGlvbi9zeW5jIGV4dHJhY3Rpb24gaG9va3M7IHN1YmNsYXNzZXMgbWF5IHVzZSB0aGlzIHRvIHNoYXJlIHByZS1jb21wdXRlZCBwZXItcmVxdWVzdCBkYXRhIHdpdGhvdXQgaW5zdGFuY2UgbXV0YXRpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHtzeW5jczogQXJyYXk8UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+Piwgc3RhdHVzPzogc3RyaW5nLCBlcnJvckNvZGU/OiBzdHJpbmcsIGVycm9yTWVzc2FnZT86IHN0cmluZ30+fSBSZXBsYXkgcmVzcG9uc2UuXG4gICAqL1xuICBhc3luYyByZXBsYXkocGFyYW1zLCByZXF1ZXN0U3RhdGUgPSB7fSkge1xuICAgIGNvbnN0IGFjdG9yUmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRoZW50aWNhdGVSZXBsYXkocGFyYW1zLCByZXF1ZXN0U3RhdGUpXG5cbiAgICBpZiAoIWFjdG9yUmVzdWx0LmF1dGhlbnRpY2F0ZWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN5bmNzOiBbXSxcbiAgICAgICAgc3RhdHVzOiBcImVycm9yXCIsXG4gICAgICAgIGVycm9yQ29kZTogYWN0b3JSZXN1bHQuZXJyb3JDb2RlLFxuICAgICAgICBlcnJvck1lc3NhZ2U6IGFjdG9yUmVzdWx0LmVycm9yTWVzc2FnZVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHN5bmNSZXNwb25zZXMgPSBbXVxuICAgIGNvbnN0IGNvbnRleHQgPSBhd2FpdCB0aGlzLmJ1aWxkUmVwbGF5Q29udGV4dCh7YWN0b3I6IGFjdG9yUmVzdWx0LmFjdG9yLCBwYXJhbXMsIHJlcXVlc3RTdGF0ZX0pXG5cbiAgICBmb3IgKGNvbnN0IHJhd1N5bmMgb2YgdGhpcy5yZXBsYXlTeW5jcyhwYXJhbXMsIHJlcXVlc3RTdGF0ZSkpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRSZXN1bHQgPSB0aGlzLm5vcm1hbGl6ZVJlcGxheVN5bmMocmF3U3luYylcblxuICAgICAgaWYgKCFub3JtYWxpemVkUmVzdWx0Lm9rKSB7XG4gICAgICAgIHN5bmNSZXNwb25zZXMucHVzaChub3JtYWxpemVkUmVzdWx0LnJlc3BvbnNlKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBtdXRhdGlvbiA9IG5vcm1hbGl6ZWRSZXN1bHQubXV0YXRpb25cbiAgICAgIGNvbnN0IGFjY2Vzc1Jlc3VsdCA9IGF3YWl0IHRoaXMuYXV0aG9yaXplUmVwbGF5TXV0YXRpb24oe2FjdG9yOiBhY3RvclJlc3VsdC5hY3RvciwgY29udGV4dCwgbXV0YXRpb259KVxuXG4gICAgICBpZiAoIWFjY2Vzc1Jlc3VsdC5hbGxvd2VkKSB7XG4gICAgICAgIHN5bmNSZXNwb25zZXMucHVzaCh7XG4gICAgICAgICAgaWQ6IG11dGF0aW9uLmlkLFxuICAgICAgICAgIHN5bmNTdGF0ZTogXCJmYWlsZWRcIixcbiAgICAgICAgICByZWFzb246IGFjY2Vzc1Jlc3VsdC5yZWFzb24gfHwgXCJhY2Nlc3MtZGVuaWVkXCJcbiAgICAgICAgfSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXhpc3RpbmdTeW5jID0gYXdhaXQgdGhpcy5maW5kRXhpc3RpbmdSZXBsYXlTeW5jKHthY3RvcjogYWN0b3JSZXN1bHQuYWN0b3IsIGNvbnRleHQsIG11dGF0aW9ufSlcbiAgICAgIGNvbnN0IHNob3VsZEFwcGx5ID0gYXdhaXQgdGhpcy5zaG91bGRBcHBseVJlcGxheU11dGF0aW9uKHthY3RvcjogYWN0b3JSZXN1bHQuYWN0b3IsIGNvbnRleHQsIGV4aXN0aW5nU3luYywgbXV0YXRpb259KVxuICAgICAgY29uc3QgZHVwbGljYXRlID0gIXNob3VsZEFwcGx5ICYmIHRoaXMuaXNEdXBsaWNhdGVSZXBsYXlNdXRhdGlvbih7ZXhpc3RpbmdTeW5jLCBtdXRhdGlvbn0pXG5cbiAgICAgIC8qKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59ICovXG4gICAgICBsZXQgYXBwbHlSZXN1bHRcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXBwbHlSZXN1bHQgPSBzaG91bGRBcHBseVxuICAgICAgICAgID8gYXdhaXQgdGhpcy5hcHBseVJlcGxheU11dGF0aW9uKHthY3RvcjogYWN0b3JSZXN1bHQuYWN0b3IsIGNvbnRleHQsIGV4aXN0aW5nU3luYywgbXV0YXRpb259KVxuICAgICAgICAgIDogYXdhaXQgdGhpcy5za2lwcGVkUmVwbGF5TXV0YXRpb24oe2FjdG9yOiBhY3RvclJlc3VsdC5hY3RvciwgY29udGV4dCwgZXhpc3RpbmdTeW5jLCBtdXRhdGlvbn0pXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBDbGllbnQtc2FmZSBhcHBseSBmYWlsdXJlcyAoc2NoZW1hIHZhbGlkYXRpb24sIG1vZGVsIHZhbGlkYXRpb24sXG4gICAgICAgIC8vIGF1dGhvcml6YXRpb24gZGVuaWFscywgdW5rbm93biByZXNvdXJjZSB0eXBlcykgZmFpbCB0aGlzIHN5bmMgYW5kXG4gICAgICAgIC8vIGtlZXAgdGhlIGJhdGNoIGdvaW5nOyB1bmV4cGVjdGVkIGVycm9ycyBrZWVwIHByb3BhZ2F0aW5nLlxuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBWZWxvY2lvdXNFcnJvciAmJiBlcnJvci5zYWZlVG9FeHBvc2UpIHtcbiAgICAgICAgICBzeW5jUmVzcG9uc2VzLnB1c2goe1xuICAgICAgICAgICAgaWQ6IG11dGF0aW9uLmlkLFxuICAgICAgICAgICAgc3luY1N0YXRlOiBcImZhaWxlZFwiLFxuICAgICAgICAgICAgcmVhc29uOiBlcnJvci5jb2RlIHx8IFwiYXBwbHktZmFpbGVkXCIsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvci5tZXNzYWdlXG4gICAgICAgICAgfSlcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgIH1cblxuICAgICAgaWYgKGFwcGx5UmVzdWx0ICYmIGFwcGx5UmVzdWx0LnN0YXR1cyA9PT0gXCJjb25mbGljdFwiKSB7XG4gICAgICAgIHN5bmNSZXNwb25zZXMucHVzaCh7XG4gICAgICAgICAgY29uZmxpY3Q6IGFwcGx5UmVzdWx0LmNvbmZsaWN0LFxuICAgICAgICAgIGlkOiBtdXRhdGlvbi5pZCxcbiAgICAgICAgICBzeW5jU3RhdGU6IFwiY29uZmxpY3RcIlxuICAgICAgICB9KVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLnBlcnNpc3RSZXBsYXlNdXRhdGlvbih7YWN0b3I6IGFjdG9yUmVzdWx0LmFjdG9yLCBjb250ZXh0LCBleGlzdGluZ1N5bmMsIGFwcGx5UmVzdWx0LCBtdXRhdGlvbiwgc2hvdWxkQXBwbHl9KVxuICAgICAgYXdhaXQgdGhpcy5hZnRlclJlcGxheU11dGF0aW9uKHthY3RvcjogYWN0b3JSZXN1bHQuYWN0b3IsIGNvbnRleHQsIGV4aXN0aW5nU3luYywgYXBwbHlSZXN1bHQsIG11dGF0aW9uLCBzaG91bGRBcHBseX0pXG5cbiAgICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAqL1xuICAgICAgY29uc3Qgc3VjY2Vzc2Z1bFJlc3BvbnNlID0ge2lkOiBtdXRhdGlvbi5pZCwgc3luY1N0YXRlOiBkdXBsaWNhdGUgPyBcImR1cGxpY2F0ZVwiIDogXCJzdWNjZXNzZnVsXCJ9XG5cbiAgICAgIGNvbnN0IHBlcnNpc3RlZFJlcGxheU1ldGFkYXRhID0gZHVwbGljYXRlID8gdGhpcy5yZXBsYXlQZXJzaXN0ZWRNZXRhZGF0YShleGlzdGluZ1N5bmMpIDogbnVsbFxuXG4gICAgICBpZiAocGVyc2lzdGVkUmVwbGF5TWV0YWRhdGEpIHtcbiAgICAgICAgc3VjY2Vzc2Z1bFJlc3BvbnNlLnNlcnZlclZlcnNpb24gPSBwZXJzaXN0ZWRSZXBsYXlNZXRhZGF0YS5hY2tub3dsZWRnZW1lbnRWZXJzaW9uXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmxpY3RTdHJhdGVneSAmJiBtdXRhdGlvbi5iYXNlVmVyc2lvbiAhPT0gdW5kZWZpbmVkICYmIGFwcGx5UmVzdWx0Py5yZWNvcmQpIHtcbiAgICAgICAgc3VjY2Vzc2Z1bFJlc3BvbnNlLnNlcnZlclZlcnNpb24gPSBub3JtYWxpemVDb25mbGljdFZhbHVlKGFwcGx5UmVzdWx0LnJlY29yZC5yZWFkQXR0cmlidXRlKHRoaXMuY29uZmxpY3RTdHJhdGVneS52ZXJzaW9uQXR0cmlidXRlKSlcbiAgICAgIH1cblxuICAgICAgc3luY1Jlc3BvbnNlcy5wdXNoKHN1Y2Nlc3NmdWxSZXNwb25zZSlcbiAgICB9XG5cbiAgICByZXR1cm4ge3N5bmNzOiBzeW5jUmVzcG9uc2VzfVxuICB9XG5cbiAgLyoqXG4gICAqIEF1dGhlbnRpY2F0ZXMgdGhlIHN5bmMgYmF0Y2ggYWN0b3IuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIGEgdG9rZW4tbW9kZWwgbG9va3VwIHdoZW4gYGF1dGhlbnRpY2F0aW9uVG9rZW5Nb2RlbGAgaXNcbiAgICogY29uZmlndXJlZDsgb3RoZXJ3aXNlIGFwcHMgb3ZlcnJpZGUgdGhpcyBob29rLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gcGFyYW1zIC0gUmVxdWVzdCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBbX3JlcXVlc3RTdGF0ZV0gLSBSZXF1ZXN0LWxvY2FsIHN0YXRlIHBvcHVsYXRlZCBieSBzdWJjbGFzc2VzIGJlZm9yZSB0aGUgYmFzZSByZXBsYXkgbG9vcCBydW5zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7YXV0aGVudGljYXRlZDogdHJ1ZSwgYWN0b3I6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSB8IHthdXRoZW50aWNhdGVkOiBmYWxzZSwgZXJyb3JDb2RlOiBzdHJpbmcsIGVycm9yTWVzc2FnZTogc3RyaW5nfT59IEF1dGggcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgYXV0aGVudGljYXRlUmVwbGF5KHBhcmFtcywgX3JlcXVlc3RTdGF0ZSkge1xuICAgIGlmICghdGhpcy5hdXRoZW50aWNhdGlvblRva2VuTW9kZWwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlN5bmNFbnZlbG9wZVJlcGxheVNlcnZpY2UuYXV0aGVudGljYXRlUmVwbGF5IG11c3QgYmUgaW1wbGVtZW50ZWQgKG9yIGNvbmZpZ3VyZSBhdXRoZW50aWNhdGlvblRva2VuTW9kZWwpXCIpXG4gICAgfVxuXG4gICAgY29uc3QgdG9rZW4gPSBwYXJhbXNbdGhpcy5hdXRoZW50aWNhdGlvblRva2VuUGFyYW1dXG5cbiAgICBpZiAoIXRva2VuKSB7XG4gICAgICByZXR1cm4ge2F1dGhlbnRpY2F0ZWQ6IGZhbHNlLCBlcnJvckNvZGU6IFwibWlzc2luZy1hdXRoZW50aWNhdGlvbi10b2tlblwiLCBlcnJvck1lc3NhZ2U6IFwiTWlzc2luZyBhdXRoZW50aWNhdGlvbiB0b2tlblwifVxuICAgIH1cblxuICAgIGNvbnN0IGFjdG9yID0gYXdhaXQgdGhpcy5hdXRoZW50aWNhdGlvblRva2VuTW9kZWwuZmluZEJ5KHtbdGhpcy5hdXRoZW50aWNhdGlvblRva2VuQ29sdW1uXTogdG9rZW59KVxuXG4gICAgaWYgKCFhY3Rvcikge1xuICAgICAgcmV0dXJuIHthdXRoZW50aWNhdGVkOiBmYWxzZSwgZXJyb3JDb2RlOiBcImludmFsaWQtYXV0aGVudGljYXRpb24tdG9rZW5cIiwgZXJyb3JNZXNzYWdlOiBcIkludmFsaWQgYXV0aGVudGljYXRpb24gdG9rZW5cIn1cbiAgICB9XG5cbiAgICByZXR1cm4ge2FjdG9yLCBhdXRoZW50aWNhdGVkOiB0cnVlfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBwZXItYmF0Y2ggbXV0YWJsZSBjb250ZXh0IGZvciBjYWNoZXMgc2hhcmVkIGFjcm9zcyBzeW5jIGl0ZW1zLlxuICAgKiBAcGFyYW0ge3thY3RvcjogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4sIHBhcmFtczogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+LCByZXF1ZXN0U3RhdGU6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn19IF9hcmdzIC0gQWN0b3IsIHJlcXVlc3QgcGFyYW1zLCBhbmQgcmVxdWVzdC1sb2NhbCBzdGF0ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+Pn0gUmVwbGF5IGNvbnRleHQuXG4gICAqL1xuICBhc3luYyBidWlsZFJlcGxheUNvbnRleHQoX2FyZ3MpIHtcbiAgICByZXR1cm4ge31cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHJhdyBzeW5jIGVudHJpZXMgZnJvbSByZXF1ZXN0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IHBhcmFtcyAtIFJlcXVlc3QgcGFyYW1zLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gW19yZXF1ZXN0U3RhdGVdIC0gUmVxdWVzdC1sb2NhbCBzdGF0ZSBwb3B1bGF0ZWQgYnkgc3ViY2xhc3NlcyBiZWZvcmUgdGhlIGJhc2UgcmVwbGF5IGxvb3AgcnVucy5cbiAgICogQHJldHVybnMge0FycmF5PFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gUmF3IHN5bmMgZW50cmllcy5cbiAgICovXG4gIHJlcGxheVN5bmNzKHBhcmFtcywgX3JlcXVlc3RTdGF0ZSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHBhcmFtcy5zeW5jcykgPyBwYXJhbXMuc3luY3MgOiBbXVxuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZXMgb25lIHN5bmMgZW50cnkuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHJhd1N5bmMgLSBSYXcgc3luYyBlbnRyeS5cbiAgICogQHJldHVybnMge3tvazogdHJ1ZSwgbXV0YXRpb246IGltcG9ydChcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiKS5TeW5jUmVwbGF5TXV0YXRpb259IHwge29rOiBmYWxzZSwgcmVzcG9uc2U6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn19IE5vcm1hbGl6ZWQgbXV0YXRpb24gb3IgZmFpbGVkIHJlc3BvbnNlLlxuICAgKi9cbiAgbm9ybWFsaXplUmVwbGF5U3luYyhyYXdTeW5jKSB7XG4gICAgaWYgKCFyYXdTeW5jIHx8IHR5cGVvZiByYXdTeW5jICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkocmF3U3luYykpIHtcbiAgICAgIHJldHVybiB7b2s6IGZhbHNlLCByZXNwb25zZToge2lkOiB1bmRlZmluZWQsIHN5bmNTdGF0ZTogXCJmYWlsZWRcIiwgcmVhc29uOiBcImludmFsaWQtc3luY1wifX1cbiAgICB9XG5cbiAgICBjb25zdCBzeW5jID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovIChyYXdTeW5jKVxuICAgIGNvbnN0IHtjbGllbnRNdXRhdGlvbklkLCBjbGllbnRVcGRhdGVkQXQsIGRhdGEsIGlkLCByZXNvdXJjZUlkLCByZXNvdXJjZVR5cGUsIHN5bmNUeXBlfSA9IHN5bmNcblxuICAgIGlmICh0eXBlb2YgcmVzb3VyY2VUeXBlICE9PSBcInN0cmluZ1wiIHx8IHJlc291cmNlVHlwZS5sZW5ndGggPCAxIHx8IHJlc291cmNlSWQgPT09IHVuZGVmaW5lZCB8fCByZXNvdXJjZUlkID09PSBudWxsIHx8IHR5cGVvZiBzeW5jVHlwZSAhPT0gXCJzdHJpbmdcIiB8fCBzeW5jVHlwZS5sZW5ndGggPCAxKSB7XG4gICAgICByZXR1cm4ge29rOiBmYWxzZSwgcmVzcG9uc2U6IHtpZCwgc3luY1N0YXRlOiBcImZhaWxlZFwiLCByZWFzb246IFwiaW52YWxpZC1yZXNvdXJjZS1pZFwifX1cbiAgICB9XG5cbiAgICBjb25zdCByZXNvdXJjZUlkU3RyaW5nID0gU3RyaW5nKHJlc291cmNlSWQpXG4gICAgbGV0IGNsaWVudFVwZGF0ZWRBdERhdGUgPSB0eXBlb2YgY2xpZW50VXBkYXRlZEF0ID09PSBcInN0cmluZ1wiIHx8IGNsaWVudFVwZGF0ZWRBdCBpbnN0YW5jZW9mIERhdGUgPyBuZXcgRGF0ZShjbGllbnRVcGRhdGVkQXQpIDogbmV3IERhdGUoKVxuXG4gICAgaWYgKE51bWJlci5pc05hTihjbGllbnRVcGRhdGVkQXREYXRlLmdldFRpbWUoKSkpIGNsaWVudFVwZGF0ZWRBdERhdGUgPSBuZXcgRGF0ZSgpXG5cbiAgICBjb25zdCBub3JtYWxpemVkRGF0YVJlc3VsdCA9IHRoaXMubm9ybWFsaXplUmVwbGF5U3luY0RhdGEoe2RhdGEsIGlkLCByZXNvdXJjZUlkOiByZXNvdXJjZUlkU3RyaW5nLCByZXNvdXJjZVR5cGV9KVxuXG4gICAgaWYgKCFub3JtYWxpemVkRGF0YVJlc3VsdC5vaykgcmV0dXJuIG5vcm1hbGl6ZWREYXRhUmVzdWx0XG5cbiAgICByZXR1cm4ge1xuICAgICAgb2s6IHRydWUsXG4gICAgICBtdXRhdGlvbjoge1xuICAgICAgICBiYXNlVmVyc2lvbjogc3luYy5iYXNlVmVyc2lvbixcbiAgICAgICAgY2xpZW50TXV0YXRpb25JZCxcbiAgICAgICAgY2xpZW50VXBkYXRlZEF0OiBjbGllbnRVcGRhdGVkQXREYXRlLFxuICAgICAgICBkYXRhOiBub3JtYWxpemVkRGF0YVJlc3VsdC5kYXRhLFxuICAgICAgICBpZCxcbiAgICAgICAgcmVzb3VyY2VJZDogcmVzb3VyY2VJZFN0cmluZyxcbiAgICAgICAgcmVzb3VyY2VUeXBlLFxuICAgICAgICBzZXJpYWxpemVkRGF0YTogSlNPTi5zdHJpbmdpZnkobm9ybWFsaXplZERhdGFSZXN1bHQuZGF0YSksXG4gICAgICAgIHN5bmNUeXBlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZXMgb25lIHN5bmMgZGF0YSBwYXlsb2FkLlxuICAgKiBAcGFyYW0ge3tkYXRhOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgaWQ6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCByZXNvdXJjZUlkOiBzdHJpbmcsIHJlc291cmNlVHlwZTogc3RyaW5nfX0gYXJncyAtIFN5bmMgcGF5bG9hZCBub3JtYWxpemF0aW9uIGFyZ3VtZW50cy5cbiAgICogQHJldHVybnMge3tvazogdHJ1ZSwgZGF0YTogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSB8IHtvazogZmFsc2UsIHJlc3BvbnNlOiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59fSBOb3JtYWxpemVkIHBheWxvYWQgb3IgZmFpbGVkIHJlc3BvbnNlLlxuICAgKi9cbiAgbm9ybWFsaXplUmVwbGF5U3luY0RhdGEoe2RhdGEsIGlkLCByZXNvdXJjZUlkLCByZXNvdXJjZVR5cGV9KSB7XG4gICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCB8fCBkYXRhID09PSBudWxsKSByZXR1cm4ge29rOiB0cnVlLCBkYXRhOiB7fX1cblxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFyc2VkRGF0YSA9IEpTT04ucGFyc2UoZGF0YSlcblxuICAgICAgICBpZiAoIXBhcnNlZERhdGEgfHwgdHlwZW9mIHBhcnNlZERhdGEgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShwYXJzZWREYXRhKSkgcmV0dXJuIHtvazogdHJ1ZSwgZGF0YToge319XG5cbiAgICAgICAgcmV0dXJuIHtvazogdHJ1ZSwgZGF0YTogLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovIChwYXJzZWREYXRhKX1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4/LihcIkludmFsaWQgc3luYyBkYXRhIEpTT05cIiwge2Vycm9yLCBpZCwgcmVzb3VyY2VJZCwgcmVzb3VyY2VUeXBlfSlcbiAgICAgICAgcmV0dXJuIHtvazogZmFsc2UsIHJlc3BvbnNlOiB7aWQsIHN5bmNTdGF0ZTogXCJmYWlsZWRcIiwgcmVhc29uOiBcImludmFsaWQtZGF0YVwifX1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShkYXRhKSkgcmV0dXJuIHtvazogdHJ1ZSwgZGF0YToge319XG5cbiAgICByZXR1cm4ge29rOiB0cnVlLCBkYXRhOiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGRhdGEpKX1cbiAgfVxuXG4gIC8qKlxuICAgKiBBdXRob3JpemVzIG9uZSBub3JtYWxpemVkIG11dGF0aW9uLlxuICAgKiBAcGFyYW0ge3thY3RvcjogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4sIGNvbnRleHQ6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PiwgbXV0YXRpb246IGltcG9ydChcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiKS5TeW5jUmVwbGF5TXV0YXRpb259fSBfYXJncyAtIEFjdG9yLCBiYXRjaCBjb250ZXh0LCBhbmQgbXV0YXRpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHthbGxvd2VkOiBib29sZWFuLCByZWFzb24/OiBzdHJpbmd9Pn0gQWNjZXNzIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIGF1dGhvcml6ZVJlcGxheU11dGF0aW9uKF9hcmdzKSB7XG4gICAgcmV0dXJuIHthbGxvd2VkOiB0cnVlfVxuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIHRoZSBwcmV2aW91c2x5IHN0b3JlZCBzeW5jL2NoYW5nZSByb3cgZm9yIHN0YWxlLWNsaWVudCBjb21wYXJpc29uLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBhIHN5bmMtbW9kZWwgbG9va3VwIGJ5IGFjdG9yIGFuZCByZXNvdXJjZSBpZGVudGl0eSB3aGVuIGEgc3luY1xuICAgKiBtb2RlbCBpcyBjb25maWd1cmVkOyBvdGhlcndpc2UgYXBwcyBvdmVycmlkZSB0aGlzIGhvb2suXG4gICAqIEBwYXJhbSB7e2FjdG9yOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgY29udGV4dDogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+LCBtdXRhdGlvbjogaW1wb3J0KFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCIpLlN5bmNSZXBsYXlNdXRhdGlvbn19IGFyZ3MgLSBBY3RvciwgYmF0Y2ggY29udGV4dCwgYW5kIG11dGF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IEV4aXN0aW5nIHN5bmMgcm93LlxuICAgKi9cbiAgYXN5bmMgZmluZEV4aXN0aW5nUmVwbGF5U3luYyh7YWN0b3IsIG11dGF0aW9ufSkge1xuICAgIGlmICghdGhpcy5zeW5jTW9kZWwpIHJldHVybiBudWxsXG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5zeW5jTW9kZWwuZmluZEJ5KHtcbiAgICAgIFt0aGlzLmFjdG9yRm9yZWlnbktleUNvbHVtbl06IHRoaXMucmVwbGF5QWN0b3JJZChhY3RvciksXG4gICAgICByZXNvdXJjZV9pZDogbXV0YXRpb24ucmVzb3VyY2VJZCxcbiAgICAgIHJlc291cmNlX3R5cGU6IG11dGF0aW9uLnJlc291cmNlVHlwZVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIHBlcnNpc3RlZCBhY3RvciBpZCB1c2VkIGJ5IG1vZGVsLWJhY2tlZCBkZWZhdWx0IGhvb2tzLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBhY3RvciAtIEFjdG9yIHJldHVybmVkIGZyb20gYXV0aGVudGljYXRlUmVwbGF5LlxuICAgKiBAcmV0dXJucyB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IEFjdG9yIGlkLlxuICAgKi9cbiAgcmVwbGF5QWN0b3JJZChhY3Rvcikge1xuICAgIGlmICghYWN0b3IgfHwgdHlwZW9mIGFjdG9yICE9PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBhY3Rvci5pZCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jRW52ZWxvcGVSZXBsYXlTZXJ2aWNlIG1vZGVsLWJhY2tlZCBkZWZhdWx0cyByZXF1aXJlIGFuIGFjdG9yIHdpdGggYW4gaWQoKSBtZXRob2QgZnJvbSBhdXRoZW50aWNhdGVSZXBsYXlcIilcbiAgICB9XG5cbiAgICByZXR1cm4gYWN0b3IuaWQoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBhIG5vcm1hbGl6ZWQgbXV0YXRpb24gc2hvdWxkIGJlIGFwcGxpZWQgdG8gZG9tYWluIG1vZGVscy5cbiAgICogQHBhcmFtIHt7YWN0b3I6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4sIGV4aXN0aW5nU3luYzogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4sIG11dGF0aW9uOiBpbXBvcnQoXCIuL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanNcIikuU3luY1JlcGxheU11dGF0aW9ufX0gYXJncyAtIEFjdG9yLCBiYXRjaCBjb250ZXh0LCBleGlzdGluZyBzeW5jIHJvdywgYW5kIG11dGF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gV2hldGhlciB0byBhcHBseSB0aGUgbXV0YXRpb24uXG4gICAqL1xuICBhc3luYyBzaG91bGRBcHBseVJlcGxheU11dGF0aW9uKHtleGlzdGluZ1N5bmMsIG11dGF0aW9ufSkge1xuICAgIGNvbnN0IGV4aXN0aW5nQ2xpZW50VXBkYXRlZEF0ID0gdGhpcy5leGlzdGluZ1JlcGxheVN5bmNDbGllbnRVcGRhdGVkQXQoZXhpc3RpbmdTeW5jKVxuXG4gICAgcmV0dXJuICFleGlzdGluZ0NsaWVudFVwZGF0ZWRBdCB8fCBtdXRhdGlvbi5jbGllbnRVcGRhdGVkQXQgPiBleGlzdGluZ0NsaWVudFVwZGF0ZWRBdFxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBjbGllbnQgdGltZXN0YW1wIGZyb20gYW4gZXhpc3Rpbmcgc3luYyByb3cuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IGV4aXN0aW5nU3luYyAtIEV4aXN0aW5nIHN5bmMgcm93LlxuICAgKiBAcmV0dXJucyB7RGF0ZSB8IG51bGx9IEV4aXN0aW5nIGNsaWVudCB0aW1lc3RhbXAuXG4gICAqL1xuICBleGlzdGluZ1JlcGxheVN5bmNDbGllbnRVcGRhdGVkQXQoZXhpc3RpbmdTeW5jKSB7XG4gICAgaWYgKCFleGlzdGluZ1N5bmMgfHwgdHlwZW9mIGV4aXN0aW5nU3luYyAhPT0gXCJvYmplY3RcIikgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IHN5bmNSZWNvcmQgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi8gKGV4aXN0aW5nU3luYylcbiAgICBjb25zdCB2YWx1ZSA9IHR5cGVvZiBzeW5jUmVjb3JkLmNsaWVudFVwZGF0ZWRBdCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IHN5bmNSZWNvcmQuY2xpZW50VXBkYXRlZEF0KClcbiAgICAgIDogc3luY1JlY29yZC5jbGllbnRVcGRhdGVkQXRcblxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHJldHVybiB2YWx1ZVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IHBhcnNlZFZhbHVlID0gbmV3IERhdGUodmFsdWUpXG5cbiAgICByZXR1cm4gTnVtYmVyLmlzTmFOKHBhcnNlZFZhbHVlLmdldFRpbWUoKSkgPyBudWxsIDogcGFyc2VkVmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBhIHNraXBwZWQgbXV0YXRpb24gZXhhY3RseSBtYXRjaGVzIHRoZSBwZXJzaXN0ZWQgcmVwbGF5IHJvdy5cbiAgICogT2xkZXIgZGlzdGluY3QgbXV0YXRpb25zIHJldGFpbiB0aGUgZXN0YWJsaXNoZWQgc3VjY2Vzc2Z1bCBzdGFsZS1za2lwIHJlc3BvbnNlLlxuICAgKiBAcGFyYW0ge3tleGlzdGluZ1N5bmM6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCBtdXRhdGlvbjogaW1wb3J0KFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCIpLlN5bmNSZXBsYXlNdXRhdGlvbn19IGFyZ3MgLSBFeGlzdGluZyByb3cgYW5kIGluY29taW5nIG11dGF0aW9uLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGlzIGlzIGEgZHVwbGljYXRlIHJlcGxheS5cbiAgICovXG4gIGlzRHVwbGljYXRlUmVwbGF5TXV0YXRpb24oe2V4aXN0aW5nU3luYywgbXV0YXRpb259KSB7XG4gICAgaWYgKCFleGlzdGluZ1N5bmMpIHJldHVybiBmYWxzZVxuXG4gICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLnJlcGxheVBlcnNpc3RlZE1ldGFkYXRhKGV4aXN0aW5nU3luYylcblxuICAgIGlmIChtZXRhZGF0YSkge1xuICAgICAgcmV0dXJuIG1ldGFkYXRhLmNsaWVudE11dGF0aW9uSWQgPT09IFN0cmluZyhtdXRhdGlvbi5jbGllbnRNdXRhdGlvbklkIHx8IG11dGF0aW9uLmlkKVxuICAgICAgICAmJiBtZXRhZGF0YS5wYXlsb2FkRmluZ2VycHJpbnQgPT09IHNoYTI1NkhleChtdXRhdGlvbi5zZXJpYWxpemVkRGF0YSlcbiAgICB9XG5cbiAgICBjb25zdCBleGlzdGluZ0NsaWVudFVwZGF0ZWRBdCA9IHRoaXMuZXhpc3RpbmdSZXBsYXlTeW5jQ2xpZW50VXBkYXRlZEF0KGV4aXN0aW5nU3luYylcbiAgICBjb25zdCBleGlzdGluZ0RhdGEgPSB0aGlzLnJlcGxheVN5bmNSZWNvcmRWYWx1ZShleGlzdGluZ1N5bmMsIFwiZGF0YVwiKVxuICAgIGNvbnN0IGV4aXN0aW5nU3luY1R5cGUgPSB0aGlzLnJlcGxheVN5bmNSZWNvcmRWYWx1ZShleGlzdGluZ1N5bmMsIFwic3luY1R5cGVcIilcbiAgICBjb25zdCBzZXJpYWxpemVkRXhpc3RpbmdEYXRhID0gdHlwZW9mIGV4aXN0aW5nRGF0YSA9PT0gXCJzdHJpbmdcIiA/IGV4aXN0aW5nRGF0YSA6IEpTT04uc3RyaW5naWZ5KGV4aXN0aW5nRGF0YSlcblxuICAgIHJldHVybiBleGlzdGluZ0NsaWVudFVwZGF0ZWRBdD8uZ2V0VGltZSgpID09PSBtdXRhdGlvbi5jbGllbnRVcGRhdGVkQXQuZ2V0VGltZSgpXG4gICAgICAmJiBzZXJpYWxpemVkRXhpc3RpbmdEYXRhID09PSBtdXRhdGlvbi5zZXJpYWxpemVkRGF0YVxuICAgICAgJiYgZXhpc3RpbmdTeW5jVHlwZSA9PT0gbXV0YXRpb24uc3luY1R5cGVcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhIG1vZGVsLWJhY2tlZCBzeW5jLXJvdyB2YWx1ZSB0aHJvdWdoIGl0cyBhY2Nlc3NvciBvciBwbGFpbiBwcm9wZXJ0eS5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gc3luY1JlY29yZCAtIEV4aXN0aW5nIHN5bmMgcm93LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZSAtIEF0dHJpYnV0ZSBuYW1lLlxuICAgKiBAcmV0dXJucyB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IFN0b3JlZCB2YWx1ZS5cbiAgICovXG4gIHJlcGxheVN5bmNSZWNvcmRWYWx1ZShzeW5jUmVjb3JkLCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgY29uc3QgcmVjb3JkID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovIChzeW5jUmVjb3JkKVxuICAgIGNvbnN0IHZhbHVlID0gcmVjb3JkW2F0dHJpYnV0ZU5hbWVdXG5cbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIgPyB2YWx1ZS5jYWxsKHN5bmNSZWNvcmQpIDogdmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBkdXJhYmxlIHJlcGxheSBhY2tub3dsZWRnZW1lbnQgbWV0YWRhdGEgZnJvbSBhIG1vZGVsLWJhY2tlZCBzeW5jIHJvdy5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gc3luY1JlY29yZCAtIEV4aXN0aW5nIHN5bmMgcm93LlxuICAgKiBAcmV0dXJucyB7e2Fja25vd2xlZGdlbWVudFZlcnNpb246IHN0cmluZyB8IG51bWJlciB8IG51bGwsIGNsaWVudE11dGF0aW9uSWQ6IHN0cmluZywgcGF5bG9hZEZpbmdlcnByaW50OiBzdHJpbmd9IHwgbnVsbH0gUGVyc2lzdGVkIG1ldGFkYXRhLlxuICAgKi9cbiAgcmVwbGF5UGVyc2lzdGVkTWV0YWRhdGEoc3luY1JlY29yZCkge1xuICAgIGlmICghc3luY1JlY29yZCkgcmV0dXJuIG51bGxcblxuICAgIHJldHVybiBkZWNvZGVSZXBsYXlQZXJzaXN0ZWREYXRhKHRoaXMucmVwbGF5U3luY1JlY29yZFZhbHVlKHN5bmNSZWNvcmQsIFwiZGF0YVwiKSkubWV0YWRhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIG9uZSBub3JtYWxpemVkIG11dGF0aW9uIHRvIGRvbWFpbiBtb2RlbHMuXG4gICAqXG4gICAqIERpc3BhdGNoZXMgdGhyb3VnaCB0aGUgY29uZmlndXJlZCBhcHBseS1oYW5kbGVyIHJlZ2lzdHJ5IGZpcnN0IChjb21wYXRcbiAgICogcHJlY2VkZW5jZSk7IG11dGF0aW9ucyB3aXRob3V0IGEgbWF0Y2hpbmcgaGFuZGxlciBmYWxsIHRocm91Z2ggdG9cbiAgICogcmVzb3VyY2Ugcm91dGluZyB3aGVuIGEgY29uZmlndXJhdGlvbiBvciByZXNvdXJjZVR5cGVPdmVycmlkZXMgYXJlXG4gICAqIGNvbmZpZ3VyZWQsIGFuZCBvdGhlcndpc2UgZmFpbCBsb3VkbHkuXG4gICAqIEBwYXJhbSB7e2FjdG9yOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgY29udGV4dDogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+LCBleGlzdGluZ1N5bmM6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCBtdXRhdGlvbjogaW1wb3J0KFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCIpLlN5bmNSZXBsYXlNdXRhdGlvbn19IGFyZ3MgLSBBY3RvciwgYmF0Y2ggY29udGV4dCwgZXhpc3Rpbmcgc3luYyByb3csIGFuZCBtdXRhdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBQcm9qZWN0LXNwZWNpZmljIGFwcGx5IHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIGFwcGx5UmVwbGF5TXV0YXRpb24oYXJncykge1xuICAgIGlmICh0aGlzLmFwcGx5SGFuZGxlcnMpIHtcbiAgICAgIGNvbnN0IGFwcGx5SGFuZGxlciA9IHRoaXMuYXBwbHlIYW5kbGVyc1thcmdzLm11dGF0aW9uLnJlc291cmNlVHlwZV1cblxuICAgICAgaWYgKGFwcGx5SGFuZGxlcikgcmV0dXJuIGF3YWl0IGFwcGx5SGFuZGxlcihhcmdzKVxuICAgICAgaWYgKCF0aGlzLnJvdXRpbmdDb25maWd1cmVkKCkpIHRocm93IG5ldyBFcnJvcihgTm8gc3luYyBhcHBseSBoYW5kbGVyIHJlZ2lzdGVyZWQgZm9yOiAke2FyZ3MubXV0YXRpb24ucmVzb3VyY2VUeXBlfWApXG4gICAgfVxuXG4gICAgaWYgKHRoaXMucm91dGluZ0NvbmZpZ3VyZWQoKSkgcmV0dXJuIGF3YWl0IHRoaXMuYXBwbHlSb3V0ZWRSZXBsYXlNdXRhdGlvbihhcmdzKVxuXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgcmVzb3VyY2Ugcm91dGluZyBpcyBjb25maWd1cmVkIG9uIHRoaXMgc2VydmljZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgbXV0YXRpb25zIHJvdXRlIHRvIGZyb250ZW5kLW1vZGVsIHJlc291cmNlcy5cbiAgICovXG4gIHJvdXRpbmdDb25maWd1cmVkKCkge1xuICAgIHJldHVybiBCb29sZWFuKHRoaXMuY29uZmlndXJhdGlvbiB8fCB0aGlzLnJlc291cmNlVHlwZU92ZXJyaWRlcylcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgcm91dGVkIHJlc291cmNlIHJlZ2lzdHJhdGlvbiBmb3IgYSByZXNvdXJjZSB0eXBlLCBtZW1vaXplZFxuICAgKiBwZXIgcmVwbGF5IHNlcnZpY2UuIE92ZXJyaWRlcyB3aW4gb3ZlciB0aGUgY29uZmlndXJhdGlvbiByZWdpc3RyeTsgc3RyaW5nXG4gICAqIG92ZXJyaWRlcyBhcmUgYWxpYXNlcyByZXNvbHZlZCB0aHJvdWdoIHRoZSByZWdpc3RyeS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlc291cmNlVHlwZSAtIE11dGF0aW9uIHJlc291cmNlIHR5cGUuXG4gICAqIEByZXR1cm5zIHtTeW5jUmVwbGF5UmVzb3VyY2VSZWdpc3RyYXRpb24gfCBudWxsfSBSZXNvbHZlZCByZWdpc3RyYXRpb24gb3IgbnVsbCB3aGVuIHVucm91dGFibGUuXG4gICAqL1xuICByZXBsYXlSZXNvdXJjZVJlZ2lzdHJhdGlvbihyZXNvdXJjZVR5cGUpIHtcbiAgICBjb25zdCBtZW1vaXplZFJlZ2lzdHJhdGlvbiA9IHRoaXMuX3JlcGxheVJlc291cmNlUmVnaXN0cmF0aW9ucy5nZXQocmVzb3VyY2VUeXBlKVxuXG4gICAgaWYgKG1lbW9pemVkUmVnaXN0cmF0aW9uICE9PSB1bmRlZmluZWQpIHJldHVybiBtZW1vaXplZFJlZ2lzdHJhdGlvblxuXG4gICAgY29uc3QgcmVnaXN0cmF0aW9uID0gdGhpcy5yZXNvbHZlUmVwbGF5UmVzb3VyY2VSZWdpc3RyYXRpb24ocmVzb3VyY2VUeXBlKVxuXG4gICAgdGhpcy5fcmVwbGF5UmVzb3VyY2VSZWdpc3RyYXRpb25zLnNldChyZXNvdXJjZVR5cGUsIHJlZ2lzdHJhdGlvbilcblxuICAgIHJldHVybiByZWdpc3RyYXRpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBVbmNhY2hlZCByb3V0ZWQtcmVzb3VyY2UgcmVzb2x1dGlvbiBiZWhpbmQge0BsaW5rIFN5bmNFbnZlbG9wZVJlcGxheVNlcnZpY2UjcmVwbGF5UmVzb3VyY2VSZWdpc3RyYXRpb259LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzb3VyY2VUeXBlIC0gTXV0YXRpb24gcmVzb3VyY2UgdHlwZS5cbiAgICogQHJldHVybnMge1N5bmNSZXBsYXlSZXNvdXJjZVJlZ2lzdHJhdGlvbiB8IG51bGx9IFJlc29sdmVkIHJlZ2lzdHJhdGlvbiBvciBudWxsIHdoZW4gdW5yb3V0YWJsZS5cbiAgICovXG4gIHJlc29sdmVSZXBsYXlSZXNvdXJjZVJlZ2lzdHJhdGlvbihyZXNvdXJjZVR5cGUpIHtcbiAgICBjb25zdCBvdmVycmlkZSA9IHRoaXMucmVzb3VyY2VUeXBlT3ZlcnJpZGVzPy5bcmVzb3VyY2VUeXBlXVxuXG4gICAgaWYgKG92ZXJyaWRlICYmIHR5cGVvZiBvdmVycmlkZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHttb2RlbE5hbWU6IHJlc291cmNlVHlwZSwgcmVzb3VyY2VDbGFzczogb3ZlcnJpZGUsIHJlc291cmNlQ29uZmlndXJhdGlvbjogbnVsbH1cbiAgICB9XG5cbiAgICBjb25zdCByZWdpc3RyeVJlc291cmNlVHlwZSA9IHR5cGVvZiBvdmVycmlkZSA9PT0gXCJzdHJpbmdcIiA/IG92ZXJyaWRlIDogcmVzb3VyY2VUeXBlXG5cbiAgICBpZiAoIXRoaXMuY29uZmlndXJhdGlvbikgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IHJlc29sdmVkUmVnaXN0cmF0aW9uID0gcmVzb2x2ZUZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzKHtjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb24sIHJlc291cmNlVHlwZTogcmVnaXN0cnlSZXNvdXJjZVR5cGV9KVxuXG4gICAgaWYgKCFyZXNvbHZlZFJlZ2lzdHJhdGlvbikgcmV0dXJuIG51bGxcblxuICAgIHJldHVybiB7XG4gICAgICBtb2RlbE5hbWU6IHJlc29sdmVkUmVnaXN0cmF0aW9uLm1vZGVsTmFtZSxcbiAgICAgIHJlc291cmNlQ2xhc3M6IHJlc29sdmVkUmVnaXN0cmF0aW9uLnJlc291cmNlQ2xhc3MsXG4gICAgICByZXNvdXJjZUNvbmZpZ3VyYXRpb246IHJlc29sdmVkUmVnaXN0cmF0aW9uLnJlc291cmNlQ29uZmlndXJhdGlvblxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgYWJpbGl0eSBhbmQgcmVzb3VyY2UgY29udGV4dCB1c2VkIHRvIGF1dGhvcml6ZSByb3V0ZWRcbiAgICogcmVzb3VyY2VzLiBEZWZhdWx0cyB0byB0aGUgY29uc3RydWN0b3Itd2lkZSBhYmlsaXR5L2FiaWxpdHlDb250ZXh0O1xuICAgKiBzdWJjbGFzc2VzIChzaWduZWQgcmVwbGF5KSBvdmVycmlkZSB0aGlzIHRvIGRlcml2ZSBhdXRob3JpemF0aW9uIGZyb20gYVxuICAgKiB2ZXJpZmllZCBhY3Rvci9ncmFudCBpbnN0ZWFkIG9mIHVwbG9hZGVyLWdsb2JhbCBzdGF0ZS5cbiAgICogQHBhcmFtIHt7YWN0b3I6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59fSBfYXJncyAtIFJlcGxheSBhY3RvciBhbmQgYmF0Y2ggY29udGV4dC5cbiAgICogQHJldHVybnMge1Byb21pc2U8e2FiaWxpdHk6IGltcG9ydChcIi4uL2F1dGhvcml6YXRpb24vYWJpbGl0eS5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkLCBhYmlsaXR5Q29udGV4dDogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fT59IEFiaWxpdHkgYW5kIHJlc291cmNlIGNvbnRleHQuXG4gICAqL1xuICBhc3luYyByZXBsYXlBYmlsaXR5Rm9yKF9hcmdzKSB7XG4gICAgcmV0dXJuIHthYmlsaXR5OiB0aGlzLmFiaWxpdHkgfHwgdW5kZWZpbmVkLCBhYmlsaXR5Q29udGV4dDogdGhpcy5hYmlsaXR5Q29udGV4dCB8fCB7fX1cbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIHJvdXRlZCByZXNvdXJjZSBpbnN0YW5jZSBoYW5kbGluZyBvbmUgbXV0YXRpb24uXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gYXJncy5hY3RvciAtIFJlcGxheSBhY3Rvci5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IGFyZ3MuY29udGV4dCAtIFJlcGxheSBjb250ZXh0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiKS5TeW5jUmVwbGF5TXV0YXRpb259IGFyZ3MubXV0YXRpb24gLSBOb3JtYWxpemVkIHJlcGxheSBtdXRhdGlvbi5cbiAgICogQHBhcmFtIHtTeW5jUmVwbGF5UmVzb3VyY2VSZWdpc3RyYXRpb259IGFyZ3MucmVnaXN0cmF0aW9uIC0gUmVzb2x2ZWQgcmVzb3VyY2UgcmVnaXN0cmF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCIpLmRlZmF1bHQ+fSBSb3V0ZWQgcmVzb3VyY2UgaW5zdGFuY2UuXG4gICAqL1xuICBhc3luYyBidWlsZFJlcGxheVJlc291cmNlKHthY3RvciwgY29udGV4dCwgbXV0YXRpb24sIHJlZ2lzdHJhdGlvbn0pIHtcbiAgICBjb25zdCBSZXNvdXJjZUNsYXNzID0gZnJvbnRlbmRNb2RlbFJlc291cmNlSW50ZXJuYWxDb25zdHJ1Y3RvcihyZWdpc3RyYXRpb24ucmVzb3VyY2VDbGFzcylcbiAgICBjb25zdCB7YWJpbGl0eSwgYWJpbGl0eUNvbnRleHR9ID0gYXdhaXQgdGhpcy5yZXBsYXlBYmlsaXR5Rm9yKHthY3RvciwgY29udGV4dH0pXG5cbiAgICByZXR1cm4gbmV3IFJlc291cmNlQ2xhc3Moe1xuICAgICAgYWJpbGl0eSxcbiAgICAgIGNvbnRleHQ6IGFiaWxpdHlDb250ZXh0LFxuICAgICAgbG9jYWxzOiB7Li4uKHRoaXMubG9jYWxzIHx8IHt9KSwgLi4uKHRoaXMuY29uZmlndXJhdGlvbiA/IHtjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb259IDoge30pfSxcbiAgICAgIG1vZGVsTmFtZTogcmVnaXN0cmF0aW9uLm1vZGVsTmFtZSxcbiAgICAgIHBhcmFtczogbXV0YXRpb24uZGF0YSxcbiAgICAgIC4uLihyZWdpc3RyYXRpb24ucmVzb3VyY2VDb25maWd1cmF0aW9uID8ge3Jlc291cmNlQ29uZmlndXJhdGlvbjogcmVnaXN0cmF0aW9uLnJlc291cmNlQ29uZmlndXJhdGlvbn0gOiB7fSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgb25lIG11dGF0aW9uIHRocm91Z2ggaXRzIHJvdXRlZCBmcm9udGVuZC1tb2RlbCByZXNvdXJjZTpcbiAgICogYXV0aG9yaXphdGlvbiwgYWJpbGl0eS1zY29wZWQgcmVjb3JkIGxvb2t1cCwgc2NoZW1hIG5vcm1hbGl6YXRpb24gYW5kXG4gICAqIGFzc2lnbi9zYXZlIGZvciB1cGRhdGVzLCBzYXZlLXRoZW4tY2hlY2sgbWVtYmVyc2hpcCBjcmVhdGVzLCBkZXN0cm95cyBmb3JcbiAgICogZGVsZXRlcywgYW5kIHRoZSByZXNvdXJjZSdzIGFmdGVyU3luY0FwcGx5IHRhaWwuIENsaWVudC1zYWZlIGZhaWx1cmVzXG4gICAqIHRocm93IHNhZmUgZXJyb3JzIHRoYXQgZmFpbCB0aGUgc2luZ2xlIHN5bmMuXG4gICAqIEBwYXJhbSB7e2FjdG9yOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgY29udGV4dDogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+LCBleGlzdGluZ1N5bmM6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCBtdXRhdGlvbjogaW1wb3J0KFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCIpLlN5bmNSZXBsYXlNdXRhdGlvbn19IGFyZ3MgLSBBY3RvciwgYmF0Y2ggY29udGV4dCwgZXhpc3Rpbmcgc3luYyByb3csIGFuZCBtdXRhdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+Pn0gQXBwbHkgcmVzdWx0IHdpdGggcmVjb3JkLCBjcmVhdGVkL2RlbGV0ZWQgZmxhZ3MsIGFuZCBhZnRlclN5bmNBcHBseSBleHRyYXMuXG4gICAqL1xuICBhc3luYyBhcHBseVJvdXRlZFJlcGxheU11dGF0aW9uKHthY3RvciwgY29udGV4dCwgZXhpc3RpbmdTeW5jLCBtdXRhdGlvbn0pIHtcbiAgICBjb25zdCByZWdpc3RyYXRpb24gPSB0aGlzLnJlcGxheVJlc291cmNlUmVnaXN0cmF0aW9uKG11dGF0aW9uLnJlc291cmNlVHlwZSlcblxuICAgIGlmICghcmVnaXN0cmF0aW9uKSB7XG4gICAgICB0aHJvdyBWZWxvY2lvdXNFcnJvci5zYWZlKGBVbmtub3duIHN5bmMgcmVzb3VyY2UgdHlwZTogJHttdXRhdGlvbi5yZXNvdXJjZVR5cGV9LmAsIHtjb2RlOiBcInVua25vd24tcmVzb3VyY2UtdHlwZVwifSlcbiAgICB9XG5cbiAgICBjb25zdCByZXNvdXJjZSA9IGF3YWl0IHRoaXMuYnVpbGRSZXBsYXlSZXNvdXJjZSh7YWN0b3IsIGNvbnRleHQsIG11dGF0aW9uLCByZWdpc3RyYXRpb259KVxuICAgIGNvbnN0IGN1c3RvbUFwcGx5UmVzdWx0ID0gYXdhaXQgcmVzb3VyY2UuYXBwbHlTeW5jKHtjb250ZXh0LCBleGlzdGluZ1N5bmMsIG11dGF0aW9ufSlcblxuICAgIGlmIChjdXN0b21BcHBseVJlc3VsdCAhPT0gbnVsbCkgcmV0dXJuIGN1c3RvbUFwcGx5UmVzdWx0XG5cbiAgICBjb25zdCBhdXRob3JpemF0aW9uID0gYXdhaXQgcmVzb3VyY2UuYXV0aG9yaXplU3luY011dGF0aW9uKHtjb250ZXh0LCBtdXRhdGlvbn0pXG5cbiAgICBpZiAoIWF1dGhvcml6YXRpb24uYWxsb3dlZCkge1xuICAgICAgdGhyb3cgVmVsb2Npb3VzRXJyb3Iuc2FmZShgU3luYyBtdXRhdGlvbiBkZW5pZWQgZm9yOiAke211dGF0aW9uLnJlc291cmNlVHlwZX0uYCwge2NvZGU6IGF1dGhvcml6YXRpb24ucmVhc29uIHx8IFwiYWNjZXNzLWRlbmllZFwifSlcbiAgICB9XG5cbiAgICBpZiAobXV0YXRpb24uc3luY1R5cGUgPT09IFwiZGVsZXRlXCIpIHJldHVybiBhd2FpdCB0aGlzLmFwcGx5Um91dGVkUmVwbGF5RGVsZXRlKHttdXRhdGlvbiwgcmVzb3VyY2V9KVxuXG4gICAgY29uc3QgY29tbWFuZEFwcGx5UmVzdWx0ID0gYXdhaXQgdGhpcy5hcHBseVJvdXRlZFJlcGxheUNvbW1hbmQoe2NvbnRleHQsIG11dGF0aW9uLCByZXNvdXJjZX0pXG5cbiAgICBpZiAoY29tbWFuZEFwcGx5UmVzdWx0ICE9PSBudWxsKSByZXR1cm4gY29tbWFuZEFwcGx5UmVzdWx0XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5hcHBseVJvdXRlZFJlcGxheVVwc2VydCh7Y29udGV4dCwgbXV0YXRpb24sIHJlc291cmNlfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaGVzIGEgcm91dGVkIHN5bmMgbXV0YXRpb24gd2hvc2Ugc3luY1R5cGUgbWF0Y2hlcyBhIHJlc291cmNlLWRlY2xhcmVkXG4gICAqIGN1c3RvbSBjb21tYW5kLiBSZXR1cm5zIG51bGwgd2hlbiB0aGUgbXV0YXRpb24gaXMgbm90IGEgY29tbWFuZCBzbyB0aGVcbiAgICogY2FsbGVyIGNhbiBmYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgdXBzZXJ0IHBhdGguXG4gICAqIEBwYXJhbSB7e2NvbnRleHQ6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PiwgbXV0YXRpb246IGltcG9ydChcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiKS5TeW5jUmVwbGF5TXV0YXRpb24sIHJlc291cmNlOiBpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCIpLmRlZmF1bHR9fSBhcmdzIC0gQ29tbWFuZCBkaXNwYXRjaCBhcmdzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4gfCBudWxsPn0gQ29tbWFuZCBhcHBseSByZXN1bHQgb3IgbnVsbC5cbiAgICovXG4gIGFzeW5jIGFwcGx5Um91dGVkUmVwbGF5Q29tbWFuZCh7Y29udGV4dCwgbXV0YXRpb24sIHJlc291cmNlfSkge1xuICAgIGNvbnN0IGNvbW1hbmRDb25maWcgPSB0aGlzLnJlc291cmNlQ29tbWFuZENvbmZpZyhyZXNvdXJjZSlcbiAgICBjb25zdCBjb21tYW5kTWV0aG9kTmFtZSA9IHRoaXMuY29tbWFuZE1ldGhvZE5hbWVGb3JTeW5jVHlwZSh7Y29tbWFuZENvbmZpZywgc3luY1R5cGU6IG11dGF0aW9uLnN5bmNUeXBlfSlcblxuICAgIGlmICghY29tbWFuZE1ldGhvZE5hbWUpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBjb21tYW5kTWV0aG9kID0gcmVzb3VyY2UucmVzb3VyY2VNZXRob2QoY29tbWFuZE1ldGhvZE5hbWUpXG5cbiAgICBpZiAoIWNvbW1hbmRNZXRob2QpIHtcbiAgICAgIHRocm93IFZlbG9jaW91c0Vycm9yLnNhZmUoYFN5bmMgY29tbWFuZCBoYW5kbGVyIG1pc3NpbmcgZm9yOiAke211dGF0aW9uLnJlc291cmNlVHlwZX0uJHttdXRhdGlvbi5zeW5jVHlwZX0uYCwge2NvZGU6IFwic3luYy1jb21tYW5kLWhhbmRsZXItbWlzc2luZ1wifSlcbiAgICB9XG5cbiAgICBjb25zdCBhcmdzID0gdGhpcy5jb21tYW5kQXJnc0Zvck11dGF0aW9uKHtjb21tYW5kQ29uZmlnLCBjb21tYW5kTWV0aG9kTmFtZSwgbXV0YXRpb259KVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvbW1hbmRNZXRob2QubWV0aG9kLmNhbGwoY29tbWFuZE1ldGhvZC5yZXNvdXJjZSwgYXJncylcblxuICAgIGNvbnN0IGFmdGVyRXh0cmFzID0gYXdhaXQgcmVzb3VyY2UuYWZ0ZXJTeW5jQXBwbHkoe2NvbnRleHQsIGNyZWF0ZWQ6IGZhbHNlLCBtdXRhdGlvbiwgcmVjb3JkOiBudWxsfSlcbiAgICBjb25zdCByZXN1bHRPYmplY3QgPSByZXN1bHQgJiYgdHlwZW9mIHJlc3VsdCA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheShyZXN1bHQpID8gcmVzdWx0IDoge31cblxuICAgIHJldHVybiB7Y29tbWFuZFJlc3VsdDogcmVzdWx0LCBjcmVhdGVkOiBmYWxzZSwgZGVsZXRlZDogZmFsc2UsIHJlY29yZDogbnVsbCwgLi4ucmVzdWx0T2JqZWN0LCAuLi5hZnRlckV4dHJhc31cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgY3VzdG9tLWNvbW1hbmQgY29uZmlndXJhdGlvbiBkZWNsYXJlZCBvbiBhIHJvdXRlZCByZXNvdXJjZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCIpLmRlZmF1bHR9IHJlc291cmNlIC0gUm91dGVkIHJlc291cmNlIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7e2NvbGxlY3Rpb25Db21tYW5kczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgbWVtYmVyQ29tbWFuZHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz59fSBDb21tYW5kIGNvbmZpZy5cbiAgICovXG4gIHJlc291cmNlQ29tbWFuZENvbmZpZyhyZXNvdXJjZSkge1xuICAgIGNvbnN0IGNvbmZpZyA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAqLyAocmVzb3VyY2UucmVzb3VyY2VDb25maWd1cmF0aW9uVmFsdWUgfHwge30pXG5cbiAgICByZXR1cm4ge1xuICAgICAgY29sbGVjdGlvbkNvbW1hbmRzOiBjb25maWcuY29sbGVjdGlvbkNvbW1hbmRzIHx8IHt9LFxuICAgICAgbWVtYmVyQ29tbWFuZHM6IGNvbmZpZy5tZW1iZXJDb21tYW5kcyB8fCB7fVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgcmVzb3VyY2UgbWV0aG9kIG5hbWUgZm9yIGEgc3luY1R5cGUgd2hlbiBpdCBuYW1lcyBhIGRlY2xhcmVkXG4gICAqIGN1c3RvbSBjb21tYW5kLlxuICAgKiBAcGFyYW0ge3tjb21tYW5kQ29uZmlnOiB7Y29sbGVjdGlvbkNvbW1hbmRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBtZW1iZXJDb21tYW5kczogUmVjb3JkPHN0cmluZywgc3RyaW5nPn0sIHN5bmNUeXBlOiBzdHJpbmd9fSBhcmdzIC0gTG9va3VwIGFyZ3MuXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudWxsfSBNZXRob2QgbmFtZSBvciBudWxsLlxuICAgKi9cbiAgY29tbWFuZE1ldGhvZE5hbWVGb3JTeW5jVHlwZSh7Y29tbWFuZENvbmZpZywgc3luY1R5cGV9KSB7XG4gICAgaWYgKGNvbW1hbmRDb25maWcubWVtYmVyQ29tbWFuZHNbc3luY1R5cGVdKSByZXR1cm4gc3luY1R5cGVcbiAgICBpZiAoY29tbWFuZENvbmZpZy5jb2xsZWN0aW9uQ29tbWFuZHNbc3luY1R5cGVdKSByZXR1cm4gc3luY1R5cGVcblxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBhcmd1bWVudHMgb2JqZWN0IHBhc3NlZCB0byBhIHJlc291cmNlIGNvbW1hbmQgbWV0aG9kLiBNZW1iZXJcbiAgICogY29tbWFuZHMgcmVjZWl2ZSB0aGUgZW52ZWxvcGUncyByZXNvdXJjZUlkIGFzIGBpZGA7IHRoZSBlbnZlbG9wZSBpZGVudGl0eVxuICAgKiBpcyBhc3NpZ25lZCBhZnRlciB0aGUgcGF5bG9hZCBzbyBhIHBheWxvYWQgYGlkYCBjYW4gbmV2ZXIgcmV0YXJnZXQgdGhlXG4gICAqIGNvbW1hbmQgYXdheSBmcm9tIHRoZSByZXNvdXJjZSB0aGUgYXV0aG9yaXphdGlvbiBob29rcyBhcHByb3ZlZC5cbiAgICogQHBhcmFtIHt7Y29tbWFuZENvbmZpZzoge2NvbGxlY3Rpb25Db21tYW5kczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgbWVtYmVyQ29tbWFuZHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz59LCBjb21tYW5kTWV0aG9kTmFtZTogc3RyaW5nLCBtdXRhdGlvbjogaW1wb3J0KFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCIpLlN5bmNSZXBsYXlNdXRhdGlvbn19IGFyZ3MgLSBBcmdzIGJ1aWxkZXIgYXJncy5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gQ29tbWFuZCBtZXRob2QgYXJndW1lbnRzLlxuICAgKi9cbiAgY29tbWFuZEFyZ3NGb3JNdXRhdGlvbih7Y29tbWFuZENvbmZpZywgY29tbWFuZE1ldGhvZE5hbWUsIG11dGF0aW9ufSkge1xuICAgIGNvbnN0IGlzTWVtYmVyID0gY29tbWFuZENvbmZpZy5tZW1iZXJDb21tYW5kc1tjb21tYW5kTWV0aG9kTmFtZV0gIT09IHVuZGVmaW5lZFxuXG4gICAgaWYgKGlzTWVtYmVyKSB7XG4gICAgICByZXR1cm4gey4uLm11dGF0aW9uLmRhdGEsIGlkOiBtdXRhdGlvbi5yZXNvdXJjZUlkfVxuICAgIH1cblxuICAgIHJldHVybiB7Li4ubXV0YXRpb24uZGF0YX1cbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGEgcm91dGVkIGRlbGV0ZSBtdXRhdGlvbi4gVGhlIHJlY29yZCBpcyBtYXJrZWQgYXMgYSBzZXJ2ZXIgYXBwbHlcbiAgICogZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgcmVwbGF5LW93bmVkIGRlc3Ryb3kgLSBhbiBhY3RpdmUgU3luY1B1Ymxpc2hlclxuICAgKiBuZXZlciBwdWJsaXNoZXMgdGhlIHJlcGxheWVkIGRlbGV0ZSBhIHNlY29uZCB0aW1lICh0aGUgcmVwbGF5IG93bnMgaXRzXG4gICAqIG93biBwZXJzaXN0IGFuZCBicm9hZGNhc3RzKSwgd2hpbGUgbGF0ZXIgc2VydmVyLXNpZGUgd3JpdGVzIHRvIHRoZSBzYW1lXG4gICAqIGluc3RhbmNlIHB1Ymxpc2ggbm9ybWFsbHkgYWdhaW4uXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanNcIikuU3luY1JlcGxheU11dGF0aW9ufSBhcmdzLm11dGF0aW9uIC0gTm9ybWFsaXplZCByZXBsYXkgbXV0YXRpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZnJvbnRlbmQtbW9kZWwtcmVzb3VyY2UvYmFzZS1yZXNvdXJjZS5qc1wiKS5kZWZhdWx0fSBhcmdzLnJlc291cmNlIC0gUm91dGVkIHJlc291cmNlIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4+fSBBcHBseSByZXN1bHQgd2l0aCB0aGUgZGVsZXRlZCBmbGFnLlxuICAgKi9cbiAgYXN5bmMgYXBwbHlSb3V0ZWRSZXBsYXlEZWxldGUoe211dGF0aW9uLCByZXNvdXJjZX0pIHtcbiAgICBjb25zdCBNb2RlbENsYXNzID0gcmVzb3VyY2UubW9kZWxDbGFzcygpXG4gICAgY29uc3QgcnVuRGVsZXRlID0gYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVjb3JkID0gYXdhaXQgcmVzb3VyY2UuZmluZFN5bmNSZWNvcmQoe2ZvckRlbGV0ZTogdHJ1ZSwgbXV0YXRpb259KVxuXG4gICAgICBpZiAoIXJlY29yZCkgcmV0dXJuIHtjcmVhdGVkOiBmYWxzZSwgZGVsZXRlZDogZmFsc2UsIHJlY29yZDogbnVsbH1cblxuICAgICAgY29uc3QgY29uZmxpY3RSZXN1bHQgPSBhd2FpdCB0aGlzLnJvdXRlZFJlcGxheUNvbmZsaWN0UmVzdWx0KHthdHRyaWJ1dGVzOiB7fSwgZXhpc3RpbmdSZWNvcmQ6IHJlY29yZCwgbXV0YXRpb24sIHJlc291cmNlfSlcblxuICAgICAgaWYgKGNvbmZsaWN0UmVzdWx0KSByZXR1cm4gY29uZmxpY3RSZXN1bHRcblxuICAgICAgY29uc3QgcmVsZWFzZVNlcnZlckFwcGx5ID0gbWFya1NlcnZlckFwcGx5KHJlY29yZClcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgcmVjb3JkLmRlc3Ryb3koKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgcmVsZWFzZVNlcnZlckFwcGx5KClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtjcmVhdGVkOiBmYWxzZSwgZGVsZXRlZDogdHJ1ZSwgcmVjb3JkfVxuICAgIH1cblxuICAgIGlmICghdGhpcy5jb25mbGljdFN0cmF0ZWd5KSByZXR1cm4gYXdhaXQgcnVuRGVsZXRlKClcblxuICAgIHJldHVybiBhd2FpdCBNb2RlbENsYXNzLndpdGhBZHZpc29yeUxvY2soc3luY1JlcGxheUNvbmZsaWN0TG9ja05hbWUoe3Jlc291cmNlSWQ6IG11dGF0aW9uLnJlc291cmNlSWQsIHJlc291cmNlVHlwZTogbXV0YXRpb24ucmVzb3VyY2VUeXBlfSksIHJ1bkRlbGV0ZSwge2RlZGljYXRlZENvbm5lY3Rpb246IHRydWV9KVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgYSByb3V0ZWQgdXBzZXJ0IG11dGF0aW9uOiBwZXJtaXR0ZWQgcGF5bG9hZCBhdHRyaWJ1dGVzIGFyZVxuICAgKiBhc3NpZ25lZCBhbmQgc2F2ZWQgb250byB0aGUgZm91bmQgcmVjb3JkICh0aGUgcmVjb3JkIGxheWVyIG93bnMgdmFsdWVcbiAgICogY2FzdGluZyBhbmQgdmFsaWRhdGlvbiksIGFuZCBtaXNzaW5nIHJlY29yZHMgYXJlIGNyZWF0ZWQgd2l0aCB0aGVcbiAgICogY2xpZW50LWdlbmVyYXRlZCBwcmltYXJ5IGtleSBwbHVzIGEgc2F2ZS10aGVuLWNoZWNrIG1lbWJlcnNoaXAgY2hlY2suXG4gICAqIFdyaXR0ZW4gcmVjb3JkcyBhcmUgbWFya2VkIGFzIHNlcnZlciBhcHBsaWVzIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlXG4gICAqIHJlcGxheS1vd25lZCB3cml0ZSAtIGFuIGFjdGl2ZSBTeW5jUHVibGlzaGVyIG5ldmVyIHB1Ymxpc2hlcyB0aGUgcmVwbGF5ZWRcbiAgICogbXV0YXRpb24gYSBzZWNvbmQgdGltZSAodGhlIHJlcGxheSBvd25zIGl0cyBvd24gcGVyc2lzdCBhbmQgYnJvYWRjYXN0cyksXG4gICAqIHdoaWxlIGxhdGVyIHNlcnZlci1zaWRlIHdyaXRlcyB0byB0aGUgc2FtZSBpbnN0YW5jZSBwdWJsaXNoIG5vcm1hbGx5XG4gICAqIGFnYWluLiBNb2RlbCB2YWxpZGF0aW9uIGZhaWx1cmVzIGJlY29tZSBjbGllbnQtc2FmZSBwZXItc3luYyBmYWlsdXJlc1xuICAgKiBjYXJyeWluZyB0aGUgdHJhbnNsYXRlZCB2YWxpZGF0aW9uIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IGFyZ3MuY29udGV4dCAtIFJlcGxheSBjb250ZXh0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiKS5TeW5jUmVwbGF5TXV0YXRpb259IGFyZ3MubXV0YXRpb24gLSBOb3JtYWxpemVkIHJlcGxheSBtdXRhdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCIpLmRlZmF1bHR9IGFyZ3MucmVzb3VyY2UgLSBSb3V0ZWQgcmVzb3VyY2UgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pj59IEFwcGx5IHJlc3VsdCB3aXRoIHJlY29yZCwgY3JlYXRlZCBmbGFnLCBhbmQgYWZ0ZXJTeW5jQXBwbHkgZXh0cmFzLlxuICAgKi9cbiAgYXN5bmMgYXBwbHlSb3V0ZWRSZXBsYXlVcHNlcnQoe2NvbnRleHQsIG11dGF0aW9uLCByZXNvdXJjZX0pIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gdGhpcy5wZXJtaXR0ZWRSb3V0ZWRBdHRyaWJ1dGVzKHttdXRhdGlvbiwgcmVzb3VyY2V9KVxuICAgIGNvbnN0IE1vZGVsQ2xhc3MgPSByZXNvdXJjZS5tb2RlbENsYXNzKClcbiAgICBjb25zdCBydW5VcHNlcnQgPSBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBleGlzdGluZ1JlY29yZCA9IGF3YWl0IHJlc291cmNlLmZpbmRTeW5jUmVjb3JkKHttdXRhdGlvbn0pXG4gICAgICBjb25zdCBjb25mbGljdFJlc3VsdCA9IGF3YWl0IHRoaXMucm91dGVkUmVwbGF5Q29uZmxpY3RSZXN1bHQoe2F0dHJpYnV0ZXMsIGV4aXN0aW5nUmVjb3JkLCBtdXRhdGlvbiwgcmVzb3VyY2V9KVxuXG4gICAgICBpZiAoY29uZmxpY3RSZXN1bHQpIHJldHVybiBjb25mbGljdFJlc3VsdFxuXG4gICAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgbnVsbH0gKi9cbiAgICAgIGxldCByZWNvcmQgPSBleGlzdGluZ1JlY29yZFxuICAgICAgbGV0IGNyZWF0ZWQgPSBmYWxzZVxuXG4gICAgICBpZiAoZXhpc3RpbmdSZWNvcmQpIHtcbiAgICAgICAgY29uc3QgcmVsZWFzZVNlcnZlckFwcGx5ID0gbWFya1NlcnZlckFwcGx5KGV4aXN0aW5nUmVjb3JkKVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZXhpc3RpbmdSZWNvcmQuYXNzaWduKGF0dHJpYnV0ZXMpXG4gICAgICAgICAgYXdhaXQgdGhpcy5zYXZlUm91dGVkUmVwbGF5UmVjb3JkKGV4aXN0aW5nUmVjb3JkKVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHJlbGVhc2VTZXJ2ZXJBcHBseSgpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlY29yZCA9IGF3YWl0IHRoaXMuY3JlYXRlUm91dGVkUmVwbGF5UmVjb3JkKHthdHRyaWJ1dGVzLCBtdXRhdGlvbiwgcmVzb3VyY2V9KVxuICAgICAgICBjcmVhdGVkID0gdHJ1ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBleHRyYXMgPSBhd2FpdCByZXNvdXJjZS5hZnRlclN5bmNBcHBseSh7Y29udGV4dCwgY3JlYXRlZCwgbXV0YXRpb24sIHJlY29yZH0pXG5cbiAgICAgIHJldHVybiB7Y3JlYXRlZCwgZGVsZXRlZDogZmFsc2UsIHJlY29yZCwgLi4uZXh0cmFzfVxuICAgIH1cblxuICAgIGlmICghdGhpcy5jb25mbGljdFN0cmF0ZWd5KSByZXR1cm4gYXdhaXQgcnVuVXBzZXJ0KClcblxuICAgIHJldHVybiBhd2FpdCBNb2RlbENsYXNzLndpdGhBZHZpc29yeUxvY2soc3luY1JlcGxheUNvbmZsaWN0TG9ja05hbWUoe3Jlc291cmNlSWQ6IG11dGF0aW9uLnJlc291cmNlSWQsIHJlc291cmNlVHlwZTogbXV0YXRpb24ucmVzb3VyY2VUeXBlfSksIHJ1blVwc2VydCwge2RlZGljYXRlZENvbm5lY3Rpb246IHRydWV9KVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIGEgcm91dGVkIHVwc2VydCBtdXRhdGlvbiBjb25mbGljdHMgd2l0aCB0aGUgY3VycmVudCBzZXJ2ZXJcbiAgICogc3RhdGUgd2hlbiB0aGUgc2VydmljZSBpcyBjb25maWd1cmVkIHdpdGggYSBjb25mbGljdCBzdHJhdGVneS4gQSBtdXRhdGlvblxuICAgKiB3aG9zZSBiYXNlVmVyc2lvbiBkb2VzIG5vdCBtYXRjaCB0aGUgc2VydmVyJ3MgY3VycmVudCB2ZXJzaW9uQXR0cmlidXRlIGlzXG4gICAqIHJlamVjdGVkIHdpdGggYSBzdHJ1Y3R1cmVkIGNvbmZsaWN0IHBheWxvYWQgaW5zdGVhZCBvZiBiZWluZyBhcHBsaWVkLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIENvbmZsaWN0LWNoZWNrIGFyZ3MuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBhcmdzLmF0dHJpYnV0ZXMgLSBQZXJtaXR0ZWQgbXV0YXRpb24gYXR0cmlidXRlcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCB8IG51bGx9IGFyZ3MuZXhpc3RpbmdSZWNvcmQgLSBFeGlzdGluZyBzZXJ2ZXIgcmVjb3JkLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiKS5TeW5jUmVwbGF5TXV0YXRpb259IGFyZ3MubXV0YXRpb24gLSBOb3JtYWxpemVkIHJlcGxheSBtdXRhdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCIpLmRlZmF1bHR9IGFyZ3MucmVzb3VyY2UgLSBSb3V0ZWQgcmVzb3VyY2UgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PiB8IG51bGw+fSAtIENvbmZsaWN0IGFwcGx5IHJlc3VsdCwgb3IgbnVsbCB3aGVuIG5vIGNvbmZsaWN0LlxuICAgKi9cbiAgYXN5bmMgcm91dGVkUmVwbGF5Q29uZmxpY3RSZXN1bHQoe2F0dHJpYnV0ZXMsIGV4aXN0aW5nUmVjb3JkLCBtdXRhdGlvbiwgcmVzb3VyY2V9KSB7XG4gICAgaWYgKCF0aGlzLmNvbmZsaWN0U3RyYXRlZ3kpIHJldHVybiBudWxsXG4gICAgaWYgKCFleGlzdGluZ1JlY29yZCB8fCBtdXRhdGlvbi5zeW5jVHlwZSA9PT0gXCJjcmVhdGVcIikgcmV0dXJuIG51bGxcbiAgICBpZiAobXV0YXRpb24uYmFzZVZlcnNpb24gPT09IHVuZGVmaW5lZCB8fCBtdXRhdGlvbi5iYXNlVmVyc2lvbiA9PT0gbnVsbCkgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IE1vZGVsQ2xhc3MgPSByZXNvdXJjZS5tb2RlbENsYXNzKClcbiAgICBjb25zdCBwcmltYXJ5S2V5ID0gc2NhbGFyTW9kZWxQcmltYXJ5S2V5KE1vZGVsQ2xhc3MucHJpbWFyeUtleSgpLCBgT2ZmbGluZSBzeW5jIGNvbmZsaWN0IGhhbmRsaW5nIGZvciAke01vZGVsQ2xhc3MubmFtZX1gKVxuICAgIGNvbnN0IHByaW1hcnlLZXlBdHRyaWJ1dGUgPSBNb2RlbENsYXNzLnJlc29sdmVBdHRyaWJ1dGVOYW1lKHByaW1hcnlLZXkpXG4gICAgY29uc3QgdmVyc2lvbkF0dHJpYnV0ZSA9IHRoaXMuY29uZmxpY3RTdHJhdGVneS52ZXJzaW9uQXR0cmlidXRlXG4gICAgY29uc3QgdmVyc2lvbkF0dHJpYnV0ZU5hbWUgPSBNb2RlbENsYXNzLnJlc29sdmVBdHRyaWJ1dGVOYW1lKHZlcnNpb25BdHRyaWJ1dGUpXG5cbiAgICBpZiAoIXByaW1hcnlLZXlBdHRyaWJ1dGUpIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgcmVzb2x2ZSBwcmltYXJ5IGtleSBhdHRyaWJ1dGU6ICR7cHJpbWFyeUtleX1gKVxuICAgIGlmICghdmVyc2lvbkF0dHJpYnV0ZU5hbWUpIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgcmVzb2x2ZSB2ZXJzaW9uIGF0dHJpYnV0ZTogJHt2ZXJzaW9uQXR0cmlidXRlfWApXG5cbiAgICBjb25zdCBzZXJ2ZXJWZXJzaW9uID0gbm9ybWFsaXplQ29uZmxpY3RWYWx1ZShleGlzdGluZ1JlY29yZC5yZWFkQXR0cmlidXRlKHZlcnNpb25BdHRyaWJ1dGVOYW1lKSlcblxuICAgIGlmIChzdGFibGVKc29uU3RyaW5naWZ5KHNlcnZlclZlcnNpb24pID09PSBzdGFibGVKc29uU3RyaW5naWZ5KG11dGF0aW9uLmJhc2VWZXJzaW9uKSkgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IHNlcmlhbGl6ZWRBZmZlY3RlZEF0dHJpYnV0ZXMgPSBhd2FpdCB0aGlzLnNlcmlhbGl6ZWRSb3V0ZWRDb25mbGljdEF0dHJpYnV0ZXMoe2F0dHJpYnV0ZXMsIGV4aXN0aW5nUmVjb3JkLCByZXNvdXJjZX0pXG4gICAgY29uc3Qgc2VydmVyQXR0cmlidXRlcyA9IHtcbiAgICAgIC4uLnNlcmlhbGl6ZWRBZmZlY3RlZEF0dHJpYnV0ZXMsXG4gICAgICBbcHJpbWFyeUtleUF0dHJpYnV0ZV06IGV4aXN0aW5nUmVjb3JkLnJlYWRBdHRyaWJ1dGUocHJpbWFyeUtleUF0dHJpYnV0ZSksXG4gICAgICBbdmVyc2lvbkF0dHJpYnV0ZU5hbWVdOiBzZXJ2ZXJWZXJzaW9uXG4gICAgfVxuXG4gICAgY29uc3Qgc2VydmVyUmVjb3JkID0ge1xuICAgICAgYXR0cmlidXRlczogc2VydmVyQXR0cmlidXRlcyxcbiAgICAgIHZlcnNpb246IHNlcnZlclZlcnNpb25cbiAgICB9XG4gICAgY29uc3QgY29uZmxpY3RNdXRhdGlvbiA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9kZXZpY2UtaWRlbnRpdHkuanNcIikuU3luY011dGF0aW9ufSAqLyAoLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoe1xuICAgICAgYXR0cmlidXRlcyxcbiAgICAgIGJhc2VWZXJzaW9uOiBtdXRhdGlvbi5iYXNlVmVyc2lvbixcbiAgICAgIGNsaWVudE11dGF0aW9uSWQ6IG11dGF0aW9uLmNsaWVudE11dGF0aW9uSWQgfHwgbXV0YXRpb24uaWQsXG4gICAgICBtb2RlbDogbXV0YXRpb24ucmVzb3VyY2VUeXBlLFxuICAgICAgb3BlcmF0aW9uOiBtdXRhdGlvbi5zeW5jVHlwZSxcbiAgICAgIHBheWxvYWQ6IHtpZDogbXV0YXRpb24ucmVzb3VyY2VJZH1cbiAgICB9KSlcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNvbHZlU3luY0NvbmZsaWN0KHtcbiAgICAgIGJhc2VSZWNvcmQ6IG51bGwsXG4gICAgICBtdXRhdGlvbjogY29uZmxpY3RNdXRhdGlvbixcbiAgICAgIHNlcnZlclJlY29yZCxcbiAgICAgIHN0cmF0ZWd5OiB0aGlzLmNvbmZsaWN0U3RyYXRlZ3kuc3RyYXRlZ3kgfHwgXCJvcHRpbWlzdGljVmVyc2lvblwiLFxuICAgICAgdmVyc2lvbkF0dHJpYnV0ZVxuICAgIH0pXG5cbiAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gXCJjb25mbGljdFwiKSByZXR1cm4gbnVsbFxuXG4gICAgcmV0dXJuIHtjb25mbGljdDogcmVzdWx0LmNvbmZsaWN0LCBjcmVhdGVkOiBmYWxzZSwgZGVsZXRlZDogZmFsc2UsIHJlY29yZDogZXhpc3RpbmdSZWNvcmQsIHN0YXR1czogXCJjb25mbGljdFwifVxuICB9XG5cbiAgLyoqXG4gICAqIFByb2plY3RzIGFmZmVjdGVkIG11dGF0aW9uIGZpZWxkcyB0aHJvdWdoIHRoZSByZXNvdXJjZSdzIHJlYWRhYmxlXG4gICAqIGF0dHJpYnV0ZSBjb250cmFjdC4gV3JpdGFibGUtYnV0LWhpZGRlbiBmaWVsZHMgYXJlIG9taXR0ZWQsIHdoaWxlIGN1c3RvbVxuICAgKiBgPGF0dHJpYnV0ZT5BdHRyaWJ1dGUobW9kZWwpYCBzZXJpYWxpemVycyBhbmQgbW9kZWwgYWNjZXNzb3JzIHJlbWFpbiB0aGVcbiAgICogc291cmNlIG9mIGZyb250ZW5kLXZpc2libGUgdmFsdWVzIChEYXRlIHZhbHVlcyBhcmUga2VwdCByYXcgc28gdGhlIG5vcm1hbFxuICAgKiBmcm9udGVuZC1tb2RlbCB0cmFuc3BvcnQgc2VyaWFsaXplciBjYW4gZW1pdCBpdHMgZGF0ZSBtYXJrZXIpLiBQcm9qZWN0ZWRcbiAgICoga2V5cyB1c2UgY2Fub25pY2FsIG1vZGVsIGF0dHJpYnV0ZSBuYW1lcyBldmVuIHdoZW4gdGhlIG11dGF0aW9uIHVzZWQgYVxuICAgKiBkYXRhYmFzZS1jb2x1bW4gYWxpYXMuIFRoZSBmdWxsIG1vZGVsIGF0dHJpYnV0ZSBoYXNoIGlzIG5ldmVyIGV4cG9zZWQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gUHJvamVjdGlvbiBhcmdzLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gYXJncy5hdHRyaWJ1dGVzIC0gUGVybWl0dGVkIGFmZmVjdGVkIG11dGF0aW9uIGF0dHJpYnV0ZXMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IGFyZ3MuZXhpc3RpbmdSZWNvcmQgLSBBdXRob3JpemVkIHNlcnZlciByZWNvcmQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZnJvbnRlbmQtbW9kZWwtcmVzb3VyY2UvYmFzZS1yZXNvdXJjZS5qc1wiKS5kZWZhdWx0fSBhcmdzLnJlc291cmNlIC0gUm91dGVkIHJlc291cmNlIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4+fSBTZXJpYWxpemVkIHJlYWRhYmxlIGFmZmVjdGVkIGF0dHJpYnV0ZXMuXG4gICAqL1xuICBhc3luYyBzZXJpYWxpemVkUm91dGVkQ29uZmxpY3RBdHRyaWJ1dGVzKHthdHRyaWJ1dGVzLCBleGlzdGluZ1JlY29yZCwgcmVzb3VyY2V9KSB7XG4gICAgY29uc3QgTW9kZWxDbGFzcyA9IHJlc291cmNlLm1vZGVsQ2xhc3MoKVxuICAgIGNvbnN0IFJlc291cmNlQ2xhc3MgPSAvKiogQHR5cGUge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlfSAqLyAocmVzb3VyY2UuY29uc3RydWN0b3IpXG4gICAgY29uc3QgcmVhZGFibGVBdHRyaWJ1dGVzID0gbmV3IFNldCgpXG4gICAgY29uc3QgY29uZmlndXJlZEF0dHJpYnV0ZXMgPSBSZXNvdXJjZUNsYXNzLnJlc291cmNlQ29uZmlnKCkuYXR0cmlidXRlc1xuICAgIGNvbnN0IGNvbmZpZ3VyZWRFbnRyaWVzID0gQXJyYXkuaXNBcnJheShjb25maWd1cmVkQXR0cmlidXRlcykgPyBjb25maWd1cmVkQXR0cmlidXRlcyA6IE9iamVjdC5rZXlzKGNvbmZpZ3VyZWRBdHRyaWJ1dGVzKVxuXG4gICAgaWYgKGNvbmZpZ3VyZWRFbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3QgYXR0cmlidXRlTmFtZVRvQ29sdW1uTmFtZSA9IE1vZGVsQ2xhc3MuZ2V0QXR0cmlidXRlTmFtZVRvQ29sdW1uTmFtZU1hcCgpXG5cbiAgICAgIGZvciAoY29uc3QgYXR0cmlidXRlTmFtZSBvZiBPYmplY3Qua2V5cyhhdHRyaWJ1dGVOYW1lVG9Db2x1bW5OYW1lKSkge1xuICAgICAgICByZWFkYWJsZUF0dHJpYnV0ZXMuYWRkKGF0dHJpYnV0ZU5hbWUpXG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjb25maWd1cmVkQXR0cmlidXRlIG9mIGNvbmZpZ3VyZWRFbnRyaWVzKSB7XG4gICAgICBjb25zdCBjb25maWd1cmVkTmFtZSA9IHR5cGVvZiBjb25maWd1cmVkQXR0cmlidXRlID09PSBcInN0cmluZ1wiID8gY29uZmlndXJlZEF0dHJpYnV0ZSA6IGNvbmZpZ3VyZWRBdHRyaWJ1dGUubmFtZVxuXG4gICAgICBpZiAoIWNvbmZpZ3VyZWROYW1lKSBjb250aW51ZVxuXG4gICAgICBjb25zdCBjYW5vbmljYWxOYW1lID0gTW9kZWxDbGFzcy5yZXNvbHZlQXR0cmlidXRlTmFtZShjb25maWd1cmVkTmFtZSlcblxuICAgICAgcmVhZGFibGVBdHRyaWJ1dGVzLmFkZChjYW5vbmljYWxOYW1lIHx8IGNvbmZpZ3VyZWROYW1lKVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAqL1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRBdHRyaWJ1dGVzID0ge31cblxuICAgIGZvciAoY29uc3QgYWZmZWN0ZWRGaWVsZCBvZiBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKSkge1xuICAgICAgY29uc3QgYXR0cmlidXRlTmFtZSA9IE1vZGVsQ2xhc3MucmVzb2x2ZUF0dHJpYnV0ZU5hbWUoYWZmZWN0ZWRGaWVsZClcblxuICAgICAgaWYgKCFhdHRyaWJ1dGVOYW1lIHx8ICFyZWFkYWJsZUF0dHJpYnV0ZXMuaGFzKGF0dHJpYnV0ZU5hbWUpKSBjb250aW51ZVxuXG4gICAgICBjb25zdCByZXNvdXJjZUF0dHJpYnV0ZSA9IHJlc291cmNlLnJlc291cmNlTWV0aG9kKGAke2F0dHJpYnV0ZU5hbWV9QXR0cmlidXRlYClcblxuICAgICAgaWYgKHJlc291cmNlQXR0cmlidXRlKSB7XG4gICAgICAgIHNlcmlhbGl6ZWRBdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdID0gYXdhaXQgcmVzb3VyY2VBdHRyaWJ1dGUubWV0aG9kLmNhbGwocmVzb3VyY2VBdHRyaWJ1dGUucmVzb3VyY2UsIGV4aXN0aW5nUmVjb3JkKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZWNvcmRNZXRob2RzID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovICgvKiogQHR5cGUge3Vua25vd259ICovIChleGlzdGluZ1JlY29yZCkpXG4gICAgICBjb25zdCBhdHRyaWJ1dGVNZXRob2QgPSByZWNvcmRNZXRob2RzW2F0dHJpYnV0ZU5hbWVdXG5cbiAgICAgIGlmICh0eXBlb2YgYXR0cmlidXRlTWV0aG9kID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgc2VyaWFsaXplZEF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0gPSBhd2FpdCBhdHRyaWJ1dGVNZXRob2QuY2FsbChleGlzdGluZ1JlY29yZClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlcmlhbGl6ZWRBdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdID0gZXhpc3RpbmdSZWNvcmQucmVhZEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzZXJpYWxpemVkQXR0cmlidXRlc1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYSByb3V0ZWQgbXV0YXRpb24gcGF5bG9hZCBkb3duIHRvIHRoZSByZXNvdXJjZSdzIGRlY2xhcmVkXG4gICAqIHdyaXRhYmxlLWF0dHJpYnV0ZSBwZXJtaXQgbGlzdC4gQWNjZXB0ZWQga2V5cyBwZXIgcGVybWl0dGVkIGF0dHJpYnV0ZSBhcmVcbiAgICogdGhlIGNhbWVsQ2FzZSBhdHRyaWJ1dGUgbmFtZSBwbHVzIHRoZSBtb2RlbCdzIGFjdHVhbCBjb2x1bW4gbmFtZTsgdW5rbm93blxuICAgKiBrZXlzIGZhaWwgdGhlIHN5bmMgbG91ZGx5LiBUaGUgcHJpbWFyeSBrZXkgaXMgZHJvcHBlZCB3aGVuIHBlcm1pdHRlZFxuICAgKiAoc25hcHNob3QgcGF5bG9hZHMpIOKAlCB0aGUgZW52ZWxvcGUncyByZXNvdXJjZUlkIGlzIHRoZSBhdXRob3JpdGF0aXZlXG4gICAqIHJlY29yZCBpZGVudGl0eSwgc28gYSBwYXlsb2FkIGlkIGNhbiBuZXZlciByZXRhcmdldCB0aGUgcm93LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCIpLlN5bmNSZXBsYXlNdXRhdGlvbn0gYXJncy5tdXRhdGlvbiAtIE5vcm1hbGl6ZWQgcmVwbGF5IG11dGF0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVsLXJlc291cmNlL2Jhc2UtcmVzb3VyY2UuanNcIikuZGVmYXVsdH0gYXJncy5yZXNvdXJjZSAtIFJvdXRlZCByZXNvdXJjZSBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gUGVybWl0dGVkIGF0dHJpYnV0ZXMgZm9yIHJlY29yZC5hc3NpZ24uXG4gICAqL1xuICBwZXJtaXR0ZWRSb3V0ZWRBdHRyaWJ1dGVzKHttdXRhdGlvbiwgcmVzb3VyY2V9KSB7XG4gICAgY29uc3QgcGVybWl0dGVkQXR0cmlidXRlcyA9IHJlc291cmNlLmRlY2xhcmVkV3JpdGFibGVBdHRyaWJ1dGVzKClcblxuICAgIGlmICghcGVybWl0dGVkQXR0cmlidXRlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3Jlc291cmNlLmNvbnN0cnVjdG9yLm5hbWV9IG11c3QgZGVjbGFyZSBzdGF0aWMgd3JpdGFibGVBdHRyaWJ1dGVzIHRvIGFwcGx5IHJvdXRlZCBzeW5jIG11dGF0aW9ucyBmb3I6ICR7bXV0YXRpb24ucmVzb3VyY2VUeXBlfWApXG4gICAgfVxuXG4gICAgY29uc3QgTW9kZWxDbGFzcyA9IHJlc291cmNlLm1vZGVsQ2xhc3MoKVxuICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWVUb0NvbHVtbk5hbWUgPSBNb2RlbENsYXNzLmdldEF0dHJpYnV0ZU5hbWVUb0NvbHVtbk5hbWVNYXAoKVxuXG4gICAgLyoqIEB0eXBlIHtTZXQ8c3RyaW5nPn0gKi9cbiAgICBjb25zdCBhbGxvd2VkS2V5cyA9IG5ldyBTZXQoKVxuXG4gICAgZm9yIChjb25zdCBhdHRyaWJ1dGVOYW1lIG9mIHBlcm1pdHRlZEF0dHJpYnV0ZXMpIHtcbiAgICAgIGFsbG93ZWRLZXlzLmFkZChhdHRyaWJ1dGVOYW1lKVxuXG4gICAgICBjb25zdCBjb2x1bW5OYW1lID0gYXR0cmlidXRlTmFtZVRvQ29sdW1uTmFtZVthdHRyaWJ1dGVOYW1lXVxuXG4gICAgICBpZiAoY29sdW1uTmFtZSkgYWxsb3dlZEtleXMuYWRkKGNvbHVtbk5hbWUpXG4gICAgfVxuXG4gICAgY29uc3QgcHJpbWFyeUtleSA9IHNjYWxhck1vZGVsUHJpbWFyeUtleShNb2RlbENsYXNzLnByaW1hcnlLZXkoKSwgYE9mZmxpbmUgc3luYyBhdHRyaWJ1dGUgZmlsdGVyaW5nIGZvciAke01vZGVsQ2xhc3MubmFtZX1gKVxuICAgIGNvbnN0IHByaW1hcnlLZXlBdHRyaWJ1dGUgPSBNb2RlbENsYXNzLmdldENvbHVtbk5hbWVUb0F0dHJpYnV0ZU5hbWVNYXAoKVtwcmltYXJ5S2V5XVxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovXG4gICAgY29uc3QgYXR0cmlidXRlcyA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhtdXRhdGlvbi5kYXRhKSkge1xuICAgICAgaWYgKCFhbGxvd2VkS2V5cy5oYXMoa2V5KSkge1xuICAgICAgICB0aHJvdyByZXNvdXJjZS53cml0YWJsZUF0dHJpYnV0ZUVycm9yKGBVbmtub3duIGF0dHJpYnV0ZTogJHtrZXl9LmAsIHtjb2RlOiBcInN5bmMtdW5rbm93bi1hdHRyaWJ1dGVcIn0pXG4gICAgICB9XG5cbiAgICAgIGlmIChrZXkgPT09IHByaW1hcnlLZXkgfHwga2V5ID09PSBwcmltYXJ5S2V5QXR0cmlidXRlKSBjb250aW51ZVxuXG4gICAgICBhdHRyaWJ1dGVzW2tleV0gPSB2YWx1ZVxuICAgIH1cblxuICAgIHJldHVybiBhdHRyaWJ1dGVzXG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgcm91dGVkIHJlY29yZCB3aXRoIHRoZSBjbGllbnQtZ2VuZXJhdGVkIHByaW1hcnkga2V5IChtYXJrZWRcbiAgICogYXMgYSBzZXJ2ZXIgYXBwbHkgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgY3JlYXRlIC0gaW5jbHVkaW5nIHRoZVxuICAgKiBtZW1iZXJzaGlwLWNoZWNrIGNvbXBlbnNhdGlvbiBkZXN0cm95IC0gc28gYW4gYWN0aXZlIFN5bmNQdWJsaXNoZXIgbmV2ZXJcbiAgICogcHVibGlzaGVzIHRoZSByZXBsYXllZCBjcmVhdGUgYSBzZWNvbmQgdGltZSksIHRoZW5cbiAgICogdmVyaWZpZXMgY3JlYXRlLXNjb3BlIG1lbWJlcnNoaXAgd2hlbiBhbiBhYmlsaXR5IGlzIGNvbmZpZ3VyZWQ6IHJlY29yZHNcbiAgICogb3V0c2lkZSB0aGUgYWJpbGl0eSdzIGNyZWF0ZSBzY29wZSBhcmUgZGVzdHJveWVkIGFnYWluIGFuZCBmYWlsIHRoZSBzeW5jXG4gICAqIHdpdGggdGhlIHJlc291cmNlLWRlY2xhcmVkIHJlYXNvbi4gQSByZWNvcmQgdGhhdCBhbHJlYWR5IGV4aXN0cyBvdXRzaWRlXG4gICAqIHRoZSByZXNvdXJjZSdzIGxvb2t1cCBzY29wZSBmYWlscyB0aGUgc3luYyBhcyBhbiBhdXRob3JpemF0aW9uIGRlbmlhbFxuICAgKiBpbnN0ZWFkIG9mIGNvbGxpZGluZyBvbiB0aGUgcHJpbWFyeSBrZXkuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IGFyZ3MuYXR0cmlidXRlcyAtIFBlcm1pdHRlZCBwYXlsb2FkIGF0dHJpYnV0ZXMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCIpLlN5bmNSZXBsYXlNdXRhdGlvbn0gYXJncy5tdXRhdGlvbiAtIE5vcm1hbGl6ZWQgcmVwbGF5IG11dGF0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVsLXJlc291cmNlL2Jhc2UtcmVzb3VyY2UuanNcIikuZGVmYXVsdH0gYXJncy5yZXNvdXJjZSAtIFJvdXRlZCByZXNvdXJjZSBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQ+fSBDcmVhdGVkIHJlY29yZC5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZVJvdXRlZFJlcGxheVJlY29yZCh7YXR0cmlidXRlcywgbXV0YXRpb24sIHJlc291cmNlfSkge1xuICAgIGNvbnN0IE1vZGVsQ2xhc3MgPSByZXNvdXJjZS5tb2RlbENsYXNzKClcbiAgICBjb25zdCBwcmltYXJ5S2V5ID0gc2NhbGFyTW9kZWxQcmltYXJ5S2V5KE1vZGVsQ2xhc3MucHJpbWFyeUtleSgpLCBgT2ZmbGluZSBzeW5jIGNyZWF0ZSBmb3IgJHtNb2RlbENsYXNzLm5hbWV9YClcbiAgICBjb25zdCBjb25mbGljdGluZ0lkcyA9IGF3YWl0IE1vZGVsQ2xhc3Mud2hlcmUoe1twcmltYXJ5S2V5XTogbXV0YXRpb24ucmVzb3VyY2VJZH0pLnBsdWNrKHByaW1hcnlLZXkpXG5cbiAgICBpZiAoY29uZmxpY3RpbmdJZHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgVmVsb2Npb3VzRXJyb3Iuc2FmZShgU3luYyB1cGRhdGUgZGVuaWVkIGZvcjogJHttdXRhdGlvbi5yZXNvdXJjZVR5cGV9LmAsIHtcbiAgICAgICAgY29kZTogcmVzb3VyY2Uuc3luY0F1dGhvcml6YXRpb25GYWlsdXJlUmVhc29uKHthY3Rpb246IFwidXBkYXRlXCIsIG11dGF0aW9ufSkgfHwgXCJhY2Nlc3MtZGVuaWVkXCJcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgYXdhaXQgTW9kZWxDbGFzcy5lbnN1cmVJbml0aWFsaXplZCgpXG5cbiAgICBjb25zdCByZWNvcmQgPSBuZXcgTW9kZWxDbGFzcyh7W3ByaW1hcnlLZXldOiBtdXRhdGlvbi5yZXNvdXJjZUlkLCAuLi5hdHRyaWJ1dGVzfSlcbiAgICBjb25zdCByZWxlYXNlU2VydmVyQXBwbHkgPSBtYXJrU2VydmVyQXBwbHkocmVjb3JkKVxuXG4gICAgdHJ5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHJlY29yZC5zYXZlKClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRocm93IHRoaXMucm91dGVkUmVwbGF5U2F2ZUVycm9yKGVycm9yKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBhYmlsaXR5ID0gcmVzb3VyY2UuYWJpbGl0eVxuXG4gICAgICBpZiAoYWJpbGl0eSkge1xuICAgICAgICBjb25zdCBtZW1iZXJJZHMgPSBhd2FpdCBNb2RlbENsYXNzXG4gICAgICAgICAgLmFjY2Vzc2libGVGb3IocmVzb3VyY2Uuc3luY0FiaWxpdHlBY3Rpb24oXCJjcmVhdGVcIiksIGFiaWxpdHkpXG4gICAgICAgICAgLndoZXJlKHtbcHJpbWFyeUtleV06IHNjYWxhck1vZGVsUHJpbWFyeUtleVZhbHVlKHJlY29yZC5pZCgpLCBgT2ZmbGluZSBzeW5jIGNyZWF0ZSBhdXRob3JpemF0aW9uIGZvciAke01vZGVsQ2xhc3MubmFtZX1gKX0pXG4gICAgICAgICAgLnBsdWNrKHByaW1hcnlLZXkpXG5cbiAgICAgICAgaWYgKG1lbWJlcklkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBhd2FpdCByZWNvcmQuZGVzdHJveSgpXG5cbiAgICAgICAgICB0aHJvdyBWZWxvY2lvdXNFcnJvci5zYWZlKGBTeW5jIGNyZWF0ZSBkZW5pZWQgZm9yOiAke211dGF0aW9uLnJlc291cmNlVHlwZX0uYCwge1xuICAgICAgICAgICAgY29kZTogcmVzb3VyY2Uuc3luY0F1dGhvcml6YXRpb25GYWlsdXJlUmVhc29uKHthY3Rpb246IFwiY3JlYXRlXCIsIG11dGF0aW9ufSkgfHwgXCJhY2Nlc3MtZGVuaWVkXCJcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZWNvcmRcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcmVsZWFzZVNlcnZlckFwcGx5KClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2F2ZXMgYSByb3V0ZWQgcmVjb3JkLCBjb252ZXJ0aW5nIG1vZGVsIHZhbGlkYXRpb24gZmFpbHVyZXMgaW50b1xuICAgKiBjbGllbnQtc2FmZSBwZXItc3luYyBlcnJvcnMgY2FycnlpbmcgdGhlIHRyYW5zbGF0ZWQgdmFsaWRhdGlvbiBtZXNzYWdlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSByZWNvcmQgLSBSZWNvcmQgdG8gc2F2ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IFJlc29sdmVzIHdoZW4gc2F2ZWQuXG4gICAqL1xuICBhc3luYyBzYXZlUm91dGVkUmVwbGF5UmVjb3JkKHJlY29yZCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCByZWNvcmQuc2F2ZSgpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IHRoaXMucm91dGVkUmVwbGF5U2F2ZUVycm9yKGVycm9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNYXBzIGEgcm91dGVkIHNhdmUvY3JlYXRlIGZhaWx1cmU6IG1vZGVsIHZhbGlkYXRpb24gZXJyb3JzIGJlY29tZVxuICAgKiBjbGllbnQtc2FmZSBlcnJvcnMgd2l0aCB0aGVpciB0cmFuc2xhdGVkIG1lc3NhZ2VzLCBldmVyeXRoaW5nIGVsc2VcbiAgICogcHJvcGFnYXRlcyB1bmNoYW5nZWQuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IGVycm9yIC0gVGhyb3duIHNhdmUvY3JlYXRlIGVycm9yLlxuICAgKiBAcmV0dXJucyB7RXJyb3J9IEVycm9yIHRvIHJldGhyb3cuXG4gICAqL1xuICByb3V0ZWRSZXBsYXlTYXZlRXJyb3IoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBWYWxpZGF0aW9uRXJyb3IpIHtcbiAgICAgIHJldHVybiBWZWxvY2lvdXNFcnJvci5zYWZlKGVycm9yLm1lc3NhZ2UsIHtjYXVzZTogZXJyb3IsIGNvZGU6IFwidmFsaWRhdGlvbi1lcnJvclwifSlcbiAgICB9XG5cbiAgICByZXR1cm4gLyoqIEB0eXBlIHtFcnJvcn0gKi8gKGVycm9yKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGFuIGFwcGx5IHJlc3VsdCBmb3Igc3RhbGUgbXV0YXRpb25zIHRoYXQgc2hvdWxkIG5vdCB0b3VjaCBkb21haW4gbW9kZWxzLlxuICAgKiBFeGFjdCBkdXBsaWNhdGVzIHJlc29sdmUgdGhlIGN1cnJlbnQgcm91dGVkIHJlY29yZCBzbyB0aGUgYWNrbm93bGVkZ2VtZW50XG4gICAqIGNhbiBpbmNsdWRlIGl0cyBhdXRob3JpdGF0aXZlIHZlcnNpb24gd2l0aG91dCBhcHBseWluZyB0aGUgbXV0YXRpb24gYWdhaW4uXG4gICAqIEBwYXJhbSB7e2FjdG9yOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgY29udGV4dDogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+LCBleGlzdGluZ1N5bmM6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCBtdXRhdGlvbjogaW1wb3J0KFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCIpLlN5bmNSZXBsYXlNdXRhdGlvbn19IGFyZ3MgLSBBY3RvciwgYmF0Y2ggY29udGV4dCwgZXhpc3Rpbmcgc3luYyByb3csIGFuZCBtdXRhdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBQcm9qZWN0LXNwZWNpZmljIGFwcGx5IHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIHNraXBwZWRSZXBsYXlNdXRhdGlvbih7YWN0b3IsIGNvbnRleHQsIGV4aXN0aW5nU3luYywgbXV0YXRpb259KSB7XG4gICAgaWYgKCF0aGlzLmlzRHVwbGljYXRlUmVwbGF5TXV0YXRpb24oe2V4aXN0aW5nU3luYywgbXV0YXRpb259KSB8fCAhdGhpcy5yb3V0aW5nQ29uZmlndXJlZCgpKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgcmVnaXN0cmF0aW9uID0gdGhpcy5yZXBsYXlSZXNvdXJjZVJlZ2lzdHJhdGlvbihtdXRhdGlvbi5yZXNvdXJjZVR5cGUpXG5cbiAgICBpZiAoIXJlZ2lzdHJhdGlvbikgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IHJlc291cmNlID0gYXdhaXQgdGhpcy5idWlsZFJlcGxheVJlc291cmNlKHthY3RvciwgY29udGV4dCwgbXV0YXRpb24sIHJlZ2lzdHJhdGlvbn0pXG4gICAgY29uc3QgcmVjb3JkID0gYXdhaXQgcmVzb3VyY2UuZmluZFN5bmNSZWNvcmQoe2ZvckRlbGV0ZTogbXV0YXRpb24uc3luY1R5cGUgPT09IFwiZGVsZXRlXCIsIG11dGF0aW9ufSlcblxuICAgIHJldHVybiB7Y3JlYXRlZDogZmFsc2UsIGRlbGV0ZWQ6IGZhbHNlLCBkdXBsaWNhdGU6IHRydWUsIHJlY29yZH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJzaXN0cyBvbmUgbm9ybWFsaXplZCBtdXRhdGlvbiBpbnRvIHRoZSBhcHAgc3luYy9jaGFuZ2Ugc3RvcmUuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIGEgc3RhbGUtZ3VhcmRlZCBzeW5jLW1vZGVsIHVwc2VydCAod2l0aCBzZXJ2ZXIgcmUtc2VxdWVuY2luZyBvblxuICAgKiB1cGRhdGVzKSB3aGVuIGEgc3luYyBtb2RlbCBpcyBjb25maWd1cmVkOyBvdGhlcndpc2UgYXBwcyBvdmVycmlkZSB0aGlzIGhvb2suXG4gICAqIEBwYXJhbSB7e2FjdG9yOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgY29udGV4dDogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+LCBleGlzdGluZ1N5bmM6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCBhcHBseVJlc3VsdDogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4sIG11dGF0aW9uOiBpbXBvcnQoXCIuL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanNcIikuU3luY1JlcGxheU11dGF0aW9uLCBzaG91bGRBcHBseTogYm9vbGVhbn19IGFyZ3MgLSBSZXBsYXkgcGVyc2lzdGVuY2UgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHBlcnNpc3RSZXBsYXlNdXRhdGlvbih7YWN0b3IsIGFwcGx5UmVzdWx0LCBjb250ZXh0LCBleGlzdGluZ1N5bmMsIG11dGF0aW9uLCBzaG91bGRBcHBseX0pIHtcbiAgICBpZiAoIXRoaXMuc3luY01vZGVsKSByZXR1cm5cblxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB0aGlzLnJlcGxheVBlcnNpc3RBdHRyaWJ1dGVzKHthY3RvciwgbXV0YXRpb259KVxuXG4gICAgLy8gU3RhbGUgcmVwbGF5cyBuZXZlciBhcHBsaWVkIGFueXRoaW5nLCBzbyB0aGUgYXBwbHlSZXN1bHQtZHJpdmVuIGV4dGVuc2lvblxuICAgIC8vIGhvb2tzIG11c3Qgbm90IHJ1biBhZ2FpbnN0IHRoZSBkZWZhdWx0IG51bGwgc2tpcHBlZCByZXN1bHQuXG4gICAgaWYgKHRoaXMucGVyc2lzdEV4dHJhQXR0cmlidXRlcyAmJiBzaG91bGRBcHBseSkge1xuICAgICAgT2JqZWN0LmFzc2lnbihhdHRyaWJ1dGVzLCB0aGlzLnBlcnNpc3RFeHRyYUF0dHJpYnV0ZXMoe2FjdG9yLCBhcHBseVJlc3VsdCwgY29udGV4dCwgZXhpc3RpbmdTeW5jLCBtdXRhdGlvbiwgc2hvdWxkQXBwbHl9KSlcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wZXJzaXN0U2VyaWFsaXplZERhdGEgJiYgc2hvdWxkQXBwbHkpIHtcbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWREYXRhID0gdGhpcy5wZXJzaXN0U2VyaWFsaXplZERhdGEoe2FwcGx5UmVzdWx0LCBtdXRhdGlvbn0pXG5cbiAgICAgIGlmIChzZXJpYWxpemVkRGF0YSAhPT0gdW5kZWZpbmVkICYmIHNlcmlhbGl6ZWREYXRhICE9PSBudWxsKSB7XG4gICAgICAgIGF0dHJpYnV0ZXMuZGF0YSA9IHR5cGVvZiBzZXJpYWxpemVkRGF0YSA9PT0gXCJzdHJpbmdcIiA/IHNlcmlhbGl6ZWREYXRhIDogSlNPTi5zdHJpbmdpZnkoc2VyaWFsaXplZERhdGEpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmxpY3RTdHJhdGVneSAmJiBzaG91bGRBcHBseSAmJiBtdXRhdGlvbi5iYXNlVmVyc2lvbiAhPT0gdW5kZWZpbmVkICYmIGFwcGx5UmVzdWx0Py5yZWNvcmQpIHtcbiAgICAgIGNvbnN0IHB1YmxpY1BheWxvYWQgPSBkZWNvZGVSZXBsYXlQZXJzaXN0ZWREYXRhKGF0dHJpYnV0ZXMuZGF0YSkucGF5bG9hZFxuICAgICAgY29uc3QgYWNrbm93bGVkZ2VtZW50VmVyc2lvbiA9IG5vcm1hbGl6ZUNvbmZsaWN0VmFsdWUoYXBwbHlSZXN1bHQucmVjb3JkLnJlYWRBdHRyaWJ1dGUodGhpcy5jb25mbGljdFN0cmF0ZWd5LnZlcnNpb25BdHRyaWJ1dGUpKVxuXG4gICAgICBhdHRyaWJ1dGVzLmRhdGEgPSBzZXJpYWxpemVSZXBsYXlQZXJzaXN0ZWREYXRhKHtcbiAgICAgICAgYWNrbm93bGVkZ2VtZW50VmVyc2lvbixcbiAgICAgICAgY2xpZW50TXV0YXRpb25JZDogU3RyaW5nKG11dGF0aW9uLmNsaWVudE11dGF0aW9uSWQgfHwgbXV0YXRpb24uaWQpLFxuICAgICAgICBwYXlsb2FkOiBwdWJsaWNQYXlsb2FkLFxuICAgICAgICBwYXlsb2FkRmluZ2VycHJpbnQ6IHNoYTI1NkhleChtdXRhdGlvbi5zZXJpYWxpemVkRGF0YSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKGV4aXN0aW5nU3luYykge1xuICAgICAgY29uc3QgZXhpc3RpbmdDbGllbnRVcGRhdGVkQXQgPSB0aGlzLmV4aXN0aW5nUmVwbGF5U3luY0NsaWVudFVwZGF0ZWRBdChleGlzdGluZ1N5bmMpXG5cbiAgICAgIGlmIChleGlzdGluZ0NsaWVudFVwZGF0ZWRBdCAmJiBtdXRhdGlvbi5jbGllbnRVcGRhdGVkQXQgPD0gZXhpc3RpbmdDbGllbnRVcGRhdGVkQXQpIHJldHVyblxuICAgIH1cblxuICAgIGF3YWl0IHVwc2VydFN5bmNSb3coe2F0dHJpYnV0ZXMsIGV4aXN0aW5nU3luYywgc3luY01vZGVsOiB0aGlzLnN5bmNNb2RlbH0pXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBzeW5jLW1vZGVsIGF0dHJpYnV0ZXMgcGVyc2lzdGVkIGJ5IHRoZSBtb2RlbC1iYWNrZWQgZGVmYXVsdC5cbiAgICogQHBhcmFtIHt7YWN0b3I6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCBtdXRhdGlvbjogaW1wb3J0KFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCIpLlN5bmNSZXBsYXlNdXRhdGlvbn19IGFyZ3MgLSBBY3RvciBhbmQgbXV0YXRpb24uXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IFN5bmMgcm93IGF0dHJpYnV0ZXMuXG4gICAqL1xuICByZXBsYXlQZXJzaXN0QXR0cmlidXRlcyh7YWN0b3IsIG11dGF0aW9ufSkge1xuICAgIHJldHVybiB7XG4gICAgICBbdGhpcy5hY3RvckZvcmVpZ25LZXlDb2x1bW5dOiB0aGlzLnJlcGxheUFjdG9ySWQoYWN0b3IpLFxuICAgICAgY2xpZW50X3VwZGF0ZWRfYXQ6IG11dGF0aW9uLmNsaWVudFVwZGF0ZWRBdCxcbiAgICAgIGRhdGE6IG11dGF0aW9uLnNlcmlhbGl6ZWREYXRhLFxuICAgICAgcmVzb3VyY2VfaWQ6IG11dGF0aW9uLnJlc291cmNlSWQsXG4gICAgICByZXNvdXJjZV90eXBlOiBtdXRhdGlvbi5yZXNvdXJjZVR5cGUsXG4gICAgICBzeW5jX3R5cGU6IG11dGF0aW9uLnN5bmNUeXBlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2lkZSBlZmZlY3RzIGFmdGVyIGEgc3VjY2Vzc2Z1bCBtdXRhdGlvbiByZXBsYXkgYW5kIHBlcnNpc3RlbmNlLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBmYW5uaW5nIHRoZSBhcHBsaWVkIHJlc3VsdCBvdXQgdGhyb3VnaCB0aGUgY29uZmlndXJlZFxuICAgKiBkZWNsYXJhdGl2ZSBicm9hZGNhc3RzLlxuICAgKiBAcGFyYW0ge3thY3RvcjogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4sIGNvbnRleHQ6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PiwgZXhpc3RpbmdTeW5jOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgYXBwbHlSZXN1bHQ6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCBtdXRhdGlvbjogaW1wb3J0KFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCIpLlN5bmNSZXBsYXlNdXRhdGlvbiwgc2hvdWxkQXBwbHk6IGJvb2xlYW59fSBhcmdzIC0gUmVwbGF5IHNpZGUtZWZmZWN0IGFyZ3VtZW50cy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBhZnRlclJlcGxheU11dGF0aW9uKGFyZ3MpIHtcbiAgICBpZiAoIXRoaXMuYnJvYWRjYXN0cyB8fCAhdGhpcy5icm9hZGNhc3RlcikgcmV0dXJuXG4gICAgLy8gU3RhbGUgcmVwbGF5cyBuZXZlciBhcHBsaWVkIGFueXRoaW5nIC0gYnJvYWRjYXN0aW5nIHRoZWlyIHNraXBwZWQgcmVzdWx0c1xuICAgIC8vIHdvdWxkIGZhbiBvdXQgc3RhbGUgc2lkZSBlZmZlY3RzIChvciBjcmFzaCBvbiB0aGUgZGVmYXVsdCBudWxsIGFwcGx5UmVzdWx0KS5cbiAgICBpZiAoIWFyZ3Muc2hvdWxkQXBwbHkpIHJldHVyblxuXG4gICAgYXdhaXQgZGVsaXZlckRlY2xhcmVkQnJvYWRjYXN0cyh7YXJncywgYnJvYWRjYXN0ZXI6IHRoaXMuYnJvYWRjYXN0ZXIsIGJyb2FkY2FzdHM6IHRoaXMuYnJvYWRjYXN0c30pXG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZGV0ZXJtaW5pc3RpYywgTXlTUUwtc2FmZSBhZHZpc29yeS1sb2NrIG5hbWUgZm9yIGEgcm91dGVkIHJlcGxheVxuICogcmVzb3VyY2UgaWRlbnRpdHkuIFRoZSBmdWxsIGB7cmVzb3VyY2VUeXBlLCByZXNvdXJjZUlkfWAgaWRlbnRpdHkgaXMgaGFzaGVkXG4gKiB3aXRoIFNIQS0yNTYgYW5kIHRydW5jYXRlZCB0byAzMiBoZXggY2hhcmFjdGVycyBzbyB0aGUgZmluYWwgbmFtZSBzdGF5cyB3ZWxsXG4gKiB1bmRlciBNeVNRTC9NYXJpYURCJ3MgNjQtY2hhcmFjdGVyIGBHRVRfTE9DS2AgbGltaXQgd2hpbGUgcmVtYWluaW5nXG4gKiBjb2xsaXNpb24tcmVzaXN0YW50LlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBMb2NrIGlkZW50aXR5IGFyZ3MuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5yZXNvdXJjZUlkIC0gUmVzb3VyY2UgaWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5yZXNvdXJjZVR5cGUgLSBSZXNvdXJjZSB0eXBlLlxuICogQHJldHVybnMge3N0cmluZ30gLSBBZHZpc29yeSBsb2NrIG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzeW5jUmVwbGF5Q29uZmxpY3RMb2NrTmFtZSh7cmVzb3VyY2VJZCwgcmVzb3VyY2VUeXBlfSkge1xuICBjb25zdCBpZGVudGl0eSA9IHN0YWJsZUpzb25TdHJpbmdpZnkoe3Jlc291cmNlSWQsIHJlc291cmNlVHlwZX0pXG4gIGNvbnN0IGhhc2ggPSBzaGEyNTZIZXgoaWRlbnRpdHkpLnNsaWNlKDAsIDMyKVxuXG4gIHJldHVybiBgdnNyOiR7aGFzaH1gXG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHZlcnNpb24gdmFsdWUgZm9yIGRldGVybWluaXN0aWMgY29tcGFyaXNvbiBhbmQgdHJhbnNwb3J0LlxuICogT25seSB2ZXJzaW9uIHZhbHVlcyBwYXJ0aWNpcGF0ZSBpbiBzdGFibGUtSlNPTiBjb21wYXJpc29uIGFnYWluc3QgY2xpZW50XG4gKiBgYmFzZVZlcnNpb25gIHN0cmluZ3M7IHJlc291cmNlIHNlcmlhbGl6ZXIvYWNjZXNzb3IgcmVzdWx0cyBtdXN0IHN0YXkgcmF3IHNvXG4gKiB0aGUgZnJvbnRlbmQtbW9kZWwgdHJhbnNwb3J0IHNlcmlhbGl6ZXIgY2FuIHJldGFpbiBEYXRlIG1hcmtlcnMuXG4gKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSB2YWx1ZSAtIFJhdyB2ZXJzaW9uIHZhbHVlIGZyb20gYSBkYXRhYmFzZSByZWNvcmQuXG4gKiBAcmV0dXJucyB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IC0gTm9ybWFsaXplZCB2YWx1ZSAoRGF0ZSB2YWx1ZXMgYmVjb21lIElTTyBzdHJpbmdzKS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplQ29uZmxpY3RWYWx1ZSh2YWx1ZSkge1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gdmFsdWUudG9JU09TdHJpbmcoKVxuXG4gIHJldHVybiB2YWx1ZVxufVxuIl19
|