@aerokit/sdk 12.44.0
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/LICENSE +277 -0
- package/README.md +170 -0
- package/dist/cjs/bpm/deployer.js +57 -0
- package/dist/cjs/bpm/index.js +35 -0
- package/dist/cjs/bpm/process.js +636 -0
- package/dist/cjs/bpm/tasks.js +973 -0
- package/dist/cjs/bpm/values.js +82 -0
- package/dist/cjs/cache/cache.js +64 -0
- package/dist/cjs/cache/index.js +26 -0
- package/dist/cjs/cms/cmis.js +689 -0
- package/dist/cjs/cms/index.js +26 -0
- package/dist/cjs/component/decorators.js +126 -0
- package/dist/cjs/component/index.js +36 -0
- package/dist/cjs/core/configurations.js +110 -0
- package/dist/cjs/core/context.js +47 -0
- package/dist/cjs/core/env.js +45 -0
- package/dist/cjs/core/globals.js +54 -0
- package/dist/cjs/core/index.js +35 -0
- package/dist/cjs/db/dao.js +795 -0
- package/dist/cjs/db/database.js +904 -0
- package/dist/cjs/db/decorators.js +167 -0
- package/dist/cjs/db/index.js +72 -0
- package/dist/cjs/db/insert.js +51 -0
- package/dist/cjs/db/orm.js +245 -0
- package/dist/cjs/db/ormstatements.js +243 -0
- package/dist/cjs/db/procedure.js +112 -0
- package/dist/cjs/db/query.js +57 -0
- package/dist/cjs/db/repository.js +148 -0
- package/dist/cjs/db/sequence.js +59 -0
- package/dist/cjs/db/sql.js +516 -0
- package/dist/cjs/db/store.js +172 -0
- package/dist/cjs/db/translator.js +100 -0
- package/dist/cjs/db/update.js +43 -0
- package/dist/cjs/etcd/client.js +174 -0
- package/dist/cjs/etcd/index.js +26 -0
- package/dist/cjs/extensions/decorators.js +40 -0
- package/dist/cjs/extensions/extensions.js +108 -0
- package/dist/cjs/extensions/index.js +39 -0
- package/dist/cjs/git/client.js +277 -0
- package/dist/cjs/git/index.js +26 -0
- package/dist/cjs/http/client-async.js +224 -0
- package/dist/cjs/http/client.js +145 -0
- package/dist/cjs/http/decorators.js +76 -0
- package/dist/cjs/http/errors/ForbiddenError.js +41 -0
- package/dist/cjs/http/errors/ValidationError.js +41 -0
- package/dist/cjs/http/errors.js +26 -0
- package/dist/cjs/http/index.js +59 -0
- package/dist/cjs/http/request.js +281 -0
- package/dist/cjs/http/response.js +452 -0
- package/dist/cjs/http/rs/resource-common.js +32 -0
- package/dist/cjs/http/rs/resource-http-controller.js +306 -0
- package/dist/cjs/http/rs/resource-mappings.js +130 -0
- package/dist/cjs/http/rs/resource-method.js +218 -0
- package/dist/cjs/http/rs/resource.js +232 -0
- package/dist/cjs/http/rs.js +31 -0
- package/dist/cjs/http/session.js +124 -0
- package/dist/cjs/http/upload.js +144 -0
- package/dist/cjs/http/utils.js +106 -0
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/indexing/index.js +29 -0
- package/dist/cjs/indexing/searcher.js +70 -0
- package/dist/cjs/indexing/writer.js +45 -0
- package/dist/cjs/integrations/index.js +26 -0
- package/dist/cjs/integrations/integrations.js +55 -0
- package/dist/cjs/io/bytes.js +101 -0
- package/dist/cjs/io/files.js +344 -0
- package/dist/cjs/io/image.js +43 -0
- package/dist/cjs/io/index.js +38 -0
- package/dist/cjs/io/streams.js +243 -0
- package/dist/cjs/io/zip.js +251 -0
- package/dist/cjs/job/decorators.js +40 -0
- package/dist/cjs/job/index.js +39 -0
- package/dist/cjs/job/scheduler.js +347 -0
- package/dist/cjs/junit/index.js +18 -0
- package/dist/cjs/junit/junit.js +67 -0
- package/dist/cjs/kafka/consumer.js +70 -0
- package/dist/cjs/kafka/index.js +29 -0
- package/dist/cjs/kafka/producer.js +70 -0
- package/dist/cjs/log/index.js +26 -0
- package/dist/cjs/log/logging.js +174 -0
- package/dist/cjs/mail/client.js +153 -0
- package/dist/cjs/mail/index.js +26 -0
- package/dist/cjs/messaging/consumer.js +83 -0
- package/dist/cjs/messaging/decorators.js +40 -0
- package/dist/cjs/messaging/index.js +42 -0
- package/dist/cjs/messaging/producer.js +81 -0
- package/dist/cjs/mongodb/client.js +627 -0
- package/dist/cjs/mongodb/dao.js +390 -0
- package/dist/cjs/mongodb/index.js +36 -0
- package/dist/cjs/net/decorators.js +40 -0
- package/dist/cjs/net/index.js +42 -0
- package/dist/cjs/net/soap.js +228 -0
- package/dist/cjs/net/websockets.js +151 -0
- package/dist/cjs/net/wrappers/onClose.js +2 -0
- package/dist/cjs/net/wrappers/onError.js +2 -0
- package/dist/cjs/net/wrappers/onMessage.js +2 -0
- package/dist/cjs/net/wrappers/onOpen.js +2 -0
- package/dist/cjs/pdf/index.js +26 -0
- package/dist/cjs/pdf/pdf.js +160 -0
- package/dist/cjs/platform/command.js +47 -0
- package/dist/cjs/platform/engines.js +70 -0
- package/dist/cjs/platform/index.js +47 -0
- package/dist/cjs/platform/lifecycle.js +49 -0
- package/dist/cjs/platform/os.js +51 -0
- package/dist/cjs/platform/problems.js +127 -0
- package/dist/cjs/platform/registry.js +319 -0
- package/dist/cjs/platform/repository.js +498 -0
- package/dist/cjs/platform/workspace.js +574 -0
- package/dist/cjs/qldb/index.js +26 -0
- package/dist/cjs/qldb/qldb.js +24 -0
- package/dist/cjs/rabbitmq/consumer.js +50 -0
- package/dist/cjs/rabbitmq/index.js +29 -0
- package/dist/cjs/rabbitmq/producer.js +38 -0
- package/dist/cjs/redis/client.js +190 -0
- package/dist/cjs/redis/index.js +26 -0
- package/dist/cjs/security/decorators.js +48 -0
- package/dist/cjs/security/index.js +40 -0
- package/dist/cjs/security/oauth.js +75 -0
- package/dist/cjs/security/user.js +88 -0
- package/dist/cjs/template/engines.js +139 -0
- package/dist/cjs/template/index.js +26 -0
- package/dist/cjs/utils/alphanumeric.js +107 -0
- package/dist/cjs/utils/base64.js +104 -0
- package/dist/cjs/utils/converter.js +78 -0
- package/dist/cjs/utils/digest.js +167 -0
- package/dist/cjs/utils/escape.js +160 -0
- package/dist/cjs/utils/hex.js +104 -0
- package/dist/cjs/utils/index.js +68 -0
- package/dist/cjs/utils/jsonpath.js +489 -0
- package/dist/cjs/utils/qrcode.js +41 -0
- package/dist/cjs/utils/url.js +82 -0
- package/dist/cjs/utils/utf8.js +61 -0
- package/dist/cjs/utils/uuid.js +48 -0
- package/dist/cjs/utils/xml.js +57 -0
- package/dist/dts/bpm/deployer.d.ts +29 -0
- package/dist/dts/bpm/index.d.ts +8 -0
- package/dist/dts/bpm/process.d.ts +433 -0
- package/dist/dts/bpm/tasks.d.ts +2022 -0
- package/dist/dts/bpm/values.d.ts +38 -0
- package/dist/dts/cache/cache.d.ts +30 -0
- package/dist/dts/cache/index.d.ts +2 -0
- package/dist/dts/cms/cmis.d.ts +413 -0
- package/dist/dts/cms/index.d.ts +2 -0
- package/dist/dts/component/decorators.d.ts +52 -0
- package/dist/dts/component/index.d.ts +2 -0
- package/dist/dts/core/configurations.d.ts +65 -0
- package/dist/dts/core/context.d.ts +19 -0
- package/dist/dts/core/env.d.ts +23 -0
- package/dist/dts/core/globals.d.ts +30 -0
- package/dist/dts/core/index.d.ts +8 -0
- package/dist/dts/db/dao.d.ts +8 -0
- package/dist/dts/db/database.d.ts +507 -0
- package/dist/dts/db/decorators.d.ts +89 -0
- package/dist/dts/db/index.d.ts +25 -0
- package/dist/dts/db/insert.d.ts +32 -0
- package/dist/dts/db/orm.d.ts +44 -0
- package/dist/dts/db/ormstatements.d.ts +4 -0
- package/dist/dts/db/procedure.d.ts +25 -0
- package/dist/dts/db/query.d.ts +48 -0
- package/dist/dts/db/repository.d.ts +64 -0
- package/dist/dts/db/sequence.d.ts +34 -0
- package/dist/dts/db/sql.d.ts +267 -0
- package/dist/dts/db/store.d.ts +138 -0
- package/dist/dts/db/translator.d.ts +26 -0
- package/dist/dts/db/update.d.ts +21 -0
- package/dist/dts/etcd/client.d.ts +92 -0
- package/dist/dts/etcd/index.d.ts +2 -0
- package/dist/dts/extensions/decorators.d.ts +11 -0
- package/dist/dts/extensions/extensions.d.ts +41 -0
- package/dist/dts/extensions/index.d.ts +4 -0
- package/dist/dts/git/client.d.ts +478 -0
- package/dist/dts/git/index.d.ts +2 -0
- package/dist/dts/http/client-async.d.ts +158 -0
- package/dist/dts/http/client.d.ts +180 -0
- package/dist/dts/http/decorators.d.ts +11 -0
- package/dist/dts/http/errors/ForbiddenError.d.ts +20 -0
- package/dist/dts/http/errors/ValidationError.d.ts +20 -0
- package/dist/dts/http/errors.d.ts +2 -0
- package/dist/dts/http/index.d.ts +16 -0
- package/dist/dts/http/request.d.ts +158 -0
- package/dist/dts/http/response.d.ts +281 -0
- package/dist/dts/http/rs/resource-common.d.ts +11 -0
- package/dist/dts/http/rs/resource-http-controller.d.ts +43 -0
- package/dist/dts/http/rs/resource-mappings.d.ts +70 -0
- package/dist/dts/http/rs/resource-method.d.ts +206 -0
- package/dist/dts/http/rs/resource.d.ts +126 -0
- package/dist/dts/http/rs.d.ts +4 -0
- package/dist/dts/http/session.d.ts +81 -0
- package/dist/dts/http/upload.d.ts +100 -0
- package/dist/dts/http/utils.d.ts +54 -0
- package/dist/dts/index.d.ts +0 -0
- package/dist/dts/indexing/index.d.ts +4 -0
- package/dist/dts/indexing/searcher.d.ts +47 -0
- package/dist/dts/indexing/writer.d.ts +22 -0
- package/dist/dts/integrations/index.d.ts +2 -0
- package/dist/dts/integrations/integrations.d.ts +118 -0
- package/dist/dts/io/bytes.d.ts +56 -0
- package/dist/dts/io/files.d.ts +261 -0
- package/dist/dts/io/image.d.ts +22 -0
- package/dist/dts/io/index.d.ts +10 -0
- package/dist/dts/io/streams.d.ts +172 -0
- package/dist/dts/io/zip.d.ts +178 -0
- package/dist/dts/job/decorators.d.ts +11 -0
- package/dist/dts/job/index.d.ts +4 -0
- package/dist/dts/job/scheduler.d.ts +250 -0
- package/dist/dts/junit/index.d.ts +1 -0
- package/dist/dts/junit/junit.d.ts +50 -0
- package/dist/dts/kafka/consumer.d.ts +48 -0
- package/dist/dts/kafka/index.d.ts +4 -0
- package/dist/dts/kafka/producer.d.ts +50 -0
- package/dist/dts/log/index.d.ts +2 -0
- package/dist/dts/log/logging.d.ts +102 -0
- package/dist/dts/mail/client.d.ts +90 -0
- package/dist/dts/mail/index.d.ts +2 -0
- package/dist/dts/messaging/consumer.d.ts +61 -0
- package/dist/dts/messaging/decorators.d.ts +11 -0
- package/dist/dts/messaging/index.d.ts +6 -0
- package/dist/dts/messaging/producer.d.ts +59 -0
- package/dist/dts/mongodb/client.d.ts +367 -0
- package/dist/dts/mongodb/dao.d.ts +24 -0
- package/dist/dts/mongodb/index.d.ts +2 -0
- package/dist/dts/net/decorators.d.ts +11 -0
- package/dist/dts/net/index.d.ts +6 -0
- package/dist/dts/net/soap.d.ts +115 -0
- package/dist/dts/net/websockets.d.ts +100 -0
- package/dist/dts/net/wrappers/onClose.d.ts +0 -0
- package/dist/dts/net/wrappers/onError.d.ts +0 -0
- package/dist/dts/net/wrappers/onMessage.d.ts +0 -0
- package/dist/dts/net/wrappers/onOpen.d.ts +0 -0
- package/dist/dts/pdf/index.d.ts +2 -0
- package/dist/dts/pdf/pdf.d.ts +72 -0
- package/dist/dts/platform/command.d.ts +41 -0
- package/dist/dts/platform/engines.d.ts +35 -0
- package/dist/dts/platform/index.d.ts +16 -0
- package/dist/dts/platform/lifecycle.d.ts +22 -0
- package/dist/dts/platform/os.d.ts +23 -0
- package/dist/dts/platform/problems.d.ts +114 -0
- package/dist/dts/platform/registry.d.ts +227 -0
- package/dist/dts/platform/repository.d.ts +354 -0
- package/dist/dts/platform/workspace.d.ts +421 -0
- package/dist/dts/qldb/index.d.ts +2 -0
- package/dist/dts/qldb/qldb.d.ts +1 -0
- package/dist/dts/rabbitmq/consumer.d.ts +25 -0
- package/dist/dts/rabbitmq/index.d.ts +4 -0
- package/dist/dts/rabbitmq/producer.d.ts +15 -0
- package/dist/dts/redis/client.d.ts +134 -0
- package/dist/dts/redis/index.d.ts +2 -0
- package/dist/dts/security/decorators.d.ts +4 -0
- package/dist/dts/security/index.d.ts +5 -0
- package/dist/dts/security/oauth.d.ts +39 -0
- package/dist/dts/security/user.d.ts +51 -0
- package/dist/dts/template/engines.d.ts +98 -0
- package/dist/dts/template/index.d.ts +2 -0
- package/dist/dts/utils/alphanumeric.d.ts +39 -0
- package/dist/dts/utils/base64.d.ts +48 -0
- package/dist/dts/utils/converter.d.ts +44 -0
- package/dist/dts/utils/digest.d.ts +50 -0
- package/dist/dts/utils/escape.d.ts +110 -0
- package/dist/dts/utils/hex.d.ts +48 -0
- package/dist/dts/utils/index.d.ts +23 -0
- package/dist/dts/utils/jsonpath.d.ts +22 -0
- package/dist/dts/utils/qrcode.d.ts +16 -0
- package/dist/dts/utils/url.d.ts +50 -0
- package/dist/dts/utils/utf8.d.ts +33 -0
- package/dist/dts/utils/uuid.d.ts +21 -0
- package/dist/dts/utils/xml.d.ts +22 -0
- package/dist/esm/bpm/deployer.mjs +38 -0
- package/dist/esm/bpm/index.mjs +15 -0
- package/dist/esm/bpm/process.mjs +617 -0
- package/dist/esm/bpm/tasks.mjs +954 -0
- package/dist/esm/bpm/values.mjs +63 -0
- package/dist/esm/cache/cache.mjs +45 -0
- package/dist/esm/cache/index.mjs +6 -0
- package/dist/esm/cms/cmis.mjs +660 -0
- package/dist/esm/cms/index.mjs +6 -0
- package/dist/esm/component/decorators.mjs +107 -0
- package/dist/esm/component/index.mjs +6 -0
- package/dist/esm/core/configurations.mjs +91 -0
- package/dist/esm/core/context.mjs +28 -0
- package/dist/esm/core/env.mjs +26 -0
- package/dist/esm/core/globals.mjs +35 -0
- package/dist/esm/core/index.mjs +15 -0
- package/dist/esm/db/dao.mjs +775 -0
- package/dist/esm/db/database.mjs +885 -0
- package/dist/esm/db/decorators.mjs +148 -0
- package/dist/esm/db/index.mjs +42 -0
- package/dist/esm/db/insert.mjs +32 -0
- package/dist/esm/db/orm.mjs +225 -0
- package/dist/esm/db/ormstatements.mjs +223 -0
- package/dist/esm/db/procedure.mjs +93 -0
- package/dist/esm/db/query.mjs +38 -0
- package/dist/esm/db/repository.mjs +129 -0
- package/dist/esm/db/sequence.mjs +40 -0
- package/dist/esm/db/sql.mjs +497 -0
- package/dist/esm/db/store.mjs +153 -0
- package/dist/esm/db/translator.mjs +81 -0
- package/dist/esm/db/update.mjs +24 -0
- package/dist/esm/etcd/client.mjs +155 -0
- package/dist/esm/etcd/index.mjs +6 -0
- package/dist/esm/extensions/decorators.mjs +21 -0
- package/dist/esm/extensions/extensions.mjs +89 -0
- package/dist/esm/extensions/index.mjs +9 -0
- package/dist/esm/git/client.mjs +258 -0
- package/dist/esm/git/index.mjs +6 -0
- package/dist/esm/http/client-async.mjs +205 -0
- package/dist/esm/http/client.mjs +126 -0
- package/dist/esm/http/decorators.mjs +47 -0
- package/dist/esm/http/errors/ForbiddenError.mjs +22 -0
- package/dist/esm/http/errors/ValidationError.mjs +22 -0
- package/dist/esm/http/errors.mjs +7 -0
- package/dist/esm/http/index.mjs +29 -0
- package/dist/esm/http/request.mjs +262 -0
- package/dist/esm/http/response.mjs +433 -0
- package/dist/esm/http/rs/resource-common.mjs +13 -0
- package/dist/esm/http/rs/resource-http-controller.mjs +287 -0
- package/dist/esm/http/rs/resource-mappings.mjs +111 -0
- package/dist/esm/http/rs/resource-method.mjs +199 -0
- package/dist/esm/http/rs/resource.mjs +213 -0
- package/dist/esm/http/rs.mjs +12 -0
- package/dist/esm/http/session.mjs +105 -0
- package/dist/esm/http/upload.mjs +125 -0
- package/dist/esm/http/utils.mjs +87 -0
- package/dist/esm/index.mjs +1 -0
- package/dist/esm/indexing/index.mjs +9 -0
- package/dist/esm/indexing/searcher.mjs +51 -0
- package/dist/esm/indexing/writer.mjs +26 -0
- package/dist/esm/integrations/index.mjs +6 -0
- package/dist/esm/integrations/integrations.mjs +36 -0
- package/dist/esm/io/bytes.mjs +82 -0
- package/dist/esm/io/files.mjs +325 -0
- package/dist/esm/io/image.mjs +24 -0
- package/dist/esm/io/index.mjs +18 -0
- package/dist/esm/io/streams.mjs +224 -0
- package/dist/esm/io/zip.mjs +232 -0
- package/dist/esm/job/decorators.mjs +21 -0
- package/dist/esm/job/index.mjs +9 -0
- package/dist/esm/job/scheduler.mjs +328 -0
- package/dist/esm/junit/index.mjs +2 -0
- package/dist/esm/junit/junit.mjs +48 -0
- package/dist/esm/kafka/consumer.mjs +51 -0
- package/dist/esm/kafka/index.mjs +9 -0
- package/dist/esm/kafka/producer.mjs +51 -0
- package/dist/esm/log/index.mjs +6 -0
- package/dist/esm/log/logging.mjs +155 -0
- package/dist/esm/mail/client.mjs +134 -0
- package/dist/esm/mail/index.mjs +6 -0
- package/dist/esm/messaging/consumer.mjs +64 -0
- package/dist/esm/messaging/decorators.mjs +21 -0
- package/dist/esm/messaging/index.mjs +12 -0
- package/dist/esm/messaging/producer.mjs +62 -0
- package/dist/esm/mongodb/client.mjs +608 -0
- package/dist/esm/mongodb/dao.mjs +360 -0
- package/dist/esm/mongodb/index.mjs +7 -0
- package/dist/esm/net/decorators.mjs +21 -0
- package/dist/esm/net/index.mjs +12 -0
- package/dist/esm/net/soap.mjs +209 -0
- package/dist/esm/net/websockets.mjs +132 -0
- package/dist/esm/net/wrappers/onClose.mjs +2 -0
- package/dist/esm/net/wrappers/onError.mjs +2 -0
- package/dist/esm/net/wrappers/onMessage.mjs +2 -0
- package/dist/esm/net/wrappers/onOpen.mjs +2 -0
- package/dist/esm/pdf/index.mjs +6 -0
- package/dist/esm/pdf/pdf.mjs +141 -0
- package/dist/esm/platform/command.mjs +28 -0
- package/dist/esm/platform/engines.mjs +51 -0
- package/dist/esm/platform/index.mjs +27 -0
- package/dist/esm/platform/lifecycle.mjs +30 -0
- package/dist/esm/platform/os.mjs +32 -0
- package/dist/esm/platform/problems.mjs +108 -0
- package/dist/esm/platform/registry.mjs +300 -0
- package/dist/esm/platform/repository.mjs +479 -0
- package/dist/esm/platform/workspace.mjs +555 -0
- package/dist/esm/qldb/index.mjs +6 -0
- package/dist/esm/qldb/qldb.mjs +5 -0
- package/dist/esm/rabbitmq/consumer.mjs +31 -0
- package/dist/esm/rabbitmq/index.mjs +9 -0
- package/dist/esm/rabbitmq/producer.mjs +19 -0
- package/dist/esm/redis/client.mjs +171 -0
- package/dist/esm/redis/index.mjs +6 -0
- package/dist/esm/security/decorators.mjs +29 -0
- package/dist/esm/security/index.mjs +10 -0
- package/dist/esm/security/oauth.mjs +56 -0
- package/dist/esm/security/user.mjs +69 -0
- package/dist/esm/template/engines.mjs +120 -0
- package/dist/esm/template/index.mjs +6 -0
- package/dist/esm/utils/alphanumeric.mjs +88 -0
- package/dist/esm/utils/base64.mjs +85 -0
- package/dist/esm/utils/converter.mjs +59 -0
- package/dist/esm/utils/digest.mjs +148 -0
- package/dist/esm/utils/escape.mjs +141 -0
- package/dist/esm/utils/hex.mjs +85 -0
- package/dist/esm/utils/index.mjs +38 -0
- package/dist/esm/utils/jsonpath.mjs +470 -0
- package/dist/esm/utils/qrcode.mjs +22 -0
- package/dist/esm/utils/url.mjs +63 -0
- package/dist/esm/utils/utf8.mjs +42 -0
- package/dist/esm/utils/uuid.mjs +29 -0
- package/dist/esm/utils/xml.mjs +38 -0
- package/package.json +58 -0
|
@@ -0,0 +1,973 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
+
};
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (let key of __getOwnPropNames(from))
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
+
}
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
+
var tasks_exports = {};
|
|
19
|
+
__export(tasks_exports, {
|
|
20
|
+
DelegationState: () => DelegationState,
|
|
21
|
+
NullHandlingOnOrder: () => NullHandlingOnOrder,
|
|
22
|
+
TaskService: () => TaskService,
|
|
23
|
+
Tasks: () => Tasks
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(tasks_exports);
|
|
26
|
+
var import_io = require("@aerokit/sdk/io");
|
|
27
|
+
var import_values = require("@aerokit/sdk/bpm/values");
|
|
28
|
+
const BpmFacade = Java.type("org.eclipse.dirigible.components.api.bpm.BpmFacade");
|
|
29
|
+
class Tasks {
|
|
30
|
+
static list() {
|
|
31
|
+
const tasks = JSON.parse(BpmFacade.getTasks());
|
|
32
|
+
return tasks.map((e) => new TaskData(e));
|
|
33
|
+
}
|
|
34
|
+
static getVariable(taskId, variableName) {
|
|
35
|
+
return import_values.Values.parseValue(BpmFacade.getTaskVariable(taskId, variableName));
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Returns all variables. This will include all variables of parent scopes too.
|
|
39
|
+
*/
|
|
40
|
+
static getVariables(taskId) {
|
|
41
|
+
return import_values.Values.parseValuesMap(BpmFacade.getTaskVariables(taskId));
|
|
42
|
+
}
|
|
43
|
+
static setVariable(taskId, variableName, value) {
|
|
44
|
+
BpmFacade.setTaskVariable(taskId, variableName, import_values.Values.stringifyValue(value));
|
|
45
|
+
}
|
|
46
|
+
static setVariables(taskId, variables) {
|
|
47
|
+
BpmFacade.setTaskVariables(taskId, import_values.Values.stringifyValuesMap(variables));
|
|
48
|
+
}
|
|
49
|
+
static complete(taskId, variables = {}) {
|
|
50
|
+
BpmFacade.completeTask(taskId, JSON.stringify(variables));
|
|
51
|
+
}
|
|
52
|
+
static getTaskService() {
|
|
53
|
+
return new TaskService(BpmFacade.getBpmProviderFlowable().getTaskService());
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
class TaskService {
|
|
57
|
+
constructor(taskService) {
|
|
58
|
+
this.taskService = taskService;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Creates a new task that is not related to any process instance.
|
|
62
|
+
*
|
|
63
|
+
* The returned task is transient and must be saved with {@link #saveTask(Task)} 'manually'.
|
|
64
|
+
*/
|
|
65
|
+
newTask(taskId) {
|
|
66
|
+
if (this.isNotNull(taskId)) {
|
|
67
|
+
return this.taskService.newTask(taskId);
|
|
68
|
+
}
|
|
69
|
+
return this.taskService.newTask();
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Create a builder for the task
|
|
73
|
+
*
|
|
74
|
+
* @return task builder
|
|
75
|
+
*/
|
|
76
|
+
createTaskBuilder() {
|
|
77
|
+
return this.taskService.createTaskBuilder();
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Saves the given task to the persistent data store. If the task is already present in the persistent store, it is updated. After a new task has been saved, the task instance passed into this
|
|
81
|
+
* method is updated with the id of the newly created task.
|
|
82
|
+
*
|
|
83
|
+
* @param task
|
|
84
|
+
* the task, cannot be null.
|
|
85
|
+
*/
|
|
86
|
+
saveTask(task) {
|
|
87
|
+
this.taskService.saveTask(task);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Saves the given tasks to the persistent data store. If the tasks are already present in the persistent store, it is updated. After a new task has been saved, the task instance passed into this
|
|
91
|
+
* method is updated with the id of the newly created task.
|
|
92
|
+
*
|
|
93
|
+
* @param taskList the list of task instances, cannot be null.
|
|
94
|
+
*/
|
|
95
|
+
bulkSaveTasks(taskList) {
|
|
96
|
+
this.taskService.bulkSaveTasks(taskList);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Deletes the given task, not deleting historic information that is related to this task.
|
|
100
|
+
*
|
|
101
|
+
* @param taskId
|
|
102
|
+
* The id of the task that will be deleted, cannot be null. If no task exists with the given taskId, the operation is ignored.
|
|
103
|
+
* @param cascade
|
|
104
|
+
* If cascade is true, also the historic information related to this task is deleted.
|
|
105
|
+
* @throws FlowableObjectNotFoundException
|
|
106
|
+
* when the task with given id does not exist.
|
|
107
|
+
* @throws FlowableException
|
|
108
|
+
* when an error occurs while deleting the task or in case the task is part of a running process.
|
|
109
|
+
*/
|
|
110
|
+
deleteTask(taskId, cascade) {
|
|
111
|
+
if (this.isNotNull(cascade)) {
|
|
112
|
+
this.taskService.deleteTask(taskId, cascade);
|
|
113
|
+
} else {
|
|
114
|
+
this.taskService.deleteTask(taskId);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Deletes all tasks of the given collection, not deleting historic information that is related to these tasks.
|
|
119
|
+
*
|
|
120
|
+
* @param taskIds
|
|
121
|
+
* The id's of the tasks that will be deleted, cannot be null. All id's in the list that don't have an existing task will be ignored.
|
|
122
|
+
* @param cascade
|
|
123
|
+
* If cascade is true, also the historic information related to this task is deleted.
|
|
124
|
+
* @throws FlowableObjectNotFoundException
|
|
125
|
+
* when one of the task does not exist.
|
|
126
|
+
* @throws FlowableException
|
|
127
|
+
* when an error occurs while deleting the tasks or in case one of the tasks is part of a running process.
|
|
128
|
+
*/
|
|
129
|
+
deleteTasks(taskIds, cascade) {
|
|
130
|
+
if (this.isNotNull(cascade)) {
|
|
131
|
+
this.taskService.deleteTasks(taskIds, cascade);
|
|
132
|
+
} else {
|
|
133
|
+
this.taskService.deleteTasks(taskIds);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Deletes the given task, not deleting historic information that is related to this task..
|
|
138
|
+
*
|
|
139
|
+
* @param taskId
|
|
140
|
+
* The id of the task that will be deleted, cannot be null. If no task exists with the given taskId, the operation is ignored.
|
|
141
|
+
* @param deleteReason
|
|
142
|
+
* reason the task is deleted. Is recorded in history, if enabled.
|
|
143
|
+
* @throws FlowableObjectNotFoundException
|
|
144
|
+
* when the task with given id does not exist.
|
|
145
|
+
* @throws FlowableException
|
|
146
|
+
* when an error occurs while deleting the task or in case the task is part of a running process
|
|
147
|
+
*/
|
|
148
|
+
deleteTaskWithReason(taskId, deleteReason) {
|
|
149
|
+
this.taskService.deleteTask(taskId, deleteReason);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Deletes all tasks of the given collection, not deleting historic information that is related to these tasks.
|
|
153
|
+
*
|
|
154
|
+
* @param taskIds
|
|
155
|
+
* The id's of the tasks that will be deleted, cannot be null. All id's in the list that don't have an existing task will be ignored.
|
|
156
|
+
* @param deleteReason
|
|
157
|
+
* reason the task is deleted. Is recorded in history, if enabled.
|
|
158
|
+
* @throws FlowableObjectNotFoundException
|
|
159
|
+
* when one of the tasks does not exist.
|
|
160
|
+
* @throws FlowableException
|
|
161
|
+
* when an error occurs while deleting the tasks or in case one of the tasks is part of a running process.
|
|
162
|
+
*/
|
|
163
|
+
deleteTasksWithReason(taskIds, deleteReason) {
|
|
164
|
+
this.taskService.deleteTasks(taskIds, deleteReason);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Claim responsibility for a task: the given user is made assignee for the task. The difference with {@link #setAssignee(String, String)} is that here a check is done if the task already has a
|
|
168
|
+
* user assigned to it. No check is done whether the user is known by the identity component.
|
|
169
|
+
*
|
|
170
|
+
* @param taskId
|
|
171
|
+
* task to claim, cannot be null.
|
|
172
|
+
* @param userId
|
|
173
|
+
* user that claims the task. When userId is null the task is unclaimed, assigned to no one.
|
|
174
|
+
* @throws FlowableObjectNotFoundException
|
|
175
|
+
* when the task doesn't exist.
|
|
176
|
+
* @throws org.flowable.common.engine.api.FlowableTaskAlreadyClaimedException
|
|
177
|
+
* when the task is already claimed by another user
|
|
178
|
+
*/
|
|
179
|
+
claim(taskId, userId) {
|
|
180
|
+
this.taskService.claim(taskId, userId);
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* A shortcut to {@link #claim} with null user in order to unclaim the task
|
|
184
|
+
*
|
|
185
|
+
* @param taskId
|
|
186
|
+
* task to unclaim, cannot be null.
|
|
187
|
+
* @throws FlowableObjectNotFoundException
|
|
188
|
+
* when the task doesn't exist.
|
|
189
|
+
*/
|
|
190
|
+
unclaim(taskId) {
|
|
191
|
+
this.taskService.unclaim(taskId);
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Set the task state to in progress. No check is done whether the user is known by the identity component.
|
|
195
|
+
*
|
|
196
|
+
* @param taskId
|
|
197
|
+
* task to change the state, cannot be null.
|
|
198
|
+
* @param userId
|
|
199
|
+
* user that puts the task in progress.
|
|
200
|
+
* @throws FlowableObjectNotFoundException
|
|
201
|
+
* when the task doesn't exist.
|
|
202
|
+
*/
|
|
203
|
+
startProgress(taskId, userId) {
|
|
204
|
+
this.taskService.startProgress(taskId, userId);
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Suspends the task. No check is done whether the user is known by the identity component.
|
|
208
|
+
*
|
|
209
|
+
* @param taskId
|
|
210
|
+
* task to suspend, cannot be null.
|
|
211
|
+
* @param userId
|
|
212
|
+
* user that suspends the task.
|
|
213
|
+
* @throws FlowableObjectNotFoundException
|
|
214
|
+
* when the task doesn't exist.
|
|
215
|
+
*/
|
|
216
|
+
suspendTask(taskId, userId) {
|
|
217
|
+
this.taskService.suspendTask(taskId, userId);
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Activates the task. No check is done whether the user is known by the identity component.
|
|
221
|
+
*
|
|
222
|
+
* @param taskId
|
|
223
|
+
* task to activate, cannot be null.
|
|
224
|
+
* @param userId
|
|
225
|
+
* user that activates the task.
|
|
226
|
+
* @throws FlowableObjectNotFoundException
|
|
227
|
+
* when the task doesn't exist.
|
|
228
|
+
*/
|
|
229
|
+
activateTask(taskId, userId) {
|
|
230
|
+
this.taskService.activateTask(taskId, userId);
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Delegates the task to another user. This means that the assignee is set and the delegation state is set to {@link DelegationState#PENDING}. If no owner is set on the task, the owner is set to
|
|
234
|
+
* the current assignee of the task.
|
|
235
|
+
*
|
|
236
|
+
* @param taskId
|
|
237
|
+
* The id of the task that will be delegated.
|
|
238
|
+
* @param userId
|
|
239
|
+
* The id of the user that will be set as assignee.
|
|
240
|
+
* @throws FlowableObjectNotFoundException
|
|
241
|
+
* when no task exists with the given id.
|
|
242
|
+
*/
|
|
243
|
+
delegateTask(taskId, userId) {
|
|
244
|
+
this.taskService.delegateTask(taskId, userId);
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Marks that the assignee is done with this task and that it can be send back to the owner. Can only be called when this task is {@link DelegationState#PENDING} delegation. After this method
|
|
248
|
+
* returns, the {@link Task#getDelegationState() delegationState} is set to {@link DelegationState#RESOLVED}.
|
|
249
|
+
*
|
|
250
|
+
* @param taskId
|
|
251
|
+
* the id of the task to resolve, cannot be null.
|
|
252
|
+
* @param variables
|
|
253
|
+
* @param transientVariables
|
|
254
|
+
* @throws FlowableObjectNotFoundException
|
|
255
|
+
* when no task exists with the given id.
|
|
256
|
+
*/
|
|
257
|
+
resolveTask(taskId, variables, transientVariables) {
|
|
258
|
+
if (this.isNotNull(variables) && this.isNotNull(transientVariables)) {
|
|
259
|
+
this.taskService.resolveTask(taskId, variables, transientVariables);
|
|
260
|
+
} else if (this.isNotNull(variables)) {
|
|
261
|
+
this.taskService.resolveTask(taskId, variables);
|
|
262
|
+
} else {
|
|
263
|
+
this.taskService.resolveTask(taskId);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Called when the task is successfully executed.
|
|
268
|
+
*
|
|
269
|
+
* @param taskId
|
|
270
|
+
* the id of the task to complete, cannot be null.
|
|
271
|
+
* @param userId
|
|
272
|
+
* user that completes the task.
|
|
273
|
+
* @param variables
|
|
274
|
+
* task parameters. May be null or empty.
|
|
275
|
+
* @param transientVariables
|
|
276
|
+
* task parameters. May be null or empty.
|
|
277
|
+
* @param localScope
|
|
278
|
+
* If true, the provided variables will be stored task-local, instead of process instance wide (which is the default behaviour).
|
|
279
|
+
* @throws FlowableObjectNotFoundException
|
|
280
|
+
* when no task exists with the given id.
|
|
281
|
+
* @throws FlowableException
|
|
282
|
+
* when this task is {@link DelegationState#PENDING} delegation.
|
|
283
|
+
*/
|
|
284
|
+
complete(taskId, userId, variables, transientVariables, localScope) {
|
|
285
|
+
if (this.isNotNull(userId) && this.isNotNull(variables) && this.isNotNull(localScope)) {
|
|
286
|
+
this.taskService.complete(taskId, userId, variables, localScope);
|
|
287
|
+
} else if (this.isNotNull(variables) && this.isNotNull(localScope)) {
|
|
288
|
+
this.taskService.complete(taskId, variables, localScope);
|
|
289
|
+
} else if (this.isNotNull(userId) && this.isNotNull(variables) && this.isNotNull(transientVariables)) {
|
|
290
|
+
this.taskService.complete(taskId, userId, variables, transientVariables);
|
|
291
|
+
} else if (this.isNotNull(variables) && this.isNotNull(transientVariables)) {
|
|
292
|
+
this.taskService.complete(taskId, variables, transientVariables);
|
|
293
|
+
} else if (this.isNotNull(userId) && this.isNotNull(variables)) {
|
|
294
|
+
this.taskService.complete(taskId, userId, variables);
|
|
295
|
+
} else if (this.isNotNull(variables)) {
|
|
296
|
+
this.taskService.complete(taskId, variables);
|
|
297
|
+
} else if (this.isNotNull(userId)) {
|
|
298
|
+
this.taskService.complete(taskId, userId);
|
|
299
|
+
} else {
|
|
300
|
+
this.taskService.complete(taskId);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Called when the task is successfully executed, and the task form has been submitted.
|
|
305
|
+
*
|
|
306
|
+
* @param taskId
|
|
307
|
+
* the id of the task to complete, cannot be null.
|
|
308
|
+
* @param formDefinitionId
|
|
309
|
+
* the id of the form definition that is filled-in to complete the task, cannot be null.
|
|
310
|
+
* @param outcome
|
|
311
|
+
* the outcome of the completed form, can be null.
|
|
312
|
+
* @param variables
|
|
313
|
+
* values of the completed form. May be null or empty.
|
|
314
|
+
* @param userId
|
|
315
|
+
* user that completes the task.
|
|
316
|
+
* @param transientVariables
|
|
317
|
+
* additional transient values that need to added to the process instance transient variables. May be null or empty.
|
|
318
|
+
* @param localScope
|
|
319
|
+
* If true, the provided variables will be stored task-local, instead of process instance wide (which is the default for {@link #complete(String, Map)}).
|
|
320
|
+
* @throws FlowableObjectNotFoundException
|
|
321
|
+
* when no task exists with the given id.
|
|
322
|
+
*/
|
|
323
|
+
completeTaskWithForm(taskId, formDefinitionId, outcome, variables, userId, transientVariables, localScope) {
|
|
324
|
+
if (this.isNotNull(userId) && this.isNotNull(localScope)) {
|
|
325
|
+
this.taskService.completeTaskWithForm(taskId, formDefinitionId, outcome, userId, variables, localScope);
|
|
326
|
+
} else if (this.isNotNull(localScope)) {
|
|
327
|
+
this.taskService.completeTaskWithForm(taskId, formDefinitionId, outcome, variables, localScope);
|
|
328
|
+
} else if (this.isNotNull(userId) && this.isNotNull(transientVariables)) {
|
|
329
|
+
this.taskService.completeTaskWithForm(taskId, formDefinitionId, outcome, userId, variables, transientVariables);
|
|
330
|
+
} else if (this.isNotNull(transientVariables)) {
|
|
331
|
+
this.taskService.completeTaskWithForm(taskId, formDefinitionId, outcome, variables, transientVariables);
|
|
332
|
+
} else if (this.isNotNull(userId)) {
|
|
333
|
+
this.taskService.completeTaskWithForm(taskId, formDefinitionId, outcome, userId, variables);
|
|
334
|
+
} else {
|
|
335
|
+
this.taskService.completeTaskWithForm(taskId, formDefinitionId, outcome, variables);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Gets a Form model instance of the task form of a specific task
|
|
340
|
+
*
|
|
341
|
+
* @param taskId
|
|
342
|
+
* id of the task, cannot be null.
|
|
343
|
+
* @param ignoreVariables
|
|
344
|
+
* should the variables be ignored when fetching the form model?
|
|
345
|
+
* @throws FlowableObjectNotFoundException
|
|
346
|
+
* when the task or form definition doesn't exist.
|
|
347
|
+
*/
|
|
348
|
+
getTaskFormModel(taskId, ignoreVariables) {
|
|
349
|
+
if (this.isNotNull(ignoreVariables)) {
|
|
350
|
+
return this.taskService.getTaskFormModel(taskId, ignoreVariables);
|
|
351
|
+
} else {
|
|
352
|
+
return this.taskService.getTaskFormModel(taskId);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Changes the assignee of the given task to the given userId. No check is done whether the user is known by the identity component.
|
|
357
|
+
*
|
|
358
|
+
* @param taskId
|
|
359
|
+
* id of the task, cannot be null.
|
|
360
|
+
* @param userId
|
|
361
|
+
* id of the user to use as assignee.
|
|
362
|
+
* @throws FlowableObjectNotFoundException
|
|
363
|
+
* when the task or user doesn't exist.
|
|
364
|
+
*/
|
|
365
|
+
setAssignee(taskId, userId) {
|
|
366
|
+
this.taskService.setAssignee(taskId, userId);
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Transfers ownership of this task to another user. No check is done whether the user is known by the identity component.
|
|
370
|
+
*
|
|
371
|
+
* @param taskId
|
|
372
|
+
* id of the task, cannot be null.
|
|
373
|
+
* @param userId
|
|
374
|
+
* of the person that is receiving ownership.
|
|
375
|
+
* @throws FlowableObjectNotFoundException
|
|
376
|
+
* when the task or user doesn't exist.
|
|
377
|
+
*/
|
|
378
|
+
setOwner(taskId, userId) {
|
|
379
|
+
this.taskService.setOwner(taskId, userId);
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Retrieves the {@link IdentityLink}s associated with the given task. Such an {@link IdentityLink} informs how a certain identity (eg. group or user) is associated with a certain task (eg. as
|
|
383
|
+
* candidate, assignee, etc.)
|
|
384
|
+
*/
|
|
385
|
+
getIdentityLinksForTask(taskId) {
|
|
386
|
+
return this.taskService.getIdentityLinksForTask(taskId);
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Convenience shorthand for {@link #addUserIdentityLink(String, String, String)}; with type {@link IdentityLinkType#CANDIDATE}
|
|
390
|
+
*
|
|
391
|
+
* @param taskId
|
|
392
|
+
* id of the task, cannot be null.
|
|
393
|
+
* @param userId
|
|
394
|
+
* id of the user to use as candidate, cannot be null.
|
|
395
|
+
* @throws FlowableObjectNotFoundException
|
|
396
|
+
* when the task or user doesn't exist.
|
|
397
|
+
*/
|
|
398
|
+
addCandidateUser(taskId, userId) {
|
|
399
|
+
this.taskService.addCandidateUser(taskId, userId);
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* Convenience shorthand for {@link #addGroupIdentityLink(String, String, String)}; with type {@link IdentityLinkType#CANDIDATE}
|
|
403
|
+
*
|
|
404
|
+
* @param taskId
|
|
405
|
+
* id of the task, cannot be null.
|
|
406
|
+
* @param groupId
|
|
407
|
+
* id of the group to use as candidate, cannot be null.
|
|
408
|
+
* @throws FlowableObjectNotFoundException
|
|
409
|
+
* when the task or group doesn't exist.
|
|
410
|
+
*/
|
|
411
|
+
addCandidateGroup(taskId, groupId) {
|
|
412
|
+
this.taskService.addCandidateGroup(taskId, groupId);
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Involves a user with a task. The type of identity link is defined by the given identityLinkType.
|
|
416
|
+
*
|
|
417
|
+
* @param taskId
|
|
418
|
+
* id of the task, cannot be null.
|
|
419
|
+
* @param userId
|
|
420
|
+
* id of the user involve, cannot be null.
|
|
421
|
+
* @param identityLinkType
|
|
422
|
+
* type of identityLink, cannot be null (@see {@link IdentityLinkType}).
|
|
423
|
+
* @throws FlowableObjectNotFoundException
|
|
424
|
+
* when the task or user doesn't exist.
|
|
425
|
+
*/
|
|
426
|
+
addUserIdentityLink(taskId, userId, identityLinkType) {
|
|
427
|
+
this.taskService.addUserIdentityLink(taskId, userId, identityLinkType);
|
|
428
|
+
}
|
|
429
|
+
/**
|
|
430
|
+
* Involves a group with a task. The type of identityLink is defined by the given identityLink.
|
|
431
|
+
*
|
|
432
|
+
* @param taskId
|
|
433
|
+
* id of the task, cannot be null.
|
|
434
|
+
* @param groupId
|
|
435
|
+
* id of the group to involve, cannot be null.
|
|
436
|
+
* @param identityLinkType
|
|
437
|
+
* type of identity, cannot be null (@see {@link IdentityLinkType}).
|
|
438
|
+
* @throws FlowableObjectNotFoundException
|
|
439
|
+
* when the task or group doesn't exist.
|
|
440
|
+
*/
|
|
441
|
+
addGroupIdentityLink(taskId, groupId, identityLinkType) {
|
|
442
|
+
this.taskService.addGroupIdentityLink(taskId, groupId, identityLinkType);
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* Convenience shorthand for {@link #deleteUserIdentityLink(String, String, String)}; with type {@link IdentityLinkType#CANDIDATE}
|
|
446
|
+
*
|
|
447
|
+
* @param taskId
|
|
448
|
+
* id of the task, cannot be null.
|
|
449
|
+
* @param userId
|
|
450
|
+
* id of the user to use as candidate, cannot be null.
|
|
451
|
+
* @throws FlowableObjectNotFoundException
|
|
452
|
+
* when the task or user doesn't exist.
|
|
453
|
+
*/
|
|
454
|
+
deleteCandidateUser(taskId, userId) {
|
|
455
|
+
this.taskService.deleteCandidateUser(taskId, userId);
|
|
456
|
+
}
|
|
457
|
+
/**
|
|
458
|
+
* Convenience shorthand for {@link #deleteGroupIdentityLink(String, String, String)}; with type {@link IdentityLinkType#CANDIDATE}
|
|
459
|
+
*
|
|
460
|
+
* @param taskId
|
|
461
|
+
* id of the task, cannot be null.
|
|
462
|
+
* @param groupId
|
|
463
|
+
* id of the group to use as candidate, cannot be null.
|
|
464
|
+
* @throws FlowableObjectNotFoundException
|
|
465
|
+
* when the task or group doesn't exist.
|
|
466
|
+
*/
|
|
467
|
+
deleteCandidateGroup(taskId, groupId) {
|
|
468
|
+
this.taskService.deleteCandidateGroup(taskId, groupId);
|
|
469
|
+
}
|
|
470
|
+
/**
|
|
471
|
+
* Removes the association between a user and a task for the given identityLinkType.
|
|
472
|
+
*
|
|
473
|
+
* @param taskId
|
|
474
|
+
* id of the task, cannot be null.
|
|
475
|
+
* @param userId
|
|
476
|
+
* id of the user involve, cannot be null.
|
|
477
|
+
* @param identityLinkType
|
|
478
|
+
* type of identityLink, cannot be null (@see {@link IdentityLinkType}).
|
|
479
|
+
* @throws FlowableObjectNotFoundException
|
|
480
|
+
* when the task or user doesn't exist.
|
|
481
|
+
*/
|
|
482
|
+
deleteUserIdentityLink(taskId, userId, identityLinkType) {
|
|
483
|
+
this.taskService.deleteUserIdentityLink(taskId, userId, identityLinkType);
|
|
484
|
+
}
|
|
485
|
+
/**
|
|
486
|
+
* Removes the association between a group and a task for the given identityLinkType.
|
|
487
|
+
*
|
|
488
|
+
* @param taskId
|
|
489
|
+
* id of the task, cannot be null.
|
|
490
|
+
* @param groupId
|
|
491
|
+
* id of the group to involve, cannot be null.
|
|
492
|
+
* @param identityLinkType
|
|
493
|
+
* type of identity, cannot be null (@see {@link IdentityLinkType}).
|
|
494
|
+
* @throws FlowableObjectNotFoundException
|
|
495
|
+
* when the task or group doesn't exist.
|
|
496
|
+
*/
|
|
497
|
+
deleteGroupIdentityLink(taskId, groupId, identityLinkType) {
|
|
498
|
+
this.taskService.deleteGroupIdentityLink(taskId, groupId, identityLinkType);
|
|
499
|
+
}
|
|
500
|
+
/**
|
|
501
|
+
* Changes the priority of the task.
|
|
502
|
+
*
|
|
503
|
+
* Authorization: actual owner / business admin
|
|
504
|
+
*
|
|
505
|
+
* @param taskId
|
|
506
|
+
* id of the task, cannot be null.
|
|
507
|
+
* @param priority
|
|
508
|
+
* the new priority for the task.
|
|
509
|
+
* @throws FlowableObjectNotFoundException
|
|
510
|
+
* when the task doesn't exist.
|
|
511
|
+
*/
|
|
512
|
+
setPriority(taskId, priority) {
|
|
513
|
+
this.taskService.setPriority(taskId, priority);
|
|
514
|
+
}
|
|
515
|
+
/**
|
|
516
|
+
* Changes the due date of the task
|
|
517
|
+
*
|
|
518
|
+
* @param taskId
|
|
519
|
+
* id of the task, cannot be null.
|
|
520
|
+
* @param dueDate
|
|
521
|
+
* the new due date for the task
|
|
522
|
+
* @throws FlowableException
|
|
523
|
+
* when the task doesn't exist.
|
|
524
|
+
*/
|
|
525
|
+
setDueDate(taskId, dueDate) {
|
|
526
|
+
this.taskService.setDueDate(taskId, dueDate);
|
|
527
|
+
}
|
|
528
|
+
/**
|
|
529
|
+
* set variable on a task. If the variable is not already existing, it will be created in the most outer scope. This means the process instance in case this task is related to an execution.
|
|
530
|
+
*/
|
|
531
|
+
setVariable(taskId, variableName, value) {
|
|
532
|
+
this.taskService.setVariable(taskId, variableName, import_values.Values.stringifyValue(value));
|
|
533
|
+
}
|
|
534
|
+
/**
|
|
535
|
+
* set variables on a task. If the variable is not already existing, it will be created in the most outer scope. This means the process instance in case this task is related to an execution.
|
|
536
|
+
*/
|
|
537
|
+
setVariables(taskId, variables) {
|
|
538
|
+
this.taskService.setVariables(taskId, import_values.Values.stringifyValuesMap(variables));
|
|
539
|
+
}
|
|
540
|
+
/**
|
|
541
|
+
* set variable on a task. If the variable is not already existing, it will be created in the task.
|
|
542
|
+
*/
|
|
543
|
+
setVariableLocal(taskId, variableName, value) {
|
|
544
|
+
this.taskService.setVariableLocal(taskId, variableName, import_values.Values.stringifyValue(value));
|
|
545
|
+
}
|
|
546
|
+
/**
|
|
547
|
+
* set variables on a task. If the variable is not already existing, it will be created in the task.
|
|
548
|
+
*/
|
|
549
|
+
setVariablesLocal(taskId, variables) {
|
|
550
|
+
this.taskService.setVariablesLocal(taskId, import_values.Values.stringifyValuesMap(variables));
|
|
551
|
+
}
|
|
552
|
+
/**
|
|
553
|
+
* get a variables and search in the task scope and if available also the execution scopes.
|
|
554
|
+
*/
|
|
555
|
+
getVariable(taskId, variableName) {
|
|
556
|
+
return import_values.Values.parseValue(this.taskService.getVariable(taskId, variableName));
|
|
557
|
+
}
|
|
558
|
+
/**
|
|
559
|
+
* The variable. Searching for the variable is done in all scopes that are visible to the given task (including parent scopes). Returns null when no variable value is found with the given name.
|
|
560
|
+
*
|
|
561
|
+
* @param taskId
|
|
562
|
+
* id of task, cannot be null.
|
|
563
|
+
* @param variableName
|
|
564
|
+
* name of variable, cannot be null.
|
|
565
|
+
* @return the variable or null if the variable is undefined.
|
|
566
|
+
* @throws FlowableObjectNotFoundException
|
|
567
|
+
* when no execution is found for the given taskId.
|
|
568
|
+
*/
|
|
569
|
+
getVariableInstance(taskId, variableName) {
|
|
570
|
+
return this.taskService.getVariableInstance(taskId, variableName);
|
|
571
|
+
}
|
|
572
|
+
/**
|
|
573
|
+
* checks whether or not the task has a variable defined with the given name, in the task scope and if available also the execution scopes.
|
|
574
|
+
*/
|
|
575
|
+
hasVariable(taskId, variableName) {
|
|
576
|
+
return this.taskService.hasVariable(taskId, variableName);
|
|
577
|
+
}
|
|
578
|
+
/**
|
|
579
|
+
* checks whether or not the task has a variable defined with the given name.
|
|
580
|
+
*/
|
|
581
|
+
getVariableLocal(taskId, variableName) {
|
|
582
|
+
return import_values.Values.parseValue(this.taskService.getVariableLocal(taskId, variableName));
|
|
583
|
+
}
|
|
584
|
+
/**
|
|
585
|
+
* The variable for a task. Returns the variable when it is set for the task (and not searching parent scopes). Returns null when no variable is found with the given name.
|
|
586
|
+
*
|
|
587
|
+
* @param taskId
|
|
588
|
+
* id of task, cannot be null.
|
|
589
|
+
* @param variableName
|
|
590
|
+
* name of variable, cannot be null.
|
|
591
|
+
* @return the variable or null if the variable is undefined.
|
|
592
|
+
* @throws FlowableObjectNotFoundException
|
|
593
|
+
* when no task is found for the given taskId.
|
|
594
|
+
*/
|
|
595
|
+
getVariableInstanceLocal(taskId, variableName) {
|
|
596
|
+
return this.taskService.getVariableInstanceLocal(taskId, variableName);
|
|
597
|
+
}
|
|
598
|
+
/**
|
|
599
|
+
* checks whether or not the task has a variable defined with the given name, local task scope only.
|
|
600
|
+
*/
|
|
601
|
+
hasVariableLocal(taskId, variableName) {
|
|
602
|
+
return this.taskService.hasVariableLocal(taskId, variableName);
|
|
603
|
+
}
|
|
604
|
+
/**
|
|
605
|
+
* get all variables and search in the task scope and if available also the execution scopes. If you have many variables and you only need a few, consider using
|
|
606
|
+
* {@link #getVariables(String, Collection)} for better performance.
|
|
607
|
+
*/
|
|
608
|
+
getVariables(taskId, variableNames) {
|
|
609
|
+
if (this.isNotNull(variableNames)) {
|
|
610
|
+
return import_values.Values.parseValuesMap(this.taskService.getVariables(taskId, variableNames));
|
|
611
|
+
} else {
|
|
612
|
+
return import_values.Values.parseValuesMap(this.taskService.getVariables(taskId));
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
/**
|
|
616
|
+
* All variables visible from the given task scope (including parent scopes).
|
|
617
|
+
*
|
|
618
|
+
* @param taskId
|
|
619
|
+
* id of task, cannot be null.
|
|
620
|
+
* @param variableNames
|
|
621
|
+
* the collection of variable names that should be retrieved.
|
|
622
|
+
* @return the variable instances or an empty map if no such variables are found.
|
|
623
|
+
* @throws FlowableObjectNotFoundException
|
|
624
|
+
* when no task is found for the given taskId.
|
|
625
|
+
*/
|
|
626
|
+
getVariableInstances(taskId, variableNames) {
|
|
627
|
+
if (this.isNotNull(variableNames)) {
|
|
628
|
+
return this.taskService.getVariableInstances(taskId, variableNames);
|
|
629
|
+
} else {
|
|
630
|
+
return this.taskService.getVariableInstances(taskId);
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
/**
|
|
634
|
+
* get all variables and search only in the task scope. If you have many task local variables and you only need a few, consider using {@link #getVariablesLocal(String, Collection)} for better
|
|
635
|
+
* performance.
|
|
636
|
+
*/
|
|
637
|
+
getVariablesLocal(taskId, variableNames) {
|
|
638
|
+
if (this.isNotNull(variableNames)) {
|
|
639
|
+
return import_values.Values.parseValuesMap(this.taskService.getVariablesLocal(taskId, variableNames));
|
|
640
|
+
} else {
|
|
641
|
+
return import_values.Values.parseValuesMap(this.taskService.getVariablesLocal(taskId));
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
/** get all variables and search only in the task scope. */
|
|
645
|
+
getVariableInstancesLocalByTaskIds(taskIds) {
|
|
646
|
+
return this.taskService.getVariableInstancesLocalByTaskIds(taskIds);
|
|
647
|
+
}
|
|
648
|
+
/**
|
|
649
|
+
* All variable values that are defined in the task scope, without taking outer scopes into account. If you have many task local variables and you only need a few, consider using
|
|
650
|
+
* {@link #getVariableInstancesLocal(String, Collection)} for better performance.
|
|
651
|
+
*
|
|
652
|
+
* @param taskId
|
|
653
|
+
* id of task, cannot be null.
|
|
654
|
+
* @return the variables or an empty map if no such variables are found.
|
|
655
|
+
* @throws FlowableObjectNotFoundException
|
|
656
|
+
* when no task is found for the given taskId.
|
|
657
|
+
*/
|
|
658
|
+
getVariableInstancesLocal(taskId, variableNames) {
|
|
659
|
+
if (this.isNotNull(variableNames)) {
|
|
660
|
+
return this.taskService.getVariableInstancesLocal(taskId, variableNames);
|
|
661
|
+
} else {
|
|
662
|
+
return this.taskService.getVariableInstancesLocal(taskId);
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
/**
|
|
666
|
+
* Removes the variable from the task. When the variable does not exist, nothing happens.
|
|
667
|
+
*/
|
|
668
|
+
removeVariable(taskId, variableName) {
|
|
669
|
+
this.taskService.removeVariable(taskId, variableName);
|
|
670
|
+
}
|
|
671
|
+
/**
|
|
672
|
+
* Removes the variable from the task (not considering parent scopes). When the variable does not exist, nothing happens.
|
|
673
|
+
*/
|
|
674
|
+
removeVariableLocal(taskId, variableName) {
|
|
675
|
+
this.taskService.removeVariableLocal(taskId, variableName);
|
|
676
|
+
}
|
|
677
|
+
/**
|
|
678
|
+
* Removes all variables in the given collection from the task. Non existing variable names are simply ignored.
|
|
679
|
+
*/
|
|
680
|
+
removeVariables(taskId, variableNames) {
|
|
681
|
+
this.taskService.removeVariables(taskId, variableNames);
|
|
682
|
+
}
|
|
683
|
+
/**
|
|
684
|
+
* Removes all variables in the given collection from the task (not considering parent scopes). Non existing variable names are simply ignored.
|
|
685
|
+
*/
|
|
686
|
+
removeVariablesLocal(taskId, variableNames) {
|
|
687
|
+
this.taskService.removeVariablesLocal(taskId, variableNames);
|
|
688
|
+
}
|
|
689
|
+
/**
|
|
690
|
+
* All DataObjects visible from the given execution scope (including parent scopes).
|
|
691
|
+
*
|
|
692
|
+
* @param taskId
|
|
693
|
+
* id of task, cannot be null.
|
|
694
|
+
* @param dataObjectNames
|
|
695
|
+
* the collection of DataObject names that should be retrieved.
|
|
696
|
+
* @param locale
|
|
697
|
+
* locale the DataObject name and description should be returned in (if available).
|
|
698
|
+
* @param withLocalizationFallback
|
|
699
|
+
* When true localization will fallback to more general locales if the specified locale is not found.
|
|
700
|
+
* @return the DataObjects or an empty map if no such variables are found.
|
|
701
|
+
* @throws FlowableObjectNotFoundException
|
|
702
|
+
* when no task is found for the given taskId.
|
|
703
|
+
*/
|
|
704
|
+
getDataObjects(taskId, dataObjectNames, locale, withLocalizationFallback) {
|
|
705
|
+
if (this.isNotNull(dataObjectNames) && this.isNotNull(locale) && this.isNotNull(withLocalizationFallback)) {
|
|
706
|
+
return this.taskService.getDataObjects(taskId, dataObjectNames, locale, withLocalizationFallback);
|
|
707
|
+
} else if (this.isNotNull(dataObjectNames)) {
|
|
708
|
+
return this.taskService.getDataObjects(taskId, dataObjectNames);
|
|
709
|
+
} else if (this.isNotNull(locale) && this.isNotNull(withLocalizationFallback)) {
|
|
710
|
+
return this.taskService.getDataObjects(taskId, locale, withLocalizationFallback);
|
|
711
|
+
} else {
|
|
712
|
+
return this.taskService.getDataObjects(taskId);
|
|
713
|
+
}
|
|
714
|
+
}
|
|
715
|
+
/**
|
|
716
|
+
* The DataObject. Searching for the DataObject is done in all scopes that are visible to the given task (including parent scopes). Returns null when no DataObject value is found with the given
|
|
717
|
+
* name.
|
|
718
|
+
*
|
|
719
|
+
* @param taskId
|
|
720
|
+
* id of task, cannot be null.
|
|
721
|
+
* @param dataObject
|
|
722
|
+
* name of DataObject, cannot be null.
|
|
723
|
+
* @param locale
|
|
724
|
+
* locale the DataObject name and description should be returned in (if available).
|
|
725
|
+
* @param withLocalizationFallback
|
|
726
|
+
* When true localization will fallback to more general locales including the default locale of the JVM if the specified locale is not found.
|
|
727
|
+
* @return the DataObject or null if the variable is undefined.
|
|
728
|
+
* @throws FlowableObjectNotFoundException
|
|
729
|
+
* when no task is found for the given taskId.
|
|
730
|
+
*/
|
|
731
|
+
getDataObject(taskId, dataObject, locale, withLocalizationFallback) {
|
|
732
|
+
if (this.isNotNull(locale) && this.isNotNull(withLocalizationFallback)) {
|
|
733
|
+
return this.taskService.getDataObject(taskId, dataObject, locale, withLocalizationFallback);
|
|
734
|
+
} else {
|
|
735
|
+
return this.taskService.getDataObject(taskId, dataObject);
|
|
736
|
+
}
|
|
737
|
+
}
|
|
738
|
+
/** Add a comment to a task and/or process instance. */
|
|
739
|
+
addComment(taskId, processInstanceId, message, type) {
|
|
740
|
+
if (this.isNotNull(type)) {
|
|
741
|
+
return this.taskService.addComment(taskId, processInstanceId, type, message);
|
|
742
|
+
} else {
|
|
743
|
+
return this.taskService.addComment(taskId, processInstanceId, message);
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
/** Update a comment to a task and/or process instance. */
|
|
747
|
+
saveComment(comment) {
|
|
748
|
+
this.taskService.saveComment(comment);
|
|
749
|
+
}
|
|
750
|
+
/**
|
|
751
|
+
* Returns an individual comment with the given id. Returns null if no comment exists with the given id.
|
|
752
|
+
*/
|
|
753
|
+
getComment(commentId) {
|
|
754
|
+
return this.taskService.getComment(commentId);
|
|
755
|
+
}
|
|
756
|
+
/** Removes all comments from the provided task and/or process instance */
|
|
757
|
+
deleteComments(taskId, processInstanceId) {
|
|
758
|
+
this.taskService.deleteComments(taskId, processInstanceId);
|
|
759
|
+
}
|
|
760
|
+
/**
|
|
761
|
+
* Removes an individual comment with the given id.
|
|
762
|
+
*
|
|
763
|
+
* @throws FlowableObjectNotFoundException
|
|
764
|
+
* when no comment exists with the given id.
|
|
765
|
+
*/
|
|
766
|
+
deleteComment(commentId) {
|
|
767
|
+
this.taskService.deleteComment(commentId);
|
|
768
|
+
}
|
|
769
|
+
/** The comments related to the given task. */
|
|
770
|
+
getTaskComments(taskId, type) {
|
|
771
|
+
if (this.isNotNull(type)) {
|
|
772
|
+
return this.taskService.getTaskComments(taskId, type);
|
|
773
|
+
} else {
|
|
774
|
+
return this.taskService.getTaskComments(taskId);
|
|
775
|
+
}
|
|
776
|
+
}
|
|
777
|
+
/** All comments of a given type. */
|
|
778
|
+
getCommentsByType(type) {
|
|
779
|
+
return this.taskService.getCommentsByType(type);
|
|
780
|
+
}
|
|
781
|
+
/** The all events related to the given task. */
|
|
782
|
+
getTaskEvents(taskId) {
|
|
783
|
+
return this.taskService.getTaskEvents(taskId);
|
|
784
|
+
}
|
|
785
|
+
/**
|
|
786
|
+
* Returns an individual event with the given id. Returns null if no event exists with the given id.
|
|
787
|
+
*/
|
|
788
|
+
getEvent(eventId) {
|
|
789
|
+
return this.taskService.getEvent(eventId);
|
|
790
|
+
}
|
|
791
|
+
/** The comments related to the given process instance. */
|
|
792
|
+
getProcessInstanceComments(processInstanceId, type) {
|
|
793
|
+
if (this.isNotNull(type)) {
|
|
794
|
+
return this.taskService.getProcessInstanceComments(processInstanceId, type);
|
|
795
|
+
} else {
|
|
796
|
+
return this.taskService.getProcessInstanceComments(processInstanceId);
|
|
797
|
+
}
|
|
798
|
+
}
|
|
799
|
+
/**
|
|
800
|
+
* Add a new attachment to a task and/or a process instance and use an input stream to provide the content
|
|
801
|
+
*/
|
|
802
|
+
createAttachment(attachmentType, taskId, processInstanceId, attachmentName, attachmentDescription, content, url) {
|
|
803
|
+
if (this.isNotNull(url)) {
|
|
804
|
+
return this.taskService.createAttachment(attachmentType, taskId, processInstanceId, attachmentName, attachmentDescription, url);
|
|
805
|
+
} else {
|
|
806
|
+
return this.taskService.createAttachment(attachmentType, taskId, processInstanceId, attachmentName, attachmentDescription, import_io.Streams.createByteArrayInputStream(content));
|
|
807
|
+
}
|
|
808
|
+
}
|
|
809
|
+
/** Update the name and description of an attachment */
|
|
810
|
+
saveAttachment(attachment) {
|
|
811
|
+
this.taskService.saveAttachment(attachment);
|
|
812
|
+
}
|
|
813
|
+
/** Retrieve a particular attachment */
|
|
814
|
+
getAttachment(attachmentId) {
|
|
815
|
+
return this.taskService.getAttachment(attachmentId);
|
|
816
|
+
}
|
|
817
|
+
/** Retrieve stream content of a particular attachment */
|
|
818
|
+
getAttachmentContent(attachmentId) {
|
|
819
|
+
const content = this.taskService.getAttachmentContent(attachmentId);
|
|
820
|
+
const baos = import_io.Streams.createByteArrayOutputStream();
|
|
821
|
+
import_io.Streams.copyLarge(content, baos);
|
|
822
|
+
return baos.getBytes();
|
|
823
|
+
}
|
|
824
|
+
/** The list of attachments associated to a task */
|
|
825
|
+
getTaskAttachments(taskId) {
|
|
826
|
+
return this.taskService.getTaskAttachments(taskId);
|
|
827
|
+
}
|
|
828
|
+
/** The list of attachments associated to a process instance */
|
|
829
|
+
getProcessInstanceAttachments(processInstanceId) {
|
|
830
|
+
return this.taskService.getProcessInstanceAttachments(processInstanceId);
|
|
831
|
+
}
|
|
832
|
+
/** Delete an attachment */
|
|
833
|
+
deleteAttachment(attachmentId) {
|
|
834
|
+
this.taskService.deleteAttachment(attachmentId);
|
|
835
|
+
}
|
|
836
|
+
/** The list of subtasks for this parent task */
|
|
837
|
+
getSubTasks(parentTaskId) {
|
|
838
|
+
return this.taskService.getSubTasks(parentTaskId);
|
|
839
|
+
}
|
|
840
|
+
isNotNull(property) {
|
|
841
|
+
return property !== null && property !== void 0;
|
|
842
|
+
}
|
|
843
|
+
}
|
|
844
|
+
class TaskData {
|
|
845
|
+
constructor(data) {
|
|
846
|
+
this.data = data;
|
|
847
|
+
}
|
|
848
|
+
getId() {
|
|
849
|
+
return this.data.id ?? void 0;
|
|
850
|
+
}
|
|
851
|
+
getRevision() {
|
|
852
|
+
return this.data.revision;
|
|
853
|
+
}
|
|
854
|
+
getOwner() {
|
|
855
|
+
return this.data.owner ?? void 0;
|
|
856
|
+
}
|
|
857
|
+
getAssigneeUpdatedCount() {
|
|
858
|
+
return this.data.assigneeUpdatedCount;
|
|
859
|
+
}
|
|
860
|
+
getOriginalAssignee() {
|
|
861
|
+
return this.data.originalAssignee ?? void 0;
|
|
862
|
+
}
|
|
863
|
+
getAssignee() {
|
|
864
|
+
return this.data.assignee ?? void 0;
|
|
865
|
+
}
|
|
866
|
+
getDelegationState() {
|
|
867
|
+
return this.data.delegationState ?? void 0;
|
|
868
|
+
}
|
|
869
|
+
getParentTaskId() {
|
|
870
|
+
return this.data.parentTaskId ?? void 0;
|
|
871
|
+
}
|
|
872
|
+
getName() {
|
|
873
|
+
return this.data.name ?? void 0;
|
|
874
|
+
}
|
|
875
|
+
getLocalizedName() {
|
|
876
|
+
return this.data.localizedName ?? void 0;
|
|
877
|
+
}
|
|
878
|
+
getDescription() {
|
|
879
|
+
return this.data.description ?? void 0;
|
|
880
|
+
}
|
|
881
|
+
getLocalizedDescription() {
|
|
882
|
+
return this.data.localizedDescription ?? void 0;
|
|
883
|
+
}
|
|
884
|
+
getPriority() {
|
|
885
|
+
return this.data.priority;
|
|
886
|
+
}
|
|
887
|
+
getCreateTime() {
|
|
888
|
+
return this.data.createTime ?? void 0;
|
|
889
|
+
}
|
|
890
|
+
getDueDate() {
|
|
891
|
+
return this.data.dueDate ?? void 0;
|
|
892
|
+
}
|
|
893
|
+
getSuspensionState() {
|
|
894
|
+
return this.data.suspensionState ?? void 0;
|
|
895
|
+
}
|
|
896
|
+
getCategory() {
|
|
897
|
+
return this.data.category ?? void 0;
|
|
898
|
+
}
|
|
899
|
+
isIdentityLinksInitialized() {
|
|
900
|
+
return this.data.isIdentityLinksInitialized;
|
|
901
|
+
}
|
|
902
|
+
getExecutionId() {
|
|
903
|
+
return this.data.executionId ?? void 0;
|
|
904
|
+
}
|
|
905
|
+
getProcessInstanceId() {
|
|
906
|
+
return this.data.processInstanceId ?? void 0;
|
|
907
|
+
}
|
|
908
|
+
getProcessDefinitionId() {
|
|
909
|
+
return this.data.processDefinitionId ?? void 0;
|
|
910
|
+
}
|
|
911
|
+
getScopeId() {
|
|
912
|
+
return this.data.scopeId ?? void 0;
|
|
913
|
+
}
|
|
914
|
+
getSubScopeId() {
|
|
915
|
+
return this.data.subScopeId ?? void 0;
|
|
916
|
+
}
|
|
917
|
+
getScopeType() {
|
|
918
|
+
return this.data.scopeType ?? void 0;
|
|
919
|
+
}
|
|
920
|
+
getScopeDefinitionId() {
|
|
921
|
+
return this.data.scopeDefinitionId ?? void 0;
|
|
922
|
+
}
|
|
923
|
+
getTaskDefinitionKey() {
|
|
924
|
+
return this.data.taskDefinitionKey ?? void 0;
|
|
925
|
+
}
|
|
926
|
+
getFormKey() {
|
|
927
|
+
return this.data.formKey ?? void 0;
|
|
928
|
+
}
|
|
929
|
+
isDeleted() {
|
|
930
|
+
return this.data.isDeleted;
|
|
931
|
+
}
|
|
932
|
+
isCanceled() {
|
|
933
|
+
return this.data.isCanceled;
|
|
934
|
+
}
|
|
935
|
+
isCountEnabled() {
|
|
936
|
+
return this.data.isCountEnabled;
|
|
937
|
+
}
|
|
938
|
+
getVariableCount() {
|
|
939
|
+
return this.data.variableCount;
|
|
940
|
+
}
|
|
941
|
+
getIdentityLinkCount() {
|
|
942
|
+
return this.data.identityLinkCount;
|
|
943
|
+
}
|
|
944
|
+
getClaimTime() {
|
|
945
|
+
return this.data.claimTime ?? void 0;
|
|
946
|
+
}
|
|
947
|
+
getTenantId() {
|
|
948
|
+
return this.data.tenantId;
|
|
949
|
+
}
|
|
950
|
+
getEventName() {
|
|
951
|
+
return this.data.eventName ?? void 0;
|
|
952
|
+
}
|
|
953
|
+
getEventHandlerId() {
|
|
954
|
+
return this.data.eventHandlerId ?? void 0;
|
|
955
|
+
}
|
|
956
|
+
isForcedUpdate() {
|
|
957
|
+
return this.data.forcedUpdate;
|
|
958
|
+
}
|
|
959
|
+
}
|
|
960
|
+
var DelegationState = /* @__PURE__ */ ((DelegationState2) => {
|
|
961
|
+
DelegationState2[DelegationState2["PENDING"] = 0] = "PENDING";
|
|
962
|
+
DelegationState2[DelegationState2["RESOLVED"] = 1] = "RESOLVED";
|
|
963
|
+
return DelegationState2;
|
|
964
|
+
})(DelegationState || {});
|
|
965
|
+
var NullHandlingOnOrder = /* @__PURE__ */ ((NullHandlingOnOrder2) => {
|
|
966
|
+
NullHandlingOnOrder2[NullHandlingOnOrder2["NULLS_FIRST"] = 0] = "NULLS_FIRST";
|
|
967
|
+
NullHandlingOnOrder2[NullHandlingOnOrder2["NULLS_LAST"] = 1] = "NULLS_LAST";
|
|
968
|
+
return NullHandlingOnOrder2;
|
|
969
|
+
})(NullHandlingOnOrder || {});
|
|
970
|
+
if (typeof module !== "undefined") {
|
|
971
|
+
module.exports = Tasks;
|
|
972
|
+
}
|
|
973
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2JwbS90YXNrcy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBBUEkgVGFza3NcbiAqL1xuXG5pbXBvcnQgeyBTdHJlYW1zIH0gZnJvbSBcIkBhZXJva2l0L3Nkay9pb1wiO1xuaW1wb3J0IHsgVmFsdWVzIH0gZnJvbSBcIkBhZXJva2l0L3Nkay9icG0vdmFsdWVzXCI7XG5cbmNvbnN0IEJwbUZhY2FkZSA9IEphdmEudHlwZShcIm9yZy5lY2xpcHNlLmRpcmlnaWJsZS5jb21wb25lbnRzLmFwaS5icG0uQnBtRmFjYWRlXCIpO1xuXG5leHBvcnQgY2xhc3MgVGFza3Mge1xuXG5cdHB1YmxpYyBzdGF0aWMgbGlzdCgpOiBUYXNrRGF0YVtdIHtcblx0XHRjb25zdCB0YXNrczogYW55W10gPSBKU09OLnBhcnNlKEJwbUZhY2FkZS5nZXRUYXNrcygpKTtcblx0XHRyZXR1cm4gdGFza3MubWFwKGUgPT4gbmV3IFRhc2tEYXRhKGUpKTtcblx0fVxuXG5cdHB1YmxpYyBzdGF0aWMgZ2V0VmFyaWFibGUodGFza0lkOiBzdHJpbmcsIHZhcmlhYmxlTmFtZTogc3RyaW5nKTogYW55IHtcblx0XHRyZXR1cm4gVmFsdWVzLnBhcnNlVmFsdWUoQnBtRmFjYWRlLmdldFRhc2tWYXJpYWJsZSh0YXNrSWQsIHZhcmlhYmxlTmFtZSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYWxsIHZhcmlhYmxlcy4gVGhpcyB3aWxsIGluY2x1ZGUgYWxsIHZhcmlhYmxlcyBvZiBwYXJlbnQgc2NvcGVzIHRvby5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgZ2V0VmFyaWFibGVzKHRhc2tJZDogc3RyaW5nKTogTWFwPHN0cmluZywgYW55PiB7XG5cdFx0cmV0dXJuIFZhbHVlcy5wYXJzZVZhbHVlc01hcChCcG1GYWNhZGUuZ2V0VGFza1ZhcmlhYmxlcyh0YXNrSWQpKTtcblx0fVxuXG5cdHB1YmxpYyBzdGF0aWMgc2V0VmFyaWFibGUodGFza0lkOiBzdHJpbmcsIHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG5cdFx0QnBtRmFjYWRlLnNldFRhc2tWYXJpYWJsZSh0YXNrSWQsIHZhcmlhYmxlTmFtZSwgVmFsdWVzLnN0cmluZ2lmeVZhbHVlKHZhbHVlKSk7XG5cdH1cblxuXHRwdWJsaWMgc3RhdGljIHNldFZhcmlhYmxlcyh0YXNrSWQ6IHN0cmluZywgdmFyaWFibGVzOiBNYXA8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG5cdFx0QnBtRmFjYWRlLnNldFRhc2tWYXJpYWJsZXModGFza0lkLCBWYWx1ZXMuc3RyaW5naWZ5VmFsdWVzTWFwKHZhcmlhYmxlcykpO1xuXHR9XG5cblx0cHVibGljIHN0YXRpYyBjb21wbGV0ZSh0YXNrSWQ6IHN0cmluZywgdmFyaWFibGVzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge30pOiB2b2lkIHtcblx0XHRCcG1GYWNhZGUuY29tcGxldGVUYXNrKHRhc2tJZCwgSlNPTi5zdHJpbmdpZnkodmFyaWFibGVzKSk7XG5cdH1cblxuXHRwdWJsaWMgc3RhdGljIGdldFRhc2tTZXJ2aWNlKCk6IFRhc2tTZXJ2aWNlIHtcblx0XHRyZXR1cm4gbmV3IFRhc2tTZXJ2aWNlKEJwbUZhY2FkZS5nZXRCcG1Qcm92aWRlckZsb3dhYmxlKCkuZ2V0VGFza1NlcnZpY2UoKSk7XG5cdH1cbn1cblxuLyoqXG4gKiBTZXJ2aWNlIHdoaWNoIHByb3ZpZGVzIGFjY2VzcyB0byB7QGxpbmsgVGFza30gYW5kIGZvcm0gcmVsYXRlZCBvcGVyYXRpb25zLlxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIFRhc2tTZXJ2aWNlIHtcblxuXHRwcml2YXRlIHJlYWRvbmx5IHRhc2tTZXJ2aWNlOiBhbnk7XG5cblx0Y29uc3RydWN0b3IodGFza1NlcnZpY2U6IGFueSkge1xuXHRcdHRoaXMudGFza1NlcnZpY2UgPSB0YXNrU2VydmljZTtcblx0fVxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyB0YXNrIHRoYXQgaXMgbm90IHJlbGF0ZWQgdG8gYW55IHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqIFxuXHQgKiBUaGUgcmV0dXJuZWQgdGFzayBpcyB0cmFuc2llbnQgYW5kIG11c3QgYmUgc2F2ZWQgd2l0aCB7QGxpbmsgI3NhdmVUYXNrKFRhc2spfSAnbWFudWFsbHknLlxuXHQgKi9cblx0cHVibGljIG5ld1Rhc2sodGFza0lkPzogc3RyaW5nKTogVGFzayB7XG5cdFx0aWYgKHRoaXMuaXNOb3ROdWxsKHRhc2tJZCkpIHtcblx0XHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLm5ld1Rhc2sodGFza0lkKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMudGFza1NlcnZpY2UubmV3VGFzaygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSBhIGJ1aWxkZXIgZm9yIHRoZSB0YXNrXG5cdCAqIFxuXHQgKiBAcmV0dXJuIHRhc2sgYnVpbGRlclxuXHQgKi9cblx0cHVibGljIGNyZWF0ZVRhc2tCdWlsZGVyKCk6IFRhc2tCdWlsZGVyIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5jcmVhdGVUYXNrQnVpbGRlcigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNhdmVzIHRoZSBnaXZlbiB0YXNrIHRvIHRoZSBwZXJzaXN0ZW50IGRhdGEgc3RvcmUuIElmIHRoZSB0YXNrIGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgcGVyc2lzdGVudCBzdG9yZSwgaXQgaXMgdXBkYXRlZC4gQWZ0ZXIgYSBuZXcgdGFzayBoYXMgYmVlbiBzYXZlZCwgdGhlIHRhc2sgaW5zdGFuY2UgcGFzc2VkIGludG8gdGhpc1xuXHQgKiBtZXRob2QgaXMgdXBkYXRlZCB3aXRoIHRoZSBpZCBvZiB0aGUgbmV3bHkgY3JlYXRlZCB0YXNrLlxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tcblx0ICogICAgICAgICAgICB0aGUgdGFzaywgY2Fubm90IGJlIG51bGwuXG5cdCAqL1xuXHRwdWJsaWMgc2F2ZVRhc2sodGFzazogVGFzayk6IHZvaWQge1xuXHRcdHRoaXMudGFza1NlcnZpY2Uuc2F2ZVRhc2sodGFzayk7XG5cdH1cblxuXHQvKipcblx0ICogU2F2ZXMgdGhlIGdpdmVuIHRhc2tzIHRvIHRoZSBwZXJzaXN0ZW50IGRhdGEgc3RvcmUuIElmIHRoZSB0YXNrcyBhcmUgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBwZXJzaXN0ZW50IHN0b3JlLCBpdCBpcyB1cGRhdGVkLiBBZnRlciBhIG5ldyB0YXNrIGhhcyBiZWVuIHNhdmVkLCB0aGUgdGFzayBpbnN0YW5jZSBwYXNzZWQgaW50byB0aGlzXG5cdCAqIG1ldGhvZCBpcyB1cGRhdGVkIHdpdGggdGhlIGlkIG9mIHRoZSBuZXdseSBjcmVhdGVkIHRhc2suXG5cdCAqXG5cdCAqIEBwYXJhbSB0YXNrTGlzdCB0aGUgbGlzdCBvZiB0YXNrIGluc3RhbmNlcywgY2Fubm90IGJlIG51bGwuXG5cdCAqL1xuXHRwdWJsaWMgYnVsa1NhdmVUYXNrcyh0YXNrTGlzdDogVGFza1tdKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5idWxrU2F2ZVRhc2tzKHRhc2tMaXN0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWxldGVzIHRoZSBnaXZlbiB0YXNrLCBub3QgZGVsZXRpbmcgaGlzdG9yaWMgaW5mb3JtYXRpb24gdGhhdCBpcyByZWxhdGVkIHRvIHRoaXMgdGFzay5cblx0ICogXG5cdCAqIEBwYXJhbSB0YXNrSWRcblx0ICogICAgICAgICAgICBUaGUgaWQgb2YgdGhlIHRhc2sgdGhhdCB3aWxsIGJlIGRlbGV0ZWQsIGNhbm5vdCBiZSBudWxsLiBJZiBubyB0YXNrIGV4aXN0cyB3aXRoIHRoZSBnaXZlbiB0YXNrSWQsIHRoZSBvcGVyYXRpb24gaXMgaWdub3JlZC5cblx0ICogQHBhcmFtIGNhc2NhZGVcblx0ICogICAgICAgICAgICBJZiBjYXNjYWRlIGlzIHRydWUsIGFsc28gdGhlIGhpc3RvcmljIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhpcyB0YXNrIGlzIGRlbGV0ZWQuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIHRoZSB0YXNrIHdpdGggZ2l2ZW4gaWQgZG9lcyBub3QgZXhpc3QuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZGVsZXRpbmcgdGhlIHRhc2sgb3IgaW4gY2FzZSB0aGUgdGFzayBpcyBwYXJ0IG9mIGEgcnVubmluZyBwcm9jZXNzLlxuXHQgKi9cblx0cHVibGljIGRlbGV0ZVRhc2sodGFza0lkOiBzdHJpbmcsIGNhc2NhZGU/OiBib29sZWFuKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuaXNOb3ROdWxsKGNhc2NhZGUpKSB7XG5cdFx0XHR0aGlzLnRhc2tTZXJ2aWNlLmRlbGV0ZVRhc2sodGFza0lkLCBjYXNjYWRlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy50YXNrU2VydmljZS5kZWxldGVUYXNrKHRhc2tJZCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIERlbGV0ZXMgYWxsIHRhc2tzIG9mIHRoZSBnaXZlbiBjb2xsZWN0aW9uLCBub3QgZGVsZXRpbmcgaGlzdG9yaWMgaW5mb3JtYXRpb24gdGhhdCBpcyByZWxhdGVkIHRvIHRoZXNlIHRhc2tzLlxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tJZHNcblx0ICogICAgICAgICAgICBUaGUgaWQncyBvZiB0aGUgdGFza3MgdGhhdCB3aWxsIGJlIGRlbGV0ZWQsIGNhbm5vdCBiZSBudWxsLiBBbGwgaWQncyBpbiB0aGUgbGlzdCB0aGF0IGRvbid0IGhhdmUgYW4gZXhpc3RpbmcgdGFzayB3aWxsIGJlIGlnbm9yZWQuXG5cdCAqIEBwYXJhbSBjYXNjYWRlXG5cdCAqICAgICAgICAgICAgSWYgY2FzY2FkZSBpcyB0cnVlLCBhbHNvIHRoZSBoaXN0b3JpYyBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoaXMgdGFzayBpcyBkZWxldGVkLlxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlT2JqZWN0Tm90Rm91bmRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiBvbmUgb2YgdGhlIHRhc2sgZG9lcyBub3QgZXhpc3QuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZGVsZXRpbmcgdGhlIHRhc2tzIG9yIGluIGNhc2Ugb25lIG9mIHRoZSB0YXNrcyBpcyBwYXJ0IG9mIGEgcnVubmluZyBwcm9jZXNzLlxuXHQgKi9cblx0cHVibGljIGRlbGV0ZVRhc2tzKHRhc2tJZHM6IHN0cmluZ1tdLCBjYXNjYWRlPzogYm9vbGVhbik6IHZvaWQge1xuXHRcdGlmICh0aGlzLmlzTm90TnVsbChjYXNjYWRlKSkge1xuXHRcdFx0dGhpcy50YXNrU2VydmljZS5kZWxldGVUYXNrcyh0YXNrSWRzLCBjYXNjYWRlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy50YXNrU2VydmljZS5kZWxldGVUYXNrcyh0YXNrSWRzKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRGVsZXRlcyB0aGUgZ2l2ZW4gdGFzaywgbm90IGRlbGV0aW5nIGhpc3RvcmljIGluZm9ybWF0aW9uIHRoYXQgaXMgcmVsYXRlZCB0byB0aGlzIHRhc2suLlxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tJZFxuXHQgKiAgICAgICAgICAgIFRoZSBpZCBvZiB0aGUgdGFzayB0aGF0IHdpbGwgYmUgZGVsZXRlZCwgY2Fubm90IGJlIG51bGwuIElmIG5vIHRhc2sgZXhpc3RzIHdpdGggdGhlIGdpdmVuIHRhc2tJZCwgdGhlIG9wZXJhdGlvbiBpcyBpZ25vcmVkLlxuXHQgKiBAcGFyYW0gZGVsZXRlUmVhc29uXG5cdCAqICAgICAgICAgICAgcmVhc29uIHRoZSB0YXNrIGlzIGRlbGV0ZWQuIElzIHJlY29yZGVkIGluIGhpc3RvcnksIGlmIGVuYWJsZWQuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIHRoZSB0YXNrIHdpdGggZ2l2ZW4gaWQgZG9lcyBub3QgZXhpc3QuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZGVsZXRpbmcgdGhlIHRhc2sgb3IgaW4gY2FzZSB0aGUgdGFzayBpcyBwYXJ0IG9mIGEgcnVubmluZyBwcm9jZXNzXG5cdCAqL1xuXHRwdWJsaWMgZGVsZXRlVGFza1dpdGhSZWFzb24odGFza0lkOiBzdHJpbmcsIGRlbGV0ZVJlYXNvbjogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5kZWxldGVUYXNrKHRhc2tJZCwgZGVsZXRlUmVhc29uKVxuXHR9XG5cblx0LyoqXG5cdCAqIERlbGV0ZXMgYWxsIHRhc2tzIG9mIHRoZSBnaXZlbiBjb2xsZWN0aW9uLCBub3QgZGVsZXRpbmcgaGlzdG9yaWMgaW5mb3JtYXRpb24gdGhhdCBpcyByZWxhdGVkIHRvIHRoZXNlIHRhc2tzLlxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tJZHNcblx0ICogICAgICAgICAgICBUaGUgaWQncyBvZiB0aGUgdGFza3MgdGhhdCB3aWxsIGJlIGRlbGV0ZWQsIGNhbm5vdCBiZSBudWxsLiBBbGwgaWQncyBpbiB0aGUgbGlzdCB0aGF0IGRvbid0IGhhdmUgYW4gZXhpc3RpbmcgdGFzayB3aWxsIGJlIGlnbm9yZWQuXG5cdCAqIEBwYXJhbSBkZWxldGVSZWFzb25cblx0ICogICAgICAgICAgICByZWFzb24gdGhlIHRhc2sgaXMgZGVsZXRlZC4gSXMgcmVjb3JkZWQgaW4gaGlzdG9yeSwgaWYgZW5hYmxlZC5cblx0ICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIHdoZW4gb25lIG9mIHRoZSB0YXNrcyBkb2VzIG5vdCBleGlzdC5cblx0ICogQHRocm93cyBGbG93YWJsZUV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIGFuIGVycm9yIG9jY3VycyB3aGlsZSBkZWxldGluZyB0aGUgdGFza3Mgb3IgaW4gY2FzZSBvbmUgb2YgdGhlIHRhc2tzIGlzIHBhcnQgb2YgYSBydW5uaW5nIHByb2Nlc3MuXG5cdCAqL1xuXHRwdWJsaWMgZGVsZXRlVGFza3NXaXRoUmVhc29uKHRhc2tJZHM6IHN0cmluZ1tdLCBkZWxldGVSZWFzb246IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMudGFza1NlcnZpY2UuZGVsZXRlVGFza3ModGFza0lkcywgZGVsZXRlUmVhc29uKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDbGFpbSByZXNwb25zaWJpbGl0eSBmb3IgYSB0YXNrOiB0aGUgZ2l2ZW4gdXNlciBpcyBtYWRlIGFzc2lnbmVlIGZvciB0aGUgdGFzay4gVGhlIGRpZmZlcmVuY2Ugd2l0aCB7QGxpbmsgI3NldEFzc2lnbmVlKFN0cmluZywgU3RyaW5nKX0gaXMgdGhhdCBoZXJlIGEgY2hlY2sgaXMgZG9uZSBpZiB0aGUgdGFzayBhbHJlYWR5IGhhcyBhXG5cdCAqIHVzZXIgYXNzaWduZWQgdG8gaXQuIE5vIGNoZWNrIGlzIGRvbmUgd2hldGhlciB0aGUgdXNlciBpcyBrbm93biBieSB0aGUgaWRlbnRpdHkgY29tcG9uZW50LlxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tJZFxuXHQgKiAgICAgICAgICAgIHRhc2sgdG8gY2xhaW0sIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdXNlcklkXG5cdCAqICAgICAgICAgICAgdXNlciB0aGF0IGNsYWltcyB0aGUgdGFzay4gV2hlbiB1c2VySWQgaXMgbnVsbCB0aGUgdGFzayBpcyB1bmNsYWltZWQsIGFzc2lnbmVkIHRvIG5vIG9uZS5cblx0ICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIHdoZW4gdGhlIHRhc2sgZG9lc24ndCBleGlzdC5cblx0ICogQHRocm93cyBvcmcuZmxvd2FibGUuY29tbW9uLmVuZ2luZS5hcGkuRmxvd2FibGVUYXNrQWxyZWFkeUNsYWltZWRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBpcyBhbHJlYWR5IGNsYWltZWQgYnkgYW5vdGhlciB1c2VyXG5cdCAqL1xuXHRwdWJsaWMgY2xhaW0odGFza0lkOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5jbGFpbSh0YXNrSWQsIHVzZXJJZCk7XG5cdH1cblxuXHQvKipcblx0ICogQSBzaG9ydGN1dCB0byB7QGxpbmsgI2NsYWltfSB3aXRoIG51bGwgdXNlciBpbiBvcmRlciB0byB1bmNsYWltIHRoZSB0YXNrXG5cdCAqIFxuXHQgKiBAcGFyYW0gdGFza0lkXG5cdCAqICAgICAgICAgICAgdGFzayB0byB1bmNsYWltLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIHdoZW4gdGhlIHRhc2sgZG9lc24ndCBleGlzdC5cblx0ICovXG5cdHB1YmxpYyB1bmNsYWltKHRhc2tJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS51bmNsYWltKHRhc2tJZCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0IHRoZSB0YXNrIHN0YXRlIHRvIGluIHByb2dyZXNzLiBObyBjaGVjayBpcyBkb25lIHdoZXRoZXIgdGhlIHVzZXIgaXMga25vd24gYnkgdGhlIGlkZW50aXR5IGNvbXBvbmVudC5cblx0ICogXG5cdCAqIEBwYXJhbSB0YXNrSWRcblx0ICogICAgICAgICAgICB0YXNrIHRvIGNoYW5nZSB0aGUgc3RhdGUsIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdXNlcklkXG5cdCAqICAgICAgICAgICAgdXNlciB0aGF0IHB1dHMgdGhlIHRhc2sgaW4gcHJvZ3Jlc3MuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIHRoZSB0YXNrIGRvZXNuJ3QgZXhpc3QuXG5cdCAqL1xuXHRwdWJsaWMgc3RhcnRQcm9ncmVzcyh0YXNrSWQ6IHN0cmluZywgdXNlcklkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLnN0YXJ0UHJvZ3Jlc3ModGFza0lkLCB1c2VySWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFN1c3BlbmRzIHRoZSB0YXNrLiBObyBjaGVjayBpcyBkb25lIHdoZXRoZXIgdGhlIHVzZXIgaXMga25vd24gYnkgdGhlIGlkZW50aXR5IGNvbXBvbmVudC5cblx0ICogXG5cdCAqIEBwYXJhbSB0YXNrSWRcblx0ICogICAgICAgICAgICB0YXNrIHRvIHN1c3BlbmQsIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdXNlcklkXG5cdCAqICAgICAgICAgICAgdXNlciB0aGF0IHN1c3BlbmRzIHRoZSB0YXNrLlxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlT2JqZWN0Tm90Rm91bmRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBkb2Vzbid0IGV4aXN0LlxuXHQgKi9cblx0cHVibGljIHN1c3BlbmRUYXNrKHRhc2tJZDogc3RyaW5nLCB1c2VySWQ6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMudGFza1NlcnZpY2Uuc3VzcGVuZFRhc2sodGFza0lkLCB1c2VySWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFjdGl2YXRlcyB0aGUgdGFzay4gTm8gY2hlY2sgaXMgZG9uZSB3aGV0aGVyIHRoZSB1c2VyIGlzIGtub3duIGJ5IHRoZSBpZGVudGl0eSBjb21wb25lbnQuXG5cdCAqIFxuXHQgKiBAcGFyYW0gdGFza0lkXG5cdCAqICAgICAgICAgICAgdGFzayB0byBhY3RpdmF0ZSwgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSB1c2VySWRcblx0ICogICAgICAgICAgICB1c2VyIHRoYXQgYWN0aXZhdGVzIHRoZSB0YXNrLlxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlT2JqZWN0Tm90Rm91bmRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBkb2Vzbid0IGV4aXN0LlxuXHQgKi9cblx0cHVibGljIGFjdGl2YXRlVGFzayh0YXNrSWQ6IHN0cmluZywgdXNlcklkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLmFjdGl2YXRlVGFzayh0YXNrSWQsIHVzZXJJZCk7XG5cdH1cblxuXHQvKipcblx0ICogRGVsZWdhdGVzIHRoZSB0YXNrIHRvIGFub3RoZXIgdXNlci4gVGhpcyBtZWFucyB0aGF0IHRoZSBhc3NpZ25lZSBpcyBzZXQgYW5kIHRoZSBkZWxlZ2F0aW9uIHN0YXRlIGlzIHNldCB0byB7QGxpbmsgRGVsZWdhdGlvblN0YXRlI1BFTkRJTkd9LiBJZiBubyBvd25lciBpcyBzZXQgb24gdGhlIHRhc2ssIHRoZSBvd25lciBpcyBzZXQgdG9cblx0ICogdGhlIGN1cnJlbnQgYXNzaWduZWUgb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcGFyYW0gdGFza0lkXG5cdCAqICAgICAgICAgICAgVGhlIGlkIG9mIHRoZSB0YXNrIHRoYXQgd2lsbCBiZSBkZWxlZ2F0ZWQuXG5cdCAqIEBwYXJhbSB1c2VySWRcblx0ICogICAgICAgICAgICBUaGUgaWQgb2YgdGhlIHVzZXIgdGhhdCB3aWxsIGJlIHNldCBhcyBhc3NpZ25lZS5cblx0ICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIHdoZW4gbm8gdGFzayBleGlzdHMgd2l0aCB0aGUgZ2l2ZW4gaWQuXG5cdCAqL1xuXHRwdWJsaWMgZGVsZWdhdGVUYXNrKHRhc2tJZDogc3RyaW5nLCB1c2VySWQ6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMudGFza1NlcnZpY2UuZGVsZWdhdGVUYXNrKHRhc2tJZCwgdXNlcklkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNYXJrcyB0aGF0IHRoZSBhc3NpZ25lZSBpcyBkb25lIHdpdGggdGhpcyB0YXNrIGFuZCB0aGF0IGl0IGNhbiBiZSBzZW5kIGJhY2sgdG8gdGhlIG93bmVyLiBDYW4gb25seSBiZSBjYWxsZWQgd2hlbiB0aGlzIHRhc2sgaXMge0BsaW5rIERlbGVnYXRpb25TdGF0ZSNQRU5ESU5HfSBkZWxlZ2F0aW9uLiBBZnRlciB0aGlzIG1ldGhvZFxuXHQgKiByZXR1cm5zLCB0aGUge0BsaW5rIFRhc2sjZ2V0RGVsZWdhdGlvblN0YXRlKCkgZGVsZWdhdGlvblN0YXRlfSBpcyBzZXQgdG8ge0BsaW5rIERlbGVnYXRpb25TdGF0ZSNSRVNPTFZFRH0uXG5cdCAqIFxuXHQgKiBAcGFyYW0gdGFza0lkXG5cdCAqICAgICAgICAgICAgdGhlIGlkIG9mIHRoZSB0YXNrIHRvIHJlc29sdmUsIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVzXG5cdCAqIEBwYXJhbSB0cmFuc2llbnRWYXJpYWJsZXNcblx0ICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIHdoZW4gbm8gdGFzayBleGlzdHMgd2l0aCB0aGUgZ2l2ZW4gaWQuXG5cdCAqL1xuXHRwdWJsaWMgcmVzb2x2ZVRhc2sodGFza0lkOiBzdHJpbmcsIHZhcmlhYmxlcz86IE1hcDxzdHJpbmcsIGFueT4sIHRyYW5zaWVudFZhcmlhYmxlcz86IE1hcDxzdHJpbmcsIGFueT4pOiB2b2lkIHtcblx0XHRpZiAodGhpcy5pc05vdE51bGwodmFyaWFibGVzKSAmJiB0aGlzLmlzTm90TnVsbCh0cmFuc2llbnRWYXJpYWJsZXMpKSB7XG5cdFx0XHR0aGlzLnRhc2tTZXJ2aWNlLnJlc29sdmVUYXNrKHRhc2tJZCwgdmFyaWFibGVzLCB0cmFuc2llbnRWYXJpYWJsZXMpO1xuXHRcdH0gZWxzZSBpZiAodGhpcy5pc05vdE51bGwodmFyaWFibGVzKSkge1xuXHRcdFx0dGhpcy50YXNrU2VydmljZS5yZXNvbHZlVGFzayh0YXNrSWQsIHZhcmlhYmxlcyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMudGFza1NlcnZpY2UucmVzb2x2ZVRhc2sodGFza0lkKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbGVkIHdoZW4gdGhlIHRhc2sgaXMgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVkLlxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tJZFxuXHQgKiAgICAgICAgICAgIHRoZSBpZCBvZiB0aGUgdGFzayB0byBjb21wbGV0ZSwgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSB1c2VySWRcblx0ICogICAgICAgICAgICB1c2VyIHRoYXQgY29tcGxldGVzIHRoZSB0YXNrLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVzXG5cdCAqICAgICAgICAgICAgdGFzayBwYXJhbWV0ZXJzLiBNYXkgYmUgbnVsbCBvciBlbXB0eS5cblx0ICogQHBhcmFtIHRyYW5zaWVudFZhcmlhYmxlc1xuXHQgKiAgICAgICAgICAgIHRhc2sgcGFyYW1ldGVycy4gTWF5IGJlIG51bGwgb3IgZW1wdHkuXG5cdCAqIEBwYXJhbSBsb2NhbFNjb3BlXG5cdCAqICAgICAgICAgICAgSWYgdHJ1ZSwgdGhlIHByb3ZpZGVkIHZhcmlhYmxlcyB3aWxsIGJlIHN0b3JlZCB0YXNrLWxvY2FsLCBpbnN0ZWFkIG9mIHByb2Nlc3MgaW5zdGFuY2Ugd2lkZSAod2hpY2ggaXMgdGhlIGRlZmF1bHQgYmVoYXZpb3VyKS5cblx0ICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIHdoZW4gbm8gdGFzayBleGlzdHMgd2l0aCB0aGUgZ2l2ZW4gaWQuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiB0aGlzIHRhc2sgaXMge0BsaW5rIERlbGVnYXRpb25TdGF0ZSNQRU5ESU5HfSBkZWxlZ2F0aW9uLlxuXHQgKi9cblx0cHVibGljIGNvbXBsZXRlKHRhc2tJZDogc3RyaW5nLCB1c2VySWQ/OiBzdHJpbmcsIHZhcmlhYmxlcz86IE1hcDxzdHJpbmcsIGFueT4sIHRyYW5zaWVudFZhcmlhYmxlcz86IE1hcDxzdHJpbmcsIGFueT4sIGxvY2FsU2NvcGU/OiBib29sZWFuKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuaXNOb3ROdWxsKHVzZXJJZCkgJiYgdGhpcy5pc05vdE51bGwodmFyaWFibGVzKSAmJiB0aGlzLmlzTm90TnVsbChsb2NhbFNjb3BlKSkge1xuXHRcdFx0dGhpcy50YXNrU2VydmljZS5jb21wbGV0ZSh0YXNrSWQsIHVzZXJJZCwgdmFyaWFibGVzLCBsb2NhbFNjb3BlKTtcblx0XHR9IGVsc2UgaWYgKHRoaXMuaXNOb3ROdWxsKHZhcmlhYmxlcykgJiYgdGhpcy5pc05vdE51bGwobG9jYWxTY29wZSkpIHtcblx0XHRcdHRoaXMudGFza1NlcnZpY2UuY29tcGxldGUodGFza0lkLCB2YXJpYWJsZXMsIGxvY2FsU2NvcGUpO1xuXHRcdH0gZWxzZSBpZiAodGhpcy5pc05vdE51bGwodXNlcklkKSAmJiB0aGlzLmlzTm90TnVsbCh2YXJpYWJsZXMpICYmIHRoaXMuaXNOb3ROdWxsKHRyYW5zaWVudFZhcmlhYmxlcykpIHtcblx0XHRcdHRoaXMudGFza1NlcnZpY2UuY29tcGxldGUodGFza0lkLCB1c2VySWQsIHZhcmlhYmxlcywgdHJhbnNpZW50VmFyaWFibGVzKTtcblx0XHR9IGVsc2UgaWYgKHRoaXMuaXNOb3ROdWxsKHZhcmlhYmxlcykgJiYgdGhpcy5pc05vdE51bGwodHJhbnNpZW50VmFyaWFibGVzKSkge1xuXHRcdFx0dGhpcy50YXNrU2VydmljZS5jb21wbGV0ZSh0YXNrSWQsIHZhcmlhYmxlcywgdHJhbnNpZW50VmFyaWFibGVzKTtcblx0XHR9IGVsc2UgaWYgKHRoaXMuaXNOb3ROdWxsKHVzZXJJZCkgJiYgdGhpcy5pc05vdE51bGwodmFyaWFibGVzKSkge1xuXHRcdFx0dGhpcy50YXNrU2VydmljZS5jb21wbGV0ZSh0YXNrSWQsIHVzZXJJZCwgdmFyaWFibGVzKTtcblx0XHR9IGVsc2UgaWYgKHRoaXMuaXNOb3ROdWxsKHZhcmlhYmxlcykpIHtcblx0XHRcdHRoaXMudGFza1NlcnZpY2UuY29tcGxldGUodGFza0lkLCB2YXJpYWJsZXMpO1xuXHRcdH0gZWxzZSBpZiAodGhpcy5pc05vdE51bGwodXNlcklkKSkge1xuXHRcdFx0dGhpcy50YXNrU2VydmljZS5jb21wbGV0ZSh0YXNrSWQsIHVzZXJJZCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMudGFza1NlcnZpY2UuY29tcGxldGUodGFza0lkKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbGVkIHdoZW4gdGhlIHRhc2sgaXMgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVkLCBhbmQgdGhlIHRhc2sgZm9ybSBoYXMgYmVlbiBzdWJtaXR0ZWQuXG5cdCAqIFxuXHQgKiBAcGFyYW0gdGFza0lkXG5cdCAqICAgICAgICAgICAgdGhlIGlkIG9mIHRoZSB0YXNrIHRvIGNvbXBsZXRlLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIGZvcm1EZWZpbml0aW9uSWRcblx0ICogICAgICAgICAgICB0aGUgaWQgb2YgdGhlIGZvcm0gZGVmaW5pdGlvbiB0aGF0IGlzIGZpbGxlZC1pbiB0byBjb21wbGV0ZSB0aGUgdGFzaywgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSBvdXRjb21lXG5cdCAqICAgICAgICAgICAgdGhlIG91dGNvbWUgb2YgdGhlIGNvbXBsZXRlZCBmb3JtLCBjYW4gYmUgbnVsbC5cblx0ICogQHBhcmFtIHZhcmlhYmxlc1xuXHQgKiAgICAgICAgICAgIHZhbHVlcyBvZiB0aGUgY29tcGxldGVkIGZvcm0uIE1heSBiZSBudWxsIG9yIGVtcHR5LlxuXHQgKiBAcGFyYW0gdXNlcklkXG5cdCAqICAgICAgICAgICAgdXNlciB0aGF0IGNvbXBsZXRlcyB0aGUgdGFzay5cblx0ICogQHBhcmFtIHRyYW5zaWVudFZhcmlhYmxlc1xuXHQgKiAgICAgICAgICAgIGFkZGl0aW9uYWwgdHJhbnNpZW50IHZhbHVlcyB0aGF0IG5lZWQgdG8gYWRkZWQgdG8gdGhlIHByb2Nlc3MgaW5zdGFuY2UgdHJhbnNpZW50IHZhcmlhYmxlcy4gTWF5IGJlIG51bGwgb3IgZW1wdHkuXG5cdCAqIEBwYXJhbSBsb2NhbFNjb3BlXG5cdCAqICAgICAgICAgICAgSWYgdHJ1ZSwgdGhlIHByb3ZpZGVkIHZhcmlhYmxlcyB3aWxsIGJlIHN0b3JlZCB0YXNrLWxvY2FsLCBpbnN0ZWFkIG9mIHByb2Nlc3MgaW5zdGFuY2Ugd2lkZSAod2hpY2ggaXMgdGhlIGRlZmF1bHQgZm9yIHtAbGluayAjY29tcGxldGUoU3RyaW5nLCBNYXApfSkuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIG5vIHRhc2sgZXhpc3RzIHdpdGggdGhlIGdpdmVuIGlkLlxuXHQgKi9cblx0cHVibGljIGNvbXBsZXRlVGFza1dpdGhGb3JtKHRhc2tJZDogc3RyaW5nLCBmb3JtRGVmaW5pdGlvbklkOiBzdHJpbmcsIG91dGNvbWU6IHN0cmluZywgdmFyaWFibGVzOiBNYXA8U3RyaW5nLCBhbnk+LCB1c2VySWQ/OiBzdHJpbmcsIHRyYW5zaWVudFZhcmlhYmxlcz86IE1hcDxTdHJpbmcsIGFueT4sIGxvY2FsU2NvcGU/OiBib29sZWFuKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuaXNOb3ROdWxsKHVzZXJJZCkgJiYgdGhpcy5pc05vdE51bGwobG9jYWxTY29wZSkpIHtcblx0XHRcdHRoaXMudGFza1NlcnZpY2UuY29tcGxldGVUYXNrV2l0aEZvcm0odGFza0lkLCBmb3JtRGVmaW5pdGlvbklkLCBvdXRjb21lLCB1c2VySWQsIHZhcmlhYmxlcywgbG9jYWxTY29wZSk7XG5cdFx0fSBlbHNlIGlmICh0aGlzLmlzTm90TnVsbChsb2NhbFNjb3BlKSkge1xuXHRcdFx0dGhpcy50YXNrU2VydmljZS5jb21wbGV0ZVRhc2tXaXRoRm9ybSh0YXNrSWQsIGZvcm1EZWZpbml0aW9uSWQsIG91dGNvbWUsIHZhcmlhYmxlcywgbG9jYWxTY29wZSk7XG5cdFx0fSBlbHNlIGlmICh0aGlzLmlzTm90TnVsbCh1c2VySWQpICYmIHRoaXMuaXNOb3ROdWxsKHRyYW5zaWVudFZhcmlhYmxlcykpIHtcblx0XHRcdHRoaXMudGFza1NlcnZpY2UuY29tcGxldGVUYXNrV2l0aEZvcm0odGFza0lkLCBmb3JtRGVmaW5pdGlvbklkLCBvdXRjb21lLCB1c2VySWQsIHZhcmlhYmxlcywgdHJhbnNpZW50VmFyaWFibGVzKTtcblx0XHR9IGVsc2UgaWYgKHRoaXMuaXNOb3ROdWxsKHRyYW5zaWVudFZhcmlhYmxlcykpIHtcblx0XHRcdHRoaXMudGFza1NlcnZpY2UuY29tcGxldGVUYXNrV2l0aEZvcm0odGFza0lkLCBmb3JtRGVmaW5pdGlvbklkLCBvdXRjb21lLCB2YXJpYWJsZXMsIHRyYW5zaWVudFZhcmlhYmxlcyk7XG5cdFx0fSBlbHNlIGlmICh0aGlzLmlzTm90TnVsbCh1c2VySWQpKSB7XG5cdFx0XHR0aGlzLnRhc2tTZXJ2aWNlLmNvbXBsZXRlVGFza1dpdGhGb3JtKHRhc2tJZCwgZm9ybURlZmluaXRpb25JZCwgb3V0Y29tZSwgdXNlcklkLCB2YXJpYWJsZXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnRhc2tTZXJ2aWNlLmNvbXBsZXRlVGFza1dpdGhGb3JtKHRhc2tJZCwgZm9ybURlZmluaXRpb25JZCwgb3V0Y29tZSwgdmFyaWFibGVzKTtcblx0XHR9XG5cdH1cblx0LyoqXG5cdCAqIEdldHMgYSBGb3JtIG1vZGVsIGluc3RhbmNlIG9mIHRoZSB0YXNrIGZvcm0gb2YgYSBzcGVjaWZpYyB0YXNrXG5cdCAqIFxuXHQgKiBAcGFyYW0gdGFza0lkXG5cdCAqICAgICAgICAgICAgaWQgb2YgdGhlIHRhc2ssIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gaWdub3JlVmFyaWFibGVzXG5cdCAqICAgICAgICAgICAgc2hvdWxkIHRoZSB2YXJpYWJsZXMgYmUgaWdub3JlZCB3aGVuIGZldGNoaW5nIHRoZSBmb3JtIG1vZGVsP1xuXHQgKiBAdGhyb3dzIEZsb3dhYmxlT2JqZWN0Tm90Rm91bmRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBvciBmb3JtIGRlZmluaXRpb24gZG9lc24ndCBleGlzdC5cblx0ICovXG5cdHB1YmxpYyBnZXRUYXNrRm9ybU1vZGVsKHRhc2tJZDogc3RyaW5nLCBpZ25vcmVWYXJpYWJsZXM/OiBib29sZWFuKTogRm9ybUluZm8ge1xuXHRcdGlmICh0aGlzLmlzTm90TnVsbChpZ25vcmVWYXJpYWJsZXMpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXRUYXNrRm9ybU1vZGVsKHRhc2tJZCwgaWdub3JlVmFyaWFibGVzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMudGFza1NlcnZpY2UuZ2V0VGFza0Zvcm1Nb2RlbCh0YXNrSWQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDaGFuZ2VzIHRoZSBhc3NpZ25lZSBvZiB0aGUgZ2l2ZW4gdGFzayB0byB0aGUgZ2l2ZW4gdXNlcklkLiBObyBjaGVjayBpcyBkb25lIHdoZXRoZXIgdGhlIHVzZXIgaXMga25vd24gYnkgdGhlIGlkZW50aXR5IGNvbXBvbmVudC5cblx0ICogXG5cdCAqIEBwYXJhbSB0YXNrSWRcblx0ICogICAgICAgICAgICBpZCBvZiB0aGUgdGFzaywgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSB1c2VySWRcblx0ICogICAgICAgICAgICBpZCBvZiB0aGUgdXNlciB0byB1c2UgYXMgYXNzaWduZWUuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIHRoZSB0YXNrIG9yIHVzZXIgZG9lc24ndCBleGlzdC5cblx0ICovXG5cdHB1YmxpYyBzZXRBc3NpZ25lZSh0YXNrSWQ6IHN0cmluZywgdXNlcklkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLnNldEFzc2lnbmVlKHRhc2tJZCwgdXNlcklkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUcmFuc2ZlcnMgb3duZXJzaGlwIG9mIHRoaXMgdGFzayB0byBhbm90aGVyIHVzZXIuIE5vIGNoZWNrIGlzIGRvbmUgd2hldGhlciB0aGUgdXNlciBpcyBrbm93biBieSB0aGUgaWRlbnRpdHkgY29tcG9uZW50LlxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tJZFxuXHQgKiAgICAgICAgICAgIGlkIG9mIHRoZSB0YXNrLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHVzZXJJZFxuXHQgKiAgICAgICAgICAgIG9mIHRoZSBwZXJzb24gdGhhdCBpcyByZWNlaXZpbmcgb3duZXJzaGlwLlxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlT2JqZWN0Tm90Rm91bmRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBvciB1c2VyIGRvZXNuJ3QgZXhpc3QuXG5cdCAqL1xuXHRwdWJsaWMgc2V0T3duZXIodGFza0lkOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5zZXRPd25lcih0YXNrSWQsIHVzZXJJZCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSB7QGxpbmsgSWRlbnRpdHlMaW5rfXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiB0YXNrLiBTdWNoIGFuIHtAbGluayBJZGVudGl0eUxpbmt9IGluZm9ybXMgaG93IGEgY2VydGFpbiBpZGVudGl0eSAoZWcuIGdyb3VwIG9yIHVzZXIpIGlzIGFzc29jaWF0ZWQgd2l0aCBhIGNlcnRhaW4gdGFzayAoZWcuIGFzXG5cdCAqIGNhbmRpZGF0ZSwgYXNzaWduZWUsIGV0Yy4pXG5cdCAqL1xuXHRwdWJsaWMgZ2V0SWRlbnRpdHlMaW5rc0ZvclRhc2sodGFza0lkOiBzdHJpbmcpOiBJZGVudGl0eUxpbmtbXSB7XG5cdFx0cmV0dXJuIHRoaXMudGFza1NlcnZpY2UuZ2V0SWRlbnRpdHlMaW5rc0ZvclRhc2sodGFza0lkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZW5pZW5jZSBzaG9ydGhhbmQgZm9yIHtAbGluayAjYWRkVXNlcklkZW50aXR5TGluayhTdHJpbmcsIFN0cmluZywgU3RyaW5nKX07IHdpdGggdHlwZSB7QGxpbmsgSWRlbnRpdHlMaW5rVHlwZSNDQU5ESURBVEV9XG5cdCAqIFxuXHQgKiBAcGFyYW0gdGFza0lkXG5cdCAqICAgICAgICAgICAgaWQgb2YgdGhlIHRhc2ssIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdXNlcklkXG5cdCAqICAgICAgICAgICAgaWQgb2YgdGhlIHVzZXIgdG8gdXNlIGFzIGNhbmRpZGF0ZSwgY2Fubm90IGJlIG51bGwuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIHRoZSB0YXNrIG9yIHVzZXIgZG9lc24ndCBleGlzdC5cblx0ICovXG5cdHB1YmxpYyBhZGRDYW5kaWRhdGVVc2VyKHRhc2tJZDogc3RyaW5nLCB1c2VySWQ6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMudGFza1NlcnZpY2UuYWRkQ2FuZGlkYXRlVXNlcih0YXNrSWQsIHVzZXJJZCk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVuaWVuY2Ugc2hvcnRoYW5kIGZvciB7QGxpbmsgI2FkZEdyb3VwSWRlbnRpdHlMaW5rKFN0cmluZywgU3RyaW5nLCBTdHJpbmcpfTsgd2l0aCB0eXBlIHtAbGluayBJZGVudGl0eUxpbmtUeXBlI0NBTkRJREFURX1cblx0ICogXG5cdCAqIEBwYXJhbSB0YXNrSWRcblx0ICogICAgICAgICAgICBpZCBvZiB0aGUgdGFzaywgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSBncm91cElkXG5cdCAqICAgICAgICAgICAgaWQgb2YgdGhlIGdyb3VwIHRvIHVzZSBhcyBjYW5kaWRhdGUsIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlT2JqZWN0Tm90Rm91bmRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBvciBncm91cCBkb2Vzbid0IGV4aXN0LlxuXHQgKi9cblx0cHVibGljIGFkZENhbmRpZGF0ZUdyb3VwKHRhc2tJZDogc3RyaW5nLCBncm91cElkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLmFkZENhbmRpZGF0ZUdyb3VwKHRhc2tJZCwgZ3JvdXBJZCk7XG5cdH1cblxuXHQvKipcblx0ICogSW52b2x2ZXMgYSB1c2VyIHdpdGggYSB0YXNrLiBUaGUgdHlwZSBvZiBpZGVudGl0eSBsaW5rIGlzIGRlZmluZWQgYnkgdGhlIGdpdmVuIGlkZW50aXR5TGlua1R5cGUuXG5cdCAqIFxuXHQgKiBAcGFyYW0gdGFza0lkXG5cdCAqICAgICAgICAgICAgaWQgb2YgdGhlIHRhc2ssIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdXNlcklkXG5cdCAqICAgICAgICAgICAgaWQgb2YgdGhlIHVzZXIgaW52b2x2ZSwgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSBpZGVudGl0eUxpbmtUeXBlXG5cdCAqICAgICAgICAgICAgdHlwZSBvZiBpZGVudGl0eUxpbmssIGNhbm5vdCBiZSBudWxsIChAc2VlIHtAbGluayBJZGVudGl0eUxpbmtUeXBlfSkuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIHRoZSB0YXNrIG9yIHVzZXIgZG9lc24ndCBleGlzdC5cblx0ICovXG5cdHB1YmxpYyBhZGRVc2VySWRlbnRpdHlMaW5rKHRhc2tJZDogc3RyaW5nLCB1c2VySWQ6IHN0cmluZywgaWRlbnRpdHlMaW5rVHlwZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5hZGRVc2VySWRlbnRpdHlMaW5rKHRhc2tJZCwgdXNlcklkLCBpZGVudGl0eUxpbmtUeXBlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbnZvbHZlcyBhIGdyb3VwIHdpdGggYSB0YXNrLiBUaGUgdHlwZSBvZiBpZGVudGl0eUxpbmsgaXMgZGVmaW5lZCBieSB0aGUgZ2l2ZW4gaWRlbnRpdHlMaW5rLlxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tJZFxuXHQgKiAgICAgICAgICAgIGlkIG9mIHRoZSB0YXNrLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIGdyb3VwSWRcblx0ICogICAgICAgICAgICBpZCBvZiB0aGUgZ3JvdXAgdG8gaW52b2x2ZSwgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSBpZGVudGl0eUxpbmtUeXBlXG5cdCAqICAgICAgICAgICAgdHlwZSBvZiBpZGVudGl0eSwgY2Fubm90IGJlIG51bGwgKEBzZWUge0BsaW5rIElkZW50aXR5TGlua1R5cGV9KS5cblx0ICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIHdoZW4gdGhlIHRhc2sgb3IgZ3JvdXAgZG9lc24ndCBleGlzdC5cblx0ICovXG5cdHB1YmxpYyBhZGRHcm91cElkZW50aXR5TGluayh0YXNrSWQ6IHN0cmluZywgZ3JvdXBJZDogc3RyaW5nLCBpZGVudGl0eUxpbmtUeXBlOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLmFkZEdyb3VwSWRlbnRpdHlMaW5rKHRhc2tJZCwgZ3JvdXBJZCwgaWRlbnRpdHlMaW5rVHlwZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVuaWVuY2Ugc2hvcnRoYW5kIGZvciB7QGxpbmsgI2RlbGV0ZVVzZXJJZGVudGl0eUxpbmsoU3RyaW5nLCBTdHJpbmcsIFN0cmluZyl9OyB3aXRoIHR5cGUge0BsaW5rIElkZW50aXR5TGlua1R5cGUjQ0FORElEQVRFfVxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tJZFxuXHQgKiAgICAgICAgICAgIGlkIG9mIHRoZSB0YXNrLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHVzZXJJZFxuXHQgKiAgICAgICAgICAgIGlkIG9mIHRoZSB1c2VyIHRvIHVzZSBhcyBjYW5kaWRhdGUsIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlT2JqZWN0Tm90Rm91bmRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBvciB1c2VyIGRvZXNuJ3QgZXhpc3QuXG5cdCAqL1xuXHRwdWJsaWMgZGVsZXRlQ2FuZGlkYXRlVXNlcih0YXNrSWQ6IHN0cmluZywgdXNlcklkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLmRlbGV0ZUNhbmRpZGF0ZVVzZXIodGFza0lkLCB1c2VySWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlbmllbmNlIHNob3J0aGFuZCBmb3Ige0BsaW5rICNkZWxldGVHcm91cElkZW50aXR5TGluayhTdHJpbmcsIFN0cmluZywgU3RyaW5nKX07IHdpdGggdHlwZSB7QGxpbmsgSWRlbnRpdHlMaW5rVHlwZSNDQU5ESURBVEV9XG5cdCAqIFxuXHQgKiBAcGFyYW0gdGFza0lkXG5cdCAqICAgICAgICAgICAgaWQgb2YgdGhlIHRhc2ssIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gZ3JvdXBJZFxuXHQgKiAgICAgICAgICAgIGlkIG9mIHRoZSBncm91cCB0byB1c2UgYXMgY2FuZGlkYXRlLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIHdoZW4gdGhlIHRhc2sgb3IgZ3JvdXAgZG9lc24ndCBleGlzdC5cblx0ICovXG5cdHB1YmxpYyBkZWxldGVDYW5kaWRhdGVHcm91cCh0YXNrSWQ6IHN0cmluZywgZ3JvdXBJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5kZWxldGVDYW5kaWRhdGVHcm91cCh0YXNrSWQsIGdyb3VwSWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgdGhlIGFzc29jaWF0aW9uIGJldHdlZW4gYSB1c2VyIGFuZCBhIHRhc2sgZm9yIHRoZSBnaXZlbiBpZGVudGl0eUxpbmtUeXBlLlxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tJZFxuXHQgKiAgICAgICAgICAgIGlkIG9mIHRoZSB0YXNrLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHVzZXJJZFxuXHQgKiAgICAgICAgICAgIGlkIG9mIHRoZSB1c2VyIGludm9sdmUsIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gaWRlbnRpdHlMaW5rVHlwZVxuXHQgKiAgICAgICAgICAgIHR5cGUgb2YgaWRlbnRpdHlMaW5rLCBjYW5ub3QgYmUgbnVsbCAoQHNlZSB7QGxpbmsgSWRlbnRpdHlMaW5rVHlwZX0pLlxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlT2JqZWN0Tm90Rm91bmRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBvciB1c2VyIGRvZXNuJ3QgZXhpc3QuXG5cdCAqL1xuXHRwdWJsaWMgZGVsZXRlVXNlcklkZW50aXR5TGluayh0YXNrSWQ6IHN0cmluZywgdXNlcklkOiBzdHJpbmcsIGlkZW50aXR5TGlua1R5cGU6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMudGFza1NlcnZpY2UuZGVsZXRlVXNlcklkZW50aXR5TGluayh0YXNrSWQsIHVzZXJJZCwgaWRlbnRpdHlMaW5rVHlwZSk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyB0aGUgYXNzb2NpYXRpb24gYmV0d2VlbiBhIGdyb3VwIGFuZCBhIHRhc2sgZm9yIHRoZSBnaXZlbiBpZGVudGl0eUxpbmtUeXBlLlxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tJZFxuXHQgKiAgICAgICAgICAgIGlkIG9mIHRoZSB0YXNrLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIGdyb3VwSWRcblx0ICogICAgICAgICAgICBpZCBvZiB0aGUgZ3JvdXAgdG8gaW52b2x2ZSwgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSBpZGVudGl0eUxpbmtUeXBlXG5cdCAqICAgICAgICAgICAgdHlwZSBvZiBpZGVudGl0eSwgY2Fubm90IGJlIG51bGwgKEBzZWUge0BsaW5rIElkZW50aXR5TGlua1R5cGV9KS5cblx0ICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIHdoZW4gdGhlIHRhc2sgb3IgZ3JvdXAgZG9lc24ndCBleGlzdC5cblx0ICovXG5cdHB1YmxpYyBkZWxldGVHcm91cElkZW50aXR5TGluayh0YXNrSWQ6IHN0cmluZywgZ3JvdXBJZDogc3RyaW5nLCBpZGVudGl0eUxpbmtUeXBlOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLmRlbGV0ZUdyb3VwSWRlbnRpdHlMaW5rKHRhc2tJZCwgZ3JvdXBJZCwgaWRlbnRpdHlMaW5rVHlwZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hhbmdlcyB0aGUgcHJpb3JpdHkgb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBBdXRob3JpemF0aW9uOiBhY3R1YWwgb3duZXIgLyBidXNpbmVzcyBhZG1pblxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tJZFxuXHQgKiAgICAgICAgICAgIGlkIG9mIHRoZSB0YXNrLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHByaW9yaXR5XG5cdCAqICAgICAgICAgICAgdGhlIG5ldyBwcmlvcml0eSBmb3IgdGhlIHRhc2suXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIHRoZSB0YXNrIGRvZXNuJ3QgZXhpc3QuXG5cdCAqL1xuXHRwdWJsaWMgc2V0UHJpb3JpdHkodGFza0lkOiBzdHJpbmcsIHByaW9yaXR5OiBudW1iZXIpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLnNldFByaW9yaXR5KHRhc2tJZCwgcHJpb3JpdHkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZXMgdGhlIGR1ZSBkYXRlIG9mIHRoZSB0YXNrXG5cdCAqIFxuXHQgKiBAcGFyYW0gdGFza0lkXG5cdCAqICAgICAgICAgICAgaWQgb2YgdGhlIHRhc2ssIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gZHVlRGF0ZVxuXHQgKiAgICAgICAgICAgIHRoZSBuZXcgZHVlIGRhdGUgZm9yIHRoZSB0YXNrXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBkb2Vzbid0IGV4aXN0LlxuXHQgKi9cblx0cHVibGljIHNldER1ZURhdGUodGFza0lkOiBzdHJpbmcsIGR1ZURhdGU6IERhdGUpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLnNldER1ZURhdGUodGFza0lkLCBkdWVEYXRlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBzZXQgdmFyaWFibGUgb24gYSB0YXNrLiBJZiB0aGUgdmFyaWFibGUgaXMgbm90IGFscmVhZHkgZXhpc3RpbmcsIGl0IHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgbW9zdCBvdXRlciBzY29wZS4gVGhpcyBtZWFucyB0aGUgcHJvY2VzcyBpbnN0YW5jZSBpbiBjYXNlIHRoaXMgdGFzayBpcyByZWxhdGVkIHRvIGFuIGV4ZWN1dGlvbi5cblx0ICovXG5cdHB1YmxpYyBzZXRWYXJpYWJsZSh0YXNrSWQ6IHN0cmluZywgdmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLnNldFZhcmlhYmxlKHRhc2tJZCwgdmFyaWFibGVOYW1lLCBWYWx1ZXMuc3RyaW5naWZ5VmFsdWUodmFsdWUpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBzZXQgdmFyaWFibGVzIG9uIGEgdGFzay4gSWYgdGhlIHZhcmlhYmxlIGlzIG5vdCBhbHJlYWR5IGV4aXN0aW5nLCBpdCB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIG1vc3Qgb3V0ZXIgc2NvcGUuIFRoaXMgbWVhbnMgdGhlIHByb2Nlc3MgaW5zdGFuY2UgaW4gY2FzZSB0aGlzIHRhc2sgaXMgcmVsYXRlZCB0byBhbiBleGVjdXRpb24uXG5cdCAqL1xuXHRwdWJsaWMgc2V0VmFyaWFibGVzKHRhc2tJZDogc3RyaW5nLCB2YXJpYWJsZXM6IE1hcDxzdHJpbmcsIGFueT4pOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLnNldFZhcmlhYmxlcyh0YXNrSWQsIFZhbHVlcy5zdHJpbmdpZnlWYWx1ZXNNYXAodmFyaWFibGVzKSk7XG5cdH1cblxuXHQvKipcblx0ICogc2V0IHZhcmlhYmxlIG9uIGEgdGFzay4gSWYgdGhlIHZhcmlhYmxlIGlzIG5vdCBhbHJlYWR5IGV4aXN0aW5nLCBpdCB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgc2V0VmFyaWFibGVMb2NhbCh0YXNrSWQ6IHN0cmluZywgdmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLnNldFZhcmlhYmxlTG9jYWwodGFza0lkLCB2YXJpYWJsZU5hbWUsIFZhbHVlcy5zdHJpbmdpZnlWYWx1ZSh2YWx1ZSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIHNldCB2YXJpYWJsZXMgb24gYSB0YXNrLiBJZiB0aGUgdmFyaWFibGUgaXMgbm90IGFscmVhZHkgZXhpc3RpbmcsIGl0IHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgdGFzay5cblx0ICovXG5cdHB1YmxpYyBzZXRWYXJpYWJsZXNMb2NhbCh0YXNrSWQ6IHN0cmluZywgdmFyaWFibGVzOiBNYXA8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5zZXRWYXJpYWJsZXNMb2NhbCh0YXNrSWQsIFZhbHVlcy5zdHJpbmdpZnlWYWx1ZXNNYXAodmFyaWFibGVzKSk7XG5cdH1cblxuXHQvKipcblx0ICogZ2V0IGEgdmFyaWFibGVzIGFuZCBzZWFyY2ggaW4gdGhlIHRhc2sgc2NvcGUgYW5kIGlmIGF2YWlsYWJsZSBhbHNvIHRoZSBleGVjdXRpb24gc2NvcGVzLlxuXHQgKi9cblx0cHVibGljIGdldFZhcmlhYmxlKHRhc2tJZDogc3RyaW5nLCB2YXJpYWJsZU5hbWU6IHN0cmluZyk6IGFueSB7XG5cdFx0cmV0dXJuIFZhbHVlcy5wYXJzZVZhbHVlKHRoaXMudGFza1NlcnZpY2UuZ2V0VmFyaWFibGUodGFza0lkLCB2YXJpYWJsZU5hbWUpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgdmFyaWFibGUuIFNlYXJjaGluZyBmb3IgdGhlIHZhcmlhYmxlIGlzIGRvbmUgaW4gYWxsIHNjb3BlcyB0aGF0IGFyZSB2aXNpYmxlIHRvIHRoZSBnaXZlbiB0YXNrIChpbmNsdWRpbmcgcGFyZW50IHNjb3BlcykuIFJldHVybnMgbnVsbCB3aGVuIG5vIHZhcmlhYmxlIHZhbHVlIGlzIGZvdW5kIHdpdGggdGhlIGdpdmVuIG5hbWUuXG5cdCAqXG5cdCAqIEBwYXJhbSB0YXNrSWRcblx0ICogICAgICAgICAgICBpZCBvZiB0YXNrLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZVxuXHQgKiAgICAgICAgICAgIG5hbWUgb2YgdmFyaWFibGUsIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcmV0dXJuIHRoZSB2YXJpYWJsZSBvciBudWxsIGlmIHRoZSB2YXJpYWJsZSBpcyB1bmRlZmluZWQuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIG5vIGV4ZWN1dGlvbiBpcyBmb3VuZCBmb3IgdGhlIGdpdmVuIHRhc2tJZC5cblx0ICovXG5cdHB1YmxpYyBnZXRWYXJpYWJsZUluc3RhbmNlKHRhc2tJZDogc3RyaW5nLCB2YXJpYWJsZU5hbWU6IHN0cmluZyk6IFZhcmlhYmxlSW5zdGFuY2Uge1xuXHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmdldFZhcmlhYmxlSW5zdGFuY2UodGFza0lkLCB2YXJpYWJsZU5hbWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIGNoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgdGFzayBoYXMgYSB2YXJpYWJsZSBkZWZpbmVkIHdpdGggdGhlIGdpdmVuIG5hbWUsIGluIHRoZSB0YXNrIHNjb3BlIGFuZCBpZiBhdmFpbGFibGUgYWxzbyB0aGUgZXhlY3V0aW9uIHNjb3Blcy5cblx0ICovXG5cdHB1YmxpYyBoYXNWYXJpYWJsZSh0YXNrSWQ6IHN0cmluZywgdmFyaWFibGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5oYXNWYXJpYWJsZSh0YXNrSWQsIHZhcmlhYmxlTmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogY2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSB0YXNrIGhhcyBhIHZhcmlhYmxlIGRlZmluZWQgd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cblx0ICovXG5cdHB1YmxpYyBnZXRWYXJpYWJsZUxvY2FsKHRhc2tJZDogc3RyaW5nLCB2YXJpYWJsZU5hbWU6IHN0cmluZyk6IGFueSB7XG5cdFx0cmV0dXJuIFZhbHVlcy5wYXJzZVZhbHVlKHRoaXMudGFza1NlcnZpY2UuZ2V0VmFyaWFibGVMb2NhbCh0YXNrSWQsIHZhcmlhYmxlTmFtZSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSB2YXJpYWJsZSBmb3IgYSB0YXNrLiBSZXR1cm5zIHRoZSB2YXJpYWJsZSB3aGVuIGl0IGlzIHNldCBmb3IgdGhlIHRhc2sgKGFuZCBub3Qgc2VhcmNoaW5nIHBhcmVudCBzY29wZXMpLiBSZXR1cm5zIG51bGwgd2hlbiBubyB2YXJpYWJsZSBpcyBmb3VuZCB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuXHQgKlxuXHQgKiBAcGFyYW0gdGFza0lkXG5cdCAqICAgICAgICAgICAgaWQgb2YgdGFzaywgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWVcblx0ICogICAgICAgICAgICBuYW1lIG9mIHZhcmlhYmxlLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHJldHVybiB0aGUgdmFyaWFibGUgb3IgbnVsbCBpZiB0aGUgdmFyaWFibGUgaXMgdW5kZWZpbmVkLlxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlT2JqZWN0Tm90Rm91bmRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiBubyB0YXNrIGlzIGZvdW5kIGZvciB0aGUgZ2l2ZW4gdGFza0lkLlxuXHQgKi9cblx0cHVibGljIGdldFZhcmlhYmxlSW5zdGFuY2VMb2NhbCh0YXNrSWQ6IHN0cmluZywgdmFyaWFibGVOYW1lOiBzdHJpbmcpOiBWYXJpYWJsZUluc3RhbmNlIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXRWYXJpYWJsZUluc3RhbmNlTG9jYWwodGFza0lkLCB2YXJpYWJsZU5hbWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIGNoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgdGFzayBoYXMgYSB2YXJpYWJsZSBkZWZpbmVkIHdpdGggdGhlIGdpdmVuIG5hbWUsIGxvY2FsIHRhc2sgc2NvcGUgb25seS5cblx0ICovXG5cdHB1YmxpYyBoYXNWYXJpYWJsZUxvY2FsKHRhc2tJZDogc3RyaW5nLCB2YXJpYWJsZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmhhc1ZhcmlhYmxlTG9jYWwodGFza0lkLCB2YXJpYWJsZU5hbWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIGdldCBhbGwgdmFyaWFibGVzIGFuZCBzZWFyY2ggaW4gdGhlIHRhc2sgc2NvcGUgYW5kIGlmIGF2YWlsYWJsZSBhbHNvIHRoZSBleGVjdXRpb24gc2NvcGVzLiBJZiB5b3UgaGF2ZSBtYW55IHZhcmlhYmxlcyBhbmQgeW91IG9ubHkgbmVlZCBhIGZldywgY29uc2lkZXIgdXNpbmdcblx0ICoge0BsaW5rICNnZXRWYXJpYWJsZXMoU3RyaW5nLCBDb2xsZWN0aW9uKX0gZm9yIGJldHRlciBwZXJmb3JtYW5jZS5cblx0ICovXG5cdHB1YmxpYyBnZXRWYXJpYWJsZXModGFza0lkOiBzdHJpbmcsIHZhcmlhYmxlTmFtZXM/OiBzdHJpbmdbXSk6IE1hcDxzdHJpbmcsIGFueT4ge1xuXHRcdGlmICh0aGlzLmlzTm90TnVsbCh2YXJpYWJsZU5hbWVzKSkge1xuXHRcdFx0cmV0dXJuIFZhbHVlcy5wYXJzZVZhbHVlc01hcCh0aGlzLnRhc2tTZXJ2aWNlLmdldFZhcmlhYmxlcyh0YXNrSWQsIHZhcmlhYmxlTmFtZXMpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIFZhbHVlcy5wYXJzZVZhbHVlc01hcCh0aGlzLnRhc2tTZXJ2aWNlLmdldFZhcmlhYmxlcyh0YXNrSWQpKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQWxsIHZhcmlhYmxlcyB2aXNpYmxlIGZyb20gdGhlIGdpdmVuIHRhc2sgc2NvcGUgKGluY2x1ZGluZyBwYXJlbnQgc2NvcGVzKS5cblx0ICpcblx0ICogQHBhcmFtIHRhc2tJZFxuXHQgKiAgICAgICAgICAgIGlkIG9mIHRhc2ssIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lc1xuXHQgKiAgICAgICAgICAgIHRoZSBjb2xsZWN0aW9uIG9mIHZhcmlhYmxlIG5hbWVzIHRoYXQgc2hvdWxkIGJlIHJldHJpZXZlZC5cblx0ICogQHJldHVybiB0aGUgdmFyaWFibGUgaW5zdGFuY2VzIG9yIGFuIGVtcHR5IG1hcCBpZiBubyBzdWNoIHZhcmlhYmxlcyBhcmUgZm91bmQuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIG5vIHRhc2sgaXMgZm91bmQgZm9yIHRoZSBnaXZlbiB0YXNrSWQuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VmFyaWFibGVJbnN0YW5jZXModGFza0lkOiBzdHJpbmcsIHZhcmlhYmxlTmFtZXM/OiBzdHJpbmdbXSk6IE1hcDxzdHJpbmcsIFZhcmlhYmxlSW5zdGFuY2U+IHtcblx0XHRpZiAodGhpcy5pc05vdE51bGwodmFyaWFibGVOYW1lcykpIHtcblx0XHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmdldFZhcmlhYmxlSW5zdGFuY2VzKHRhc2tJZCwgdmFyaWFibGVOYW1lcyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmdldFZhcmlhYmxlSW5zdGFuY2VzKHRhc2tJZCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIGdldCBhbGwgdmFyaWFibGVzIGFuZCBzZWFyY2ggb25seSBpbiB0aGUgdGFzayBzY29wZS4gSWYgeW91IGhhdmUgbWFueSB0YXNrIGxvY2FsIHZhcmlhYmxlcyBhbmQgeW91IG9ubHkgbmVlZCBhIGZldywgY29uc2lkZXIgdXNpbmcge0BsaW5rICNnZXRWYXJpYWJsZXNMb2NhbChTdHJpbmcsIENvbGxlY3Rpb24pfSBmb3IgYmV0dGVyXG5cdCAqIHBlcmZvcm1hbmNlLlxuXHQgKi9cblx0cHVibGljIGdldFZhcmlhYmxlc0xvY2FsKHRhc2tJZDogc3RyaW5nLCB2YXJpYWJsZU5hbWVzPzogc3RyaW5nW10pOiBNYXA8c3RyaW5nLCBhbnk+IHtcblx0XHRpZiAodGhpcy5pc05vdE51bGwodmFyaWFibGVOYW1lcykpIHtcblx0XHRcdHJldHVybiBWYWx1ZXMucGFyc2VWYWx1ZXNNYXAodGhpcy50YXNrU2VydmljZS5nZXRWYXJpYWJsZXNMb2NhbCh0YXNrSWQsIHZhcmlhYmxlTmFtZXMpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIFZhbHVlcy5wYXJzZVZhbHVlc01hcCh0aGlzLnRhc2tTZXJ2aWNlLmdldFZhcmlhYmxlc0xvY2FsKHRhc2tJZCkpO1xuXHRcdH1cblx0fVxuXG5cdC8qKiBnZXQgYWxsIHZhcmlhYmxlcyBhbmQgc2VhcmNoIG9ubHkgaW4gdGhlIHRhc2sgc2NvcGUuICovXG5cdHB1YmxpYyBnZXRWYXJpYWJsZUluc3RhbmNlc0xvY2FsQnlUYXNrSWRzKHRhc2tJZHM6IFNldDxzdHJpbmc+KTogVmFyaWFibGVJbnN0YW5jZVtdIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXRWYXJpYWJsZUluc3RhbmNlc0xvY2FsQnlUYXNrSWRzKHRhc2tJZHMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFsbCB2YXJpYWJsZSB2YWx1ZXMgdGhhdCBhcmUgZGVmaW5lZCBpbiB0aGUgdGFzayBzY29wZSwgd2l0aG91dCB0YWtpbmcgb3V0ZXIgc2NvcGVzIGludG8gYWNjb3VudC4gSWYgeW91IGhhdmUgbWFueSB0YXNrIGxvY2FsIHZhcmlhYmxlcyBhbmQgeW91IG9ubHkgbmVlZCBhIGZldywgY29uc2lkZXIgdXNpbmdcblx0ICoge0BsaW5rICNnZXRWYXJpYWJsZUluc3RhbmNlc0xvY2FsKFN0cmluZywgQ29sbGVjdGlvbil9IGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSB0YXNrSWRcblx0ICogICAgICAgICAgICBpZCBvZiB0YXNrLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHJldHVybiB0aGUgdmFyaWFibGVzIG9yIGFuIGVtcHR5IG1hcCBpZiBubyBzdWNoIHZhcmlhYmxlcyBhcmUgZm91bmQuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIG5vIHRhc2sgaXMgZm91bmQgZm9yIHRoZSBnaXZlbiB0YXNrSWQuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VmFyaWFibGVJbnN0YW5jZXNMb2NhbCh0YXNrSWQ6IHN0cmluZywgdmFyaWFibGVOYW1lcz86IHN0cmluZ1tdKTogTWFwPHN0cmluZywgVmFyaWFibGVJbnN0YW5jZT4ge1xuXHRcdGlmICh0aGlzLmlzTm90TnVsbCh2YXJpYWJsZU5hbWVzKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMudGFza1NlcnZpY2UuZ2V0VmFyaWFibGVJbnN0YW5jZXNMb2NhbCh0YXNrSWQsIHZhcmlhYmxlTmFtZXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXRWYXJpYWJsZUluc3RhbmNlc0xvY2FsKHRhc2tJZCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgdGhlIHZhcmlhYmxlIGZyb20gdGhlIHRhc2suIFdoZW4gdGhlIHZhcmlhYmxlIGRvZXMgbm90IGV4aXN0LCBub3RoaW5nIGhhcHBlbnMuXG5cdCAqL1xuXHRwdWJsaWMgcmVtb3ZlVmFyaWFibGUodGFza0lkOiBzdHJpbmcsIHZhcmlhYmxlTmFtZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5yZW1vdmVWYXJpYWJsZSh0YXNrSWQsIHZhcmlhYmxlTmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyB0aGUgdmFyaWFibGUgZnJvbSB0aGUgdGFzayAobm90IGNvbnNpZGVyaW5nIHBhcmVudCBzY29wZXMpLiBXaGVuIHRoZSB2YXJpYWJsZSBkb2VzIG5vdCBleGlzdCwgbm90aGluZyBoYXBwZW5zLlxuXHQgKi9cblx0cHVibGljIHJlbW92ZVZhcmlhYmxlTG9jYWwodGFza0lkOiBzdHJpbmcsIHZhcmlhYmxlTmFtZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5yZW1vdmVWYXJpYWJsZUxvY2FsKHRhc2tJZCwgdmFyaWFibGVOYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGFsbCB2YXJpYWJsZXMgaW4gdGhlIGdpdmVuIGNvbGxlY3Rpb24gZnJvbSB0aGUgdGFzay4gTm9uIGV4aXN0aW5nIHZhcmlhYmxlIG5hbWVzIGFyZSBzaW1wbHkgaWdub3JlZC5cblx0ICovXG5cdHB1YmxpYyByZW1vdmVWYXJpYWJsZXModGFza0lkOiBzdHJpbmcsIHZhcmlhYmxlTmFtZXM6IHN0cmluZ1tdKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5yZW1vdmVWYXJpYWJsZXModGFza0lkLCB2YXJpYWJsZU5hbWVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGFsbCB2YXJpYWJsZXMgaW4gdGhlIGdpdmVuIGNvbGxlY3Rpb24gZnJvbSB0aGUgdGFzayAobm90IGNvbnNpZGVyaW5nIHBhcmVudCBzY29wZXMpLiBOb24gZXhpc3RpbmcgdmFyaWFibGUgbmFtZXMgYXJlIHNpbXBseSBpZ25vcmVkLlxuXHQgKi9cblx0cHVibGljIHJlbW92ZVZhcmlhYmxlc0xvY2FsKHRhc2tJZDogc3RyaW5nLCB2YXJpYWJsZU5hbWVzOiBzdHJpbmdbXSk6IHZvaWQge1xuXHRcdHRoaXMudGFza1NlcnZpY2UucmVtb3ZlVmFyaWFibGVzTG9jYWwodGFza0lkLCB2YXJpYWJsZU5hbWVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBbGwgRGF0YU9iamVjdHMgdmlzaWJsZSBmcm9tIHRoZSBnaXZlbiBleGVjdXRpb24gc2NvcGUgKGluY2x1ZGluZyBwYXJlbnQgc2NvcGVzKS5cblx0ICpcblx0ICogQHBhcmFtIHRhc2tJZFxuXHQgKiAgICAgICAgICAgIGlkIG9mIHRhc2ssIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gZGF0YU9iamVjdE5hbWVzXG5cdCAqICAgICAgICAgICAgdGhlIGNvbGxlY3Rpb24gb2YgRGF0YU9iamVjdCBuYW1lcyB0aGF0IHNob3VsZCBiZSByZXRyaWV2ZWQuXG5cdCAqIEBwYXJhbSBsb2NhbGVcblx0ICogICAgICAgICAgICBsb2NhbGUgdGhlIERhdGFPYmplY3QgbmFtZSBhbmQgZGVzY3JpcHRpb24gc2hvdWxkIGJlIHJldHVybmVkIGluIChpZiBhdmFpbGFibGUpLlxuXHQgKiBAcGFyYW0gd2l0aExvY2FsaXphdGlvbkZhbGxiYWNrXG5cdCAqICAgICAgICAgICAgV2hlbiB0cnVlIGxvY2FsaXphdGlvbiB3aWxsIGZhbGxiYWNrIHRvIG1vcmUgZ2VuZXJhbCBsb2NhbGVzIGlmIHRoZSBzcGVjaWZpZWQgbG9jYWxlIGlzIG5vdCBmb3VuZC5cblx0ICogQHJldHVybiB0aGUgRGF0YU9iamVjdHMgb3IgYW4gZW1wdHkgbWFwIGlmIG5vIHN1Y2ggdmFyaWFibGVzIGFyZSBmb3VuZC5cblx0ICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIHdoZW4gbm8gdGFzayBpcyBmb3VuZCBmb3IgdGhlIGdpdmVuIHRhc2tJZC5cblx0ICovXG5cdHB1YmxpYyBnZXREYXRhT2JqZWN0cyh0YXNrSWQ6IHN0cmluZywgZGF0YU9iamVjdE5hbWVzPzogc3RyaW5nW10sIGxvY2FsZT86IHN0cmluZywgd2l0aExvY2FsaXphdGlvbkZhbGxiYWNrPzogYm9vbGVhbik6IE1hcDxzdHJpbmcsIERhdGFPYmplY3Q+IHtcblx0XHRpZiAodGhpcy5pc05vdE51bGwoZGF0YU9iamVjdE5hbWVzKSAmJiB0aGlzLmlzTm90TnVsbChsb2NhbGUpICYmIHRoaXMuaXNOb3ROdWxsKHdpdGhMb2NhbGl6YXRpb25GYWxsYmFjaykpIHtcblx0XHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmdldERhdGFPYmplY3RzKHRhc2tJZCwgZGF0YU9iamVjdE5hbWVzLCBsb2NhbGUsIHdpdGhMb2NhbGl6YXRpb25GYWxsYmFjayk7XG5cdFx0fSBlbHNlIGlmICh0aGlzLmlzTm90TnVsbChkYXRhT2JqZWN0TmFtZXMpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXREYXRhT2JqZWN0cyh0YXNrSWQsIGRhdGFPYmplY3ROYW1lcyk7XG5cdFx0fSBlbHNlIGlmICh0aGlzLmlzTm90TnVsbChsb2NhbGUpICYmIHRoaXMuaXNOb3ROdWxsKHdpdGhMb2NhbGl6YXRpb25GYWxsYmFjaykpIHtcblx0XHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmdldERhdGFPYmplY3RzKHRhc2tJZCwgbG9jYWxlLCB3aXRoTG9jYWxpemF0aW9uRmFsbGJhY2spO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXREYXRhT2JqZWN0cyh0YXNrSWQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgRGF0YU9iamVjdC4gU2VhcmNoaW5nIGZvciB0aGUgRGF0YU9iamVjdCBpcyBkb25lIGluIGFsbCBzY29wZXMgdGhhdCBhcmUgdmlzaWJsZSB0byB0aGUgZ2l2ZW4gdGFzayAoaW5jbHVkaW5nIHBhcmVudCBzY29wZXMpLiBSZXR1cm5zIG51bGwgd2hlbiBubyBEYXRhT2JqZWN0IHZhbHVlIGlzIGZvdW5kIHdpdGggdGhlIGdpdmVuXG5cdCAqIG5hbWUuXG5cdCAqXG5cdCAqIEBwYXJhbSB0YXNrSWRcblx0ICogICAgICAgICAgICBpZCBvZiB0YXNrLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIGRhdGFPYmplY3Rcblx0ICogICAgICAgICAgICBuYW1lIG9mIERhdGFPYmplY3QsIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gbG9jYWxlXG5cdCAqICAgICAgICAgICAgbG9jYWxlIHRoZSBEYXRhT2JqZWN0IG5hbWUgYW5kIGRlc2NyaXB0aW9uIHNob3VsZCBiZSByZXR1cm5lZCBpbiAoaWYgYXZhaWxhYmxlKS5cblx0ICogQHBhcmFtIHdpdGhMb2NhbGl6YXRpb25GYWxsYmFja1xuXHQgKiAgICAgICAgICAgIFdoZW4gdHJ1ZSBsb2NhbGl6YXRpb24gd2lsbCBmYWxsYmFjayB0byBtb3JlIGdlbmVyYWwgbG9jYWxlcyBpbmNsdWRpbmcgdGhlIGRlZmF1bHQgbG9jYWxlIG9mIHRoZSBKVk0gaWYgdGhlIHNwZWNpZmllZCBsb2NhbGUgaXMgbm90IGZvdW5kLlxuXHQgKiBAcmV0dXJuIHRoZSBEYXRhT2JqZWN0IG9yIG51bGwgaWYgdGhlIHZhcmlhYmxlIGlzIHVuZGVmaW5lZC5cblx0ICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIHdoZW4gbm8gdGFzayBpcyBmb3VuZCBmb3IgdGhlIGdpdmVuIHRhc2tJZC5cblx0ICovXG5cdHB1YmxpYyBnZXREYXRhT2JqZWN0KHRhc2tJZDogc3RyaW5nLCBkYXRhT2JqZWN0OiBzdHJpbmcsIGxvY2FsZT86IHN0cmluZywgd2l0aExvY2FsaXphdGlvbkZhbGxiYWNrPzogYm9vbGVhbik6IERhdGFPYmplY3Qge1xuXHRcdGlmICh0aGlzLmlzTm90TnVsbChsb2NhbGUpICYmIHRoaXMuaXNOb3ROdWxsKHdpdGhMb2NhbGl6YXRpb25GYWxsYmFjaykpIHtcblx0XHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmdldERhdGFPYmplY3QodGFza0lkLCBkYXRhT2JqZWN0LCBsb2NhbGUsIHdpdGhMb2NhbGl6YXRpb25GYWxsYmFjayk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmdldERhdGFPYmplY3QodGFza0lkLCBkYXRhT2JqZWN0KTtcblx0XHR9XG5cdH1cblxuXHQvKiogQWRkIGEgY29tbWVudCB0byBhIHRhc2sgYW5kL29yIHByb2Nlc3MgaW5zdGFuY2UuICovXG5cdHB1YmxpYyBhZGRDb21tZW50KHRhc2tJZDogc3RyaW5nLCBwcm9jZXNzSW5zdGFuY2VJZDogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcsIHR5cGU/OiBzdHJpbmcpOiBDb21tZW50IHtcblx0XHRpZiAodGhpcy5pc05vdE51bGwodHlwZSkpIHtcblx0XHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmFkZENvbW1lbnQodGFza0lkLCBwcm9jZXNzSW5zdGFuY2VJZCwgdHlwZSwgbWVzc2FnZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmFkZENvbW1lbnQodGFza0lkLCBwcm9jZXNzSW5zdGFuY2VJZCwgbWVzc2FnZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqIFVwZGF0ZSBhIGNvbW1lbnQgdG8gYSB0YXNrIGFuZC9vciBwcm9jZXNzIGluc3RhbmNlLiAqL1xuXHRwdWJsaWMgc2F2ZUNvbW1lbnQoY29tbWVudDogQ29tbWVudCk6IHZvaWQge1xuXHRcdHRoaXMudGFza1NlcnZpY2Uuc2F2ZUNvbW1lbnQoY29tbWVudCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhbiBpbmRpdmlkdWFsIGNvbW1lbnQgd2l0aCB0aGUgZ2l2ZW4gaWQuIFJldHVybnMgbnVsbCBpZiBubyBjb21tZW50IGV4aXN0cyB3aXRoIHRoZSBnaXZlbiBpZC5cblx0ICovXG5cdHB1YmxpYyBnZXRDb21tZW50KGNvbW1lbnRJZDogc3RyaW5nKTogQ29tbWVudCB7XG5cdFx0cmV0dXJuIHRoaXMudGFza1NlcnZpY2UuZ2V0Q29tbWVudChjb21tZW50SWQpO1xuXHR9XG5cblx0LyoqIFJlbW92ZXMgYWxsIGNvbW1lbnRzIGZyb20gdGhlIHByb3ZpZGVkIHRhc2sgYW5kL29yIHByb2Nlc3MgaW5zdGFuY2UgKi9cblx0cHVibGljIGRlbGV0ZUNvbW1lbnRzKHRhc2tJZDogc3RyaW5nLCBwcm9jZXNzSW5zdGFuY2VJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5kZWxldGVDb21tZW50cyh0YXNrSWQsIHByb2Nlc3NJbnN0YW5jZUlkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGFuIGluZGl2aWR1YWwgY29tbWVudCB3aXRoIHRoZSBnaXZlbiBpZC5cblx0ICogXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIG5vIGNvbW1lbnQgZXhpc3RzIHdpdGggdGhlIGdpdmVuIGlkLlxuXHQgKi9cblx0cHVibGljIGRlbGV0ZUNvbW1lbnQoY29tbWVudElkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLmRlbGV0ZUNvbW1lbnQoY29tbWVudElkKTtcblx0fVxuXG5cdC8qKiBUaGUgY29tbWVudHMgcmVsYXRlZCB0byB0aGUgZ2l2ZW4gdGFzay4gKi9cblx0cHVibGljIGdldFRhc2tDb21tZW50cyh0YXNrSWQ6IHN0cmluZywgdHlwZT86IHN0cmluZyk6IENvbW1lbnRbXSB7XG5cdFx0aWYgKHRoaXMuaXNOb3ROdWxsKHR5cGUpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXRUYXNrQ29tbWVudHModGFza0lkLCB0eXBlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMudGFza1NlcnZpY2UuZ2V0VGFza0NvbW1lbnRzKHRhc2tJZCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqIEFsbCBjb21tZW50cyBvZiBhIGdpdmVuIHR5cGUuICovXG5cdHB1YmxpYyBnZXRDb21tZW50c0J5VHlwZSh0eXBlOiBzdHJpbmcpOiBDb21tZW50W10ge1xuXHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmdldENvbW1lbnRzQnlUeXBlKHR5cGUpO1xuXHR9XG5cblx0LyoqIFRoZSBhbGwgZXZlbnRzIHJlbGF0ZWQgdG8gdGhlIGdpdmVuIHRhc2suICovXG5cdHB1YmxpYyBnZXRUYXNrRXZlbnRzKHRhc2tJZDogc3RyaW5nKTogVGFza0V2ZW50W10ge1xuXHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmdldFRhc2tFdmVudHModGFza0lkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGFuIGluZGl2aWR1YWwgZXZlbnQgd2l0aCB0aGUgZ2l2ZW4gaWQuIFJldHVybnMgbnVsbCBpZiBubyBldmVudCBleGlzdHMgd2l0aCB0aGUgZ2l2ZW4gaWQuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RXZlbnQoZXZlbnRJZDogc3RyaW5nKTogVGFza0V2ZW50IHtcblx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXRFdmVudChldmVudElkKTtcblx0fVxuXG5cdC8qKiBUaGUgY29tbWVudHMgcmVsYXRlZCB0byB0aGUgZ2l2ZW4gcHJvY2VzcyBpbnN0YW5jZS4gKi9cblx0cHVibGljIGdldFByb2Nlc3NJbnN0YW5jZUNvbW1lbnRzKHByb2Nlc3NJbnN0YW5jZUlkOiBzdHJpbmcsIHR5cGU/OiBzdHJpbmcpOiBDb21tZW50W10ge1xuXHRcdGlmICh0aGlzLmlzTm90TnVsbCh0eXBlKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMudGFza1NlcnZpY2UuZ2V0UHJvY2Vzc0luc3RhbmNlQ29tbWVudHMocHJvY2Vzc0luc3RhbmNlSWQsIHR5cGUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXRQcm9jZXNzSW5zdGFuY2VDb21tZW50cyhwcm9jZXNzSW5zdGFuY2VJZCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhIG5ldyBhdHRhY2htZW50IHRvIGEgdGFzayBhbmQvb3IgYSBwcm9jZXNzIGluc3RhbmNlIGFuZCB1c2UgYW4gaW5wdXQgc3RyZWFtIHRvIHByb3ZpZGUgdGhlIGNvbnRlbnRcblx0ICovXG5cdHB1YmxpYyBjcmVhdGVBdHRhY2htZW50KGF0dGFjaG1lbnRUeXBlOiBzdHJpbmcsIHRhc2tJZDogc3RyaW5nLCBwcm9jZXNzSW5zdGFuY2VJZDogc3RyaW5nLCBhdHRhY2htZW50TmFtZTogc3RyaW5nLCBhdHRhY2htZW50RGVzY3JpcHRpb246IHN0cmluZywgY29udGVudD86IGFueVtdLCB1cmw/OiBzdHJpbmcpOiBBdHRhY2htZW50IHtcblx0XHRpZiAodGhpcy5pc05vdE51bGwodXJsKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMudGFza1NlcnZpY2UuY3JlYXRlQXR0YWNobWVudChhdHRhY2htZW50VHlwZSwgdGFza0lkLCBwcm9jZXNzSW5zdGFuY2VJZCwgYXR0YWNobWVudE5hbWUsIGF0dGFjaG1lbnREZXNjcmlwdGlvbiwgdXJsKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMudGFza1NlcnZpY2UuY3JlYXRlQXR0YWNobWVudChhdHRhY2htZW50VHlwZSwgdGFza0lkLCBwcm9jZXNzSW5zdGFuY2VJZCwgYXR0YWNobWVudE5hbWUsIGF0dGFjaG1lbnREZXNjcmlwdGlvbiwgU3RyZWFtcy5jcmVhdGVCeXRlQXJyYXlJbnB1dFN0cmVhbShjb250ZW50KSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqIFVwZGF0ZSB0aGUgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgYW4gYXR0YWNobWVudCAqL1xuXHRwdWJsaWMgc2F2ZUF0dGFjaG1lbnQoYXR0YWNobWVudDogQXR0YWNobWVudCk6IHZvaWQge1xuXHRcdHRoaXMudGFza1NlcnZpY2Uuc2F2ZUF0dGFjaG1lbnQoYXR0YWNobWVudCk7XG5cdH1cblxuXHQvKiogUmV0cmlldmUgYSBwYXJ0aWN1bGFyIGF0dGFjaG1lbnQgKi9cblx0cHVibGljIGdldEF0dGFjaG1lbnQoYXR0YWNobWVudElkOiBzdHJpbmcpOiBBdHRhY2htZW50IHtcblx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXRBdHRhY2htZW50KGF0dGFjaG1lbnRJZCk7XG5cdH1cblxuXHQvKiogUmV0cmlldmUgc3RyZWFtIGNvbnRlbnQgb2YgYSBwYXJ0aWN1bGFyIGF0dGFjaG1lbnQgKi9cblx0cHVibGljIGdldEF0dGFjaG1lbnRDb250ZW50KGF0dGFjaG1lbnRJZDogc3RyaW5nKTogYW55W10ge1xuXHRcdGNvbnN0IGNvbnRlbnQgPSB0aGlzLnRhc2tTZXJ2aWNlLmdldEF0dGFjaG1lbnRDb250ZW50KGF0dGFjaG1lbnRJZCk7XG5cdFx0Y29uc3QgYmFvcyA9IFN0cmVhbXMuY3JlYXRlQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7XG5cdFx0U3RyZWFtcy5jb3B5TGFyZ2UoY29udGVudCwgYmFvcyk7XG5cdFx0cmV0dXJuIGJhb3MuZ2V0Qnl0ZXMoKVxuXHR9O1xuXG5cdC8qKiBUaGUgbGlzdCBvZiBhdHRhY2htZW50cyBhc3NvY2lhdGVkIHRvIGEgdGFzayAqL1xuXHRwdWJsaWMgZ2V0VGFza0F0dGFjaG1lbnRzKHRhc2tJZDogc3RyaW5nKTogQXR0YWNobWVudFtdIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXRUYXNrQXR0YWNobWVudHModGFza0lkKTtcblx0fVxuXG5cdC8qKiBUaGUgbGlzdCBvZiBhdHRhY2htZW50cyBhc3NvY2lhdGVkIHRvIGEgcHJvY2VzcyBpbnN0YW5jZSAqL1xuXHRwdWJsaWMgZ2V0UHJvY2Vzc0luc3RhbmNlQXR0YWNobWVudHMocHJvY2Vzc0luc3RhbmNlSWQ6IHN0cmluZyk6IEF0dGFjaG1lbnRbXSB7XG5cdFx0cmV0dXJuIHRoaXMudGFza1NlcnZpY2UuZ2V0UHJvY2Vzc0luc3RhbmNlQXR0YWNobWVudHMocHJvY2Vzc0luc3RhbmNlSWQpO1xuXHR9XG5cblx0LyoqIERlbGV0ZSBhbiBhdHRhY2htZW50ICovXG5cdHB1YmxpYyBkZWxldGVBdHRhY2htZW50KGF0dGFjaG1lbnRJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5kZWxldGVBdHRhY2htZW50KGF0dGFjaG1lbnRJZCk7XG5cdH1cblxuXHQvKiogVGhlIGxpc3Qgb2Ygc3VidGFza3MgZm9yIHRoaXMgcGFyZW50IHRhc2sgKi9cblx0cHVibGljIGdldFN1YlRhc2tzKHBhcmVudFRhc2tJZDogc3RyaW5nKTogVGFza1tdIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXRTdWJUYXNrcyhwYXJlbnRUYXNrSWQpO1xuXHR9XG5cblx0cHJpdmF0ZSBpc05vdE51bGwocHJvcGVydHk6IGFueSk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBwcm9wZXJ0eSAhPT0gbnVsbCAmJiBwcm9wZXJ0eSAhPT0gdW5kZWZpbmVkO1xuXHR9XG59XG5cbmNsYXNzIFRhc2tEYXRhIHtcblxuXHRwcml2YXRlIGRhdGE6IGFueTtcblxuXHRjb25zdHJ1Y3RvcihkYXRhOiBhbnkpIHtcblx0XHR0aGlzLmRhdGEgPSBkYXRhO1xuXHR9XG5cblx0cHVibGljIGdldElkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5pZCA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0UmV2aXNpb24oKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5kYXRhLnJldmlzaW9uO1xuXHR9XG5cblx0cHVibGljIGdldE93bmVyKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5vd25lciA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0QXNzaWduZWVVcGRhdGVkQ291bnQoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5kYXRhLmFzc2lnbmVlVXBkYXRlZENvdW50O1xuXHR9XG5cblx0cHVibGljIGdldE9yaWdpbmFsQXNzaWduZWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGhpcy5kYXRhLm9yaWdpbmFsQXNzaWduZWUgPz8gdW5kZWZpbmVkO1xuXHR9XG5cblx0cHVibGljIGdldEFzc2lnbmVlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5hc3NpZ25lZSA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0RGVsZWdhdGlvblN0YXRlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5kZWxlZ2F0aW9uU3RhdGUgPz8gdW5kZWZpbmVkO1xuXHR9XG5cblx0cHVibGljIGdldFBhcmVudFRhc2tJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLmRhdGEucGFyZW50VGFza0lkID8/IHVuZGVmaW5lZDtcblx0fVxuXG5cdHB1YmxpYyBnZXROYW1lKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5uYW1lID8/IHVuZGVmaW5lZDtcblx0fVxuXG5cdHB1YmxpYyBnZXRMb2NhbGl6ZWROYW1lKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5sb2NhbGl6ZWROYW1lID8/IHVuZGVmaW5lZDtcblx0fVxuXG5cdHB1YmxpYyBnZXREZXNjcmlwdGlvbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLmRhdGEuZGVzY3JpcHRpb24gPz8gdW5kZWZpbmVkO1xuXHR9XG5cblx0cHVibGljIGdldExvY2FsaXplZERlc2NyaXB0aW9uKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5sb2NhbGl6ZWREZXNjcmlwdGlvbiA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0UHJpb3JpdHkoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5kYXRhLnByaW9yaXR5O1xuXHR9XG5cblx0cHVibGljIGdldENyZWF0ZVRpbWUoKTogRGF0ZSB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5jcmVhdGVUaW1lID8/IHVuZGVmaW5lZDtcblx0fVxuXG5cdHB1YmxpYyBnZXREdWVEYXRlKCk6IERhdGUgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLmRhdGEuZHVlRGF0ZSA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0U3VzcGVuc2lvblN0YXRlKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5zdXNwZW5zaW9uU3RhdGUgPz8gdW5kZWZpbmVkO1xuXHR9XG5cblx0cHVibGljIGdldENhdGVnb3J5KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5jYXRlZ29yeSA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgaXNJZGVudGl0eUxpbmtzSW5pdGlhbGl6ZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5pc0lkZW50aXR5TGlua3NJbml0aWFsaXplZDtcblx0fVxuXG5cdHB1YmxpYyBnZXRFeGVjdXRpb25JZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLmRhdGEuZXhlY3V0aW9uSWQgPz8gdW5kZWZpbmVkO1xuXHR9XG5cblx0cHVibGljIGdldFByb2Nlc3NJbnN0YW5jZUlkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5wcm9jZXNzSW5zdGFuY2VJZCA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0UHJvY2Vzc0RlZmluaXRpb25JZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLmRhdGEucHJvY2Vzc0RlZmluaXRpb25JZCA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0U2NvcGVJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLmRhdGEuc2NvcGVJZCA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0U3ViU2NvcGVJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLmRhdGEuc3ViU2NvcGVJZCA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0U2NvcGVUeXBlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5zY29wZVR5cGUgPz8gdW5kZWZpbmVkO1xuXHR9XG5cblx0cHVibGljIGdldFNjb3BlRGVmaW5pdGlvbklkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5zY29wZURlZmluaXRpb25JZCA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0VGFza0RlZmluaXRpb25LZXkoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGhpcy5kYXRhLnRhc2tEZWZpbml0aW9uS2V5ID8/IHVuZGVmaW5lZDtcblx0fVxuXG5cdHB1YmxpYyBnZXRGb3JtS2V5KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5mb3JtS2V5ID8/IHVuZGVmaW5lZDtcblx0fVxuXG5cdHB1YmxpYyBpc0RlbGV0ZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5pc0RlbGV0ZWQ7XG5cdH1cblxuXHRwdWJsaWMgaXNDYW5jZWxlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5kYXRhLmlzQ2FuY2VsZWQ7XG5cdH1cblxuXHRwdWJsaWMgaXNDb3VudEVuYWJsZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5pc0NvdW50RW5hYmxlZDtcblx0fVxuXG5cdHB1YmxpYyBnZXRWYXJpYWJsZUNvdW50KCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS52YXJpYWJsZUNvdW50O1xuXHR9XG5cblx0cHVibGljIGdldElkZW50aXR5TGlua0NvdW50KCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5pZGVudGl0eUxpbmtDb3VudDtcblx0fVxuXG5cdHB1YmxpYyBnZXRDbGFpbVRpbWUoKTogRGF0ZSB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5jbGFpbVRpbWUgPz8gdW5kZWZpbmVkO1xuXHR9XG5cblx0cHVibGljIGdldFRlbmFudElkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS50ZW5hbnRJZDtcblx0fVxuXG5cdHB1YmxpYyBnZXRFdmVudE5hbWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGhpcy5kYXRhLmV2ZW50TmFtZSA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0RXZlbnRIYW5kbGVySWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGhpcy5kYXRhLmV2ZW50SGFuZGxlcklkID8/IHVuZGVmaW5lZDtcblx0fVxuXG5cdHB1YmxpYyBpc0ZvcmNlZFVwZGF0ZSgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5kYXRhLmZvcmNlZFVwZGF0ZTtcblx0fVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgb25lIHRhc2sgZm9yIGEgaHVtYW4gdXNlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYXNrIGV4dGVuZHMgVGFza0luZm8ge1xuXG5cdC8qKiBOYW1lIG9yIHRpdGxlIG9mIHRoZSB0YXNrLiAqL1xuXHRzZXROYW1lKG5hbWU6IHN0cmluZyk6IHZvaWQ7XG5cblx0LyoqIFNldHMgYW4gb3B0aW9uYWwgbG9jYWxpemVkIG5hbWUgZm9yIHRoZSB0YXNrLiAqL1xuXHRzZXRMb2NhbGl6ZWROYW1lKG5hbWU6IHN0cmluZyk6IHZvaWQ7XG5cblx0LyoqIENoYW5nZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHRhc2sgKi9cblx0c2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb246IHN0cmluZyk6IHZvaWQ7XG5cblx0LyoqIFNldHMgYW4gb3B0aW9uYWwgbG9jYWxpemVkIGRlc2NyaXB0aW9uIGZvciB0aGUgdGFzay4gKi9cblx0c2V0TG9jYWxpemVkRGVzY3JpcHRpb24oZGVzY3JpcHRpb246IHN0cmluZyk6IHZvaWQ7XG5cblx0LyoqIFNldHMgdGhlIGluZGljYXRpb24gb2YgaG93IGltcG9ydGFudC91cmdlbnQgdGhpcyB0YXNrIGlzICovXG5cdHNldFByaW9yaXR5KHByaW9yaXR5OiBudW1iZXIpOiB2b2lkO1xuXG5cdC8qKlxuXHQgKiBUaGUgdXNlciBpZCBvZiB0aGUgcGVyc29uIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yIHRoaXMgdGFzay5cblx0ICovXG5cdHNldE93bmVyKG93bmVyOiBzdHJpbmcpOiB2b2lkO1xuXG5cdC8qKlxuXHQgKiBUaGUgdXNlciBpZCBvZiB0aGUgcGVyc29uIHRvIHdoaWNoIHRoaXMgdGFzayBpcyBkZWxlZ2F0ZWQuXG5cdCAqL1xuXHRzZXRBc3NpZ25lZShhc3NpZ25lZTogc3RyaW5nKTogdm9pZDtcblxuXHQvKiogVGhlIGN1cnJlbnQge0BsaW5rIERlbGVnYXRpb25TdGF0ZX0gZm9yIHRoaXMgdGFzay4gKi9cblx0Z2V0RGVsZWdhdGlvblN0YXRlKCk6IERlbGVnYXRpb25TdGF0ZTtcblxuXHQvKiogVGhlIGN1cnJlbnQge0BsaW5rIERlbGVnYXRpb25TdGF0ZX0gZm9yIHRoaXMgdGFzay4gKi9cblx0c2V0RGVsZWdhdGlvblN0YXRlKGRlbGVnYXRpb25TdGF0ZTogRGVsZWdhdGlvblN0YXRlKTogdm9pZDtcblxuXHQvKiogQ2hhbmdlIGR1ZSBkYXRlIG9mIHRoZSB0YXNrLiAqL1xuXHRzZXREdWVEYXRlKGR1ZURhdGU6IERhdGUpOiB2b2lkO1xuXG5cdC8qKlxuXHQgKiBDaGFuZ2UgdGhlIGNhdGVnb3J5IG9mIHRoZSB0YXNrLiBUaGlzIGlzIGFuIG9wdGlvbmFsIGZpZWxkIGFuZCBhbGxvd3MgdG8gJ3RhZycgdGFza3MgYXMgYmVsb25naW5nIHRvIGEgY2VydGFpbiBjYXRlZ29yeS5cblx0ICovXG5cdHNldENhdGVnb3J5KGNhdGVnb3J5OiBzdHJpbmcpOiB2b2lkO1xuXG5cdC8qKiB0aGUgcGFyZW50IHRhc2sgZm9yIHdoaWNoIHRoaXMgdGFzayBpcyBhIHN1YnRhc2sgKi9cblx0c2V0UGFyZW50VGFza0lkKHBhcmVudFRhc2tJZDogc3RyaW5nKTogdm9pZDtcblxuXHQvKiogQ2hhbmdlIHRoZSB0ZW5hbnRJZCBvZiB0aGUgdGFzayAqL1xuXHRzZXRUZW5hbnRJZCh0ZW5hbnRJZDogc3RyaW5nKTogdm9pZDtcblxuXHQvKiogQ2hhbmdlIHRoZSBmb3JtIGtleSBvZiB0aGUgdGFzayAqL1xuXHRzZXRGb3JtS2V5KGZvcm1LZXk6IHN0cmluZyk6IHZvaWQ7XG5cblx0LyoqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgdGFzayBpcyBzdXNwZW5kZWQgb3Igbm90LiAqL1xuXHRpc1N1c3BlbmRlZCgpOiBib29sZWFuO1xuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFza0luZm8ge1xuXG5cdC8qKiBEQiBpZCBvZiB0aGUgdGFzay4gKi9cblx0Z2V0SWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBOYW1lIG9yIHRpdGxlIG9mIHRoZSB0YXNrLlxuXHQgKi9cblx0Z2V0TmFtZSgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIEZyZWUgdGV4dCBkZXNjcmlwdGlvbiBvZiB0aGUgdGFzay5cblx0ICovXG5cdGdldERlc2NyaXB0aW9uKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogSW5kaWNhdGlvbiBvZiBob3cgaW1wb3J0YW50L3VyZ2VudCB0aGlzIHRhc2sgaXNcblx0ICovXG5cdGdldFByaW9yaXR5KCk6IG51bWJlcjtcblxuXHQvKipcblx0ICogVGhlIHVzZXIgaWQgb2YgdGhlIHBlcnNvbiB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciB0aGlzIHRhc2suXG5cdCAqL1xuXHRnZXRPd25lcigpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIFRoZSB1c2VyIGlkIG9mIHRoZSBwZXJzb24gdG8gd2hpY2ggdGhpcyB0YXNrIGlzIGRlbGVnYXRlZC5cblx0ICovXG5cdGdldEFzc2lnbmVlKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogUmVmZXJlbmNlIHRvIHRoZSBwcm9jZXNzIGluc3RhbmNlIG9yIG51bGwgaWYgaXQgaXMgbm90IHJlbGF0ZWQgdG8gYSBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKi9cblx0Z2V0UHJvY2Vzc0luc3RhbmNlSWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBSZWZlcmVuY2UgdG8gdGhlIHBhdGggb2YgZXhlY3V0aW9uIG9yIG51bGwgaWYgaXQgaXMgbm90IHJlbGF0ZWQgdG8gYSBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKi9cblx0Z2V0RXhlY3V0aW9uSWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBSZWZlcmVuY2UgdG8gdGhlIHRhc2sgZGVmaW5pdGlvbiBvciBudWxsIGlmIGl0IGlzIG5vdCByZWxhdGVkIHRvIGFueSB0YXNrIGRlZmluaXRpb24uXG5cdCAqL1xuXHRnZXRUYXNrRGVmaW5pdGlvbklkKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogUmVmZXJlbmNlIHRvIHRoZSBwcm9jZXNzIGRlZmluaXRpb24gb3IgbnVsbCBpZiBpdCBpcyBub3QgcmVsYXRlZCB0byBhIHByb2Nlc3MuXG5cdCAqL1xuXHRnZXRQcm9jZXNzRGVmaW5pdGlvbklkKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogUmVmZXJlbmNlIHRvIGEgc2NvcGUgaWRlbnRpZmllciBvciBudWxsIGlmIG5vbmUgaXMgc2V0IChlLmcuIGZvciBicG1uIHByb2Nlc3MgdGFzayBpdCBpcyBudWxsKVxuXHQgKi9cblx0Z2V0U2NvcGVJZCgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIFJlZmVyZW5jZSB0byBhIHN1YiBzY29wZSBpZGVudGlmaWVyIG9yIG51bGwgaWYgbm9uZSBpcyBzZXQgKGUuZy4gZm9yIGJwbW4gcHJvY2VzcyB0YXNrIGl0IGlzIG51bGwpXG5cdCAqL1xuXHRnZXRTdWJTY29wZUlkKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogUmVmZXJlbmNlIHRvIGEgc2NvcGUgdHlwZSBvciBudWxsIGlmIG5vbmUgaXMgc2V0IChlLmcuIGZvciBicG1uIHByb2Nlc3MgdGFzayBpdCBpcyBudWxsKVxuXHQgKi9cblx0Z2V0U2NvcGVUeXBlKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogUmVmZXJlbmNlIHRvIGEgc2NvcGUgZGVmaW5pdGlvbiBpZGVudGlmaWVyIG9yIG51bGwgaWYgbm9uZSBpcyBzZXQgKGUuZy4gZm9yIGJwbW4gcHJvY2VzcyB0YXNrIGl0IGlzIG51bGwpXG5cdCAqL1xuXHRnZXRTY29wZURlZmluaXRpb25JZCgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIElmIHRoaXMgdGFzayBydW5zIGluIHRoZSBjb250ZXh0IG9mIGEgY2FzZSBhbmQgc3RhZ2UsIHRoaXMgbWV0aG9kIHJldHVybnMgaXQncyBjbG9zZXN0IHBhcmVudCBzdGFnZSBpbnN0YW5jZSBpZCAodGhlIHN0YWdlIHBsYW4gaXRlbSBpbnN0YW5jZSBpZCB0byBiZVxuXHQgKiBwcmVjaXNlKS4gRXZlbiBpZiB0aGUgZGlyZWN0IHBhcmVudCBvZiB0aGUgdGFzayBpcyBhIHByb2Nlc3Mgd2hpY2ggaXRzZWxmIG1pZ2h0IGhhdmUgYmVlbiBjcmVhdGVkIG91dCBvZiBhIHByb2Nlc3MgdGFzayBvZiBhIGNhc2UsIGl0cyBzdGFnZSBpbnN0YW5jZVxuXHQgKiBpcyByZWZsZWN0ZWQgaW4gdGhlIHRhc2suXG5cdCAqXG5cdCAqIEByZXR1cm4gdGhlIHN0YWdlIGluc3RhbmNlIGlkIHRoaXMgdGFzayBiZWxvbmdzIHRvIG9yIG51bGwsIGlmIHRoaXMgdGFzayBpcyBub3QgcGFydCBvZiBhIGNhc2UgYXQgYWxsIG9yIGlzIG5vdCBhIGNoaWxkIGVsZW1lbnQgb2YgYSBzdGFnZVxuXHQgKi9cblx0Z2V0UHJvcGFnYXRlZFN0YWdlSW5zdGFuY2VJZCgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIFRoZSBzdGF0ZSBvZiB0aGlzIHRhc2tcblx0ICovXG5cdGdldFN0YXRlKCk6IHN0cmluZztcblxuXHQvKiogVGhlIGRhdGUvdGltZSB3aGVuIHRoaXMgdGFzayB3YXMgY3JlYXRlZCAqL1xuXHRnZXRDcmVhdGVUaW1lKCk6IERhdGU7XG5cblx0LyoqIFRoZSBkYXRlL3RpbWUgd2hlbiB0aGlzIHRhc2sgd2FzIHB1dCBpbiBwcm9ncmVzcyAqL1xuXHRnZXRJblByb2dyZXNzU3RhcnRUaW1lKCk6IERhdGU7XG5cblx0LyoqXG5cdCAqIFRoZSB1c2VyIHJlZmVyZW5jZSB0aGF0IHB1dCB0aGlzIHRhc2sgaW4gcHJvZ3Jlc3Ncblx0ICovXG5cdGdldEluUHJvZ3Jlc3NTdGFydGVkQnkoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBUaGUgY2xhaW0gdGltZSBvZiB0aGlzIHRhc2tcblx0ICovXG5cdGdldENsYWltVGltZSgpOiBEYXRlO1xuXG5cdC8qKlxuXHQgKiBUaGUgdXNlciByZWZlcmVuY2UgdGhhdCBjbGFpbWVkIHRoaXMgdGFza1xuXHQgKi9cblx0Z2V0Q2xhaW1lZEJ5KCk6IFN0cmluZztcblxuXHQvKipcblx0ICogVGhlIHN1c3BlbmRlZCB0aW1lIG9mIHRoaXMgdGFza1xuXHQgKi9cblx0Z2V0U3VzcGVuZGVkVGltZSgpOiBEYXRlO1xuXG5cdC8qKlxuXHQgKiBUaGUgdXNlciByZWZlcmVuY2UgdGhhdCBzdXNwZW5kZWQgdGhpcyB0YXNrXG5cdCAqL1xuXHRnZXRTdXNwZW5kZWRCeSgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIFRoZSBpZCBvZiB0aGUgYWN0aXZpdHkgaW4gdGhlIHByb2Nlc3MgZGVmaW5pbmcgdGhpcyB0YXNrIG9yIG51bGwgaWYgdGhpcyBpcyBub3QgcmVsYXRlZCB0byBhIHByb2Nlc3Ncblx0ICovXG5cdGdldFRhc2tEZWZpbml0aW9uS2V5KCk6IHN0cmluZztcblxuXHQvKipcblx0ICogSW4gcHJvZ3Jlc3Mgc3RhcnQgZHVlIGRhdGUgb2YgdGhlIHRhc2suXG5cdCAqL1xuXHRnZXRJblByb2dyZXNzU3RhcnREdWVEYXRlKCk6IERhdGU7XG5cblx0LyoqXG5cdCAqIER1ZSBkYXRlIG9mIHRoZSB0YXNrLlxuXHQgKi9cblx0Z2V0RHVlRGF0ZSgpOiBEYXRlO1xuXG5cdC8qKlxuXHQgKiBUaGUgY2F0ZWdvcnkgb2YgdGhlIHRhc2suIFRoaXMgaXMgYW4gb3B0aW9uYWwgZmllbGQgYW5kIGFsbG93cyB0byAndGFnJyB0YXNrcyBhcyBiZWxvbmdpbmcgdG8gYSBjZXJ0YWluIGNhdGVnb3J5LlxuXHQgKi9cblx0Z2V0Q2F0ZWdvcnkoKTsgc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBUaGUgcGFyZW50IHRhc2sgZm9yIHdoaWNoIHRoaXMgdGFzayBpcyBhIHN1YnRhc2tcblx0ICovXG5cdGdldFBhcmVudFRhc2tJZCgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIFRoZSB0ZW5hbnQgaWRlbnRpZmllciBvZiB0aGlzIHRhc2tcblx0ICovXG5cdGdldFRlbmFudElkKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogVGhlIGZvcm0ga2V5IGZvciB0aGUgdXNlciB0YXNrXG5cdCAqL1xuXHRnZXRGb3JtS2V5KCk6IHN0cmluZztcblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgbG9jYWwgdGFzayB2YXJpYWJsZXMgaWYgcmVxdWVzdGVkIGluIHRoZSB0YXNrIHF1ZXJ5XG5cdCAqL1xuXHRnZXRUYXNrTG9jYWxWYXJpYWJsZXMoKTogTWFwPHN0cmluZywgT2JqZWN0PjtcblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgcHJvY2VzcyB2YXJpYWJsZXMgaWYgcmVxdWVzdGVkIGluIHRoZSB0YXNrIHF1ZXJ5XG5cdCAqL1xuXHRnZXRQcm9jZXNzVmFyaWFibGVzKCk6IE1hcDxzdHJpbmcsIE9iamVjdD47XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIGNhc2UgdmFyaWFibGVzIGlmIHJlcXVlc3RlZCBpbiB0aGUgdGFzayBxdWVyeVxuXHQgKi9cblx0Z2V0Q2FzZVZhcmlhYmxlcygpOiBNYXA8c3RyaW5nLCBPYmplY3Q+O1xuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBpZGVudGl0eSBsaW5rcy5cblx0ICovXG5cdGdldElkZW50aXR5TGlua3MoKTogSWRlbnRpdHlMaW5rSW5mb1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5TGlua0luZm8ge1xuXHRnZXRUeXBlKCk6IHN0cmluZztcblxuXHRnZXRVc2VySWQoKTogc3RyaW5nO1xuXG5cdGdldEdyb3VwSWQoKTogc3RyaW5nO1xuXG5cdGdldFRhc2tJZCgpOiBzdHJpbmc7XG5cblx0Z2V0UHJvY2Vzc0luc3RhbmNlSWQoKTogc3RyaW5nO1xuXG5cdGdldFNjb3BlSWQoKTogc3RyaW5nO1xuXG5cdGdldFN1YlNjb3BlSWQoKTogc3RyaW5nO1xuXG5cdGdldFNjb3BlVHlwZSgpOiBzdHJpbmc7XG5cblx0Z2V0U2NvcGVEZWZpbml0aW9uSWQoKTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5TGluayBleHRlbmRzIElkZW50aXR5TGlua0luZm8ge1xuXG5cdC8qKlxuXHQgKiBUaGUgcHJvY2VzcyBkZWZpbml0aW9uIGlkIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGlkZW50aXR5IGxpbmsuXG5cdCAqL1xuXHRnZXRQcm9jZXNzRGVmaW5pdGlvbklkKCk6IHN0cmluZztcblxufVxuXG5leHBvcnQgZW51bSBEZWxlZ2F0aW9uU3RhdGUge1xuXG5cdC8qKlxuXHQgKiBUaGUgb3duZXIgZGVsZWdhdGVkIHRoZSB0YXNrIGFuZCB3YW50cyB0byByZXZpZXcgdGhlIHJlc3VsdCBhZnRlciB0aGUgYXNzaWduZWUgaGFzIHJlc29sdmVkIHRoZSB0YXNrLiBXaGVuIHRoZSBhc3NpZ25lZSBjb21wbGV0ZXMgdGhlIHRhc2ssIHRoZSB0YXNrIGlzIG1hcmtlZCBhcyB7QGxpbmsgI1JFU09MVkVEfSBhbmQgc2VudCBiYWNrXG5cdCAqIHRvIHRoZSBvd25lci4gV2hlbiB0aGF0IGhhcHBlbnMsIHRoZSBvd25lciBpcyBzZXQgYXMgdGhlIGFzc2lnbmVlIHNvIHRoYXQgdGhlIG93bmVyIGdldHMgdGhpcyB0YXNrIGJhY2sgaW4gdGhlIFRvRG8uXG5cdCAqL1xuXHRQRU5ESU5HLFxuXG5cdC8qKlxuXHQgKiBUaGUgYXNzaWduZWUgaGFzIHJlc29sdmVkIHRoZSB0YXNrLCB0aGUgYXNzaWduZWUgd2FzIHNldCB0byB0aGUgb3duZXIgYWdhaW4gYW5kIHRoZSBvd25lciBub3cgZmluZHMgdGhpcyB0YXNrIGJhY2sgaW4gdGhlIFRvRG8gbGlzdCBmb3IgcmV2aWV3LiBUaGUgb3duZXIgbm93IGlzIGFibGUgdG8gY29tcGxldGUgdGhlIHRhc2suXG5cdCAqL1xuXHRSRVNPTFZFRFxufVxuXG4vKipcbiAqIFdyYXBzIHtAbGluayBUYXNrSW5mb30gdG8gdGhlIGJ1aWxkZXIuXG4gKiBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYXNrQnVpbGRlciB7XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgdGFzayBpbnN0YW5jZSBhY2NvcmRpbmcgdmFsdWVzIHNldCBpbiB0aGUgYnVpbGRlclxuXHQgKiBcblx0ICogQHJldHVybiB0YXNrIGluc3RhbmNlXG5cdCAqL1xuXHRjcmVhdGUoKTogVGFzaztcblxuXHQvKipcblx0ICogREIgaWQgb2YgdGhlIHRhc2suXG5cdCAqL1xuXHRpZChpZDogc3RyaW5nKTogVGFza0J1aWxkZXI7XG5cdGdldElkKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogTmFtZSBvciB0aXRsZSBvZiB0aGUgdGFzay5cblx0ICovXG5cdG5hbWUobmFtZTogc3RyaW5nKTogVGFza0J1aWxkZXI7XG5cdGdldE5hbWUoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBGcmVlIHRleHQgZGVzY3JpcHRpb24gb2YgdGhlIHRhc2suXG5cdCAqL1xuXHRkZXNjcmlwdGlvbihkZXNjcmlwdGlvbjogc3RyaW5nKTogVGFza0J1aWxkZXI7XG5cdGdldERlc2NyaXB0aW9uKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogSW5kaWNhdGlvbiBvZiBob3cgaW1wb3J0YW50L3VyZ2VudCB0aGlzIHRhc2sgaXNcblx0ICovXG5cdHByaW9yaXR5KHByaW9yaXR5OiBudW1iZXIpOiBUYXNrQnVpbGRlcjtcblx0Z2V0UHJpb3JpdHkoKTogbnVtYmVyO1xuXG5cdC8qKlxuXHQgKiBUaGUgdXNlcklkIG9mIHRoZSBwZXJzb24gdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgdGhpcyB0YXNrLlxuXHQgKi9cblx0b3duZXIob3duZXJJZDogc3RyaW5nKTogVGFza0J1aWxkZXI7XG5cdGdldE93bmVyKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogVGhlIHVzZXJJZCBvZiB0aGUgcGVyc29uIHRvIHdoaWNoIHRoaXMgdGFzayBpcyBkZWxlZ2F0ZWQuXG5cdCAqL1xuXHRhc3NpZ25lZShhc3NpZ25lSWQ6IHN0cmluZyk6IFRhc2tCdWlsZGVyO1xuXHRnZXRBc3NpZ25lZSgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIENoYW5nZSBkdWUgZGF0ZSBvZiB0aGUgdGFzay5cblx0ICovXG5cdGR1ZURhdGUoZHVlRGF0ZTogRGF0ZSk6IFRhc2tCdWlsZGVyO1xuXHRnZXREdWVEYXRlKCk6IERhdGU7XG5cblx0LyoqXG5cdCAqIENoYW5nZSB0aGUgY2F0ZWdvcnkgb2YgdGhlIHRhc2suIFRoaXMgaXMgYW4gb3B0aW9uYWwgZmllbGQgYW5kIGFsbG93cyB0byAndGFnJyB0YXNrcyBhcyBiZWxvbmdpbmcgdG8gYSBjZXJ0YWluIGNhdGVnb3J5LlxuXHQgKi9cblx0Y2F0ZWdvcnkoY2F0ZWdvcnk6IHN0cmluZyk6IFRhc2tCdWlsZGVyO1xuXHRnZXRDYXRlZ29yeSgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIHRoZSBwYXJlbnQgdGFzayBmb3Igd2hpY2ggdGhpcyB0YXNrIGlzIGEgc3VidGFza1xuXHQgKi9cblx0cGFyZW50VGFza0lkKHBhcmVudFRhc2tJZDogc3RyaW5nKTogVGFza0J1aWxkZXI7XG5cdGdldFBhcmVudFRhc2tJZCgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIENoYW5nZSB0aGUgdGVuYW50SWQgb2YgdGhlIHRhc2tcblx0ICovXG5cdHRlbmFudElkKHRlbmFudElkOiBzdHJpbmcpOiBUYXNrQnVpbGRlcjtcblx0Z2V0VGVuYW50SWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBDaGFuZ2UgdGhlIGZvcm0ga2V5IG9mIHRoZSB0YXNrXG5cdCAqL1xuXHRmb3JtS2V5KGZvcm1LZXk6IHN0cmluZyk6IFRhc2tCdWlsZGVyO1xuXHRnZXRGb3JtS2V5KCk6IHN0cmluZztcblxuXHQvKipcblx0ICogdGFzayBkZWZpbml0aW9uIGlkIHRvIGNyZWF0ZSB0YXNrIGZyb21cblx0ICovXG5cdHRhc2tEZWZpbml0aW9uSWQodGFza0RlZmluaXRpb25JZDogc3RyaW5nKTogVGFza0J1aWxkZXI7XG5cdGdldFRhc2tEZWZpbml0aW9uSWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiB0YXNrIGRlZmluaXRpb24ga2V5IHRvIGNyZWF0ZSB0YXNrIGZyb21cblx0ICovXG5cdHRhc2tEZWZpbml0aW9uS2V5KHRhc2tEZWZpbml0aW9uS2V5OiBzdHJpbmcpOiBUYXNrQnVpbGRlcjtcblx0Z2V0VGFza0RlZmluaXRpb25LZXkoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBhZGQgaWRlbnRpdHkgbGlua3MgdG8gdGhlIHRhc2tcblx0ICovXG5cdGlkZW50aXR5TGlua3MoaWRlbnRpdHlMaW5rczogU2V0PElkZW50aXR5TGlua0luZm8+KTogVGFza0J1aWxkZXI7XG5cdGdldElkZW50aXR5TGlua3MoKTogU2V0PElkZW50aXR5TGlua0luZm8+O1xuXG5cdC8qKlxuXHQgKiBhZGQgdGFzayBzY29wZUlkXG5cdCAqL1xuXHRzY29wZUlkKHNjb3BlSWQ6IHN0cmluZyk6IFRhc2tCdWlsZGVyO1xuXHRnZXRTY29wZUlkKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogQWRkIHNjb3BlIHR5cGVcblx0ICovXG5cdHNjb3BlVHlwZShzY29wZVR5cGU6IHN0cmluZyk6IFRhc2tCdWlsZGVyO1xuXHRnZXRTY29wZVR5cGUoKTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1JbmZvIHtcblxuXHRnZXRJZCgpOiBzdHJpbmc7XG5cblx0c2V0SWQoaWQ6IHN0cmluZyk6IHZvaWQ7XG5cblx0Z2V0TmFtZSgpOiBzdHJpbmc7XG5cblx0c2V0TmFtZShuYW1lOiBzdHJpbmcpOiB2b2lkO1xuXG5cdGdldERlc2NyaXB0aW9uKCk6IHN0cmluZztcblxuXHRzZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbjogc3RyaW5nKTogdm9pZDtcblxuXHRnZXRLZXkoKTogc3RyaW5nO1xuXG5cdHNldEtleShrZXk6IHN0cmluZyk6IHZvaWQ7XG5cblx0Z2V0VmVyc2lvbigpOiBudW1iZXI7XG5cblx0c2V0VmVyc2lvbih2ZXJzaW9uOiBudW1iZXIpOiB2b2lkO1xuXG5cdGdldEZvcm1Nb2RlbCgpOiBhbnk7XG5cblx0c2V0Rm9ybU1vZGVsKGZvcm1Nb2RlbDogYW55KTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWYWx1ZUZpZWxkcyB7XG5cblx0LyoqXG5cdCAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlXG5cdCAqL1xuXHRnZXROYW1lKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogQHJldHVybiB0aGUgcHJvY2VzcyBpbnN0YW5jZSBpZCBvZiB0aGUgdmFyaWFibGVcblx0ICovXG5cdGdldFByb2Nlc3NJbnN0YW5jZUlkKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogQHJldHVybiB0aGUgZXhlY3V0aW9uIGlkIG9mIHRoZSB2YXJpYWJsZVxuXHQgKi9cblx0Z2V0RXhlY3V0aW9uSWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBAcmV0dXJuIHRoZSBzY29wZSBpZCBvZiB0aGUgdmFyaWFibGVcblx0ICovXG5cdGdldFNjb3BlSWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBAcmV0dXJuIHRoZSBzdWIgc2NvcGUgaWQgb2YgdGhlIHZhcmlhYmxlXG5cdCAqL1xuXHRnZXRTdWJTY29wZUlkKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogQHJldHVybiB0aGUgc2NvcGUgdHlwZSBvZiB0aGUgdmFyaWFibGVcblx0ICovXG5cdGdldFNjb3BlVHlwZSgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIEByZXR1cm4gdGhlIHRhc2sgaWQgb2YgdGhlIHZhcmlhYmxlXG5cdCAqL1xuXHRnZXRUYXNrSWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBAcmV0dXJuIHRoZSBmaXJzdCB0ZXh0IHZhbHVlLCBpZiBhbnksIG9yIG51bGwuXG5cdCAqL1xuXHRnZXRUZXh0VmFsdWUoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBmaXJzdCB0ZXh0IHZhbHVlLiBBIHZhbHVlIG9mIG51bGwgaXMgYWxsb3dlZC5cblx0ICovXG5cdHNldFRleHRWYWx1ZSh0ZXh0VmFsdWU6IHN0cmluZyk6IHZvaWQ7XG5cblx0LyoqXG5cdCAqIEByZXR1cm4gdGhlIHNlY29uZCB0ZXh0IHZhbHVlLCBpZiBhbnksIG9yIG51bGwuXG5cdCAqL1xuXHRnZXRUZXh0VmFsdWUyKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogU2V0cyBzZWNvbmQgdGV4dCB2YWx1ZS4gQSB2YWx1ZSBvZiBudWxsIGlzIGFsbG93ZWQuXG5cdCAqL1xuXHRzZXRUZXh0VmFsdWUyKHRleHRWYWx1ZTI6IHN0cmluZyk6IHZvaWQ7XG5cblx0LyoqXG5cdCAqIEByZXR1cm4gdGhlIGxvbmcgdmFsdWUsIGlmIGFueSwgb3IgbnVsbC5cblx0ICovXG5cdGdldExvbmdWYWx1ZSgpOiBudW1iZXI7XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGxvbmcgdmFsdWUuIEEgdmFsdWUgb2YgbnVsbCBpcyBhbGxvd2VkLlxuXHQgKi9cblx0c2V0TG9uZ1ZhbHVlKGxvbmdWYWx1ZTogbnVtYmVyKTogdm9pZDtcblxuXHQvKipcblx0ICogQHJldHVybiB0aGUgZG91YmxlIHZhbHVlLCBpZiBhbnksIG9yIG51bGwuXG5cdCAqL1xuXHRnZXREb3VibGVWYWx1ZSgpOiBudW1iZXI7XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGRvdWJsZSB2YWx1ZS4gQSB2YWx1ZSBvZiBudWxsIGlzIGFsbG93ZWQuXG5cdCAqL1xuXHRzZXREb3VibGVWYWx1ZShkb3VibGVWYWx1ZTogbnVtYmVyKTogdm9pZDtcblxuXHQvKipcblx0ICogQHJldHVybiB0aGUgYnl0ZSBhcnJheSB2YWx1ZSwgaWYgYW55LCBvciBudWxsLlxuXHQgKi9cblx0Z2V0Qnl0ZXMoKTogYW55W107XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGJ5dGUgYXJyYXkgdmFsdWUuIEEgdmFsdWUgb2YgbnVsbCBpcyBhbGxvd2VkLlxuXHQgKi9cblx0c2V0Qnl0ZXMoYnl0ZXM6IGFueVtdKTogdm9pZDtcblxuXHRnZXRDYWNoZWRWYWx1ZSgpOiBhbnk7XG5cblx0c2V0Q2FjaGVkVmFsdWUoY2FjaGVkVmFsdWU6IGFueSk6IHZvaWQ7XG5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBWYXJpYWJsZUluc3RhbmNlIGV4dGVuZHMgVmFsdWVGaWVsZHMge1xuXG5cdGdldElkKCk6IHN0cmluZztcblxuXHRzZXRJZChpZDogc3RyaW5nKTogdm9pZDtcblxuXHRzZXROYW1lKG5hbWU6IHN0cmluZyk6IHZvaWQ7XG5cblx0c2V0RXhlY3V0aW9uSWQoZXhlY3V0aW9uSWQ6IHN0cmluZyk6IHZvaWQ7XG5cblx0c2V0UHJvY2Vzc0luc3RhbmNlSWQocHJvY2Vzc0luc3RhbmNlSWQ6IHN0cmluZyk6IHZvaWQ7XG5cblx0c2V0UHJvY2Vzc0RlZmluaXRpb25JZChwcm9jZXNzRGVmaW5pdGlvbklkOiBzdHJpbmcpOiB2b2lkO1xuXG5cdGdldFByb2Nlc3NEZWZpbml0aW9uSWQoKTogc3RyaW5nO1xuXG5cdGdldFZhbHVlKCk6IGFueTtcblxuXHRzZXRWYWx1ZSh2YWx1ZTogYW55KTogdm9pZDtcblxuXHRnZXRUeXBlTmFtZSgpOiBzdHJpbmc7XG5cblx0c2V0VHlwZU5hbWUodHlwZU5hbWU6IHN0cmluZyk6IHZvaWQ7XG5cblx0aXNSZWFkT25seSgpOiBib29sZWFuO1xuXG5cdHNldFRhc2tJZCh0YXNrSWQ6IHN0cmluZyk6IHZvaWQ7XG5cblx0c2V0U2NvcGVJZChzY29wZUlkOiBzdHJpbmcpOiB2b2lkO1xuXG5cdHNldFN1YlNjb3BlSWQoc3ViU2NvcGVJZDogc3RyaW5nKTogdm9pZDtcblxuXHRzZXRTY29wZVR5cGUoc2NvcGVUeXBlOiBzdHJpbmcpOiB2b2lkO1xuXG5cdHNldFNjb3BlRGVmaW5pdGlvbklkKHNjb3BlRGVmaW5pdGlvbklkOiBzdHJpbmcpOiB2b2lkO1xuXG5cdGdldFNjb3BlRGVmaW5pdGlvbklkKCk6IHN0cmluZztcblxuXHRnZXRNZXRhSW5mbygpOiBzdHJpbmc7XG5cblx0c2V0TWV0YUluZm8obWV0YUluZm86IHN0cmluZyk6IHZvaWQ7XG5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBEYXRhT2JqZWN0IHtcblxuXHQvKipcblx0ICogVGhlIHVuaXF1ZSBpZCBvZiB0aGlzIERhdGEgT2JqZWN0LlxuXHQgKi9cblx0Z2V0SWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgLyoqXG5cdCAqIFRoZSBpZCBvZiB0aGUgcHJvY2VzcyBpbnN0YW5jZSB0aGF0IHRoaXMgRGF0YSBPYmplY3QgaXMgYXNzb2NpYXRlZCB3aXRoLlxuXHQgKi9cblx0Z2V0UHJvY2Vzc0luc3RhbmNlSWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBUaGUgaWQgb2YgdGhlIGV4ZWN1dGlvbiBpbiB3aGljaCB0aGlzIERhdGEgT2JqZWN0IHJlc2lkZXMuIEEgRGF0YU9iamVjdCBvbmx5IHJlc2lkZXMgb24gYSBwcm9jZXNzIGluc3RhbmNlXG5cdCAqIGV4ZWN1dGlvbiBvciBhIHN1YnByb2Nlc3MgZXhlY3V0aW9uLlxuXHQgKi9cblx0Z2V0RXhlY3V0aW9uSWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBOYW1lIG9mIHRoZSBEYXRhT2JqZWN0LlxuXHQgKi9cblx0Z2V0TmFtZSgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIExvY2FsaXplZCBOYW1lIG9mIHRoZSBEYXRhT2JqZWN0LlxuXHQgKi9cblx0Z2V0TG9jYWxpemVkTmFtZSgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIERlc2NyaXB0aW9uIG9mIHRoZSBEYXRhT2JqZWN0LlxuXHQgKi9cblx0Z2V0RGVzY3JpcHRpb24oKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBWYWx1ZSBvZiB0aGUgRGF0YU9iamVjdC5cblx0ICovXG5cdGdldFZhbHVlKCk6IGFueTtcblxuXHQvKipcblx0ICogVHlwZSBvZiB0aGUgRGF0YU9iamVjdC5cblx0ICovXG5cdGdldFR5cGUoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBUaGUgaWQgb2YgdGhlIGZsb3cgZWxlbWVudCBpbiB0aGUgcHJvY2VzcyBkZWZpbmluZyB0aGlzIGRhdGEgb2JqZWN0LlxuXHQgKi9cblx0Z2V0RGF0YU9iamVjdERlZmluaXRpb25LZXkoKTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbW1lbnQge1xuXG5cdC8qKiB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBjb21tZW50ICovXG5cdGdldElkKCk6IHN0cmluZztcblxuXHQvKiogcmVmZXJlbmNlIHRvIHRoZSB1c2VyIHRoYXQgbWFkZSB0aGUgY29tbWVudCAqL1xuXHRnZXRVc2VySWQoKTogc3RyaW5nO1xuXG5cdHNldFVzZXJJZCh1c2VySWQ6IHN0cmluZyk6IHZvaWQ7XG5cblx0Z2V0VGltZSgpOiBEYXRlO1xuXG5cdHNldFRpbWUodGltZTogRGF0ZSk7XG5cblx0LyoqIHJlZmVyZW5jZSB0byB0aGUgdGFzayBvbiB3aGljaCB0aGlzIGNvbW1lbnQgd2FzIG1hZGUgKi9cblx0Z2V0VGFza0lkKCk6IHN0cmluZztcblxuXHRzZXRUYXNrSWQodGFza0lkOiBzdHJpbmcpOiB2b2lkO1xuXG5cdC8qKiByZWZlcmVuY2UgdG8gdGhlIHByb2Nlc3MgaW5zdGFuY2Ugb24gd2hpY2ggdGhpcyBjb21tZW50IHdhcyBtYWRlICovXG5cdGdldFByb2Nlc3NJbnN0YW5jZUlkKCk6IHN0cmluZztcblxuXHRzZXRQcm9jZXNzSW5zdGFuY2VJZChwcm9jZXNzSW5zdGFuY2VJZDogc3RyaW5nKTogdm9pZDtcblxuXHQvKiogcmVmZXJlbmNlIHRvIHRoZSB0eXBlIGdpdmVuIHRvIHRoZSBjb21tZW50ICovXG5cdGdldFR5cGUoKTogc3RyaW5nO1xuXG5cdHNldFR5cGUodHlwZTogc3RyaW5nKTogdm9pZDtcblxuXHQvKipcblx0ICogdGhlIGZ1bGwgY29tbWVudCBtZXNzYWdlIHRoZSB1c2VyIGhhZCByZWxhdGVkIHRvIHRoZSB0YXNrIGFuZC9vciBwcm9jZXNzIGluc3RhbmNlXG5cdCAqIFxuXHQgKiBAc2VlIFRhc2tTZXJ2aWNlI2dldFRhc2tDb21tZW50cyhTdHJpbmcpXG5cdCAqL1xuXHRnZXRGdWxsTWVzc2FnZSgpOiBzdHJpbmc7XG5cblx0c2V0RnVsbE1lc3NhZ2UoZnVsbE1lc3NhZ2U6IHN0cmluZyk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFza0V2ZW50IHtcblxuXHQvKiogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXZlbnQgKi9cblx0Z2V0SWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgdGhlIHR5cGUgb2Ygb2YgYWN0aW9uIGFuZCBhbHNvIGluZGljYXRlcyB0aGUgbWVhbmluZyBvZiB0aGUgcGFydHMgYXMgZXhwb3NlZCBpbiB7QGxpbmsgI2dldE1lc3NhZ2VQYXJ0cygpfVxuXHQgKi9cblx0Z2V0QWN0aW9uKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogVGhlIG1lYW5pbmcgb2YgdGhlIG1lc3NhZ2UgcGFydHMgaXMgZGVmaW5lZCBieSB0aGUgYWN0aW9uIGFzIHlvdSBjYW4gZmluZCBpbiB7QGxpbmsgI2dldEFjdGlvbigpfVxuXHQgKi9cblx0Z2V0TWVzc2FnZVBhcnRzKCk6IHN0cmluZ1tdO1xuXG5cdC8qKlxuXHQgKiBUaGUgbWVzc2FnZSB0aGF0IGNhbiBiZSB1c2VkIGluIGNhc2UgdGhpcyBhY3Rpb24gb25seSBoYXMgYSBzaW5nbGUgbWVzc2FnZSBwYXJ0LlxuXHQgKi9cblx0Z2V0TWVzc2FnZSgpOiBzdHJpbmc7XG5cblx0LyoqIHJlZmVyZW5jZSB0byB0aGUgdXNlciB0aGF0IG1hZGUgdGhlIGNvbW1lbnQgKi9cblx0Z2V0VXNlcklkKCk6IHN0cmluZztcblxuXHQvKiogdGltZSBhbmQgZGF0ZSB3aGVuIHRoZSB1c2VyIG1hZGUgdGhlIGNvbW1lbnQgKi9cblx0Z2V0VGltZSgpOiBEYXRlO1xuXG5cdC8qKiByZWZlcmVuY2UgdG8gdGhlIHRhc2sgb24gd2hpY2ggdGhpcyBjb21tZW50IHdhcyBtYWRlICovXG5cdGdldFRhc2tJZCgpOiBzdHJpbmc7XG5cblx0LyoqIHJlZmVyZW5jZSB0byB0aGUgcHJvY2VzcyBpbnN0YW5jZSBvbiB3aGljaCB0aGlzIGNvbW1lbnQgd2FzIG1hZGUgKi9cblx0Z2V0UHJvY2Vzc0luc3RhbmNlSWQoKTogc3RyaW5nO1xuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXR0YWNobWVudCB7XG5cblx0LyoqIHVuaXF1ZSBpZCBmb3IgdGhpcyBhdHRhY2htZW50ICovXG5cdGdldElkKCk6IHN0cmluZztcblxuXHQvKiogZnJlZSB1c2VyIGRlZmluZWQgc2hvcnQgKG1heCAyNTUgY2hhcnMpIG5hbWUgZm9yIHRoaXMgYXR0YWNobWVudCAqL1xuXHRnZXROYW1lKCk6IHN0cmluZztcblxuXHQvKiogZnJlZSB1c2VyIGRlZmluZWQgc2hvcnQgKG1heCAyNTUgY2hhcnMpIG5hbWUgZm9yIHRoaXMgYXR0YWNobWVudCAqL1xuXHRzZXROYW1lKG5hbWU6IHN0cmluZyk6IHZvaWQ7XG5cblx0LyoqXG5cdCAqIGxvbmcgKG1heCAyNTUgY2hhcnMpIGV4cGxhbmF0aW9uIHdoYXQgdGhpcyBhdHRhY2htZW50IGlzIGFib3V0IGluIGNvbnRleHQgb2YgdGhlIHRhc2sgYW5kL29yIHByb2Nlc3MgaW5zdGFuY2UgaXQncyBsaW5rZWQgdG8uXG5cdCAqL1xuXHRnZXREZXNjcmlwdGlvbigpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIGxvbmcgKG1heCAyNTUgY2hhcnMpIGV4cGxhbmF0aW9uIHdoYXQgdGhpcyBhdHRhY2htZW50IGlzIGFib3V0IGluIGNvbnRleHQgb2YgdGhlIHRhc2sgYW5kL29yIHByb2Nlc3MgaW5zdGFuY2UgaXQncyBsaW5rZWQgdG8uXG5cdCAqL1xuXHRzZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbjogc3RyaW5nKTogdm9pZDtcblxuXHQvKipcblx0ICogaW5kaWNhdGlvbiBvZiB0aGUgdHlwZSBvZiBjb250ZW50IHRoYXQgdGhpcyBhdHRhY2htZW50IHJlZmVycyB0by4gQ2FuIGJlIG1pbWUgdHlwZSBvciBhbnkgb3RoZXIgaW5kaWNhdGlvbi5cblx0ICovXG5cdGdldFR5cGUoKTogc3RyaW5nO1xuXG5cdC8qKiByZWZlcmVuY2UgdG8gdGhlIHRhc2sgdG8gd2hpY2ggdGhpcyBhdHRhY2htZW50IGlzIGFzc29jaWF0ZWQuICovXG5cblx0Z2V0VGFza0lkKCk6IHN0cmluZztcblx0LyoqXG5cdCAqIHJlZmVyZW5jZSB0byB0aGUgcHJvY2VzcyBpbnN0YW5jZSB0byB3aGljaCB0aGlzIGF0dGFjaG1lbnQgaXMgYXNzb2NpYXRlZC5cblx0ICovXG5cdGdldFByb2Nlc3NJbnN0YW5jZUlkKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogdGhlIHJlbW90ZSBVUkwgaW4gY2FzZSB0aGlzIGlzIHJlbW90ZSBjb250ZW50LiBJZiB0aGUgYXR0YWNobWVudCBjb250ZW50IHdhcyB7QGxpbmsgVGFza1NlcnZpY2UjY3JlYXRlQXR0YWNobWVudChTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgamF2YS5pby5JbnB1dFN0cmVhbSkgdXBsb2FkZWQgd2l0aCBhblxuXHQgKiBpbnB1dCBzdHJlYW19LCB0aGVuIHRoaXMgbWV0aG9kIHJldHVybnMgbnVsbCBhbmQgdGhlIGNvbnRlbnQgY2FuIGJlIGZldGNoZWQgd2l0aCB7QGxpbmsgVGFza1NlcnZpY2UjZ2V0QXR0YWNobWVudENvbnRlbnQoU3RyaW5nKX0uXG5cdCAqL1xuXHRnZXRVcmwoKTogc3RyaW5nO1xuXG5cdC8qKiByZWZlcmVuY2UgdG8gdGhlIHVzZXIgd2hvIGNyZWF0ZWQgdGhpcyBhdHRhY2htZW50LiAqL1xuXHRnZXRVc2VySWQoKTogc3RyaW5nO1xuXG5cdC8qKiB0aW1lc3RhbXAgd2hlbiB0aGlzIGF0dGFjaG1lbnQgd2FzIGNyZWF0ZWQgKi9cblx0Z2V0VGltZSgpOiBEYXRlO1xuXG5cdC8qKiB0aW1lc3RhbXAgd2hlbiB0aGlzIGF0dGFjaG1lbnQgd2FzIGNyZWF0ZWQgKi9cblx0c2V0VGltZSh0aW1lOiBEYXRlKTogdm9pZDtcblxuXHQvKiogdGhlIGlkIG9mIHRoZSBieXRlIGFycmF5IGVudGl0eSBzdG9yaW5nIHRoZSBjb250ZW50ICovXG5cdGdldENvbnRlbnRJZCgpOiBzdHJpbmc7XG5cbn1cblxuZXhwb3J0IGVudW0gTnVsbEhhbmRsaW5nT25PcmRlciB7XG5cdE5VTExTX0ZJUlNULCBOVUxMU19MQVNUXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlQcm9wZXJ0eSB7XG5cblx0Z2V0TmFtZSgpOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnk8VCwgVT4ge1xuXG5cdC8qKlxuXHQgKiBPcmRlciB0aGUgcmVzdWx0cyBhc2NlbmRpbmcgb24gdGhlIGdpdmVuIHByb3BlcnR5IGFzIGRlZmluZWQgaW4gdGhpcyBjbGFzcyAobmVlZHMgdG8gY29tZSBhZnRlciBhIGNhbGwgdG8gb25lIG9mIHRoZSBvcmRlckJ5WHh4eCBtZXRob2RzKS5cblx0ICovXG5cdGFzYygpOiBUO1xuXG5cdC8qKlxuXHQgKiBPcmRlciB0aGUgcmVzdWx0cyBkZXNjZW5kaW5nIG9uIHRoZSBnaXZlbiBwcm9wZXJ0eSBhcyBkZWZpbmVkIGluIHRoaXMgY2xhc3MgKG5lZWRzIHRvIGNvbWUgYWZ0ZXIgYSBjYWxsIHRvIG9uZSBvZiB0aGUgb3JkZXJCeVh4eHggbWV0aG9kcykuXG5cdCAqL1xuXHRkZXNjKCk6IFQ7XG5cblx0b3JkZXJCeShwcm9wZXJ0eTogUXVlcnlQcm9wZXJ0eSk6IFQ7XG5cblx0b3JkZXJCeShwcm9wZXJ0eTogUXVlcnlQcm9wZXJ0eSwgbnVsbEhhbmRsaW5nT25PcmRlcjogTnVsbEhhbmRsaW5nT25PcmRlcik6IFQ7XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVzIHRoZSBxdWVyeSBhbmQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHJlc3VsdHNcblx0ICovXG5cdGNvdW50KCk6IG51bWJlcjtcblxuXHQvKipcblx0ICogRXhlY3V0ZXMgdGhlIHF1ZXJ5IGFuZCByZXR1cm5zIHRoZSByZXN1bHRpbmcgZW50aXR5IG9yIG51bGwgaWYgbm8gZW50aXR5IG1hdGNoZXMgdGhlIHF1ZXJ5IGNyaXRlcmlhLlxuXHQgKlxuXHQgKiBAdGhyb3dzIG9yZy5mbG93YWJsZS5jb21tb24uZW5naW5lLmFwaS5GbG93YWJsZUV4Y2VwdGlvbiB3aGVuIHRoZSBxdWVyeSByZXN1bHRzIGluIG1vcmUgdGhhbiBvbmUgZW50aXRpZXMuXG5cdCAqL1xuXHRzaW5nbGVSZXN1bHQoKTogVTtcblxuXHQvKipcblx0ICogRXhlY3V0ZXMgdGhlIHF1ZXJ5IGFuZCBnZXQgYSBsaXN0IG9mIGVudGl0aWVzIGFzIHRoZSByZXN1bHQuXG5cdCAqL1xuXHRsaXN0KCk6IFVbXTtcblxuXHQvKipcblx0ICogRXhlY3V0ZXMgdGhlIHF1ZXJ5IGFuZCBnZXQgYSBsaXN0IG9mIGVudGl0aWVzIGFzIHRoZSByZXN1bHQuXG5cdCAqL1xuXHRsaXN0UGFnZShmaXJzdFJlc3VsdDogbnVtYmVyLCBtYXhSZXN1bHRzOiBudW1iZXIpOiBVW107XG59XG5cblxuZXhwb3J0IGludGVyZmFjZSBUYXNrSW5mb1F1ZXJ5PFQsIFYgZXh0ZW5kcyBUYXNrSW5mbz4gZXh0ZW5kcyBRdWVyeTxULCBWPiB7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggdGhlIGdpdmVuIHRhc2sgaWQgKGluIHByYWN0aWNlLCB0aGVyZSB3aWxsIGJlIG1heGltdW0gb25lIG9mIHRoaXMga2luZClcblx0ICovXG5cdHRhc2tJZCh0YXNrSWQ6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggYW4gaWQgdGhhdCBpcyBpbiB0aGUgZ2l2ZW4gbGlzdFxuXHQgKlxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIFdoZW4gcGFzc2VkIGlkIGxpc3QgaXMgZW1wdHkgb3IgPGNvZGU+bnVsbDwvY29kZT4gb3IgY29udGFpbnMgPGNvZGU+bnVsbCBTdHJpbmc8L2NvZGU+LlxuXHQgKi9cblx0dGFza0lkcyh0YXNrSWRzOiBzdHJpbmdbXSk6IFQ7XG5cblx0LyoqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggdGhlIGdpdmVuIG5hbWUgKi9cblx0dGFza05hbWUobmFtZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2l0aCBhIG5hbWUgdGhhdCBpcyBpbiB0aGUgZ2l2ZW4gbGlzdFxuXHQgKiBcblx0ICogQHRocm93cyBGbG93YWJsZUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICBXaGVuIHBhc3NlZCBuYW1lIGxpc3QgaXMgZW1wdHkgb3IgPGNvZGU+bnVsbDwvY29kZT4gb3IgY29udGFpbnMgPGNvZGU+bnVsbCBTdHJpbmc8L2NvZGU+LlxuXHQgKi9cblx0dGFza05hbWVJbihuYW1lTGlzdDogc3RyaW5nW10pOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aXRoIGEgbmFtZSB0aGF0IGlzIGluIHRoZSBnaXZlbiBsaXN0XG5cdCAqIFxuXHQgKiBUaGlzIG1ldGhvZCwgdW5saWtlIHRoZSB7QGxpbmsgI3Rhc2tOYW1lSW4oQ29sbGVjdGlvbil9IG1ldGhvZCB3aWxsIG5vdCB0YWtlIGluIGFjY291bnQgdGhlIHVwcGVyL2xvd2VyIGNhc2U6IGJvdGggdGhlIGlucHV0IHBhcmFtZXRlcnMgYXMgdGhlIGNvbHVtbiB2YWx1ZSBhcmUgbG93ZXJjYXNlZCB3aGVuIHRoZSBxdWVyeSBpcyBleGVjdXRlZC5cblx0ICogXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgV2hlbiBwYXNzZWQgbmFtZSBsaXN0IGlzIGVtcHR5IG9yIDxjb2RlPm51bGw8L2NvZGU+IG9yIGNvbnRhaW5zIDxjb2RlPm51bGwgU3RyaW5nPC9jb2RlPi5cblx0ICovXG5cdHRhc2tOYW1lSW5JZ25vcmVDYXNlKG5hbWVMaXN0OiBzdHJpbmdbXSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggYSBuYW1lIG1hdGNoaW5nIHRoZSBwYXJhbWV0ZXIuIFRoZSBzeW50YXggaXMgdGhhdCBvZiBTUUw6IGZvciBleGFtcGxlIHVzYWdlOiBuYW1lTGlrZSgldGVzdCUpXG5cdCAqL1xuXHR0YXNrTmFtZUxpa2UobmFtZUxpa2U6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggYSBuYW1lIG1hdGNoaW5nIHRoZSBwYXJhbWV0ZXIuIFRoZSBzeW50YXggaXMgdGhhdCBvZiBTUUw6IGZvciBleGFtcGxlIHVzYWdlOiBuYW1lTGlrZSgldGVzdCUpXG5cdCAqIFxuXHQgKiBUaGlzIG1ldGhvZCwgdW5saWtlIHRoZSB7QGxpbmsgI3Rhc2tOYW1lTGlrZShTdHJpbmcpfSBtZXRob2Qgd2lsbCBub3QgdGFrZSBpbiBhY2NvdW50IHRoZSB1cHBlci9sb3dlciBjYXNlOiBib3RoIHRoZSBpbnB1dCBwYXJhbWV0ZXIgYXMgdGhlIGNvbHVtbiB2YWx1ZSBhcmUgbG93ZXJjYXNlZCB3aGVuIHRoZSBxdWVyeSBpc1xuXHQgKiBleGVjdXRlZC5cblx0ICovXG5cdHRhc2tOYW1lTGlrZUlnbm9yZUNhc2UobmFtZUxpa2U6IHN0cmluZyk6IFQ7XG5cblx0LyoqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggdGhlIGdpdmVuIGRlc2NyaXB0aW9uLiAqL1xuXHR0YXNrRGVzY3JpcHRpb24oZGVzY3JpcHRpb246IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggYSBkZXNjcmlwdGlvbiBtYXRjaGluZyB0aGUgcGFyYW1ldGVyIC4gVGhlIHN5bnRheCBpcyB0aGF0IG9mIFNRTDogZm9yIGV4YW1wbGUgdXNhZ2U6IGRlc2NyaXB0aW9uTGlrZSgldGVzdCUpXG5cdCAqL1xuXHR0YXNrRGVzY3JpcHRpb25MaWtlKGRlc2NyaXB0aW9uTGlrZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2l0aCBhIGRlc2NyaXB0aW9uIG1hdGNoaW5nIHRoZSBwYXJhbWV0ZXIgLiBUaGUgc3ludGF4IGlzIHRoYXQgb2YgU1FMOiBmb3IgZXhhbXBsZSB1c2FnZTogZGVzY3JpcHRpb25MaWtlKCV0ZXN0JSlcblx0ICogXG5cdCAqIFRoaXMgbWV0aG9kLCB1bmxpa2UgdGhlIHtAbGluayAjdGFza0Rlc2NyaXB0aW9uTGlrZShTdHJpbmcpfSBtZXRob2Qgd2lsbCBub3QgdGFrZSBpbiBhY2NvdW50IHRoZSB1cHBlci9sb3dlciBjYXNlOiBib3RoIHRoZSBpbnB1dCBwYXJhbWV0ZXIgYXMgdGhlIGNvbHVtbiB2YWx1ZSBhcmUgbG93ZXJjYXNlZCB3aGVuIHRoZSBxdWVyeSBpc1xuXHQgKiBleGVjdXRlZC5cblx0ICovXG5cdHRhc2tEZXNjcmlwdGlvbkxpa2VJZ25vcmVDYXNlKGRlc2NyaXB0aW9uTGlrZTogc3RyaW5nKTogVDtcblxuXHQvKiogT25seSBzZWxlY3QgdGFza3Mgd2l0aCB0aGUgZ2l2ZW4gcHJpb3JpdHkuICovXG5cdHRhc2tQcmlvcml0eShwcmlvcml0eTogbnVtYmVyKTogVDtcblxuXHQvKiogT25seSBzZWxlY3QgdGFza3Mgd2l0aCB0aGUgZ2l2ZW4gcHJpb3JpdHkgb3IgaGlnaGVyLiAqL1xuXHR0YXNrTWluUHJpb3JpdHkobWluUHJpb3JpdHk6IG51bWJlcik6IFQ7XG5cblx0LyoqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggdGhlIGdpdmVuIHByaW9yaXR5IG9yIGxvd2VyLiAqL1xuXHR0YXNrTWF4UHJpb3JpdHkobWF4UHJpb3JpdHk6IG51bWJlcik6IFQ7XG5cblx0LyoqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGFyZSBhc3NpZ25lZCB0byB0aGUgZ2l2ZW4gdXNlci4gKi9cblx0dGFza0Fzc2lnbmVlKGFzc2lnbmVlOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCB3ZXJlIGxhc3QgYXNzaWduZWQgdG8gYW4gYXNzaWduZWUgbGlrZSB0aGUgZ2l2ZW4gdmFsdWUuIFRoZSBzeW50YXggdGhhdCBzaG91bGQgYmUgdXNlZCBpcyB0aGUgc2FtZSBhcyBpbiBTUUwsIGVnLiAldGVzdCUuXG5cdCAqL1xuXHR0YXNrQXNzaWduZWVMaWtlKGFzc2lnbmVlTGlrZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggd2VyZSBsYXN0IGFzc2lnbmVkIHRvIGFuIGFzc2lnbmVlIGxpa2UgdGhlIGdpdmVuIHZhbHVlLiBUaGUgc3ludGF4IHRoYXQgc2hvdWxkIGJlIHVzZWQgaXMgdGhlIHNhbWUgYXMgaW4gU1FMLCBlZy4gJXRlc3QlLlxuXHQgKiBcblx0ICogVGhpcyBtZXRob2QsIHVubGlrZSB0aGUge0BsaW5rICN0YXNrQXNzaWduZWVMaWtlKFN0cmluZyl9IG1ldGhvZCB3aWxsIG5vdCB0YWtlIGluIGFjY291bnQgdGhlIHVwcGVyL2xvd2VyIGNhc2U6IGJvdGggdGhlIGlucHV0IHBhcmFtZXRlciBhcyB0aGUgY29sdW1uIHZhbHVlIGFyZSBsb3dlcmNhc2VkIHdoZW4gdGhlIHF1ZXJ5IGlzXG5cdCAqIGV4ZWN1dGVkLlxuXHQgKi9cblx0dGFza0Fzc2lnbmVlTGlrZUlnbm9yZUNhc2UoYXNzaWduZWVMaWtlSWdub3JlQ2FzZTogc3RyaW5nKTogVDtcblxuXHQvKiogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggZG9uJ3QgaGF2ZSBhbiBhc3NpZ25lZS4gKi9cblx0dGFza1VuYXNzaWduZWQoKTogVDtcblxuXHQvKiogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggYXJlIGFzc2lnbmVkIHRvIGFueSB1c2VyICovXG5cdHRhc2tBc3NpZ25lZCgpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aXRoIGFuIGFzc2lnbmVlIHRoYXQgaXMgaW4gdGhlIGdpdmVuIGxpc3Rcblx0ICogXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgV2hlbiBwYXNzZWQgbmFtZSBsaXN0IGlzIGVtcHR5IG9yIDxjb2RlPm51bGw8L2NvZGU+IG9yIGNvbnRhaW5zIDxjb2RlPm51bGwgU3RyaW5nPC9jb2RlPi5cblx0ICovXG5cdHRhc2tBc3NpZ25lZUlkcyhhc3NpZ25lZUxpc3RJZHM6IHN0cmluZ1tdKTogVDtcblxuXHQvKiogT25seSBzZWxlY3QgdGFza3MgZm9yIHdoaWNoIHRoZSBnaXZlbiB1c2VyIGlzIHRoZSBvd25lci4gKi9cblx0dGFza093bmVyKG93bmVyOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCB3ZXJlIGxhc3QgYXNzaWduZWQgdG8gYW4gb3duZXIgbGlrZSB0aGUgZ2l2ZW4gdmFsdWUuIFRoZSBzeW50YXggdGhhdCBzaG91bGQgYmUgdXNlZCBpcyB0aGUgc2FtZSBhcyBpbiBTUUwsIGVnLiAldGVzdCUuXG5cdCAqL1xuXHR0YXNrT3duZXJMaWtlKG93bmVyTGlrZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggd2VyZSBsYXN0IGFzc2lnbmVkIHRvIGFuIG93bmVyIGxpa2UgdGhlIGdpdmVuIHZhbHVlLiBUaGUgc3ludGF4IHRoYXQgc2hvdWxkIGJlIHVzZWQgaXMgdGhlIHNhbWUgYXMgaW4gU1FMLCBlZy4gJXRlc3QlLlxuXHQgKiBcblx0ICogVGhpcyBtZXRob2QsIHVubGlrZSB0aGUge0BsaW5rICN0YXNrT3duZXJMaWtlKFN0cmluZyl9IG1ldGhvZCB3aWxsIG5vdCB0YWtlIGluIGFjY291bnQgdGhlIHVwcGVyL2xvd2VyIGNhc2U6IGJvdGggdGhlIGlucHV0IHBhcmFtZXRlciBhcyB0aGUgY29sdW1uIHZhbHVlIGFyZSBsb3dlcmNhc2VkIHdoZW4gdGhlIHF1ZXJ5IGlzXG5cdCAqIGV4ZWN1dGVkLlxuXHQgKi9cblx0dGFza093bmVyTGlrZUlnbm9yZUNhc2Uob3duZXJMaWtlSWdub3JlQ2FzZTogc3RyaW5nKTogVDtcblxuXHQvKiogT25seSBzZWxlY3QgdGFza3MgZm9yIHdoaWNoIHRoZSBnaXZlbiB1c2VyIGlzIGEgY2FuZGlkYXRlLiAqL1xuXHR0YXNrQ2FuZGlkYXRlVXNlcihjYW5kaWRhdGVVc2VyOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyBmb3Igd2hpY2ggdGhlcmUgZXhpc3QgYW4ge0BsaW5rIElkZW50aXR5TGlua30gd2l0aCB0aGUgZ2l2ZW4gdXNlciwgaW5jbHVkaW5nIHRhc2tzIHdoaWNoIGhhdmUgYmVlbiBhc3NpZ25lZCB0byB0aGUgZ2l2ZW4gdXNlciAoYXNzaWduZWUpIG9yIG93bmVkIGJ5IHRoZSBnaXZlbiB1c2VyIChvd25lcikuXG5cdCAqL1xuXHR0YXNrSW52b2x2ZWRVc2VyKGludm9sdmVkVXNlcjogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3MgZm9yIHdoaWNoIHRoZXJlIGV4aXN0IGFuIHtAbGluayBJZGVudGl0eUxpbmt9IHdpdGggdGhlIGdpdmVuIEdyb3Vwcy5cblx0ICovXG5cdHRhc2tJbnZvbHZlZEdyb3VwcyhpbnZvbHZlZEdyb3VwOiBzdHJpbmdbXSk6IFQ7XG5cblx0LyoqXG5cdCAqIEFsbG93cyB0byBzZWxlY3QgYSB0YXNrIHVzaW5nIHtAbGluayAjdGFza0NhbmRpZGF0ZUdyb3VwKFN0cmluZyl9IHtAbGluayAjdGFza0NhbmRpZGF0ZUdyb3VwSW4oQ29sbGVjdGlvbil9IG9yIHtAbGluayAjdGFza0NhbmRpZGF0ZVVzZXIoU3RyaW5nKX0gYnV0IGlnbm9yZSB0aGUgYXNzaWduZWUgdmFsdWUgaW5zdGVhZCBvZiBxdWVyeWluZyBmb3IgYW4gZW1wdHkgYXNzaWduZWUuXG5cdCAqL1xuXHRpZ25vcmVBc3NpZ25lZVZhbHVlKCk6IFQ7XG5cblx0LyoqIE9ubHkgc2VsZWN0IHRhc2tzIGZvciB3aGljaCB1c2VycyBpbiB0aGUgZ2l2ZW4gZ3JvdXAgYXJlIGNhbmRpZGF0ZXMuICovXG5cdHRhc2tDYW5kaWRhdGVHcm91cChjYW5kaWRhdGVHcm91cDogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3MgZm9yIHdoaWNoIHRoZSAnY2FuZGlkYXRlR3JvdXAnIGlzIG9uZSBvZiB0aGUgZ2l2ZW4gZ3JvdXBzLlxuXHQgKiBcblx0ICogQHRocm93cyBGbG93YWJsZUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICBXaGVuIHF1ZXJ5IGlzIGV4ZWN1dGVkIGFuZCB7QGxpbmsgI3Rhc2tDYW5kaWRhdGVHcm91cChTdHJpbmcpfSBvciB7QGxpbmsgI3Rhc2tDYW5kaWRhdGVVc2VyKFN0cmluZyl9IGhhcyBiZWVuIGV4ZWN1dGVkIG9uIHRoZSBxdWVyeSBpbnN0YW5jZS4gV2hlbiBwYXNzZWQgZ3JvdXAgbGlzdCBpcyBlbXB0eSBvclxuXHQgKiAgICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi5cblx0ICovXG5cdHRhc2tDYW5kaWRhdGVHcm91cEluKGNhbmRpZGF0ZUdyb3Vwczogc3RyaW5nW10pOiBUXG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHRoYXQgaGF2ZSB0aGUgZ2l2ZW4gdGVuYW50IGlkLlxuXHQgKi9cblx0dGFza1RlbmFudElkKHRlbmFudElkOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aXRoIGEgdGVuYW50IGlkIGxpa2UgdGhlIGdpdmVuIG9uZS5cblx0ICovXG5cdHRhc2tUZW5hbnRJZExpa2UodGVuYW50SWRMaWtlOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB0aGF0IGRvIG5vdCBoYXZlIGEgdGVuYW50IGlkLlxuXHQgKi9cblx0dGFza1dpdGhvdXRUZW5hbnRJZCgpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyBmb3IgdGhlIGdpdmVuIHByb2Nlc3MgaW5zdGFuY2UgaWQuXG5cdCAqL1xuXHRwcm9jZXNzSW5zdGFuY2VJZChwcm9jZXNzSW5zdGFuY2VJZDogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3MgZm9yIHRoZSBnaXZlbiBwcm9jZXNzIGlkcy5cblx0ICovXG5cdHByb2Nlc3NJbnN0YW5jZUlkSW4ocHJvY2Vzc0luc3RhbmNlSWRzOiBzdHJpbmdbXSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGhvdXQgYSBwcm9jZXNzIGluc3RhbmNlIGlkLlxuXHQgKi9cblx0d2l0aG91dFByb2Nlc3NJbnN0YW5jZUlkKCk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIGZvciB0aGUgZ2l2ZW4gYnVzaW5lc3Mga2V5XG5cdCAqL1xuXHRwcm9jZXNzSW5zdGFuY2VCdXNpbmVzc0tleShwcm9jZXNzSW5zdGFuY2VCdXNpbmVzc0tleTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2l0aCBhIGJ1c2luZXNzIGtleSBsaWtlIHRoZSBnaXZlbiB2YWx1ZSBUaGUgc3ludGF4IGlzIHRoYXQgb2YgU1FMOiBmb3IgZXhhbXBsZSB1c2FnZTogcHJvY2Vzc0luc3RhbmNlQnVzaW5lc3NLZXlMaWtlKFwiJXRlc3QlXCIpLlxuXHQgKi9cblx0cHJvY2Vzc0luc3RhbmNlQnVzaW5lc3NLZXlMaWtlKHByb2Nlc3NJbnN0YW5jZUJ1c2luZXNzS2V5TGlrZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2l0aCBhIGJ1c2luZXNzIGtleSBsaWtlIHRoZSBnaXZlbiB2YWx1ZSBUaGUgc3ludGF4IGlzIHRoYXQgb2YgU1FMOiBmb3IgZXhhbXBsZSB1c2FnZTogcHJvY2Vzc0luc3RhbmNlQnVzaW5lc3NLZXlMaWtlKFwiJXRlc3QlXCIpLlxuXHQgKiBcblx0ICogVGhpcyBtZXRob2QsIHVubGlrZSB0aGUge0BsaW5rICNwcm9jZXNzSW5zdGFuY2VCdXNpbmVzc0tleUxpa2UoU3RyaW5nKX0gbWV0aG9kIHdpbGwgbm90IHRha2UgaW4gYWNjb3VudCB0aGUgdXBwZXIvbG93ZXIgY2FzZTogYm90aCB0aGUgaW5wdXQgcGFyYW1ldGVyIGFzIHRoZSBjb2x1bW4gdmFsdWUgYXJlIGxvd2VyY2FzZWQgd2hlblxuXHQgKiB0aGUgcXVlcnkgaXMgZXhlY3V0ZWQuXG5cdCAqL1xuXHRwcm9jZXNzSW5zdGFuY2VCdXNpbmVzc0tleUxpa2VJZ25vcmVDYXNlKHByb2Nlc3NJbnN0YW5jZUJ1c2luZXNzS2V5TGlrZUlnbm9yZUNhc2U6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIGZvciB0aGUgZ2l2ZW4gZXhlY3V0aW9uLlxuXHQgKi9cblx0ZXhlY3V0aW9uSWQoZXhlY3V0aW9uSWQ6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIGZvciB0aGUgZ2l2ZW4gY2FzZSBpbnN0YW5jZS5cblx0ICovXG5cdGNhc2VJbnN0YW5jZUlkKGNhc2VJbnN0YW5jZUlkOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyBmb3IgdGhlIGdpdmVuIGNhc2UgZGVmaW5pdGlvbi5cblx0ICovXG5cdGNhc2VEZWZpbml0aW9uSWQoY2FzZURlZmluaXRpb25JZDogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggYXJlIHBhcnQgb2YgYSBjYXNlIGluc3RhbmNlIHdoaWNoIGhhcyB0aGUgZ2l2ZW4gY2FzZSBkZWZpbml0aW9uIGtleS5cblx0ICovXG5cdGNhc2VEZWZpbml0aW9uS2V5KGNhc2VEZWZpbml0aW9uS2V5OiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBhcmUgcGFydCBvZiBhIGNhc2UgaW5zdGFuY2Ugd2hpY2ggaGFzIGEgY2FzZSBkZWZpbml0aW9uIGtleSBsaWtlIHRoZSBnaXZlbiB2YWx1ZS4gVGhlIHN5bnRheCB0aGF0IHNob3VsZCBiZSB1c2VkIGlzIHRoZSBzYW1lIGFzIGluIFNRTCwgZWcuICV0ZXN0JS5cblx0ICovXG5cdGNhc2VEZWZpbml0aW9uS2V5TGlrZShjYXNlRGVmaW5pdGlvbktleUxpa2U6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGFyZSBwYXJ0IG9mIGEgY2FzZSBpbnN0YW5jZSB3aGljaCBoYXMgYSBjYXNlIGRlZmluaXRpb24ga2V5IGxpa2UgdGhlIGdpdmVuIHZhbHVlLiBUaGUgc3ludGF4IHRoYXQgc2hvdWxkIGJlIHVzZWQgaXMgdGhlIHNhbWUgYXMgaW4gU1FMLCBlZy4gJXRlc3QlLlxuXHQgKlxuXHQgKiBUaGlzIG1ldGhvZCwgdW5saWtlIHRoZSB7QGxpbmsgI2Nhc2VEZWZpbml0aW9uS2V5TGlrZShTdHJpbmcpfSBtZXRob2Qgd2lsbCBub3QgdGFrZSBpbiBhY2NvdW50IHRoZSB1cHBlci9sb3dlciBjYXNlOiBib3RoIHRoZSBpbnB1dCBwYXJhbWV0ZXIgYXMgdGhlIGNvbHVtbiB2YWx1ZSBhcmUgbG93ZXJjYXNlZCB3aGVuIHRoZVxuXHQgKiBxdWVyeSBpcyBleGVjdXRlZC5cblx0ICovXG5cdGNhc2VEZWZpbml0aW9uS2V5TGlrZUlnbm9yZUNhc2UoY2FzZURlZmluaXRpb25LZXlMaWtlSWdub3JlQ2FzZTogc3RyaW5nKTogVDtcblxuXHQvKiogT25seSBzZWxlY3QgdGFza3MgdGhhdCBoYXZlIGEgY2FzZSBkZWZpbml0aW9uIGZvciB3aGljaCB0aGUga2V5IGlzIHByZXNlbnQgaW4gdGhlIGdpdmVuIGxpc3QgKiovXG5cdGNhc2VEZWZpbml0aW9uS2V5SW4oY2FzZURlZmluaXRpb25LZXlzOiBzdHJpbmdbXSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIGZvciB0aGUgZ2l2ZW4gcGxhbiBpdGVtIGluc3RhbmNlLiBcblx0ICovXG5cdHBsYW5JdGVtSW5zdGFuY2VJZChwbGFuSXRlbUluc3RhbmNlSWQ6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIGZvciB0aGUgZ2l2ZW4gc2NvcGUgaWRlbnRpZmllci4gXG5cdCAqL1xuXHRzY29wZUlkKHNjb3BlSWQ6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIGZvciB0aGUgZ2l2ZW4gc3ViIHNjb3BlIGlkZW50aWZpZXIuIFxuXHQgKi9cblx0c3ViU2NvcGVJZChzdWJTY29wZUlkOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyBmb3IgdGhlIGdpdmVuIHNjb3BlIHR5cGUuIFxuXHQgKi9cblx0c2NvcGVUeXBlKHNjb3BlVHlwZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3MgZm9yIHRoZSBnaXZlbiBzY29wZSBkZWZpbml0aW9uIGlkZW50aWZpZXIuIFxuXHQgKi9cblx0c2NvcGVEZWZpbml0aW9uSWQoc2NvcGVEZWZpbml0aW9uSWQ6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIGZvciB0aGUgZ2l2ZW4gc3RhZ2UsIGRlZmluZWQgdGhyb3VnaCBpdHMgc3RhZ2UgaW5zdGFuY2UgaWQuXG5cdCAqL1xuXHRwcm9wYWdhdGVkU3RhZ2VJbnN0YW5jZUlkKHByb3BhZ2F0ZWRTdGFnZUluc3RhbmNlSWQ6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIFNlbGVjdCBhbGwgdGFza3MgZm9yIHRoZSBnaXZlbiBwcm9jZXNzIGluc3RhbmNlIGlkIGFuZCBpdHMgY2hpbGRyZW4uXG5cdCAqL1xuXHRwcm9jZXNzSW5zdGFuY2VJZFdpdGhDaGlsZHJlbihwcm9jZXNzSW5zdGFuY2VJZDogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogU2VsZWN0IGFsbCB0YXNrcyBmb3IgdGhlIGdpdmVuIGNhc2UgaW5zdGFuY2UgaWQgYW5kIGl0cyBjaGlsZHJlbi5cblx0ICovXG5cdGNhc2VJbnN0YW5jZUlkV2l0aENoaWxkcmVuKGNhc2VJbnN0YW5jZUlkOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB0aGF0IGFyZSBjcmVhdGVkIG9uIHRoZSBnaXZlbiBkYXRlLlxuXHQgKi9cblx0dGFza0NyZWF0ZWRPbihjcmVhdGVUaW1lOiBEYXRlKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3MgdGhhdCBhcmUgY3JlYXRlZCBiZWZvcmUgdGhlIGdpdmVuIGRhdGUuXG5cdCAqL1xuXHR0YXNrQ3JlYXRlZEJlZm9yZShiZWZvcmU6IERhdGUpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB0aGF0IGFyZSBjcmVhdGVkIGFmdGVyIHRoZSBnaXZlbiBkYXRlLlxuXHQgKi9cblx0dGFza0NyZWF0ZWRBZnRlcihhZnRlcjogRGF0ZSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHRoYXQgYXJlIHN0YXJ0ZWQgaW4gcHJvZ3Jlc3Mgb24gdGhlIGdpdmVuIGRhdGUuXG5cdCAqL1xuXHR0YXNrSW5Qcm9ncmVzc1N0YXJ0VGltZU9uKGNsYWltZWRUaW1lOiBEYXRlKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3MgdGhhdCBhcmUgc3RhcnRlZCBpbiBwcm9ncmVzcyBiZWZvcmUgdGhlIGdpdmVuIGRhdGUuXG5cdCAqL1xuXHR0YXNrSW5Qcm9ncmVzc1N0YXJ0VGltZUJlZm9yZShiZWZvcmU6IERhdGUpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB0aGF0IGFyZSBzdGFydGVkIGluIHByb2dyZXNzIGFmdGVyIHRoZSBnaXZlbiBkYXRlLlxuXHQgKi9cblx0dGFza0luUHJvZ3Jlc3NTdGFydFRpbWVBZnRlcihhZnRlcjogRGF0ZSk6IFQ7XG5cblx0LyoqXG5cdCAqIFNlbGVjdCBhbGwgdGFza3MgdGhhdCBoYXZlIGFuIGluIHByb2dyZXNzIHN0YXJ0ZWQgdXNlciByZWZlcmVuY2UgZm9yIHRoZSBnaXZlbiB2YWx1ZS5cblx0ICovXG5cdHRhc2tJblByb2dyZXNzU3RhcnRlZEJ5KHN0YXJ0ZWRCeTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3MgdGhhdCBhcmUgY2xhaW1lZCBvbiB0aGUgZ2l2ZW4gZGF0ZS5cblx0ICovXG5cdHRhc2tDbGFpbWVkT24oY2xhaW1lZFRpbWU6IERhdGUpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB0aGF0IGFyZSBjbGFpbWVkIGJlZm9yZSB0aGUgZ2l2ZW4gZGF0ZS5cblx0ICovXG5cdHRhc2tDbGFpbWVkQmVmb3JlKGJlZm9yZTogRGF0ZSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHRoYXQgYXJlIGNsYWltZWQgYWZ0ZXIgdGhlIGdpdmVuIGRhdGUuXG5cdCAqL1xuXHR0YXNrQ2xhaW1lZEFmdGVyKGFmdGVyOiBEYXRlKTogVDtcblxuXHQvKipcblx0ICogU2VsZWN0IGFsbCB0YXNrcyB0aGF0IGhhdmUgYSBjbGFpbWVkIGJ5IHVzZXIgcmVmZXJlbmNlIGZvciB0aGUgZ2l2ZW4gdmFsdWUuXG5cdCAqL1xuXHR0YXNrQ2xhaW1lZEJ5KGNsYWltZWRCeTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3MgdGhhdCBhcmUgc3VzcGVuZGVkIG9uIHRoZSBnaXZlbiBkYXRlLlxuXHQgKi9cblx0dGFza1N1c3BlbmRlZE9uKHN1c3BlbmRlZFRpbWU6IERhdGUpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB0aGF0IGFyZSBzdXNwZW5kZWQgYmVmb3JlIHRoZSBnaXZlbiBkYXRlLlxuXHQgKi9cblx0dGFza1N1c3BlbmRlZEJlZm9yZShiZWZvcmU6IERhdGUpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB0aGF0IGFyZSBzdXNwZW5kZWQgYWZ0ZXIgdGhlIGdpdmVuIGRhdGUuXG5cdCAqL1xuXHR0YXNrU3VzcGVuZGVkQWZ0ZXIoYWZ0ZXI6IERhdGUpOiBUO1xuXG5cdC8qKlxuXHQgKiBTZWxlY3QgYWxsIHRhc2tzIHRoYXQgaGF2ZSBhIHN1c3BlbmRlZCBieSB1c2VyIHJlZmVyZW5jZSBmb3IgdGhlIGdpdmVuIHZhbHVlLlxuXHQgKi9cblx0dGFza1N1c3BlbmRlZEJ5KHN1c3BlbmRlZEJ5OiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aXRoIHRoZSBnaXZlbiBjYXRlZ29yeS5cblx0ICovXG5cdHRhc2tDYXRlZ29yeShjYXRlZ29yeTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3MgYmVsb25naW5nIHRvIG9uZSBvZiB0aGUgY2F0ZWdvcmllcyBpbiB0aGUgZ2l2ZW4gbGlzdC5cblx0ICpcblx0ICogQHBhcmFtIHRhc2tDYXRlZ29yeUluTGlzdFxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFdoZW4gcGFzc2VkIGNhdGVnb3J5IGxpc3QgaXMgZW1wdHkgb3IgPGNvZGU+bnVsbDwvY29kZT4gb3IgY29udGFpbnMgPGNvZGU+bnVsbDwvY29kZT4gU3RyaW5nLlxuXHQgKi9cblx0dGFza0NhdGVnb3J5SW4odGFza0NhdGVnb3J5SW5MaXN0OiBzdHJpbmdbXSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggYSBkZWZpbmVkIGNhdGVnb3J5IHdoaWNoIGRvIG5vdCBiZWxvbmcgdG8gYSBjYXRlZ29yeSBwcmVzZW50IGluIHRoZSBnaXZlbiBsaXN0LlxuXHQgKiA8cD5cblx0ICogTk9URTogVGhpcyBtZXRob2QgZG9lcyA8Yj5ub3Q8L2I+IHJldHVybiB0YXNrcyA8Yj53aXRob3V0PC9iPiBjYXRlZ29yeSBlLmcuIHRhc2tzIGhhdmluZyBhIDxjb2RlPm51bGw8L2NvZGU+IGNhdGVnb3J5LlxuXHQgKiBUbyBpbmNsdWRlIDxjb2RlPm51bGw8L2NvZGU+IGNhdGVnb3JpZXMsIHVzZSA8Y29kZT5xdWVyeS5vcigpLnRhc2tDYXRlZ29yeU5vdEluKC4uLikudGFza1dpdGhvdXRDYXRlZ29yeSgpLmVuZE9yKCk8L2NvZGU+XG5cdCAqIDwvcD5cblx0ICpcblx0ICogQHBhcmFtIHRhc2tDYXRlZ29yeU5vdEluTGlzdFxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFdoZW4gcGFzc2VkIGNhdGVnb3J5IGxpc3QgaXMgZW1wdHkgb3IgPGNvZGU+bnVsbDwvY29kZT4gb3IgY29udGFpbnMgPGNvZGU+bnVsbCBTdHJpbmc8L2NvZGU+LlxuXHQgKiBAc2VlICN0YXNrV2l0aG91dENhdGVnb3J5XG5cdCAqL1xuXHR0YXNrQ2F0ZWdvcnlOb3RJbih0YXNrQ2F0ZWdvcnlOb3RJbkxpc3Q6IHN0cmluZ1tdKTogVDtcblxuXHQvKipcblx0ICogU2VsZWN0cyB0YXNrcyB3aXRob3V0IGNhdGVnb3J5LlxuXHQgKiA8cD5cblx0ICogQ2FuIGFsc28gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIG90aGVyIGZpbHRlciBjcml0ZXJpYSB0byBpbmNsdWRlIHRhc2tzIHdpdGhvdXQgY2F0ZWdvcnkgZS5nLiBpbiA8Y29kZT5vcjwvY29kZT4gcXVlcmllcy5cblx0ICogPC9wPlxuXHQgKiBAc2VlICN0YXNrQ2F0ZWdvcnlOb3RJbihDb2xsZWN0aW9uKVxuXHQgKi9cblx0dGFza1dpdGhvdXRDYXRlZ29yeSgpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aXRoIGZvcm0ga2V5LlxuXHQgKi9cblx0dGFza1dpdGhGb3JtS2V5KCk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggdGhlIGdpdmVuIGZvcm1LZXkuXG5cdCAqL1xuXHR0YXNrRm9ybUtleShmb3JtS2V5OiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aXRoIHRoZSBnaXZlbiB0YXNrRGVmaW5pdGlvbktleS4gVGhlIHRhc2sgZGVmaW5pdGlvbiBrZXkgaXMgdGhlIGlkIG9mIHRoZSB1c2VyVGFzazogJmx0O3VzZXJUYXNrIGlkPVwieHh4XCIgLi4uLyZndDtcblx0ICoqL1xuXHR0YXNrRGVmaW5pdGlvbktleShrZXk6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggYSB0YXNrRGVmaW5pdGlvbktleSB0aGF0IG1hdGNoIHRoZSBnaXZlbiBwYXJhbWV0ZXIuIFRoZSBzeW50YXggaXMgdGhhdCBvZiBTUUw6IGZvciBleGFtcGxlIHVzYWdlOiB0YXNrRGVmaW5pdGlvbktleUxpa2UoXCIldGVzdCVcIikuIFRoZSB0YXNrIGRlZmluaXRpb24ga2V5IGlzIHRoZSBpZCBvZlxuXHQgKiB0aGUgdXNlclRhc2s6ICZsdDt1c2VyVGFzayBpZD1cInh4eFwiIC4uLi8mZ3Q7XG5cdCAqKi9cblx0dGFza0RlZmluaXRpb25LZXlMaWtlKGtleUxpa2U6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggdGhlIGdpdmVuIHRhc2tEZWZpbml0aW9uS2V5cy4gVGhlIHRhc2sgZGVmaW5pdGlvbiBrZXkgaXMgdGhlIGlkIG9mIHRoZSB1c2VyVGFzazogJmx0O3VzZXJUYXNrIGlkPVwieHh4XCIgLi4uLyZndDtcblx0ICoqL1xuXHR0YXNrRGVmaW5pdGlvbktleXMoa2V5czogc3RyaW5nW10pOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aXRoIHRoZSBnaXZlbiBzdGF0ZS5cblx0ICoqL1xuXHR0YXNrU3RhdGUoc3RhdGU6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggdGhlIGdpdmVuIGluIHByb2dyZXNzIHN0YXJ0IGR1ZSBkYXRlLlxuXHQgKi9cblx0dGFza0luUHJvZ3Jlc3NTdGFydER1ZURhdGUoZHVlRGF0ZTogRGF0ZSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYW4gaW4gcHJvZ3Jlc3Mgc3RhcnQgZHVlIGRhdGUgYmVmb3JlIHRoZSBnaXZlbiBkYXRlLlxuXHQgKi9cblx0dGFza0luUHJvZ3Jlc3NTdGFydER1ZUJlZm9yZShkdWVEYXRlOiBEYXRlKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggaGF2ZSBhbiBpbiBwcm9ncmVzcyBzdGFydCBkdWUgZGF0ZSBhZnRlciB0aGUgZ2l2ZW4gZGF0ZS5cblx0ICovXG5cdHRhc2tJblByb2dyZXNzU3RhcnREdWVBZnRlcihkdWVEYXRlOiBEYXRlKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2l0aCBubyBpbiBwcm9ncmVzcyBzdGFydCBkdWUgZGF0ZS5cblx0ICovXG5cdHdpdGhvdXRUYXNrSW5Qcm9ncmVzc1N0YXJ0RHVlRGF0ZSgpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aXRoIHRoZSBnaXZlbiBkdWUgZGF0ZS5cblx0ICovXG5cdHRhc2tEdWVEYXRlKGR1ZURhdGU6IERhdGUpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBoYXZlIGEgZHVlIGRhdGUgYmVmb3JlIHRoZSBnaXZlbiBkYXRlLlxuXHQgKi9cblx0dGFza0R1ZUJlZm9yZShkdWVEYXRlOiBEYXRlKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggaGF2ZSBhIGR1ZSBkYXRlIGFmdGVyIHRoZSBnaXZlbiBkYXRlLlxuXHQgKi9cblx0dGFza0R1ZUFmdGVyKGR1ZURhdGU6IERhdGUpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aXRoIG5vIGR1ZSBkYXRlLlxuXHQgKi9cblx0d2l0aG91dFRhc2tEdWVEYXRlKCk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGFyZSBwYXJ0IG9mIGEgcHJvY2VzcyBpbnN0YW5jZSB3aGljaCBoYXMgdGhlIGdpdmVuIHByb2Nlc3MgZGVmaW5pdGlvbiBrZXkuXG5cdCAqL1xuXHRwcm9jZXNzRGVmaW5pdGlvbktleShwcm9jZXNzRGVmaW5pdGlvbktleTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggYXJlIHBhcnQgb2YgYSBwcm9jZXNzIGluc3RhbmNlIHdoaWNoIGhhcyBhIHByb2Nlc3MgZGVmaW5pdGlvbiBrZXkgbGlrZSB0aGUgZ2l2ZW4gdmFsdWUuIFRoZSBzeW50YXggdGhhdCBzaG91bGQgYmUgdXNlZCBpcyB0aGUgc2FtZSBhcyBpbiBTUUwsIGVnLiAldGVzdCUuXG5cdCAqL1xuXHRwcm9jZXNzRGVmaW5pdGlvbktleUxpa2UocHJvY2Vzc0RlZmluaXRpb25LZXlMaWtlOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBhcmUgcGFydCBvZiBhIHByb2Nlc3MgaW5zdGFuY2Ugd2hpY2ggaGFzIGEgcHJvY2VzcyBkZWZpbml0aW9uIGtleSBsaWtlIHRoZSBnaXZlbiB2YWx1ZS4gVGhlIHN5bnRheCB0aGF0IHNob3VsZCBiZSB1c2VkIGlzIHRoZSBzYW1lIGFzIGluIFNRTCwgZWcuICV0ZXN0JS5cblx0ICogXG5cdCAqIFRoaXMgbWV0aG9kLCB1bmxpa2UgdGhlIHtAbGluayAjcHJvY2Vzc0RlZmluaXRpb25LZXlMaWtlKFN0cmluZyl9IG1ldGhvZCB3aWxsIG5vdCB0YWtlIGluIGFjY291bnQgdGhlIHVwcGVyL2xvd2VyIGNhc2U6IGJvdGggdGhlIGlucHV0IHBhcmFtZXRlciBhcyB0aGUgY29sdW1uIHZhbHVlIGFyZSBsb3dlcmNhc2VkIHdoZW4gdGhlXG5cdCAqIHF1ZXJ5IGlzIGV4ZWN1dGVkLlxuXHQgKi9cblx0cHJvY2Vzc0RlZmluaXRpb25LZXlMaWtlSWdub3JlQ2FzZShwcm9jZXNzRGVmaW5pdGlvbktleUxpa2VJZ25vcmVDYXNlOiBzdHJpbmcpOiBUO1xuXG5cdC8qKiBPbmx5IHNlbGVjdCB0YXNrcyB0aGF0IGhhdmUgYSBwcm9jZXNzIGRlZmluaXRpb24gZm9yIHdoaWNoIHRoZSBrZXkgaXMgcHJlc2VudCBpbiB0aGUgZ2l2ZW4gbGlzdCAqKi9cblx0cHJvY2Vzc0RlZmluaXRpb25LZXlJbihwcm9jZXNzRGVmaW5pdGlvbktleXM6IHN0cmluZ1tdKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggY3JlYXRlZCBmcm9tIHRoZSBnaXZlbiB0YXNrIGRlZmluaXRpb24gcmVmZXJlbmNlZCBieSBpZC5cblx0ICovXG5cdHRhc2tEZWZpbml0aW9uSWQodGFza0RlZmluaXRpb25JZDogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggYXJlIHBhcnQgb2YgYSBwcm9jZXNzIGluc3RhbmNlIHdoaWNoIGhhcyB0aGUgZ2l2ZW4gcHJvY2VzcyBkZWZpbml0aW9uIGlkLlxuXHQgKi9cblx0cHJvY2Vzc0RlZmluaXRpb25JZChwcm9jZXNzRGVmaW5pdGlvbklkOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBhcmUgcGFydCBvZiBhIHByb2Nlc3MgaW5zdGFuY2Ugd2hpY2ggaGFzIHRoZSBnaXZlbiBwcm9jZXNzIGRlZmluaXRpb24gbmFtZS5cblx0ICovXG5cdHByb2Nlc3NEZWZpbml0aW9uTmFtZShwcm9jZXNzRGVmaW5pdGlvbk5hbWU6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGFyZSBwYXJ0IG9mIGEgcHJvY2VzcyBpbnN0YW5jZSB3aGljaCBoYXMgYSBwcm9jZXNzIGRlZmluaXRpb24gbmFtZSBsaWtlIHRoZSBnaXZlbiB2YWx1ZS4gVGhlIHN5bnRheCB0aGF0IHNob3VsZCBiZSB1c2VkIGlzIHRoZSBzYW1lIGFzIGluIFNRTCwgZWcuICV0ZXN0JS5cblx0ICovXG5cdHByb2Nlc3NEZWZpbml0aW9uTmFtZUxpa2UocHJvY2Vzc0RlZmluaXRpb25OYW1lTGlrZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggYXJlIHBhcnQgb2YgYSBwcm9jZXNzIGluc3RhbmNlIHdob3NlIGRlZmluaXRpb24gYmVsb25ncyB0byB0aGUgY2F0ZWdvcnkgd2hpY2ggaXMgcHJlc2VudCBpbiB0aGUgZ2l2ZW4gbGlzdC5cblx0ICogXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgV2hlbiBwYXNzZWQgY2F0ZWdvcnkgbGlzdCBpcyBlbXB0eSBvciA8Y29kZT5udWxsPC9jb2RlPiBvciBjb250YWlucyA8Y29kZT5udWxsIFN0cmluZzwvY29kZT4uXG5cdCAqIEBwYXJhbSBwcm9jZXNzQ2F0ZWdvcnlJbkxpc3Rcblx0ICovXG5cdHByb2Nlc3NDYXRlZ29yeUluKHByb2Nlc3NDYXRlZ29yeUluTGlzdDogc3RyaW5nW10pOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBhcmUgcGFydCBvZiBhIHByb2Nlc3MgaW5zdGFuY2Ugd2hvc2UgZGVmaW5pdGlvbiBkb2VzIG5vdCBiZWxvbmcgdG8gdGhlIGNhdGVnb3J5IHdoaWNoIGlzIHByZXNlbnQgaW4gdGhlIGdpdmVuIGxpc3QuXG5cdCAqIFxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIFdoZW4gcGFzc2VkIGNhdGVnb3J5IGxpc3QgaXMgZW1wdHkgb3IgPGNvZGU+bnVsbDwvY29kZT4gb3IgY29udGFpbnMgPGNvZGU+bnVsbCBTdHJpbmc8L2NvZGU+LlxuXHQgKiBAcGFyYW0gcHJvY2Vzc0NhdGVnb3J5Tm90SW5MaXN0XG5cdCAqL1xuXHRwcm9jZXNzQ2F0ZWdvcnlOb3RJbihwcm9jZXNzQ2F0ZWdvcnlOb3RJbkxpc3Q6IHN0cmluZ1tdKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggYXJlIHBhcnQgb2YgYSBwcm9jZXNzIGluc3RhbmNlIHdoaWNoIGhhcyB0aGUgZ2l2ZW4gZGVwbG95bWVudCBpZC5cblx0ICovXG5cdGRlcGxveW1lbnRJZChkZXBsb3ltZW50SWQ6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGFyZSBwYXJ0IG9mIGEgcHJvY2VzcyBpbnN0YW5jZSB3aGljaCBoYXMgdGhlIGdpdmVuIGRlcGxveW1lbnQgaWQuXG5cdCAqL1xuXHRkZXBsb3ltZW50SWRJbihkZXBsb3ltZW50SWRzOiBzdHJpbmdbXSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGFyZSByZWxhdGVkIHRvIGEgY2FzZSBpbnN0YW5jZSBmb3IgdG8gdGhlIGdpdmVuIGRlcGxveW1lbnQgaWQuXG5cdCAqL1xuXHRjbW1uRGVwbG95bWVudElkKGNtbW5EZXBsb3ltZW50SWQ6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGFyZSByZWxhdGVkIHRvIGEgY2FzZSBpbnN0YW5jZXMgZm9yIHRoZSBnaXZlbiBkZXBsb3ltZW50IGlkLlxuXHQgKi9cblx0Y21tbkRlcGxveW1lbnRJZEluKGNtbW5EZXBsb3ltZW50SWRzOiBzdHJpbmdbXSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGRvbid0IGhhdmUgYSBzY29wZSBpZCBzZXQuXG5cdCAqL1xuXHR3aXRob3V0U2NvcGVJZCgpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBoYXZlIGEgbG9jYWwgdGFzayB2YXJpYWJsZSB3aXRoIHRoZSBnaXZlbiBuYW1lIHNldCB0byB0aGUgZ2l2ZW4gdmFsdWUuXG5cdCAqL1xuXHR0YXNrVmFyaWFibGVWYWx1ZUVxdWFscyh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFyaWFibGVWYWx1ZTogYW55KTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggaGF2ZSBhdCBsZWFzdCBvbmUgbG9jYWwgdGFzayB2YXJpYWJsZSB3aXRoIHRoZSBnaXZlbiB2YWx1ZS5cblx0ICovXG5cdHRhc2tWYXJpYWJsZVZhbHVlRXF1YWxzKHZhcmlhYmxlVmFsdWU6IGFueSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBsb2NhbCBzdHJpbmcgdmFyaWFibGUgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUsIGNhc2UgaW5zZW5zaXRpdmUuXG5cdCAqIDxwPlxuXHQgKiBUaGlzIG1ldGhvZCBvbmx5IHdvcmtzIGlmIHlvdXIgZGF0YWJhc2UgaGFzIGVuY29kaW5nL2NvbGxhdGlvbiB0aGF0IHN1cHBvcnRzIGNhc2Utc2Vuc2l0aXZlIHF1ZXJpZXMuIEZvciBleGFtcGxlLCB1c2UgXCJjb2xsYXRlIFVURi04XCIgb24gTXlTUUwgYW5kIGZvciBNU1NRTCwgc2VsZWN0IG9uZSBvZiB0aGUgY2FzZS1zZW5zaXRpdmVcblx0ICogQ29sbGF0aW9ucyBhdmFpbGFibGUgKDxhIGhyZWY9XCJodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTAodj1zcWwuMTA1KS5hc3B4XCIgPk1TRE4gU2VydmVyIENvbGxhdGlvbiBSZWZlcmVuY2U8L2E+KS5cblx0ICogPC9wPlxuXHQgKi9cblx0dGFza1ZhcmlhYmxlVmFsdWVFcXVhbHNJZ25vcmVDYXNlKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBsb2NhbCB0YXNrIHZhcmlhYmxlIHdpdGggdGhlIGdpdmVuIG5hbWUsIGJ1dCB3aXRoIGEgZGlmZmVyZW50IHZhbHVlIHRoYW4gdGhlIHBhc3NlZCB2YWx1ZS4gQnl0ZS1hcnJheXMgYW5kIHtAbGluayBTZXJpYWxpemFibGV9IG9iamVjdHMgKHdoaWNoIGFyZSBub3QgcHJpbWl0aXZlXG5cdCAqIHR5cGUgd3JhcHBlcnMpIGFyZSBub3Qgc3VwcG9ydGVkLlxuXHQgKi9cblx0dGFza1ZhcmlhYmxlVmFsdWVOb3RFcXVhbHModmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhcmlhYmxlVmFsdWU6IGFueSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBsb2NhbCBzdHJpbmcgdmFyaWFibGUgd2l0aCBpcyBub3QgdGhlIGdpdmVuIHZhbHVlLCBjYXNlIGluc2Vuc2l0aXZlLlxuXHQgKiA8cD5cblx0ICogVGhpcyBtZXRob2Qgb25seSB3b3JrcyBpZiB5b3VyIGRhdGFiYXNlIGhhcyBlbmNvZGluZy9jb2xsYXRpb24gdGhhdCBzdXBwb3J0cyBjYXNlLXNlbnNpdGl2ZSBxdWVyaWVzLiBGb3IgZXhhbXBsZSwgdXNlIFwiY29sbGF0ZSBVVEYtOFwiIG9uIE15U1FMIGFuZCBmb3IgTVNTUUwsIHNlbGVjdCBvbmUgb2YgdGhlIGNhc2Utc2Vuc2l0aXZlXG5cdCAqIENvbGxhdGlvbnMgYXZhaWxhYmxlICg8YSBocmVmPVwiaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTQ0MjUwKHY9c3FsLjEwNSkuYXNweFwiID5NU0ROIFNlcnZlciBDb2xsYXRpb24gUmVmZXJlbmNlPC9hPikuXG5cdCAqIDwvcD5cblx0ICovXG5cdHRhc2tWYXJpYWJsZVZhbHVlTm90RXF1YWxzSWdub3JlQ2FzZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBoYXZlIGEgbG9jYWwgdmFyaWFibGUgdmFsdWUgZ3JlYXRlciB0aGFuIHRoZSBwYXNzZWQgdmFsdWUgd2hlbiB0aGV5IGVuZGVkLiBCb29sZWFucywgQnl0ZS1hcnJheXMgYW5kIHtAbGluayBTZXJpYWxpemFibGV9IG9iamVjdHMgKHdoaWNoIGFyZSBub3QgcHJpbWl0aXZlIHR5cGUgd3JhcHBlcnMpXG5cdCAqIGFyZSBub3Qgc3VwcG9ydGVkLlxuXHQgKiBcblx0ICogQHBhcmFtIG5hbWVcblx0ICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHZhbHVlXG5cdCAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwuXG5cdCAqL1xuXHR0YXNrVmFyaWFibGVWYWx1ZUdyZWF0ZXJUaGFuKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBsb2NhbCB2YXJpYWJsZSB2YWx1ZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHBhc3NlZCB2YWx1ZSB3aGVuIHRoZXkgZW5kZWQuIEJvb2xlYW5zLCBCeXRlLWFycmF5cyBhbmQge0BsaW5rIFNlcmlhbGl6YWJsZX0gb2JqZWN0cyAod2hpY2ggYXJlIG5vdCBwcmltaXRpdmVcblx0ICogdHlwZSB3cmFwcGVycykgYXJlIG5vdCBzdXBwb3J0ZWQuXG5cdCAqIFxuXHQgKiBAcGFyYW0gbmFtZVxuXHQgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdmFsdWVcblx0ICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbC5cblx0ICovXG5cdHRhc2tWYXJpYWJsZVZhbHVlR3JlYXRlclRoYW5PckVxdWFsKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBsb2NhbCB2YXJpYWJsZSB2YWx1ZSBsZXNzIHRoYW4gdGhlIHBhc3NlZCB2YWx1ZSB3aGVuIHRoZSBlbmRlZC5Cb29sZWFucywgQnl0ZS1hcnJheXMgYW5kIHtAbGluayBTZXJpYWxpemFibGV9IG9iamVjdHMgKHdoaWNoIGFyZSBub3QgcHJpbWl0aXZlIHR5cGUgd3JhcHBlcnMpIGFyZVxuXHQgKiBub3Qgc3VwcG9ydGVkLlxuXHQgKiBcblx0ICogQHBhcmFtIG5hbWVcblx0ICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHZhbHVlXG5cdCAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwuXG5cdCAqL1xuXHR0YXNrVmFyaWFibGVWYWx1ZUxlc3NUaGFuKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBsb2NhbCB2YXJpYWJsZSB2YWx1ZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHBhc3NlZCB2YWx1ZSB3aGVuIHRoZXkgZW5kZWQuIEJvb2xlYW5zLCBCeXRlLWFycmF5cyBhbmQge0BsaW5rIFNlcmlhbGl6YWJsZX0gb2JqZWN0cyAod2hpY2ggYXJlIG5vdCBwcmltaXRpdmUgdHlwZVxuXHQgKiB3cmFwcGVycykgYXJlIG5vdCBzdXBwb3J0ZWQuXG5cdCAqIFxuXHQgKiBAcGFyYW0gbmFtZVxuXHQgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdmFsdWVcblx0ICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbC5cblx0ICovXG5cdHRhc2tWYXJpYWJsZVZhbHVlTGVzc1RoYW5PckVxdWFsKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBsb2NhbCB2YXJpYWJsZSB2YWx1ZSBsaWtlIHRoZSBnaXZlbiB2YWx1ZSB3aGVuIHRoZXkgZW5kZWQuIFRoaXMgY2FuIGJlIHVzZWQgb24gc3RyaW5nIHZhcmlhYmxlcyBvbmx5LlxuXHQgKiBcblx0ICogQHBhcmFtIG5hbWVcblx0ICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHZhbHVlXG5cdCAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwuIFRoZSBzdHJpbmcgY2FuIGluY2x1ZGUgdGhlIHdpbGRjYXJkIGNoYXJhY3RlciAnJScgdG8gZXhwcmVzcyBsaWtlLXN0cmF0ZWd5OiBzdGFydHMgd2l0aCAoc3RyaW5nJSksIGVuZHMgd2l0aCAoJXN0cmluZykgb3IgY29udGFpbnMgKCVzdHJpbmclKS5cblx0ICovXG5cdHRhc2tWYXJpYWJsZVZhbHVlTGlrZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBoYXZlIGEgbG9jYWwgdmFyaWFibGUgdmFsdWUgbGlrZSB0aGUgZ2l2ZW4gdmFsdWUgKGNhc2UgaW5zZW5zaXRpdmUpIHdoZW4gdGhleSBlbmRlZC4gVGhpcyBjYW4gYmUgdXNlZCBvbiBzdHJpbmcgdmFyaWFibGVzIG9ubHkuXG5cdCAqIFxuXHQgKiBAcGFyYW0gbmFtZVxuXHQgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdmFsdWVcblx0ICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbC4gVGhlIHN0cmluZyBjYW4gaW5jbHVkZSB0aGUgd2lsZGNhcmQgY2hhcmFjdGVyICclJyB0byBleHByZXNzIGxpa2Utc3RyYXRlZ3k6IHN0YXJ0cyB3aXRoIChzdHJpbmclKSwgZW5kcyB3aXRoICglc3RyaW5nKSBvciBjb250YWlucyAoJXN0cmluZyUpLlxuXHQgKi9cblx0dGFza1ZhcmlhYmxlVmFsdWVMaWtlSWdub3JlQ2FzZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBoYXZlIGEgbG9jYWwgdmFyaWFibGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cblx0ICogXG5cdCAqIEBwYXJhbSBuYW1lXG5cdCAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwuXG5cdCAqL1xuXHR0YXNrVmFyaWFibGVFeGlzdHMobmFtZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggZG9lcyBub3QgaGF2ZSBhIGxvY2FsIHZhcmlhYmxlIHdpdGggdGhlIGdpdmVuIG5hbWUuXG5cdCAqIFxuXHQgKiBAcGFyYW0gbmFtZVxuXHQgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsLlxuXHQgKi9cblx0dGFza1ZhcmlhYmxlTm90RXhpc3RzKG5hbWU6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGFyZSBwYXJ0IG9mIGEgcHJvY2VzcyB0aGF0IGhhcyBhIHZhcmlhYmxlIHdpdGggdGhlIGdpdmVuIG5hbWUgc2V0IHRvIHRoZSBnaXZlbiB2YWx1ZS5cblx0ICovXG5cdHByb2Nlc3NWYXJpYWJsZVZhbHVlRXF1YWxzKHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YXJpYWJsZVZhbHVlOiBhbnkpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBhcmUgcGFydCBvZiBhIHByb2Nlc3MgdGhhdCBoYXMgYXQgbGVhc3Qgb25lIHZhcmlhYmxlIHdpdGggdGhlIGdpdmVuIHZhbHVlLlxuXHQgKi9cblx0cHJvY2Vzc1ZhcmlhYmxlVmFsdWVFcXVhbHModmFyaWFibGVWYWx1ZTogYW55KTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggYXJlIHBhcnQgb2YgYSBwcm9jZXNzIHRoYXQgaGFzIGEgbG9jYWwgc3RyaW5nIHZhcmlhYmxlIHdoaWNoIGlzIG5vdCB0aGUgZ2l2ZW4gdmFsdWUsIGNhc2UgaW5zZW5zaXRpdmUuXG5cdCAqIDxwPlxuXHQgKiBUaGlzIG1ldGhvZCBvbmx5IHdvcmtzIGlmIHlvdXIgZGF0YWJhc2UgaGFzIGVuY29kaW5nL2NvbGxhdGlvbiB0aGF0IHN1cHBvcnRzIGNhc2Utc2Vuc2l0aXZlIHF1ZXJpZXMuIEZvciBleGFtcGxlLCB1c2UgXCJjb2xsYXRlIFVURi04XCIgb24gTXlTUUwgYW5kIGZvciBNU1NRTCwgc2VsZWN0IG9uZSBvZiB0aGUgY2FzZS1zZW5zaXRpdmVcblx0ICogQ29sbGF0aW9ucyBhdmFpbGFibGUgKDxhIGhyZWY9XCJodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTAodj1zcWwuMTA1KS5hc3B4XCIgPk1TRE4gU2VydmVyIENvbGxhdGlvbiBSZWZlcmVuY2U8L2E+KS5cblx0ICogPC9wPlxuXHQgKi9cblx0cHJvY2Vzc1ZhcmlhYmxlVmFsdWVFcXVhbHNJZ25vcmVDYXNlKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSB2YXJpYWJsZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBidXQgd2l0aCBhIGRpZmZlcmVudCB2YWx1ZSB0aGFuIHRoZSBwYXNzZWQgdmFsdWUuIEJ5dGUtYXJyYXlzIGFuZCB7QGxpbmsgU2VyaWFsaXphYmxlfSBvYmplY3RzICh3aGljaCBhcmUgbm90IHByaW1pdGl2ZSB0eXBlXG5cdCAqIHdyYXBwZXJzKSBhcmUgbm90IHN1cHBvcnRlZC5cblx0ICovXG5cdHByb2Nlc3NWYXJpYWJsZVZhbHVlTm90RXF1YWxzKHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YXJpYWJsZVZhbHVlOiBhbnkpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBhcmUgcGFydCBvZiBhIHByb2Nlc3MgdGhhdCBoYXMgYSBzdHJpbmcgdmFyaWFibGUgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUsIGNhc2UgaW5zZW5zaXRpdmUuXG5cdCAqIDxwPlxuXHQgKiBUaGlzIG1ldGhvZCBvbmx5IHdvcmtzIGlmIHlvdXIgZGF0YWJhc2UgaGFzIGVuY29kaW5nL2NvbGxhdGlvbiB0aGF0IHN1cHBvcnRzIGNhc2Utc2Vuc2l0aXZlIHF1ZXJpZXMuIEZvciBleGFtcGxlLCB1c2UgXCJjb2xsYXRlIFVURi04XCIgb24gTXlTUUwgYW5kIGZvciBNU1NRTCwgc2VsZWN0IG9uZSBvZiB0aGUgY2FzZS1zZW5zaXRpdmVcblx0ICogQ29sbGF0aW9ucyBhdmFpbGFibGUgKDxhIGhyZWY9XCJodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTAodj1zcWwuMTA1KS5hc3B4XCIgPk1TRE4gU2VydmVyIENvbGxhdGlvbiBSZWZlcmVuY2U8L2E+KS5cblx0ICogPC9wPlxuXHQgKi9cblx0cHJvY2Vzc1ZhcmlhYmxlVmFsdWVOb3RFcXVhbHNJZ25vcmVDYXNlKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBnbG9iYWwgdmFyaWFibGUgdmFsdWUgZ3JlYXRlciB0aGFuIHRoZSBwYXNzZWQgdmFsdWUgd2hlbiB0aGV5IGVuZGVkLiBCb29sZWFucywgQnl0ZS1hcnJheXMgYW5kIHtAbGluayBTZXJpYWxpemFibGV9IG9iamVjdHMgKHdoaWNoIGFyZSBub3QgcHJpbWl0aXZlIHR5cGVcblx0ICogd3JhcHBlcnMpIGFyZSBub3Qgc3VwcG9ydGVkLlxuXHQgKiBcblx0ICogQHBhcmFtIG5hbWVcblx0ICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHZhbHVlXG5cdCAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwuXG5cdCAqL1xuXHRwcm9jZXNzVmFyaWFibGVWYWx1ZUdyZWF0ZXJUaGFuKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBnbG9iYWwgdmFyaWFibGUgdmFsdWUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwYXNzZWQgdmFsdWUgd2hlbiB0aGV5IGVuZGVkLiBCb29sZWFucywgQnl0ZS1hcnJheXMgYW5kIHtAbGluayBTZXJpYWxpemFibGV9IG9iamVjdHMgKHdoaWNoIGFyZSBub3QgcHJpbWl0aXZlXG5cdCAqIHR5cGUgd3JhcHBlcnMpIGFyZSBub3Qgc3VwcG9ydGVkLlxuXHQgKiBcblx0ICogQHBhcmFtIG5hbWVcblx0ICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHZhbHVlXG5cdCAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwuXG5cdCAqL1xuXHRwcm9jZXNzVmFyaWFibGVWYWx1ZUdyZWF0ZXJUaGFuT3JFcXVhbChuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBoYXZlIGEgZ2xvYmFsIHZhcmlhYmxlIHZhbHVlIGxlc3MgdGhhbiB0aGUgcGFzc2VkIHZhbHVlIHdoZW4gdGhlIGVuZGVkLkJvb2xlYW5zLCBCeXRlLWFycmF5cyBhbmQge0BsaW5rIFNlcmlhbGl6YWJsZX0gb2JqZWN0cyAod2hpY2ggYXJlIG5vdCBwcmltaXRpdmUgdHlwZSB3cmFwcGVycykgYXJlXG5cdCAqIG5vdCBzdXBwb3J0ZWQuXG5cdCAqIFxuXHQgKiBAcGFyYW0gbmFtZVxuXHQgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdmFsdWVcblx0ICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbC5cblx0ICovXG5cdHByb2Nlc3NWYXJpYWJsZVZhbHVlTGVzc1RoYW4obmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggaGF2ZSBhIGdsb2JhbCB2YXJpYWJsZSB2YWx1ZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHBhc3NlZCB2YWx1ZSB3aGVuIHRoZXkgZW5kZWQuIEJvb2xlYW5zLCBCeXRlLWFycmF5cyBhbmQge0BsaW5rIFNlcmlhbGl6YWJsZX0gb2JqZWN0cyAod2hpY2ggYXJlIG5vdCBwcmltaXRpdmUgdHlwZVxuXHQgKiB3cmFwcGVycykgYXJlIG5vdCBzdXBwb3J0ZWQuXG5cdCAqIFxuXHQgKiBAcGFyYW0gbmFtZVxuXHQgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdmFsdWVcblx0ICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbC5cblx0ICovXG5cdHByb2Nlc3NWYXJpYWJsZVZhbHVlTGVzc1RoYW5PckVxdWFsKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBnbG9iYWwgdmFyaWFibGUgdmFsdWUgbGlrZSB0aGUgZ2l2ZW4gdmFsdWUgd2hlbiB0aGV5IGVuZGVkLiBUaGlzIGNhbiBiZSB1c2VkIG9uIHN0cmluZyB2YXJpYWJsZXMgb25seS5cblx0ICogXG5cdCAqIEBwYXJhbSBuYW1lXG5cdCAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSB2YWx1ZVxuXHQgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsLiBUaGUgc3RyaW5nIGNhbiBpbmNsdWRlIHRoZSB3aWxkY2FyZCBjaGFyYWN0ZXIgJyUnIHRvIGV4cHJlc3MgbGlrZS1zdHJhdGVneTogc3RhcnRzIHdpdGggKHN0cmluZyUpLCBlbmRzIHdpdGggKCVzdHJpbmcpIG9yIGNvbnRhaW5zICglc3RyaW5nJSkuXG5cdCAqL1xuXHRwcm9jZXNzVmFyaWFibGVWYWx1ZUxpa2UobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggaGF2ZSBhIGdsb2JhbCB2YXJpYWJsZSB2YWx1ZSBsaWtlIHRoZSBnaXZlbiB2YWx1ZSAoY2FzZSBpbnNlbnNpdGl2ZSkgd2hlbiB0aGV5IGVuZGVkLiBUaGlzIGNhbiBiZSB1c2VkIG9uIHN0cmluZyB2YXJpYWJsZXMgb25seS5cblx0ICogXG5cdCAqIEBwYXJhbSBuYW1lXG5cdCAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSB2YWx1ZVxuXHQgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsLiBUaGUgc3RyaW5nIGNhbiBpbmNsdWRlIHRoZSB3aWxkY2FyZCBjaGFyYWN0ZXIgJyUnIHRvIGV4cHJlc3MgbGlrZS1zdHJhdGVneTogc3RhcnRzIHdpdGggKHN0cmluZyUpLCBlbmRzIHdpdGggKCVzdHJpbmcpIG9yIGNvbnRhaW5zICglc3RyaW5nJSkuXG5cdCAqL1xuXHRwcm9jZXNzVmFyaWFibGVWYWx1ZUxpa2VJZ25vcmVDYXNlKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBnbG9iYWwgdmFyaWFibGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cblx0ICogXG5cdCAqIEBwYXJhbSBuYW1lXG5cdCAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwuXG5cdCAqL1xuXHRwcm9jZXNzVmFyaWFibGVFeGlzdHMobmFtZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggZG9lcyBub3QgaGF2ZSBhIGdsb2JhbCB2YXJpYWJsZSB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuXHQgKiBcblx0ICogQHBhcmFtIG5hbWVcblx0ICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbC5cblx0ICovXG5cdHByb2Nlc3NWYXJpYWJsZU5vdEV4aXN0cyhuYW1lOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBhcmUgcGFydCBvZiBhIGNhc2UgdGhhdCBoYXMgYSB2YXJpYWJsZSB3aXRoIHRoZSBnaXZlbiBuYW1lIHNldCB0byB0aGUgZ2l2ZW4gdmFsdWUuXG5cdCAqL1xuXHRjYXNlVmFyaWFibGVWYWx1ZUVxdWFscyh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFyaWFibGVWYWx1ZTogYW55KTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggYXJlIHBhcnQgb2YgYSBjYXNlIHRoYXQgaGFzIGF0IGxlYXN0IG9uZSB2YXJpYWJsZSB3aXRoIHRoZSBnaXZlbiB2YWx1ZS5cblx0ICovXG5cdGNhc2VWYXJpYWJsZVZhbHVlRXF1YWxzKHZhcmlhYmxlVmFsdWU6IGFueSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGFyZSBwYXJ0IG9mIGEgY2FzZSB0aGF0IGhhcyBhIGxvY2FsIHN0cmluZyB2YXJpYWJsZSB3aGljaCBpcyBub3QgdGhlIGdpdmVuIHZhbHVlLCBjYXNlIGluc2Vuc2l0aXZlLlxuXHQgKiA8cD5cblx0ICogVGhpcyBtZXRob2Qgb25seSB3b3JrcyBpZiB5b3VyIGRhdGFiYXNlIGhhcyBlbmNvZGluZy9jb2xsYXRpb24gdGhhdCBzdXBwb3J0cyBjYXNlLXNlbnNpdGl2ZSBxdWVyaWVzLiBGb3IgZXhhbXBsZSwgdXNlIFwiY29sbGF0ZSBVVEYtOFwiIG9uIE15U1FMIGFuZCBmb3IgTVNTUUwsIHNlbGVjdCBvbmUgb2YgdGhlIGNhc2Utc2Vuc2l0aXZlXG5cdCAqIENvbGxhdGlvbnMgYXZhaWxhYmxlICg8YSBocmVmPVwiaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTQ0MjUwKHY9c3FsLjEwNSkuYXNweFwiID5NU0ROIFNlcnZlciBDb2xsYXRpb24gUmVmZXJlbmNlPC9hPikuXG5cdCAqIDwvcD5cblx0ICovXG5cdGNhc2VWYXJpYWJsZVZhbHVlRXF1YWxzSWdub3JlQ2FzZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBoYXZlIGEgdmFyaWFibGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgYnV0IHdpdGggYSBkaWZmZXJlbnQgdmFsdWUgdGhhbiB0aGUgcGFzc2VkIHZhbHVlLiBCeXRlLWFycmF5cyBhbmQge0BsaW5rIFNlcmlhbGl6YWJsZX0gb2JqZWN0cyAod2hpY2ggYXJlIG5vdCBwcmltaXRpdmUgdHlwZVxuXHQgKiB3cmFwcGVycykgYXJlIG5vdCBzdXBwb3J0ZWQuXG5cdCAqL1xuXHRjYXNlVmFyaWFibGVWYWx1ZU5vdEVxdWFscyh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFyaWFibGVWYWx1ZTogYW55KTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggYXJlIHBhcnQgb2YgYSBjYXNlIHRoYXQgaGFzIGEgc3RyaW5nIHZhcmlhYmxlIHdpdGggdGhlIGdpdmVuIHZhbHVlLCBjYXNlIGluc2Vuc2l0aXZlLlxuXHQgKiA8cD5cblx0ICogVGhpcyBtZXRob2Qgb25seSB3b3JrcyBpZiB5b3VyIGRhdGFiYXNlIGhhcyBlbmNvZGluZy9jb2xsYXRpb24gdGhhdCBzdXBwb3J0cyBjYXNlLXNlbnNpdGl2ZSBxdWVyaWVzLiBGb3IgZXhhbXBsZSwgdXNlIFwiY29sbGF0ZSBVVEYtOFwiIG9uIE15U1FMIGFuZCBmb3IgTVNTUUwsIHNlbGVjdCBvbmUgb2YgdGhlIGNhc2Utc2Vuc2l0aXZlXG5cdCAqIENvbGxhdGlvbnMgYXZhaWxhYmxlICg8YSBocmVmPVwiaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTQ0MjUwKHY9c3FsLjEwNSkuYXNweFwiID5NU0ROIFNlcnZlciBDb2xsYXRpb24gUmVmZXJlbmNlPC9hPikuXG5cdCAqIDwvcD5cblx0ICovXG5cdGNhc2VWYXJpYWJsZVZhbHVlTm90RXF1YWxzSWdub3JlQ2FzZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBoYXZlIGEgZ2xvYmFsIHZhcmlhYmxlIHZhbHVlIGdyZWF0ZXIgdGhhbiB0aGUgcGFzc2VkIHZhbHVlIHdoZW4gdGhleSBlbmRlZC4gQm9vbGVhbnMsIEJ5dGUtYXJyYXlzIGFuZCB7QGxpbmsgU2VyaWFsaXphYmxlfSBvYmplY3RzICh3aGljaCBhcmUgbm90IHByaW1pdGl2ZSB0eXBlXG5cdCAqIHdyYXBwZXJzKSBhcmUgbm90IHN1cHBvcnRlZC5cblx0ICpcblx0ICogQHBhcmFtIG5hbWUgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSB2YWx1ZSBjYW5ub3QgYmUgbnVsbC5cblx0ICovXG5cdGNhc2VWYXJpYWJsZVZhbHVlR3JlYXRlclRoYW4obmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggaGF2ZSBhIGdsb2JhbCB2YXJpYWJsZSB2YWx1ZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHBhc3NlZCB2YWx1ZSB3aGVuIHRoZXkgZW5kZWQuIEJvb2xlYW5zLCBCeXRlLWFycmF5cyBhbmQge0BsaW5rIFNlcmlhbGl6YWJsZX0gb2JqZWN0cyAod2hpY2ggYXJlIG5vdCBwcmltaXRpdmVcblx0ICogdHlwZSB3cmFwcGVycykgYXJlIG5vdCBzdXBwb3J0ZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBuYW1lIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdmFsdWUgY2Fubm90IGJlIG51bGwuXG5cdCAqL1xuXHRjYXNlVmFyaWFibGVWYWx1ZUdyZWF0ZXJUaGFuT3JFcXVhbChuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBoYXZlIGEgZ2xvYmFsIHZhcmlhYmxlIHZhbHVlIGxlc3MgdGhhbiB0aGUgcGFzc2VkIHZhbHVlIHdoZW4gdGhlIGVuZGVkLkJvb2xlYW5zLCBCeXRlLWFycmF5cyBhbmQge0BsaW5rIFNlcmlhbGl6YWJsZX0gb2JqZWN0cyAod2hpY2ggYXJlIG5vdCBwcmltaXRpdmUgdHlwZSB3cmFwcGVycykgYXJlXG5cdCAqIG5vdCBzdXBwb3J0ZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBuYW1lIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdmFsdWUgY2Fubm90IGJlIG51bGwuXG5cdCAqL1xuXHRjYXNlVmFyaWFibGVWYWx1ZUxlc3NUaGFuKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBnbG9iYWwgdmFyaWFibGUgdmFsdWUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwYXNzZWQgdmFsdWUgd2hlbiB0aGV5IGVuZGVkLiBCb29sZWFucywgQnl0ZS1hcnJheXMgYW5kIHtAbGluayBTZXJpYWxpemFibGV9IG9iamVjdHMgKHdoaWNoIGFyZSBub3QgcHJpbWl0aXZlIHR5cGVcblx0ICogd3JhcHBlcnMpIGFyZSBub3Qgc3VwcG9ydGVkLlxuXHQgKlxuXHQgKiBAcGFyYW0gbmFtZSBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHZhbHVlIGNhbm5vdCBiZSBudWxsLlxuXHQgKi9cblx0Y2FzZVZhcmlhYmxlVmFsdWVMZXNzVGhhbk9yRXF1YWwobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggaGF2ZSBhIGdsb2JhbCB2YXJpYWJsZSB2YWx1ZSBsaWtlIHRoZSBnaXZlbiB2YWx1ZSB3aGVuIHRoZXkgZW5kZWQuIFRoaXMgY2FuIGJlIHVzZWQgb24gc3RyaW5nIHZhcmlhYmxlcyBvbmx5LlxuXHQgKlxuXHQgKiBAcGFyYW0gbmFtZSBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHZhbHVlIGNhbm5vdCBiZSBudWxsLiBUaGUgc3RyaW5nIGNhbiBpbmNsdWRlIHRoZSB3aWxkY2FyZCBjaGFyYWN0ZXIgJyUnIHRvIGV4cHJlc3MgbGlrZS1zdHJhdGVneTogc3RhcnRzIHdpdGggKHN0cmluZyUpLCBlbmRzIHdpdGggKCVzdHJpbmcpIG9yIGNvbnRhaW5zICglc3RyaW5nJSkuXG5cdCAqL1xuXHRjYXNlVmFyaWFibGVWYWx1ZUxpa2UobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggaGF2ZSBhIGdsb2JhbCB2YXJpYWJsZSB2YWx1ZSBsaWtlIHRoZSBnaXZlbiB2YWx1ZSAoY2FzZSBpbnNlbnNpdGl2ZSkgd2hlbiB0aGV5IGVuZGVkLiBUaGlzIGNhbiBiZSB1c2VkIG9uIHN0cmluZyB2YXJpYWJsZXMgb25seS5cblx0ICpcblx0ICogQHBhcmFtIG5hbWUgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSB2YWx1ZSBjYW5ub3QgYmUgbnVsbC4gVGhlIHN0cmluZyBjYW4gaW5jbHVkZSB0aGUgd2lsZGNhcmQgY2hhcmFjdGVyICclJyB0byBleHByZXNzIGxpa2Utc3RyYXRlZ3k6IHN0YXJ0cyB3aXRoIChzdHJpbmclKSwgZW5kcyB3aXRoICglc3RyaW5nKSBvciBjb250YWlucyAoJXN0cmluZyUpLlxuXHQgKi9cblx0Y2FzZVZhcmlhYmxlVmFsdWVMaWtlSWdub3JlQ2FzZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBoYXZlIGEgZ2xvYmFsIHZhcmlhYmxlIHdpdGggdGhlIGdpdmVuIG5hbWUuXG5cdCAqXG5cdCAqIEBwYXJhbSBuYW1lIGNhbm5vdCBiZSBudWxsLlxuXHQgKi9cblx0Y2FzZVZhcmlhYmxlRXhpc3RzKG5hbWU6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGRvZXMgbm90IGhhdmUgYSBnbG9iYWwgdmFyaWFibGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cblx0ICpcblx0ICogQHBhcmFtIG5hbWUgY2Fubm90IGJlIG51bGwuXG5cdCAqL1xuXHRjYXNlVmFyaWFibGVOb3RFeGlzdHMobmFtZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3RzIHRhc2tzIHdoaWNoIHdpdGggdGhlIGdpdmVuIHJvb3Qgc2NvcGUgaWRcblx0ICovXG5cdHRhc2tSb290U2NvcGVJZChwYXJlbnRTY29wZUlkOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdHMgdGFza3Mgd2hpY2ggd2l0aCB0aGUgZ2l2ZW4gcGFyZW50IHNjb3BlIGlkXG5cdCAqL1xuXHR0YXNrUGFyZW50U2NvcGVJZChwYXJlbnRTY29wZUlkOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBJbmNsdWRlIGxvY2FsIHRhc2sgdmFyaWFibGVzIGluIHRoZSB0YXNrIHF1ZXJ5IHJlc3VsdFxuXHQgKi9cblx0aW5jbHVkZVRhc2tMb2NhbFZhcmlhYmxlcygpOiBUO1xuXG5cdC8qKlxuXHQgKiBJbmNsdWRlIGdsb2JhbCBwcm9jZXNzIHZhcmlhYmxlcyBpbiB0aGUgdGFzayBxdWVyeSByZXN1bHRcblx0ICovXG5cdGluY2x1ZGVQcm9jZXNzVmFyaWFibGVzKCk6IFQ7XG5cblx0LyoqXG5cdCAqIEluY2x1ZGUgZ2xvYmFsIGNhc2UgdmFyaWFibGVzIGluIHRoZSB0YXNrIHF1ZXJ5IHJlc3VsdFxuXHQgKi9cblx0aW5jbHVkZUNhc2VWYXJpYWJsZXMoKTogVDtcblxuXHQvKipcblx0ICogSW5jbHVkZSBpZGVudGl0eSBsaW5rcyBpbiB0aGUgdGFzayBxdWVyeSByZXN1bHRcblx0ICovXG5cdGluY2x1ZGVJZGVudGl0eUxpbmtzKCk6IFQ7XG5cblx0LyoqXG5cdCAqIExvY2FsaXplIHRhc2sgbmFtZSBhbmQgZGVzY3JpcHRpb24gdG8gc3BlY2lmaWVkIGxvY2FsZS5cblx0ICovXG5cdGxvY2FsZShsb2NhbGU6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIEluc3RydWN0IGxvY2FsaXphdGlvbiB0byBmYWxsYmFjayB0byBtb3JlIGdlbmVyYWwgbG9jYWxlcyBpbmNsdWRpbmcgdGhlIGRlZmF1bHQgbG9jYWxlIG9mIHRoZSBKVk0gaWYgdGhlIHNwZWNpZmllZCBsb2NhbGUgaXMgbm90IGZvdW5kLlxuXHQgKi9cblx0d2l0aExvY2FsaXphdGlvbkZhbGxiYWNrKCk6IFQ7XG5cblx0LyoqXG5cdCAqIEFsbCBxdWVyeSBjbGF1c2VzIGNhbGxlZCB3aWxsIGJlIGFkZGVkIHRvIGEgc2luZ2xlIG9yLXN0YXRlbWVudC4gVGhpcyBvci1zdGF0ZW1lbnQgd2lsbCBiZSBpbmNsdWRlZCB3aXRoIHRoZSBvdGhlciBhbHJlYWR5IGV4aXN0aW5nIGNsYXVzZXMgaW4gdGhlIHF1ZXJ5LCBqb2luZWQgYnkgYW4gJ2FuZCcuXG5cdCAqIDxwPlxuXHQgKiBDYWxsaW5nIGVuZE9yKCkgd2lsbCBhZGQgYWxsIGNsYXVzZXMgdG8gdGhlIHJlZ3VsYXIgcXVlcnkgYWdhaW4uIENhbGxpbmcgb3IoKSBhZnRlciBvcigpIGhhcyBiZWVuIGNhbGxlZCBvciBjYWxsaW5nIGVuZE9yKCkgYWZ0ZXIgZW5kT3IoKSBoYXMgYmVlbiBjYWxsZWQgd2lsbCByZXN1bHQgaW4gYW4gZXhjZXB0aW9uLlxuXHQgKiBJdCBpcyBwb3NzaWJsZSB0byBjYWxsIG9yKCkgZW5kT3IoKSBzZXZlcmFsIHRpbWVzIGlmIGVhY2ggb3IoKSBoYXMgYSBtYXRjaGluZyBlbmRPcigpLCBlLmcuOlxuXHQgKiA8L3A+XG5cdCAqIHtAY29kZSBxdWVyeS48Q29uZGl0aW9uQT59XG5cdCAqIHtAY29kZSAgLm9yKCkuPGNvbmRpdGlvbkI+Ljxjb25kaXRpb25DPi5lbmRPcigpfVxuXHQgKiB7QGNvZGUgIC48Y29uZGl0aW9uRD4uPGNvbmRpdGlvbkU+fVxuXHQgKiB7QGNvZGUgIC5vcigpLjxjb25kaXRpb25GPi48Y29uZGl0aW9uRz4uZW5kT3IoKX1cblx0ICogPHA+XG5cdCAqIHdpbGwgcmVzdWx0IGluOiBjb25kaXRpb25BICZhbXA7IChjb25kaXRpb25CIHwgY29uZGl0aW9uQykgJmFtcDsgY29uZGl0aW9uRCAmYW1wOyBjb25kaXRpb25FICZhbXA7IChjb25kaXRpb25GIHwgY29uZGl0aW9uRylcblx0ICovXG5cdG9yKCk6IFQ7XG5cblx0ZW5kT3IoKTogVDtcblxuXHQvLyBPUkRFUklOR1xuXG5cdC8qKlxuXHQgKiBPcmRlciBieSB0YXNrIGlkIChuZWVkcyB0byBiZSBmb2xsb3dlZCBieSB7QGxpbmsgI2FzYygpfSBvciB7QGxpbmsgI2Rlc2MoKX0pLlxuXHQgKi9cblx0b3JkZXJCeVRhc2tJZCgpOiBUO1xuXG5cdC8qKlxuXHQgKiBPcmRlciBieSB0YXNrIG5hbWUgKG5lZWRzIHRvIGJlIGZvbGxvd2VkIGJ5IHtAbGluayAjYXNjKCl9IG9yIHtAbGluayAjZGVzYygpfSkuXG5cdCAqL1xuXHRvcmRlckJ5VGFza05hbWUoKTogVDtcblxuXHQvKipcblx0ICogT3JkZXIgYnkgZGVzY3JpcHRpb24gKG5lZWRzIHRvIGJlIGZvbGxvd2VkIGJ5IHtAbGluayAjYXNjKCl9IG9yIHtAbGluayAjZGVzYygpfSkuXG5cdCAqL1xuXHRvcmRlckJ5VGFza0Rlc2NyaXB0aW9uKCk6IFQ7XG5cblx0LyoqXG5cdCAqIE9yZGVyIGJ5IHByaW9yaXR5IChuZWVkcyB0byBiZSBmb2xsb3dlZCBieSB7QGxpbmsgI2FzYygpfSBvciB7QGxpbmsgI2Rlc2MoKX0pLlxuXHQgKi9cblx0b3JkZXJCeVRhc2tQcmlvcml0eSgpOiBUO1xuXG5cdC8qKlxuXHQgKiBPcmRlciBieSBhc3NpZ25lZSAobmVlZHMgdG8gYmUgZm9sbG93ZWQgYnkge0BsaW5rICNhc2MoKX0gb3Ige0BsaW5rICNkZXNjKCl9KS5cblx0ICovXG5cdG9yZGVyQnlUYXNrQXNzaWduZWUoKTogVDtcblxuXHQvKipcblx0ICogT3JkZXIgYnkgdGhlIHRpbWUgb24gd2hpY2ggdGhlIHRhc2tzIHdlcmUgY3JlYXRlZCAobmVlZHMgdG8gYmUgZm9sbG93ZWQgYnkge0BsaW5rICNhc2MoKX0gb3Ige0BsaW5rICNkZXNjKCl9KS5cblx0ICovXG5cdG9yZGVyQnlUYXNrQ3JlYXRlVGltZSgpOiBUO1xuXG5cdC8qKlxuXHQgKiBPcmRlciBieSBwcm9jZXNzIGluc3RhbmNlIGlkIChuZWVkcyB0byBiZSBmb2xsb3dlZCBieSB7QGxpbmsgI2FzYygpfSBvciB7QGxpbmsgI2Rlc2MoKX0pLlxuXHQgKi9cblx0b3JkZXJCeVByb2Nlc3NJbnN0YW5jZUlkKCk6IFQ7XG5cblx0LyoqXG5cdCAqIE9yZGVyIGJ5IGV4ZWN1dGlvbiBpZCAobmVlZHMgdG8gYmUgZm9sbG93ZWQgYnkge0BsaW5rICNhc2MoKX0gb3Ige0BsaW5rICNkZXNjKCl9KS5cblx0ICovXG5cdG9yZGVyQnlFeGVjdXRpb25JZCgpOiBUO1xuXG5cdC8qKlxuXHQgKiBPcmRlciBieSBwcm9jZXNzIGRlZmluaXRpb24gaWQgKG5lZWRzIHRvIGJlIGZvbGxvd2VkIGJ5IHtAbGluayAjYXNjKCl9IG9yIHtAbGluayAjZGVzYygpfSkuXG5cdCAqL1xuXHRvcmRlckJ5UHJvY2Vzc0RlZmluaXRpb25JZCgpOiBUO1xuXG5cdC8qKlxuXHQgKiBPcmRlciBieSB0YXNrIGR1ZSBkYXRlIChuZWVkcyB0byBiZSBmb2xsb3dlZCBieSB7QGxpbmsgI2FzYygpfSBvciB7QGxpbmsgI2Rlc2MoKX0pLlxuXHQgKi9cblx0b3JkZXJCeVRhc2tEdWVEYXRlKCk6IFQ7XG5cblx0LyoqXG5cdCAqIE9yZGVyIGJ5IHRhc2sgb3duZXIgKG5lZWRzIHRvIGJlIGZvbGxvd2VkIGJ5IHtAbGluayAjYXNjKCl9IG9yIHtAbGluayAjZGVzYygpfSkuXG5cdCAqL1xuXHRvcmRlckJ5VGFza093bmVyKCk6IFQ7XG5cblx0LyoqXG5cdCAqIE9yZGVyIGJ5IHRhc2sgZGVmaW5pdGlvbiBrZXkgKG5lZWRzIHRvIGJlIGZvbGxvd2VkIGJ5IHtAbGluayAjYXNjKCl9IG9yIHtAbGluayAjZGVzYygpfSkuXG5cdCAqL1xuXHRvcmRlckJ5VGFza0RlZmluaXRpb25LZXkoKTogVDtcblxuXHQvKipcblx0ICogT3JkZXIgYnkgdGVuYW50IGlkIChuZWVkcyB0byBiZSBmb2xsb3dlZCBieSB7QGxpbmsgI2FzYygpfSBvciB7QGxpbmsgI2Rlc2MoKX0pLlxuXHQgKi9cblx0b3JkZXJCeVRlbmFudElkKCk6IFQ7XG5cblx0LyoqXG5cdCAqIE9yZGVyIGJ5IGR1ZSBkYXRlIChuZWVkcyB0byBiZSBmb2xsb3dlZCBieSB7QGxpbmsgI2FzYygpfSBvciB7QGxpbmsgI2Rlc2MoKX0pLiBJZiBhbnkgb2YgdGhlIHRhc2tzIGhhdmUgbnVsbCBmb3IgdGhlIGR1ZSBkYXRlLCB0aGVzZSB3aWxsIGJlIGZpcnN0IGluIHRoZSByZXN1bHQuXG5cdCAqL1xuXHRvcmRlckJ5RHVlRGF0ZU51bGxzRmlyc3QoKTogVDtcblxuXHQvKipcblx0ICogT3JkZXIgYnkgZHVlIGRhdGUgKG5lZWRzIHRvIGJlIGZvbGxvd2VkIGJ5IHtAbGluayAjYXNjKCl9IG9yIHtAbGluayAjZGVzYygpfSkuIElmIGFueSBvZiB0aGUgdGFza3MgaGF2ZSBudWxsIGZvciB0aGUgZHVlIGRhdGUsIHRoZXNlIHdpbGwgYmUgbGFzdCBpbiB0aGUgcmVzdWx0LlxuXHQgKi9cblx0b3JkZXJCeUR1ZURhdGVOdWxsc0xhc3QoKTogVDtcblxuXHQvKipcblx0ICogT3JkZXIgYnkgY2F0ZWdvcnkgKG5lZWRzIHRvIGJlIGZvbGxvd2VkIGJ5IHtAbGluayAjYXNjKCl9IG9yIHtAbGluayAjZGVzYygpfSkuXG5cdCAqL1xuXHRvcmRlckJ5Q2F0ZWdvcnkoKTogVDtcblxufVxuXG4vLyBAdHMtaWdub3JlXG5pZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0Ly8gQHRzLWlnbm9yZVxuXHRtb2R1bGUuZXhwb3J0cyA9IFRhc2tzO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtB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ZUFBZTtBQUFBLEVBQ2pDO0FBQUEsRUFFTyx1QkFBMkM7QUFDakQsV0FBTyxLQUFLLEtBQUsscUJBQXFCO0FBQUEsRUFDdkM7QUFBQSxFQUVPLHlCQUE2QztBQUNuRCxXQUFPLEtBQUssS0FBSyx1QkFBdUI7QUFBQSxFQUN6QztBQUFBLEVBRU8sYUFBaUM7QUFDdkMsV0FBTyxLQUFLLEtBQUssV0FBVztBQUFBLEVBQzdCO0FBQUEsRUFFTyxnQkFBb0M7QUFDMUMsV0FBTyxLQUFLLEtBQUssY0FBYztBQUFBLEVBQ2hDO0FBQUEsRUFFTyxlQUFtQztBQUN6QyxXQUFPLEtBQUssS0FBSyxhQUFhO0FBQUEsRUFDL0I7QUFBQSxFQUVPLHVCQUEyQztBQUNqRCxXQUFPLEtBQUssS0FBSyxxQkFBcUI7QUFBQSxFQUN2QztBQUFBLEVBRU8sdUJBQTJDO0FBQ2pELFdBQU8sS0FBSyxLQUFLLHFCQUFxQjtBQUFBLEVBQ3ZDO0FBQUEsRUFFTyxhQUFpQztBQUN2QyxXQUFPLEtBQUssS0FBSyxXQUFXO0FBQUEsRUFDN0I7QUFBQSxFQUVPLFlBQXFCO0FBQzNCLFdBQU8sS0FBSyxLQUFLO0FBQUEsRUFDbEI7QUFBQSxFQUVPLGFBQXNCO0FBQzVCLFdBQU8sS0FBSyxLQUFLO0FBQUEsRUFDbEI7QUFBQSxFQUVPLGlCQUEwQjtBQUNoQyxXQUFPLEtBQUssS0FBSztBQUFBLEVBQ2xCO0FBQUEsRUFFTyxtQkFBMkI7QUFDakMsV0FBTyxLQUFLLEtBQUs7QUFBQSxFQUNsQjtBQUFBLEVBRU8sdUJBQStCO0FBQ3JDLFdBQU8sS0FBSyxLQUFLO0FBQUEsRUFDbEI7QUFBQSxFQUVPLGVBQWlDO0FBQ3ZDLFdBQU8sS0FBSyxLQUFLLGFBQWE7QUFBQSxFQUMvQjtBQUFBLEVBRU8sY0FBc0I7QUFDNUIsV0FBTyxLQUFLLEtBQUs7QUFBQSxFQUNsQjtBQUFBLEVBRU8sZUFBbUM7QUFDekMsV0FBTyxLQUFLLEtBQUssYUFBYTtBQUFBLEVBQy9CO0FBQUEsRUFFTyxvQkFBd0M7QUFDOUMsV0FBTyxLQUFLLEtBQUssa0JBQWtCO0FBQUEsRUFDcEM7QUFBQSxFQUVPLGlCQUEwQjtBQUNoQyxXQUFPLEtBQUssS0FBSztBQUFBLEVBQ2xCO0FBQ0Q7QUFvUU8sSUFBSyxrQkFBTCxrQkFBS0EscUJBQUw7QUFNTixFQUFBQSxrQ0FBQTtBQUtBLEVBQUFBLGtDQUFBO0FBWFcsU0FBQUE7QUFBQSxHQUFBO0FBaWRMLElBQUssc0JBQUwsa0JBQUtDLHlCQUFMO0FBQ04sRUFBQUEsMENBQUE7QUFBYSxFQUFBQSwwQ0FBQTtBQURGLFNBQUFBO0FBQUEsR0FBQTtBQWtpQ1osSUFBSSxPQUFPLFdBQVcsYUFBYTtBQUVsQyxTQUFPLFVBQVU7QUFDbEI7IiwKICAibmFtZXMiOiBbIkRlbGVnYXRpb25TdGF0ZSIsICJOdWxsSGFuZGxpbmdPbk9yZGVyIl0KfQo=
|